home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1996 October / PCO_10.ISO / filesbbs / bsrc_260.arj / SRC.ZIP / b_wzsend.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-23  |  10.2 KB  |  364 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-96, Bit Bucket Software Co.              */
  11. /*                                                                          */
  12. /*                                                                          */
  13. /*                                                                          */
  14. /*                   BinkleyTerm WaZOO/EMSI Session Logic                   */
  15. /*                                                                          */
  16. /*                                                                          */
  17. /*    For complete  details  of the licensing restrictions, please refer    */
  18. /*    to the License  agreement,  which  is published in its entirety in    */
  19. /*    the MAKEFILE and BT.C, and also contained in the file LICENSE.260.    */
  20. /*                                                                          */
  21. /*    USE  OF THIS FILE IS SUBJECT TO THE  RESTRICTIONS CONTAINED IN THE    */
  22. /*    BINKLEYTERM  LICENSING  AGREEMENT.  IF YOU DO NOT FIND THE TEXT OF    */
  23. /*    THIS  AGREEMENT IN ANY OF THE  AFOREMENTIONED FILES,  OR IF YOU DO    */
  24. /*    NOT HAVE THESE FILES,  YOU  SHOULD  IMMEDIATELY CONTACT BIT BUCKET    */
  25. /*    SOFTWARE CO.  AT ONE OF THE  ADDRESSES  LISTED BELOW.  IN NO EVENT    */
  26. /*    SHOULD YOU  PROCEED TO USE THIS FILE  WITHOUT HAVING  ACCEPTED THE    */
  27. /*    TERMS  OF  THE  BINKLEYTERM  LICENSING  AGREEMENT,  OR  SUCH OTHER    */
  28. /*    AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO.      */
  29. /*                                                                          */
  30. /*                                                                          */
  31. /* You can contact Bit Bucket Software Co. at any one of the following      */
  32. /* addresses:                                                               */
  33. /*                                                                          */
  34. /* Bit Bucket Software Co.        FidoNet  1:104/501, 1:343/491             */
  35. /* P.O. Box 460398                AlterNet 7:42/1491                        */
  36. /* Aurora, CO 80046               BBS-Net  86:2030/1                        */
  37. /*                                Internet f491.n343.z1.fidonet.org         */
  38. /*                                                                          */
  39. /* Please feel free to contact us at any time to share your comments about  */
  40. /* our software and/or licensing policies.                                  */
  41. /*                                                                          */
  42. /*                                                                          */
  43. /*  This module is based largely on a similar module in OPUS-CBCS V1.03b.   */
  44. /*  The original work is (C) Copyright 1987, Wynn Wagner III. The original  */
  45. /*  author has graciously allowed us to use his code in this work.          */
  46. /*                                                                          */
  47. /*--------------------------------------------------------------------------*/
  48.  
  49. /* Include this file before any other includes or defines! */
  50.  
  51. #include "includes.h"
  52.  
  53. #ifdef HAVE_HYDRA
  54. #include "hydra.h"
  55. #endif
  56.  
  57. #define rb_plus "r+b"
  58.  
  59. int WaZOO_callback (char *);
  60. int WaZOO_time (long);
  61.  
  62. static void LOCALFUNC InitExtAgent (void);
  63. static void LOCALFUNC DeinitExtAgent (void);
  64. int EXTMAIL_callback (char *);
  65.  
  66. static int fsent;
  67.  
  68. #define NUM_FLAGS 4
  69.  
  70. /*--------------------------------------------------------------------------*/
  71. /* SEND WaZOO (send another WaZOO or EMSI-capable system its mail)          */
  72. /*   returns TRUE (1) for good xfer, FALSE (0) for bad                      */
  73. /*--------------------------------------------------------------------------*/
  74. int 
  75. send_WaZOO ()
  76. {
  77.     char fname[80];
  78.     char s[80];
  79.     char *HoldName;
  80.     int c;
  81.     int check_again;
  82.     struct stat buf;
  83.     ADDRP addrp = &called_addr;
  84.     ADDR saved_addr;
  85.     int i;
  86.     int akas;
  87.  
  88.     fsent = 0;
  89.  
  90.     switch (remote_pickup)
  91.     {
  92.     case -2:                    /* External Mail session */
  93.         InitExtAgent ();
  94.  
  95.     /* ExtMail is handled like WaZOO. Fall through to that case. */
  96.  
  97.     case -1:                    /* WaZOO Session */
  98.         akas = 1;
  99.         remote_akas[0] = called_addr;
  100.         break;
  101.  
  102.     case 1:
  103.         akas = 1;
  104.         break;
  105.  
  106.     case 2:
  107.         akas = num_rakas;
  108.         break;
  109.  
  110.     default:
  111.         akas = 0;
  112.         break;
  113.     }
  114.  
  115.     saved_addr = called_addr;
  116.  
  117.     for (i = 0; i < akas; i++)
  118.     {
  119.         addrp = &remote_akas[i];
  120.         HoldName = HoldAreaNameMunge (addrp);
  121.         status_line (MSG_TXT (M_EMSI_PROC_NODE), Full_Addr_Str (addrp), HoldName);
  122.         check_again = 0;
  123.  
  124. just_make_sure:
  125.         /*--------------------------------------------------------------------*/
  126.         /* Send all waiting ?UT files (mail packets)                          */
  127.         /*--------------------------------------------------------------------*/
  128.         *ext_flags = 'O';
  129.         for (c = 0; c < NUM_FLAGS; c++)
  130.         {
  131. #ifndef JACK_DECKER
  132.             if (caller && (ext_flags[c] == 'H'))
  133.                 continue;
  134. #endif
  135.  
  136.             (void) sprintf (fname,
  137.                 "%s%s.%cUT",
  138.                 HoldName, Hex_Addr_Str (addrp), ext_flags[c]);
  139.  
  140.             if (!stat (fname, &buf))
  141.             {
  142.  
  143.                 /*--- Build a dummy PKT file name */
  144.                 invent_pkt_name (s);
  145.  
  146.                 /*--- Tell ZModem to handle this as a SEND AS then DELETE */
  147.                 status_line (MSG_TXT (M_PACKET_MSG));
  148.  
  149.                 /* Do this using the external mail agent if need be */
  150.                 if (remote_pickup == -2)
  151.                 {
  152.                     if (!EXTMAIL_callback (fname))
  153.                     {
  154.                         net_problems = 1;
  155.                         return FALSE;
  156.                     }
  157.                 }
  158.                 else
  159. #ifdef HAVE_HYDRA
  160.                 if (remote_capabilities & DOES_HYDRA)
  161.                 {
  162.                     fsent++;
  163.                     if (hydra (fname, s) == XFER_ABORT)
  164.                     {
  165.                         net_problems = 1;
  166.                         return FALSE;
  167.                     }
  168.                 }
  169.                 else
  170. #endif /* HAVE_HYDRA */
  171.                 {
  172.                     if (!Send_Zmodem (fname, s, fsent++, DO_WAZOO))
  173.                     {
  174.                         net_problems = 1;
  175.                         return FALSE;
  176.                     }
  177.                 }
  178.                 CLEAR_IOERR ();
  179.                 (void) unlink (fname);
  180.             }
  181.         }                        /* for */
  182.  
  183.         /*--------------------------------------------------------------------*/
  184.         /* Send files listed in ?LO files (attached files)                    */
  185.         /*--------------------------------------------------------------------*/
  186.         *ext_flags = 'F';
  187.         called_addr = *addrp;
  188.         if (!do_FLOfile (ext_flags, WaZOO_callback))
  189.         {
  190.             called_addr = saved_addr;
  191.             return FALSE;
  192.         }
  193.  
  194.         called_addr = saved_addr;
  195.         if (fsent && !check_again)
  196.         {
  197.             check_again = 1;
  198.             goto just_make_sure;
  199.         }
  200.  
  201.         /*--------------------------------------------------------------------*/
  202.         /* Send our File requests to other system                             */
  203.         /*--------------------------------------------------------------------*/
  204.         if (requests_ok && !no_pickup)
  205.         {
  206.             (void) sprintf (fname, "%s%s.REQ", HoldName, Hex_Addr_Str (addrp));
  207.             if (!stat (fname, &buf))
  208.             {
  209.                 if (!(((unsigned) remote_capabilities) & WZ_FREQ))
  210.                     status_line (MSG_TXT (M_FREQ_DECLINED));
  211.                 else
  212.                 {
  213.                     status_line (MSG_TXT (M_OUT_REQUESTS));
  214.                     ++made_request;
  215. #ifdef HAVE_HYDRA
  216.                     if (remote_capabilities & DOES_HYDRA)
  217.                     {
  218.                         fsent++;
  219.                         if (hydra (fname, NULL) == XFER_OK)
  220.                             (void) unlink (fname);
  221.                     }
  222.                     else
  223. #endif /* HAVE_HYDRA */
  224.                     {
  225.                         if (Send_Zmodem (fname, NULL, fsent++, DO_WAZOO))
  226.                             (void) unlink (fname);
  227.                     }
  228.                 }
  229.             }
  230.         }
  231.     }                            /* end of send loop */
  232.  
  233.     /* This is as far as we go for external mail */
  234.  
  235.     if (remote_pickup == -2)
  236.     {
  237.         DeinitExtAgent ();
  238.         goto success;
  239.     }
  240.  
  241. #ifdef HAVE_HYDRA
  242.     if (remote_capabilities & DOES_HYDRA)
  243.         (void) hydra (NULL, NULL);    /* End of first batch */
  244. #endif    /* HAVE_HYDRA */
  245.  
  246.     fsent = respond_to_file_requests (fsent, WaZOO_callback, WaZOO_time);
  247.  
  248.     if (!fsent)
  249.         status_line (MSG_TXT (M_NOTHING_TO_SEND), Full_Addr_Str (addrp));
  250.  
  251. #ifdef HAVE_HYDRA
  252.     if (remote_capabilities & DOES_HYDRA)
  253.         (void) hydra (NULL, NULL);
  254.     else
  255. #endif    /* HAVE_HYDRA */
  256.         (void) Send_Zmodem (NULL, NULL, ((fsent) ? END_BATCH : NOTHING_TO_DO), DO_WAZOO);
  257.  
  258. success:
  259.  
  260.     sent_mail = 1;
  261.     return TRUE;
  262.  
  263. }                                /* WaZOO */
  264.  
  265. /*
  266.  * WaZOO_callback () -- send requested file using WaZOO/EMSI method.
  267.  *
  268.  *
  269.  */
  270. int 
  271. WaZOO_callback (char *reqs)
  272. {
  273.     if (remote_pickup == -2)
  274.         return EXTMAIL_callback (reqs);
  275.  
  276. #ifdef HAVE_HYDRA
  277.     if (remote_capabilities & DOES_HYDRA)
  278.     {
  279.         fsent++;
  280.         switch (hydra (reqs, NULL))
  281.         {
  282.         case XFER_ABORT:
  283.             return (FALSE);
  284.  
  285.         case XFER_SKIP:
  286.             return (SPEC_COND);
  287.  
  288.         case XFER_OK:
  289.         default:
  290.             return (TRUE);
  291.         }
  292.     }
  293.     else
  294. #endif    /* HAVE_HYDRA */
  295.         return (Send_Zmodem (reqs, NULL, fsent++, DO_WAZOO));
  296. }
  297.  
  298. int 
  299. WaZOO_time (long filesize)
  300. {
  301.     long ltemp;
  302.  
  303.     ltemp = filesize * 10L / cur_baud.rate_value * 100L / 95L;
  304.     return (ltemp < 20L) ? 20 : (int) ltemp;
  305. }
  306.  
  307. static void LOCALFUNC
  308. InitExtAgent ()
  309. {
  310.     status_line (MSG_TXT (M_START_EXTMAIL), Full_Addr_Str (&remote_addr));
  311.     mdm_init (modem_busy);
  312.     exit_DTR ();
  313.     close_up ();
  314.     vfossil_cursor (1);
  315. }
  316.  
  317. int
  318. EXTMAIL_callback (char *reqs)
  319. {
  320.     char *p = Txbuf;
  321.     char *q = Txbuf + 2048;
  322.     struct stat f;
  323.     long ltime;
  324.  
  325.     ltime = (long) time (NULL);
  326.  
  327.     sprintf (q, "%s.%03x", ExtMailAgent, TaskNumber);
  328.     (void) unlink (q);
  329.  
  330.     (void) stat (reqs, &f);
  331.  
  332.     sprintf (p, "%s %s %03x %s",
  333.         ExtMailAgent,
  334.         Full_Addr_Str (&remote_addr),
  335.         TaskNumber,
  336.         reqs);
  337.     b_spawn (p);
  338.  
  339.     if (!dexists (q))
  340.     {
  341.         net_problems = 1;
  342.         DeinitExtAgent ();
  343.         return FALSE;
  344.     }
  345.  
  346.     hist.files_out++;
  347.     hist.size_out += f.st_size;
  348.     hist.time_out += (long) time (NULL) - ltime;
  349.  
  350.     return TRUE;
  351. }
  352.  
  353. static void LOCALFUNC
  354. DeinitExtAgent ()
  355. {
  356.     come_back ();
  357.     RAISE_DTR ();
  358.     mdm_init (modem_init);
  359.     status_line (MSG_TXT (M_END_EXTMAIL), Full_Addr_Str (&remote_addr));
  360. }
  361.  
  362.  
  363.  
  364.