home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / OSKBox.lzh / MAILBOX / CC / reverse.c < prev    next >
C/C++ Source or Header  |  1993-04-25  |  7KB  |  364 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <direct.h>
  4. #include <setjmp.h>
  5. #include <signal.h>
  6. #include <dir.h>
  7. #include <errno.h>
  8. #include "mailbox.h"
  9.  
  10. #define MAXCALLS 3500        /* maximum number of calls to be forwarded */
  11. #define TIMEOUT (5 * 60)    /* maximum # of seconds to wait for response */
  12. #define MAXTIME (20 * 60)    /* maximum # of seconds to forward */
  13.  
  14. struct userstruct user;
  15. char fwdcalls[MAXCALLS][7];
  16. int call_count = 0;
  17. jmp_buf disconnected;
  18. int start_fwd, sec;
  19. char *fwdfile;
  20. int fwdsize;
  21. int cmpcall();
  22. int tnc_in = 0, tnc_out = 1;
  23. int mid_flag, bid_flag, hflag;
  24. extern struct dist_list *distboxes;
  25.  
  26. main (argc, argv)
  27. char *argv[];
  28. {
  29.     int i;
  30.  
  31.     chdir (HOME);
  32.     if (argc < 4) {
  33.         printf ("Insufficient arguments.\n");
  34.         exit (0);
  35.         }
  36.     strcpy (user.uscall, "RVRSFW");
  37.     user.usopt = ISSUPER;
  38.     mid_flag = atoi (argv[2]);
  39.     bid_flag = atoi (argv[3]);
  40.     hflag = atoi (argv[4]);
  41.     upper (argv[1]);
  42.     get_ssid (argv[1]);
  43.     read_dist_list ();
  44.     read_fwd_files (argv[1]);
  45.     open_mail ();
  46.     forward (argv[1], fwdfile, fwdsize);
  47.     close_mail ();
  48.     }
  49.  
  50. find_call (target)
  51. char *target;
  52. {
  53.     int i, p1, p2, comp;
  54.  
  55.     p1 = 0;  p2 = call_count-1;
  56. /* printf ("find_call (%s)\n", target); */
  57.     while (p1 <= p2) {
  58.         i = p1 + ((p2 - p1) >> 1);
  59.         comp = cmpcall (target, fwdcalls[i]);
  60. /* printf ("  %d %d %d %s %d\n", p1, i, p2, fwdcalls[i], comp); */
  61.         if (comp < 0)
  62.             p2 = i-1;
  63.         else if (comp > 0)
  64.             p1 = i+1;
  65.         else
  66.             break;
  67.         }
  68.     if (comp != 0) {
  69.         return -1;
  70.         }
  71.     while (i > 0 && cmpcall (target, fwdcalls[i-1]) == 0)
  72.         i--;
  73.     return (i);
  74.     }
  75.  
  76. test (head, mbox)
  77. struct msg_header *head;
  78. char *mbox;
  79. {
  80.     int i;
  81.     char *target, bbs[7];
  82.     struct dist_list *dp;
  83.  
  84.     scanaddr (head->mhbbs, bbs, 7);
  85.     target = (*(head->mhbbs)) ? bbs : head->mhto;
  86.     if ((i = find_call (target)) != -1)
  87.         for ( ; i < call_count && cmpcall (target, fwdcalls[i]) == 0; i++)
  88.             if (_cmpnam (target, fwdcalls[i], strlen (fwdcalls[i])) == 0)
  89.                 goto found;
  90.     if (!bulletin (head) && *(head->mhbbs)) {
  91.         char *p, hfield[7];
  92.         int len;
  93.         p = head->mhbbs + scanaddr (head->mhbbs, hfield, 7);
  94.         while (len = scanaddr (p, hfield, 7)) {
  95. #ifdef DEBUG
  96. printf ("  hfield '%s'\n", hfield);
  97. #endif
  98.             p += len;
  99.             if ((i = find_call (hfield)) != -1) {
  100.                 for (dp = distboxes; dp; dp = dp->dlnext)
  101.                     if (strcmp (hfield, dp->dlname) == 0) break;
  102.                 if (dp) continue;
  103.                 for ( ; i < call_count && cmpcall (hfield, fwdcalls[i]) == 0; i++)
  104.                     if (_cmpnam (hfield, fwdcalls[i], strlen (fwdcalls[i])) == 0)
  105.                         goto found;
  106.                 }
  107.             }
  108.         }
  109.     return 0;
  110. found:
  111.     for (dp = distboxes; dp; dp = dp->dlnext)
  112.         if (strcmp (bbs, dp->dlname) == 0) break;
  113.     if (dp) {
  114.         char w[10];
  115.  
  116.         strcpy (w, mbox);
  117.         upper (w);
  118.         get_ssid (w);
  119.         for (i = 0; i < dp->dlcount; i++)
  120.             if (strcmp (w, dp->dlbbs[i]) == 0) break;
  121.         if ((1 << i) & head->mhdist)
  122.             return 0;
  123.         }
  124.     return 1;
  125.     }
  126.  
  127. forward (mbox, file, size)
  128. char *mbox, *file;
  129. {
  130.     struct msg_header *head;
  131.     int flag;
  132.     
  133.     read_fwd_file (mbox, file, size);
  134.     flag = 0;
  135.     reset_mail ();
  136.     while ((head = next_mail (is_nforwarded, 0)) != NULL)
  137.         if (test (head, mbox)) {
  138.             flag = 1;
  139.             break;
  140.             }
  141.     if (!flag) return 0;
  142.     reset_mail ();
  143.     while ((head = next_mail (is_nforwarded, 0)) != NULL) {
  144.         if (test (head, mbox))
  145.             send_msg (head, mbox);
  146.         }
  147.     }
  148.  
  149. send_msg (head, mbox)
  150. struct msg_header *head;
  151. char *mbox;
  152. {
  153.     char str[256], name[32], *p;
  154.     int f, len;
  155.     char *maildir = "MAIL/";
  156.     int time, date, tick;
  157.     short day;
  158.     struct fildes buffer;
  159.     struct dist_list *dp;
  160.     char bbs[7];
  161.     
  162.     if ((f = open_msg (head)) < 0)
  163.         return 0;
  164.     p = str;
  165.     p += sprintf (p, "S%c %s", head->mhtype, head->mhto);
  166.     scanaddr (head->mhbbs, bbs, 7);
  167.     if (*(head->mhbbs)) 
  168.         if (hflag)
  169.             p+= sprintf (p, " @ %s", head->mhbbs);
  170.         else
  171.             p+= sprintf (p, " @ %s", bbs);
  172.     p += sprintf (p, " < %s", head->mhfrom);
  173.     if (*(head->mhbid) && bid_flag && head->mhtype != 'T')
  174.         p += sprintf (p, " $%s", head->mhbid);
  175.     printf ("%s\n", str);
  176.     get_line (str);
  177.     p = str + scanword (str, name, 32);
  178.     if (strcmp (name, "OK") != 0) {
  179.         log ("r %d %s %s", head->mhnr, mbox, p);
  180.         get_prompt ();
  181.         goto sent;
  182.         }
  183.     printf ("%s\n", head->mhtit);
  184.     ztime (&head->mhtime, &head->mhdate, &day);
  185.     printf ("R:%02d%02d%02d/%02d%02dz @:%s.%s %s #:%d Z:%s\n",
  186.         (head->mhdate >> 16) % 100,
  187.         (head->mhdate >> 8) & 0xff,
  188.         head->mhdate & 0xff,
  189.         (head->mhtime >> 16) & 0xff,
  190.         (head->mhtime >> 8) & 0xff,
  191.         MYCALL, MYHADDR, MYQTH,
  192.         head->mhnr,
  193.         MYZIP);
  194.     while ((len = readln (f, str, 256)) > 0)
  195.         writeln (tnc_out, str, len);
  196.     close (f);
  197.     printf ("\032\n");
  198.     get_prompt ();
  199.     log ("f %d %s", head->mhnr, mbox);
  200.  
  201. sent:
  202.     if (!checkoff (head, mbox))
  203.         if (bulletin (head))
  204.             head->mhstat = 'F';
  205.         else
  206.             head->mhstat = 'X';
  207.     update_mail ();
  208.     return 1;
  209.     }
  210.  
  211. get_prompt ()
  212. {
  213.     char str[256];
  214.  
  215.     while (1) {
  216.         get_line (str);
  217.         if (str[strlen (str) - 1] == '>')
  218.             return;
  219.         }
  220.     }
  221.  
  222. get_line (str)
  223. char *str;
  224. {
  225.     int len;
  226.     int time = 0;
  227.  
  228.     time = tick ();
  229.     while (1) {
  230.         if (_gs_eof (tnc_in) == 1)
  231.             exit (0);
  232.         if (_gs_rdy (tnc_in) > 0)
  233.             break;
  234.         sleep (3);
  235.         if ((tick() - time) / sec > TIMEOUT)
  236.             exit (0);
  237.         }
  238.     read_path (tnc_in, str, 80);
  239.     }
  240.  
  241. write_path (path, str)
  242. char *str;
  243. {
  244.     write (path, str, strlen (str));
  245.     }
  246.  
  247. read_path (path, str, len)
  248. char *str;
  249. {
  250.     int i;
  251.     i = readln (path, str, len);
  252.     if (i)
  253.         str[i-1] = '\0';
  254.     return i;
  255.     }
  256.  
  257. read_fwd_file (mbox, file, size)
  258. char *mbox, *file;
  259. {
  260.     char str[80], w[7], *p, *p2;
  261.     int i, f, len;
  262.  
  263.     call_count = 0;
  264.     strcpy (str, mbox);
  265.     get_ssid (str);
  266.     strcpy (fwdcalls[call_count++], str);
  267.     for (p2 = file; p2 < file + size; p2 += strlen (p2) + 1) {
  268.         strcpy (str, p2);
  269.         p = str + scanword (str, w, 7);
  270.         if (strcmp (w, "VIA") == 0) {
  271.             continue;
  272.             }
  273.         else if (*w && *w != '@' && *w != ';') {
  274.             get_ssid (w);
  275.             if (call_count < MAXCALLS)
  276.                 strcpy (fwdcalls[call_count++], w);
  277.             }
  278.         }
  279.     qsort (fwdcalls, call_count, 7, cmpcall);
  280.     }
  281.  
  282.  
  283. read_fwd_files (call)
  284. char *call;
  285. {
  286.     DIR *dirptr;
  287.     struct direct *entry;
  288.     char str[80], w[7], *p;
  289.     int i, f, len;
  290.  
  291.     if ((dirptr = opendir (FWDIR)) == NULL)
  292.         exit (_errmsg (0, "Error %d opening mailbox directory.\n", errno));
  293.     sprintf (str, "%s*.fwd", call);
  294.     while (entry = readdir (dirptr)) {
  295.         if (_cmpnam (entry->d_name, str, strlen (str)) == 0) break;
  296.         }
  297.     closedir (dirptr);
  298.     if (entry == NULL)
  299.         exit (_errmsg (0, "No matching .fwd file found.\n"));
  300.     fwdfile = (char *)malloc (1);
  301.     fwdsize = read_file (entry->d_name, &fwdfile, 0);
  302.     return (1);
  303.     }
  304.  
  305. read_file (name, pptr, size)
  306. char *name, **pptr;
  307. {
  308.     int f, fsize, tsize;
  309.     char *fptr, *p, line[80];
  310.     
  311.     if (*name == '/')
  312.         strcpy (line, name);
  313.     else
  314.         sprintf (line, "%s/%s", FWDIR, name);
  315.     if ((f = open (line, 1)) < 0)
  316.         return (size);
  317.     fsize = _gs_size (f);
  318.     fptr = (char *)malloc (size + fsize);
  319.     if (size) movmem (*pptr, fptr, size);
  320.     read (f, fptr + size, fsize);
  321.     close (f);
  322.     for (p = fptr + size; p - fptr < size + fsize; p++) {
  323.         *p = toupper (*p);
  324.         if (*p == '\n')
  325.             *p = '\0';
  326.         }
  327.     free (*pptr);
  328.     *pptr = fptr;
  329.     tsize = size + fsize;
  330.     for (p = fptr + size; p - fptr < size + fsize; p += strlen (p) + 1) {
  331.         if (*p == '@') {
  332.             strcpy (line, p+1);
  333.             tsize = read_file (line, pptr, tsize);
  334.             p = *pptr + (p - fptr);
  335.             fptr = *pptr;
  336.             }
  337.         }
  338.     return (tsize);
  339.     }
  340.     
  341. tick ()
  342. {
  343.     int time, date, i_tick;
  344.     short day;
  345.  
  346.     _sysdate (3, &time, &date, &day, &i_tick);
  347.     sec = i_tick >> 16;
  348.     return (time * sec + (i_tick & 0xFFFF));
  349.     }
  350.  
  351. cmpcall (c1, c2)
  352. register char *c1, *c2;
  353. {
  354.     while (*c1 == *c2) {
  355.         if (*c1 == '\0') return 0;
  356.         c1++;
  357.         c2++;
  358.         }
  359.     if (*c1 == '?' || *c1 == '*' || *c2 == '?' || *c2 == '*')
  360.         return 0;
  361.     else
  362.         return (*c1 - *c2);
  363.     }
  364.