home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / bts314b4 / ftsc.c < prev    next >
C/C++ Source or Header  |  1994-01-08  |  26KB  |  875 lines

  1. /*--------------------------------------------------------------------------*/
  2. /*                                                                          */
  3. /*                                                                          */
  4. /*      ------------         Bit-Bucket Software, Co.                       */
  5. /*      \ 10001101 /         Writers and Distributors of                    */
  6. /*       \ 011110 /          Freely Available<tm> Software.                 */
  7. /*        \ 1011 /                                                          */
  8. /*         ------                                                           */
  9. /*                                                                          */
  10. /*  (C) Copyright 1987-90, Bit Bucket Software Co., a Delaware Corporation. */
  11. /*                                                                          */
  12. /*                                                                          */
  13. /*                 This module was written by Bob Hartman                   */
  14. /*                                                                          */
  15. /*                                                                          */
  16. /*                 BinkleyTerm FTSC Mail Session Routines                   */
  17. /*                                                                          */
  18. /*                                                                          */
  19. /*    For complete  details  of the licensing restrictions, please refer    */
  20. /*    to the License  agreement,  which  is published in its entirety in    */
  21. /*    the MAKEFILE and BT.C, and also contained in the file LICENSE.240.    */
  22. /*                                                                          */
  23. /*    USE  OF THIS FILE IS SUBJECT TO THE  RESTRICTIONS CONTAINED IN THE    */
  24. /*    BINKLEYTERM  LICENSING  AGREEMENT.  IF YOU DO NOT FIND THE TEXT OF    */
  25. /*    THIS  AGREEMENT IN ANY OF THE  AFOREMENTIONED FILES,  OR IF YOU DO    */
  26. /*    NOT HAVE THESE FILES,  YOU  SHOULD  IMMEDIATELY CONTACT BIT BUCKET    */
  27. /*    SOFTWARE CO.  AT ONE OF THE  ADDRESSES  LISTED BELOW.  IN NO EVENT    */
  28. /*    SHOULD YOU  PROCEED TO USE THIS FILE  WITHOUT HAVING  ACCEPTED THE    */
  29. /*    TERMS  OF  THE  BINKLEYTERM  LICENSING  AGREEMENT,  OR  SUCH OTHER    */
  30. /*    AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO.      */
  31. /*                                                                          */
  32. /*                                                                          */
  33. /* You can contact Bit Bucket Software Co. at any one of the following      */
  34. /* addresses:                                                               */
  35. /*                                                                          */
  36. /* Bit Bucket Software Co.        FidoNet  1:104/501, 1:132/491, 1:141/491  */
  37. /* P.O. Box 460398                AlterNet 7:491/0                          */
  38. /* Aurora, CO 80046               BBS-Net  86:2030/1                        */
  39. /*                                Internet f491.n132.z1.fidonet.org         */
  40. /*                                                                          */
  41. /* Please feel free to contact us at any time to share your comments about  */
  42. /* our software and/or licensing policies.                                  */
  43. /*                                                                          */
  44. /*--------------------------------------------------------------------------*/
  45.  
  46. #include <stdio.h>
  47. #include <stdlib.h>
  48. #include <errno.h>
  49. #include <signal.h>
  50. #include <ctype.h>
  51. #include <conio.h>
  52. #include <time.h>
  53. #include <string.h>
  54. #ifndef LATTICE
  55. #include <io.h>
  56. #endif
  57. #ifdef __TOS__
  58. #include <ext.h>
  59. #else
  60. #include <sys\types.h>
  61. #include <sys\stat.h>
  62. #endif
  63.  
  64. #ifdef __TURBOC__
  65. #ifndef __TOS__
  66. #include <alloc.h>
  67. #endif
  68. #else
  69. #ifndef LATTICE
  70. #include <malloc.h>
  71. #endif
  72. #endif
  73.  
  74. #include "bink.h"
  75. #include "msgs.h"
  76. #include "com.h"
  77. #include "ascii.h"
  78. #include "defines.h"
  79. #include "wazoo.h"
  80. #include "session.h"
  81. #include "password.h"
  82. #include "nodeproc.h"
  83.  
  84. static int FTSC_callback (char *);
  85. static int FTSC_sendmail (void);
  86. static int FTSC_recvmail (void);
  87.  
  88. static int is_wazoo_session;
  89.  
  90. #define NUM_FLAGS 4
  91.  
  92. void FTSC_sender( int wz )
  93. {
  94.    int j;
  95.    char junkbuff[128];
  96.    long t1;
  97.  
  98.    is_wazoo_session = wz;
  99.    XON_DISABLE ();
  100.    first_block = 0;
  101.  
  102.    if (!wz)
  103.       {
  104.        first_block = 1;
  105.       status_line (msgtxt[M_SEND_FALLBACK]);
  106.       who_is_he = 0;
  107.       (void) sprintf (junkbuff, "*%s (%s)",
  108.                newnodedes.SystemName,
  109.                Pretty_Addr_Str (&remote_addr));
  110.       status_line (junkbuff);
  111.       }
  112.  
  113.    Netmail_Session = 1;
  114.  
  115.    (void) FTSC_sendmail ();
  116.    t1 = timerset (4500);
  117.  
  118.    /* See what the receiver would like us to do */
  119.    while ((!timeup (t1)) && CARRIER)
  120.       {
  121.       if ((j = PEEKBYTE ()) >= 0)
  122.          {
  123.          switch (j)
  124.             {
  125.             case TSYNC:
  126.                CLEAR_INBOUND ();
  127.                if (FTSC_recvmail ())
  128.                   goto get_out;
  129.                t1 = timerset (4500);
  130.                break;
  131.  
  132.             case SYN:
  133.                CLEAR_INBOUND ();
  134.                 if(check_reqonus(&remote_addr, (char**)NULL))
  135.                   (void) SEA_recvreq ();
  136.                else
  137.                   {
  138.                   SENDBYTE (CAN);
  139.                   status_line (msgtxt[M_REFUSING_IN_FREQ]);
  140.                   }
  141.                t1 = timerset (4500);
  142.                break;
  143.  
  144.             case ENQ:
  145.                CLEAR_INBOUND ();
  146.                SEA_sendreq ();
  147.                goto get_out;
  148.  
  149.             case NAK:
  150.             case 'C':
  151.                CLEAR_INBOUND ();
  152.                SENDBYTE (EOT);
  153.                t1 = timerset (4500);
  154.                break;
  155.  
  156.             default:
  157.                CLEAR_INBOUND ();
  158.                SENDBYTE (SUB);
  159.                break;
  160.             }
  161.          }
  162.       else
  163.          {
  164.          time_release ();
  165.          }
  166.       }
  167.  
  168.    if (!CARRIER)
  169.       {
  170.       status_line (msgtxt[M_NO_CARRIER]);
  171.       CLEAR_INBOUND ();
  172.       first_block = 0;
  173.       return;
  174.       }
  175.  
  176.    if (timeup (t1))
  177.       {
  178.       (void) FTSC_recvmail ();
  179.       status_line (msgtxt[M_TOO_LONG]);
  180.       }
  181.  
  182. get_out:
  183.    first_block = 0;
  184.    t1 = timerset (100);
  185.    while (!timeup (t1))
  186.       time_release ();
  187.    if (!wz)
  188.       status_line (msgtxt[M_0001_END]);
  189. }
  190.  
  191. int FTSC_receiver( int wz )
  192. {
  193.    char fname[64];
  194.    int havemail, done, np;
  195.    unsigned int i;
  196.    long t1, t2;
  197.    struct FILEINFO dt1;
  198.    struct stat buf;
  199.    char *HoldName;
  200.  
  201.    is_wazoo_session = wz;
  202.    first_block = 0;
  203.    XON_DISABLE ();
  204.  
  205.    if (!wz)
  206.       {
  207.        first_block = 1;
  208.       status_line (msgtxt[M_RECV_FALLBACK]);
  209.       who_is_he = 1;
  210.       }
  211.  
  212.    Netmail_Session = 1;
  213.  
  214.    CLEAR_INBOUND ();
  215.  
  216.    /* Save the state of pickup for now */
  217.    done = no_pickup;
  218.    no_pickup = 0;
  219.    if (FTSC_recvmail ())
  220.       {
  221.       /* Restore the state of pickup */
  222.       no_pickup = done;
  223.       if (!wz)
  224.          status_line (msgtxt[M_0001_END]);
  225.       first_block = 0;
  226.       return (1);
  227.       }
  228.  
  229.    /* Restore the state of pickup */
  230.    no_pickup = done;
  231.  
  232.     remote_addr = called_addr;
  233.  
  234.    /* If we have the flag file written, then we shouldn't send anything back */
  235.    if (flag_file (TEST_AND_SET, &called_addr, 1))
  236.       {
  237.       havemail = 1;
  238.       goto no_send;
  239.       }
  240.  
  241.    HoldName = HoldAreaNameMunge(&called_addr);
  242.  
  243.    /* Now see if we should send anything back to him */
  244.    (void) sprintf (fname, "%s%s.?UT", HoldName, Hex_Addr_Str(&remote_addr));
  245.    havemail = dfind (&dt1, fname, 0);
  246.  
  247. #ifdef IOS
  248.     if(havemail)
  249.     {
  250.         sprintf(fname, "%s%s.??T", HoldName, Addr36(&remote_addr));
  251.         havemail = dfind(&dt1, fname, 0);
  252.     }
  253. #endif
  254.  
  255.    if (havemail)
  256.       {
  257.       (void) sprintf (fname, "%s%s.?LO", HoldName, Hex_Addr_Str(&remote_addr));
  258.       havemail = dfind (&dt1, fname, 0);
  259.       }
  260.  
  261.    if (havemail)
  262.       {
  263.       for (np = 0; np <= ALIAS_CNT; np++)
  264.          {
  265.          if (alias[np].ad.Net == 0)
  266.             break;
  267.          (void) sprintf (fname, "%s%s.REQ", CurrentNetFiles, Hex_Addr_Str(&alias[np].ad));
  268.          havemail = dfind (&dt1, fname, 0);
  269.          if (!havemail)
  270.             break;
  271.          }
  272.       }
  273.  
  274. no_send:
  275.  
  276.    if (havemail)
  277.       {
  278.       status_line (msgtxt[M_NOTHING_TO_SEND], Pretty_Addr_Str (&remote_addr));
  279.       }
  280.    else
  281.       {
  282.       status_line (msgtxt[M_GIVING_MAIL], Pretty_Addr_Str (&remote_addr));
  283.       /* Send the TSYNC's until we get a C or NAK or CAN back */
  284.       t1 = timerset (3000);                      /* set 30 second timeout */
  285.       done = 0;
  286.       while (!timeup (t1) && CARRIER && !done)   /* till then or CD lost  */
  287.          {
  288.          SENDBYTE (TSYNC);
  289.  
  290.          t2 = timerset (300);
  291.          while (CARRIER && (!timeup (t2)) && !done)
  292.             {
  293.             switch (TIMED_READ (0))
  294.                {
  295.                case 'C':
  296.                case NAK:
  297.                   done = 1;
  298.                   (void) FTSC_sendmail ();
  299.                   break;
  300.  
  301.                case CAN:
  302.                   done = 1;
  303.                   status_line (msgtxt[M_REFUSE_PICKUP], Pretty_Addr_Str (&remote_addr));
  304.                   break;
  305.  
  306.                default:
  307.                   time_release ();
  308.                }
  309.             }
  310.          }
  311.       }
  312.  
  313.    first_block = 0;
  314.  
  315.    if (wz)
  316.       {
  317.       flag_file (CLEAR_FLAG, &called_addr, 1);
  318.       return TRUE;                      /* All done if this is WaZOO */
  319.       }
  320.  
  321.    /* Now see if we want to request anything */
  322.  
  323.    sprintf (fname, "%s%s.REQ", HoldName, Hex_Addr_Str(&remote_addr));
  324. #ifdef IOS
  325.     if((i = stat(fname, &buf)) != 0 )
  326.     {
  327.         char *ext = "HOC";
  328.         
  329.         while(*ext)
  330.         {
  331.             sprintf (fname, "%s%s.%cRT", HoldName, Addr36(&remote_addr), *ext);
  332.             if((i = stat(fname, &buf)) == 0)
  333.                 break;
  334.             ext++;
  335.         }
  336.     }
  337.     if(!i)
  338. #else
  339.    if (!stat (fname, &buf))
  340. #endif
  341.       {
  342.       /* Send the SYN character and wait for an ENQ or CAN */
  343.       t1 = timerset (3000);                      /* set 30 second timeout */
  344.       done = 0;
  345.       while (!timeup (t1) && CARRIER && !done)   /* till then or CD lost  */
  346.          {
  347.          SENDBYTE (SYN);
  348.  
  349.          t2 = timerset (500);
  350.          while (CARRIER && (!timeup (t2)) && !done)
  351.             {
  352.             i = (unsigned) TIMED_READ (0);
  353.  
  354.             switch (i)
  355.                {
  356.                case ENQ:
  357.                   SEA_sendreq ();
  358.                   break;
  359.  
  360.                case CAN:
  361.                   done = 1;
  362.                   break;
  363.  
  364.                case 'C':
  365.                case NAK:
  366.                   SENDBYTE (EOT);
  367.                   break;
  368.  
  369.                case SUB:
  370.                   SENDBYTE (SYN);
  371.                   break;
  372.  
  373.                default:
  374.                   time_release ();
  375.                }
  376.             }
  377.          }
  378.       }
  379.  
  380.    /* Finally, can he request anything from us */
  381.    if (!no_requests || (!check_norequest(&remote_addr, (char**)NULL)))
  382.       (void) SEA_recvreq ();
  383.  
  384.    status_line (msgtxt[M_0001_END]);
  385.    flag_file (CLEAR_FLAG, &called_addr, 1);
  386.    return TRUE;
  387. }
  388.  
  389. static int FTSC_sendmail ()
  390. {
  391.    FILE *fp;
  392.    char fname[80];
  393.    char s[80];
  394.    char *sptr;
  395.    char *HoldName;
  396.    int c;
  397.    int i;
  398.    int j = 0;
  399.    struct stat buf;
  400.    struct _pkthdr *tmppkt;
  401.    long t1;
  402.    struct tm *tm1;
  403.  
  404.    XON_DISABLE ();
  405.  
  406.    sptr = s;
  407.    /*--------------------------------------------------------------------*/
  408.    /* Send all waiting ?UT files (mail packets)                          */
  409.    /*--------------------------------------------------------------------*/
  410.    *ext_flags = 'O';
  411.    HoldName = HoldAreaNameMunge(&called_addr);
  412.    for (c = 0; c < NUM_FLAGS; c++)
  413.       {
  414.       if (caller && (ext_flags[c] == 'H') && !check_holdonus(&called_addr, (char**)NULL))
  415.          continue;
  416.       (void) sprintf (fname,
  417.                "%s%s.%cUT",
  418.                HoldName, Hex_Addr_Str(&called_addr), ext_flags[c]);
  419.  
  420.       if (!stat (fname, &buf))
  421.          break;
  422.  
  423. #ifdef IOS
  424.         if(ext_flags[c] != 'D')
  425.             sprintf(fname, "%s%s.%cPT", HoldName, Addr36(&called_addr), ext_flags[c]);
  426.         if(!stat(fname, &buf))
  427.             break;
  428. #endif
  429.  
  430.       }                                          /* for */
  431.  
  432.    /*--- Build a dummy PKT file name */
  433.    invent_pkt_name (s);
  434.  
  435.    status_line (msgtxt[M_PACKET_MSG]);
  436.  
  437.    if (c == NUM_FLAGS)
  438.       {
  439.       (void) sprintf (fname,
  440.                "%s%s.OUT",
  441.                HoldName, Hex_Addr_Str(&called_addr));
  442.       if ((fp = fopen (fname, write_binary)) == NULL)
  443.          {
  444.          (void) got_error (msgtxt[M_OPEN_MSG], fname);
  445.          return (1);
  446.          }
  447.       t1 = time (NULL);
  448.       tm1 = localtime (&t1);
  449.  
  450.       tmppkt = (struct _pkthdr *) calloc (sizeof (struct _pkthdr), 1);
  451.       if (tmppkt == NULL)
  452.          {
  453.          status_line (msgtxt[M_MEM_ERROR]);
  454.          (void) fclose (fp);
  455.          return (1);
  456.          }
  457.  
  458.       tmppkt->product = isBITBRAIN;
  459.       tmppkt->ver.w = PUTWORD(PKTVER);
  460.       if (n_getpassword (&called_addr))
  461.          {
  462.          if (remote_password != NULL)
  463.             {
  464.             (void) strupr (remote_password);
  465.             (void) strncpy ((char *) (tmppkt->password), remote_password, 8);
  466.             }
  467.          }
  468.       tmppkt->orig_zone.w = PUTWORD(alias[assumed].ad.Zone);
  469.       tmppkt->dest_zone.w = PUTWORD(called_addr.Zone);
  470.  
  471.       if ((called_addr.Domain != NULL) &&
  472.           (called_addr.Domain != alias[assumed].ad.Domain) &&
  473.           (alias[0].ad.Domain))
  474.         {
  475.          /* Make it a type 2.2 packet instead */
  476.  
  477.           tmppkt->orig_node.w = PUTWORD(alias[assumed].ad.Node);
  478.           tmppkt->dest_node.w = PUTWORD(called_addr.Node);
  479.           tmppkt->dest_net.w = PUTWORD(called_addr.Net);
  480.           tmppkt->orig_net.w = PUTWORD(alias[assumed].ad.Net);
  481.  
  482.          tmppkt->year.w = PUTWORD(alias[assumed].ad.Point);
  483.          tmppkt->month.w = PUTWORD(called_addr.Point);
  484.          tmppkt->day.w = PUTWORD(0);
  485.          tmppkt->hour.w = PUTWORD(0);
  486.          tmppkt->minute.w = PUTWORD(0);
  487.          tmppkt->second.w = PUTWORD(0);
  488.          tmppkt->rate.w = PUTWORD(2);
  489.          if (alias[assumed].ad.Domain != NULL)
  490.             {
  491.             for (i = 0; domain_name[i] != NULL; i++)
  492.                {
  493.                if (domain_name[i] == alias[assumed].ad.Domain)
  494.                   {
  495.                   break;
  496.                   }
  497.                }
  498.             if (i < 49)
  499.                {
  500.                strncpy (tmppkt->B_fill2, domain_abbrev[i], 8);
  501.                }
  502.             }
  503.          for (i = 0; domain_name[i] != NULL; i++)
  504.             {
  505.             if (domain_name[i] == called_addr.Domain)
  506.                {
  507.                break;
  508.                }
  509.             }
  510.          if (i < 49)
  511.             {
  512.             strncpy (&(tmppkt->B_fill2[8]), domain_abbrev[i], 8);
  513.             }
  514.          }
  515.       else
  516.          {
  517.  
  518.             if(called_addr.Point || alias[assumed].ad.Point)    /* Remap */
  519.             {
  520.                 tmppkt->orig_node.w = PUTWORD(alias[assumed].ad.Point);
  521.                 tmppkt->orig_net.w = PUTWORD(alias[assumed].fakenet);
  522.                 tmppkt->dest_node.w = PUTWORD(called_addr.Point);
  523.                 tmppkt->dest_net.w = PUTWORD(alias[assumed].fakenet);
  524.             }
  525.             else
  526.             {
  527.                 tmppkt->orig_node.w = PUTWORD(alias[assumed].ad.Node);
  528.                 tmppkt->dest_node.w = PUTWORD(called_addr.Node);
  529.                 tmppkt->dest_net.w = PUTWORD(called_addr.Net);
  530.                 tmppkt->orig_net.w = PUTWORD(alias[assumed].ad.Net);
  531.             }
  532.  
  533.          tmppkt->year.w = PUTWORD(tm1->tm_year);
  534.          tmppkt->month.w = PUTWORD(tm1->tm_mon);
  535.          tmppkt->day.w = PUTWORD(tm1->tm_mday);
  536.          tmppkt->hour.w = PUTWORD(tm1->tm_hour);
  537.          tmppkt->minute.w = PUTWORD(tm1->tm_min);
  538.          tmppkt->second.w = PUTWORD(tm1->tm_sec);
  539.          tmppkt->rate.w = PUTWORD(0);
  540.          }
  541.  
  542.       (void) fwrite ((char *) tmppkt, sizeof (struct _pkthdr), 1, fp);
  543.       free (tmppkt);
  544.       (void) fwrite ("\0\0", 2, 1, fp);
  545.       (void) fclose (fp);
  546.       }
  547.    else
  548.       {
  549.       if ((fp = fopen (fname, read_binary_plus)) == NULL)
  550.          {
  551.          (void) got_error (msgtxt[M_OPEN_MSG], fname);
  552.          return (1);
  553.          }
  554.       tmppkt = (struct _pkthdr *) calloc (sizeof (struct _pkthdr), 1);
  555.       if (tmppkt == NULL)
  556.          {
  557.          status_line (msgtxt[M_MEM_ERROR]);
  558.          return (1);
  559.          }
  560.       if (fread (tmppkt, 1, sizeof (struct _pkthdr), fp) < sizeof (struct _pkthdr))
  561.          {
  562.          (void) got_error (msgtxt[M_READ_MSG], fname);
  563.          free (tmppkt);
  564.          (void) fclose (fp);
  565.          return (1);
  566.          }
  567.  
  568.       if (n_getpassword (&called_addr))
  569.          {
  570.          if (remote_password != NULL)
  571.             {
  572.             (void) strupr (remote_password);
  573.             (void) strncpy ((char *) (tmppkt->password), remote_password, 8);
  574.             }
  575.          }
  576.  
  577.  
  578.     /*
  579.      * This cant be right?
  580.      * Surely it needs to be different for a version 2.2 packet?
  581.      */
  582.  
  583.  #ifdef MULTIZONE
  584.  
  585.         /* Set the originating address in 2D */
  586.         if(alias[assumed].ad.Point)
  587.         {
  588.           tmppkt->orig_node.w = PUTWORD(alias[assumed].ad.Point);
  589.           tmppkt->orig_net.w  = PUTWORD(alias[assumed].fakenet);
  590.         }
  591.         else
  592.         {
  593.           tmppkt->orig_node.w = PUTWORD(alias[assumed].ad.Node);
  594.           tmppkt->orig_net.w  = PUTWORD(alias[assumed].ad.Net);
  595.         }
  596. #else
  597.  
  598.       tmppkt->orig_node.w = PUTWORD(alias[assumed].ad.Node);
  599.       tmppkt->orig_net.w  = PUTWORD(alias[assumed].ad.Net);
  600. #endif
  601.       /* Make sure the zone info is in there */
  602.       tmppkt->orig_zone.w = PUTWORD(alias[assumed].ad.Zone);
  603.       tmppkt->dest_zone.w = PUTWORD(called_addr.Zone);
  604.  
  605.       if ((called_addr.Domain != NULL) &&
  606.           (called_addr.Domain != alias[assumed].ad.Domain) &&
  607.           (alias[0].ad.Domain))
  608.          {
  609.          /* Make it a type 2.2 packet instead */
  610.          tmppkt->year.w = PUTWORD(alias[assumed].ad.Point);
  611.          tmppkt->month.w = PUTWORD(called_addr.Point);
  612.          tmppkt->day.w = PUTWORD(0);
  613.          tmppkt->hour.w = PUTWORD(0);
  614.          tmppkt->minute.w = PUTWORD(0);
  615.          tmppkt->second.w = PUTWORD(0);
  616.          tmppkt->rate.w = PUTWORD(2);
  617.          if (alias[assumed].ad.Domain != NULL)
  618.             {
  619.             for (i = 0; domain_name[i] != NULL; i++)
  620.                {
  621.                if (domain_name[i] == alias[assumed].ad.Domain)
  622.                   {
  623.                   break;
  624.                   }
  625.                }
  626.             if (i < 49)
  627.                {
  628.                strncpy (tmppkt->B_fill2, domain_abbrev[i], 8);
  629.                }
  630.             }
  631.          for (i = 0; domain_name[i] != NULL; i++)
  632.             {
  633.             if (domain_name[i] == called_addr.Domain)
  634.                {
  635.                break;
  636.                }
  637.             }
  638.          if (i < 49)
  639.             {
  640.             strncpy (&(tmppkt->B_fill2[8]), domain_abbrev[i], 8);
  641.             }
  642.          }
  643.  
  644.       (void) fseek (fp, 0L, SEEK_SET);
  645.       (void) fwrite (tmppkt, 1, sizeof (struct _pkthdr), fp);
  646.       (void) fclose (fp);
  647.       free (tmppkt);
  648.       }
  649.  
  650.    net_problems = (no_sealink) ? Telink_Send_File (fname, s) : SEAlink_Send_File (fname, s);
  651.  
  652.    if (net_problems != 0)
  653.       {
  654.       if (c == NUM_FLAGS)
  655.          (void) unlink (fname);
  656.       return (net_problems);
  657.       }
  658.  
  659.    /* Delete the sent packet */
  660.    (void) unlink (fname);
  661.  
  662. #ifdef IOS
  663.     {
  664.         char *ext = "HOC";
  665.         while(*ext)
  666.         {
  667.             char c = *ext++;
  668.             
  669.             if (caller && (c == 'H') && !check_holdonus(&called_addr, (char**)NULL))
  670.                 continue;
  671.             sprintf(fname, "%s%s.%cAT", HoldName, Addr36(&called_addr), c);
  672.             if(!stat(fname, &buf))
  673.             {
  674.                 make_dummy_arcmail(s, &alias[assumed].ad, &called_addr);
  675.                 net_problems = (no_sealink) 
  676.                     ? Telink_Send_File (fname, s) 
  677.                     : SEAlink_Send_File (fname, s);
  678.                 if(net_problems)
  679.                     return net_problems;
  680.                 unlink(fname);
  681.             }
  682.         }
  683.     }
  684. #endif
  685.  
  686.    /*--------------------------------------------------------------------*/
  687.    /* Send files listed in ?LO files (attached files)                    */
  688.    /*--------------------------------------------------------------------*/
  689.    *ext_flags = 'F';
  690.    status_line (" %s %s", msgtxt[M_OUTBOUND], msgtxt[M_FILE_ATTACHES]);
  691.  
  692.    if (!do_FLOfile (ext_flags, FTSC_callback, &called_addr))
  693.       return FALSE;
  694. #ifdef IOS
  695.     if(!do_FLOfile("HOC", FTSC_callback, &called_addr))
  696.         return FALSE;
  697. #endif
  698.  
  699.  
  700.    /*--------------------------------------------------------------------*/
  701.    /* Send our File requests to other system if it's a WaZOO             */
  702.    /*--------------------------------------------------------------------*/
  703.  
  704. #ifdef NEW  /* TRYREQ  28.08.1990 */
  705.    if (remote_capabilities)
  706. #else
  707.    if (requests_ok && remote_capabilities)
  708. #endif
  709.       {
  710.       sprintf (fname, request_template, HoldName, Hex_Addr_Str(&called_addr));
  711.       if (!stat (fname, &buf))
  712.          {
  713.          if (!(((unsigned) remote_capabilities) & WZ_FREQ))
  714.             status_line (msgtxt[M_FREQ_DECLINED]);
  715.          else
  716.             {
  717.             status_line (msgtxt[M_MAKING_FREQ]);
  718.             if (FTSC_callback (fname))
  719.                (void) unlink (fname);
  720.             }
  721.          }
  722. #ifdef IOS
  723.         {
  724.           char *extptr = "HOC";
  725.           while(*extptr)
  726.           {
  727.             char c = *extptr++;
  728.             if (caller && (c == 'H') && !check_holdonus(&called_addr, (char**)NULL))
  729.                 continue;
  730.             sprintf(fname, "%s%s.%cRT", HoldName, Addr36(&called_addr), c);
  731.             if(!stat(fname, &buf))
  732.             {
  733.                 if(remote_capabilities & WZ_FREQ)
  734.                     status_line (msgtxt[M_FREQ_DECLINED]);
  735.                 else
  736.                 {
  737.                     status_line (msgtxt[M_MAKING_FREQ]);
  738.                     sprintf (s, request_template, HoldName, Hex_Addr_Str(&called_addr));
  739.                     rename(fname, s);
  740.                     if (FTSC_callback(s))
  741.                         unlink (s);
  742.                 }
  743.             }
  744.           }
  745.         }
  746. #endif
  747.       }
  748.  
  749.    /*--------------------------------------------------------------------*/
  750.    /* Process WaZOO file requests from other system                      */
  751.    /*--------------------------------------------------------------------*/
  752.  
  753.    j = respond_to_file_requests (j, FTSC_callback);
  754.  
  755.    /* Now close out the file attaches */
  756.    sent_mail = 1;
  757.    *sptr = 0;
  758.    status_line (" %s %s %s", msgtxt[M_END_OF], msgtxt[M_OUTBOUND], msgtxt[M_FILE_ATTACHES]);
  759.     (void) Batch_Send (NULL);
  760.    t1 = timerset (100);
  761.    return TRUE;
  762. }
  763.  
  764. static int FTSC_recvmail ()
  765. {
  766.    char fname[80];
  767.    char fname1[80];
  768.    struct _pkthdr tmppkt;
  769.    FILE *fp;
  770.    int done;
  771.    int j;
  772.    char *p;
  773.  
  774.    status_line (msgtxt[M_RECV_MAIL]);
  775.  
  776.    if (!CARRIER)
  777.       {
  778.       status_line (msgtxt[M_NO_CARRIER]);
  779.       CLEAR_INBOUND ();
  780.       return (1);
  781.       }
  782.  
  783.    XON_DISABLE ();
  784.  
  785.     done = 0;
  786.  
  787.    /* If we don't want to pickup stuff */
  788.    if (no_pickup)
  789.       {
  790.       status_line (msgtxt[M_NO_PICKUP]);
  791.       SENDBYTE (CAN);
  792.       }
  793.    else
  794.       {
  795.       status_line (" %s %s", msgtxt[M_INBOUND], msgtxt[M_MAIL_PACKET]);
  796.       /* Invent a dummy name for the packet */
  797.       invent_pkt_name (fname1);
  798.  
  799.       /* Receive the packet with special netmail protocol */
  800.       CLEAR_INBOUND ();
  801.       p = CurrentNetFiles;
  802.       if (Xmodem_Receive_File (CurrentNetFiles, fname1) == 0)
  803.          {
  804.          got_packet = 1;
  805.          }
  806.       (void) sprintf (fname, "%s%s", p, fname1);
  807.  
  808.       /* Check the password if there is one */
  809.       if ((!remote_capabilities) && (n_getpassword (&remote_addr)))
  810.          {
  811.          if (remote_password != NULL)
  812.             {
  813.             got_packet = 0;
  814.             if ((fp = fopen (fname, read_binary_plus)) == NULL)
  815.                {
  816.                (void) got_error (msgtxt[M_OPEN_MSG], fname);
  817.                status_line (msgtxt[M_PWD_ERR_ASSUMED]);
  818.                return (1);
  819.                }
  820.             if (fread (&tmppkt, 1, sizeof (struct _pkthdr), fp) < sizeof (struct _pkthdr))
  821.                {
  822.                (void) got_error (msgtxt[M_OPEN_MSG], fname);
  823.                status_line (msgtxt[M_PWD_ERR_ASSUMED]);
  824.                (void) fclose (fp);
  825.                return (1);
  826.                }
  827.             (void) fclose (fp);
  828.             if (strnicmp (remote_password, (char *) (tmppkt.password), 8))
  829.                {
  830.                tmppkt.orig_zone.w = PUTWORD(0);
  831.                strncpy (fname1, remote_password, 8);
  832.                fname1[8] = '\0';
  833.                status_line (msgtxt[M_PWD_ERROR], tmppkt.password, fname1);
  834.                (void) strcpy (fname1, fname);
  835.                j = (int) strlen (fname) - 3;
  836.                (void) strcpy (&(fname[j]), "Bad");
  837.                if (rename (fname1, fname))
  838.                   {
  839.                   status_line (msgtxt[M_CANT_RENAME_MAIL], fname1);
  840.                   }
  841.                else
  842.                   {
  843.                   status_line (msgtxt[M_MAIL_PACKET_RENAMED], fname);
  844.                   }
  845.                return (1);
  846.                }
  847.             }
  848.          got_packet = 1;
  849.          }
  850.         called_addr = remote_addr;
  851.       got_mail = got_packet;
  852.  
  853.       done = 0;
  854.       /* Now receive the files if possible */
  855.       status_line (" %s %s", msgtxt[M_INBOUND], msgtxt[M_FILE_ATTACHES]);
  856.       done = Batch_Receive (CurrentNetFiles);
  857.       }
  858.  
  859.    status_line (" %s %s %s", msgtxt[M_END_OF], msgtxt[M_INBOUND], msgtxt[M_FILE_ATTACHES]);
  860.    CLEAR_INBOUND ();
  861.    return (done);
  862. }
  863.  
  864. static int FTSC_callback (sptr)
  865. char *sptr;
  866. {
  867.    net_problems = Batch_Send (sptr);
  868.    if (net_problems != 0)
  869.       {
  870.       net_problems = 1;
  871.       return FALSE;
  872.       }
  873.    return TRUE;
  874. }
  875.