home *** CD-ROM | disk | FTP | other *** search
- /*--------------------------------------------------------------------------*/
- /* */
- /* */
- /* ------------ Bit-Bucket Software <no-Inc> */
- /* \ 10001101 / Writers and Distributors of */
- /* \ 011110 / No-Cost<no-tm> Software. */
- /* \ 1011 / */
- /* ------ */
- /* */
- /* Copyright (C) 1987, 1988, 1989 by Robert Hartman and Vincent Perriello */
- /* */
- /* */
- /* This module was written by Vince Perriello */
- /* */
- /* */
- /* BinkleyTerm Configuration File Parser */
- /* */
- /* */
- /* 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.210. */
- /* */
- /* 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 THE AUTHORS */
- /* AT 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 THE AUTHORS. */
- /* */
- /* */
- /* The Authors can be reached at the following addresses: */
- /* */
- /* Robert C. Hartman Vincent E. Perriello */
- /* Spark Software VEP Software */
- /* 427-3 Amherst Street 111 Carroll Street */
- /* CS2032, Suite 232 Naugatuck, CT 06770 */
- /* Nashua, NH 03061 */
- /* */
- /* FidoNet 1:132/101 FidoNet 1:141/491 */
- /* Data (603) 888-8179 Data (203) 729-7569 */
- /* */
- /* Please feel free to contact us at any time to share your comments */
- /* about our software and/or licensing policies. */
- /* */
- /*--------------------------------------------------------------------------*/
-
- #include <stdio.h>
- #include <signal.h>
- #include <ctype.h>
- #include <conio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <io.h>
- #include <dos.h>
- #include <sys\types.h>
- #include <sys\stat.h>
-
- #ifdef OS_2 /*PLF Sat 05-06-1989 06:09:36 */
- #define INCL_DOS
- #include <os2.h>
- #endif
-
- #ifdef __TURBOC__
- #include <alloc.h>
- #else
- #include <malloc.h>
- #endif
-
- #include "com.h"
- #include "xfer.h"
- #include "zmodem.h"
- #include "keybd.h"
- #include "sbuf.h"
- #include "sched.h"
- #include "externs.h"
- #include "prototyp.h"
-
- static char *ctl_slash_string (char *);
- static int Zone = 1;
-
- void parse_config (config_file)
- char *config_file;
- {
- FILE *stream;
- char temp[256];
- char *c;
- int i;
- char *p, *p1;
- PN_TRNS *tpn;
-
- sprintf (temp, "%s%s", BINKpath, config_file);
- if ((stream = fopen (temp, "r")) == NULL) /* OK, let's open the file */
- return; /* no file, no work to do */
-
- while ((fgets (temp, 255, stream)) != NULL) /* Now we parse the file ... */
- {
- c = temp; /* Check out the first char */
- if ((*c == '%') || (*c == ';')) /* See if it's a comment
- * line */
- continue;
-
- i = strlen (temp); /* how long this line is */
-
- if (i < 3)
- continue; /* If too short, ignore it */
-
- c = &temp[--i]; /* point at last character */
- if (*c == '\n') /* if it's a newline, */
- *c = '\0'; /* strip it off */
-
- switch (parse (temp, config_lines))
- {
- case 1: /* "SameRing" */
- modemring = 1;
- break;
-
- case 2: /* "NewNodeList" */
- newnodelist = 1;
- break;
-
- case 3: /* "QuickNodeList" */
- nodefunc = QuickLookup;
- break;
-
- case 4: /* "Answerback" */
- answerback = ctl_string (&temp[10]);
- break;
-
- case 5: /* "Macro" */
- c = skip_blanks (&temp[5]);
- i = atoi (c);
- if ((i <= 0) || (i > 9))
- {
- printf ("Macro number %d is out of range 1-9\n", i);
- break;
- }
- c = skip_to_blank (c);
- c = skip_blanks (c);
- keys[i - 1] = malloc (strlen (c) + 1);
- p = keys[i - 1];
- while (*c && (*c != '\n'))
- {
- if (*c == '|')
- *p++ = '\r';
- else *p++ = *c;
- ++c;
- }
- *p = '\0';
- break;
-
- case 6: /* "Shell" */
- c = skip_blanks (&temp[5]);
- i = atoi (c);
- if ((i <= 0) || (i > 9))
- {
- printf ("Shell number %d is out of range 1-9\n", i);
- break;
- }
- c = skip_to_blank (c);
- c = skip_blanks (c);
- shells[i - 1] = malloc (strlen (c) + 1);
- strcpy (shells[i - 1], c);
- strupr (shells[i - 1]);
- break;
-
- case 7: /* "Dial" */
- p = &temp[4];
- while ((*p) && (isspace (*p)))
- ++p;
-
- if ((*p == ';') || (*p == '\0'))
- {
- break;
- }
-
- tpn = (PN_TRNS *) malloc (sizeof (PN_TRNS));
-
- p1 = tpn->num;
- while ((*p) && (!isspace (*p)))
- {
- *p1++ = *p++;
- }
- *p1 = '\0';
-
- while ((*p) && (isspace (*p)))
- {
- ++p;
- }
-
- p1 = tpn->pre;
- while ((*p) && (*p != '/') && (!isspace (*p)))
- {
- *p1++ = *p++;
- }
- *p1 = '\0';
-
- p1 = tpn->suf;
- if ((*p == '\0') || (isspace (*p)))
- {
- *p1 = '\0';
- }
- else
- {
- ++p;
-
- while ((*p) && (!isspace (*p)))
- {
- *p1++ = *p++;
- }
- *p1 = '\0';
- }
-
- tpn->len = strlen (tpn->num);
- tpn->next = NULL;
- if (pn_head == NULL)
- {
- pn_head = tpn;
- }
- else
- {
- pn->next = tpn;
- }
- pn = tpn;
- break;
-
- case 8: /* "Event" */
- c = skip_blanks (&temp[5]);
- parse_event (c);
- break;
-
- case 9: /* "Zone" */
- c = skip_blanks (&temp[4]);
- Zone = atoi (c);
- if (!Zone) /* if we didn't find a zone */
- printf ("Illegal zone: %s\n", &temp[4]);
- break;
-
- case 10: /* "MaxReq" */
- c = skip_blanks (&temp[6]);
- DEFAULT.rq_Limit = atoi (c);
- if (!DEFAULT.rq_Limit) /* No requests??? */
- printf ("0 requests allowed\n");
- break;
-
- case 11: /* "LogLevel" */
- c = skip_blanks (&temp[8]);
- i = atoi (c);
- if ((i <= 5) && (i > 0))
- {
- loglevel = i;
- }
- else
- {
- printf ("LogLevel must be 1-5 - %s is unknown\n", &temp[8]);
- }
- break;
-
- case 12: /* "Baud" */
- max_baud = atoi (&temp[4]);
- break;
-
- case 13: /* "MaxPort" */
- c = skip_blanks (&temp[7]);
- i = atoi (c); /* make it binary */
- if ((i > 0) && (i < 33)) /* if range is reasonable, */
- MAXport = i; /* Make it the max value */
- else printf ("Ridiculous MAXport value: %s\n", &temp[7]);
- break;
-
- case 14: /* "Port" */
- c = skip_blanks (&temp[4]);
- i = atoi (c); /* make it binary */
- if ((i > 0) || (i < 33)) /* see if it's OK */
- {
- port_ptr = i - 1; /* store it if so */
- if (MAXport < i) /* See if MAXport is less */
- MAXport = i; /* If so, increase MAXport */
- }
- else printf ("Illegal port: %s\n", &temp[4]);
- break;
-
- case 15: /* "Carrier" */
- c = skip_blanks (&temp[7]);
- i = 0;
- sscanf (c, "%x", &i); /* convert it to binary */
- if (i != 0) /* if we got anything */
- carrier_mask = i;
- else printf ("Invalid CARRIER mask: %s\n", &temp[7]);
- break;
-
- case 16: /* "StatusLog" */
- log_name = ctl_string (&temp[9]);
- if ((status_log = fopen (log_name, "a")) == NULL)
- {
- free (log_name);
- log_name = NULL;
- }
- else
- {
- fprintf (status_log, "\n");
- fflush(status_log); /*PLF Sat 05-06-1989 05:38:37 */
- real_flush (fileno (status_log));
- }
- break;
-
- case 17: /* "Reader" */
- BBSreader = ctl_string (&temp[6]);
- break;
-
- case 18: /* "BossPhone" */
- BOSSphone = ctl_string (&temp[9]);
- break;
-
- case 19: /* "BossPwd" */
- BOSSpwd = ctl_string (&temp[7]);
- break;
-
- case 20: /* "Protocol" */
- if (extern_index == 5)
- break;
- protocols[extern_index++] = ctl_string (&temp[8]);
- break;
-
- case 21: /* "System" */
- system_name = ctl_string (&temp[6]);
- break;
-
- case 22: /* "Sysop" */
- sysop = ctl_string (&temp[5]);
- break;
-
- case 23: /* "Boss" */
- c = skip_blanks (&temp[4]);
- sscanf (c, "%d/%d", &boss_net, &boss_node);
- break;
-
- case 24: /* "Point" */
- i = 5;
- goto address;
-
- case 25: /* "Aka" */
- i = 3;
- goto address;
-
- case 94: /* "Address" */
- i = 7;
- address:
- alias[num_addrs].Point = 0;
- c = skip_blanks (&temp[i]);
- i = sscanf (c, "%d:%d/%d.%d", &alias[num_addrs].Zone,
- &alias[num_addrs].Net, &alias[num_addrs].Node,
- &alias[num_addrs].Point);
- if (i < 3)
- {
- i = sscanf (c, "%d/%d.%d",
- &alias[num_addrs].Net, &alias[num_addrs].Node,
- &alias[num_addrs].Point);
- if (i < 2)
- break;
- alias[num_addrs].Zone = Zone;
- }
- Zone = alias[0].Zone; /* First is real default */
- ++num_addrs;
- break;
-
- case 26: /* "Hold" */
- hold_area = ctl_slash_string (&temp[4]);
- break;
-
- case 27: /* "DownLoads" */
- download_path = ctl_slash_string (&temp[9]);
- break;
-
- case 28: /* "NetFile" */
- DEFAULT.sc_Inbound = ctl_slash_string (&temp[7]);
- break;
-
- case 29: /* "Init" */
- modem_init = ctl_string (&temp[4]);
- break;
-
- case 30: /* "Busy" */
- modem_busy = ctl_string (&temp[4]);
- break;
-
- case 31: /* "Prefix" */
- predial = ctl_string (&temp[6]);
- break;
-
- case 32: /* "NodeList" */
- net_info = ctl_slash_string (&temp[8]);
- break;
-
- case 33: /* "Avail" */
- DEFAULT.rq_FILES = ctl_string (&temp[5]);
- break;
-
- case 34: /* "OKFile" */
- DEFAULT.rq_OKFile = ctl_string (&temp[6]);
- break;
-
- case 35: /* "About" */
- DEFAULT.rq_About = ctl_string (&temp[5]);
- break;
-
- case 36: /* "MAILnote" */
- MAILnote = ctl_string (&temp[8]);
- break;
-
- case 37: /* "Banner" */
- BBSbanner = ctl_string (&temp[6]);
- break;
-
- case 38: /* "UnAttended" */
- un_attended = 1;
- command_line_un = 1;
- break;
-
- case 39: /* "OverWrite" */
- overwrite = 1;
- break;
-
- case 40: /* "Rev3" */
- rev3 = 1;
- break;
-
- case 41: /* "ReqOnUs" */
- on_our_nickel = 1;
- break;
-
- case 42: /* "LockBaud" */
- lock_baud = 1;
- break;
-
- case 43: /* "TimeOut" */
- c = skip_blanks (&temp[7]);
- BBStimeout = atoi (c) * 100;
- if (BBStimeout < 2000)
- BBStimeout = 2000;
- break;
-
- case 44: /* "NoSLO" */
- no_overdrive = 1;
- break;
-
- case 45: /* "SlowModem" */
- slowmodem = 1;
- break;
-
- case 46: /* "SmallWindow" */
- small_window = 1;
- break;
-
- case 47: /* "NoPickup" */
- no_pickup = 1;
- break;
-
- case 48: /* "NoRequests" */
- no_requests = 1;
- break;
-
- case 49: /* "NetMail" */
- break; /* for BTCTL & MAIL.SYS */
-
- case 50: /* "Suffix" */
- postdial = ctl_string (&temp[6]);
- break;
-
- case 51: /* "NoFullScreen" */
- fullscreen = 0;
- break;
-
- case 52: /* "AutoBaud" */
- autobaud = 1;
- break;
-
- case 53: /* "Gong" */
- gong_allowed = 1;
- break;
-
- case 54: /* "NoCollide" */
- no_collide = 1;
- break;
-
- case 55: /* "TBBSlist" */
- nodefunc = TBBSLookup;
- break;
-
- case 56: /* "TaskView" */
- case 57: /* "TopView" */
- have_tv = 1;
- break;
-
- case 58: /* "ExtrnMail" */
- c = skip_blanks (&temp[9]);
- if (isdigit (*c))
- {
- lev_ext_mail[num_ext_mail] = atoi (c);
- while ((*c) && (!isspace (*c)))
- ++c;
- }
- else
- {
- lev_ext_mail[num_ext_mail] = 99;
- }
- ext_mail_string[num_ext_mail++] = ctl_string (c);
- break;
-
- case 59: /* "BBSnote" */
- BBSnote = ctl_string (&temp[7]);
- break;
-
- case 60: /* "BBS" */
- BBSopt = ctl_string (&temp[3]);
- break;
-
- case 61: /* "ScriptPath" */
- script_path = ctl_slash_string (&temp[10]);
- break;
-
- case 62: /* "BoxType" */
- c = skip_blanks (&temp[7]);
- boxtype = atoi (c);
- if ((boxtype > 4) || (boxtype < 0))
- boxtype = 1;
- break;
-
- case 63: /* "MultiLink" */
- have_ml = 1;
- break;
-
- case 64: /* "Include" */
- c = skip_blanks (&temp[7]);
- parse_config (c);
- break;
-
- case 65: /* "CaptureFile" */
- logptr = ctl_string (&temp[11]);
- break;
-
- case 66: /* "CursorCol" */
- c = skip_blanks (&temp[9]);
- cursor_col = atoi (c) - 1;
- if ((cursor_col < 0) || (cursor_col > 79))
- cursor_col = 79;
- break;
-
- case 67: /* "CursorRow" */
- c = skip_blanks (&temp[9]);
- cursor_row = atoi (c) - 1;
- if ((cursor_row < 0) || (cursor_row > 23))
- cursor_row = 22;
- break;
-
- case 68: /* "DoingMail" */
- c = skip_blanks (&temp[9]);
- sprintf (junk, "\r\r%s\r\r", c);
- noBBS = malloc (strlen (junk) + 1);
- strcpy (noBBS, junk);
- break;
-
- case 69: /* "EnterBBS" */
- c = skip_blanks (&temp[8]);
- sprintf (junk, "\r%s\r", c);
- BBSesc = malloc (strlen (junk) + 1);
- strcpy (BBSesc, junk);
- break;
-
- case 70: /* "PrivateNet" */
- c = skip_blanks (&temp[10]);
- pvtnet = atoi (c);
- break;
-
- case 71: /* "Packer" */
- packer = ctl_string (&temp[6]);
- break;
-
- case 72: /* "Cleanup" */
- cleanup = ctl_string (&temp[7]);
- break;
-
- case 73: /* "AfterMail" */
- aftermail = ctl_string (&temp[9]);
- break;
-
- case 74: /* "Colors" */
- c = skip_blanks (&temp[6]);
- colors.background = (unsigned char) (atoi (c) & 0xff);
- c = skip_to_blank (c);
- colors.settings = (unsigned char) (atoi (c) & 0xff);
- c = skip_blanks (c);
- c = skip_to_blank (c);
- colors.history = (unsigned char) (atoi (c) & 0xff);
- c = skip_blanks (c);
- c = skip_to_blank (c);
- colors.hold = (unsigned char) (atoi (c) & 0xff);
- c = skip_blanks (c);
- c = skip_to_blank (c);
- colors.call = (unsigned char) (atoi (c) & 0xff);
- c = skip_blanks (c);
- c = skip_to_blank (c);
- colors.file = (unsigned char) (atoi (c) & 0xff);
- break;
-
- case 75: /* "JanusBaud" */
- #ifdef JANUS
- c = skip_blanks (&temp[9]);
- janus_baud = atoi(c);
- #endif
- break;
-
- case 76: /* "ReqTemplate" */
- DEFAULT.rq_Template = ctl_string (&temp[11]);
- break;
-
- case 77: /* "KnownAvail" */
- KNOWN.rq_FILES = ctl_string(&temp[10]);
- break;
-
- case 78: /* "KnownReqList" */
- KNOWN.rq_OKFile = ctl_string(&temp[12]);
- break;
-
- case 79: /* "KnownAbout" */
- KNOWN.rq_About = ctl_string (&temp[10]);
- break;
-
- case 80: /* "KnownInbound" */
- KNOWN.sc_Inbound = ctl_slash_string (&temp[12]);
- break;
-
- case 81: /* "KnownReqLim" */
- c = skip_blanks (&temp[11]);
- KNOWN.rq_Limit = atoi (c);
- break;
-
- case 82: /* "KnownReqTpl" */
- KNOWN.rq_Template = ctl_string (&temp[11]);
- break;
-
- case 83: /* "ProtAvail" */
- PROT.rq_FILES = ctl_string(&temp[9]);
- break;
-
- case 84: /* "ProtReqList" */
- PROT.rq_OKFile = ctl_string(&temp[11]);
- break;
-
- case 85: /* "ProtAbout" */
- PROT.rq_About = ctl_string (&temp[9]);
- break;
-
- case 86: /* "ProtInbound" */
- PROT.sc_Inbound = ctl_slash_string (&temp[11]);
- break;
-
- case 87: /* "ProtReqLim" */
- c = skip_blanks (&temp[10]);
- PROT.rq_Limit = atoi (c);
- break;
-
- case 88: /* "ProtReqTpl" */
- PROT.rq_Template = ctl_string (&temp[10]);
- break;
-
- case 89: /* "Application" */
- break;
-
- case 90: /* "NoZones" */
- no_zones = 1;
- break;
-
- case 91: /* "Answer" */
- ans_str = ctl_string (&temp[6]);
- break;
-
- case 92: /* "PollTries" */
- c = skip_blanks (&temp[9]);
- poll_tries = atoi (c);
- break;
-
- case 93: /* "SwapDir" */
- c = skip_blanks (&temp[7]);
- i = strlen (c);
- swapdir = malloc (i + 15);
- strcpy (swapdir, c);
- add_backslash (swapdir);
- strcat (swapdir, "BTXXXXXX");
- mktemp (swapdir);
- break;
-
- case 95: /* "Curmudgeon" */
- ++curmudgeon; /* Do it like Randy */
- break;
-
- case 96: /* "NoWaZOO" */
- ++no_WaZOO; /* FTSC sessions */
- break;
-
- case 97: /* "ScreenBlank" */
- do_screen_blank = 1;
- break;
-
- case 98: /* "Mark_Kromm" */
-
- /* These colors from Mark Kromm, Fidonet 1:261/1034 */
-
- colors.background = 112; /* The */
- colors.settings = 9; /* Great */
- colors.history = 10; /* BinkleyTerm */
- colors.hold = 11; /* Colors */
- colors.call = 14; /* Contest */
- colors.file = 12; /* Winner!!!! */
- break;
-
- case 99: /* "Server" */
- server_mode = 1;
- break;
-
- default:
- printf ("Unknown config line: %s\n", temp);
- }
- }
- fclose (stream); /* close input file */
- /*PLF Mon 05-08-1989 06:29:17 */
- /*plf - a number of places reference e_ptrs[] when there aren't any. Rathter
- * than track down all those bugs I am just allocating one of 'em
- */
- if( !num_events )
- e_ptrs[0] = calloc (sizeof (EVENT), 1);
- }
-
- char *ctl_string (source) /* malloc & copy to ctl */
- char *source;
- {
- char *dest, *c;
- int i;
-
- c = skip_blanks (source); /* get over the blanks */
- i = strlen (c); /* get length of remainder */
- if (i < 1) /* must have at least 1 */
- return (NULL); /* if not, return NULL */
- dest = malloc (++i); /* allocate space for string */
- strcpy (dest, c); /* copy the stuff over */
- return (dest); /* and return the address */
- }
-
- static char *ctl_slash_string (source) /* malloc & copy to ctl */
- char *source;
- {
- char *dest, *c, *t;
- int i;
- struct stat buffer;
-
- c = skip_blanks (source); /* get over the blanks */
- i = strlen (c); /* get length of remainder */
- if (i < 1) /* must have at least 1 */
- return (NULL); /* if not, return NULL */
- t = dest = malloc (i+2); /* allocate space for string */
- strcpy (dest, c); /* copy the stuff over */
- delete_backslash (dest); /* get rid of trailing stuff */
- /* Check to see if the directory exists */
- i = stat (dest, &buffer);
- if (i || (!(buffer.st_mode & S_IFDIR)))
- {
- printf ("Directory '%s' does not exist!\n", dest);
- printf (" BinkleyTerm may fail to execute properly because of this!\n");
- return(NULL);
- }
- add_backslash (dest); /* add the backslash */
- return (dest); /* return the directory name */
- }
-
-
- char *add_backslash (str)
- char *str;
- {
- char *p;
-
- p = str + strlen (str) - 1;
-
- if (p >= str)
- {
- /* Strip off the trailing blanks */
- while ((p >= str) && (isspace (*p)))
- {
- *p = '\0';
- --p;
- }
-
- /* Put a backslash if there isn't one */
- if ((p >=str) && (*p != '\\') && (*p != '/'))
- {
- *(++p) = '\\';
- *(++p) = '\0';
- }
- }
-
- return (fancy_str (str));
- }
-
- char *delete_backslash (str)
- char *str;
- {
- char *p;
-
- p = str + strlen (str) - 1;
-
- if (p >= str)
- {
- /* Strip off the trailing blanks */
- while ((p >= str) && (isspace (*p)))
- {
- *p = '\0';
- --p;
- }
-
- /* Get rid of backslash if there is one */
- if ((p >=str) && ((*p == '\\') || (*p == '/')))
- {
- if ((p > str) && (*(p-1) != ':')) /* Don't delete on root */
- *p = '\0';
- }
- }
-
- return (fancy_str (str));
- }
-