--- uae/src/zfile.c 2018/04/24 16:40:07 1.1.1.3 +++ uae/src/zfile.c 2018/04/24 17:18:34 1.1.1.10 @@ -9,75 +9,105 @@ #include "sysconfig.h" #include "sysdeps.h" -#include "config.h" #include "options.h" #include "zfile.h" -#ifdef USE_ZFILE - #ifdef AMIGA extern char *amiga_dev_path; /* dev: */ extern char *ixemul_dev_path; /* /dev/ */ extern int readdevice (const char *, char *); #endif -static struct zfile +struct zfile { struct zfile *next; + struct zfile **pprev; FILE *f; char name[L_tmpnam]; -} *zlist; +}; + +static struct zfile *zlist = 0; /* - * called on exit() + * 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 + * fclose () but for a compressed file */ -int zfile_close(FILE *f) +int zfile_fclose (struct zfile *f) { - struct zfile *pl = NULL; - struct zfile *l = zlist; int ret; - while(l && l->f!=f) { - pl = l; - l = l->next; - } - if (!l) - return fclose(f); - ret = fclose(l->f); + if (f->next) + f->next->pprev = f->pprev; + (*f->pprev) = f->next; - if(!pl) - zlist = l->next; - else - pl->next = l->next; - free(l); + ret = fclose (f->f); + unlink (f->name); + + free (f); return ret; } +int zfile_fseek (struct zfile *z, long offset, int mode) +{ + return fseek (z->f, offset, mode); +} + +long zfile_ftell (struct zfile *z) +{ + return ftell (z->f); +} + +size_t zfile_fread (void *b, size_t l1, size_t l2, struct zfile *z) +{ + return fread (b, l1, l2, z->f); +} + +size_t zfile_fwrite (void *b, size_t l1, size_t l2, struct zfile *z) +{ + return fwrite (b, l1, l2, z->f); +} + /* * gzip decompression */ 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); } @@ -89,7 +119,7 @@ static int lha (const char *src, const c char cmd[1024]; if (!dst) return 1; -#if defined(AMIGA) +#if defined (AMIGA) sprintf (cmd, "lha -q -N p %s >%s", src, dst); #else sprintf (cmd, "lha pq %s >%s", src, dst); @@ -100,7 +130,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 +144,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 +157,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 +180,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 @@ -168,7 +198,7 @@ static int uncompress(const char *name, return unzip (nam, dest); #endif -#if defined(AMIGA) +#if defined (AMIGA) /* sam: must be before real access to work */ if (!strnicmp (name, ixemul_dev_path, strlen (ixemul_dev_path))) return readdevice (name + strlen (ixemul_dev_path), dest); @@ -180,68 +210,48 @@ static int uncompress(const char *name, } /* - * fopen() for a compressed file + * fopen () for a compressed file */ -FILE *zfile_open(const char *name, const char *mode) +struct zfile *zfile_open (const char *name, const char *mode) { - struct zfile *l; + struct zfile *l = malloc (sizeof *l); int fd = 0; - if(! uncompress (name, NULL)) - return fopen (name, mode); - - l = malloc (sizeof *l); - if (!l) + if (! l) return NULL; - tmpnam(l->name); - - /* On the amiga this would make ixemul loose the break handler */ - /* ==> fixed in exmul v4.6 */ - fd = creat(l->name, 0666); - if (fd < 0) - return NULL; + strcpy (l->name, ""); - if (!uncompress (name, l->name)) { - free(l); + if (! uncompress (name, NULL)) + l->f = fopen (name, mode); + else { + tmpnam (l->name); + fd = creat (l->name, S_IRUSR | S_IWUSR); + if (fd < 0) + return NULL; + + if (! uncompress (name, l->name)) { + close (fd); + unlink (l->name); + free (l); + return NULL; + } + l->f = fopen (l->name, mode); close (fd); - unlink(l->name); - return NULL; - } - - l->f = uae_fopen_del (l->name, mode); - - close (fd); + } if (l->f == NULL) { - free(l); + if (strlen (l->name) > 0) + unlink (l->name); + free (l); return NULL; } + l->pprev = &zlist; l->next = zlist; - zlist = l; - - return l->f; -} + if (l->next) + l->next->pprev = &l->next; + zlist = l; -#else - -/* - * Stubs for machines that this doesn't work on. - */ - -void zfile_exit(void) -{ -} - -int zfile_close(FILE *f) -{ - return fclose(f); + return l; } - -FILE *zfile_open(const char *name, const char *mode) -{ - return fopen(name, mode); -} - -#endif