home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / PPPBCKP / SRC15B23.ZIP / UUMAIN.C < prev    next >
C/C++ Source or Header  |  1997-03-30  |  11KB  |  378 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <dir.h>
  5. #include <dos.h>
  6. #include <share.h>
  7. #include <sys\stat.h>
  8. #include <alloc.h>
  9. #include <io.h>
  10. #include <fcntl.h>
  11. #include <time.h>
  12. #include "uu.h"
  13. #include "net.h"
  14.  
  15. unsigned _stklen = 16384;
  16.  
  17. #define MAX_BUF 1024
  18.  
  19. #define LAST(s) s[strlen(s)-1]
  20.  
  21. char buf[MAX_BUF];
  22.  
  23. scanfor(char *token, FILE * in)
  24. {
  25.   long pos;
  26.  
  27.   pos = ftell(in);
  28.   while (fgets(buf, MAX_BUF, in) && strncmpi(buf, token, strlen(token))) {
  29.     pos = ftell(in);
  30.   }
  31.   rewind(in);
  32.   fseek(in, pos, 0);
  33.   pos = ftell(in);
  34.   return (!strncmpi(buf, "begin ", 6));
  35. }
  36.  
  37. scanfornet(FILE * in, char *net_name)
  38. {
  39.   char *ss;
  40.   int found = 0;
  41.  
  42.   while ((fgets(buf, MAX_BUF, in)) && !found) {
  43.     if (strncmpi(buf, "subject:", strlen("subject:"))) {
  44.       ss = strtok(buf, " ");
  45.       ss = strtok(NULL, " ");
  46.       if (ss[0] == '@') {
  47.         found = 1;
  48.         strcpy(net_name, ss);
  49.       }
  50.     }
  51.   }
  52.   rewind(in);
  53.   return found;
  54. }
  55.  
  56. void cd_to(char *s)
  57. {
  58.   char s1[81];
  59.   int i, db;
  60.  
  61.   strcpy(s1, s);
  62.   i = strlen(s1) - 1;
  63.   db = (s1[i] == '\\');
  64.   if (i == 0)
  65.     db = 0;
  66.   if ((i == 2) && (s1[1] == ':'))
  67.     db = 0;
  68.   if (db)
  69.     s1[i] = 0;
  70.   chdir(s1);
  71.   if (s[1] == ':') {
  72.     setdisk(s[0] - 'A');
  73.     if (s[2] == 0)
  74.       chdir("\\");
  75.   }
  76. }
  77.  
  78. void get_dir(char *s, int be)
  79. {
  80.   strcpy(s, "X:\\");
  81.   s[0] = 'A' + getdisk();
  82.   getcurdir(0, &(s[3]));
  83.   if (be) {
  84.     if (s[strlen(s) - 1] != '\\')
  85.       strcat(s, "\\");
  86.   }
  87. }
  88.  
  89. int exist(char *s)
  90. {
  91.   int i;
  92.   struct ffblk ff;
  93.  
  94.   i = findfirst(s, &ff, FA_HIDDEN);
  95.   if (i)
  96.     return (0);
  97.   else
  98.     return (1);
  99. }
  100.  
  101. int copyfile(char *input, char *output)
  102. {
  103.   int f1, f2, i;
  104.   char *b, s[181], s1[21], s2[81], s3[81];
  105.   struct ftime ft;
  106.  
  107.   if ((strcmp(input, output) != 0) && (exist(input))) {
  108.     if (exist(output)) {
  109.       fnsplit(output, s3, s2, s1, NULL);
  110.       i = 0;
  111.       sprintf(s, "%s%s%s.%03d", s3, s2, s1, i);
  112.       while (exist(s))
  113.         sprintf(s, "%s%s%s.%03d", s3, s2, s1, ++i);
  114.       strcpy(output, s);
  115.     }
  116.     fprintf(stderr, "\n ■ Creating File   : %s", output);
  117.     if ((b = (char *) farmalloc(16400)) == NULL)
  118.       return 0;
  119.     f1 = open(input, O_RDONLY | O_BINARY, S_IREAD | S_IWRITE);
  120.     if (!f1) {
  121.       farfree(b);
  122.       return 0;
  123.     }
  124.     getftime(f1, &ft);
  125.     f2 = open(output, O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  126.     if (!f2) {
  127.       farfree(b);
  128.       close(f1);
  129.       return 0;
  130.     }
  131.     i = read(f1, (void *) b, 16384);
  132.     while (i > 0) {
  133.       write(f2, (void *) b, i);
  134.       i = read(f1, (void *) b, 16384);
  135.     }
  136.     f1 = close(f1);
  137.     setftime(f2, &ft);
  138.     f2 = close(f2);
  139.     farfree(b);
  140.   }
  141.   return 1;
  142. }
  143.  
  144. char *stripfn(char *fn)
  145. {
  146.   static char ofn[15];
  147.   int i, i1;
  148.   char s[81];
  149.  
  150.   i1 = -1;
  151.   for (i = 0; i < strlen(fn); i++)
  152.     if ((fn[i] == '\\') || (fn[i] == ':') || (fn[i] == '/'))
  153.       i1 = i;
  154.   if (i1 != -1)
  155.     strcpy(s, &(fn[i1 + 1]));
  156.   else
  157.     strcpy(s, fn);
  158.   for (i = 0; i < strlen(s); i++)
  159.     if ((s[i] >= 'A') && (s[i] <= 'Z'))
  160.       s[i] = s[i] - 'A' + 'a';
  161.   i = 0;
  162.   while (s[i] != 0) {
  163.     if (s[i] == 32)
  164.       strcpy(&s[i], &s[i + 1]);
  165.     else
  166.       ++i;
  167.   }
  168.   strcpy(ofn, s);
  169.   return (ofn);
  170. }
  171.  
  172. void ssm(char *fpath, char *ssmsend)
  173. {
  174.   int i, f;
  175.   char s1[161];
  176.   net_header_rec nh;
  177.  
  178.   nh.tosys = 0;
  179.   nh.touser = 1;
  180.   nh.fromsys = 32767;
  181.   nh.fromuser = 1;
  182.   nh.main_type = main_type_ssm;
  183.   nh.minor_type = 0;
  184.   nh.list_len = 0;
  185.   time((long *) &nh.daten);
  186.   if (strlen(ssmsend) > 80)
  187.     ssmsend[80] = 0;
  188.   nh.length = strlen(ssmsend);
  189.   nh.method = 0;
  190.   i = 0;
  191.   sprintf(s1, "%sP1-SSM%d.NET", fpath, i);
  192.   while (exist(s1))
  193.     sprintf(s1, "%sP1-SSM%d.NET", fpath, ++i);
  194.   f = open(s1, O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  195.   lseek(f, 0L, SEEK_END);
  196.   write(f, (void *) &nh, sizeof(net_header_rec));
  197.   write(f, (void *) ssmsend, nh.length);
  198.   close(f);
  199. }
  200.  
  201. main(int argc, char *argv[])
  202. {
  203.   FILE *out = NULL, *in = NULL;
  204.   char outname[181], net_name[21];
  205.   char cur_dir[181], temp_dir[181], s1[181], s2[181], s3[21], s4[21], s5[21];
  206.   int i;
  207.  
  208.   if (argc == 4 || argc == 5) {
  209.     if (strcmpi(argv[1], "-encode") == 0 && argc == 4) {
  210.       if (((in = fopen(argv[2], "r")) != NULL) && ((out = fopen(argv[3], "at+")) != NULL)) {
  211.         fprintf(stderr, " %ld bytes.", uuencode(in, out, argv[2]));
  212.         if (in)
  213.           fclose(in);
  214.         if (out)
  215.           fclose(out);
  216.         exit(EXIT_SUCCESS);
  217.       } else {
  218.         exit(EXIT_FAILURE);
  219.       }
  220.     } else
  221.       if (strcmpi(argv[1], "-decode") == 0 && argc == 5) {
  222.       get_dir(cur_dir, 1);
  223.       strcpy(temp_dir, argv[3]);
  224.       if (LAST(temp_dir) == '\\')
  225.         LAST(temp_dir) = 0;
  226.       cd_to(temp_dir);
  227.       if ((in = fopen(argv[2], "r")) != NULL) {
  228.         if (!scanfornet(in, net_name))
  229.           net_name[0] = 0;
  230.         rewind(in);
  231.         scanfor("begin", in);
  232.         switch (uudecode(in, argv[3], outname)) {
  233.           case UU_NO_MEM:
  234.             fprintf(stderr, "\n ■ Insufficient memory to decode... moved to CHECKNET.");
  235.             sprintf(s1, "Out of memory decoding %s - moved to CHECKNET!", argv[2]);
  236.             ssm(s1, argv[4]);
  237.             sprintf(s1, "%s\\%s", temp_dir, argv[2]);
  238.             sprintf(s2, "%sCHECKNET\\%s", argv[4], argv[2]);
  239.             if (copyfile(s1, s2))
  240.               unlink(s1);
  241.             cd_to(cur_dir);
  242.             if (in)
  243.               fclose(in);
  244.             exit(EXIT_FAILURE);
  245.           case UU_BAD_BEGIN:
  246.             fprintf(stderr, "\n ■ Appears to be a standard message... moving to SPOOL");
  247.             sprintf(s1, "%s\\%s", temp_dir, argv[2]);
  248.             while (LAST(argv[2]) != '.')
  249.               LAST(argv[2]) = 0;
  250.             strcat(argv[2], "MSG");
  251.             sprintf(s2, "%sSPOOL\\%s", argv[4], argv[2]);
  252.             if (copyfile(s1, s2))
  253.               unlink(s1);
  254.             cd_to(cur_dir);
  255.             if (in)
  256.               fclose(in);
  257.             exit(EXIT_FAILURE);
  258.           case UU_CANT_OPEN:
  259.             fprintf(stderr, "\n ■ Cannot open %s%s", argv[4], outname);
  260.             cd_to(cur_dir);
  261.             if (in)
  262.               fclose(in);
  263.             exit(EXIT_FAILURE);
  264.           case UU_CHECKSUM:
  265.             fprintf(stderr, "\n ■ Bad checksum... moving packet to CHECKNET");
  266.             sprintf(s1, "Bad checksum decoding %s - moved to CHECKNET!", argv[2]);
  267.             ssm(s1, argv[4]);
  268.             sprintf(s1, "%s\\%s", temp_dir, argv[2]);
  269.             while (LAST(argv[2]) != '.')
  270.               LAST(argv[2]) = 0;
  271.             strcat(argv[2], "MSG");
  272.             sprintf(s2, "%sCHECKNET\\%s", argv[4], argv[2]);
  273.             if (copyfile(s1, s2))
  274.               unlink(s1);
  275.             cd_to(cur_dir);
  276.             if (in)
  277.               fclose(in);
  278.             exit(EXIT_FAILURE);
  279.           case UU_BAD_END:
  280.             fprintf(stderr, "\n ■ \'end\' not found in message... moving to CHECKNET");
  281.             sprintf(s1, "No \'end\' found in %s - moved to CHECKNET!", argv[2]);
  282.             ssm(s1, argv[4]);
  283.             sprintf(s1, "%s\\%s", temp_dir, argv[2]);
  284.             while (LAST(argv[2]) != '.')
  285.               LAST(argv[2]) = 0;
  286.             strcat(argv[2], "MSG");
  287.             sprintf(s2, "%sCHECKNET\\%s", argv[4], argv[2]);
  288.             if (copyfile(s1, s2))
  289.               unlink(s1);
  290.             cd_to(cur_dir);
  291.             if (in)
  292.               fclose(in);
  293.             exit(EXIT_FAILURE);
  294.           case UU_SUCCESS:
  295.             fprintf(stderr, "\n ■ Successfully decoded %s", stripfn(outname));
  296.             fnsplit(outname, NULL, NULL, s4, s3);
  297.             sprintf(s5, "%s%s", s4, s3);
  298.             if (strcmpi(s3, ".NET") == NULL) {
  299.               unlink(argv[2]);
  300.               i = 0;
  301.               sprintf(s2, "%sP1-%03d.NET", argv[4], i);
  302.               while (exist(s2))
  303.                 sprintf(s2, "%sP1-%03d.NET", argv[4], ++i);
  304.               sprintf(s1, "%s\\%s", temp_dir, stripfn(outname));
  305.               if (!copyfile(s1, s2)) {
  306.                 fprintf(stderr, "\n ■ Error creating %s", s2);
  307.                 cd_to(cur_dir);
  308.                 if (in)
  309.                   fclose(in);
  310.                 exit(EXIT_FAILURE);
  311.               } else
  312.                 unlink(s1);
  313.             } else {
  314.               sprintf(s1, "%s\\%s", temp_dir, stripfn(outname));
  315.               sprintf(s2, "%sCHECKNET\\%s", argv[4], stripfn(outname));
  316.               if (exist(s2)) {
  317.                 s2[strlen(s2 - 1)] = 0;
  318.                 i = 0;
  319.                 sprintf(s2, "%sCHECKNET\\%s%d", argv[4], stripfn(outname), i);
  320.                 while (exist(s2)) {
  321.                   sprintf(s2, "%sCHECKNET\\%s%d", argv[4], stripfn(outname), ++i);
  322.                   if (i > 9)
  323.                     break;
  324.                 }
  325.               }
  326.               if (!copyfile(s1, s2)) {
  327.                 fprintf(stderr, "\n ■ Error creating %s", s2);
  328.                 cd_to(cur_dir);
  329.                 if (in)
  330.                   fclose(in);
  331.                 exit(EXIT_FAILURE);
  332.               }
  333.               sprintf(s1, "%s\\%s", temp_dir, argv[2]);
  334.               while (LAST(argv[2]) != '.')
  335.                 LAST(argv[2]) = 0;
  336.               strcat(argv[2], "MSG");
  337.               sprintf(s2, "%sCHECKNET\\%s", argv[4], argv[2]);
  338.               if (copyfile(s1, s2)) {
  339.                 unlink(s1);
  340.                 sprintf(s1, "Received file : %s!", s2);
  341.                 ssm(s1, argv[4]);
  342.               }
  343.             }
  344.             cd_to(cur_dir);
  345.             if (in)
  346.               fclose(in);
  347.             exit(EXIT_SUCCESS);
  348.           default:
  349.             fprintf(stderr, "\n ■ Unknown error... moving packet to CHECKNET");
  350.             sprintf(s1, "Unknown error processing %s - moved to CHECKNET!", argv[2]);
  351.             ssm(s1, argv[4]);
  352.             sprintf(s1, "%s\\%s", temp_dir, argv[2]);
  353.             while (LAST(argv[2]) != '.')
  354.               LAST(argv[2]) = 0;
  355.             strcat(argv[2], "MSG");
  356.             sprintf(s2, "%sCHECKNET\\%s", argv[4], argv[2]);
  357.             if (copyfile(s1, s2))
  358.               unlink(s1);
  359.             cd_to(cur_dir);
  360.             if (in)
  361.               fclose(in);
  362.             exit(EXIT_FAILURE);
  363.         }
  364.       } else {
  365.         cd_to(cur_dir);
  366.         fprintf(stderr, "\n ■ Input file %s not found.", argv[2]);
  367.         if (in)
  368.           fclose(in);
  369.         exit(EXIT_FAILURE);
  370.       }
  371.       }
  372.   }
  373.   if (in)
  374.     fclose(in);
  375.   exit(EXIT_SUCCESS);
  376.   return 0;
  377. }
  378.