home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / bts314b4 / b_initva.c < prev    next >
C/C++ Source or Header  |  1994-09-17  |  19KB  |  617 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 originally written by Vince Perriello           */
  14. /*                                                                          */
  15. /*                                                                          */
  16. /*                   BinkleyTerm Variable Initialization                    */
  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 <ctype.h>
  48. #include <conio.h>
  49. #include <time.h>
  50. #include <string.h>
  51. #include <stdlib.h>
  52.  
  53. #ifdef __TURBOC__
  54. #ifndef __TOS__
  55. #include <mem.h>
  56. #endif
  57. #else
  58. #ifdef LATTICE
  59. /* #define tzset() _tzset() */
  60. #else
  61. #include <memory.h>
  62. #endif
  63. #endif
  64.  
  65. #include "bink.h"
  66. #include "defines.h"
  67. #include "msgs.h"
  68. #include "com.h"
  69. #include "sbuf.h"
  70. #include "sched.h"
  71. #include "zmodem.h"
  72. #include "vfossil.h"
  73.  
  74. static void compile_externs( void );
  75.  
  76. /**
  77.  ** b_initvars -- called before parse_config. Sets defaults that we want
  78.  ** to have set FIRST.
  79.  **/
  80.  
  81.  
  82. void b_initvars( void )
  83. {
  84.    int k;
  85.  
  86.    DEFAULT.rq_OKFile = DEFAULT.rq_FILES = DEFAULT.rq_About = DEFAULT.rq_Template = DEFAULT.sc_Inbound = NULL;
  87.    DEFAULT.rq_Limit = 30;                        /* This seems a good default */
  88.    DEFAULT.byte_Limit = 1000000L;
  89. #ifdef NEW
  90.    DEFAULT.time_Limit = 60*60;
  91. #endif
  92.  
  93.    KNOWN.rq_OKFile = KNOWN.rq_FILES = KNOWN.rq_About = KNOWN.rq_Template = KNOWN.sc_Inbound = NULL;
  94.    KNOWN.rq_Limit = -1;
  95.    KNOWN.byte_Limit = -1L;
  96. #ifdef NEW
  97.    KNOWN.time_Limit = -1;
  98. #endif
  99.  
  100.    PROT.rq_OKFile = PROT.rq_FILES = PROT.rq_About = PROT.rq_Template = PROT.sc_Inbound = NULL;
  101.    PROT.rq_Limit = -1;
  102.    PROT.byte_Limit = -1L;
  103. #ifdef NEW
  104.    PROT.time_Limit = -1;
  105. #endif
  106.  
  107.    for (k = 0; k < 10; k++)                      /* Zero the phone scan list  */
  108.       {
  109.       scan_list[k] = NULL;
  110.       }
  111.  
  112.    for (k = 0; k < MAX_EXTERN; k++)              /* And the external protocols*/
  113.       {
  114.       protocols[k] = NULL;
  115.       }
  116.  
  117.    for (k = 1; k < ALIAS_CNT; k++)               /* And the alias list        */
  118.       {
  119.       alias[k].ad.Zone = alias[k].ad.Net = alias[k].ad.Node = alias[k].ad.Point = 0;
  120.       alias[k].ad.Domain = NULL;
  121.       }
  122.  
  123.    alias[0].ad.Zone = 0;                            /* 0 means undefined */
  124.    alias[0].ad.Net = alias[0].ad.Node = (unsigned) -1;      /* Default Fidonet address   */
  125.    alias[0].ad.Point = 0;
  126.    alias[0].ad.Domain = NULL;
  127.  
  128. #ifndef NEW    /* SWG: Do this during session anyway! */
  129.    b_init ();
  130. #endif
  131.  
  132.    baud = 2;
  133.    cur_baud = btypes[baud].rate_value;
  134.    command_line_un = 0;
  135. }
  136.  
  137. /**
  138.  ** b_defaultvars -- called after all parse_config passes complete.
  139.  ** sets anything not handled by parse_config to default if we know it.
  140.  **/
  141.  
  142.  
  143. void b_defaultvars( void )
  144. {
  145.   int i;
  146.    char *p, *s;
  147. #ifdef NEW    /* SWG: 4th July 1991 */
  148.     ADDRESS *ad;
  149.     ADKEY *key;
  150. #endif
  151.  
  152.    if (!fullscreen)
  153.       do_screen_blank = 0;
  154.  
  155. #ifndef NEW    /* Set these up statically in the data */
  156.    if (modem_init == NULL)
  157.       modem_init = ctl_string ("|AT|");
  158.    if (modem_busy == NULL)
  159.       modem_busy = ctl_string ("|AT|");
  160.  
  161.    if (net_info == NULL)
  162.       net_info = ctl_string (".\\");
  163. #endif
  164.  
  165. #ifndef NEW
  166.    /* Set up "boss" and "point" addresses correctly if we can */
  167.  
  168.    if (boss_addr.ad.Zone == 0)
  169.       boss_addr.ad.Zone = alias[0].ad.Zone;
  170.  
  171.    if (!boss_addr.ad.Net)
  172.       {
  173.       boss_addr.ad.Net  = alias[0].ad.Net;
  174.       boss_addr.ad.Node = alias[0].ad.Node;
  175.       boss_addr.ad.Domain = alias[0].ad.Domain;
  176.       }
  177.  
  178.    my_addr = alias[0];
  179.    if (alias[0].ad.Point)
  180.       {
  181.       alias[0].ad.Net   = (unsigned) pvtnet;
  182.       alias[0].ad.Node  = alias[0].ad.Point;
  183.       alias[0].ad.Point = 0;
  184. #ifndef NEW    /* SWG 29jun91 : Sort out addressing properly! */
  185.       my_addr.ad.Net = boss_addr.ad.Net;
  186.       my_addr.ad.Node = boss_addr.ad.Node;
  187.       my_addr.ad.Domain = boss_addr.ad.Domain;
  188. #endif
  189.       }
  190. #endif
  191.  
  192. #ifdef NEW    /* SWG: 4th July 1991 [American Independance Day!] */
  193.     /*
  194.      * Fill in default zone and fakenet
  195.      *
  196.      * Note that unlike the previous version, the full 4D address is stored
  197.      * for points rather than converting to a fakenet address
  198.      *
  199.      * this makes the following variables redundant, though I am currently
  200.      * still using them as defaults.
  201.      *
  202.      *    boss_addr
  203.      *    my_addr
  204.      *    pvtnet
  205.      *    Zone
  206.      *
  207.      * The use of privatenet, zone, bossphone and bosspwd are to be discouraged
  208.      * but are still left in the configuration and understand as intelligently
  209.      * as possible.
  210.      *
  211.      * Example:
  212.      *   address 252/25.7 25225 44-793-849044
  213.      *   address 90:1004/105
  214.      *   address 250/123.9
  215.      *   privatenet 12345
  216.      *   zone 2
  217.      *   bossphone 44-61-429-9803
  218.      *
  219.      * Would end up with the 3 addresses:
  220.      *
  221.      *   2:252 / 25.7 25225 44-793-849044
  222.      *  90:1004/105   12345 [irrelevant because it is not a point]
  223.      *   2:250 /123.9 12345 44-61-429-9803
  224.      *
  225.      * The fakenet addresses 2:25225/7 and 2:12345/9 are implied and sorted
  226.      * out during the call negotiation.
  227.      *
  228.      */
  229.  
  230.     i = 0;
  231.     ad = alias;
  232.     while(i < num_addrs)
  233.     {
  234.         if(ad->ad.Zone == 0)
  235.             ad->ad.Zone = Zone;                    /* or alias[o].ad.Zone */
  236.         if(ad->fakenet == -1U)
  237.             ad->fakenet = pvtnet;                /* or alias[0].fakenet */
  238.         if(ad->phone == NULL)
  239.             ad->phone = BOSSphone;                /* or alias[0].phone */
  240.         if(ad->ad.Domain == NULL)
  241.             ad->ad.Domain = domain_name[0];        /* or alias[0].ad.Domain; */
  242.         i++;
  243.         ad++;
  244.     }
  245.  
  246.     /*
  247.      * Make sure KEYs are set up properly as well
  248.      */
  249.     
  250.     key = adkeys;
  251.     while(key)
  252.     {
  253.         if(key->ad.Zone == 0)
  254.             key->ad.Zone = Zone;                /* alias[0].ad.Zone */
  255.         if(key->ad.Domain == NULL)
  256.             key->ad.Domain = domain_name[0];    /* alias[0].ad.Domain; */
  257.         key = key->next;
  258.     }
  259.  
  260. #ifndef MULTIPOINT
  261.     /* Temporarily still fill in the boss_addr and my_addr */
  262.     
  263.     if(boss_addr.ad.Zone == 0)
  264.         boss_addr.ad.Zone = Zone;
  265.     if(!boss_addr.ad.Net)
  266.         boss_addr.ad = alias[0].ad;
  267. #endif
  268. #ifndef MULTIPOINT
  269.     my_addr = alias[0];
  270. #endif
  271.  
  272. #ifndef MULTIPOINT
  273.     /*
  274.      * What the hell!  Until I fix up the yoohoo and other startup stuff
  275.      * I'd better make up the fakenet address at least for alias[0] like
  276.      * the old version did
  277.      */
  278.      
  279.     if(alias[0].ad.Point)
  280.     {
  281.         alias[0].ad.Net = alias[0].fakenet;
  282.         alias[0].ad.Node = alias[0].ad.Point;
  283.         alias[0].ad.Point = 0;
  284.     }
  285. #endif
  286. #endif
  287.  
  288.  
  289.    /* If we have the minimum information to do netmail, set the flag */
  290.  
  291.    if ((alias[0].ad.Zone      != 0)
  292.    &&  (alias[0].ad.Net       != 0)
  293.    &&  (system_name        != NULL)
  294.    &&  (sysop              != NULL)
  295.    &&  (hold_area          != NULL)
  296.    &&  (DEFAULT.sc_Inbound != NULL))
  297.    {
  298.       net_params = 1;
  299.       flag_file (INITIALIZE, &alias[0].ad, 0);
  300.    }
  301.  
  302.    /* Make the "higher class" requests at least as well off as the
  303.       "lowest class"... */
  304.  
  305.    if (KNOWN.time_Limit == -1)
  306.       KNOWN.time_Limit = DEFAULT.time_Limit;
  307.    if (KNOWN.byte_Limit == -1L)
  308.       KNOWN.byte_Limit = DEFAULT.byte_Limit;
  309.    if (KNOWN.rq_Limit == -1)
  310.       KNOWN.rq_Limit = DEFAULT.rq_Limit;
  311.    if (KNOWN.rq_FILES == NULL)
  312.       KNOWN.rq_FILES = DEFAULT.rq_FILES;
  313.    if (KNOWN.rq_OKFile == NULL)
  314.       KNOWN.rq_OKFile = DEFAULT.rq_OKFile;
  315.    if (KNOWN.rq_About == NULL)
  316.       KNOWN.rq_About = DEFAULT.rq_About;
  317.    if (KNOWN.rq_Template == NULL)
  318.       KNOWN.rq_Template = DEFAULT.rq_Template;
  319.    if (KNOWN.sc_Inbound == NULL)
  320.       KNOWN.sc_Inbound = DEFAULT.sc_Inbound;
  321.  
  322.    if (PROT.time_Limit == -1)
  323.       PROT.time_Limit = KNOWN.time_Limit;
  324.    if (PROT.byte_Limit == -1L)
  325.       PROT.byte_Limit = KNOWN.byte_Limit;
  326.    if (PROT.rq_Limit == -1)
  327.       PROT.rq_Limit = KNOWN.rq_Limit;
  328.    if (PROT.rq_FILES == NULL)
  329.       PROT.rq_FILES = KNOWN.rq_FILES;
  330.    if (PROT.rq_OKFile == NULL)
  331.       PROT.rq_OKFile = KNOWN.rq_OKFile;
  332.    if (PROT.rq_About == NULL)
  333.       PROT.rq_About = KNOWN.rq_About;
  334.    if (PROT.rq_Template == NULL)
  335.       PROT.rq_Template = KNOWN.rq_Template;
  336.    if (PROT.sc_Inbound == NULL)
  337.       PROT.sc_Inbound = KNOWN.sc_Inbound;
  338.  
  339.    if (!num_events)
  340.       e_ptrs[0] = calloc (sizeof (BTEVENT), 1);
  341.  
  342.    if (extern_index)
  343.       compile_externs ();                        /* generate extern_protocols */
  344.  
  345.    if (!colors.calling && colors.hold)
  346.       colors.calling = ((colors.hold & 0x70) >> 4) | ((colors.hold & 0x7) << 4) | (colors.hold & 0x8);
  347.  
  348.    if ((!colors.popup) && colors.call)
  349.       colors.popup = colors.call;
  350.  
  351.    first_block = 0;
  352.  
  353.     /* Make our domain first in the list */
  354.  
  355. #ifdef MULTIPOINT
  356.     if(alias[0].ad.Domain && (alias[0].ad.Domain != domain_name[0]))    
  357. #else
  358.        if (my_addr.ad.Domain != NULL)
  359. #endif
  360.     {
  361.         for (i = 0; domain_name[i] != NULL; i++)
  362.         {
  363. #ifdef MULTIPOINT
  364.             if (domain_name[i] == alias[0].ad.Domain)
  365. #else
  366.              if (domain_name[i] == my_addr.ad.Domain)
  367. #endif
  368.                 break;
  369.          }
  370.  
  371. #ifdef MULTIPOINT
  372.           if ((i > 0) && (domain_name[i] == alias[0].ad.Domain))
  373. #else
  374.           if ((i > 0) && (domain_name[i] == my_addr.ad.Domain))
  375. #endif
  376.         {
  377.              p = domain_name[0];
  378.              domain_name[0] = domain_name[i];
  379.              domain_name[i] = p;
  380.              p = domain_nodelist[0];
  381.              domain_nodelist[0] = domain_nodelist[i];
  382.              domain_nodelist[i] = p;
  383.              p = domain_abbrev[0];
  384.              domain_abbrev[0] = domain_abbrev[i];
  385.              domain_abbrev[i] = p;
  386.            }
  387.        }
  388.  
  389.     for(i = 0; domain_name[i]; i++)
  390.     {
  391.         if(domain_abbrev[i] == NULL)
  392.         {
  393.             char *s;
  394.             domain_abbrev[i] = strdup(domain_name[i]);
  395.             s = strchr(domain_abbrev[i], '.');
  396.             if(s)
  397.                 *s = 0;
  398.         }
  399.         if(domain_nodelist[i] == NULL)
  400.             domain_nodelist[i] = strdup("nodelist");
  401. #ifdef DEBUG 
  402.         status_line(">Domain %s %s %s", domain_name[i], domain_abbrev[i], domain_nodelist[i]);
  403. #endif 
  404.     }
  405.  
  406.        set_prior(4);                                    /* Always High */
  407.  
  408. #ifdef OS_2
  409. #ifdef Snoop
  410.    if (getenv("SNOOPPIPE"))
  411.       snoop_open(getenv("SNOOPPIPE"));
  412. #endif /* Snoop */
  413. #endif /* OS_2  */
  414.  
  415.    if (Cominit (port_ptr) != 0x1954)
  416.       {
  417.       (void) printf (msgtxt[M_DRIVER_DEAD_1]);
  418.       (void) printf (msgtxt[M_DRIVER_DEAD_2]);
  419.       (void) printf (msgtxt[M_DRIVER_DEAD_3]);
  420.       set_prior(2);                                 /* Regular */
  421.       if (reset_port) exit_port();
  422.       exit (1);
  423.       }
  424.  
  425.    set_prior(2);                                    /* Regular */
  426.  
  427.    i = un_attended;
  428.    un_attended = 0;
  429.  
  430.    set_prior(4);                                    /* Always High */
  431.  
  432.    (void) set_baud (max_baud.rate_value, 0);
  433.    un_attended = i;
  434.  
  435.    MDM_ENABLE (lock_baud && (btypes[baud].rate_value >= lock_baud) ? max_baud.rate_mask : btypes[baud].rate_mask);
  436.    DTR_ON ();
  437.    XON_ENABLE ();
  438.    
  439.    set_prior(2);                                    /* Regular */
  440.  
  441.    Txbuf = Secbuf = (char *) malloc (WAZOOMAX + 16);
  442.    if (!Txbuf)
  443.       {
  444.       status_line (msgtxt[M_MEM_ERROR]);
  445.       if (reset_port) exit_port();
  446.       exit (2);
  447.       }
  448.  
  449. #ifdef POPBUF
  450.    /*
  451.     * Pointing it to the middle of the buffer allows us to pop up
  452.     * file transfer windows if we choose to do so.
  453.     */
  454.  
  455.    popbuf = Secbuf + 1500;
  456. #endif
  457.  
  458. #ifdef NEW 
  459.  
  460.     /* 
  461.     ** Set global variable timezone 
  462.     */
  463.     
  464.     if (!time_zone)
  465.     {
  466.         /*
  467.         ** TimeZone not in BINKLEY.CFG. Try getting it from the 
  468.         ** environment
  469.         */
  470.         
  471.         if ((s = getenv ("TZ")) != NULL)
  472.         {
  473.             time_zone = strdup (s);
  474.         }
  475.     }
  476.     
  477.     /*
  478.     ** did we now have a setting for timezone ?
  479.     */
  480.     
  481.     if (time_zone)
  482.     {
  483.         /*
  484.         ** we will only accepts a GMT+x string
  485.         */
  486.         
  487.         if (strnicmp (time_zone, "GMT", 3) == 0)
  488.         {
  489.             timezone = 3600L * atol (time_zone+3);
  490.         }
  491.     }
  492.     
  493.     /*
  494.     ** Get RBUF/TBUF settings from the environment
  495.     */
  496.     
  497.     s = getenv("RBUF");
  498.     if (s)
  499.         rBufSize = atoi(s);
  500.  
  501.     s = getenv("TBUF");
  502.     if (s)
  503.         tBufSize = atoi(s);
  504.  
  505. #endif
  506.  
  507.         
  508. }
  509.  
  510. static void compile_externs( void )
  511. {
  512.    register char *c;
  513.    register i;
  514.    char junk[100];
  515.    int j, k, l;
  516.    char *p;
  517.    char x;
  518.  
  519.    i = l = 0;                                    /* start at beginning  */
  520.    junk [0] = '\0';
  521.  
  522.    for (k = 0; protocols[k] != NULL; k++)        /* Total no. of protos */
  523.       {
  524.       c = protocols[k];                          /* Point at filename   */
  525.       if (!dexists (c))                          /* Is it there?        */
  526.          {
  527.          (void) printf ("%s %s\n", msgtxt[M_NO_PROTOCOL], c);
  528.          continue;
  529.          }
  530.       p = NULL;
  531.       while (*c)                                 /* Until end of string */
  532.          {
  533.          if ((*c == '\\') || (*c == ':'))        /* Look for last path  */
  534.             p = c;                               /* Delimiter           */
  535.          c++;
  536.          }
  537.       if (strlen (p) < 3)                        /* If no name,         */
  538.          continue;                               /* No protocol...      */
  539.  
  540.       p++;                                       /* Point to the        */
  541.       x = toupper (*p);                          /* First character     */
  542.       if (strchr (junk, x) != NULL)
  543.          {
  544.          (void) printf ("%s %s\n", msgtxt[M_DUP_PROTOCOL], c);
  545.          continue;
  546.          }
  547.  
  548.       protos[l].first_char = x;                  /* Makes lookup fast   */
  549.       protos[l++].entry = k;                     /* Now we know where   */
  550.  
  551.       junk[i++] = x;                             /* Store first char    */
  552.       junk[i++] = ')';                           /* Then a ')'          */
  553.       c = ++p;                                   /* Point to 2nd char   */
  554.       for (j = 0; j < 9; j++)                    /* Up to 9 chars more  */
  555.          {
  556.          if (*c != '.')                          /* If no comma yet,    */
  557.             {
  558.             junk[i++] = tolower (*c);            /* store the char and  */
  559.             ++c;                                 /* bump the pointer    */
  560.             }
  561.          else junk[i++] = ' ';                   /* otherwise pad it    */
  562.          }
  563.       junk[i++] = ' ';                           /* And one more space  */
  564.       junk[i] = '\0';                            /* Need for testing    */
  565.       }
  566.  
  567.    if (!i)                                       /* If we got none,     */
  568.       return;                                    /* Return now.         */
  569.  
  570.    i += 2;                                       /* Total for malloc    */
  571.    if ((extern_protocols = malloc ((size_t)i)) == NULL)  /* Allocate string     */
  572.       return;                                    /* Return on failure   */
  573.    (void) strcpy (extern_protocols, junk);              /* Copy the string     */
  574.    return;                                       /* Back to caller      */
  575. }
  576.  
  577.  
  578.  
  579. /**
  580.  ** b_exitproc -- called by mainline to do exit processing.
  581.  **/
  582.  
  583. void b_exitproc( void )
  584. {
  585.    if (command_line_un)
  586.       {
  587.       set_prior(4);                                    /* Always High */
  588.       mdm_init (modem_reset);
  589.       /*mdm_init (modem_busy);*/
  590.       exit_DTR ();
  591.       set_prior(2);                                    /* Regular */
  592.       }
  593.  
  594.    vfossil_cursor (1);
  595.  
  596.    while (KEYPRESS ())
  597.       {
  598.       (void) FOSSIL_CHAR ();
  599.       }
  600.  
  601.    gotoxy (0, SB_ROWS);
  602.    clear_eol ();
  603.    (void) printf (msgtxt[M_THANKS], ANNOUNCE);
  604.    clear_eol ();
  605.    (void) printf (msgtxt[M_ANOTHER_FINE_PRODUCT]);
  606.  
  607.    if (vfossil_installed)
  608.       vfossil_close ();
  609.  
  610.    if (!share) {
  611.       set_prior(4);                                    /* Always High */
  612.       MDM_DISABLE ();
  613.       set_prior(2);                                    /* Regular */
  614.    }
  615. }
  616.  
  617.