--- uae/src/zfile.c 2018/04/24 16:40:07 1.1.1.3 +++ uae/src/zfile.c 2018/04/24 17:16:45 1.1.1.9 @@ -9,7 +9,6 @@ #include "sysconfig.h" #include "sysdeps.h" -#include "config.h" #include "options.h" #include "zfile.h" @@ -21,50 +20,53 @@ extern char *ixemul_dev_path; /* /dev/ extern int readdevice (const char *, char *); #endif -static struct zfile +struct zfile { struct zfile *next; FILE *f; char name[L_tmpnam]; -} *zlist; +}; + +static struct zfile *zlist = 0; /* * called on exit() */ -void zfile_exit(void) +void zfile_exit (void) { struct zfile *l; - + while ((l = zlist)) { zlist = l->next; - fclose(l->f); - unlink(l->name); /* sam: in case unlink() after fopen() fails */ - free(l); + fclose (l->f); + unlink (l->name); /* sam: in case unlink() after fopen() fails */ + free (l); } } /* * fclose() but for a compressed file */ -int zfile_close(FILE *f) +int zfile_close (FILE *f) { struct zfile *pl = NULL; struct zfile *l = zlist; int ret; - while(l && l->f!=f) { + while (l && l->f!=f) { pl = l; l = l->next; } - if (!l) - return fclose(f); - ret = fclose(l->f); - + if (l == 0) + return fclose (f); + ret = fclose (l->f); + unlink (l->name); + if(!pl) zlist = l->next; else pl->next = l->next; - free(l); + free (l); return ret; } @@ -75,9 +77,26 @@ int zfile_close(FILE *f) static int gunzip (const char *decompress, const char *src, const char *dst) { char cmd[1024]; - if (!dst) + char *ext = strrchr (src, '.'); + if (!dst) + return 1; +#if defined(AMIGA) + sprintf (cmd, "%s -c -d -S %s \"%s\" > \"%s\"", decompress, ext, src, dst); +#else + sprintf (cmd, "%s -c -d \"%s\" > \"%s\"", decompress, src, dst); +#endif + return !system (cmd); +} + +/* + * bzip/bzip2 decompression + */ +static int bunzip (const char *decompress, const char *src, const char *dst) +{ + char cmd[1024]; + if (!dst) return 1; - sprintf (cmd, "%s -c -d %s >%s", decompress, src, dst); + sprintf (cmd, "%s -c -d \"%s\" > \"%s\"", decompress, src, dst); return !system (cmd); } @@ -100,7 +119,7 @@ static int lha (const char *src, const c /* * (pk)unzip decompression */ -static int unzip(const char *src, const char *dst) +static int unzip (const char *src, const char *dst) { char cmd[1024]; if (!dst) @@ -114,7 +133,7 @@ static int unzip(const char *src, const /* * decompresses the file (or check if dest is null) */ -static int uncompress(const char *name, char *dest) +static int uncompress (const char *name, char *dest) { char *ext = strrchr (name, '.'); char nam[1024]; @@ -127,9 +146,9 @@ static int uncompress(const char *name, || strcasecmp (ext, "roz") == 0) return gunzip ("gzip", name, dest); if (strcasecmp (ext, "bz") == 0) - return gunzip ("bzip", name, dest); + return bunzip ("bzip", name, dest); if (strcasecmp (ext, "bz2") == 0) - return gunzip ("bzip2", name, dest); + return bunzip ("bzip2", name, dest); #ifndef __DOS__ if (strcasecmp (ext, "lha") == 0 @@ -150,11 +169,11 @@ static int uncompress(const char *name, if (access (strcat (strcpy (nam, name), ".bz"), 0) >= 0 || access (strcat (strcpy (nam, name), ".BZ"), 0) >= 0) - return gunzip ("bzip", nam, dest); + return bunzip ("bzip", nam, dest); if (access (strcat (strcpy (nam, name), ".bz2"), 0) >= 0 || access (strcat (strcpy (nam, name), ".BZ2"), 0) >= 0) - return gunzip ("bzip2", nam, dest); + return bunzip ("bzip2", nam, dest); #ifndef __DOS__ if (access (strcat (strcpy (nam, name), ".lha"), 0) >= 0 @@ -182,44 +201,43 @@ static int uncompress(const char *name, /* * fopen() for a compressed file */ -FILE *zfile_open(const char *name, const char *mode) +FILE *zfile_open (const char *name, const char *mode) { struct zfile *l; int fd = 0; - if(! uncompress (name, NULL)) + if (! uncompress (name, NULL)) return fopen (name, mode); l = malloc (sizeof *l); - if (!l) + if (! l) return NULL; - tmpnam(l->name); + tmpnam (l->name); - /* On the amiga this would make ixemul loose the break handler */ - /* ==> fixed in exmul v4.6 */ - fd = creat(l->name, 0666); + fd = creat (l->name, S_IRUSR | S_IWUSR); if (fd < 0) return NULL; - if (!uncompress (name, l->name)) { - free(l); + if (! uncompress (name, l->name)) { close (fd); - unlink(l->name); + unlink (l->name); + free (l); return NULL; } - l->f = uae_fopen_del (l->name, mode); + l->f = fopen (l->name, mode); close (fd); if (l->f == NULL) { - free(l); + unlink (l->name); + free (l); return NULL; } l->next = zlist; - zlist = l; + zlist = l; return l->f; } @@ -230,18 +248,18 @@ FILE *zfile_open(const char *name, const * Stubs for machines that this doesn't work on. */ -void zfile_exit(void) +void zfile_exit (void) { } -int zfile_close(FILE *f) +int zfile_close (FILE *f) { return fclose(f); } -FILE *zfile_open(const char *name, const char *mode) +FILE *zfile_open (const char *name, const char *mode) { - return fopen(name, mode); + return fopen (name, mode); } #endif