/*--------------------------------------------------------------------------*/ /* */ /* */ /* ------------ Bit-Bucket Software, Co. */ /* \ 10001101 / Writers and Distributors of */ /* \ 011110 / Freely Available Software. */ /* \ 1011 / */ /* ------ */ /* */ /* (C) Copyright 1987-96, Bit Bucket Software Co. */ /* */ /* */ /* */ /* BinkleyTerm WaZOO/EMSI Session Logic */ /* */ /* */ /* For complete details of the licensing restrictions, please refer */ /* to the License agreement, which is published in its entirety in */ /* the MAKEFILE and BT.C, and also contained in the file LICENSE.260. */ /* */ /* USE OF THIS FILE IS SUBJECT TO THE RESTRICTIONS CONTAINED IN THE */ /* BINKLEYTERM LICENSING AGREEMENT. IF YOU DO NOT FIND THE TEXT OF */ /* THIS AGREEMENT IN ANY OF THE AFOREMENTIONED FILES, OR IF YOU DO */ /* NOT HAVE THESE FILES, YOU SHOULD IMMEDIATELY CONTACT BIT BUCKET */ /* SOFTWARE CO. AT ONE OF THE ADDRESSES LISTED BELOW. IN NO EVENT */ /* SHOULD YOU PROCEED TO USE THIS FILE WITHOUT HAVING ACCEPTED THE */ /* TERMS OF THE BINKLEYTERM LICENSING AGREEMENT, OR SUCH OTHER */ /* AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO. */ /* */ /* */ /* You can contact Bit Bucket Software Co. at any one of the following */ /* addresses: */ /* */ /* Bit Bucket Software Co. FidoNet 1:104/501, 1:343/491 */ /* P.O. Box 460398 AlterNet 7:42/1491 */ /* Aurora, CO 80046 BBS-Net 86:2030/1 */ /* Internet f491.n343.z1.fidonet.org */ /* */ /* Please feel free to contact us at any time to share your comments about */ /* our software and/or licensing policies. */ /* */ /* */ /* This module is based largely on a similar module in OPUS-CBCS V1.03b. */ /* The original work is (C) Copyright 1987, Wynn Wagner III. The original */ /* author has graciously allowed us to use his code in this work. */ /* */ /*--------------------------------------------------------------------------*/ /* Include this file before any other includes or defines! */ #include "includes.h" #ifdef HAVE_HYDRA #include "hydra.h" #endif #define rb_plus "r+b" int WaZOO_callback (char *); int WaZOO_time (long); static void LOCALFUNC InitExtAgent (void); static void LOCALFUNC DeinitExtAgent (void); int EXTMAIL_callback (char *); static int fsent; #define NUM_FLAGS 4 /*--------------------------------------------------------------------------*/ /* SEND WaZOO (send another WaZOO or EMSI-capable system its mail) */ /* returns TRUE (1) for good xfer, FALSE (0) for bad */ /*--------------------------------------------------------------------------*/ int send_WaZOO () { char fname[80]; char s[80]; char *HoldName; int c; int check_again; struct stat buf; ADDRP addrp = &called_addr; ADDR saved_addr; int i; int akas; fsent = 0; switch (remote_pickup) { case -2: /* External Mail session */ InitExtAgent (); /* ExtMail is handled like WaZOO. Fall through to that case. */ case -1: /* WaZOO Session */ akas = 1; remote_akas[0] = called_addr; break; case 1: akas = 1; break; case 2: akas = num_rakas; break; default: akas = 0; break; } saved_addr = called_addr; for (i = 0; i < akas; i++) { addrp = &remote_akas[i]; HoldName = HoldAreaNameMunge (addrp); status_line (MSG_TXT (M_EMSI_PROC_NODE), Full_Addr_Str (addrp), HoldName); check_again = 0; just_make_sure: /*--------------------------------------------------------------------*/ /* Send all waiting ?UT files (mail packets) */ /*--------------------------------------------------------------------*/ *ext_flags = 'O'; for (c = 0; c < NUM_FLAGS; c++) { #ifndef JACK_DECKER if (caller && (ext_flags[c] == 'H')) continue; #endif (void) sprintf (fname, "%s%s.%cUT", HoldName, Hex_Addr_Str (addrp), ext_flags[c]); if (!stat (fname, &buf)) { /*--- Build a dummy PKT file name */ invent_pkt_name (s); /*--- Tell ZModem to handle this as a SEND AS then DELETE */ status_line (MSG_TXT (M_PACKET_MSG)); /* Do this using the external mail agent if need be */ if (remote_pickup == -2) { if (!EXTMAIL_callback (fname)) { net_problems = 1; return FALSE; } } else #ifdef HAVE_HYDRA if (remote_capabilities & DOES_HYDRA) { fsent++; if (hydra (fname, s) == XFER_ABORT) { net_problems = 1; return FALSE; } } else #endif /* HAVE_HYDRA */ { if (!Send_Zmodem (fname, s, fsent++, DO_WAZOO)) { net_problems = 1; return FALSE; } } CLEAR_IOERR (); (void) unlink (fname); } } /* for */ /*--------------------------------------------------------------------*/ /* Send files listed in ?LO files (attached files) */ /*--------------------------------------------------------------------*/ *ext_flags = 'F'; called_addr = *addrp; if (!do_FLOfile (ext_flags, WaZOO_callback)) { called_addr = saved_addr; return FALSE; } called_addr = saved_addr; if (fsent && !check_again) { check_again = 1; goto just_make_sure; } /*--------------------------------------------------------------------*/ /* Send our File requests to other system */ /*--------------------------------------------------------------------*/ if (requests_ok && !no_pickup) { (void) sprintf (fname, "%s%s.REQ", HoldName, Hex_Addr_Str (addrp)); if (!stat (fname, &buf)) { if (!(((unsigned) remote_capabilities) & WZ_FREQ)) status_line (MSG_TXT (M_FREQ_DECLINED)); else { status_line (MSG_TXT (M_OUT_REQUESTS)); ++made_request; #ifdef HAVE_HYDRA if (remote_capabilities & DOES_HYDRA) { fsent++; if (hydra (fname, NULL) == XFER_OK) (void) unlink (fname); } else #endif /* HAVE_HYDRA */ { if (Send_Zmodem (fname, NULL, fsent++, DO_WAZOO)) (void) unlink (fname); } } } } } /* end of send loop */ /* This is as far as we go for external mail */ if (remote_pickup == -2) { DeinitExtAgent (); goto success; } #ifdef HAVE_HYDRA if (remote_capabilities & DOES_HYDRA) (void) hydra (NULL, NULL); /* End of first batch */ #endif /* HAVE_HYDRA */ fsent = respond_to_file_requests (fsent, WaZOO_callback, WaZOO_time); if (!fsent) status_line (MSG_TXT (M_NOTHING_TO_SEND), Full_Addr_Str (addrp)); #ifdef HAVE_HYDRA if (remote_capabilities & DOES_HYDRA) (void) hydra (NULL, NULL); else #endif /* HAVE_HYDRA */ (void) Send_Zmodem (NULL, NULL, ((fsent) ? END_BATCH : NOTHING_TO_DO), DO_WAZOO); success: sent_mail = 1; return TRUE; } /* WaZOO */ /* * WaZOO_callback () -- send requested file using WaZOO/EMSI method. * * */ int WaZOO_callback (char *reqs) { if (remote_pickup == -2) return EXTMAIL_callback (reqs); #ifdef HAVE_HYDRA if (remote_capabilities & DOES_HYDRA) { fsent++; switch (hydra (reqs, NULL)) { case XFER_ABORT: return (FALSE); case XFER_SKIP: return (SPEC_COND); case XFER_OK: default: return (TRUE); } } else #endif /* HAVE_HYDRA */ return (Send_Zmodem (reqs, NULL, fsent++, DO_WAZOO)); } int WaZOO_time (long filesize) { long ltemp; ltemp = filesize * 10L / cur_baud.rate_value * 100L / 95L; return (ltemp < 20L) ? 20 : (int) ltemp; } static void LOCALFUNC InitExtAgent () { status_line (MSG_TXT (M_START_EXTMAIL), Full_Addr_Str (&remote_addr)); mdm_init (modem_busy); exit_DTR (); close_up (); vfossil_cursor (1); } int EXTMAIL_callback (char *reqs) { char *p = Txbuf; char *q = Txbuf + 2048; struct stat f; long ltime; ltime = (long) time (NULL); sprintf (q, "%s.%03x", ExtMailAgent, TaskNumber); (void) unlink (q); (void) stat (reqs, &f); sprintf (p, "%s %s %03x %s", ExtMailAgent, Full_Addr_Str (&remote_addr), TaskNumber, reqs); b_spawn (p); if (!dexists (q)) { net_problems = 1; DeinitExtAgent (); return FALSE; } hist.files_out++; hist.size_out += f.st_size; hist.time_out += (long) time (NULL) - ltime; return TRUE; } static void LOCALFUNC DeinitExtAgent () { come_back (); RAISE_DTR (); mdm_init (modem_init); status_line (MSG_TXT (M_END_EXTMAIL), Full_Addr_Str (&remote_addr)); }