home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / XFERTMP.C < prev    next >
Text File  |  1991-12-26  |  12KB  |  507 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1991 by Wayne Bell
  5.  
  6. Distribution of the source code for WWIV, in any form, modified or unmodified,
  7. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  8. Distribution of compiled versions of WWIV is limited to copies compiled BY
  9. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  10. is expressly prohibited.
  11.  
  12.  
  13. *****************************************************************************/
  14.  
  15.  
  16.  
  17. #include "vars.h"
  18.  
  19. #pragma hdrstop
  20.  
  21. #include <dir.h>
  22.  
  23.  
  24.  
  25.  
  26. #define SETREC(i)  lseek(dlf,((long) (i))*((long)sizeof(uploadsrec)),SEEK_SET);
  27.  
  28. /* the archive type to use */
  29. #define ARC_NUMBER 0
  30.  
  31. /* .ZIP structures and defines */
  32. #define ZIP_LOCAL_SIG 0x04034b50
  33. #define ZIP_CENT_START_SIG 0x02014b50
  34. #define ZIP_CENT_END_SIG 0x06054b50
  35.  
  36. typedef struct {
  37.   unsigned long         signature;    /* 0x04034b50 */
  38.   unsigned short        extract_ver;
  39.   unsigned short        flags;
  40.   unsigned short        comp_meth;
  41.   unsigned short        mod_time;
  42.   unsigned short        mod_date;
  43.   unsigned long         crc_32;
  44.   unsigned long         comp_size;
  45.   unsigned long         uncomp_size;
  46.   unsigned short        filename_len;
  47.   unsigned short        extra_length;
  48. } zip_local_header;
  49.  
  50. typedef struct {
  51.   unsigned long         signature;    /* 0x02014b50 */
  52.   unsigned short        made_ver;
  53.   unsigned short        extract_ver;
  54.   unsigned short        flags;
  55.   unsigned short        comp_meth;
  56.   unsigned short        mod_time;
  57.   unsigned short        mod_date;
  58.   unsigned long         crc_32;
  59.   unsigned long         comp_size;
  60.   unsigned long         uncomp_size;
  61.   unsigned short        filename_len;
  62.   unsigned short        extra_len;
  63.   unsigned short        comment_len;
  64.   unsigned short        disk_start;
  65.   unsigned short        int_attr;
  66.   unsigned long         ext_attr;
  67.   unsigned long         rel_ofs_header;
  68. } zip_central_dir;
  69.  
  70.  
  71. typedef struct {
  72.   unsigned long         signature;    /* 0x06054b50 */
  73.   unsigned short        disk_num;
  74.   unsigned short        cent_dir_disk_num;
  75.   unsigned short        total_entries_this_disk;
  76.   unsigned short        total_entries_total;
  77.   unsigned long         central_dir_size;
  78.   unsigned long         ofs_cent_dir;
  79.   unsigned short        comment_len;
  80. } zip_end_dir;
  81.  
  82.  
  83. /* strings not to allow in a .zip file to extract from */
  84. char *bad_words[] = {
  85.   "COMMAND",
  86.   "\\",
  87.   ":",
  88.   ">",
  89.   "<",
  90.   "|",
  91.   "..",
  92.   NULL,
  93. };
  94.  
  95. long bad_filename(char *fn)
  96. {
  97.   int i;
  98.  
  99.   strupr(fn);
  100.   for (i=0; bad_words[i]; i++) {
  101.     if (strstr(fn,bad_words[i])) {
  102.       npr("Can't extract from that because it has '%s'.\r\n",fn);
  103.       return(1);
  104.     }
  105.   }
  106.   return(0);
  107. }
  108.  
  109. long check_for_files_zip(char *fn)
  110. {
  111.   int f;
  112.   long l,sig,len;
  113.   zip_local_header zl;
  114.   zip_central_dir zc;
  115.   zip_end_dir ze;
  116.   char s[161];
  117.  
  118. #define READ_FN(ln) {read(f,s,ln); s[ln]=0;}
  119.  
  120.   f=open(fn,O_RDWR | O_BINARY);
  121.   if (f>0) {
  122.     l=0;
  123.     len=filelength(f);
  124.     while (l<len) {
  125.       lseek(f,l,SEEK_SET);
  126.       read(f,&sig, 4);
  127.       lseek(f,l,SEEK_SET);
  128.       switch(sig) {
  129.         case ZIP_LOCAL_SIG:
  130.           read(f,&zl, sizeof(zl));
  131.           READ_FN(zl.filename_len);
  132.           if (bad_filename(s)) {
  133.             close(f);
  134.             return(1);
  135.           }
  136.           l += sizeof(zl);
  137.           l += zl.comp_size + zl.filename_len + zl.extra_length;
  138.           break;
  139.         case ZIP_CENT_START_SIG:
  140.           read(f,&zc, sizeof(zc));
  141.           READ_FN(zc.filename_len);
  142.           if (bad_filename(s)) {
  143.             close(f);
  144.             return(1);
  145.           }
  146.           l += sizeof(zc);
  147.           l += zc.filename_len + zc.extra_len;
  148.           break;
  149.         case ZIP_CENT_END_SIG:
  150.           read(f,&ze, sizeof(ze));
  151.           close(f);
  152.           return(0);
  153.         default:
  154.           close(f);
  155.       npr("1Error examining that; can't extract from it.\r\n");
  156.       return(1);
  157.       }
  158.     }
  159.     close(f);
  160.     return(0);
  161.   }
  162.  
  163.   npr("1file not found3: %s\r\n",fn);
  164.   return(1);
  165. }
  166.  
  167. int check_for_files(char *fn)
  168. {
  169.   char *ss;
  170.  
  171.   ss=strrchr(fn,'.');
  172.   if (ss) {
  173.     if (stricmp(ss+1,"ZIP")==NULL) {
  174.       return(check_for_files_zip(fn));
  175.     } else if (stricmp(ss+1,"ARC")==NULL) {
  176.       /* no processing for .ARC files yet */
  177.     } else {
  178.       /* unknown archive type; let it through. */
  179.     }
  180.   } else {
  181.     /* no extension? */
  182.     npr("No extension.\r\n");
  183.     return(1);
  184.   }
  185.   return(0);
  186. }
  187.  
  188.  
  189. void download_temp_arc()
  190. {
  191.   char s[81],s1[81];
  192.   long numbytes;
  193.   double d;
  194.   int i,f,sent,abort;
  195.  
  196.   if (!ratio_ok())
  197.     return;
  198.   sprintf(s1,"%sTEMP.%s",syscfg.tempdir,syscfg.arcs[ARC_NUMBER].extension);
  199.   f=open(s1,O_RDWR | O_BINARY);
  200.   if (f<0) {
  201.     nl();
  202.     nl();
  203.     pl("1There is no temporary archive file.");
  204.     nl();
  205.     return;
  206.   }
  207.   numbytes=filelength(f);
  208.   close(f);
  209.   if (numbytes==0L) {
  210.     nl();
  211.     nl();
  212.     pl("1There is no temporary archive file.");
  213.     nl();
  214.     return;
  215.   }
  216.   d=((double) (((numbytes)+127)/128)) *
  217.     (1620.0) /
  218.     ((double) (modem_speed));
  219.   if (d<=nsl()) {
  220.     npr("Approx. time: %s\r\n",ctim(d));
  221.     sent=0;
  222.     abort=0;
  223.     sprintf(s,"TEMP.%s",syscfg.arcs[ARC_NUMBER].extension);
  224.     send_file(s1,&sent,&abort,0,s,-1,numbytes);
  225.     if (sent) {
  226.       ++thisuser.downloaded;
  227.       thisuser.dk += ((numbytes+1023)/1024);
  228.       sprintf(s1,"Downloaded %ldk of temporary file",(numbytes+1023)/1024);
  229.       sysoplog(s1);
  230.       nl();
  231.       nl();
  232.       npr("1Your ratio is now3:6 %-6.3f\r\n",ratio());
  233.       if (useron)
  234.         topscreen();
  235.     }
  236.   } else {
  237.     nl();
  238.     nl();
  239.     pl("6Not enough time left to D/L.");
  240.     nl();
  241.   }
  242. }
  243.  
  244. void add_temp_arc()
  245. {
  246.   char s[255],s1[81],s2[81],s3[81];
  247.   int i;
  248.  
  249.   nl();
  250.   pl("3Enter filename to add to temporary");
  251.   pl("3archive file.  May contain wildcards.");
  252.   prt(2,": ");
  253.   input(s,12);
  254.   if (!okfn(s))
  255.     return;
  256.   if (s[0]==0)
  257.     return;
  258.   if (strchr(s,'.')==NULL)
  259.     strcat(s,".*");
  260.   strcpy(s2,stripfn(s));
  261.   for (i=0; i<strlen(s2); i++)
  262.     if ((s2[i]=='|') || (s2[i]=='>') || (s2[i]=='<') || (s2[i]==';') || (s2[i]==' ') ||
  263.         (s2[i]==':') || (s2[i]=='/') || (s2[i]=='\\'))
  264.       return;
  265.   sprintf(s1,"%sTEMP.%s",syscfg.tempdir,syscfg.arcs[ARC_NUMBER].extension);
  266.   sprintf(s3,"%s%s",syscfg.tempdir,s2);
  267.   get_arc_cmd(s,s1,2,s3);
  268.   if (s[0]) {
  269.     sprintf(s1,"1Added3 '%s' 1to temporary archive",s2);
  270.     sysoplog(s1);
  271.     do_external(s,0);
  272.   } else
  273.     pl("1Sorry, can't add to temp archive.");
  274. }
  275.  
  276. void del_temp()
  277. {
  278.   char s[81],s1[81];
  279.   nl();
  280.   prt(1,"Filename to delete3: ");
  281.   input(s1,12);
  282.   if (!okfn(s1))
  283.     return;
  284.   if (s1[0]) {
  285.     if (strchr(s1,'.')==NULL)
  286.       strcat(s1,".*");
  287.     remove_from_temp(s1,syscfg.tempdir, 1);
  288.   }
  289. }
  290.  
  291. void list_temp_dir()
  292. {
  293.   int i,i1,f1,abort;
  294.   char s[81],s1[81];
  295.   struct ffblk ff;
  296.   uploadsrec u;
  297.  
  298.   sprintf(s1,"%s*.*",syscfg.tempdir);
  299.   f1=findfirst(s1,&ff,0);
  300.   nl();
  301.   pl("1Files in temporary directory3:");
  302.   nl();
  303.   i1=0;
  304.   abort=0;
  305.   while ((f1==0) && (!hangup) && (!abort)) {
  306.     strcpy(s,(ff.ff_name));
  307.     align(s);
  308.     sprintf(s1,"%12s  %-8ld",s,ff.ff_fsize);
  309.     pla(s1, &abort);
  310.     f1=findnext(&ff);
  311.     i1=1;
  312.   }
  313.   if (!i1)
  314.     pl("6None.");
  315.   nl();
  316.   if ((!abort) && (!hangup)) {
  317.     sprintf(s,"Free space: %ldk.",(long) freek1(syscfg.tempdir));
  318.     pl(s);
  319.     nl();
  320.   }
  321. }
  322.  
  323.  
  324. void temp_extract()
  325. {
  326.   int i,i1,i2,i3,ok,abort,ok1;
  327.   char s[255],s1[255],s2[81],s3[255],s4[129];
  328.   uploadsrec u,u1;
  329.  
  330.   dliscan();
  331.   nl();
  332.   pl("3Extract to temporary directory1:");
  333.   nl();
  334.   prt(1,"What's the filename3? ");
  335.   input(s,12);
  336.   if ((!okfn(s)) || (s[0]==0)) {
  337.     closedl();
  338.     return;
  339.   }
  340.   if (strchr(s,'.')==NULL)
  341.     strcat(s,".*");
  342.   align(s);
  343.   i=recno(s);
  344.   ok=1;
  345.   while ((i>0) && (ok) && (!hangup)) {
  346.     SETREC(i);
  347.     read(dlf,(void *)&u,sizeof(uploadsrec));
  348.     sprintf(s2,"%s%s",directories[udir[curdir].subnum].path,u.filename);
  349.     get_arc_cmd(s1,s2,1,"");
  350.     if ((s1[0]) && (exist(s2))) {
  351.       nl();
  352.       nl();
  353.       abort=0;
  354.       printinfo(&u,&abort);
  355.       nl();
  356.       cd_to(directories[udir[curdir].subnum].path);
  357.       get_dir(s4,1);
  358.       strcat(s4,stripfn(u.filename));
  359.       cd_to(cdir);
  360.       if (!check_for_files(s4)) {
  361.         do {
  362.       prt(1,"Extract what 5(1?=list,Q=abort5)3 ? ");
  363.       input(s1,12);
  364.       if (s1[0]==0)
  365.             ok1=0;
  366.           else
  367.             ok1=1;
  368.           if (!okfn(s1))
  369.             ok1=0;
  370.           if (strcmp(s1,"?")==0) {
  371.             list_arc_out(stripfn(u.filename),directories[udir[curdir].subnum].path);
  372.             s1[0]=0;
  373.           }
  374.           if (strcmp(s1,"Q")==0) {
  375.             ok=0;
  376.             s1[0]=0;
  377.           }
  378.           i2=0;
  379.           for (i1=0; i1<strlen(s1); i1++)
  380.             if ((s1[i1]=='|') || (s1[i1]=='>') || (s1[i1]=='<') || (s1[i1]==';') || (s1[i1]==' '))
  381.               i2=1;
  382.           if (i2)
  383.             s1[0]=0;
  384.           if (s1[0]) {
  385.             if (strchr(s1,'.')==NULL)
  386.               strcat(s1,".*");
  387.             get_arc_cmd(s3,s4,1,stripfn(s1));
  388.             cd_to(syscfg.tempdir);
  389.             if (!okfn(s1))
  390.               s3[0]=0;
  391.             if (s3[0]) {
  392.               do_external(s3,0);
  393.               sprintf(s2,"Extracted out %s from %s",s1,u.filename);
  394.             } else
  395.               s2[0]=0;
  396.             cd_to(cdir);
  397.             if (s2[0])
  398.               sysoplog(s2);
  399.           }
  400.         } while ((!hangup) && (ok) && (ok1));
  401.       }
  402.     } else
  403.       if (s1[0]) {
  404.         nl();
  405.         pl("That file currently isn't there.");
  406.         nl();
  407.       }
  408.     if (ok)
  409.       i=nrecno(s,i);
  410.   }
  411.   closedl();
  412. }
  413.  
  414. void list_temp_text()
  415. {
  416.   int i,i1,f1,ok,sent;
  417.   char s[81],s1[81];
  418.   struct ffblk ff;
  419.   uploadsrec u;
  420.   double percent;
  421.  
  422.   nl();
  423.   prt(1,"List what file(s)3 ? ");
  424.   input(s,12);
  425.   if (!okfn(s))
  426.     return;
  427.   if (s[0]) {
  428.     if (strchr(s,'.')==NULL)
  429.       strcat(s,".*");
  430.     sprintf(s1,"%s%s",syscfg.tempdir,stripfn(s));
  431.     f1=findfirst(s1,&ff,0);
  432.     ok=1;
  433.     nl();
  434.     while ((f1==0) && (ok)) {
  435.       sprintf(s,"%s%s",syscfg.tempdir,ff.ff_name);
  436.       nl();
  437.       npr("1Listing %s3:\r\n",ff.ff_name);
  438.       nl();
  439.       ascii_send(s,&sent,&percent);
  440.       if (sent) {
  441.         sprintf(s,"Temp text D/L '%s'",ff.ff_name);
  442.         sysoplog(s);
  443.       } else {
  444.         sprintf(s,"Temp Tried text D/L '%s' %3.2f%%",ff.ff_name,percent*100.0);
  445.         sysoplog(s);
  446.         ok=0;
  447.       }
  448.       f1=findnext(&ff);
  449.     }
  450.   }
  451. }
  452.  
  453.  
  454. void list_temp_arc()
  455. {
  456.   char s1[81],s2[81];
  457.  
  458.   sprintf(s1,"TEMP.%s",syscfg.arcs[ARC_NUMBER].extension);
  459.   list_arc_out(s1,syscfg.tempdir);
  460.   nl();
  461. }
  462.  
  463.  
  464.  
  465.  
  466. void temporary_stuff()
  467. {
  468.   char s[81],s1[81],ch;
  469.   int done;
  470.  
  471.   done=0;
  472.   do {
  473.     nl();
  474.     prt(1,"Archive3: 5Q1,5D1,5R1,5A1,5V1,5L1,5T3: ");
  475.     ch=onek("Q?DRAVLT");
  476.     switch(ch) {
  477.       case 'Q':
  478.     done=1;
  479.     break;
  480.       case 'D':
  481.     download_temp_arc();
  482.     break;
  483.       case 'V':
  484.     list_temp_arc();
  485.     break;
  486.       case 'A':
  487.         add_temp_arc();
  488.     break;
  489.       case 'R':
  490.     del_temp();
  491.     break;
  492.       case 'L':
  493.     list_temp_dir();
  494.     break;
  495.       case 'T':
  496.     list_temp_text();
  497.     break;
  498.       case '?':
  499.     printmenu(14);
  500.     break;
  501.     }
  502.   } while ((!hangup) && (!done));
  503. }
  504.  
  505.  
  506.  
  507.