home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 9 Archive / 09-Archive.zip / unzip531.zip / qdos / makesfx.c < prev    next >
C/C++ Source or Header  |  1997-01-18  |  4KB  |  156 lines

  1. /*
  2.  * makesfx - Makes a QDOS sfx zip file
  3.  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4.  * not copyrighted at all by Jonathan Hudson, 04/09/95
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <unistd.h>
  11. #include <fcntl.h>
  12.  
  13. #ifdef QDOS
  14. # include <qdos.h>
  15. # define ZMODE (X_OK|R_OK)
  16. #else
  17. # define ZMODE (R_OK)
  18. # define getchid(p1) p1
  19.  
  20. typedef struct
  21. {
  22.         long id;
  23.         long dlen;
  24. } NTC;
  25.  
  26. struct qdirect  {
  27.     long            d_length __attribute__ ((packed));  /* file length */
  28.     unsigned char   d_access __attribute__ ((packed));  /* file access type */
  29.     unsigned char   d_type __attribute__ ((packed));    /* file type */
  30.     long            d_datalen __attribute__ ((packed)); /* data length */
  31.     long            d_reserved __attribute__ ((packed));/* Unused */
  32.     short           d_szname __attribute__ ((packed));  /* size of name */
  33.     char            d_name[36] __attribute__ ((packed));/* name area */
  34.     long            d_update __attribute__ ((packed));  /* last update */
  35.     long            d_refdate __attribute__ ((packed));
  36.     long            d_backup __attribute__ ((packed));   /* EOD */
  37.     } ;
  38.  
  39. int fs_headr (int fd, long t, struct qdirect *qs, short size)
  40. {
  41.     NTC ntc;
  42.     int r = -1;
  43.  
  44.     lseek(fd, -8, SEEK_END);
  45.     read(fd, &ntc, 8);
  46.     if(ntc.id == *(long *)"XTcc")
  47.     {
  48.         qs->d_datalen = ntc.dlen;    /* This is big endian */
  49.         qs->d_type = 1;
  50.         r = 0;
  51.     }
  52.     lseek(fd, 0, 0);
  53.     return 42;                       /* why not ??? */
  54. }
  55.  
  56. void fs_heads (int fd, long t, struct qdirect *qs, short size)
  57. {
  58.     NTC ntc;
  59.  
  60.     read(fd, &ntc, 8);
  61.     ntc.id = *(long *)"XTcc";
  62.     ntc.dlen = qs->d_datalen;
  63.     write (fd, &ntc, 8);
  64. }
  65.  
  66. #endif
  67.  
  68.  
  69. #define RBUFSIZ 4096
  70.  
  71. int main (int ac, char **av)
  72. {
  73.     int fd;
  74.     static char local_sig[4] = "PK\003\004";
  75.     char *p, tmp[4];
  76.     short ok = 0;
  77.  
  78.     if(ac != 3)
  79.     {
  80.         fputs("makesfx unzipsfx zip_file\n", stderr);
  81.         exit (0);
  82.     }
  83.     if(isatty(1))
  84.     {
  85.         fputs("makesfx: writing sfx to terminal is TERMINAL !\n", stderr);
  86.         exit (0);
  87.     }
  88.  
  89.     if((fd = open(*(av+2), O_RDONLY)) > 0)
  90.     {
  91.         if((read(fd, tmp, 4) == 4))
  92.         {
  93.             if(*(long *)tmp == *(long *)local_sig)
  94.             {
  95.                 ok = 1;
  96.             }
  97.         }
  98.         close(fd);
  99.     }
  100.     if(!ok)
  101.     {
  102.         fprintf(stderr,
  103.                 "Huum, %s doesn't look like a ZIP file to me\n", *(av+2));
  104.         exit(0);
  105.     }
  106.  
  107.     if(strstr(*(av+1), "unzipsfx"))
  108.     {
  109.         if(access(*(av+1), ZMODE))
  110.         {
  111.             fprintf(stderr, "Sorry, don't like the look of %s\n", *(av+1));
  112.             exit(0);
  113.         }
  114.     }
  115.  
  116.     if(p = malloc(RBUFSIZ))
  117.     {
  118.         struct qdirect qd;
  119.         int n;
  120.  
  121.         if((fd = open(*(av+1), O_RDONLY)))
  122.         {
  123.             if(fs_headr(getchid(fd), -1, &qd, sizeof(qd)) > 0)
  124.             {
  125.                 while((n = read(fd, p, RBUFSIZ)) > 0)
  126.                 {
  127.                     write(1, p, n);
  128.                 }
  129.                 close(fd);
  130.                 if((fd = open(*(av+2), O_RDONLY)) > 0)
  131.                 {
  132.                     while((n = read(fd, p, RBUFSIZ)) > 0)
  133.                     {
  134.                         write(1, p, n);
  135.                     }
  136.                     close(fd);
  137.                 }
  138.                 fs_heads(getchid(1), -1, &qd, sizeof(qd));
  139.             }
  140.             else
  141.             {
  142.                 close(fd);
  143.                 fputs("Can't read unzipsfx header", stderr);
  144.                 exit(0);
  145.             }
  146.         }
  147.         free(p);
  148.     }
  149.     else
  150.     {
  151.         fputs("Out of memory", stderr);
  152.         exit(0);
  153.     }
  154.     return 0;
  155. }
  156.