home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / ios_src / scanmail.c < prev    next >
C/C++ Source or Header  |  1993-01-31  |  21KB  |  963 lines

  1. /*********************************************************************
  2.  
  3.                     IOS - messagebase scanner
  4.                     
  5.     Program : IOSmail
  6.     Source  : free
  7.     Author  : Rinaldo Visscher
  8.     Date    : 1991
  9.     
  10.     Scan messagebase on new entered messages. Scan privatemailbox for
  11.     new entered messages. If new message found, create packets, if on,
  12.     and send those to the connected people.
  13.     
  14. *********************************************************************/
  15. /*#define TESTCASE 1*/
  16.  
  17. #include        <stdio.h>
  18. #include        <stdlib.h>
  19. #include        <ext.h>
  20. #include         <string.h>
  21. #include        <time.h>
  22. #include        <tos.h>
  23. #include        <vdi.h>
  24.  
  25. #include        "portab.h"
  26. #include        "defs.h"
  27. #include        "ioslib.h"
  28. #include        "routing.h"
  29. #include        "inmail.h"
  30. #include        "strutil.h"
  31. #include        "lang.h"
  32.  
  33. #include        "vars.h"
  34.  
  35. #define        MAX_ORGLINES    65
  36.  
  37. MLOCAL VOID have_message(WORD area)
  38. {
  39.     WORD    i, j, a, r, l = 0, rnd = 0, lcount;
  40.     BYTE    *msgbuf, *q, *p,
  41.             *outmsg,
  42.             origin[100], tear[100],
  43.             orgline[MAX_ORGLINES] [128],
  44.             havetear = 0, haveorg = 0, orgrnd,
  45.             was_private = 0, pnt[10],
  46.             is_our_message = TRUE,
  47.             use_domain[40],
  48.             buffer[250],
  49.             *Odomain;
  50.     UWORD    ournode,
  51.             zone, net, node, point,
  52.             pzone[N_SEENS], pnet[N_SEENS], pnode[N_SEENS], ppoint[N_SEENS],
  53.             TO_AREA;
  54.     LONG    file_watch;
  55.     
  56.     msgbuf = (BYTE *) myalloc(MAXMSGLENGTH);
  57.     outmsg = (BYTE *) myalloc(MAXMSGLENGTH);
  58.     
  59.     lcount = 0;
  60.     
  61.     *outmsg = EOS;
  62. /*    
  63.     msgread(msgbuf, hdr.size, FMSG);
  64. */
  65.     Fread(fileno(FMSG), hdr.size, msgbuf);
  66.     
  67.     fclose(FMSG);
  68.     
  69.     /*
  70.     **    Create an clear msgheader.
  71.     */
  72.     
  73.     hdr.flags &= ~SENT;
  74.     
  75.     Fzone = Fnet = Fnode = Fpoint = Tzone = Tnet = Tnode = Tpoint = 0;
  76.     
  77.     if (area == -1)
  78.     {
  79.         area = to_area(msgbuf);
  80.         
  81.         if (area == -1)
  82.         {
  83.             free(msgbuf);
  84.             free(outmsg);
  85.             return;
  86.         }
  87.         
  88.         was_private++;
  89.     }
  90.     
  91.     nseenby = npath = 0;
  92.     
  93.     /*
  94.     **    This message is written in the privatearea
  95.     **    for the netmail. Create an message.
  96.     */
  97.     
  98.     if (area == -2)
  99.     {
  100.         hdr.mailer[7] = 0;
  101.         
  102.         /*
  103.         **    If message is in multizone, and written in an other
  104.         **    zone, compare the zonenumbers. If found, change into
  105.         **    that zone alias.
  106.         */
  107.         
  108.         if (hdr.Ozone != hdr.Dzone)
  109.             for (i=0; i < nalias; i++)
  110.                 if(alias[i].zone == hdr.Dzone)
  111.                 {
  112.                     hdr.Ozone = alias[i].zone;
  113.                     hdr.Onet  = alias[i].net;
  114.                     hdr.Onode = alias[i].node;
  115.                     hdr.Opoint= alias[i].point;
  116.                     Odomain = alias[i].Domain;
  117.                     ournode = i;
  118.                     break;
  119.                 }
  120.         
  121. #if defined EXTERNDEBUG
  122.     if (debugflag)
  123.         log_line(6,">Netmail Msg using address %u:%u/%u.%u",
  124.             hdr.Ozone, hdr.Onet, hdr.Onode, hdr.Opoint);
  125. #endif
  126.         
  127.         /*
  128.         **    Remove some lines. Add our own if necessary.
  129.         */
  130.         
  131.         msgbuf = strip_line(msgbuf, "\03AREA [");
  132.  
  133.         if (dostripPID)
  134.             msgbuf = strip_line(msgbuf, "\01PID:");
  135.         else
  136.             msgbuf = Remove_and_Add("\01PID: ", msgbuf);
  137.         
  138.         /*
  139.         **    Change MSGID.
  140.         */
  141.         
  142.         if (get_msgid(msgbuf, &zone, &net, &node, &point) &&
  143.             zone != hdr.Ozone &&
  144.             net != hdr.Onet &&
  145.             node != hdr.Onode) msgbuf = change_msgid(msgbuf, &hdr);
  146.         
  147.         if (!doniceout && !doquit) {
  148.              gprintf("%-20.20s > %-20.20s %s.\n", hdr.from, hdr.to,
  149.                 (hdr.flags & CRASH) ? "Crashmail" : "Netmail");
  150.         }
  151.         else
  152.             log_line(3,"*%-15.15s > %-15.15s %s %s", hdr.from, hdr.to,
  153.                 (hdr.flags & CRASH) ? "Crashmail" : "Netmail",
  154.                 (area >= 0) ? Areaname[area] : "MAIL");
  155.         
  156.         hdr.flags |= MSGLOCAL;
  157.         
  158.         strcpy(&outmsg[strlen(outmsg)], msgbuf);
  159.         
  160.         time(&secs);
  161.         tijd = localtime(&secs);
  162.         strftime(tm_now, 39, "%b %d %Y at %H:%M", tijd);
  163.         
  164.         /*
  165.         **    Add Via line.
  166.         */
  167.         /*
  168.         sprintf(&outmsg[strlen(outmsg)], "\n\01Via %s %u:%u/%u.%u, %s",
  169.             OutMail, hdr.Ozone, hdr.Onet, hdr.Onode, hdr.Opoint, tm_now);
  170.         */
  171.         
  172.         savemsg(TONETMAIL, &hdr, 0, outmsg, 0, 0, 0, 0);
  173.         
  174.         hdr.mailer[7] |= SCANNED;
  175.         
  176.         free(msgbuf);
  177.         free(outmsg);
  178.         
  179.         return;
  180.     }
  181.     
  182.     /*--------------------------------------------------*/
  183.     /*    Normal echomail messages.                        */
  184.     /*--------------------------------------------------*/
  185.  
  186. /*    
  187. **    Routine herschreven t.b.v. domains.
  188.  
  189.     for (i=0; i < nalias; i++)
  190.     {
  191.         if (alias[i].zone == Tozone[area][0])
  192.         {
  193.             zone = alias[i].zone;
  194.             net = alias[i].net;
  195.             node = alias[i].node;
  196.             point = alias[i].point;
  197.             Odomain = alias[i].Domain;
  198.             
  199. #if defined EXTERNDEBUG
  200.             if (debugflag) log_line(6,">Using alias %u:%u/%u.%u", alias[i].zone, alias[i].net, alias[i].node, alias[i].point);
  201. #endif
  202.             
  203.             /*
  204.             **    Are we multipoint?
  205.             */
  206.             
  207.             for (j=0; j < nalias; j++)
  208.             {
  209.                 if (Tozone[area][0] == alias[j].zone &&
  210.                     Tonet[area][0] == alias[j].net && 
  211.                     Tonode[area][0] == alias[j].node &&
  212.                     alias[j].point)
  213.                 {
  214.                     zone = alias[j].zone;
  215.                     net = alias[j].net;
  216.                     node = alias[j].node;
  217.                     point = alias[j].point;
  218.                     Odomain = alias[i].Domain;
  219.  
  220. #if defined EXTERNDEBUG
  221.                     if (debugflag) log_line(6,">Changed alias %u:%u/%u.%u", alias[i].zone,alias[i].net, alias[i].node, alias[i].point);
  222. #endif
  223.                     
  224.                     break;
  225.                 }
  226.             }
  227.             
  228.             break;
  229.         }
  230.     }
  231. */
  232.  
  233. /*
  234. **    Zoek naar het juiste nodenummer. Gebruik daarbij domains.
  235. */
  236.     for (i=0; i < nkey; i++)
  237.     {
  238.         if (pwd[i].zone == Tozone[area][0] &&
  239.              pwd[i].net  == Tonet[area][0] &&
  240.              pwd[i].node == Tonode[area][0] &&
  241.              !strnicmp (pwd[i].Domain, Todomain[area], 8))
  242.         {
  243.             Odomain = pwd[i].Domain;
  244.             
  245. /*
  246. **    Voor multipoint gedoe.
  247. */
  248.             for (j = 0; j < nalias; j++) {
  249.                 if (!strnicmp (pwd[i].Domain, alias[j].Domain, 8) &&
  250.                     pwd[i].zone == alias[j].zone && 
  251.                     pwd[i].net == alias[j].net &&
  252.                     pwd[i].node== alias[j].node &&
  253.                     !strnicmp (Todomain[area], alias[j].Domain, 8)) {
  254.             
  255.                     zone = alias[j].zone;
  256.                     net = alias[j].net;
  257.                     node = alias[j].node;
  258.                     point = alias[j].point;
  259.                     Odomain = alias[j].Domain;
  260.                     break;
  261.                 }
  262.             }
  263.  
  264. /*
  265. **    Voor nodes. Neem het domain van de degene waar het heen moet.
  266. */
  267.             if ( j >= nalias) {
  268.                 for (j = 0; j < nalias; j++) {
  269.                     if (!strnicmp (alias[j].Domain, pwd[i].Domain, 8)) {
  270.                         zone = alias[j].zone;
  271.                         net = alias[j].net;
  272.                         node = alias[j].node;
  273.                         point = alias[j].point;
  274.                         Odomain = alias[j].Domain;
  275.  
  276.                         break;
  277.                     }
  278.                 }
  279.             }
  280.             if (j >= nalias) {
  281.                 i = nkey;
  282.                 break;
  283.             }
  284.             break;
  285.         }
  286.     }
  287.  
  288.     if (i >= nkey) {
  289.         log_line (6, "-No domain for this area.");
  290.         zone = alias[0].zone;
  291.         net = alias[0].net;
  292.         node = alias[0].node;
  293.         point = alias[0].point;
  294.         Odomain = alias[0].Domain;
  295.     }
  296.     
  297.     strcpy (org_domain, Odomain);
  298.     strcpy (dest_domain, Odomain);
  299.     
  300.     if (dostripPID)
  301.         msgbuf = strip_line(msgbuf, "\01PID:");
  302.     else
  303.         msgbuf = Remove_and_Add("\01PID: ", msgbuf);
  304.     
  305.     hdr.Ozone = zone;
  306.     hdr.Onet = net;
  307.     hdr.Onode = node;
  308.     hdr.Opoint = point;
  309.     
  310.     if (area < 0)
  311.     {
  312.         log_line(5,Logmessage[M__UNKNOWN_AREA_NUMBER], area);
  313.         return;
  314.     }
  315.  
  316.     if (doadd_domain) {
  317.         for (i=0; i< domain; i++) {
  318.             if (Appl[i].zone == hdr.Ozone) {
  319.                 for (j = 0; j < Ndomain; j++) {
  320.                     if (Zdomain[j] == Appl[i].zone) {
  321.                         if (strlen(Appl[i].domain)) {
  322.                             strcpy(use_domain, "@");
  323.                             if (!strlen (Odomain))
  324.                                 strcat(use_domain, Appl[i].domain);
  325.                             else if (!strnicmp (Odomain, Appl[i].domain, (WORD)strlen (Odomain)))
  326.                                 strcat(use_domain, Appl[i].domain);
  327.                             else
  328.                                 strcat(use_domain, Odomain);
  329.                             
  330.                             break;
  331.                         }
  332.                     }
  333.                 }
  334.                 break;
  335.             }
  336.         }
  337.     }
  338.     
  339.     if (hdr.Opoint) {
  340.         if (!Npoint) {    
  341.             sprintf(pnt, ".%u", point);
  342.         } else {
  343.             for (j = 0; j < Npoint; j++) {
  344.                 if (hdr.Ozone == Zpoint[j]) {
  345.                     pnt[0] = EOS;
  346.                     break;
  347.                 }
  348.             }
  349.             if (j >= Npoint) {
  350.                 sprintf(pnt, ".%u", point);
  351.             }
  352.         }
  353.     } else pnt[0] = EOS;
  354.  
  355.     /*
  356.         Create random originline from file.
  357.     */
  358.     
  359.     if (Randorgfile[area]) {
  360.         rnd = 0;
  361.         if ((FDUMMY = fopen(Randorgfile[area], "rb")) == NULL) {
  362.             log_line(4, Logmessage[M__NO_RANDOM_FILE]);
  363.             goto NormalOrg;
  364.         }
  365.         while( fgets(origin, 100, FDUMMY)) {
  366.             p = skip_blanks(origin);
  367.             if (*p == ';') continue;
  368.             if ((i = (WORD)strlen(p)) < 3) continue;
  369.             p = &origin[--i];
  370.             if (*p == '\n' || *p == '\r') *p = EOS;
  371.             p = skip_blanks(origin);
  372.             strcpy (orgline[rnd++], p);
  373.             
  374. /*            orgline[rnd++] = ctl_string(p); */
  375.             if (rnd == MAX_ORGLINES) break;
  376.         }
  377.         fclose (FDUMMY);
  378.         
  379.         log_line (3, Logmessage[M__CALCULATE_ORIGIN]);
  380.         
  381.         orgrnd = (BYTE ) Random();
  382.         orgrnd &= 0x3F;
  383.         
  384.         if (orgrnd >= rnd) {
  385.             while (orgrnd >= rnd)
  386.                 orgrnd /= 2;
  387.         }
  388.         
  389.         while (1) {
  390.             if ((q = strchr (orgline[orgrnd], '%')) == NULL) break;
  391.             ++q;
  392.             if (*q == 'd' || *q == 'u') {
  393.                 ++q;
  394.                 strcpy (TEAR_buffer, q);
  395.                 *q = EOS;
  396.                 sprintf (buffer, orgline[orgrnd], (UWORD)Random());
  397.                 strcat (buffer, TEAR_buffer);
  398.                 strcpy (orgline[orgrnd], buffer);
  399.             } else break;
  400.         }
  401.         
  402.         if (orgline[orgrnd] [strlen (orgline[orgrnd]) - 1] == '\r')
  403.              orgline[orgrnd] [strlen (orgline[orgrnd]) - 1] = EOS;
  404.         
  405.         sprintf(origin, " * Origin: %s (%u:%u/%u%s%s)", orgline[orgrnd],
  406.             hdr.Ozone, hdr.Onet, hdr.Onode, pnt, (doadd_domain == TRUE) ? use_domain : "");
  407.         
  408. /*        for (i=0; i < rnd; i++) free (orgline[i]); */
  409.     }
  410.     else {
  411.         NormalOrg:    
  412.         
  413.         sprintf(origin, " * Origin: %s (%u:%u/%u%s%s)", Areaorg[area],
  414.             hdr.Ozone, hdr.Onet, hdr.Onode, pnt, (doadd_domain == TRUE) ? use_domain : "");
  415.     }
  416.  
  417.     ScanMail[0] = 'S';
  418.     
  419.     sprintf(tear, "--- %s\n", (doonly_tear == TRUE) ? "" : ScanMail);
  420.     
  421.     if ((i = (WORD)strlen(origin)) > 75)
  422.         log_line(6,Logmessage[M__ORG_LINE_TO_LONG],
  423.             i-75, Areaname[area]);
  424.     
  425.     /*
  426.     **    We have an tearline?
  427.     */
  428.     
  429.     if ((p = strline(msgbuf, "--- ")) != NULL)
  430.     {
  431.         q = skip_to_token (p , '\n');
  432.         --q;
  433.         if (q) {
  434.             strncpy (TEAR_buffer, q, 511);
  435.             if (!strncmp (p, "--- \n", 5))
  436.                 strcpy (q, "[");
  437.             else
  438.                 strcpy (q, " [");
  439.             strcat (q, IOSmail);
  440.             strcat (q, "]");
  441.             strcat (q, TEAR_buffer);
  442.         }
  443.         havetear++;
  444.         is_our_message = FALSE;
  445.     }
  446.     
  447.     /*
  448.     **    Do we have an origin?
  449.     */
  450.     
  451.     if ((q = strline(msgbuf, " * Origin:")) != NULL) haveorg++;
  452.     
  453.     if (msgbuf[strlen(msgbuf)-1] != '\n') strcat(msgbuf, "\n");
  454.     
  455.     /*
  456.     **    Add, if none.
  457.     */
  458.     
  459.     if (!havetear && !haveorg)
  460.     {
  461.         sprintf(&msgbuf[strlen(msgbuf)], "%s%s", tear, origin);
  462.         havetear = haveorg = TRUE;
  463.     }
  464.     
  465.     if (!havetear)
  466.     {
  467.         sprintf(&msgbuf[strlen(msgbuf)], "%s%s", tear, q);
  468.         havetear = TRUE;
  469.     }
  470.     
  471.     if (!haveorg)
  472.     {
  473.         strcat(msgbuf, origin);
  474.         haveorg = TRUE;
  475.     }
  476.     
  477.     /*
  478.     **    Info to screen/logfile
  479.     */
  480.     
  481.     if (!doquit)
  482.     {
  483.         if (was_private)
  484.         {
  485.             if(!doniceout && !doquit) {
  486.                 gprintf("%-20.20s > %-20.20s %s %s.\n", hdr.from,
  487.                     hdr.to, (hdr.flags & CRASH) ? "Crashmail" : "Echomail",
  488.                     (area >= 0) ? Areaname[area] : "MAIL");
  489.             }
  490.             else
  491.                 log_line(4,"*%-15.15s > %-15.15s %s %s.", hdr.from,
  492.                     hdr.to, (hdr.flags & CRASH) ? "Crashmail" : "Echomail",
  493.                     (area >= 0) ? Areaname[area] : "MAIL");
  494.         }
  495.         else
  496.         {
  497.             if(!doniceout && !doquit) {
  498.                 gprintf("%-20.20s > %-20.20s %s.\n", hdr.from, hdr.to,
  499.                 (hdr.flags & CRASH) ? "Crashmail" : "Echomail");
  500.             }
  501.             else
  502.                 log_line(3,"*%-15.15s > %-15.15s %s.", hdr.from,
  503.                 hdr.to, (hdr.flags & CRASH) ? "Crashmail" : "Echomail");
  504.         }
  505.     }
  506.     
  507.     npath = nseenby = 0;
  508.     Fzone = fzone = hdr.Ozone;
  509.     
  510.     get_path(msgbuf, area);
  511.     get_seen(msgbuf, area);
  512.     
  513.     /*
  514.     **    If an echomail is moved, and the mailer field is set to 0,
  515.     **    and we have found SEEN-BY's etc. get the SEEN_BY we have.
  516.     */
  517.     
  518.     fzone = fnet = fnode = 0;
  519.     
  520.     /*
  521.     **    Do we have already SEEN-BY's in this message?
  522.     */
  523.     
  524.     if (nseenby)
  525.     {
  526.         fzone = Fzone = hdr.Ozone;
  527.         fnet = Fnet = hdr.Onet;
  528.         fnode = Fnode = hdr.Onode;
  529.         fpoint = Fpoint = hdr.Opoint;
  530.         
  531. #if defined EXTERNDEBUG
  532.         if (debugflag) log_line(6,">Found SEEN-BY's %u", nseenby);
  533. #endif
  534.         
  535.         for (i=0; i < nseenby; i++)
  536.         {
  537.             for (j=0; j < nalias; j++)
  538.             {
  539.                 if (SeenN[i] == alias[j].pointnet)
  540.                 {
  541.                     ppoint[l]    =    SeenO[i];
  542.                     pnet[l]        =    alias[j].net;
  543.                     pnode[l]    =    alias[j].node;
  544.                     pzone[l++]    =    alias[j].zone;
  545.                     SeenZ[i]    =    alias[j].zone;
  546.                     break;
  547.                 }
  548.                 
  549.                 if (SeenN[i] == alias[j].net &&
  550.                     SeenO[i] == alias[j].node)
  551.                 {
  552.                     pzone[l]    =    alias[j].zone;
  553.                     pnet[l]        =    alias[j].net;
  554.                     pnode[l]    =    alias[j].node;
  555.                     ppoint[l++]    =    0;
  556.                     SeenZ[i]    =    alias[j].zone;
  557.                     break;
  558.                 }
  559.             }
  560.             
  561.             if (j >= nalias)
  562.             {
  563.                 j = 0;
  564.                 
  565.                 for (a=0; a < nkey; a++)
  566.                     if (SeenN[i] == pwd[a].net &&
  567.                         SeenO[i] == pwd[a].node)
  568.                     {
  569.                         pzone[l]    =    pwd[a].zone;
  570.                         pnet[l]        =    pwd[a].net;
  571.                         pnode[l]    =    pwd[a].node;
  572.                         ppoint[l++]    =    pwd[a].point;
  573.                         SeenZ[i]    =    pwd[a].zone;
  574.                         break;
  575.                     }
  576.                 
  577.                 if (a >= nkey && !SeenZ[i]) SeenZ[i] = alias[0].zone;
  578.             }
  579.         }
  580.     }
  581.     else
  582.     {
  583.         /*
  584.         **    If MSGID: has an other nodenumber than the
  585.         **    zone we are working, change the nodenumber.
  586.         */
  587.         
  588.         if (get_msgid(msgbuf, &zone, &net, &node, &point) &&
  589.             (zone != hdr.Ozone || net != hdr.Onet || node !=
  590.             hdr.Onode || point != hdr.Opoint))
  591.             msgbuf = change_msgid(msgbuf, &hdr);
  592.         
  593.         /*
  594.         **    Do we add our realname?
  595.         */
  596.         
  597.         if ((dorealname & REALOUT) && is_our_message &&
  598.             stricmp(hdr.from, SysOp) && Ausername[area])
  599.             msgbuf = add_a_line("\01REALNAME:", SysOp, msgbuf);
  600.     }
  601.     
  602.     /*
  603.     **    Fakename in message ?
  604.     */
  605.     
  606.     if (!stricmp(hdr.from, SysOp) && Ausername[area]) {
  607.         strncpy (hdr.from, Ausername[area], 30);
  608.     }
  609.     
  610.     /*
  611.     **    Message save back to local messagebase.
  612.     */
  613.     
  614.     if (dosavelocal)
  615.     {
  616.         strcpy(outmsg, msgbuf);
  617.         
  618.         fzone = Fzone = hdr.Ozone;
  619.         fnet = Fnet = hdr.Onet;
  620.         fnode = Fnode = hdr.Onode;
  621.         fpoint = Fpoint = hdr.Opoint;
  622.         
  623.         i = ourseen(area, 1, &hdr, Odomain);
  624.         Addline(outmsg, "SEEN-BY:", i-1, hdr.Ozone);
  625.         
  626.         i = ourpath(area, Odomain);
  627.         Addline(outmsg, "\01PATH:", i-1, hdr.Ozone);
  628.     
  629.         file_watch = ftell(FHDR);
  630.         fclose(FHDR);
  631.         
  632.         hdr.flags |= SENT;
  633.         savemsg(TOLOCAL, &hdr, area, outmsg, 0, 0, 0, 0);
  634.         
  635.         if (MTask == MULTITOS) {
  636.             TO_AREA = Files_to_open / 5;
  637.             if (TO_AREA > N_MAXAREA) TO_AREA = N_MAXAREA;
  638.         } else {
  639.             TO_AREA = N_AREAFILE;
  640.         }
  641.         
  642.         for (i=0; i < N_AREAFILE; i++)
  643.         {
  644.             if(LHDRfile[i] == FILEopen) fclose(LHDR[i]);
  645.             if(LMSGfile[i] == FILEopen) fclose(LMSG[i]);
  646.             
  647.             lastareawritten[i] = -1;
  648.             
  649.             LHDRfile[i] = FILEclosed;
  650.             LMSGfile[i] = FILEclosed;
  651.         }
  652.         
  653.         if (!was_private) sprintf(tear, "%s.HDR", Areapath[area]);
  654.         else sprintf(tear, "%s.HDR", privatebox);
  655.         
  656.         FHDR = fopen(tear, "r+b");
  657.         
  658.         if (!FHDR)
  659.         {
  660.             log_line(3,Logmessage[M__SER_PROBLEMS]);
  661.             terminate(10);
  662.         }
  663.         
  664.         fseek(FHDR, file_watch, SEEK_SET);
  665.         
  666.         *outmsg = EOS;
  667.     }
  668.  
  669.     if (Read_only[area] == REMOTE_ONLY) {
  670.         if (Not_allowed(msgbuf, area) == FALSE) {
  671.             log_line(3,Logmessage[M__READ_ONLY_AREA]);
  672.             free(msgbuf);
  673.             free(outmsg);
  674.             return;
  675.         }
  676.     }
  677.     
  678.     /*
  679.     **    Export new message to nodes/point.
  680.     */
  681.     
  682.     for (j=0; Tozone[area][j] != (UWORD)-1; j++)
  683.     {
  684.         ournode = 0;
  685.         
  686.         for (i=0; i < nalias; i++)
  687.             if (Tozone[area][j] == alias[i].zone &&
  688.                 Tonet[area][j] == alias[i].net &&
  689.                 Tonode[area][j] == alias[i].node &&
  690.                 Topoint[area][j] == alias[i].point &&
  691.                 !strnicmp (Odomain, Todomain[area], 8))
  692.             {
  693.                 ournode++;
  694.                 break;
  695.             }
  696.         
  697.         /*
  698.         **    We have our node number added in
  699.         **    the areas.bbs continue then.
  700.         */
  701.         
  702.         if (ournode) continue;
  703.         
  704.         /*
  705.         **    If we have an message with an SEEN-BY already,
  706.         **    find out who have this message already.
  707.         */
  708.         
  709.         if (l)
  710.         {
  711.             for (a=0; a < l; a++)
  712.                 if (pzone[a] == Tozone[area][j] &&
  713.                     pnet[a] == Tonet[area][j] &&
  714.                     pnode[a] == Tonode[area][j] &&
  715.                     ppoint[a] == Topoint[area][j]) break;
  716.             
  717.             if (a < l) continue;
  718.         }
  719.         
  720.         nechos++;
  721.         Ncreated[area]++;
  722.         
  723.         /*
  724.         **    If message has the crash flag on, then this
  725.         **    is an netmail. Don't add SEEN-BY to it.
  726.         */
  727.         
  728.         if (!(hdr.flags & CRASH))
  729.         {
  730.             hdr.Dzone = Tozone[area][j];
  731.             hdr.Dnet = Tonet[area][j];
  732.             hdr.Dnode = Tonode[area][j];
  733.             hdr.Dpoint = Topoint[area][j];
  734.             
  735.             if (!capture_msg(&hdr)) continue;
  736.             
  737.             hprintf(S_EXP, "%d", nechos);
  738.             hprintf(S_DEST, "%u:%u/%u.%u", hdr.Dzone, hdr.Dnet,
  739.                 hdr.Dnode, hdr.Dpoint);
  740.             hprintf(S_FROM, "%u:%u/%u.%u", hdr.Ozone, hdr.Onet,
  741.                 hdr.Onode, hdr.Opoint);
  742.             
  743.             sprintf(outmsg, "AREA:%s\n", Areaname[area]);
  744.             add_point(outmsg, &hdr);
  745.             strcat(outmsg, msgbuf);
  746.             
  747.             nseenby = npath = 0;
  748.             
  749.             if (!fzone || !fnet)
  750.             {
  751.                 fzone = Fzone = hdr.Ozone;
  752.                 fnet = Fnet = hdr.Onet;
  753.                 fnode = Fnode = hdr.Onode;
  754.                 fpoint = Fpoint = hdr.Opoint;
  755.             }
  756.             
  757.             i = ourseen(area, Topoint[area][j], &hdr, Odomain);
  758.             Addline(outmsg, "SEEN-BY:", i-1, Tozone[area][j]);
  759.             
  760.             i = ourpath(area, Odomain);
  761.             Addline(outmsg, "\01PATH:", i-1, Tozone[area][j]);
  762.             ournode = 0;
  763.         }
  764.         else
  765.         {
  766.             strcpy(outmsg, msgbuf);
  767.             
  768.             outmsg = strip_those_lines(outmsg, "SEEN-BY:");
  769.             outmsg = strip_those_lines(outmsg, "\01SEEN-BY:");
  770.             outmsg = strip_those_lines(outmsg, "\01PATH:");
  771.             
  772.             ournode = 1;
  773.             
  774.             time(&secs);
  775.             tijd = localtime(&secs);
  776.             strftime(tm_now, 39, "%b %d %Y at %H:%M", tijd);
  777.             
  778.             sprintf(&outmsg[strlen(outmsg)],
  779.                 "\n\01Via %s %u:%u/%u.%u, %s\n", OutMail, hdr.Ozone,
  780.                 hdr.Onet, hdr.Onode, hdr.Opoint, tm_now);
  781.             
  782.             if (hdr.flags & ORPHAN) hdr.flags &= ~CRASH;
  783.             hdr.flags |= (PRIVATE|MSGLOCAL);
  784.         }
  785.         
  786.         hdr.flags &= ~(SENT|RECEIVED);
  787.         hdr.mailer[7] = 0;
  788.         
  789.         if (!dopkt)
  790.         {
  791.             hdr.flags |= (KILLSEND|MSGLOCAL);
  792.             strcat(outmsg, "\n");
  793.         }
  794.         
  795.         if(!doniceout && !doquit)
  796.         {
  797.             if(!ournode) {                
  798.                 hprintf(S_DEST, "%u:%u/%u.%u", hdr.Dzone, hdr.Dnet,
  799.                     hdr.Dnode, hdr.Dpoint);
  800.                 hprintf(S_FROM, "%u:%u/%u.%u", hdr.Ozone, hdr.Onet,
  801.                     hdr.Onode, hdr.Opoint);
  802.             }
  803.             else {
  804.                 hprintf(S_DEST, "%u:%u/%u.%u", hdr.Dzone, hdr.Dnet,
  805.                     hdr.Dnode, hdr.Dpoint);
  806.                 hprintf(S_FROM, "%u:%u/%u.%u", hdr.Ozone, hdr.Onet,
  807.                     hdr.Onode, hdr.Opoint);
  808.                 
  809.                 hprintf(S_COMMENT, " Via netmail to %u:%u/%u.%u", hdr.Dzone,
  810.                     hdr.Dnet, hdr.Dnode, hdr.Dpoint);
  811.             }
  812.         }
  813.         else
  814.         {
  815.             if(!ournode)
  816.                 log_line(2,Logmessage[M__VIA_NODE], hdr.Dzone, hdr.Dnet,
  817.                     hdr.Dnode,hdr.Dpoint);
  818.             else
  819.                 log_line(3,Logmessage[M__VIA_NETMAIL], hdr.Dzone,
  820.                     hdr.Dnet, hdr.Dnode, hdr.Dpoint);
  821.         }
  822.         
  823.         if (!ournode)
  824.             savemsg((dopkt) ? TOPACKET : TONETMAIL, &hdr, area,
  825.                 outmsg, 0, 0, 0, 0);
  826.         else
  827.             savemsg(TONETMAIL, &hdr, 0, outmsg, 0, 0, 0, 0);
  828.         
  829.         hdr.flags |= SENT;
  830.         hdr.mailer[7] |= SCANNED;
  831.         hdr.flags &= ~(KILLSEND);
  832.         
  833.         *outmsg = EOS;
  834.     }
  835.     
  836.     
  837.     free(outmsg);
  838.     free(msgbuf);
  839. }
  840.  
  841. MLOCAL VOID export(WORD area)
  842. {
  843.     BYTE    Mfile[128],
  844.             Hfile[128];
  845.     LONG    tell;
  846.     ULONG    MaxMsg;
  847.     
  848.     if (area != -1) {
  849.         log_line(6,Logmessage[M__READING_AREA], Areaname[area]);
  850.         hprintf (S_AREA, "%s", Areaname[area]);
  851.     }
  852.     else {
  853.         log_line(6,Logmessage[M__READING_PVTBOX]);
  854.         hprintf (S_AREA, "PRIVATEMAILBOX");
  855.     }
  856.     
  857.     if (area != -1)
  858.     {
  859.         sprintf(Mfile, "%s.MSG", Areapath[area]);
  860.         sprintf(Hfile, "%s.HDR", Areapath[area]);
  861.     }
  862.     else
  863.     {
  864.         sprintf(Hfile, "%s.HDR", privatebox);
  865.         sprintf(Mfile, "%s.MSG", privatebox);
  866.     }
  867.     
  868.     if ((FHDR = fopen(Hfile, "r+b")) == NULL) return;
  869.     
  870.     while (!feof(FHDR))
  871.     {
  872. /*
  873.         hdrread(&hdr, sizeof(MSGHEADER), FHDR);
  874. */
  875.         if (Fread(fileno(FHDR), sizeof(MSGHEADER), &hdr) != sizeof(MSGHEADER)) break;
  876.         
  877.         if (!hdr.size)
  878.         {
  879.             hdr.flags = DELETED;
  880.             fseek(FHDR, ftell(FHDR) - sizeof(MSGHEADER), SEEK_SET);
  881.             fwrite(&hdr, sizeof(MSGHEADER) ,1, FHDR);
  882.             fflush(FHDR);
  883.             continue;
  884.         }
  885.                 
  886.         if (hdr.mailer[7] & SCANNED || hdr.flags & DELETED) continue;
  887.         
  888.         if ((tell = ftell(FHDR)) < sizeof(MSGHEADER))
  889.         {
  890.             if (tell > 0L) log_line(5,Logmessage[M__FILESIZE_PROBLEM],
  891.                 tell, (WORD)sizeof(MSGHEADER));
  892.             break;
  893.         }
  894.         
  895.         if (hdr.size >= MAXMSGLENGTH)
  896.         {
  897.             log_line(4,Logmessage[M__MSG_TO_BIG_SIZE], MAXMSGLENGTH);
  898.             
  899.             hdr.mailer[7] |= SCANNED;
  900.             fseek(FHDR, ftell(FHDR) - sizeof(MSGHEADER), SEEK_SET);
  901.             hdrwrite(&hdr, sizeof(MSGHEADER), FHDR);
  902.             
  903.             continue;
  904.         }
  905.                 
  906.         if ((FMSG = fopen(Mfile,"rb")) != NULL)
  907.         {
  908.             fseek(FMSG, hdr.Mstart, SEEK_SET);
  909.             
  910.             if (ferror(FMSG))
  911.             {
  912.                 log_line(4,Logmessage[M__SEEK_ERROR]);
  913.                 fclose(FMSG);
  914.                 continue;
  915.             }
  916. #if !defined TESTCASE            
  917.             fseek(FHDR, ftell(FHDR) - sizeof(MSGHEADER), SEEK_SET);
  918. #endif            
  919.             hdr.mailer[7] |= SCANNED;
  920.             if (hdr.flags & MSGLOCAL) hdr.flags |= SENT;
  921.             
  922.             if (hdr.flags & KILLSEND || dosavelocal)
  923.             {
  924.                 hdr.flags |= DELETED;
  925.                 if (area == -1 && !dosavelocal) hdr.flags &= ~DELETED;
  926.             }
  927. #if !defined TESTCASE            
  928.             hdrwrite(&hdr, sizeof(MSGHEADER), FHDR);
  929.             fflush(FHDR);
  930. #endif            
  931.             if (dosavelocal) hdr.flags &= ~DELETED;
  932.             
  933.             have_message(area);
  934.         }
  935.     }
  936.     
  937.     fclose(FHDR);
  938. }
  939.  
  940. VOID scan_areas(VOID)
  941. {
  942.     WORD    i;
  943.     
  944.     log_line(6,Logmessage[M__SCAN_AREAS]);
  945.  
  946.     hprintf (S_COMMENT, "Scanning echomail");
  947.     
  948.     init_PKTS();
  949.     
  950.     for (i=0; i < msgareas; i++)
  951.     {
  952.         if (Dareas[i] || (dochanged && !area_changed(i))) continue;
  953.         
  954.         export(i);
  955.         
  956.         area_changed(i);
  957.     }
  958.     
  959.     if (toprivate || dopvtmail) export(-1);
  960.     
  961.     close_PKTS();
  962. }
  963.