/*--------------------------------------------------------------------------*/ /* */ /* */ /* ------------ Bit-Bucket Software, Co. */ /* \ 10001101 / Writers and Distributors of */ /* \ 011110 / Freely Available Software. */ /* \ 1011 / */ /* ------ */ /* */ /* (C) Copyright 1987-90, Bit Bucket Software Co., a Delaware Corporation. */ /* */ /* */ /* This module was written by Vince Perriello */ /* */ /* */ /* BinkleyTerm Mail Session Initiator */ /* */ /* */ /* 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.240. */ /* */ /* 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:132/491, 1:141/491 */ /* P.O. Box 460398 AlterNet 7:491/0 */ /* Aurora, CO 80046 BBS-Net 86:2030/1 */ /* Internet f491.n132.z1.fidonet.org */ /* */ /* Please feel free to contact us at any time to share your comments about */ /* our software and/or licensing policies. */ /* */ /*--------------------------------------------------------------------------*/ #include #ifdef __TURBOC__ #include #else #include #endif #include #define WAZOO_SECTION #define MATRIX_SECTION #include "com.h" #include "xfer.h" #include "zmodem.h" #include "keybd.h" #include "sbuf.h" #include "sched.h" #include "externs.h" #include "prototyp.h" #include "defines.h" extern int CallerSendSync (void); extern int CalledRecvSync (void); void b_session (was_initiator) int was_initiator; { int i; ADDR tmp; tmp.Zone = 0; tmp.Net = 0; tmp.Node = 0; tmp.Point = 0; tmp.Domain = NULL; CurrentNetFiles = DEFAULT.sc_Inbound; mail_finished = 0; time (&etm); freq_accum.bytes = 0L; freq_accum.files = 0; if (un_attended && fullscreen) { do_ready (msgtxt[M_READY_CONNECT]); } /* Remove the old .REQ and .RSP files */ for (i = 0; i < 10; i++) { if (alias[i].Net == 0) break; (void) sprintf (junk, "%s%s.REQ", CurrentNetFiles, Hex_Addr_Str (&(alias[i]))); (void) unlink (junk); (void) sprintf (junk, "%s.RSP", Hex_Addr_Str (&(alias[i]))); (void) unlink (junk); } remote_capabilities = 0; (void) flag_file (SET_SESSION_FLAG, &called_addr, 0); if (was_initiator) { /* * OUTBOUND -- meaning call was made by us. */ last_type (1, &remote_addr); if (Whack_CR ()) { return; } switch (i = CallerSendSync()) { case 1: FTSC_sender (0); break; case 2: if (YooHoo_Sender ()) { /* Send Hello packet, */ WaZOO (1); } break; default: break; } /* end switch */ } else { /* * INBOUND -- meaning we were connected to by another system. */ switch (i = CalledRecvSync()) { case 1: /* ESCape or Timeout */ if (CARRIER && !mail_only) { last_type (3, &tmp); (void) flag_file (CLEAR_SESSION_FLAG, &called_addr, 0); BBSexit (); } break; case 2: /* FTSC Netmail Session */ if (CARRIER) { tmp.Zone = -1000; last_type (2, &tmp); tmp.Zone = 0; ++hist.mail_calls; if (un_attended && fullscreen) { sb_move (historywin, HIST_MAIL_ROW, HIST_COL); (void) sprintf (junk, "%d/%d", hist.bbs_calls, hist.mail_calls); sb_puts (historywin, (unsigned char *) junk); sb_show (); } (void) FTSC_receiver (0); } break; case 3: /* WaZOO Netmail Session*/ if (YooHoo_Receiver ()) { last_type (1, &remote_addr); ++hist.mail_calls; if (un_attended && fullscreen) { sb_move (historywin, HIST_MAIL_ROW, HIST_COL); (void) sprintf (junk, "%d/%d", hist.bbs_calls, hist.mail_calls); sb_puts (historywin, (unsigned char *) junk); } WaZOO (0); /* do WaZOO!!! */ } break; default: if ((i >= 5) && (i < (5 + num_ext_mail))) { /*See if ext mail*/ if (CARRIER) { last_type (4, &tmp); (void) flag_file (CLEAR_SESSION_FLAG, &called_addr, 0); UUCPexit (lev_ext_mail[i-5]); } } break; } /* end switch */ } /* end if (was_initiator) */ (void) flag_file (CLEAR_SESSION_FLAG, &called_addr, 0); return; } void b_init () { got_arcmail = got_packet = got_mail = sent_mail = 0; remote_addr.Zone = remote_addr.Net = remote_addr.Node = remote_addr.Point = 0; remote_addr.Domain = NULL; Netmail_Session = remote_capabilities = mail_finished = 0; CurrentNetFiles = DEFAULT.sc_Inbound; } /* * Send banner-type lines to remote. Since strange modems like Courier HST * have a propensity for thinking they are connected when talking to a dial * tone (but do leave CTS down just to screw us up) we have to use a timeout * to figure out if we are in trouble, and if so, we drop DTR to make the * bogus carrier go away. * * This routine is used in modules B_BBS.C and RECVSYNC.C, both of which * are called from this module only. * */ int SendBanner (string) char *string; { long t1; register char c; t1 = timerset (600); /* 60 seconds max to put out * banner */ while (!timeup (t1) && CARRIER) { if (got_ESC ()) /* Manual abort? */ break; /* Use failure logic */ if (!OUT_FULL ()) { c = *string++; if (!c || c == 0x1a) /* Test for end */ return (1); /* Yes, success */ SENDBYTE ((unsigned char) c); } } /* * If we get here we had trouble. Drop DTR now to hopefully get out of * this trouble. Flush outbound. Pause for 1 second. */ DTR_OFF (); CLEAR_OUTBOUND (); timer (10); CLEAR_INBOUND (); return (0); } int flag_file (function, address, do_stat) int function; ADDR *address; int do_stat; { FILE *fptr; char *HoldName; static ADDR last_set; char flagname[128]; char tmpname[128]; if (!TaskNumber) return (FALSE); HoldName = HoldAreaNameMunge (address); switch (function) { case INITIALIZE: last_set.Zone = -1; break; case SET_SESSION_FLAG: /* At the start of a session, set up the task number */ if (flag_dir) { sprintf (flagname, "%sTask.%d", flag_dir, TaskNumber); fptr = fopen (flagname, "wb"); fclose (fptr); } return (FALSE); case CLEAR_SESSION_FLAG: /* At the end of a session, delete the task file */ if (flag_dir) { sprintf (flagname, "%sTask.%d", flag_dir, TaskNumber); unlink (flagname); } return (FALSE); case TEST_AND_SET: /* * First see if we already HAVE this lock! If so, return now. * */ if (memcmp (&last_set, address, sizeof (ADDR)) == 0) return (FALSE); /* * Check for the INMAIL.$$$ file. * */ if (flag_dir != NULL) { sprintf (tmpname, "%sINMAIL.$$$",flag_dir); if ((fptr = fopen (tmpname, "rb")) != NULL) { fclose (fptr); if (!CARRIER) if (do_stat) status_line (":Other Node Processing Mail"); return (TRUE); } } /* * Next create a file using a temporary name. * */ sprintf (tmpname, "%sBINK%04x.BSY",HoldName,TaskNumber); fptr = fopen (tmpname, "wb"); if (fptr == NULL) { if (do_stat) status_line (msgtxt[M_FAILED_CREATE_FLAG],tmpname); return (TRUE); } fclose (fptr); /* * Now the test&set. Attempt to rename the file. * If we succeed, we have the lock. If we do not, * delete the temp file. * */ sprintf (flagname, "%s%04x%04x.BSY", HoldName, address->Net,address->Node); if (!rename (tmpname, flagname)) { if (do_stat) status_line (msgtxt[M_CREATED_FLAGFILE],flagname); memcpy (&last_set, address, sizeof (ADDR)); return (FALSE); } if (do_stat) status_line (msgtxt[M_THIS_ADDRESS_LOCKED], Full_Addr_Str (address)); unlink (tmpname); return (TRUE); case CLEAR_FLAG: /* * Make sure we need to clear something. * Zone should be something other than -1 if that's the case. * */ if (last_set.Zone == -1) return (TRUE); /* * Next compare what we want to clear with what we think we have. * */ if (memcmp (&last_set, address, sizeof (ADDR)) != 0) { if (do_stat) status_line (msgtxt[M_BAD_CLEAR_FLAGFILE], Full_Addr_Str (address)); return (TRUE); } /* * We match. Unlink the flag file. If we're successful, jam a -1 * into our saved Zone. * */ sprintf (flagname, "%s%04x%04x.BSY", HoldName, address->Net,address->Node); if (!unlink (flagname)) { if (do_stat) status_line (msgtxt[M_CLEARED_FLAGFILE], flagname); last_set.Zone = -1; return (TRUE); } if (do_stat) status_line (msgtxt[M_FAILED_CLEAR_FLAG],flagname); return (FALSE); default: break; } return (TRUE); }