diff options
Diffstat (limited to 'src/WrFFrI.c')
-rw-r--r-- | src/WrFFrI.c | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/src/WrFFrI.c b/src/WrFFrI.c index 41b4c0d..c280641 100644 --- a/src/WrFFrI.c +++ b/src/WrFFrI.c @@ -39,9 +39,13 @@ */ #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 @#%#&!!! */ @@ -98,7 +102,7 @@ XpmWriteFileFromXpmImage(filename, image, info) XpmInfo *info; { xpmData mdata; - char *name, *dot, *s, new_name[BUFSIZ]; + char *name, *dot, *s, new_name[BUFSIZ] = {0}; int ErrorStatus; /* open file to write */ @@ -121,7 +125,8 @@ XpmWriteFileFromXpmImage(filename, image, info) #endif /* let's try to make a valid C syntax name */ if (index(name, '.')) { - strcpy(new_name, name); + strncpy(new_name, name, sizeof(new_name)); + new_name[sizeof(new_name)-1] = '\0'; /* change '.' to '_' */ name = s = new_name; while ((dot = index(s, '.'))) { @@ -248,6 +253,8 @@ WritePixels(file, width, height, cpp, pixels, colors) unsigned int x, y, h; h = height - 1; + if (cpp != 0 && width >= (UINT_MAX - 3)/cpp) + return XpmNoMemory; p = buf = (char *) XpmMalloc(width * cpp + 3); if (!buf) return (XpmNoMemory); @@ -295,6 +302,14 @@ WriteExtensions(file, ext, num) 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 */ @@ -303,38 +318,32 @@ 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 - int len = strlen(filename); + 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))) { - sprintf(buf, "compress > \"%s\"", filename); - if (!(mdata->stream.file = 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))) { - sprintf(buf, "gzip -q > \"%s\"", filename); - if (!(mdata->stream.file = 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); } @@ -346,15 +355,7 @@ static void xpmDataClose(mdata) xpmData *mdata; { - switch (mdata->type) { - case XPMFILE: - if (mdata->stream.file != (stdout)) - fclose(mdata->stream.file); - break; -#ifndef NO_ZPIPE - case XPMPIPE: - pclose(mdata->stream.file); - break; -#endif - } + if (mdata->stream.file != (stdout)) + fclose(mdata->stream.file); } + |