home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / LO241SRV.ZIP / QUICKMSG.C < prev    next >
Text File  |  1998-05-17  |  74KB  |  2,228 lines

  1.  
  2. // LoraBBS Version 2.41 Free Edition
  3. // Copyright (C) 1987-98 Marco Maccaferri
  4. //
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of the GNU General Public License as published by
  7. // the Free Software Foundation; either version 2 of the License, or
  8. // (at your option) any later version.
  9. //
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <ctype.h>
  22. #include <stdlib.h>
  23. #include <io.h>
  24. #include <fcntl.h>
  25. #include <dir.h>
  26. #include <sys\stat.h>
  27.  
  28. #include <cxl\cxlvid.h>
  29. #include <cxl\cxlwin.h>
  30.  
  31. #include "lsetup.h"
  32. #include "sched.h"
  33. #include "msgapi.h"
  34. #include "externs.h"
  35. #include "prototyp.h"
  36. #include "quickmsg.h"
  37.  
  38. #define MAX_MESSAGES   1000
  39.  
  40. char *pascal_string (char *);
  41. int quick_msg_attrib(struct _msghdr *, int, int, int);
  42. void quick_text_header(struct _msghdr *, int, FILE *);
  43. void write_pascal_string (char *, char *, word *, word *, FILE *);
  44. void quick_qwk_text_header (struct _msghdr *, int, FILE *, struct QWKmsghd *, long *);
  45. void replace_tearline (FILE *fpd, char *buf);
  46. int open_packet (int zone, int net, int node, int point, int ai);
  47. int gold_msg_attrib(struct _gold_msghdr *, int, int, int);
  48. void gold_qwk_text_header (struct _gold_msghdr *, int, FILE *, struct QWKmsghd *, long *);
  49. void gold_text_header (struct _gold_msghdr *, int, FILE *);
  50. void quick_bluewave_text_header (struct _msghdr *msgt, int msgn, int fdi, long bw_start, long bw_len);
  51. void gold_bluewave_text_header (struct _gold_msghdr *msgt, int msgn, int fdi, long bw_start, long bw_len);
  52.  
  53. FILE *mopen (char *filename, char *mode);
  54. int mclose (FILE *fp);
  55. int mputs (char *s, FILE *fp);
  56. void mprintf (FILE *fp, char *format, ...);
  57. long mseek (FILE *fp, long position, int offset);
  58. int mread (char *s, int n, int e, FILE *fp);
  59.  
  60. long *msgidx = NULL;
  61. struct _msginfo msginfo;
  62. struct _gold_msginfo gmsginfo;
  63.  
  64. struct _aidx {
  65. //   char areatag[32];
  66.     unsigned long areatag;
  67.     byte board;
  68.     word gold_board;
  69. };
  70.  
  71. extern struct _aidx *aidx;
  72. extern int maxaidx;
  73.  
  74. extern int maxakainfo;
  75. extern struct _akainfo *akainfo;
  76.  
  77. extern struct _node2name *nametable; // Gestione nomi per aree PRIVATE
  78. extern int nodes_num;
  79.  
  80. void write_pascal_string (st, text, pos, nb, fp)
  81. char *st, *text;
  82. word *pos, *nb;
  83. FILE *fp;
  84. {
  85.     word v, m, blocks;
  86.  
  87.     m = *pos;
  88.     blocks = *nb;
  89.  
  90.     for (v=0; st[v]; v++) {
  91.         text[m++] = st[v];
  92.         if (m == 256) {
  93.             *text = m - 1;
  94.             fwrite(text, 256, 1, fp);
  95.             memset(text, 0, 256);
  96.             m = 1;
  97.             blocks++;
  98.         }
  99.     }
  100.  
  101.     *pos = m;
  102.     *nb = blocks;
  103. }
  104.  
  105. void quick_list_headers (start, board, verbose, goldbase)
  106. int start, board, verbose;
  107. char goldbase;
  108. {
  109.    int fd, i, line = verbose ? 2 : 5, l = 0;
  110.    char filename[80];
  111.    struct _msghdr msgt;
  112.    struct _gold_msghdr gmsgt;
  113.  
  114.    if (goldbase)
  115.       sprintf (filename, "%sMSGHDR.DAT", fido_msgpath);
  116.    else
  117.       sprintf (filename, "%sMSGHDR.BBS", fido_msgpath);
  118.  
  119.    if ((fd = shopen (filename,O_RDONLY|O_BINARY)) == -1)
  120.       return;
  121.  
  122.     for (i = start; i <= last_msg; i++) {
  123.       if (goldbase) {
  124.          lseek(fd, (long)sizeof (struct _gold_msghdr) * msgidx[i], SEEK_SET);
  125.          read (fd, (char *)&gmsgt, sizeof (struct _gold_msghdr));
  126.  
  127.          if (gmsgt.board != board)
  128.             continue;
  129.             if (gmsgt.msgattr & Q_RECKILL)
  130.             continue;
  131.          if ((gmsgt.msgattr & Q_PRIVATE) && stricmp (pascal_string (gmsgt.whofrom), usr.name) && stricmp (pascal_string (gmsgt.whoto), usr.name) 
  132.          && stricmp (pascal_string (gmsgt.whofrom), usr.handle) && stricmp (pascal_string (gmsgt.whoto), usr.handle) && usr.priv < SYSOP)
  133.             continue;
  134.  
  135.          msg_tzone = gmsgt.destzone;
  136.          msg_fzone = gmsgt.origzone;
  137.       }
  138.       else {
  139.          lseek(fd, (long)sizeof (struct _msghdr) * msgidx[i], SEEK_SET);
  140.          read (fd, (char *)&msgt, sizeof (struct _msghdr));
  141.  
  142.          if (msgt.board != board)
  143.             continue;
  144.             if (msgt.msgattr & Q_RECKILL)
  145.             continue;
  146.          if ((msgt.msgattr & Q_PRIVATE) && stricmp (pascal_string (msgt.whofrom), usr.name) && stricmp (pascal_string (msgt.whoto), usr.name) 
  147.             && stricmp (pascal_string (msgt.whofrom), usr.handle) && stricmp (pascal_string (msgt.whoto), usr.handle) && usr.priv < SYSOP)
  148.             continue;
  149.  
  150.          msg_tzone = msgt.destzone;
  151.          msg_fzone = msgt.origzone;
  152.       }
  153.  
  154.       if (verbose) {
  155.          if (goldbase) {
  156.             if ((line = gold_msg_attrib (&gmsgt, i, line, 0)) == 0)
  157.                break;
  158.          }
  159.          else {
  160.             if ((line = quick_msg_attrib (&msgt, i, line, 0)) == 0)
  161.                break;
  162.          }
  163.  
  164.          m_print (bbstxt[B_ONE_CR]);
  165.       }
  166.         else {
  167.          if (goldbase) {
  168.             m_print ("%-4d %c%-20.20s ", i, (stricmp (pascal_string(gmsgt.whofrom), usr.name) && stricmp (pascal_string(gmsgt.whofrom), usr.handle)) ? 'è' : 'Ä', pascal_string (gmsgt.whofrom));
  169.             m_print ("%c%-20.20s ", (stricmp(pascal_string(gmsgt.whoto), usr.name)&&stricmp(pascal_string (gmsgt.whoto),usr.handle)) ? 'è' : 'î', pascal_string (gmsgt.whoto));
  170.             m_print (" %-32.32s\n", pascal_string (gmsgt.subject));
  171.          }
  172.          else {
  173.             m_print ("%-4d %c%-20.20s ", i, (stricmp (pascal_string(msgt.whofrom), usr.name)&&stricmp (pascal_string(msgt.whofrom), usr.handle)) ? 'è' : 'Ä', pascal_string (msgt.whofrom));
  174.             m_print ("%c%-20.20s ", (stricmp (pascal_string(msgt.whoto), usr.name)&&stricmp (pascal_string (msgt.whoto),usr.handle)) ? 'è' : 'î', pascal_string (msgt.whoto));
  175.             m_print (" %-32.32s\n", pascal_string (msgt.subject));
  176.          }
  177.       }
  178.  
  179.       if ((l = more_question (line)) == 0)
  180.          break;
  181.  
  182.       if (!verbose && l < line) {
  183.          l = 5;
  184.  
  185.          cls ();
  186.          m_print (bbstxt[B_LIST_AREAHEADER], usr.msg, sys.msg_name);
  187.          m_print (bbstxt[B_LIST_HEADER1]);
  188.          m_print (bbstxt[B_LIST_HEADER2]);
  189.       }
  190.  
  191.         line = l;
  192.    }
  193.  
  194.    close (fd);
  195.  
  196.    if (line)
  197.       press_enter();
  198. }
  199.  
  200. void quick_message_inquire (stringa, board, goldbase)
  201. char *stringa;
  202. int board;
  203. char goldbase;
  204. {
  205.    int fd, i, line = 4;
  206.    char filename[80];
  207.    struct _msghdr msgt, backup;
  208.    struct _gold_msghdr gmsgt;
  209.  
  210.     if (goldbase)
  211.       sprintf (filename, "%sMSGHDR.DAT", fido_msgpath);
  212.    else
  213.       sprintf (filename, "%sMSGHDR.BBS", fido_msgpath);
  214.    if ((fd = sh_open (filename, SH_DENYNONE, O_RDONLY|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  215.       return;
  216.  
  217.    for (i = 1; i <= last_msg; i++) {
  218.       if (goldbase) {
  219.          lseek (fd, (long)sizeof (struct _gold_msghdr) * msgidx[i], SEEK_SET);
  220.          read (fd, (char *)&gmsgt, sizeof (struct _gold_msghdr));
  221.  
  222.          if (gmsgt.board != board)
  223.             continue;
  224.             if (gmsgt.msgattr & Q_RECKILL)
  225.             continue;
  226.          if ((gmsgt.msgattr & Q_PRIVATE) && stricmp (pascal_string (gmsgt.whofrom), usr.name) && stricmp (pascal_string (gmsgt.whoto), usr.name) 
  227.          && stricmp (pascal_string (gmsgt.whofrom), usr.handle) && stricmp(pascal_string (gmsgt.whoto), usr.handle)&& usr.priv < SYSOP)
  228.             continue;
  229.  
  230.          strcpy (msgt.whoto, pascal_string (gmsgt.whoto));
  231.          strcpy (msgt.whofrom, pascal_string (gmsgt.whofrom));
  232.          strcpy (msgt.subject, pascal_string (gmsgt.subject));
  233.  
  234.          msg_tzone = gmsgt.destzone;
  235.             msg_fzone = gmsgt.origzone;
  236.       }
  237.       else {
  238.          lseek (fd, (long)sizeof (struct _msghdr) * msgidx[i], SEEK_SET);
  239.          read (fd, (char *)&msgt, sizeof (struct _msghdr));
  240.  
  241.          if (msgt.board != board)
  242.             continue;
  243.             if (msgt.msgattr & Q_RECKILL)
  244.             continue;
  245.          if ((msgt.msgattr & Q_PRIVATE) && stricmp(pascal_string(msgt.whofrom),usr.name) && stricmp(pascal_string(msgt.whoto),usr.name) 
  246.          && stricmp(pascal_string(msgt.whofrom),usr.handle) && stricmp(pascal_string(msgt.whoto),usr.handle) && usr.priv < SYSOP)
  247.             continue;
  248.  
  249.          memcpy ((char *)&backup, (char *)&msgt, sizeof (struct _msghdr));
  250.          strcpy (msgt.whoto, pascal_string (msgt.whoto));
  251.          strcpy (msgt.whofrom, pascal_string (msgt.whofrom));
  252.          strcpy (msgt.subject, pascal_string (msgt.subject));
  253.  
  254.             msg_tzone = msgt.destzone;
  255.          msg_fzone = msgt.origzone;
  256.       }
  257.  
  258.       strupr (msgt.whoto);
  259.       strupr (msgt.whofrom);
  260.       strupr (msgt.subject);
  261.  
  262.       if ((strstr (msgt.whoto, stringa) != NULL) || (strstr (msgt.whofrom, stringa) != NULL) || (strstr (msgt.subject, stringa) != NULL)) {
  263.          if (goldbase) {
  264.             if ((line = gold_msg_attrib (&gmsgt, i, line, 0)) == 0)
  265.                break;
  266.          }
  267.          else {
  268.             memcpy ((char *)&msgt, (char *)&backup, sizeof (struct _msghdr));
  269.             if ((line = quick_msg_attrib (&msgt, i, line, 0)) == 0)
  270.                break;
  271.          }
  272.  
  273.          m_print (bbstxt[B_ONE_CR]);
  274.  
  275.          if (!(line = more_question (line)) || !CARRIER && !RECVD_BREAK ())
  276.             break;
  277.  
  278.          time_release ();
  279.         }
  280.    }
  281.  
  282.    close (fd);
  283.  
  284.    if (line)
  285.       press_enter ();
  286. }
  287.  
  288. int quick_mail_header (i, line, goldbase, ovrmsgn)
  289. int i, line;
  290. char goldbase;
  291. int ovrmsgn;
  292. {
  293.    int fd;
  294.    char filename[80];
  295.    struct _msghdr msgt;
  296.    struct _gold_msghdr gmsgt;
  297.  
  298.     if (goldbase) {
  299.         sprintf (filename, "%sMSGHDR.DAT", fido_msgpath);
  300.         if ((fd = shopen (filename, O_RDONLY|O_BINARY)) == -1)
  301.             return (0);
  302.  
  303.         lseek (fd, (long)sizeof (struct _gold_msghdr) * msgidx[i], SEEK_SET);
  304.         read (fd, (char *)&gmsgt, sizeof (struct _gold_msghdr));
  305.         close (fd);
  306.  
  307.         if (gmsgt.msgattr & Q_RECKILL)
  308.             return (line);
  309.  
  310.         if ((gmsgt.msgattr & Q_PRIVATE) && stricmp (pascal_string (gmsgt.whofrom), usr.name) && stricmp (pascal_string (gmsgt.whoto), usr.name)
  311.         && stricmp (pascal_string (gmsgt.whofrom), usr.handle) && stricmp (pascal_string (gmsgt.whoto), usr.handle) && usr.priv < SYSOP)
  312.             return (line);
  313.  
  314.         msg_tzone = gmsgt.destzone;
  315.         msg_fzone = gmsgt.origzone;
  316.         if ((line = gold_msg_attrib (&gmsgt, ovrmsgn ? ovrmsgn : i, line, 0)) == 0)
  317.             return (0);
  318.     }
  319.     else {
  320.         sprintf (filename, "%sMSGHDR.BBS", fido_msgpath);
  321.         if ((fd = shopen (filename,O_RDONLY|O_BINARY)) == -1)
  322.             return (0);
  323.  
  324.         lseek (fd, (long)sizeof (struct _msghdr) * msgidx[i], SEEK_SET);
  325.         read (fd, (char *)&msgt, sizeof (struct _msghdr));
  326.         close (fd);
  327.  
  328.         if (msgt.msgattr & Q_RECKILL)
  329.             return (line);
  330.  
  331.         if ((msgt.msgattr & Q_PRIVATE) && stricmp (pascal_string (msgt.whofrom), usr.name) && stricmp (pascal_string (msgt.whoto), usr.name)
  332.         && stricmp (pascal_string (msgt.whofrom), usr.handle) && stricmp (pascal_string (msgt.whoto), usr.handle) && usr.priv < SYSOP)
  333.             return (line);
  334.  
  335.         msg_tzone = msgt.destzone;
  336.         msg_fzone = msgt.origzone;
  337.         if ((line = quick_msg_attrib (&msgt, ovrmsgn ? ovrmsgn : i, line, 0)) == 0)
  338.             return (0);
  339.     }
  340.  
  341.     return (line);
  342. }
  343.  
  344. int quick_kill_message (msg_num, goldbase)
  345. int msg_num;
  346. char goldbase;
  347. {
  348.     int fd, fdidx, fdto;
  349.     char filename[80];
  350.     struct _msghdr msgt;
  351.     struct _msgidx idx;
  352.     struct _gold_msghdr gmsgt;
  353.     struct _gold_msgidx gidx;
  354.  
  355.     if (goldbase) {
  356.         sprintf (filename, "%sMSGHDR.DAT", fido_msgpath);
  357.         if ((fd = sh_open (filename, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  358.             return (0);
  359.  
  360.         lseek (fd, (long)sizeof (struct _gold_msghdr) * msgidx[msg_num], SEEK_SET);
  361.         read (fd, (char *)&gmsgt, sizeof (struct _gold_msghdr));
  362.  
  363.         if (!strnicmp (&gmsgt.whofrom[1], usr.name, gmsgt.whofrom[0]) || !strnicmp (&gmsgt.whoto[1], usr.name, gmsgt.whoto[0]) ||
  364.         !strnicmp (&gmsgt.whofrom[1], usr.handle, gmsgt.whofrom[0]) || !strnicmp (&gmsgt.whoto[1], usr.handle, gmsgt.whoto[0]) || usr.priv == SYSOP) {
  365.             gmsgt.msgattr |= Q_RECKILL;
  366. //            gmsgt.msgnum = 0;
  367.             lseek (fd, (long)sizeof (struct _gold_msghdr) * msgidx[msg_num], SEEK_SET);
  368.             write (fd, (char *)&gmsgt, sizeof (struct _gold_msghdr));
  369.  
  370.             sprintf (filename, "%sMSGIDX.DAT", fido_msgpath);
  371.             fdidx = sh_open (filename, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE);
  372.             lseek (fdidx, (long)msgidx[msg_num] * sizeof (struct _msgidx), SEEK_SET);
  373.             read (fdidx, (char *)&gidx, sizeof (struct _gold_msgidx));
  374.             gidx.msgnum = -1;
  375.             lseek (fdidx, (long)msgidx[msg_num] * sizeof (struct _gold_msgidx), SEEK_SET);
  376.             write (fdidx, (char *)&gidx, sizeof (struct _gold_msgidx));
  377.             close (fdidx);
  378.  
  379.             sprintf (filename, "%sMSGTOIDX.DAT", fido_msgpath);
  380.          fdto = sh_open (filename, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE);
  381.          lseek (fdto, (long)msgidx[msg_num] * 36L, SEEK_SET);
  382.          write (fdto, "\x0B* Deleted *                        ", 36);
  383.          close (fdto);
  384.  
  385.          close (fd);
  386.  
  387.          return (1);
  388.       }
  389.  
  390.       close (fd);
  391.    }
  392.    else {
  393.       sprintf (filename, "%sMSGHDR.BBS", fido_msgpath);
  394.       if ((fd = sh_open (filename, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE)) == -1)
  395.          return (0);
  396.  
  397.       lseek (fd, (long)sizeof (struct _msghdr) * msgidx[msg_num], SEEK_SET);
  398.       read (fd, (char *)&msgt, sizeof (struct _msghdr));
  399.  
  400.       if (!strnicmp (&msgt.whofrom[1], usr.name, msgt.whofrom[0]) || !strnicmp (&msgt.whoto[1], usr.name, msgt.whoto[0]) ||
  401.       !strnicmp (&msgt.whofrom[1], usr.handle, msgt.whofrom[0]) || !strnicmp (&msgt.whoto[1], usr.handle, msgt.whoto[0]) || usr.priv == SYSOP) {
  402.             msgt.msgattr |= Q_RECKILL;
  403. //            msgt.msgnum = 0;  NON TESTATO!
  404.          lseek (fd, (long)sizeof (struct _msghdr) * msgidx[msg_num], SEEK_SET);
  405.          write (fd, (char *)&msgt, sizeof (struct _msghdr));
  406.  
  407.          sprintf (filename, "%sMSGIDX.BBS", fido_msgpath);
  408.          fdidx = sh_open (filename, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE);
  409.          lseek (fdidx, (long)msgidx[msg_num] * sizeof (struct _msgidx), SEEK_SET);
  410.          read (fdidx, (char *)&idx, sizeof (struct _msgidx));
  411.             idx.msgnum = -1;
  412.             lseek (fdidx, (long)msgidx[msg_num] * sizeof (struct _msgidx), SEEK_SET);
  413.             write (fdidx, (char *)&idx, sizeof (struct _msgidx));
  414.             close (fdidx);
  415.  
  416.             sprintf (filename, "%sMSGTOIDX.BBS", fido_msgpath);
  417.             fdto = sh_open (filename, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE);
  418.             lseek (fdto, (long)msgidx[msg_num] * 36L, SEEK_SET);
  419.             write (fdto, "\x0B* Deleted *                        ", 36);
  420.             close (fdto);
  421.  
  422.             close (fd);
  423.  
  424.             return (1);
  425.         }
  426.  
  427.         close (fd);
  428.     }
  429.  
  430.    return (0);
  431. }
  432.  
  433. int quick_scan_messages (total, personal, board, start, fdi, fdp, totals, fpt, qwk, goldbase)
  434. int *total, *personal, board, start, fdi, fdp, totals;
  435. FILE *fpt;
  436. char qwk, goldbase;
  437. {
  438.    FILE *fp;
  439.    float in, out;
  440.    int i, tt, z, m, pos, blks, msgn, pr, fd;
  441.    char c, buff[130], wrp[130], qwkbuffer[130], shead;
  442.    byte tpbyte, lastr;
  443.    long qpos, bw_start;
  444.    struct QWKmsghd QWK;
  445.    struct _msghdr msgt;
  446.    struct _gold_msghdr gmsgt;
  447.  
  448.    tt = 0;
  449.    pr = 0;
  450.    shead = 0;
  451.  
  452.    if (start > last_msg) {
  453.       *personal = pr;
  454.       *total = tt;
  455.  
  456.       return (totals);
  457.    }
  458.  
  459.    sprintf (buff, goldbase ? "%sMSGHDR.DAT" : "%sMSGHDR.BBS", fido_msgpath);
  460.    fd = shopen (buff,O_RDONLY|O_BINARY);
  461.    if (fd == -1)
  462.       return (totals);
  463.  
  464.     sprintf (buff, goldbase ? "%sMSGTXT.DAT" : "%sMSGTXT.BBS",  fido_msgpath);
  465.    fp = fopen (buff,"rb");
  466.    if (fp == NULL) {
  467.       close (fd);
  468.       return (totals);
  469.    }
  470.    setvbuf (fp, NULL, _IOFBF, 1024);
  471.  
  472.    for (msgn = start; msgn <= last_msg; msgn++) {
  473.       if (!(msgn % 5))
  474.          display_percentage (msgn - start, last_msg - start);
  475.  
  476.       if (goldbase) {
  477.          lseek (fd, (long)sizeof (struct _gold_msghdr) * msgidx[msgn], SEEK_SET);
  478.          read (fd, (char *)&gmsgt, sizeof (struct _gold_msghdr));
  479.  
  480.          if (gmsgt.board != board)
  481.             continue;
  482.             if (gmsgt.msgattr & Q_RECKILL)
  483.             continue;
  484.          if ((gmsgt.msgattr & Q_PRIVATE) && stricmp (pascal_string (gmsgt.whofrom), usr.name) && stricmp (pascal_string (gmsgt.whoto), usr.name)
  485.          && stricmp (pascal_string (gmsgt.whofrom), usr.handle) && stricmp (pascal_string (gmsgt.whoto), usr.handle) && usr.priv < SYSOP)
  486.             continue;
  487.       }
  488.       else {
  489.          lseek (fd, (long)sizeof (struct _msghdr) * msgidx[msgn], SEEK_SET);
  490.          read (fd, (char *)&msgt, sizeof (struct _msghdr));
  491.  
  492.          if (msgt.board != board)
  493.             continue;
  494.             if (msgt.msgattr & Q_RECKILL)
  495.             continue;
  496.          if ((msgt.msgattr & Q_PRIVATE) && stricmp (pascal_string (msgt.whofrom), usr.name) && stricmp (pascal_string (msgt.whoto), usr.name) 
  497.          && stricmp (pascal_string (msgt.whofrom), usr.handle) && stricmp (pascal_string (msgt.whoto), usr.handle) && usr.priv < SYSOP)
  498.             continue;
  499.       }
  500.  
  501.       totals++;
  502.       if (qwk == 1 && fdi != -1) {
  503.          sprintf (buff, "%u", totals);   /* Stringized version of current position */
  504.          in = (float) atof (buff);
  505.          out = IEEToMSBIN (in);
  506.          write (fdi, &out, sizeof (float));
  507.  
  508.             c = 0;
  509.          write (fdi, &c, sizeof(char));              /* Conference # */
  510.       }
  511.       else if (qwk == 2) {
  512.          bw_start = ftell (fpt);
  513.          fputc (' ', fpt);
  514.       }
  515.  
  516.       if ((!goldbase && !stricmp (pascal_string (msgt.whoto), usr.name)) ||
  517.       (goldbase && !stricmp (pascal_string (gmsgt.whoto), usr.name))||
  518.       (!goldbase && !stricmp (pascal_string (msgt.whoto), usr.handle)) ||
  519.       (goldbase && !stricmp (pascal_string (gmsgt.whoto), usr.handle))) {
  520.          pr++;
  521.          if (fdp != -1 && qwk == 1 && fdi != -1) {
  522.              write (fdp, &out, sizeof (float));
  523.              write (fdp, &c, sizeof (char));              /* Conference # */
  524.          }
  525.       }
  526.  
  527.       if (goldbase)
  528.          fseek (fp, 256L * gmsgt.startblock, SEEK_SET);
  529.       else
  530.          fseek (fp, 256L * msgt.startblock, SEEK_SET);
  531.  
  532.       tpbyte = 0;
  533.       lastr = 255;
  534.       blks = 1;
  535.       pos = 0;
  536.       memset (qwkbuffer, ' ', 128);
  537.       i = 0;
  538.       shead = 0;
  539.  
  540.       for (;;) {
  541.          if (!tpbyte) {
  542.             if (lastr != 255)
  543.                break;
  544.             tpbyte = fgetc (fp);
  545.             lastr = tpbyte;
  546.             if (!tpbyte)
  547.                break;
  548.          }
  549.  
  550.          c = fgetc(fp);
  551.          tpbyte--;
  552.  
  553.          if (c == '\0')
  554.             break;
  555.  
  556.          if (c == 0x0A || c == '\0')
  557.             continue;
  558.  
  559.          buff[i++] = c;
  560.  
  561.          if (c == 0x0D || (byte)c == 0x8D) {
  562.             buff[i-1] = '\0';
  563.  
  564.             if (buff[0] == 0x01) {
  565.                if (!strncmp (&buff[1], "INTL",4) && !shead)
  566.                   sscanf (&buff[6], "%d:%d/%d %d:%d/%d", &msg_tzone, &i, &i, &msg_fzone, &i, &i);
  567.                if (!strncmp (&buff[1], "TOPT",4) && !shead)
  568.                   sscanf (&buff[6], "%d", &msg_tpoint);
  569.                if (!strncmp (&buff[1], "FMPT",4) && !shead)
  570.                   sscanf (&buff[6], "%d", &msg_fpoint);
  571.                i = 0;
  572.                continue;
  573.             }
  574.             else if (!shead) {
  575.                if (goldbase) {
  576.                   if (qwk == 1)
  577.                      gold_qwk_text_header (&gmsgt, msgn, fpt, &QWK, &qpos);
  578.                   else if (qwk == 0)
  579.                      gold_text_header (&gmsgt, msgn, fpt);
  580.                }
  581.                else {
  582.                   if (qwk == 1)
  583.                      quick_qwk_text_header (&msgt, msgn, fpt, &QWK, &qpos);
  584.                   else if (qwk == 0)
  585.                      quick_text_header (&msgt, msgn, fpt);
  586.                }
  587.                shead = 1;
  588.             }
  589.  
  590.             if (buff[0] == 0x01 || !strncmp (buff, "SEEN-BY", 7)) {
  591.                i = 0;
  592.                continue;
  593.             }
  594.  
  595.             if (qwk == 1) {
  596.                     write_qwk_string (buff, qwkbuffer, &pos, &blks, fpt);
  597.                write_qwk_string ("\r\n", qwkbuffer, &pos, &blks, fpt);
  598.             }
  599.             else
  600.                fprintf (fpt, "%s\n", buff);
  601.  
  602.             i = 0;
  603.          }
  604.          else {
  605.             if(i < (usr.width - 1))
  606.                continue;
  607.  
  608.             buff[i] = '\0';
  609.             while (i > 0 && buff[i] != ' ')
  610.                i--;
  611.  
  612.             m = 0;
  613.  
  614.             if(i != 0)
  615.                for(z=i+1;buff[z];z++)
  616.                   wrp[m++]=buff[z];
  617.  
  618.             buff[i]='\0';
  619.             wrp[m]='\0';
  620.  
  621.             if (!shead) {
  622.                if (goldbase) {
  623.                   if (qwk == 1)
  624.                      gold_qwk_text_header (&gmsgt, msgn, fpt, &QWK, &qpos);
  625.                   else if (qwk == 0)
  626.                      gold_text_header (&gmsgt, msgn, fpt);
  627.                }
  628.                else {
  629.                   if (qwk == 1)
  630.                      quick_qwk_text_header (&msgt, msgn, fpt, &QWK, &qpos);
  631.                   else if (qwk == 0)
  632.                      quick_text_header (&msgt, msgn, fpt);
  633.                }
  634.                shead = 1;
  635.             }
  636.  
  637.             if (qwk == 1) {
  638.                write_qwk_string (buff, qwkbuffer, &pos, &blks, fpt);
  639.                write_qwk_string ("\r\n", qwkbuffer, &pos, &blks, fpt);
  640.                 }
  641.             else
  642.                fprintf (fpt, "%s\n", buff);
  643.  
  644.             strcpy (buff, wrp);
  645.             i = strlen (buff);
  646.          }
  647.       }
  648.  
  649.       if (qwk == 1) {
  650.          qwkbuffer[128] = 0;
  651.          fwrite (qwkbuffer, 128, 1, fpt);
  652.          blks++;
  653.  
  654.          fseek (fpt, qpos, SEEK_SET);          /* Restore back to header start */
  655.          sprintf (buff, "%d", blks);
  656.          ljstring (QWK.Msgrecs, buff, 6);
  657.          fwrite ((char *)&QWK, 128, 1, fpt);           /* Write out the header */
  658.          fseek (fpt, 0L, SEEK_END);               /* Bump back to end of file */
  659.       }
  660.       else if (qwk == 2) {
  661.          if (goldbase)
  662.             gold_bluewave_text_header (&gmsgt, msgn, fdi, bw_start, ftell (fpt) - bw_start);
  663.          else
  664.             quick_bluewave_text_header (&msgt, msgn, fdi, bw_start, ftell (fpt) - bw_start);
  665.       }
  666.       else
  667.          fprintf (fpt, bbstxt[B_TWO_CR]);
  668.  
  669.       tt++;
  670.       totals += blks - 1;
  671.    }
  672.  
  673.    fclose (fp);
  674.    close (fd);
  675.  
  676.    *personal = pr;
  677.    *total = tt;
  678.  
  679.    return (totals);
  680. }
  681.  
  682. int quick_save_message2 (txt, f1, f2, f3, f4)
  683. FILE *txt, *f1, *f2, *f3, *f4;
  684. {
  685.     FILE *fp;
  686.     word i, dest, m, nb, x, hh, mm, dd, mo, aa;
  687.     char text[258], buffer[258];
  688.     long gdest;
  689.     struct _msgidx idx;
  690.     struct _msghdr hdr;
  691.     struct _msgtoidx toidx;
  692.     struct _gold_msgidx gidx;
  693.     struct _gold_msghdr ghdr;
  694.  
  695.     memset ((char *)&toidx, 0, sizeof (struct _msgtoidx));
  696.  
  697.     memcpy (&toidx.string[1], msg.to, strlen (msg.to));
  698.     toidx.string[0] = strlen (msg.to);
  699.     if (fwrite ((char *)&toidx, sizeof (struct _msgtoidx), 1, f2) != 1)
  700.         return (0);
  701.  
  702.     if (sys.gold_board) {
  703.       memset ((char *)&gidx, 0, sizeof (struct _gold_msgidx));
  704.       memset ((char *)&ghdr, 0, sizeof (struct _gold_msghdr));
  705.  
  706.       gdest = gmsginfo.highmsg + 1;
  707.       if (gmsginfo.highmsg > gdest) {
  708.             status_line ("!Gold-base exceeds msgnum limit");
  709.             return (0);
  710.         }
  711.  
  712.         gidx.msgnum = gdest;
  713.         gidx.board = sys.gold_board;
  714.         if (fwrite ((char *)&gidx, sizeof (struct _gold_msgidx), 1, f1) != 1)
  715.             return (0);
  716.     }
  717.     else {
  718.         memset ((char *)&idx, 0, sizeof (struct _msgidx));
  719.         memset ((char *)&hdr, 0, sizeof (struct _msghdr));
  720.  
  721.         dest = msginfo.highmsg + 1;
  722.         if (msginfo.highmsg == 65535U) {
  723.             status_line ("!Hudson-base exceeds 65535 messages");
  724.             return (0);
  725.         }
  726.  
  727.         idx.msgnum = dest;
  728.         idx.board = sys.quick_board;
  729.         if (fwrite ((char *)&idx, sizeof (struct _msgidx), 1, f1) != 1){
  730.             status_line("!Problems with quick msgidx file");
  731.             return (0);
  732.         }
  733.     }
  734.  
  735.     fp = f3;
  736.  
  737.     if (sys.gold_board)
  738.         ghdr.startblock = ftell (fp) / 256L;
  739.     else {
  740.         i = (word)(ftell (fp) / 256L);
  741.         hdr.startblock = i;
  742.     }
  743.  
  744.     i = 0;
  745.     m = 1;
  746.     nb = 1;
  747.  
  748.     memset (text, 0, 256);
  749.  
  750.     do {
  751.         memset (buffer, 0, 256);
  752.         i = mread (buffer, 1, 255, txt);
  753.         for (x = 0; x < i; x++) {
  754.             if (buffer[x] == 0x1A)
  755.                 buffer[x] = ' ';
  756.         }
  757.         buffer[i] = '\0';
  758.         write_pascal_string (buffer, text, &m, &nb, fp);
  759.     } while (i == 255);
  760.  
  761.     *text = m - 1;
  762.     if (fwrite (text, 256, 1, fp) != 1)
  763.         return (0);
  764.  
  765.     if (sys.public)
  766.         msg.attr &= ~MSGPRIVATE;
  767.     else if (sys.private)
  768.         msg.attr |= MSGPRIVATE;
  769.  
  770.     sscanf (msg.date, "%2d %3s %2d %2d:%2d", &dd, buffer, &aa, &hh, &mm);
  771.     buffer[3] = '\0';
  772.     for (mo = 0; mo < 12; mo++) {
  773.         if (!stricmp (buffer, mtext[mo]))
  774.             break;
  775.     }
  776.     if (mo == 12)
  777.         mo = 0;
  778.  
  779.     if (sys.gold_board) {
  780.         ghdr.numblocks = nb;
  781.         ghdr.msgnum = gdest;
  782.         ghdr.prevreply = msg.reply;
  783.         ghdr.nextreply = msg.up;
  784.         ghdr.timesread = 0;
  785.         ghdr.destnet = msg.dest_net;
  786.         ghdr.destnode = msg.dest;
  787.         ghdr.orignet = msg.orig_net;
  788.         ghdr.orignode = msg.orig;
  789.         ghdr.destzone = msg_tzone;
  790.         ghdr.origzone = msg_fzone;
  791.         ghdr.cost = msg.cost;
  792.  
  793.         if (msg.attr & MSGPRIVATE)
  794.             ghdr.msgattr |= Q_PRIVATE;
  795.  
  796.         if (sys.echomail && (msg.attr & MSGSENT))
  797.          ghdr.msgattr &= ~Q_LOCAL;
  798.       else {
  799.          ghdr.msgattr &= ~Q_LOCAL;
  800.          ghdr.msgattr |= 32;
  801.       }
  802.  
  803.       ghdr.board = sys.gold_board;
  804.       sprintf (&ghdr.time[1], "%02d:%02d", hh, mm);
  805.       sprintf (&ghdr.date[1], "%02d-%02d-%02d", mo + 1, dd, aa);
  806.       ghdr.time[0] = 5;
  807.       ghdr.date[0] = 8;
  808.  
  809.       memcpy (&ghdr.whoto[1], msg.to, strlen (msg.to));
  810.       ghdr.whoto[0] = strlen (msg.to);
  811.       memcpy (&ghdr.whofrom[1], msg.from, strlen (msg.from));
  812.       ghdr.whofrom[0] = strlen (msg.from);
  813.       memcpy (&ghdr.subject[1], msg.subj, strlen (msg.subj));
  814.       ghdr.subject[0] = strlen (msg.subj);
  815.  
  816.       gmsginfo.totalonboard[sys.gold_board - 1]++;
  817.       gmsginfo.totalmsgs++;
  818.         gmsginfo.highmsg++;
  819.  
  820.       if (fwrite ((char *)&ghdr, sizeof (struct _gold_msghdr), 1, f4) != 1)
  821.          return (0);
  822.    }
  823.    else {
  824.       hdr.numblocks = nb;
  825.         hdr.msgnum = dest;
  826.       hdr.prevreply = msg.reply;
  827.       hdr.nextreply = msg.up;
  828.       hdr.timesread = 0;
  829.       hdr.destnet = msg.dest_net;
  830.       hdr.destnode = msg.dest;
  831.       hdr.orignet = msg.orig_net;
  832.       hdr.orignode = msg.orig;
  833.       hdr.destzone = msg_tzone;
  834.       hdr.origzone = msg_fzone;
  835.       hdr.cost = msg.cost;
  836.  
  837.       if (msg.attr & MSGPRIVATE)
  838.          hdr.msgattr |= Q_PRIVATE;
  839.  
  840.       if (sys.echomail && (msg.attr & MSGSENT))
  841.          hdr.msgattr &= ~Q_LOCAL;
  842.       else {
  843.          hdr.msgattr &= ~Q_LOCAL;
  844.          hdr.msgattr |= 32;
  845.       }
  846.  
  847.       hdr.board = sys.quick_board;
  848.       sprintf (&hdr.time[1], "%02d:%02d", hh, mm);
  849.       sprintf (&hdr.date[1], "%02d-%02d-%02d", mo + 1, dd, aa);
  850.       hdr.time[0] = 5;
  851.       hdr.date[0] = 8;
  852.  
  853.       memcpy (&hdr.whoto[1], msg.to, strlen (msg.to));
  854.       hdr.whoto[0] = strlen (msg.to);
  855.       memcpy (&hdr.whofrom[1], msg.from, strlen (msg.from));
  856.       hdr.whofrom[0] = strlen (msg.from);
  857.       memcpy (&hdr.subject[1], msg.subj, strlen (msg.subj));
  858.       hdr.subject[0] = strlen (msg.subj);
  859.  
  860.       msginfo.totalonboard[sys.quick_board - 1]++;
  861.       msginfo.totalmsgs++;
  862.         msginfo.highmsg++;
  863.  
  864.       if (fwrite ((char *)&hdr, sizeof (struct _msghdr), 1, f4) != 1)
  865.          return (0);
  866.  
  867.       if ((int)(65536L - hdr.startblock) < hdr.numblocks) {
  868.          status_line ("!Hudson-base exceeds MSGTXT size limit");
  869.          return (0);
  870.       }
  871.    }
  872.  
  873.    last_msg++;
  874.  
  875.    return (1);
  876. }
  877.  
  878. int quick_export_mail (maxnodes, forward, goldbase)
  879. int maxnodes;
  880. struct _fwrd *forward;
  881. int goldbase;
  882. {
  883.     FILE *fpd, *f2, *fp;
  884.     int finfo, f1, i, pp, z, fd, ne, no, m, n_seen, cnet, cnode, mi, sent;
  885.     int ai, last_board, fdmsg;
  886.     char buff[80], wrp[80], c, found, *p, buffer[2050];
  887.     char *location, *tag, *forw, need_origin, need_seen, *flag;
  888.     byte tpbyte, lastr;
  889.     unsigned short quick_msgexp;
  890.     long gold_msgexp;
  891.     struct _msghdr msghdr;
  892.     struct _msghdr2 mhdr;
  893.     struct _fwrd *seen;
  894.     struct _gold_msghdr gmsghdr;
  895.  
  896.     if (goldbase) {
  897.         sprintf (buff, "%sMSGINFO.DAT", fido_msgpath);
  898.         finfo = sh_open (buff, SH_DENYWR, O_RDWR|O_BINARY, S_IREAD|S_IWRITE);
  899.         if (finfo == -1)
  900.             return (maxnodes);
  901.         read (finfo, (char *)&gmsginfo, sizeof (struct _gold_msginfo));
  902.  
  903.         sprintf(buff, "%sMSGHDR.DAT", fido_msgpath);
  904.         f1 = sh_open (buff, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE);
  905.         if (f1 == -1) {
  906.             close (finfo);
  907.             return (maxnodes);
  908.         }
  909.  
  910.         gmsginfo.totalmsgs = (long)(filelength (f1) / sizeof (struct _gold_msghdr));
  911.  
  912.         sprintf (buff, "%sMSGTXT.DAT", fido_msgpath);
  913.     }
  914.     else {
  915.         sprintf (buff, "%sMSGINFO.BBS", fido_msgpath);
  916.         finfo = sh_open (buff, SH_DENYWR, O_RDWR|O_BINARY, S_IREAD|S_IWRITE);
  917.         if(finfo == -1)
  918.             return (maxnodes);
  919.         read (finfo, (char *)&msginfo, sizeof (struct _msginfo));
  920.  
  921.         sprintf(buff, "%sMSGHDR.BBS", fido_msgpath);
  922.         f1 = sh_open(buff, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE);
  923.         if (f1 == -1) {
  924.             close (finfo);
  925.             return (maxnodes);
  926.         }
  927.  
  928.         msginfo.totalmsgs = (word)(filelength (f1) / sizeof (struct _msghdr));
  929.  
  930.         sprintf (buff, "%sMSGTXT.BBS", fido_msgpath);
  931.     }
  932.  
  933.     i = sh_open (buff, SH_DENYNONE, O_RDONLY|O_BINARY, S_IREAD|S_IWRITE);
  934.     if (i == -1) {
  935.         close (f1);
  936.         close (finfo);
  937.         return (maxnodes);
  938.     }
  939.     f2 = fdopen (i,"rb");
  940.    if (f2 == NULL) {
  941.       close (i);
  942.       close (f1);
  943.       close (finfo);
  944.       return (maxnodes);
  945.    }
  946.    setvbuf (f2, NULL, _IOFBF, 1024);
  947.  
  948.    sprintf (buff, SYSMSG_PATH, config->sys_path);
  949.    fd = sh_open (buff, SH_DENYNONE, O_RDONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE);
  950.    if (fd == -1) {
  951.       close (f1);
  952.       fclose (f2);
  953.       close (finfo);
  954.       return (maxnodes);
  955.    }
  956.  
  957.    if (config->use_areasbbs)
  958.       fp = fopen (config->areas_bbs, "rt");
  959.    else
  960.       fp = NULL;
  961.  
  962.    last_board = 0;
  963.    seen = (struct _fwrd *)malloc ((MAX_EXPORT_SEEN + 1) * sizeof (struct _fwrd));
  964.    if (seen == NULL) {
  965.       close (f1);
  966.       fclose (f2);
  967.       close (fd);
  968.         close (finfo);
  969.       if (fp != NULL)
  970.          fclose (fp);
  971.       return (maxnodes);
  972.    }
  973.  
  974.    fpd = fopen ("MSGTMP.EXP", "rb+");
  975.    if (fpd == NULL) {
  976.       fpd = fopen ("MSGTMP.EXP", "wb");
  977.       fclose (fpd);
  978.    }
  979.    else
  980.       fclose (fpd);
  981.    fpd = mopen ("MSGTMP.EXP", "r+b");
  982.  
  983.     prints (7, 65, YELLOW|_BLACK, "              ");
  984.    prints (8, 65, YELLOW|_BLACK, "N/A           ");
  985.    prints (9, 65, YELLOW|_BLACK, "              ");
  986.    prints (9, 65, YELLOW|_BLACK, goldbase ? "GoldBase" : "QuickBBS");
  987.  
  988.    sent = 0;
  989.  
  990.    if (goldbase) {
  991.       sprintf (buff, "%sECHOMAIL.DAT", fido_msgpath);
  992.       fdmsg = sh_open (buff, SH_DENYRW, O_RDONLY|O_BINARY, S_IREAD|S_IWRITE);
  993.    }
  994.    else {
  995.       sprintf (buff, "%sECHOMAIL.BBS", fido_msgpath);
  996.       fdmsg = sh_open (buff, SH_DENYRW, O_RDONLY|O_BINARY, S_IREAD|S_IWRITE);
  997.    }
  998.  
  999.    for (;;) {
  1000.       if (goldbase) {
  1001.          if (fdmsg != -1) {
  1002.             if (read (fdmsg, &gold_msgexp, sizeof (long)) != sizeof (long))
  1003.                break;
  1004.             lseek (f1, gold_msgexp * sizeof (struct _gold_msghdr), SEEK_SET);
  1005.          }
  1006.  
  1007.          if (read (f1, (char *)&gmsghdr, sizeof (struct _gold_msghdr)) != sizeof (struct _gold_msghdr))
  1008.             break;
  1009.             sprintf (wrp, "%ld / %ld", gmsghdr.msgnum, gmsginfo.totalmsgs);
  1010.  
  1011.             if ( !(gmsghdr.msgnum % 60) )
  1012.                 time_release ();
  1013.       }
  1014.       else {
  1015.          if (fdmsg != -1) {
  1016.             if (read (fdmsg, &quick_msgexp, sizeof (unsigned short)) != sizeof (unsigned short))
  1017.                break;
  1018.             lseek (f1, (long)quick_msgexp * sizeof (struct _msghdr), SEEK_SET);
  1019.          }
  1020.  
  1021.          if (read (f1, (char *)&msghdr, sizeof (struct _msghdr)) != sizeof (struct _msghdr))
  1022.             break;
  1023.             sprintf (wrp, "%d / %d", msghdr.msgnum, msginfo.totalmsgs);
  1024.  
  1025.             if ( !(msghdr.msgnum % 60) )
  1026.             time_release ();
  1027.         }
  1028.  
  1029.       prints (7, 65, YELLOW|_BLACK, wrp);
  1030.  
  1031.       if (goldbase) {
  1032.          if ( !(gmsghdr.msgattr & 32) )
  1033.             continue;
  1034.             if (gmsghdr.msgattr & Q_RECKILL)
  1035.             continue;
  1036.       }
  1037.       else {
  1038.          if ( !(msghdr.msgattr & 32) )
  1039.             continue;
  1040.             if (msghdr.msgattr & Q_RECKILL)
  1041.             continue;
  1042.       }
  1043.  
  1044.       if ((!goldbase && msghdr.board != last_board) || (goldbase && gmsghdr.board != last_board)) {
  1045.          if (sent && last_board) {
  1046.             status_line (":   %-20.20s (Sent=%04d)", sys.echotag, sent);
  1047.             sent = 0;
  1048.          }
  1049.  
  1050.          last_board = goldbase ? gmsghdr.board : msghdr.board;
  1051.          memset ((char *)&sys, 0, sizeof (struct _sys));
  1052.          found = 0;
  1053.  
  1054.          if (fp != NULL) {
  1055.             rewind (fp);
  1056.                 fgets (buffer, 255, fp);
  1057.  
  1058.             while (fgets(buffer, 255, fp) != NULL) {
  1059.                if (buffer[0] == ';' || !isdigit (buffer[0]))
  1060.                   continue;
  1061.                while (buffer[strlen (buffer) -1] == 0x0D || buffer[strlen (buffer) -1] == 0x0A || buffer[strlen (buffer) -1] == ' ')
  1062.                   buffer[strlen (buffer) -1] = '\0';
  1063.                location = strtok (buffer, " ");
  1064.                tag = strtok (NULL, " ");
  1065.                forw = strtok (NULL, "");
  1066.  
  1067.                if ((!goldbase && atoi (location) == msghdr.board) || (!goldbase && atoi (location) == gmsghdr.board)) {
  1068.                   while (*forw == ' ')
  1069.                      forw++;
  1070.                   memset ((char *)&sys, 0, sizeof (struct _sys));
  1071.                         strcpy (sys.echotag, tag);
  1072.                   if (forw != NULL)
  1073.                      strcpy (sys.forward1, forw);
  1074.                   if (goldbase)
  1075.                      sys.gold_board = atoi (location);
  1076.                   else
  1077.                      sys.quick_board = atoi (location);
  1078.                   sys.echomail = 1;
  1079.                   sys.use_alias = 0;
  1080.                   found = 1;
  1081.                   break;
  1082.                }
  1083.             }
  1084.          }
  1085.  
  1086.          if (!found) {
  1087.             for (i = 0; i < maxaidx; i++) {
  1088.                if (goldbase) {
  1089.                   if (aidx[i].gold_board == gmsghdr.board)
  1090.                      break;
  1091.                }
  1092.                else {
  1093.                   if (aidx[i].board == msghdr.board)
  1094.                      break;
  1095.                }
  1096.             }
  1097.  
  1098.             if (i < maxaidx) {
  1099.                lseek (fd, (long)i * SIZEOF_MSGAREA, SEEK_SET);
  1100.                     read (fd, (char *)&sys.msg_name, SIZEOF_MSGAREA);
  1101.                found = 1;
  1102.             }
  1103.          }
  1104.  
  1105.          if (!found)
  1106.             continue;
  1107.  
  1108.             for (i = 0; i < maxnodes; i++)
  1109.                 forward[i].receiveonly = forward[i].sendonly = forward[i].passive = forward[i].private = forward[i].reset = forward[i].export = 0;
  1110.  
  1111.          z = config->alias[sys.use_alias].zone;
  1112.          ne = config->alias[sys.use_alias].net;
  1113.          no = config->alias[sys.use_alias].node;
  1114.          pp = 0;
  1115.  
  1116.          p = strtok (sys.forward1, " ");
  1117.          if (p != NULL)
  1118.             do {
  1119.                flag = p;
  1120.                while (*p == '<' || *p == '>' || *p == '!'||*p=='p'||*p=='P')
  1121.                   p++;
  1122.                parse_netnode2 (p, &z, &ne, &no, &pp);
  1123.                for (i = 0; i < MAX_ALIAS; i++) {
  1124.                   if (config->alias[i].net == 0)
  1125.                      continue;
  1126.                   if (config->alias[i].zone == z && config->alias[i].net == ne && config->alias[i].node == no && config->alias[i].point == pp)
  1127.                      break;
  1128.                   if (config->alias[i].point && config->alias[i].fakenet) {
  1129.                      if (config->alias[i].zone == z && config->alias[i].fakenet == ne && config->alias[i].point == no)
  1130.                         break;
  1131.                   }
  1132.                }
  1133.                if (i < MAX_ALIAS && config->alias[i].net)
  1134.                   continue;
  1135.                if ((i = is_here (z, ne, no, pp, forward, maxnodes)) != -1)
  1136.                   forward[i].reset = forward[i].export = 1;
  1137.                else {
  1138.                   i = maxnodes;
  1139.                   forward[maxnodes].zone = z;
  1140.                   forward[maxnodes].net = ne;
  1141.                   forward[maxnodes].node = no;
  1142.                   forward[maxnodes].point = pp;
  1143.                   forward[maxnodes].export = 1;
  1144.                         forward[maxnodes].reset = 1;
  1145.                   maxnodes++;
  1146.                }
  1147.                forward[i].receiveonly = forward[i].sendonly = forward[i].passive = forward[i].private = 0;
  1148.                while (*flag == '<' || *flag == '>' || *flag =='!'||*flag=='P'||*flag=='p') {
  1149.                   if (*flag == '>')
  1150.                      forward[i].receiveonly = 1;
  1151.                   if (*flag == '<')
  1152.                      forward[i].sendonly = 1;
  1153.                   if (*flag == '!')
  1154.                      forward[i].passive = 1;                  
  1155.                   if (*flag =='p'||*flag=='P')
  1156.                      forward[i].private = 1;
  1157.                   flag++;
  1158.                }
  1159.                 } while ((p = strtok (NULL, " ")) != NULL);
  1160.  
  1161.          z = config->alias[sys.use_alias].zone;
  1162.          ne = config->alias[sys.use_alias].net;
  1163.          no = config->alias[sys.use_alias].node;
  1164.          pp = 0;
  1165.  
  1166.          p = strtok (sys.forward2, " ");
  1167.          if (p != NULL)
  1168.             do {
  1169.                flag = p;
  1170.                while (*p == '<' || *p == '>' || *p == '!'||*p=='p'||*p=='P')
  1171.                   p++;
  1172.                parse_netnode2 (p, &z, &ne, &no, &pp);
  1173.                for (i = 0; i < MAX_ALIAS; i++) {
  1174.                   if (config->alias[i].net == 0)
  1175.                      continue;
  1176.                   if (config->alias[i].zone == z && config->alias[i].net == ne && config->alias[i].node == no && config->alias[i].point == pp)
  1177.                      break;
  1178.                   if (config->alias[i].point && config->alias[i].fakenet) {
  1179.                      if (config->alias[i].zone == z && config->alias[i].fakenet == ne && config->alias[i].point == no)
  1180.                         break;
  1181.                   }
  1182.                }
  1183.                if (i < MAX_ALIAS && config->alias[i].net)
  1184.                   continue;
  1185.                if ((i = is_here (z, ne, no, pp, forward, maxnodes)) != -1)
  1186.                   forward[i].reset = forward[i].export = 1;
  1187.                else {
  1188.                         i = maxnodes;
  1189.                   forward[maxnodes].zone = z;
  1190.                   forward[maxnodes].net = ne;
  1191.                   forward[maxnodes].node = no;
  1192.                   forward[maxnodes].point = pp;
  1193.                   forward[maxnodes].export = 1;
  1194.                   forward[maxnodes].reset = 1;
  1195.                   maxnodes++;
  1196.                }                            
  1197.                forward[i].receiveonly = forward[i].sendonly = forward[i].passive = forward[i].private = 0;
  1198.                while (*flag == '<' || *flag == '>' || *flag =='!'||*flag=='P'||*flag=='p') {
  1199.                   if (*flag == '>')
  1200.                      forward[i].receiveonly = 1;
  1201.                   if (*flag == '<')
  1202.                      forward[i].sendonly = 1;
  1203.                         if (*flag == '!')
  1204.                      forward[i].passive = 1;                  
  1205.                   if (*flag =='p'||*flag=='P')
  1206.                      forward[i].private = 1;
  1207.                   flag++;
  1208.                }
  1209.                
  1210.             } while ((p = strtok (NULL, " ")) != NULL);
  1211.  
  1212.          z = config->alias[sys.use_alias].zone;
  1213.          ne = config->alias[sys.use_alias].net;
  1214.          no = config->alias[sys.use_alias].node;
  1215.          pp = 0;
  1216.  
  1217.          p = strtok (sys.forward3, " ");
  1218.          if (p != NULL)
  1219.             do {
  1220.                flag = p;
  1221.                while (*p == '<' || *p == '>' || *p == '!'||*p=='p'||*p=='P')
  1222.                   p++;
  1223.                parse_netnode2 (p, &z, &ne, &no, &pp);
  1224.                for (i = 0; i < MAX_ALIAS; i++) {
  1225.                   if (config->alias[i].net == 0)
  1226.                      continue;
  1227.                   if (config->alias[i].zone == z && config->alias[i].net == ne && config->alias[i].node == no && config->alias[i].point == pp)
  1228.                      break;
  1229.                   if (config->alias[i].point && config->alias[i].fakenet) {
  1230.                      if (config->alias[i].zone == z && config->alias[i].fakenet == ne && config->alias[i].point == no)
  1231.                         break;
  1232.                         }
  1233.                }
  1234.                if (i < MAX_ALIAS && config->alias[i].net)
  1235.                   continue;
  1236.                if ((i = is_here (z, ne, no, pp, forward, maxnodes)) != -1)
  1237.                   forward[i].reset = forward[i].export = 1;
  1238.                else {
  1239.                         i = maxnodes;
  1240.                         forward[maxnodes].zone = z;
  1241.                         forward[maxnodes].net = ne;
  1242.                         forward[maxnodes].node = no;
  1243.                         forward[maxnodes].point = pp;
  1244.                         forward[maxnodes].export = 1;
  1245.                         forward[maxnodes].reset = 1;
  1246.                         maxnodes++;
  1247.                     }
  1248.                     forward[i].receiveonly = forward[i].sendonly = forward[i].passive = forward[i].private = 0;
  1249.                     while (*flag == '<' || *flag == '>' || *flag =='!'||*flag=='P'||*flag=='p') {
  1250.                         if (*flag == '>')
  1251.                             forward[i].receiveonly = 1;
  1252.                         if (*flag == '<')
  1253.                             forward[i].sendonly = 1;
  1254.                         if (*flag == '!')
  1255.                             forward[i].passive = 1;
  1256.                         if (*flag =='p'||*flag=='P')
  1257.                             forward[i].private = 1;
  1258.                         flag++;
  1259.                     }
  1260.                 } while ((p = strtok (NULL, " ")) != NULL);
  1261.         }
  1262.         else if (!found)
  1263.             continue;
  1264.  
  1265.         for (i = 0; i < maxnodes; i++)
  1266.             if (forward[i].reset)
  1267.                 forward[i].export = 1;
  1268.  
  1269.         for (i=0;i<maxnodes;i++) {
  1270.             if (forward[i].passive||forward[i].sendonly) forward[i].export=0;
  1271.             if (forward[i].private) {
  1272.  
  1273.                 char dest[40];
  1274.                 int ii;
  1275.  
  1276.                 forward[i].export=0;
  1277.                 if (!nametable) continue;
  1278.  
  1279.                 if(goldbase) strncpy(dest,pascal_string(gmsghdr.whoto),36);
  1280.                 else strncpy(dest,pascal_string(msghdr.whoto),36);
  1281.                 for(ii=0;ii<nodes_num;ii++) {
  1282.                     if (forward[i].zone==nametable[ii].zone&&
  1283.                          forward[i].net==nametable[ii].net&&
  1284.                          forward[i].node==nametable[ii].node&&
  1285.                          forward[i].point==nametable[ii].point&&
  1286.                          !stricmp(dest,nametable[ii].name)) {
  1287.                              forward[i].export=1;
  1288.                              break;
  1289.                     }
  1290.                 }
  1291.             }
  1292.  
  1293.  
  1294.         }
  1295.  
  1296.         need_seen = need_origin = 1;
  1297.  
  1298.         strcpy (wrp, sys.echotag);
  1299.         wrp[14] = '\0';
  1300.         prints (8, 65, YELLOW|_BLACK, "              ");
  1301.         prints (8, 65, YELLOW|_BLACK, wrp);
  1302.  
  1303.         mseek (fpd, 0L, SEEK_SET);
  1304.         mprintf (fpd, "AREA:%s\r\n", sys.echotag);
  1305.  
  1306.         if (goldbase) {
  1307.             sprintf (wrp, "%5ld  %-22.22s %s     ", gmsghdr.msgnum, sys.echotag, "GoldBase");
  1308.             fseek (f2, 256L * gmsghdr.startblock, SEEK_SET);
  1309.         }
  1310.         else {
  1311.             sprintf (wrp, "%5d  %-22.22s %s     ", msghdr.msgnum, sys.echotag, "QuickBBS");
  1312.             fseek (f2, 256L * msghdr.startblock, SEEK_SET);
  1313.         }
  1314.  
  1315.         wputs (wrp);
  1316.  
  1317.         mi = i = 0;
  1318.         tpbyte = 0;
  1319.         lastr = 255;
  1320.         n_seen = 0;
  1321.  
  1322.         for (;;) {
  1323.             if (!tpbyte) {
  1324.                 if (lastr != 255)
  1325.                     break;
  1326.                 tpbyte = fgetc (f2);
  1327.                 lastr = tpbyte;
  1328.                 if (!tpbyte)
  1329.                     break;
  1330.             }
  1331.  
  1332.             c = fgetc (f2);
  1333.             tpbyte--;
  1334.  
  1335.             if (c == '\0')
  1336.                 break;
  1337.  
  1338.             if (c == 0x0A)
  1339.                 continue;
  1340.             if ((byte)c == 0x8D)
  1341.                 c = ' ';
  1342.  
  1343.             buff[mi++] = c;
  1344.  
  1345.             if (c == 0x0D) {
  1346.                 buff[mi - 1]='\0';
  1347.                 if (!strncmp (buff, msgtxt[M_ORIGIN_LINE], 11))
  1348.                     need_origin = 0;
  1349.  
  1350.                 if (!strncmp (buff, "SEEN-BY: ", 9)) {
  1351.                     if (need_origin) {
  1352.                         mprintf (fpd, msgtxt[M_TEAR_LINE],VERSION, registered ? "+" : NOREG);
  1353.                         if (strlen(sys.origin))
  1354.                             mprintf(fpd,msgtxt[M_ORIGIN_LINE],random_origins(),config->alias[sys.use_alias].zone,config->alias[sys.use_alias].net,config->alias[sys.use_alias].node, config->alias[sys.use_alias].point);
  1355.                         else
  1356.                             mprintf(fpd,msgtxt[M_ORIGIN_LINE],system_name,config->alias[sys.use_alias].zone,config->alias[sys.use_alias].net,config->alias[sys.use_alias].node, config->alias[sys.use_alias].point);
  1357.                         need_origin = 0;
  1358.                     }
  1359.  
  1360.                     p = strtok (buff, " ");
  1361.                     ne = config->alias[sys.use_alias].net;
  1362.                     no = config->alias[sys.use_alias].node;
  1363.                     pp = config->alias[sys.use_alias].point;
  1364.                     z = config->alias[sys.use_alias].zone;
  1365.  
  1366.                     while ((p = strtok (NULL, " ")) != NULL) {
  1367.                         parse_netnode2 (p, &z, &ne, &no, &pp);
  1368.  
  1369.                         seen[n_seen].net = ne;
  1370.                         seen[n_seen].node = no;
  1371.                         seen[n_seen].point = pp;
  1372.                         seen[n_seen].zone = z;
  1373.  
  1374.                         for (i = 0; i < maxnodes; i++) {
  1375.                             if (forward[i].net == seen[n_seen].net && forward[i].node == seen[n_seen].node && forward[i].point == seen[n_seen].point) {
  1376.                                 forward[i].export = 0;
  1377.                                 break;
  1378.                             }
  1379.                         }
  1380.  
  1381.                         if (n_seen + maxnodes >= MAX_EXPORT_SEEN)
  1382.                             continue;
  1383.  
  1384.                         if (seen[n_seen].net != config->alias[sys.use_alias].fakenet && !seen[n_seen].point)
  1385.                             n_seen++;
  1386.                     }
  1387.                 }
  1388.                 else if (!strncmp (buff, "\001PATH: ", 7) && need_seen) {
  1389.                     if (need_origin) {
  1390.                         mprintf (fpd, msgtxt[M_TEAR_LINE],VERSION, registered ? "+" : NOREG);
  1391.                         if (strlen(sys.origin))
  1392.                             mprintf(fpd,msgtxt[M_ORIGIN_LINE],random_origins(),config->alias[sys.use_alias].zone,config->alias[sys.use_alias].net,config->alias[sys.use_alias].node, config->alias[sys.use_alias].point);
  1393.                         else
  1394.                             mprintf(fpd,msgtxt[M_ORIGIN_LINE],system_name,config->alias[sys.use_alias].zone,config->alias[sys.use_alias].net,config->alias[sys.use_alias].node, config->alias[sys.use_alias].point);
  1395.                         need_origin = 0;
  1396.                     }
  1397.  
  1398.                     if (!config->alias[sys.use_alias].point) {
  1399.                         seen[n_seen].net = config->alias[sys.use_alias].net;
  1400.                         seen[n_seen++].node = config->alias[sys.use_alias].node;
  1401.                     }
  1402.                     else if (config->alias[sys.use_alias].fakenet) {
  1403.                         seen[n_seen].net = config->alias[sys.use_alias].fakenet;
  1404.                         seen[n_seen++].node = config->alias[sys.use_alias].point;
  1405.                     }
  1406.  
  1407.                     for (i = 0; i < maxnodes; i++) {
  1408.                         if (!forward[i].export || forward[i].net == config->alias[sys.use_alias].fakenet || forward[i].point)
  1409.                             continue;
  1410.                         seen[n_seen].net = forward[i].net;
  1411.                         seen[n_seen++].node = forward[i].node;
  1412.  
  1413.                         ai = sys.use_alias;
  1414.                         for (m = 0; m < maxakainfo; m++)
  1415.                             if (akainfo[m].zone == forward[i].zone && akainfo[m].net == forward[i].net && akainfo[m].node == forward[i].node && akainfo[m].point == forward[i].point) {
  1416.                                 if (akainfo[m].aka)
  1417.                                     ai = akainfo[m].aka - 1;
  1418.                                 break;
  1419.                             }
  1420.                         if (ai != sys.use_alias) {
  1421.                             if (!config->alias[ai].point) {
  1422.                                 if (config->alias[ai].net != seen[n_seen - 1].net || config->alias[ai].node != seen[n_seen - 1].node) {
  1423.                                     seen[n_seen].net = config->alias[ai].net;
  1424.                                     seen[n_seen++].node = config->alias[ai].node;
  1425.                                 }
  1426.                             }
  1427.                             else if (config->alias[ai].fakenet) {
  1428.                                 if (config->alias[ai].fakenet != seen[n_seen - 1].net || config->alias[ai].point != seen[n_seen - 1].node) {
  1429.                                     seen[n_seen].net = config->alias[ai].fakenet;
  1430.                                     seen[n_seen++].node = config->alias[ai].point;
  1431.                                 }
  1432.                             }
  1433.                         }
  1434.                     }
  1435.  
  1436.                     qsort (seen, n_seen, sizeof (struct _fwrd), mail_sort_func);
  1437.  
  1438.                     cnet = cnode = 0;
  1439.                     strcpy (wrp, "SEEN-BY: ");
  1440.  
  1441.                     for (i = 0; i < n_seen; i++) {
  1442.                         if (strlen (wrp) > 65) {
  1443.                             mprintf (fpd, "%s\r\n", wrp);
  1444.                             cnet = cnode = 0;
  1445.                             strcpy (wrp, "SEEN-BY: ");
  1446.                         }
  1447.                         if (i && seen[i].net == seen[i - 1].net && seen[i].node == seen[i - 1].node)
  1448.                             continue;
  1449.  
  1450.                         if (cnet != seen[i].net) {
  1451.                             sprintf (buffer, "%d/%d ", seen[i].net, seen[i].node);
  1452.                             cnet = seen[i].net;
  1453.                             cnode = seen[i].node;
  1454.                         }
  1455.                         else if (cnet == seen[i].net && cnode != seen[i].node) {
  1456.                             sprintf (buffer, "%d ", seen[i].node);
  1457.                             cnode = seen[i].node;
  1458.                         }
  1459.                         else
  1460.                             strcpy (buffer, "");
  1461.  
  1462.                         strcat (wrp, buffer);
  1463.                     }
  1464.  
  1465.                     mprintf (fpd, "%s\r\n", wrp);
  1466.                     mprintf (fpd, "%s\r\n", buff);
  1467.  
  1468.                     need_seen = 0;
  1469.                 }
  1470.                 else {
  1471.                     if ((!goldbase && (msghdr.msgattr & 64)) || (goldbase && (gmsghdr.msgattr & 64))) {
  1472.                         if (!strncmp (buff, "--- ", 4) && (config->replace_tear || !registered))
  1473.                             replace_tearline (fpd, buff);
  1474.                         else
  1475.                             mprintf (fpd, "%s\r\n", buff);
  1476.                     }
  1477.                     else
  1478.                         mprintf (fpd, "%s\r\n", buff);
  1479.                 }
  1480.  
  1481.                 mi = 0;
  1482.             }
  1483.             else {
  1484.                 if (mi < 78)
  1485.                     continue;
  1486.  
  1487.                 if (!strncmp (buff, msgtxt[M_ORIGIN_LINE], 11))
  1488.                     need_origin = 0;
  1489.  
  1490.                 buff[mi] = '\0';
  1491.                 mprintf (fpd, "%s", buff);
  1492.                 mi = 0;
  1493.                 buff[mi] = '\0';
  1494.             }
  1495.         }
  1496.  
  1497.         if (!n_seen) {
  1498.             if (need_origin) {
  1499.                 mprintf (fpd, msgtxt[M_TEAR_LINE],VERSION, registered ? "+" : NOREG);
  1500.                 if (strlen(sys.origin))
  1501.                     mprintf(fpd,msgtxt[M_ORIGIN_LINE],random_origins(),config->alias[sys.use_alias].zone,config->alias[sys.use_alias].net,config->alias[sys.use_alias].node, config->alias[sys.use_alias].point);
  1502.                 else
  1503.                     mprintf(fpd,msgtxt[M_ORIGIN_LINE],system_name,config->alias[sys.use_alias].zone,config->alias[sys.use_alias].net,config->alias[sys.use_alias].node, config->alias[sys.use_alias].point);
  1504.                 need_origin = 0;
  1505.             }
  1506.  
  1507.             if (!config->alias[sys.use_alias].point) {
  1508.                 seen[n_seen].net = config->alias[sys.use_alias].net;
  1509.                 seen[n_seen++].node = config->alias[sys.use_alias].node;
  1510.             }
  1511.             else if (config->alias[sys.use_alias].fakenet) {
  1512.                 seen[n_seen].net = config->alias[sys.use_alias].fakenet;
  1513.                 seen[n_seen++].node = config->alias[sys.use_alias].point;
  1514.             }
  1515.  
  1516.             ai = sys.use_alias;
  1517.             for (i = 0; i < maxnodes; i++) {
  1518.                 if (!forward[i].export || forward[i].net == config->alias[sys.use_alias].fakenet)
  1519.                     continue;
  1520.                 seen[n_seen].net = forward[i].net;
  1521.                 seen[n_seen++].node = forward[i].node;
  1522.  
  1523.                 for (m = 0; m < maxakainfo; m++)
  1524.                     if (akainfo[m].zone == forward[i].zone && akainfo[m].net == forward[i].net && akainfo[m].node == forward[i].node && akainfo[m].point == forward[i].point) {
  1525.                         if (akainfo[m].aka)
  1526.                             ai = akainfo[m].aka - 1;
  1527.                         break;
  1528.                     }
  1529.                 if (ai != sys.use_alias) {
  1530.                     if (!config->alias[ai].point) {
  1531.                         if (config->alias[ai].net != seen[n_seen - 1].net || config->alias[ai].node != seen[n_seen - 1].node) {
  1532.                             seen[n_seen].net = config->alias[ai].net;
  1533.                             seen[n_seen++].node = config->alias[ai].node;
  1534.                         }
  1535.                     }
  1536.                     else if (config->alias[ai].fakenet) {
  1537.                         if (config->alias[ai].fakenet != seen[n_seen - 1].net || config->alias[ai].point != seen[n_seen - 1].node) {
  1538.                             seen[n_seen].net = config->alias[ai].fakenet;
  1539.                             seen[n_seen++].node = config->alias[ai].point;
  1540.                         }
  1541.                     }
  1542.                 }
  1543.             }
  1544.  
  1545.             qsort (seen, n_seen, sizeof (struct _fwrd), mail_sort_func);
  1546.  
  1547.             cnet = cnode = 0;
  1548.             strcpy (wrp, "SEEN-BY: ");
  1549.  
  1550.             for (i = 0; i < n_seen; i++) {
  1551.                 if (cnet != seen[i].net) {
  1552.                     sprintf (buffer, "%d/%d ", seen[i].net, seen[i].node);
  1553.                     cnet = seen[i].net;
  1554.                     cnode = seen[i].node;
  1555.                 }
  1556.                 else if (cnet == seen[i].net && cnode != seen[i].node) {
  1557.                     sprintf (buffer, "%d ", seen[i].node);
  1558.                     cnode = seen[i].node;
  1559.                 }
  1560.                 else
  1561.                     strcpy (buffer, "");
  1562.  
  1563.                 strcat (wrp, buffer);
  1564.             }
  1565.  
  1566.             mprintf (fpd, "%s\r\n", wrp);
  1567.             if (config->alias[sys.use_alias].point && config->alias[sys.use_alias].fakenet)
  1568.                 mprintf (fpd, "\001PATH: %d/%d\r\n", config->alias[sys.use_alias].fakenet, config->alias[sys.use_alias].point);
  1569.             else if (!config->alias[sys.use_alias].point)
  1570.                 mprintf (fpd, "\001PATH: %d/%d\r\n", config->alias[sys.use_alias].net, config->alias[sys.use_alias].node);
  1571.         }
  1572.  
  1573.         mhdr.ver = PKTVER;
  1574.         mhdr.cost = msghdr.cost;
  1575.         mhdr.attrib = 0;
  1576.  
  1577.         if (sys.public)
  1578.             mhdr.attrib &= ~Q_PRIVATE;
  1579.         else if (sys.private)
  1580.             mhdr.attrib |= Q_PRIVATE;
  1581.  
  1582.         if (goldbase) {
  1583.             if (gmsghdr.msgattr & Q_PRIVATE)
  1584.                 mhdr.attrib |= MSGPRIVATE;
  1585.         }
  1586.         else {
  1587.             if (msghdr.msgattr & Q_PRIVATE)
  1588.                 mhdr.attrib |= MSGPRIVATE;
  1589.         }
  1590.  
  1591.         for (i = 0; i < maxnodes; i++) {
  1592.             if (!forward[i].export)
  1593.                 continue;
  1594.  
  1595.             ai = sys.use_alias;
  1596.             for (m = 0; m < maxakainfo; m++)
  1597.                 if (akainfo[m].zone == forward[i].zone && akainfo[m].net == forward[i].net && akainfo[m].node == forward[i].node && akainfo[m].point == forward[i].point) {
  1598.                     if (akainfo[m].aka)
  1599.                         ai = akainfo[m].aka - 1;
  1600.                     break;
  1601.                 }
  1602.  
  1603.             if (config->alias[ai].point && config->alias[ai].fakenet) {
  1604.                 mhdr.orig_node = config->alias[ai].point;
  1605.                 mhdr.orig_net = config->alias[ai].fakenet;
  1606.             }
  1607.             else {
  1608.                 mhdr.orig_node = config->alias[ai].node;
  1609.                 mhdr.orig_net = config->alias[ai].net;
  1610.             }
  1611.  
  1612.             if (forward[i].point)
  1613.                 sprintf (wrp, "%d/%d.%d ", forward[i].net, forward[i].node, forward[i].point);
  1614.          else
  1615.             sprintf (wrp, "%d/%d ", forward[i].net, forward[i].node);
  1616.          wreadcur (&z, &m);
  1617.          if ( (m + strlen (wrp)) > 78) {
  1618.             wputs ("\n");
  1619.             wputs ("                                           ");
  1620.          }
  1621.          wputs (wrp);
  1622.          if ( (m + strlen (wrp)) == 78)
  1623.             wputs ("                                           ");
  1624.  
  1625.          mi = open_packet (forward[i].zone, forward[i].net, forward[i].node, forward[i].point, ai);
  1626.  
  1627.          mhdr.dest_net = forward[i].net;
  1628.          mhdr.dest_node = forward[i].node;
  1629.          write (mi, (char *)&mhdr, sizeof (struct _msghdr2));
  1630.  
  1631.          if (goldbase) {
  1632.             strcpy (wrp, pascal_string (gmsghdr.date));
  1633.             sscanf (wrp, "%2d-%2d-%2d", &z, &ne, &no);
  1634.             strcpy (wrp, pascal_string (gmsghdr.time));
  1635.             sscanf (wrp, "%2d:%2d", &pp, &m);
  1636.             sprintf (buff, "%02d %s %02d  %2d:%02d:00", ne, mtext[z-1], no, pp, m);
  1637.             write (mi, buff, strlen (buff) + 1);
  1638.             strcpy (buff, pascal_string (gmsghdr.whoto));
  1639.             write (mi, buff, strlen (buff) + 1);
  1640.             strcpy (buff, pascal_string (gmsghdr.whofrom));
  1641.             write (mi, buff, strlen (buff) + 1);
  1642.             strcpy (buff, pascal_string (gmsghdr.subject));
  1643.             write (mi, buff, strlen (buff) + 1);
  1644.             }
  1645.          else {
  1646.             strcpy (wrp, pascal_string (msghdr.date));
  1647.             sscanf (wrp, "%2d-%2d-%2d", &z, &ne, &no);
  1648.             strcpy (wrp, pascal_string (msghdr.time));
  1649.             sscanf (wrp, "%2d:%2d", &pp, &m);
  1650.             sprintf (buff, "%02d %s %02d  %2d:%02d:00", ne, mtext[z-1], no, pp, m);
  1651.             write (mi, buff, strlen (buff) + 1);
  1652.             strcpy (buff, pascal_string (msghdr.whoto));
  1653.             write (mi, buff, strlen (buff) + 1);
  1654.             strcpy (buff, pascal_string (msghdr.whofrom));
  1655.             write (mi, buff, strlen (buff) + 1);
  1656.                 strcpy (buff, pascal_string (msghdr.subject));
  1657.             write (mi, buff, strlen (buff) + 1);
  1658.          }
  1659.  
  1660.          mseek (fpd, 0L, SEEK_SET);
  1661.          do {
  1662.             z = mread(buffer, 1, 2048, fpd);
  1663.             write(mi, buffer, z);
  1664.          } while (z == 2048);
  1665.          buff[0] = buff[1] = buff[2] = 0;
  1666.          if (write (mi, buff, 3) != 3)
  1667.             return (-1);
  1668.          close (mi);
  1669.  
  1670.          totalmsg++;
  1671.          sprintf (wrp, "%d (%.1f/s) ", totalmsg, (float)totalmsg / ((float)(timerset (0) - totaltime) / 100));
  1672.          prints (10, 65, YELLOW|_BLACK, wrp);
  1673.       }
  1674.  
  1675.       if (goldbase) {
  1676.          lseek (f1, -1L * sizeof (struct _gold_msghdr), SEEK_CUR);
  1677.          gmsghdr.msgattr &= ~32;
  1678.          write (f1, (char *)&gmsghdr, sizeof (struct _gold_msghdr));
  1679.       }
  1680.       else {
  1681.          lseek (f1, -1L * sizeof (struct _msghdr), SEEK_CUR);
  1682.          msghdr.msgattr &= ~32;
  1683.          write (f1, (char *)&msghdr, sizeof (struct _msghdr));
  1684.       }
  1685.  
  1686.       wputs ("\n");
  1687.       sent++;
  1688.     }
  1689.  
  1690.    if (sent)
  1691.       status_line (":   %-20.20s (Sent=%04d)", sys.echotag, sent);
  1692.  
  1693.    if (fdmsg != -1) {
  1694.       close (fdmsg);
  1695.  
  1696.       if (goldbase)
  1697.          sprintf (buff, "%sECHOMAIL.DAT", fido_msgpath);
  1698.       else
  1699.          sprintf (buff, "%sECHOMAIL.BBS", fido_msgpath);
  1700.         unlink (buff);
  1701.    }
  1702.  
  1703.    if (fp != NULL)
  1704.       fclose (fp);
  1705.    mclose (fpd);
  1706.    free (seen);
  1707.    close (fd);
  1708.    fclose (f2);
  1709.    close (f1);
  1710.    close (finfo);
  1711.    unlink ("MSGTMP.EXP");
  1712.  
  1713.    return (maxnodes);
  1714. }
  1715.  
  1716.  
  1717. int quick_rescan_echomail (int board, int zone, int net, int node, int point, int goldboard)
  1718. {
  1719.    FILE *fpd, *f2, *fp;
  1720.    int f1, i, pp, z, fd, ne, no, m, n_seen, cnet, cnode, mi, sent, ai = 0;
  1721.    int last_board;
  1722.    char buff[80], wrp[80], c, found, *p, buffer[2050];
  1723.    char *location, *tag, *forw, need_origin, need_seen;
  1724.    byte tpbyte, lastr;
  1725.    struct _msghdr msghdr;
  1726.    struct _msghdr2 mhdr;
  1727.    struct _fwrd *seen;
  1728.    struct _gold_msghdr gmsghdr;
  1729.    NODEINFO ni;
  1730.  
  1731.    memset ((char *)&sys, 0, sizeof (struct _sys));
  1732.  
  1733.    sprintf (buff, "%sNODES.DAT", config->net_info);
  1734.    if ((fd = sh_open (buff, SH_DENYWR, O_RDONLY|O_BINARY, S_IREAD|S_IWRITE)) != -1) {
  1735.       while (read (fd, (char *)&ni, sizeof (NODEINFO)) == sizeof (NODEINFO))
  1736.          if (zone == ni.zone && net == ni.net && node == ni.node && point == ni.point) {
  1737.             ai = ni.aka;
  1738.             break;
  1739.          }
  1740.  
  1741.       close (fd);
  1742.    }
  1743.  
  1744.     if (goldboard) {
  1745.       sprintf (buff, "%sMSGHDR.DAT", fido_msgpath);
  1746.       f1 = sh_open (buff, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE);
  1747.       if (f1 == -1)
  1748.          return (0);
  1749.  
  1750.       gmsginfo.totalmsgs = filelength (f1) / sizeof (struct _gold_msghdr);
  1751.  
  1752.       sprintf (buff, "%sMSGTXT.DAT", fido_msgpath);
  1753.    }
  1754.    else {
  1755.       sprintf (buff, "%sMSGHDR.BBS", fido_msgpath);
  1756.       f1 = sh_open (buff, SH_DENYNONE, O_RDWR|O_BINARY, S_IREAD|S_IWRITE);
  1757.       if (f1 == -1)
  1758.          return (0);
  1759.  
  1760.       msginfo.totalmsgs = (word)(filelength (f1) / sizeof (struct _msghdr));
  1761.  
  1762.       sprintf(buff,"%sMSGTXT.BBS",fido_msgpath);
  1763.    }
  1764.  
  1765.    f2 = fopen (buff, "rb");
  1766.    if (f2 == NULL) {
  1767.       close (f1);
  1768.       return (0);
  1769.    }
  1770.    setvbuf (f2, NULL, _IOFBF, 1024);
  1771.  
  1772.    sprintf (buff, SYSMSG_PATH, config->sys_path);
  1773.    fd = sh_open (buff, SH_DENYNONE, O_RDONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE);
  1774.    if (fd == -1) {
  1775.       close (f1);
  1776.         fclose (f2);
  1777.       return (0);
  1778.    }
  1779.  
  1780.    if (config->use_areasbbs)
  1781.       fp = fopen (config->areas_bbs, "rt");
  1782.    else
  1783.       fp = NULL;
  1784.  
  1785.    last_board = 0;
  1786.    seen = (struct _fwrd *)malloc ((MAX_EXPORT_SEEN + 1) * sizeof (struct _fwrd));
  1787.    if (seen == NULL) {
  1788.         close (f1);
  1789.       fclose (f2);
  1790.       close (fd);
  1791.       if (fp != NULL)
  1792.          fclose (fp);
  1793.       return (0);
  1794.    }
  1795.  
  1796.    fpd = fopen ("MSGTMP.EXP", "rb+");
  1797.    if (fpd == NULL) {
  1798.       fpd = fopen ("MSGTMP.EXP", "wb");
  1799.       fclose (fpd);
  1800.    }
  1801.    else
  1802.       fclose (fpd);
  1803.    fpd = mopen ("MSGTMP.EXP", "r+b");
  1804.  
  1805.    prints (7, 65, YELLOW|_BLACK, "              ");
  1806.    prints (9, 65, YELLOW|_BLACK, "              ");
  1807.    prints (9, 65, YELLOW|_BLACK, goldboard ? "GoldBase" : "QuickBBS");
  1808.  
  1809.    sent = 0;
  1810.  
  1811.    for (;;) {
  1812.       if (goldboard) {
  1813.          if (read (f1, (char *)&gmsghdr, sizeof (struct _gold_msghdr)) != sizeof (struct _gold_msghdr))
  1814.             break;
  1815.             sprintf (wrp, "%ld / %ld", gmsghdr.msgnum, gmsginfo.totalmsgs);
  1816.             if ( !(gmsghdr.msgnum % 60))
  1817.             time_release ();
  1818.       }
  1819.       else {
  1820.             if (read (f1, (char *)&msghdr, sizeof (struct _msghdr)) != sizeof (struct _msghdr))
  1821.                 break;
  1822.             sprintf (wrp, "%d / %d", msghdr.msgnum, msginfo.totalmsgs);
  1823.             if ( !(msghdr.msgnum % 60))
  1824.                 time_release ();
  1825.         }
  1826.         prints (7, 65, YELLOW|_BLACK, wrp);
  1827.  
  1828.         if (goldboard) {
  1829.             if (gmsghdr.msgattr & Q_RECKILL)
  1830.                 continue;
  1831.             if (gmsghdr.board != board)
  1832.                 continue;
  1833.         }
  1834.         else {
  1835.             if (msghdr.msgattr & Q_RECKILL)
  1836.                 continue;
  1837.             if (msghdr.board != board)
  1838.                 continue;
  1839.         }
  1840.  
  1841.         if ((!goldboard && msghdr.board != last_board) || (goldboard && gmsghdr.board != last_board)) {
  1842.             last_board = goldboard ? gmsghdr.board : msghdr.board;
  1843.             memset ((char *)&sys, 0, sizeof (struct _sys));
  1844.             found = 0;
  1845.  
  1846.             if (fp != NULL) {
  1847.                 rewind (fp);
  1848.                 fgets (buffer, 255, fp);
  1849.  
  1850.                 while (fgets(buffer, 255, fp) != NULL) {
  1851.                     if (buffer[0] == ';')
  1852.                         continue;
  1853.                     if ((!goldboard && !isdigit (buffer[0])) || (goldboard && toupper (buffer[0]) != 'G'))
  1854.                         continue;
  1855.                     while (buffer[strlen (buffer) -1] == 0x0D || buffer[strlen (buffer) -1] == 0x0A || buffer[strlen (buffer) -1] == ' ')
  1856.                         buffer[strlen (buffer) -1] = '\0';
  1857.                     location = strtok (buffer, " ");
  1858.                     tag = strtok (NULL, " ");
  1859.                     forw = strtok (NULL, "");
  1860.                     if ((!goldboard && atoi (location) == msghdr.board) || (goldboard && atoi (&location[1]) == gmsghdr.board)) {
  1861.                         while (*forw == ' ')
  1862.                             forw++;
  1863.                         memset ((char *)&sys, 0, sizeof (struct _sys));
  1864.                         strcpy (sys.echotag, tag);
  1865.                         if (forw != NULL)
  1866.                             strcpy (sys.forward1, forw);
  1867.                         sys.echomail = 1;
  1868.                         sys.use_alias = 0;
  1869.                         if (goldboard)
  1870.                             sys.gold_board = atoi (location);
  1871.                         else
  1872.                             sys.quick_board = atoi (location);
  1873.                         found = 1;
  1874.                         break;
  1875.                     }
  1876.                 }
  1877.          }
  1878.  
  1879.          if (!found) {
  1880.             for (i = 0; i < maxaidx; i++) {
  1881.                if (!goldboard && aidx[i].board == msghdr.board)
  1882.                   break;
  1883.                else if (goldboard && aidx[i].gold_board == gmsghdr.board)
  1884.                   break;
  1885.             }
  1886.  
  1887.             if (i < maxaidx) {
  1888.                lseek (fd, (long)i * SIZEOF_MSGAREA, SEEK_SET);
  1889.                read(fd, (char *)&sys.msg_name, SIZEOF_MSGAREA);
  1890.                found = 1;
  1891.             }
  1892.          }
  1893.  
  1894.          if (!found)
  1895.             continue;
  1896.       }
  1897.       else if (!found)
  1898.          continue;
  1899.  
  1900.       need_seen = need_origin = 1;
  1901.  
  1902.       strcpy (wrp, sys.echotag);
  1903.       wrp[14] = '\0';
  1904.       prints (8, 65, YELLOW|_BLACK, "              ");
  1905.       prints (8, 65, YELLOW|_BLACK, wrp);
  1906.  
  1907.       if (goldboard) {
  1908.             sprintf (wrp, "%5ld  %-22.22s GoldBase     ", gmsghdr.msgnum, sys.echotag);
  1909.          fseek (f2, 256L * gmsghdr.startblock, SEEK_SET);
  1910.       }
  1911.       else {
  1912.             sprintf (wrp, "%5d  %-22.22s QuickBBS     ", msghdr.msgnum, sys.echotag);
  1913.          fseek (f2, 256L * msghdr.startblock, SEEK_SET);
  1914.       }
  1915.       wputs (wrp);
  1916.  
  1917.       mseek (fpd, 0L, SEEK_SET);
  1918.       mprintf (fpd, "AREA:%s\r\n", sys.echotag);
  1919.  
  1920.         mi = i = 0;
  1921.       tpbyte = 0;
  1922.       lastr = 255;
  1923.       n_seen = 0;
  1924.  
  1925.       for (;;) {
  1926.          if (!tpbyte) {
  1927.             if (lastr != 255)
  1928.                break;
  1929.             tpbyte = fgetc(f2);
  1930.             lastr = tpbyte;
  1931.             if (!tpbyte)
  1932.                break;
  1933.          }
  1934.  
  1935.          c = fgetc (f2);
  1936.          tpbyte--;
  1937.  
  1938.          if (c == '\0')
  1939.             break;
  1940.  
  1941.          if (c == 0x0A)
  1942.             continue;
  1943.          if((byte)c == 0x8D)
  1944.             c = ' ';
  1945.  
  1946.          buff[mi++] = c;
  1947.  
  1948.          if(c == 0x0D) {
  1949.             buff[mi - 1]='\0';
  1950.             if (!strncmp(buff,msgtxt[M_ORIGIN_LINE],11))
  1951.                need_origin = 0;
  1952.  
  1953.             if (!strncmp (buff, "SEEN-BY: ", 9)) {
  1954.                if (need_origin) {
  1955.                   mprintf (fpd, msgtxt[M_TEAR_LINE],VERSION, registered ? "+" : NOREG);
  1956.                   if (strlen(sys.origin))
  1957.                      mprintf(fpd,msgtxt[M_ORIGIN_LINE],random_origins(),config->alias[sys.use_alias].zone,config->alias[sys.use_alias].net,config->alias[sys.use_alias].node, config->alias[sys.use_alias].point);
  1958.                   else
  1959.                      mprintf(fpd,msgtxt[M_ORIGIN_LINE],system_name,config->alias[sys.use_alias].zone,config->alias[sys.use_alias].net,config->alias[sys.use_alias].node, config->alias[sys.use_alias].point);
  1960.                   need_origin = 0;
  1961.                }
  1962.  
  1963.                p = strtok (buff, " ");
  1964.                     ne = config->alias[sys.use_alias].net;
  1965.                no = config->alias[sys.use_alias].node;
  1966.                pp = config->alias[sys.use_alias].point;
  1967.                z = config->alias[sys.use_alias].zone;
  1968.  
  1969.                while ((p = strtok (NULL, " ")) != NULL) {
  1970.                   parse_netnode2 (p, &z, &ne, &no, &pp);
  1971.  
  1972.                   seen[n_seen].net = ne;
  1973.                   seen[n_seen].node = no;
  1974.                   seen[n_seen].point = pp;
  1975.                   seen[n_seen].zone = z;
  1976.  
  1977.                   if (n_seen + 1 >= MAX_EXPORT_SEEN)
  1978.                      continue;
  1979.  
  1980.                   if (seen[n_seen].net != config->alias[sys.use_alias].fakenet && !seen[n_seen].point)
  1981.                      n_seen++;
  1982.                }
  1983.             }
  1984.             else if (!strncmp (buff, "\001PATH: ", 7) && need_seen) {
  1985.                if (need_origin) {
  1986.                   mprintf (fpd, msgtxt[M_TEAR_LINE],VERSION, registered ? "+" : NOREG);
  1987.                   if (strlen(sys.origin))
  1988.                      mprintf(fpd,msgtxt[M_ORIGIN_LINE],random_origins(),config->alias[sys.use_alias].zone,config->alias[sys.use_alias].net,config->alias[sys.use_alias].node, config->alias[sys.use_alias].point);
  1989.                   else
  1990.                      mprintf(fpd,msgtxt[M_ORIGIN_LINE],system_name,config->alias[sys.use_alias].zone,config->alias[sys.use_alias].net,config->alias[sys.use_alias].node, config->alias[sys.use_alias].point);
  1991.                   need_origin = 0;
  1992.                }
  1993.  
  1994.                if (!config->alias[sys.use_alias].point) {
  1995.                   seen[n_seen].net = config->alias[sys.use_alias].net;
  1996.                   seen[n_seen++].node = config->alias[sys.use_alias].node;
  1997.                }
  1998.                else if (config->alias[sys.use_alias].fakenet) {
  1999.                   seen[n_seen].net = config->alias[sys.use_alias].fakenet;
  2000.                   seen[n_seen++].node = config->alias[sys.use_alias].point;
  2001.                }
  2002.  
  2003.                seen[n_seen].net = net;
  2004.                seen[n_seen++].node = node;
  2005.  
  2006.                qsort (seen, n_seen, sizeof (struct _fwrd), mail_sort_func);
  2007.  
  2008.                     cnet = cnode = 0;
  2009.                strcpy (wrp, "SEEN-BY: ");
  2010.  
  2011.                for (i = 0; i < n_seen; i++) {
  2012.                   if (strlen (wrp) > 65) {
  2013.                      mprintf (fpd, "%s\r\n", wrp);
  2014.                      cnet = cnode = 0;
  2015.                      strcpy (wrp, "SEEN-BY: ");
  2016.                   }
  2017.                   if (i && seen[i].net == seen[i - 1].net && seen[i].node == seen[i - 1].node)
  2018.                      continue;
  2019.  
  2020.                   if (cnet != seen[i].net) {
  2021.                      sprintf (buffer, "%d/%d ", seen[i].net, seen[i].node);
  2022.                      cnet = seen[i].net;
  2023.                      cnode = seen[i].node;
  2024.                   }
  2025.                   else if (cnet == seen[i].net && cnode != seen[i].node) {
  2026.                      sprintf (buffer, "%d ", seen[i].node);
  2027.                      cnode = seen[i].node;
  2028.                   }
  2029.                   else
  2030.                      strcpy (buffer, "");
  2031.  
  2032.                   strcat (wrp, buffer);
  2033.                }
  2034.  
  2035.                mprintf (fpd, "%s\r\n", wrp);
  2036.                mprintf (fpd, "%s\r\n", buff);
  2037.  
  2038.                need_seen = 0;
  2039.             }
  2040.             else {
  2041.                if ((!goldboard && (msghdr.msgattr & 64)) || (goldboard && (gmsghdr.msgattr & 64))) {
  2042.                   if (!strncmp (buff, "--- ", 4) && (config->replace_tear || !registered))
  2043.                      replace_tearline (fpd, buff);
  2044.                   else
  2045.                      mprintf (fpd, "%s\r\n", buff);
  2046.                }
  2047.                else
  2048.                   mprintf (fpd, "%s\r\n", buff);
  2049.             }
  2050.  
  2051.             mi = 0;
  2052.             }
  2053.          else {
  2054.             if(mi < 78)
  2055.                continue;
  2056.  
  2057.             if (!strncmp (buff, msgtxt[M_ORIGIN_LINE], 11))
  2058.                need_origin = 0;
  2059.  
  2060.             buff[mi] = '\0';
  2061.             mprintf (fpd, "%s", buff);
  2062.             mi = 0;
  2063.             buff[mi] = '\0';
  2064.          }
  2065.       }
  2066.  
  2067.       if (!n_seen || need_seen) {
  2068.          if (need_origin) {
  2069.             mprintf (fpd, msgtxt[M_TEAR_LINE],VERSION, registered ? "+" : NOREG);
  2070.             if (strlen(sys.origin))
  2071.                mprintf(fpd,msgtxt[M_ORIGIN_LINE],random_origins(),config->alias[sys.use_alias].zone,config->alias[sys.use_alias].net,config->alias[sys.use_alias].node, config->alias[sys.use_alias].point);
  2072.             else
  2073.                mprintf(fpd,msgtxt[M_ORIGIN_LINE],system_name,config->alias[sys.use_alias].zone,config->alias[sys.use_alias].net,config->alias[sys.use_alias].node, config->alias[sys.use_alias].point);
  2074.             need_origin = 0;
  2075.          }
  2076.  
  2077.          if (!config->alias[sys.use_alias].point) {
  2078.             seen[n_seen].net = config->alias[sys.use_alias].net;
  2079.             seen[n_seen++].node = config->alias[sys.use_alias].node;
  2080.          }
  2081.          else if (config->alias[sys.use_alias].fakenet) {
  2082.             seen[n_seen].net = config->alias[sys.use_alias].fakenet;
  2083.             seen[n_seen++].node = config->alias[sys.use_alias].point;
  2084.          }
  2085.  
  2086.          seen[n_seen].net = net;
  2087.          seen[n_seen++].node = node;
  2088.  
  2089.          qsort (seen, n_seen, sizeof (struct _fwrd), mail_sort_func);
  2090.  
  2091.          cnet = cnode = 0;
  2092.          strcpy (wrp, "SEEN-BY: ");
  2093.  
  2094.          for (i = 0; i < n_seen; i++) {
  2095.             if (cnet != seen[i].net) {
  2096.                     sprintf (buffer, "%d/%d ", seen[i].net, seen[i].node);
  2097.                cnet = seen[i].net;
  2098.                cnode = seen[i].node;
  2099.             }
  2100.             else if (cnet == seen[i].net && cnode != seen[i].node) {
  2101.                sprintf (buffer, "%d ", seen[i].node);
  2102.                cnode = seen[i].node;
  2103.             }
  2104.             else
  2105.                strcpy (buffer, "");
  2106.  
  2107.             strcat (wrp, buffer);
  2108.          }
  2109.  
  2110.          mprintf (fpd, "%s\r\n", wrp);
  2111.          if (config->alias[sys.use_alias].point && config->alias[sys.use_alias].fakenet)
  2112.             mprintf (fpd, "\001PATH: %d/%d\r\n", config->alias[sys.use_alias].fakenet, config->alias[sys.use_alias].point);
  2113.          else if (!config->alias[sys.use_alias].point)
  2114.             mprintf (fpd, "\001PATH: %d/%d\r\n", config->alias[sys.use_alias].net, config->alias[sys.use_alias].node);
  2115.       }
  2116.  
  2117.       if (ai)
  2118.          sys.use_alias = ai - 1;
  2119.  
  2120.       mhdr.ver = PKTVER;
  2121.       if (config->alias[sys.use_alias].point && config->alias[sys.use_alias].fakenet) {
  2122.          mhdr.orig_node = config->alias[sys.use_alias].point;
  2123.          mhdr.orig_net = config->alias[sys.use_alias].fakenet;
  2124.       }
  2125.       else {
  2126.          mhdr.orig_node = config->alias[sys.use_alias].node;
  2127.          mhdr.orig_net = config->alias[sys.use_alias].net;
  2128.       }
  2129.       mhdr.attrib = 0;
  2130.  
  2131.       if (goldboard) {
  2132.          mhdr.cost = gmsghdr.cost;
  2133.          if (gmsghdr.msgattr & Q_PRIVATE)
  2134.             mhdr.attrib |= MSGPRIVATE;
  2135.       }
  2136.       else {
  2137.          mhdr.cost = msghdr.cost;
  2138.          if (msghdr.msgattr & Q_PRIVATE)
  2139.             mhdr.attrib |= MSGPRIVATE;
  2140.         }
  2141.  
  2142.       if (sys.public)
  2143.          mhdr.attrib &= ~Q_PRIVATE;
  2144.       else if (sys.private)
  2145.          mhdr.attrib |= Q_PRIVATE;
  2146.  
  2147.       if (point)
  2148.          sprintf (wrp, "%d/%d.%d ", net, node, point);
  2149.       else
  2150.          sprintf (wrp, "%d/%d ", net, node);
  2151.       wreadcur (&z, &m);
  2152.       if ( (m + strlen (wrp)) > 78) {
  2153.          wputs ("\n");
  2154.          wputs ("                                           ");
  2155.       }
  2156.       wputs (wrp);
  2157.       if ( (m + strlen (wrp)) == 78)
  2158.          wputs ("                                           ");
  2159.  
  2160.       mi = open_packet (zone, net, node, point, sys.use_alias);
  2161.  
  2162.       mhdr.dest_net = net;
  2163.       mhdr.dest_node = node;
  2164.       write (mi, (char *)&mhdr, sizeof (struct _msghdr2));
  2165.  
  2166.       if (goldboard) {
  2167.          strcpy (wrp, pascal_string (gmsghdr.date));
  2168.          sscanf (wrp, "%2d-%2d-%2d", &z, &ne, &no);
  2169.          strcpy (wrp, pascal_string (gmsghdr.time));
  2170.          sscanf (wrp, "%2d:%2d", &pp, &m);
  2171.          sprintf (buff, "%02d %s %02d  %2d:%02d:00", ne, mtext[z-1], no, pp, m);
  2172.          write (mi, buff, strlen (buff) + 1);
  2173.          strcpy (buff, pascal_string (gmsghdr.whoto));
  2174.          write (mi, buff, strlen (buff) + 1);
  2175.          strcpy (buff, pascal_string (gmsghdr.whofrom));
  2176.          write (mi, buff, strlen (buff) + 1);
  2177.          strcpy (buff, pascal_string (gmsghdr.subject));
  2178.          write (mi, buff, strlen (buff) + 1);
  2179.       }
  2180.       else {
  2181.          strcpy (wrp, pascal_string (msghdr.date));
  2182.          sscanf (wrp, "%2d-%2d-%2d", &z, &ne, &no);
  2183.          strcpy (wrp, pascal_string (msghdr.time));
  2184.             sscanf (wrp, "%2d:%2d", &pp, &m);
  2185.          sprintf (buff, "%02d %s %02d  %2d:%02d:00", ne, mtext[z-1], no, pp, m);
  2186.          write (mi, buff, strlen (buff) + 1);
  2187.          strcpy (buff, pascal_string (msghdr.whoto));
  2188.          write (mi, buff, strlen (buff) + 1);
  2189.          strcpy (buff, pascal_string (msghdr.whofrom));
  2190.          write (mi, buff, strlen (buff) + 1);
  2191.          strcpy (buff, pascal_string (msghdr.subject));
  2192.          write (mi, buff, strlen (buff) + 1);
  2193.       }
  2194.  
  2195.       mseek (fpd, 0L, SEEK_SET);
  2196.       do {
  2197.          z = mread(buffer, 1, 2048, fpd);
  2198.          write(mi, buffer, z);
  2199.       } while (z == 2048);
  2200.       buff[0] = buff[1] = buff[2] = 0;
  2201.       if (write (mi, buff, 3) != 3)
  2202.          return (-1);
  2203.       close (mi);
  2204.  
  2205.       totalmsg++;
  2206.       sprintf (wrp, "%d (%.1f/s) ", totalmsg, (float)totalmsg / ((float)(timerset (0) - totaltime) / 100));
  2207.       prints (10, 65, YELLOW|_BLACK, wrp);
  2208.  
  2209.       wputs ("\n");
  2210.       sent++;
  2211.    }
  2212.  
  2213.    if (sent)
  2214.       status_line (":   %-20.20s (Sent=%04d)", sys.echotag, sent);
  2215.  
  2216.    if (fp != NULL)
  2217.       fclose (fp);
  2218.    mclose (fpd);
  2219.    free (seen);
  2220.    close (fd);
  2221.    fclose (f2);
  2222.    close (f1);
  2223.    unlink ("MSGTMP.EXP");
  2224.  
  2225.    return (0);
  2226. }
  2227.  
  2228.