/*--------------------------------------------------------------------------*/ /* */ /* */ /* ------------ 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 originally written by Vince Perriello */ /* */ /* */ /* BinkleyTerm Variable Initialization */ /* */ /* */ /* 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 #include #include #include #include #include #ifdef __TURBOC__ #ifndef __TOS__ #include #endif #else #ifdef LATTICE /* #define tzset() _tzset() */ #else #include #endif #endif #include "bink.h" #include "defines.h" #include "msgs.h" #include "com.h" #include "sbuf.h" #include "sched.h" #include "zmodem.h" #include "vfossil.h" static void compile_externs( void ); /** ** b_initvars -- called before parse_config. Sets defaults that we want ** to have set FIRST. **/ void b_initvars( void ) { int k; DEFAULT.rq_OKFile = DEFAULT.rq_FILES = DEFAULT.rq_About = DEFAULT.rq_Template = DEFAULT.sc_Inbound = NULL; DEFAULT.rq_Limit = 30; /* This seems a good default */ DEFAULT.byte_Limit = 1000000L; #ifdef NEW DEFAULT.time_Limit = 60*60; #endif KNOWN.rq_OKFile = KNOWN.rq_FILES = KNOWN.rq_About = KNOWN.rq_Template = KNOWN.sc_Inbound = NULL; KNOWN.rq_Limit = -1; KNOWN.byte_Limit = -1L; #ifdef NEW KNOWN.time_Limit = -1; #endif PROT.rq_OKFile = PROT.rq_FILES = PROT.rq_About = PROT.rq_Template = PROT.sc_Inbound = NULL; PROT.rq_Limit = -1; PROT.byte_Limit = -1L; #ifdef NEW PROT.time_Limit = -1; #endif for (k = 0; k < 10; k++) /* Zero the phone scan list */ { scan_list[k] = NULL; } for (k = 0; k < MAX_EXTERN; k++) /* And the external protocols*/ { protocols[k] = NULL; } for (k = 1; k < ALIAS_CNT; k++) /* And the alias list */ { alias[k].ad.Zone = alias[k].ad.Net = alias[k].ad.Node = alias[k].ad.Point = 0; alias[k].ad.Domain = NULL; } alias[0].ad.Zone = 0; /* 0 means undefined */ alias[0].ad.Net = alias[0].ad.Node = (unsigned) -1; /* Default Fidonet address */ alias[0].ad.Point = 0; alias[0].ad.Domain = NULL; #ifndef NEW /* SWG: Do this during session anyway! */ b_init (); #endif baud = 2; cur_baud = btypes[baud].rate_value; command_line_un = 0; } /** ** b_defaultvars -- called after all parse_config passes complete. ** sets anything not handled by parse_config to default if we know it. **/ void b_defaultvars( void ) { int i; char *p, *s; #ifdef NEW /* SWG: 4th July 1991 */ ADDRESS *ad; ADKEY *key; #endif if (!fullscreen) do_screen_blank = 0; #ifndef NEW /* Set these up statically in the data */ if (modem_init == NULL) modem_init = ctl_string ("|AT|"); if (modem_busy == NULL) modem_busy = ctl_string ("|AT|"); if (net_info == NULL) net_info = ctl_string (".\\"); #endif #ifndef NEW /* Set up "boss" and "point" addresses correctly if we can */ if (boss_addr.ad.Zone == 0) boss_addr.ad.Zone = alias[0].ad.Zone; if (!boss_addr.ad.Net) { boss_addr.ad.Net = alias[0].ad.Net; boss_addr.ad.Node = alias[0].ad.Node; boss_addr.ad.Domain = alias[0].ad.Domain; } my_addr = alias[0]; if (alias[0].ad.Point) { alias[0].ad.Net = (unsigned) pvtnet; alias[0].ad.Node = alias[0].ad.Point; alias[0].ad.Point = 0; #ifndef NEW /* SWG 29jun91 : Sort out addressing properly! */ my_addr.ad.Net = boss_addr.ad.Net; my_addr.ad.Node = boss_addr.ad.Node; my_addr.ad.Domain = boss_addr.ad.Domain; #endif } #endif #ifdef NEW /* SWG: 4th July 1991 [American Independance Day!] */ /* * Fill in default zone and fakenet * * Note that unlike the previous version, the full 4D address is stored * for points rather than converting to a fakenet address * * this makes the following variables redundant, though I am currently * still using them as defaults. * * boss_addr * my_addr * pvtnet * Zone * * The use of privatenet, zone, bossphone and bosspwd are to be discouraged * but are still left in the configuration and understand as intelligently * as possible. * * Example: * address 252/25.7 25225 44-793-849044 * address 90:1004/105 * address 250/123.9 * privatenet 12345 * zone 2 * bossphone 44-61-429-9803 * * Would end up with the 3 addresses: * * 2:252 / 25.7 25225 44-793-849044 * 90:1004/105 12345 [irrelevant because it is not a point] * 2:250 /123.9 12345 44-61-429-9803 * * The fakenet addresses 2:25225/7 and 2:12345/9 are implied and sorted * out during the call negotiation. * */ i = 0; ad = alias; while(i < num_addrs) { if(ad->ad.Zone == 0) ad->ad.Zone = Zone; /* or alias[o].ad.Zone */ if(ad->fakenet == -1U) ad->fakenet = pvtnet; /* or alias[0].fakenet */ if(ad->phone == NULL) ad->phone = BOSSphone; /* or alias[0].phone */ if(ad->ad.Domain == NULL) ad->ad.Domain = domain_name[0]; /* or alias[0].ad.Domain; */ i++; ad++; } /* * Make sure KEYs are set up properly as well */ key = adkeys; while(key) { if(key->ad.Zone == 0) key->ad.Zone = Zone; /* alias[0].ad.Zone */ if(key->ad.Domain == NULL) key->ad.Domain = domain_name[0]; /* alias[0].ad.Domain; */ key = key->next; } #ifndef MULTIPOINT /* Temporarily still fill in the boss_addr and my_addr */ if(boss_addr.ad.Zone == 0) boss_addr.ad.Zone = Zone; if(!boss_addr.ad.Net) boss_addr.ad = alias[0].ad; #endif #ifndef MULTIPOINT my_addr = alias[0]; #endif #ifndef MULTIPOINT /* * What the hell! Until I fix up the yoohoo and other startup stuff * I'd better make up the fakenet address at least for alias[0] like * the old version did */ if(alias[0].ad.Point) { alias[0].ad.Net = alias[0].fakenet; alias[0].ad.Node = alias[0].ad.Point; alias[0].ad.Point = 0; } #endif #endif /* If we have the minimum information to do netmail, set the flag */ if ((alias[0].ad.Zone != 0) && (alias[0].ad.Net != 0) && (system_name != NULL) && (sysop != NULL) && (hold_area != NULL) && (DEFAULT.sc_Inbound != NULL)) { net_params = 1; flag_file (INITIALIZE, &alias[0].ad, 0); } /* Make the "higher class" requests at least as well off as the "lowest class"... */ if (KNOWN.time_Limit == -1) KNOWN.time_Limit = DEFAULT.time_Limit; if (KNOWN.byte_Limit == -1L) KNOWN.byte_Limit = DEFAULT.byte_Limit; if (KNOWN.rq_Limit == -1) KNOWN.rq_Limit = DEFAULT.rq_Limit; if (KNOWN.rq_FILES == NULL) KNOWN.rq_FILES = DEFAULT.rq_FILES; if (KNOWN.rq_OKFile == NULL) KNOWN.rq_OKFile = DEFAULT.rq_OKFile; if (KNOWN.rq_About == NULL) KNOWN.rq_About = DEFAULT.rq_About; if (KNOWN.rq_Template == NULL) KNOWN.rq_Template = DEFAULT.rq_Template; if (KNOWN.sc_Inbound == NULL) KNOWN.sc_Inbound = DEFAULT.sc_Inbound; if (PROT.time_Limit == -1) PROT.time_Limit = KNOWN.time_Limit; if (PROT.byte_Limit == -1L) PROT.byte_Limit = KNOWN.byte_Limit; if (PROT.rq_Limit == -1) PROT.rq_Limit = KNOWN.rq_Limit; if (PROT.rq_FILES == NULL) PROT.rq_FILES = KNOWN.rq_FILES; if (PROT.rq_OKFile == NULL) PROT.rq_OKFile = KNOWN.rq_OKFile; if (PROT.rq_About == NULL) PROT.rq_About = KNOWN.rq_About; if (PROT.rq_Template == NULL) PROT.rq_Template = KNOWN.rq_Template; if (PROT.sc_Inbound == NULL) PROT.sc_Inbound = KNOWN.sc_Inbound; if (!num_events) e_ptrs[0] = calloc (sizeof (BTEVENT), 1); if (extern_index) compile_externs (); /* generate extern_protocols */ if (!colors.calling && colors.hold) colors.calling = ((colors.hold & 0x70) >> 4) | ((colors.hold & 0x7) << 4) | (colors.hold & 0x8); if ((!colors.popup) && colors.call) colors.popup = colors.call; first_block = 0; /* Make our domain first in the list */ #ifdef MULTIPOINT if(alias[0].ad.Domain && (alias[0].ad.Domain != domain_name[0])) #else if (my_addr.ad.Domain != NULL) #endif { for (i = 0; domain_name[i] != NULL; i++) { #ifdef MULTIPOINT if (domain_name[i] == alias[0].ad.Domain) #else if (domain_name[i] == my_addr.ad.Domain) #endif break; } #ifdef MULTIPOINT if ((i > 0) && (domain_name[i] == alias[0].ad.Domain)) #else if ((i > 0) && (domain_name[i] == my_addr.ad.Domain)) #endif { p = domain_name[0]; domain_name[0] = domain_name[i]; domain_name[i] = p; p = domain_nodelist[0]; domain_nodelist[0] = domain_nodelist[i]; domain_nodelist[i] = p; p = domain_abbrev[0]; domain_abbrev[0] = domain_abbrev[i]; domain_abbrev[i] = p; } } for(i = 0; domain_name[i]; i++) { if(domain_abbrev[i] == NULL) { char *s; domain_abbrev[i] = strdup(domain_name[i]); s = strchr(domain_abbrev[i], '.'); if(s) *s = 0; } if(domain_nodelist[i] == NULL) domain_nodelist[i] = strdup("nodelist"); #ifdef DEBUG status_line(">Domain %s %s %s", domain_name[i], domain_abbrev[i], domain_nodelist[i]); #endif } set_prior(4); /* Always High */ #ifdef OS_2 #ifdef Snoop if (getenv("SNOOPPIPE")) snoop_open(getenv("SNOOPPIPE")); #endif /* Snoop */ #endif /* OS_2 */ if (Cominit (port_ptr) != 0x1954) { (void) printf (msgtxt[M_DRIVER_DEAD_1]); (void) printf (msgtxt[M_DRIVER_DEAD_2]); (void) printf (msgtxt[M_DRIVER_DEAD_3]); set_prior(2); /* Regular */ if (reset_port) exit_port(); exit (1); } set_prior(2); /* Regular */ i = un_attended; un_attended = 0; set_prior(4); /* Always High */ (void) set_baud (max_baud.rate_value, 0); un_attended = i; MDM_ENABLE (lock_baud && (btypes[baud].rate_value >= lock_baud) ? max_baud.rate_mask : btypes[baud].rate_mask); DTR_ON (); XON_ENABLE (); set_prior(2); /* Regular */ Txbuf = Secbuf = (char *) malloc (WAZOOMAX + 16); if (!Txbuf) { status_line (msgtxt[M_MEM_ERROR]); if (reset_port) exit_port(); exit (2); } #ifdef POPBUF /* * Pointing it to the middle of the buffer allows us to pop up * file transfer windows if we choose to do so. */ popbuf = Secbuf + 1500; #endif #ifdef NEW /* ** Set global variable timezone */ if (!time_zone) { /* ** TimeZone not in BINKLEY.CFG. Try getting it from the ** environment */ if ((s = getenv ("TZ")) != NULL) { time_zone = strdup (s); } } /* ** did we now have a setting for timezone ? */ if (time_zone) { /* ** we will only accepts a GMT+x string */ if (strnicmp (time_zone, "GMT", 3) == 0) { timezone = 3600L * atol (time_zone+3); } } /* ** Get RBUF/TBUF settings from the environment */ s = getenv("RBUF"); if (s) rBufSize = atoi(s); s = getenv("TBUF"); if (s) tBufSize = atoi(s); #endif } static void compile_externs( void ) { register char *c; register i; char junk[100]; int j, k, l; char *p; char x; i = l = 0; /* start at beginning */ junk [0] = '\0'; for (k = 0; protocols[k] != NULL; k++) /* Total no. of protos */ { c = protocols[k]; /* Point at filename */ if (!dexists (c)) /* Is it there? */ { (void) printf ("%s %s\n", msgtxt[M_NO_PROTOCOL], c); continue; } p = NULL; while (*c) /* Until end of string */ { if ((*c == '\\') || (*c == ':')) /* Look for last path */ p = c; /* Delimiter */ c++; } if (strlen (p) < 3) /* If no name, */ continue; /* No protocol... */ p++; /* Point to the */ x = toupper (*p); /* First character */ if (strchr (junk, x) != NULL) { (void) printf ("%s %s\n", msgtxt[M_DUP_PROTOCOL], c); continue; } protos[l].first_char = x; /* Makes lookup fast */ protos[l++].entry = k; /* Now we know where */ junk[i++] = x; /* Store first char */ junk[i++] = ')'; /* Then a ')' */ c = ++p; /* Point to 2nd char */ for (j = 0; j < 9; j++) /* Up to 9 chars more */ { if (*c != '.') /* If no comma yet, */ { junk[i++] = tolower (*c); /* store the char and */ ++c; /* bump the pointer */ } else junk[i++] = ' '; /* otherwise pad it */ } junk[i++] = ' '; /* And one more space */ junk[i] = '\0'; /* Need for testing */ } if (!i) /* If we got none, */ return; /* Return now. */ i += 2; /* Total for malloc */ if ((extern_protocols = malloc ((size_t)i)) == NULL) /* Allocate string */ return; /* Return on failure */ (void) strcpy (extern_protocols, junk); /* Copy the string */ return; /* Back to caller */ } /** ** b_exitproc -- called by mainline to do exit processing. **/ void b_exitproc( void ) { if (command_line_un) { set_prior(4); /* Always High */ mdm_init (modem_reset); /*mdm_init (modem_busy);*/ exit_DTR (); set_prior(2); /* Regular */ } vfossil_cursor (1); while (KEYPRESS ()) { (void) FOSSIL_CHAR (); } gotoxy (0, SB_ROWS); clear_eol (); (void) printf (msgtxt[M_THANKS], ANNOUNCE); clear_eol (); (void) printf (msgtxt[M_ANOTHER_FINE_PRODUCT]); if (vfossil_installed) vfossil_close (); if (!share) { set_prior(4); /* Always High */ MDM_DISABLE (); set_prior(2); /* Regular */ } }