Author: branden Date: 2005-05-17 13:42:51 -0500 (Tue, 17 May 2005) New Revision: 2265
Removed: trunk/debian/patches/099za_libxpm_spopen_fix.diff Modified: trunk/debian/TODO Log: Remove David Nusinow's patch which fails to apply, has patches already applied, and includes changes not relevant to fixing s_popen(). Update TODO to describe in detail how we should backport this patch. Add item: a separate, non-security fix to Xpm that is probably important but should be run by the Release Managers. See <URL: https://bugs.freedesktop.org/show_bug.cgi?id=830 >. Modified: trunk/debian/TODO =================================================================== --- trunk/debian/TODO 2005-05-17 18:09:25 UTC (rev 2264) +++ trunk/debian/TODO 2005-05-17 18:42:51 UTC (rev 2265) @@ -17,8 +17,37 @@ 4.3.0.dfsg.1-14 --------------- * Get fix for Spanish debconf template translations from Steve Langasek. -* Tidy up latest libXpm fix (s_popen flaw). +* Grab Xpm library fixes from freedesktop.org xorg CVS: + * xc/extras/Xpm/lib/xpm.h + Bugzilla #830 (https://bugs.freedesktop.org/show_bug.cgi?id=830) + attachment #1493 (https://bugs.freedesktop.org/attachment.cgi?id=1493): + Fix libXpm header (xpm.h) to use the X11 function begin/end marker + macros (_XFUNCPROTOBEGIN, _XFUNCPROTOEND) instead of homegrown + (native) C++ code. + Patch by Kevin DeKorte <[EMAIL PROTECTED]>. + Changes needed: + xc/extras/Xpm/lib/xpm.h 1.2 -> 1.3 + + + Replace security-flawed s_popen() fix for CAN-2004-0914 with better fix by + Alex Reisen and Matthieu Herrb. + * extras/Xpm/lib/RdFToI.c: + * extras/Xpm/lib/WrFFrI.c: + * lib/Xpm/Imakefile: + Replace s_popen() by a more specific function that allows only + one command in the pipe. Remove extraneous tests on file names + that broke some applications. From Alex Reisen in Bugzilla #1920. + * more s_open() cleanup. + * Fix incomplete merge. + * Remove s_open.c references in (unused) Imakefile too. + + Changes needed: + xc/extras/Xpm/lib/RdFToI.c 1.3 -> 1.6 + xc/extras/Xpm/lib/WrFFrI.c 1.4 -> 1.5 + xc/extras/Xpm/lib/s_popen.c DELETE + xc/extras/Xpm/Imakefile 1.2 -> 1.3 + xc/lib/Xpm/Imakefile 1.4 -> 1.5 + Post 4.3.0-1 ------------ * Rewrite xserver-xfree86 debconfage, possibly as xserver-xorg debconfage. Joey Deleted: trunk/debian/patches/099za_libxpm_spopen_fix.diff =================================================================== --- trunk/debian/patches/099za_libxpm_spopen_fix.diff 2005-05-17 18:09:25 UTC (rev 2264) +++ trunk/debian/patches/099za_libxpm_spopen_fix.diff 2005-05-17 18:42:51 UTC (rev 2265) @@ -1,651 +0,0 @@ -diff -ruN xc-old/extras/Xpm/cxpm/cxpm.c xc/extras/Xpm/cxpm/cxpm.c ---- xc-old/extras/Xpm/cxpm/cxpm.c 2001-07-31 20:44:34.000000000 -0400 -+++ xc/extras/Xpm/cxpm/cxpm.c 2005-05-14 16:16:52.000000000 -0400 -@@ -47,8 +47,9 @@ - * note that 's' could stand both for "special" and "slow" ;-) - */ - static int --sGetc(data) -+sGetc(data, file) - xpmData *data; -+ FILE *file; - { - int c = getc(data->stream.file); - if (c == '\n') { -@@ -61,9 +62,10 @@ - } - - static void --sUngetc(data, c) -+sUngetc(data, c, file) - xpmData *data; - int c; -+ FILE *file; - { - ungetc(c, data->stream.file); - if (c == '\n') { -diff -ruN xc-old/extras/Xpm/lib/create.c xc/extras/Xpm/lib/create.c ---- xc-old/extras/Xpm/lib/create.c 2005-05-14 15:57:06.000000000 -0400 -+++ xc/extras/Xpm/lib/create.c 2005-05-14 16:16:52.000000000 -0400 -@@ -1,4 +1,4 @@ --/* $XdotOrg: pre-CVS proposed fix for CESA-2004-003 alanc 7/25/2004 $ */ -+/* $XdotOrg: xc/extras/Xpm/lib/create.c,v 1.2.4.2 2004/12/17 01:09:36 gisburn Exp $ */ - /* - * Copyright (C) 1989-95 GROUPE BULL - * -@@ -33,7 +33,7 @@ - * * - * Developed by Arnaud Le Hors * - \*****************************************************************************/ --/* $XFree86: xc/extras/Xpm/lib/create.c,v 1.3 2002/01/07 19:40:49 dawes Exp $ */ -+/* $XFree86: xc/extras/Xpm/lib/create.c,v 1.4 2003/05/27 22:26:20 tsi Exp $ */ - - /* - * The code related to FOR_MSW has been added by -@@ -129,7 +129,9 @@ - - LFUNC(PutPixel1, int, (XImage *ximage, int x, int y, unsigned long pixel)); - LFUNC(PutPixel, int, (XImage *ximage, int x, int y, unsigned long pixel)); -+#if !defined(WORD64) && !defined(LONG64) - LFUNC(PutPixel32, int, (XImage *ximage, int x, int y, unsigned long pixel)); -+#endif - LFUNC(PutPixel32MSB, int, (XImage *ximage, int x, int y, unsigned long pixel)); - LFUNC(PutPixel32LSB, int, (XImage *ximage, int x, int y, unsigned long pixel)); - LFUNC(PutPixel16MSB, int, (XImage *ximage, int x, int y, unsigned long pixel)); -@@ -770,7 +772,6 @@ - unsigned int depth; - int bitmap_format; - XpmFreeColorsFunc freeColors; -- void *closure; - - /* variables to return */ - XImage *ximage = NULL; -@@ -817,14 +818,10 @@ - freeColors = attributes->free_colors; - else - freeColors = FreeColors; -- if (attributes && (attributes->valuemask & XpmColorClosure)) -- closure = attributes->color_closure; -- else -- closure = NULL; - - ErrorStatus = XpmSuccess; - -- if (image->ncolors >= UINT_MAX / sizeof(Pixel)) -+ if (image->ncolors >= UINT_MAX / sizeof(Pixel)) - return (XpmNoMemory); - - /* malloc pixels index tables */ -@@ -1218,10 +1215,10 @@ - register char *src; - register char *dst; - register unsigned int *iptr; -- register unsigned int x, y, i; -+ register unsigned int x, y; - register char *data; - Pixel pixel, px; -- int nbytes, depth, ibu, ibpp; -+ int nbytes, depth, ibu, ibpp, i; - - data = image->data; - iptr = pixelindex; -@@ -1832,6 +1829,7 @@ - return 1; - } - -+#if !defined(WORD64) && !defined(LONG64) - static int - PutPixel32(ximage, x, y, pixel) - register XImage *ximage; -@@ -1848,6 +1846,7 @@ - *((unsigned long *)addr) = pixel; - return 1; - } -+#endif - - static int - PutPixel32MSB(ximage, x, y, pixel) -@@ -1995,7 +1994,6 @@ - unsigned int depth; - int bitmap_format; - XpmFreeColorsFunc freeColors; -- void *closure; - - /* variables to return */ - XImage *ximage = NULL; -@@ -2053,10 +2051,6 @@ - freeColors = attributes->free_colors; - else - freeColors = FreeColors; -- if (attributes && (attributes->valuemask & XpmColorClosure)) -- closure = attributes->color_closure; -- else -- closure = NULL; - - cmts = info && (info->valuemask & XpmReturnComments); - -diff -ruN xc-old/extras/Xpm/lib/Imakefile xc/extras/Xpm/lib/Imakefile ---- xc-old/extras/Xpm/lib/Imakefile 2005-05-14 15:57:06.000000000 -0400 -+++ xc/extras/Xpm/lib/Imakefile 2005-05-14 16:16:52.000000000 -0400 -@@ -104,15 +104,13 @@ - CrBufFrI.c CrDatFrP.c CrPFrBuf.c RdFToI.c WrFFrI.c \ - CrBufFrP.c CrIFrBuf.c CrPFrDat.c RdFToP.c WrFFrP.c \ - CrDatFrI.c CrIFrDat.c RdFToDat.c WrFFrDat.c \ -- Attrib.c CrIFrP.c CrPFrI.c Image.c Info.c RdFToBuf.c WrFFrBuf.c \ -- s_popen.c -+ Attrib.c CrIFrP.c CrPFrI.c Image.c Info.c RdFToBuf.c WrFFrBuf.c - - OBJS = data.o create.o misc.o rgb.o scan.o parse.o hashtab.o \ - CrBufFrI.o CrDatFrP.o CrPFrBuf.o RdFToI.o WrFFrI.o \ - CrBufFrP.o CrIFrBuf.o CrPFrDat.o RdFToP.o WrFFrP.o \ - CrDatFrI.o CrIFrDat.o RdFToDat.o WrFFrDat.o \ -- Attrib.o CrIFrP.o CrPFrI.o Image.o Info.o RdFToBuf.o WrFFrBuf.o \ -- s_popen.o -+ Attrib.o CrIFrP.o CrPFrI.o Image.o Info.o RdFToBuf.o WrFFrBuf.o - - INCLUDES = -I. - LINTLIBS = $(LINTXTOLL) $(LINTXLIB) -diff -ruN xc-old/extras/Xpm/lib/RdFToI.c xc/extras/Xpm/lib/RdFToI.c ---- xc-old/extras/Xpm/lib/RdFToI.c 2005-05-14 15:57:06.000000000 -0400 -+++ xc/extras/Xpm/lib/RdFToI.c 2005-05-14 16:16:52.000000000 -0400 -@@ -31,20 +31,16 @@ - * * - * Developed by Arnaud Le Hors * - \*****************************************************************************/ --/* $XFree86: xc/extras/Xpm/lib/RdFToI.c,v 1.2 2001/10/28 03:32:09 tsi Exp $ */ -+/* $XFree86$ */ - - /* October 2004, source code review by Thomas Biege <[EMAIL PROTECTED]> */ - - #include "XpmI.h" --#include <sys/stat.h> --#if !defined(NO_ZPIPE) && defined(WIN32) --# define popen _popen --# define pclose _pclose --# if defined(STAT_ZFILE) --# include <io.h> --# define stat _stat --# define fstat _fstat --# endif -+#ifndef NO_ZPIPE -+#include <fcntl.h> -+#include <errno.h> -+#include <sys/types.h> -+#include <sys/wait.h> - #endif - - LFUNC(OpenReadFile, int, (char *filename, xpmData *mdata)); -@@ -122,89 +118,131 @@ - } - #endif /* CXPMPROG */ - --/* -- * open the given file to be read as an xpmData which is returned. -- */ - #ifndef NO_ZPIPE -- FILE *s_popen(char *cmd, const char *type); --#else --# define s_popen popen -+/* Do not depend on errno after read_through */ -+FILE* -+xpmPipeThrough(fd, cmd, arg1, mode) -+ int fd; -+ const char* cmd; -+ const char* arg1; -+ const char* mode; -+{ -+ FILE* fp; -+ int status, fds[2], in = 0, out = 1; -+ pid_t pid; -+ if ( 'w' == *mode ) -+ out = 0, in = 1; -+ if ( pipe(fds) < 0 ) -+ return NULL; -+ pid = fork(); -+ if ( pid < 0 ) -+ goto fail1; -+ if ( 0 == pid ) -+ { -+ close(fds[in]); -+ if ( dup2(fds[out], out) < 0 ) -+ goto err; -+ close(fds[out]); -+ if ( dup2(fd, in) < 0 ) -+ goto err; -+ close(fd); -+ pid = fork(); -+ if ( pid < 0 ) -+ goto err; -+ if ( 0 == pid ) -+ { -+ execlp(cmd, cmd, arg1, NULL); -+ perror(cmd); -+ goto err; -+ } -+ _exit(0); -+ err: -+ _exit(1); -+ } -+ close(fds[out]); -+ /* calling process: wait for first child */ -+ while ( waitpid(pid, &status, 0) < 0 && EINTR == errno ) -+ ; -+ if ( WIFSIGNALED(status) || -+ (WIFEXITED(status) && WEXITSTATUS(status) != 0) ) -+ goto fail2; -+ fp = fdopen(fds[in], mode); -+ if ( !fp ) -+ goto fail2; -+ close(fd); /* still open in 2nd child */ -+ return fp; -+fail1: -+ close(fds[out]); -+fail2: -+ close(fds[in]); -+ return NULL; -+} - #endif - -+/* -+ * open the given file to be read as an xpmData which is returned. -+ */ - static int - OpenReadFile(filename, mdata) - char *filename; - xpmData *mdata; - { --#ifndef NO_ZPIPE -- char buf[BUFSIZ]; --# ifdef STAT_ZFILE -- char *compressfile; -- struct stat status; --# endif --#endif -- - if (!filename) { - mdata->stream.file = (stdin); - mdata->type = XPMFILE; - } else { --#ifndef NO_ZPIPE -- size_t len = strlen(filename); -- -- if (len == 0) -- return(XpmOpenFailed); -- if ((len > 2) && !strcmp(".Z", filename + (len - 2))) { -- mdata->type = XPMPIPE; -- snprintf(buf, sizeof(buf), "uncompress -c \"%s\"", filename); -- if (!(mdata->stream.file = s_popen(buf, "r"))) -- return (XpmOpenFailed); -- -- } else if ((len > 3) && !strcmp(".gz", filename + (len - 3))) { -- mdata->type = XPMPIPE; -- snprintf(buf, sizeof(buf), "gunzip -qc \"%s\"", filename); -- if (!(mdata->stream.file = s_popen(buf, "r"))) -- return (XpmOpenFailed); -- -- } else { --# ifdef STAT_ZFILE -- if (!(compressfile = (char *) XpmMalloc(len + 4))) -+ int fd = open(filename, O_RDONLY); -+#if defined(NO_ZPIPE) -+ if ( fd < 0 ) -+ return XpmOpenFailed; -+#else -+ const char* ext = NULL; -+ if ( fd >= 0 ) -+ ext = strrchr(filename, '.'); -+#ifdef STAT_ZFILE /* searching for z-files if the given name not found */ -+ else -+ { -+ size_t len = strlen(filename); -+ char *compressfile = (char *) XpmMalloc(len + 4); -+ if ( !compressfile ) - return (XpmNoMemory); -- -- snprintf(compressfile, len+4, "%s.Z", filename); -- if (!stat(compressfile, &status)) { -- snprintf(buf, sizeof(buf), "uncompress -c \"%s\"", compressfile); -- if (!(mdata->stream.file = s_popen(buf, "r"))) { -+ strcpy(compressfile, filename); -+ strcpy(compressfile + len, ext = ".Z"); -+ fd = open(compressfile, O_RDONLY); -+ if ( fd < 0 ) -+ { -+ strcpy(compressfile + len, ext = ".gz"); -+ fd = open(compressfile, O_RDONLY); -+ if ( fd < 0 ) -+ { - XpmFree(compressfile); -- return (XpmOpenFailed); -- } -- mdata->type = XPMPIPE; -- } else { -- snprintf(compressfile, len+4, "%s.gz", filename); -- if (!stat(compressfile, &status)) { -- snprintf(buf, sizeof(buf), "gunzip -c \"%s\"", compressfile); -- if (!(mdata->stream.file = s_popen(buf, "r"))) { -- XpmFree(compressfile); -- return (XpmOpenFailed); -- } -- mdata->type = XPMPIPE; -- } else { --# endif --#endif -- if (!(mdata->stream.file = fopen(filename, "r"))) { --#if !defined(NO_ZPIPE) && defined(STAT_ZFILE) -- XpmFree(compressfile); --#endif -- return (XpmOpenFailed); -- } -- mdata->type = XPMFILE; --#ifndef NO_ZPIPE --# ifdef STAT_ZFILE -+ return XpmOpenFailed; - } - } - XpmFree(compressfile); --# endif - } - #endif -+ if ( ext && !strcmp(ext, ".Z") ) -+ { -+ mdata->type = XPMPIPE; -+ mdata->stream.file = xpmPipeThrough(fd, "uncompress", "-c", "r"); -+ } -+ else if ( ext && !strcmp(ext, ".gz") ) -+ { -+ mdata->type = XPMPIPE; -+ mdata->stream.file = xpmPipeThrough(fd, "gunzip", "-qc", "r"); -+ } -+ else -+#endif /* z-files */ -+ { -+ mdata->type = XPMFILE; -+ mdata->stream.file = fdopen(fd, "r"); -+ } -+ if (!mdata->stream.file) -+ { -+ close(fd); -+ return (XpmOpenFailed); -+ } - } - mdata->CommentLength = 0; - #ifdef CXPMPROG -@@ -221,15 +259,6 @@ - xpmDataClose(mdata) - xpmData *mdata; - { -- switch (mdata->type) { -- case XPMFILE: -- if (mdata->stream.file != (stdin)) -- fclose(mdata->stream.file); -- break; --#ifndef NO_ZPIPE -- case XPMPIPE: -+ if (mdata->stream.file != (stdin)) - fclose(mdata->stream.file); -- break; --#endif -- } - } -diff -ruN xc-old/extras/Xpm/lib/scan.c xc/extras/Xpm/lib/scan.c ---- xc-old/extras/Xpm/lib/scan.c 2005-05-14 15:57:06.000000000 -0400 -+++ xc/extras/Xpm/lib/scan.c 2005-05-14 16:16:52.000000000 -0400 -@@ -621,8 +621,8 @@ - char *dst; - unsigned int *iptr; - char *data; -- unsigned int x, y, i; -- int bits, depth, ibu, ibpp, offset; -+ unsigned int x, y; -+ int bits, depth, ibu, ibpp, offset, i; - unsigned long lbt; - Pixel pixel, px; - -@@ -633,6 +633,9 @@ - ibpp = image->bits_per_pixel; - offset = image->xoffset; - -+ if (image->bitmap_unit < 0) -+ return (XpmNoMemory); -+ - if ((image->bits_per_pixel | image->depth) == 1) { - ibu = image->bitmap_unit; - for (y = 0; y < height; y++) -diff -ruN xc-old/extras/Xpm/lib/WrFFrI.c xc/extras/Xpm/lib/WrFFrI.c ---- xc-old/extras/Xpm/lib/WrFFrI.c 2005-05-14 15:57:06.000000000 -0400 -+++ xc/extras/Xpm/lib/WrFFrI.c 2005-05-14 16:16:52.000000000 -0400 -@@ -31,19 +31,21 @@ - * * - * Developed by Arnaud Le Hors * - \*****************************************************************************/ --/* $XFree86: xc/extras/Xpm/lib/WrFFrI.c,v 1.2 2001/10/28 03:32:09 tsi Exp $ */ -+/* $XFree86$ */ - - /* - * The code related to AMIGA has been added by - * Lorens Younes ([EMAIL PROTECTED]) 4/96 - */ - --/* October 2004, source code review by Thomas Biege <[EMAIL PROTECTED]> */ -- - #include "XpmI.h" --#if !defined(NO_ZPIPE) && defined(WIN32) --# define popen _popen --# define pclose _pclose -+ -+#ifndef NO_ZPIPE -+#include "sys/wait.h" -+#include "sys/types.h" -+#include "fcntl.h" -+#include "unistd.h" -+#include "errno.h" - #endif - - /* MS Windows define a function called WriteFile @#%#&!!! */ -@@ -124,7 +126,7 @@ - /* let's try to make a valid C syntax name */ - if (index(name, '.')) { - strncpy(new_name, name, sizeof(new_name)); -- new_name[sizeof(new_name)-1] = 0; -+ new_name[sizeof(new_name)-1] = '\0'; - /* change '.' to '_' */ - name = s = new_name; - while ((dot = index(s, '.'))) { -@@ -134,8 +136,7 @@ - } - if (index(name, '-')) { - if (name != new_name) { -- strncpy(new_name, name, sizeof(new_name)); -- new_name[sizeof(new_name)-1] = 0; -+ strcpy(new_name, name); - name = new_name; - } - /* change '-' to '_' */ -@@ -252,8 +253,8 @@ - unsigned int x, y, h; - - h = height - 1; -- if (cpp != 0 && width >= (UINT_MAX - 3)/cpp) -- return XpmNoMemory; -+ if (cpp != 0 && width >= (UINT_MAX - 3)/cpp) -+ return XpmNoMemory; - p = buf = (char *) XpmMalloc(width * cpp + 3); - if (!buf) - return (XpmNoMemory); -@@ -301,55 +302,48 @@ - fprintf(file, ",\n\"XPMENDEXT\""); - } - -+ -+#ifndef NO_ZPIPE -+FUNC(xpmPipeThrough, FILE*, (int fd, -+ const char* cmd, -+ const char* arg1, -+ const char* mode)); -+#endif -+ - /* - * open the given file to be written as an xpmData which is returned - */ --#ifndef NO_ZPIPE -- FILE *s_popen(char *cmd, const char *type); --#else --# define s_popen popen --#endif - static int - OpenWriteFile(filename, mdata) - char *filename; - xpmData *mdata; - { --#ifndef NO_ZPIPE -- char buf[BUFSIZ]; -- --#endif -- - if (!filename) { - mdata->stream.file = (stdout); - mdata->type = XPMFILE; - } else { - #ifndef NO_ZPIPE -- size_t len = strlen(filename); -- -- if (len == 0) -- return(XpmOpenFailed); -- -+ size_t len; -+#endif -+ int fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0644); -+ if ( fd < 0 ) -+ return(XpmOpenFailed); -+#ifndef NO_ZPIPE -+ len = strlen(filename); - if (len > 2 && !strcmp(".Z", filename + (len - 2))) { -- snprintf(buf, sizeof(buf), "compress > \"%s\"", filename); -- if (!(mdata->stream.file = s_popen(buf, "w"))) -- return (XpmOpenFailed); -- -+ mdata->stream.file = xpmPipeThrough(fd, "compress", NULL, "w"); - mdata->type = XPMPIPE; - } else if (len > 3 && !strcmp(".gz", filename + (len - 3))) { -- snprintf(buf, sizeof(buf), "gzip -q > \"%s\"", filename); -- if (!(mdata->stream.file = s_popen(buf, "w"))) -- return (XpmOpenFailed); -- -+ mdata->stream.file = xpmPipeThrough(fd, "gzip", "-q", "w"); - mdata->type = XPMPIPE; -- } else { -+ } else - #endif -- if (!(mdata->stream.file = fopen(filename, "w"))) -- return (XpmOpenFailed); -- -+ { -+ mdata->stream.file = fdopen(fd, "w"); - mdata->type = XPMFILE; --#ifndef NO_ZPIPE - } --#endif -+ if (!mdata->stream.file) -+ return (XpmOpenFailed); - } - return (XpmSuccess); - } -@@ -361,15 +355,7 @@ - xpmDataClose(mdata) - xpmData *mdata; - { -- switch (mdata->type) { -- case XPMFILE: -- if (mdata->stream.file != (stdout)) -- fclose(mdata->stream.file); -- break; --#ifndef NO_ZPIPE -- case XPMPIPE: -+ if (mdata->stream.file != (stdout)) - fclose(mdata->stream.file); -- break; --#endif -- } - } -+ -diff -ruN xc-old/extras/Xpm/lib/xpm.h xc/extras/Xpm/lib/xpm.h ---- xc-old/extras/Xpm/lib/xpm.h 2001-08-22 19:36:44.000000000 -0400 -+++ xc/extras/Xpm/lib/xpm.h 2005-05-14 16:16:52.000000000 -0400 -@@ -85,16 +85,6 @@ - # define PIXEL_ALREADY_TYPEDEFED - #endif - --/* make sure we know whether function prototypes are needed or not */ --#ifndef NeedFunctionPrototypes --# if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus) --# define NeedFunctionPrototypes 1 --# else --# define NeedFunctionPrototypes 0 --# endif --#endif -- -- - /* Return ErrorStatus codes: - * null if full success - * positive if partial success -@@ -150,23 +140,19 @@ - } XpmInfo; - - typedef int (*XpmAllocColorFunc)( --#if NeedFunctionPrototypes - Display* /* display */, - Colormap /* colormap */, - char* /* colorname */, - XColor* /* xcolor */, - void* /* closure */ --#endif - ); - - typedef int (*XpmFreeColorsFunc)( --#if NeedFunctionPrototypes - Display* /* display */, - Colormap /* colormap */, - Pixel* /* pixels */, - int /* npixels */, - void* /* closure */ --#endif - ); - - typedef struct { -@@ -290,22 +276,15 @@ - - - /* macros for forward declarations of functions with prototypes */ --#if NeedFunctionPrototypes - #define FUNC(f, t, p) extern t f p - #define LFUNC(f, t, p) static t f p --#else --#define FUNC(f, t, p) extern t f() --#define LFUNC(f, t, p) static t f() --#endif - - - /* - * functions declarations - */ - --#ifdef __cplusplus --extern "C" { --#endif -+_XFUNCPROTOBEGIN - - /* FOR_MSW, all ..Pixmap.. are excluded, only the ..XImage.. are used */ - /* Same for Amiga! */ -@@ -459,10 +438,7 @@ - - FUNC(XpmFree, void, (void *ptr)); - --#ifdef __cplusplus --} /* for C++ V2.0 */ --#endif -- -+_XFUNCPROTOEND - - /* backward compatibility */ - -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

