home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MYWIVE.ZIP / XFERTMP.C < prev    next >
C/C++ Source or Header  |  1993-05-06  |  4KB  |  161 lines

  1. #include "vars.h"
  2. #pragma hdrstop
  3. #include <dir.h>
  4. #define SETREC(i)  lseek(dlf,((long) (i))*((long)sizeof(uploadsrec)),SEEK_SET);
  5.  
  6. /* the archive type to use */
  7. #define ARC_NUMBER 0
  8.  
  9. /* .ZIP structures and defines */
  10. #define ZIP_LOCAL_SIG 0x04034b50
  11. #define ZIP_CENT_START_SIG 0x02014b50
  12. #define ZIP_CENT_END_SIG 0x06054b50
  13.  
  14. typedef struct {
  15.   unsigned long         signature;    /* 0x04034b50 */
  16.   unsigned short        extract_ver;
  17.   unsigned short        flags;
  18.   unsigned short        comp_meth;
  19.   unsigned short        mod_time;
  20.   unsigned short        mod_date;
  21.   unsigned long         crc_32;
  22.   unsigned long         comp_size;
  23.   unsigned long         uncomp_size;
  24.   unsigned short        filename_len;
  25.   unsigned short        extra_length;
  26. } zip_local_header;
  27.  
  28. typedef struct {
  29.   unsigned long         signature;    /* 0x02014b50 */
  30.   unsigned short        made_ver;
  31.   unsigned short        extract_ver;
  32.   unsigned short        flags;
  33.   unsigned short        comp_meth;
  34.   unsigned short        mod_time;
  35.   unsigned short        mod_date;
  36.   unsigned long         crc_32;
  37.   unsigned long         comp_size;
  38.   unsigned long         uncomp_size;
  39.   unsigned short        filename_len;
  40.   unsigned short        extra_len;
  41.   unsigned short        comment_len;
  42.   unsigned short        disk_start;
  43.   unsigned short        int_attr;
  44.   unsigned long         ext_attr;
  45.   unsigned long         rel_ofs_header;
  46. } zip_central_dir;
  47.  
  48. typedef struct {
  49.   unsigned long         signature;    /* 0x06054b50 */
  50.   unsigned short        disk_num;
  51.   unsigned short        cent_dir_disk_num;
  52.   unsigned short        total_entries_this_disk;
  53.   unsigned short        total_entries_total;
  54.   unsigned long         central_dir_size;
  55.   unsigned long         ofs_cent_dir;
  56.   unsigned short        comment_len;
  57. } zip_end_dir;
  58.  
  59. /* strings not to allow in a .zip file to extract from */
  60. char *bad_words[] = {
  61.   "COMMAND",
  62.   "..",
  63.   NULL,
  64. };
  65.  
  66. long bad_filename(char *fn)
  67. {
  68.   int i;
  69.  
  70.   strupr(fn);
  71.   for (i=0; bad_words[i]; i++) {
  72.     if (strstr(fn,bad_words[i])) {
  73.       npr("Can't extract from that because it has '%s'.\r\n",fn);
  74.       return(1);
  75.     }
  76.   }
  77.   if (!okfn(fn)) {
  78.     npr("Can't extract from that because it has '%s'.\r\n",fn);
  79.     return(1);
  80.   }
  81.   return(0);
  82. }
  83.  
  84. long check_for_files_zip(char *fn)
  85. {
  86.   int f;
  87.   long l,sig,len;
  88.   zip_local_header zl;
  89.   zip_central_dir zc;
  90.   zip_end_dir ze;
  91.   char s[161];
  92.  
  93. #define READ_FN(ln) {read(f,s,ln); s[ln]=0;}
  94.  
  95.   f=open(fn,O_RDWR | O_BINARY);
  96.   if (f>0) {
  97.     l=0;
  98.     len=filelength(f);
  99.     while (l<len) {
  100.       lseek(f,l,SEEK_SET);
  101.       read(f,&sig, 4);
  102.       lseek(f,l,SEEK_SET);
  103.       switch(sig) {
  104.         case ZIP_LOCAL_SIG:
  105.           read(f,&zl, sizeof(zl));
  106.           READ_FN(zl.filename_len);
  107.           if (bad_filename(s)) {
  108.             close(f);
  109.             return(1);
  110.           }
  111.           l += sizeof(zl);
  112.           l += zl.comp_size + zl.filename_len + zl.extra_length;
  113.           break;
  114.         case ZIP_CENT_START_SIG:
  115.           read(f,&zc, sizeof(zc));
  116.           READ_FN(zc.filename_len);
  117.           if (bad_filename(s)) {
  118.             close(f);
  119.             return(1);
  120.           }
  121.           l += sizeof(zc);
  122.           l += zc.filename_len + zc.extra_len;
  123.           break;
  124.         case ZIP_CENT_END_SIG:
  125.           read(f,&ze, sizeof(ze));
  126.           close(f);
  127.           return(0);
  128.         default:
  129.           close(f);
  130.           npr("Error examining that; can't extract from it.\r\n");
  131.           return(1);
  132.       }
  133.     }
  134.     close(f);
  135.     return(0);
  136.   }
  137.   npr("file not found: %s\r\n",fn);
  138.   return(1);
  139. }
  140.  
  141. int check_for_files(char *fn)
  142. {
  143.   char *ss;
  144.  
  145.   ss=strrchr(fn,'.');
  146.   if (ss) {
  147.     if (stricmp(ss+1,"ZIP")==NULL) {
  148.       return(check_for_files_zip(fn));
  149.     } else if (stricmp(ss+1,"ARC")==NULL) {
  150.       /* no processing for .ARC files yet */
  151.     } else {
  152.       /* unknown archive type; let it through. */
  153.     }
  154.   } else {
  155.     /* no extension? */
  156.     npr("No extension.\r\n");
  157.     return(1);
  158.   }
  159.   return(0);
  160. }
  161.