Lesstif patches - lesstif stable has not been updated in a long time and these

are recognized patches (5 out of 6 are in Debian stable). Required for
the arb package.


svn path=/nixpkgs/trunk/; revision=12952
This commit is contained in:
Pjotr Prins 2008-10-05 08:59:26 +00:00
parent 1587e34e0a
commit cb546965bc
7 changed files with 494 additions and 2 deletions

View File

@ -0,0 +1,13 @@
--- lesstif2-0.94.4.orig/include/Motif-2.1/XmI/XpmI.h
+++ lesstif2-0.94.4/include/Motif-2.1/XmI/XpmI.h
@@ -217,8 +217,8 @@
FUNC(xpmHashSlot, xpmHashAtom *, (xpmHashTable *table, char *s));
FUNC(xpmHashIntern, int, (xpmHashTable *table, char *tag, void *data));
-#define HashAtomData(i) ((void *)i)
-#define HashColorIndex(slot) ((unsigned int)((*slot)->data))
+#define HashAtomData(i) ((void *)(uintptr_t)i)
+#define HashColorIndex(slot) ((uintptr_t)((*slot)->data))
#define USE_HASHTABLE (cpp > 2 && ncolors > 4)
/* I/O utility */

View File

@ -0,0 +1,11 @@
--- lesstif2-0.94.4.orig/include/Motif-2.1/Xm/XmStrDefs.h
+++ lesstif2-0.94.4/include/Motif-2.1/Xm/XmStrDefs.h
@@ -28,6 +28,8 @@
#include <X11/StringDefs.h>
+#include <Xm/Xm.h>
+
#ifdef __cplusplus
extern "C" {
#endif

View File

@ -0,0 +1,11 @@
--- lesstif2-0.95.0.orig/lib/Xm-2.1/RenderTable.c
+++ lesstif2-0.95.0/lib/Xm-2.1/RenderTable.c
@@ -465,7 +465,7 @@
DEBUGOUT(_LtDebug(__FILE__, w, "_XmRenderTableFinaliseTag(%s)\n", tag));
#if 1
/* Experimental start */
- if (r->dpy == 0)
+ if (r->dpy == 0 && w)
r->dpy = XtDisplay(w);
/* Experimental end */
#endif

View File

@ -0,0 +1,38 @@
--- lesstif2-0.94.4.orig/lib/Xm-2.1/Xpmcreate.c
+++ lesstif2-0.94.4/lib/Xm-2.1/Xpmcreate.c
@@ -1265,10 +1265,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;
--- lesstif2-0.94.4.orig/lib/Xm-2.1/Xpmscan.c
+++ lesstif2-0.94.4/lib/Xm-2.1/Xpmscan.c
@@ -672,8 +672,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;
@@ -684,6 +684,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++)

View File

@ -0,0 +1,24 @@
diff -ru lesstif2-0.94.4-old/lib/Xm-2.1/XmIm.c lesstif2-0.94.4/lib/Xm-2.1/XmIm.c
--- lesstif2-0.94.4-old/lib/Xm-2.1/XmIm.c 2004-10-20 21:32:11.000000000 +0200
+++ lesstif2-0.94.4/lib/Xm-2.1/XmIm.c 2007-03-28 14:39:27.000000000 +0200
@@ -133,7 +133,10 @@
p->next = q->next;
}
- XtFree((char *)stuff);
+ /* if count!=0 then someone uses the stuff as orig_xim
+ so unlink it but not free it */
+ if (!stuff->count)
+ XtFree((char *)stuff);
}
/*
@@ -1060,6 +1063,8 @@
XCloseIM(stuff->xim);
DEBUGOUT(_LtDebug(__FILE__, w, "XCloseIM(%p)\n", stuff->xim));
stuff->orig_xim->xim = NULL;
+ /* stuff->orig_xim is now useless */
+ XtFree(stuff->orig_xim);
} else {
DEBUGOUT(_LtDebug(__FILE__, w, "XmImCloseXIM(%p), count -> %d\n",
stuff->xim, stuff->orig_xim->count));

View File

@ -0,0 +1,381 @@
Index: lesstif2-0.95.0/lib/Xm-2.1/XpmRdFToI.c
===================================================================
--- lesstif2-0.95.0.orig/lib/Xm-2.1/XpmRdFToI.c 2004-11-18 22:00:58.000000000 +0100
+++ lesstif2-0.95.0/lib/Xm-2.1/XpmRdFToI.c 2006-07-11 11:13:29.000000000 +0200
@@ -44,11 +44,15 @@
DebugUtil.h! */
#include <stdio.h>
#include <string.h>
+#include <errno.h>
#include <ctype.h>
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
@@ -87,16 +91,6 @@
strcpy(dst, src); \
else return (XpmFileInvalid); }
#endif
-#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
-#endif
LFUNC(OpenReadFile, int, (char *filename, xpmData *mdata));
LFUNC(xpmDataClose, void, (xpmData *mdata));
@@ -173,90 +167,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 ||
- filename[len-1] == '/')
- 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
@@ -273,15 +308,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
- }
}
Index: lesstif2-0.95.0/lib/Xm-2.1/XpmWrFFrI.c
===================================================================
--- lesstif2-0.95.0.orig/lib/Xm-2.1/XpmWrFFrI.c 2005-04-13 20:03:27.000000000 +0200
+++ lesstif2-0.95.0/lib/Xm-2.1/XpmWrFFrI.c 2006-07-11 11:13:29.000000000 +0200
@@ -50,11 +50,15 @@
DebugUtil.h! */
#include <stdio.h>
#include <string.h>
+#include <errno.h>
#include <ctype.h>
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
@@ -94,11 +98,6 @@
else return (XpmFileInvalid); }
#endif
-#if !defined(NO_ZPIPE) && defined(WIN32)
-# define popen _popen
-# define pclose _pclose
-#endif
-
/* MS Windows define a function called WriteFile @#%#&!!! */
LFUNC(xpmWriteFile, int, (FILE *file, XpmImage *image, char *name,
XpmInfo *info));
@@ -354,58 +353,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 ||
- filename[0] == '/' ||
- strstr(filename, "../") != NULL ||
- filename[len-1] == '/')
- 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);
}
@@ -417,15 +406,6 @@
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
- }
}

View File

@ -1,12 +1,26 @@
{stdenv, fetchurl, x11, libXp, libXau}:
stdenv.mkDerivation {
name = "lesstif-0.95";
name = "lesstif-0.95-p2";
src = fetchurl {
url = mirror://sourceforge/lesstif/lesstif-0.95.0.tar.bz2;
md5 = "ab895165c149d7f95843c7584b1c7ad4";
};
buildInputs = [x11];
propagatedBuildInputs = [libXp libXau];
patches = [./c-linkage.patch];
# The last stable release of lesstif was in June 2006. These
# patches fix a number of later issues - in particular the
# render_table_crash shows up in 'arb'. The same patches appear
# in Debian, so we assume they have been sent upstream.
#
patches = [
./c-bad_integer_cast.patch
./c-linkage.patch
./c-unsigned_int.patch
./c-missing_xm_h.patch
./c-xim_chained_list_crash.patch
./c-render_table_crash.patch
./c-xpmpipethrough.patch
];
}