home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 2 BBS
/
02-BBS.zip
/
OS2PLST.SRC
/
PARSELST.C
< prev
next >
Wrap
Text File
|
1990-05-08
|
37KB
|
1,769 lines
/*
Nodelist Parser
This module was originally written by Bob Hartman
Sysop of FidoNet node 1:132/101
Spark Software, 427-3 Amherst St, CS 2032, Suite 232, Nashua, NH 03061
This program source code is being released with the following provisions:
1. You are free to make changes to this source code for use on your own
machine, however, altered source files may not be distributed without the
consent of Spark Software.
2. You may distribute "patches" or "diff" files for any changes that you
have made, provided that the "patch" or "diff" files are also sent to Spark
Software for inclusion in future releases of the entire package. A "diff"
file for the source archives may also contain a compiled version, provided
it is clearly marked as not being created from the original source code.
No other executable versions may be distributed without the consent of
Spark Software.
3. You are free to include portions of this source code in any program you
develop, providing: a) Credit is given to Spark Software for any code that
may is used, and b) The resulting program is free to anyone wanting to use
it, including commercial and government users.
4. There is NO technical support available for dealing with this source
code, or the accompanying executable files. This source code is provided
as is, with no warranty expressed or implied (I hate legalease). In other
words, if you don't know what to do with it, don't use it, and if you are
brave enough to use it, you're on your own.
Spark Software may be contacted by modem at (603) 888-8179 (node 1:132/101)
on the public FidoNet network, or at the address given above.
*/
#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <malloc.h>
#include <string.h>
#include <io.h>
#include <stdlib.h>
/* Should we generate an Opus style nodelist output */
#include "types.h"
#include "externs.h"
#ifndef OS2
#define open fast_open
#define close fast_close
#define read fast_read
#define write fast_write
#endif
#ifndef OS2
char *REV = "$Revision: 1.31 $"; /* Used in my code for my RCS
* program */
#else
char *REV = "$Revision: 1.31-OS/2 $"; /* Used in my code for my RCS
* program */
#endif
struct _node new_node;
struct _oldnode old_node;
struct netls seanet;
struct nodels seanode;
struct extrastuff bt_node;
struct nidxs *seaidx;
struct nidxs *seaptr;
struct qidx qbbsidx;
struct qdat qbbsnode;
long seanodecnt;
int seacnt;
long seanetcnt;
char buf[256];
char prn_first_line[256];
char txt_first_line[256];
int prn_pg_lines;
int txt_pg_lines;
int prn_pagenum;
int txt_pagenum;
int cmdbaud = 0;
static FILE *nodelist_bbs, *nodelist_fon, *fidouser_$$1;
static int nodelist_dat, nodelist_idx, nodelist_sys;
static FILE *nodelist_prn, *nodelist_txt;
static int netlist_dog, nodelist_dog, index_dog;
static int nodelist_ext;
static int qnl_idx_bbs, qnl_dat_bbs;
/* extern int *cmp(); */
main (argc, argv)
int argc;
char *argv[];
{
char buff1[20], buff2[20]; /* Junk buffers */
char *s,*config_file ="PARSELST.CFG";
char *mylist=NULL,*pvtlist=NULL;
char *nodelist,editnl=0,cl_nodelist=0;
int i;
sscanf (REV, "$%s %s", buff1, buff2);
fprintf (stderr, "ParseLst - %s %s by Bob Hartman, SysOp of FidoNet Node 1:132/101\n", buff1, buff2);
fprintf (stderr, "This program is placed in the Public Domain as part of the BBS project.\n");
fprintf (stderr, "For information on BBS (Bit Bucket Software), contact 132/101 or 141/491.\n\n");
if (argc > 1){
for (i=1;i<argc;i++) {
s=argv[i];
if ((s[0] == '/') || (s[0] == '-')) {
switch(tolower(s[1])) {
#ifndef OS2
case 'e' : editnl++;
break;
#endif
case 'n' : nodelist=(s+2);
strupr(nodelist);
cl_nodelist++;
break;
case 'c' : config_file=s+2;
strupr (config_file);
break;
case 'm' : mylist=(s+2);
strupr(mylist);
break;
case 'p' : pvtlist=s+2;
strupr(pvtlist);
break;
case 'b' : cmdbaud=atoi(&s[2]);
break;
default: printf("Don't understand %s\n\n",s);
break;
}
}
}
}
#ifndef OS2
if (editnl > 0)
{
printf ("Using EditNL to update Nodelist\n");
system ("EditNL");
printf ("\n");
}
else edit();
#else
edit();
#endif
strcpy (country, "1");
/* Need to find the correct file to use */
fn = &fn_head;
if (cl_nodelist > 0)
{
fn->fname = nodelist;
strupr (fn->fname);
}
else
{
nfile_name (&(fn->fname));
}
fn->next = NULL;
fn->private = 0;
ph = ph_head;
bd = bd_head;
dl = dl_head;
co = co_head;
et = et_head;
/* Parse configuration file */
parse_config (config_file,mylist,pvtlist);
if (cmdbaud > 0)
maxbaud = cmdbaud;
/* Open output files */
open_outfiles ();
/* Set up the output type */
if (out_type == -1)
{
if (myzone > 0)
out_type = 0;
else
out_type = 1;
}
fn = &fn_head;
while (fn != NULL)
{
process_file (1);
}
/* Close all the files */
if (nodelist_bbs != NULL)
{
fclose (nodelist_bbs);
}
if (nodelist_fon != NULL)
{
fclose (nodelist_fon);
}
if (fidouser_$$1 != NULL)
{
fclose (fidouser_$$1);
}
if (nodelist_dat != -1)
{
close (nodelist_dat);
}
if (nodelist_sys != -1)
{
close (nodelist_sys);
}
if (nodelist_idx != -1)
{
close (nodelist_idx);
}
if (nodelist_ext != -1)
{
close (nodelist_ext);
}
if (nodelist_prn != NULL)
{
fclose (nodelist_prn);
}
if (nodelist_txt != NULL)
{
fclose (nodelist_txt);
}
if (nodelist_dog != -1)
{
close (nodelist_dog);
}
if (qnl_idx_bbs != -1)
{
close (qnl_idx_bbs);
}
if (qnl_dat_bbs != -1)
{
close (qnl_dat_bbs);
}
if (netlist_dog != -1)
{
if (seanet.numnodes)
{
write (netlist_dog, (char *) &seanet, sizeof (struct netls));
}
close (netlist_dog);
if (seaidx != NULL)
{
printf ("\nSorting for INDEX.DOG\n");
qsort (seaidx, seacnt, sizeof (struct nidxs), cmp);
unlink ("INDEX.DOG");
if ((index_dog = open ("INDEX.DOG", O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE)) == -1)
{
printf ("Error opening INDEX.DOG - not generated\n");
unlink ("INDEX.DOG");
}
else
{
write (index_dog, (char *) seaidx, sizeof (struct nidxs) * seacnt);
close (index_dog);
}
}
else
{
/* Have to get rid of this to make sure no one gets confused */
unlink ("INDEX.DOG");
}
}
printf ("\rProcessing Completed Without Errors.\n\n");
/* Do any additional processing that might be needed */
if (doreport)
{
size_report ();
}
if (fidouser_$$1 != NULL)
{
do_names ();
}
return (0);
}
void
open_outfiles ()
{
int i;
if (nlist)
{
if ((nodelist_bbs = fopen ("NODELIST.BBS", "w")) == NULL)
{
printf ("Error opening output file\n");
exit (1);
}
}
else
{
nodelist_bbs = NULL;
}
/* Open the NODELIST.FON file? */
if (rdata)
{
if ((nodelist_fon = fopen ("NODELIST.FON", "w")) == NULL)
{
printf ("Error opening NODELIST.FON - not generated\n");
}
}
else
{
nodelist_fon = NULL;
}
/* Open the Fidouser.$$1 file */
if (udata)
{
if ((fidouser_$$1 = fopen ("FIDOUSER.$$1", "w")) == NULL)
{
printf ("Error opening FIDOUSER.$$1 - not generated\n");
}
}
else
{
fidouser_$$1 = NULL;
}
nodelist_dat = -1;
nodelist_idx = -1;
if (newopus)
{
unlink ("NODELIST.DAT");
if ((nodelist_dat = open ("NODELIST.DAT", O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE)) == -1)
{
printf ("Error opening NODELIST.DAT - not generated\n");
}
else
{
unlink ("NODELIST.IDX");
if ((nodelist_idx = open ("NODELIST.IDX", O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE)) == -1)
{
printf ("Error opening NODELIST.IDX - NODELIST.DAT not generated\n");
close (nodelist_dat);
nodelist_dat = -1;
}
else
{
/* Write out the start of the .SYS file */
memset (&new_node, 0, sizeof (struct _node));
new_node.number = 6;
new_node.net = -1;
strcpy (new_node.name, "ParseLst");
strcpy (new_node.city, "1:132/101 in Nashua, NH USA");
write (nodelist_dat, (char *) &new_node, sizeof (struct _node));
/* Write out the start of the .IDX file */
i = 5;
write (nodelist_idx, (char *) &i, sizeof (int));
i = -1;
write (nodelist_idx, (char *) &i, sizeof (int));
}
}
}
else
{
nodelist_dat = -1;
nodelist_idx = -1;
}
nodelist_sys = -1;
if (oldopus)
{
unlink ("NODELIST.SYS");
if ((nodelist_sys = open ("NODELIST.SYS", O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE)) == -1)
{
printf ("Error opening NODELIST.SYS - not generated\n");
}
else
{
if (nodelist_idx == -1)
{
unlink ("NODELIST.IDX");
if ((nodelist_idx = open ("NODELIST.IDX", O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE)) == -1)
{
printf ("Error opening NODELIST.IDX - NODELIST.SYS not generated\n");
close (nodelist_sys);
nodelist_sys = -1;
}
else
{
/* Write out the start of the .IDX file */
i = 5;
write (nodelist_idx, (char *) &i, sizeof (int));
i = -1;
write (nodelist_idx, (char *) &i, sizeof (int));
}
}
/* Write out the start of the .SYS file */
memset (&old_node, 0, sizeof (struct _oldnode));
old_node.number = 5;
old_node.net = -1;
strcpy (old_node.name, "ParseLst");
strcpy (old_node.city, "1:132/101 in Nashua, NH USA");
write (nodelist_sys, (char *) &old_node, sizeof (struct _oldnode));
}
}
else
{
nodelist_sys = -1;
}
nodelist_ext = -1;
if (binkley)
{
unlink ("NODELIST.EXT");
if ((nodelist_ext = open ("NODELIST.EXT", O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE)) == -1)
{
printf ("Error opening NODELIST.EXT - not generated\n");
}
else
{
if (nodelist_idx == -1)
{
unlink ("NODELIST.IDX");
if ((nodelist_idx = open ("NODELIST.IDX", O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE)) == -1)
{
printf ("Error opening NODELIST.IDX - NODELIST.EXT not generated\n");
close (nodelist_ext);
nodelist_ext = -1;
}
else
{
/* Write out the start of the .IDX file */
i = 7;
write (nodelist_idx, (char *) &i, sizeof (int));
i = -1;
write (nodelist_idx, (char *) &i, sizeof (int));
}
}
/* Write out the start of the .EXT file */
memset (&bt_node, 0, sizeof (struct extrastuff));
strcpy (bt_node.password, "ParseLst");
write (nodelist_ext, (char *) &bt_node, sizeof (struct extrastuff));
}
}
else
{
nodelist_ext = -1;
}
if (sealist)
{
unlink ("NODELIST.DOG");
if ((nodelist_dog = open ("NODELIST.DOG", O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE)) == -1)
{
printf ("Error opening NODELIST.DOG - not generated\n");
}
else
{
unlink ("NETLIST.DOG");
if ((netlist_dog = open ("NETLIST.DOG", O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE)) == -1)
{
printf ("Error opening NETLIST.DOG - NODELIST.DOG not generated\n");
close (nodelist_dog);
nodelist_dog = -1;
seanetcnt = sizeof (struct netls);
}
else
{
/* Write out the start of the NETLIST.DOG file */
memset (&seanet, 0, sizeof (struct netls));
write (netlist_dog, (char *) &seanet, sizeof (struct netls));
}
}
if ((seaidx = calloc (sizeof (struct nidxs), 4000)) == NULL)
{
printf ("Could not allocate space for INDEX.DOG - not generating\n");
seaptr = NULL;
}
else
{
seaptr = seaidx;
}
}
else
{
nodelist_dog = -1;
netlist_dog = -1;
}
if (quickbbs)
{
unlink ("QNL_DAT.BBS");
if ((qnl_dat_bbs = open ("QNL_DAT.BBS", O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE)) == -1)
{
printf ("Error opening QNL_DAT.BBS - not generated\n");
}
else
{
unlink ("QNL_IDX.BBS");
if ((qnl_idx_bbs = open ("QNL_IDX.BBS", O_WRONLY|O_BINARY|O_CREAT, S_IREAD|S_IWRITE)) == -1)
{
printf ("Error opening QNL_IDX.BBS - QNL_DAT.BBS not generated\n");
close (qnl_dat_bbs);
qnl_dat_bbs = -1;
}
}
}
else
{
qnl_idx_bbs = -1;
qnl_dat_bbs = -1;
}
if (fidoprn)
{
if ((nodelist_prn = fopen ("NODELIST.PRN", "w")) != NULL)
prn_pg_lines = 100;
}
if (fidotxt)
{
if ((nodelist_txt = fopen ("NODELIST.TXT", "w")) != NULL)
txt_pg_lines = 100;
}
}
void
process_file (times)
int times;
{
int n_num;
int n_cost;
int n_baud;
int node;
int addrs[4];
char this_file[64];
char def_phone[30];
char def_flags[30];
int def_cost;
int def_baud;
int cur_addr_lev;
int did_cost;
int i;
int did_phone;
/* int done; */
char buff[128];
/* int f;*/
FILE *f;
/* char *p, *p1, *p2, *p3; */
char *p, *p1, *p2;
int dphone;
char b1[50];
char b2[50];
char b3[50];
char b4[50];
char b5[50];
char b6[50];
char b7[128];
char pn1[20], pn2[20], pn3[20];
char orig_phone[30];
int pvt, hold, skip, def, n_out, this_list;
/* PWTRP tpw;
PHTRP tph;
BDTRP tbd;
DLTRP tdl;
COTRP tco;
ETTRP tep;
FNLSTP tfn; */
char ntyp;
char *mymalloc ();
extern char *strchr ();
/* Open the next filename */
f = NULL;
cur_addr_lev = 0;
if ((f = fopen (fn->fname, "r")) == NULL)
/* if ((f = open (fn->fname, O_RDONLY|O_BINARY)) == -1)*/
{
printf ("\rCould not open Nodelist File '%s' - Exiting\n", fn->fname);
exit (1);
}
this_list = fn->private;
if (times)
{
printf ("\nProcessing Nodelist File '%s'\n", fn->fname);
fgets (buf,256, f);
/* get_data (buf, f);*/
p1 = buf + strlen (buf) - 1;
while ((p1 >= buf) && (*p1 != ':'))
--p1;
if (p1 >= buf)
{
strcpy (p1, "-- Page");
sprintf (prn_first_line, "Bulletin Board Listing from %s", buf + 3);
sprintf (txt_first_line, "%s", buf + 3);
}
else
{
prn_first_line[0] = '\0';
txt_first_line[0] = '\0';
}
if ((nodelist_prn != NULL) && !this_list)
{
++prn_pagenum;
fprintf (nodelist_prn, "%s %d\n\n", prn_first_line, prn_pagenum);
}
if ((nodelist_txt != NULL) && !this_list)
{
++txt_pagenum;
fprintf (nodelist_txt, "%s %d\n\n", txt_first_line, txt_pagenum);
}
}
else
printf ("\nAdding Nodelist File '%s' to Zone %d\n", fn->fname, myzone);
strcpy (this_file, fn->fname);
/* Show that we are not skipping here */
skip = -1;
addrs[0] = addrs[1] = addrs[2] = addrs[3] = (myzone > 0) ? myzone : 1;
while (1)
{
if (fgets (buf, 256, f) == NULL)
/* if (get_data (buf, f))*/
break;
pvt = 0;
dphone = 0;
n_cost = 0;
did_cost = 0;
hold = 0;
ntyp = 'L';
def = 0;
likely = 0;
p = buff;
p1 = buf;
while (*p1)
{
if (!isspace (*p1))
*p++ = *p1;
++p1;
}
*p++ = '\n';
*p = '\0';
p = buff;
if (*p == ';')
{
if (comments)
{
fputs (buf, stdout);
}
if ((!this_list) && (buf[1] == 'A'))
{
if ((nodelist_prn != NULL) && (prn_pg_lines == 100))
fputs (buf + 2, nodelist_prn);
if ((nodelist_txt != NULL) && (txt_pg_lines == 100))
fputs (buf + 2, nodelist_txt);
}
continue;
}
nnodes++;
/* Modifier (Host, Region, etc.) */
p = nextfield (p, b1);
/* Node number (or region or zone) */
p = nextfield (p, b2);
n_num = atoi (b2);
/* Did we get anything? */
if (b1[0] != '\0')
{
/* Is it something we need to worry about? */
if (stricmp (b1, "zone") == 0)
{
if ((myzone > 0) && (addrs[0] == myzone) && nzones)
{
if (fn != NULL)
fn = fn->next;
i = 0;
while (fn != NULL)
{
process_file (0);
i = 1;
}
if (i)
printf ("\nReturning to finish file '%s'\n", this_file);
}
++nzones;
if (out_type == 0)
{
if (usezone)
strcpy (b1, "ZONE ");
else
strcpy (b1, "REGION ");
dphone = 1;
}
else
{
if (usezone)
strcpy (b1, "ZONE ");
else
strcpy (b1, "REGION ");
dphone = 1;
if (myzone > 0)
{
if (n_num != myzone)
{
skip = 1;
}
else
{
skip = 0;
}
}
}
ntyp = 'Z';
}
else
if (stricmp (b1, "region") == 0)
{
++nregions;
spec_word (b1);
dphone = 2;
if (skip == 1)
skip = 2;
}
else
if (stricmp (b1, "host") == 0)
{
++nnets;
spec_word (b1);
dphone = 3;
if (skip == 1)
skip = 2;
ntyp = 'I';
}
else
if (stricmp (b1, "hub") == 0)
{
++nhubs;
if (out_type)
spec_word (b1);
else
b1[0] = '\0';
dphone = 4;
if (skip == 1)
skip = 2;
ntyp = 'H';
}
else
if (stricmp (b1, "pvt") == 0)
{
/* It is just a private node */
b1[0] = '\0';
pvt = 1;
}
else
if (stricmp (b1, "hold") == 0)
{
/* It is on hold */
b1[0] = '\0';
hold = 1;
}
else
{
++ndown;
/* It is something we don't understand, or the node is down */
continue;
}
}
if (dphone)
{
addrs[dphone - 1] = n_num;
for (i = dphone; i < 4; i++)
{
addrs[i] = n_num;
}
cur_addr_lev = dphone;
if (dphone < 4)
{
printf ("\rZone %2d, Region %2d, Net %5d", addrs[0], addrs[1], addrs[2]);
node = 0;
}
else
{
node = n_num;
}
}
else
{
node = n_num;
}
/* Translate the node type if necessary */
if (b1[0] == '\0')
{
et = et_head;
while (et != NULL)
{
if (((addrs[0] == et->zone) || (et->zone == -1)) &&
(addrs[2] == et->net) && (node == et->node))
{
switch (et->etype)
{
case 'I':
strcpy (b1, "IGATE ");
break;
case 'O':
strcpy (b1, "OGATE ");
break;
case 'G':
strcpy (b1, "GATE ");
break;
case 'H':
strcpy (b1, "HUB ");
break;
}
ntyp = et->etype;
break;
}
et = et->next;
}
}
/* Board name */
p = nextfield (p, b2);
/* Location */
p = nextfield (p, b3);
/* Sysop name */
p = nextfield (p, b4);
/* Phone number */
p = nextfield (p, b5);
strcpy (orig_phone, b5);
/* Determine the cost for this node */
co = co_head;
while (co != NULL)
{
if (strnicmp (b5, co->mstr, co->mlen) == 0)
{
n_cost = co->cost;
did_cost = 1;
break;
}
co = co->next;
}
/* If we didn't get a match, then it gets intl cost */
if ((!did_cost) && (co == NULL) &&
(strnicmp (country, b5, strlen (country)) == 0))
{
did_cost = 1;
}
/* Translate the phone number if possible via phone translations */
did_phone = 0;
ph = ph_head;
while (ph != NULL)
{
if (((addrs[0] == ph->zone) || (ph->zone == -1)) &&
(addrs[2] == ph->net) && (node == ph->node))
{
did_phone = 1;
strcpy (b5, ph->num);
break;
}
ph = ph->next;
}
if (dphone)
{
if (isdigit (b5[0]) || (ph != NULL))
{
strcpy (def_phone, b5);
}
else
{
/* Bad news - an unlisted where we need a phone number */
++ndown;
continue;
}
}
/* If this guy is unpublished, put something in there */
if (((!isdigit (b5[0])) || (hold)) && (ph == NULL))
{
if (cur_addr_lev >= 3)
{
strcpy (b5, def_phone);
def = 1;
++nredirect;
}
else
{
/* No dice - he is unpublished in a region or zone */
++ndown;
continue;
}
}
/* Determine the cost for this node */
if (!did_cost)
{
co = co_head;
while (co != NULL)
{
if (strnicmp (b5, co->mstr, co->mlen) == 0)
{
n_cost = co->cost;
did_cost = 1;
break;
}
co = co->next;
}
}
/* Determine some things from the phone number */
p1 = b5;
p2 = pn1;
while ((*p1) && isdigit (*p1))
{
*p2++ = *p1++;
}
*p2 = '\0';
if (*p1 != '\0')
++p1;
p2 = pn2;
while ((*p1) && isdigit (*p1))
{
*p2++ = *p1++;
}
*p2 = '\0';
if (*p1 != '\0')
++p1;
p2 = pn3;
while ((*p1) && isdigit (*p1))
{
*p2++ = *p1++;
}
*p2 = '\0';
if (*p1 != '\0')
++p1;
if (pn1[0] == '\0')
{
pn1[0] = '1';
pn1[1] = '\0';
}
if (pn2[0] == '\0')
{
pn2[0] = '1';
pn2[1] = '\0';
}
if (pn3[0] == '\0')
{
pn3[0] = '1';
pn3[1] = '\0';
}
/* Translate the number if possible via dial translations */
dl = dl_head;
while (dl != NULL)
{
if (strnicmp (b5, dl->mstr, dl->mlen) == 0)
{
strcpy (b7, &b5[dl->mlen]);
sprintf (b5, "%s%s%s", dl->pre, b7, dl->post);
break;
}
dl = dl->next;
}
if ((dl == NULL) && (!did_phone) && (strnicmp (country, b5, strlen (country)) != 0))
{
sprintf (b7, "%s%s%s", intl_pre_dl, b5, intl_post_dl);
strcpy (b5, b7);
}
/* Determine the cost for this node */
if (!did_cost)
{
co = co_head;
while (co != NULL)
{
if (strnicmp (b5, co->mstr, co->mlen) == 0)
{
n_cost = co->cost;
did_cost = 1;
break;
}
co = co->next;
}
}
/* If we didn't get a match, then it gets intl cost */
if (!did_cost)
{
n_cost = intl_cost;
}
/* Baud rate */
p = nextfield (p, b6);
n_baud = atoi (b6);
/* If necessary, translate the baud rate */
bd = bd_head;
while (bd != NULL)
{
if (((addrs[0] == bd->zone) || (bd->zone == -1)) &&
(addrs[2] == bd->net) && (node == bd->node))
{
n_baud = bd->baud;
break;
}
bd = bd->next;
}
/* Fix the baud rate downward if necessary */
if (n_baud > maxbaud)
{
n_baud = maxbaud;
}
/* Get rid of the newline at the end */
p1 = p;
while ((*p1) && (!isspace (*p1)))
{
++p1;
}
*p1 = '\0';
if (dphone)
{
strcpy (def_flags, p);
def_baud = n_baud;
def_cost = n_cost;
}
if (def)
{
strcpy (p, def_flags);
n_baud = def_baud;
n_cost = def_cost;
}
/* Put the results into the proper files */
if (skip < 2)
{
/* Print out the results in NODELIST.BBS format */
if (nodelist_bbs != NULL)
{
if (nodash)
{
undash (b5);
}
fprintf (nodelist_bbs, "%s%d %d %d %s %s %s\n", b1, n_num, n_cost, n_baud, b2, b5, b3);
}
/* Output to NODELIST.FON */
if (nodelist_fon != NULL)
{
/* Convert to upper case */
strupr (p);
/* Print it out in NODELIST.FON format */
fprintf (nodelist_fon, "%4d %4d %3s %3s %3s %4d %c %s\n",
addrs[2], node, pn1, pn2, pn3, n_baud, ntyp,
(*p == '\0') ? "-" : p);
}
if (nodelist_dat != -1)
{
memset (&new_node, 0, sizeof (struct _node));
new_node.number = node;
new_node.net = addrs[2];
new_node.cost = n_cost;
new_node.rate = n_baud / 300;
new_node.realcost = n_cost;
strncpy (new_node.name, b2, 33);
p1 = new_node.name;
while ((p1 = strchr (p1, '_')) != NULL)
{
*p1 = ' ';
}
strncpy (new_node.phone, b5, 39);
strncpy (new_node.city, b3, 29);
p1 = new_node.city;
while ((p1 = strchr (p1, '_')) != NULL)
{
*p1 = ' ';
}
/* Stick in a password if there is one */
pw = pw_head;
while (pw != NULL)
{
if (((addrs[0] == pw->zone) || (pw->zone == -1)) &&
(addrs[2] == pw->net) && (node == pw->node))
{
strncpy (new_node.password, &(pw->pw[1]), 8);
break;
}
pw = pw->next;
}
if (cur_addr_lev == 4)
{
new_node.hubnode = addrs[3];
}
else
{
new_node.hubnode = 0;
}
new_node.modem = 0;
if (strstr (p, "HST"))
{
new_node.modem |= M_HST;
}
if (strstr (p, "PEP"))
{
new_node.modem |= M_PEP;
}
new_node.flags1 = 0;
switch (dphone)
{
case 0:
break;
case 1:
new_node.flags1 |= B_zone;
break;
case 2:
new_node.flags1 |= B_region;
break;
case 3:
new_node.flags1 |= B_host;
break;
case 4:
new_node.flags1 |= B_hub;
break;
}
if (strstr (p, "CM"))
{
new_node.flags1 |= B_CM;
}
/* Stick in a CM flag is there is one done manually */
cm = cm_head;
while (cm != NULL)
{
if (((addrs[0] == cm->zone) || (cm->zone == -1)) &&
(addrs[2] == cm->net) && (node == cm->node))
{
new_node.flags1 |= B_CM;
break;
}
cm = cm->next;
}
write (nodelist_dat, (char *) &new_node, sizeof (struct _node));
}
if (qnl_dat_bbs != -1)
{
memset (&qbbsnode, 0, sizeof (struct qdat));
qbbsidx.zone = addrs[0];
qbbsidx.net = addrs[2];
qbbsidx.node = node;
qbbsidx.nodetype = qbbsnode.nodetype = dphone;
if ((dphone == 1) && (b1[0] == 'R'))
{
qbbsidx.nodetype = qbbsnode.nodetype = 2;
}
write (qnl_idx_bbs, (char *) &qbbsidx, sizeof (struct qidx));
qbbsnode.zone = addrs[0];
qbbsnode.net = addrs[2];
qbbsnode.node = node;
strncpy (qbbsnode.name, b2, 20);
p1 = qbbsnode.name;
while ((p1 = strchr (p1, '_')) != NULL)
{
*p1 = ' ';
}
qbbsnode.namesize = strlen (b2);
if (qbbsnode.namesize > 20)
qbbsnode.namesize = 20;
strncpy (qbbsnode.city, b3, 40);
p1 = qbbsnode.city;
while ((p1 = strchr (p1, '_')) != NULL)
{
*p1 = ' ';
}
qbbsnode.citysize = strlen (b3);
if (qbbsnode.citysize > 40)
qbbsnode.citysize = 40;
strncpy (qbbsnode.phone, b5, 40);
qbbsnode.phonesize = strlen (b5);
if (qbbsnode.phonesize > 40)
qbbsnode.phonesize = 40;
/* Stick in a password if there is one */
pw = pw_head;
while (pw != NULL)
{
if (((addrs[0] == pw->zone) || (pw->zone == -1)) &&
(addrs[2] == pw->net) && (node == pw->node))
{
strncpy (qbbsnode.password, &(pw->pw[1]), 8);
qbbsnode.passwordsize = strlen (&(pw->pw[1]));
if (qbbsnode.passwordsize > 8)
qbbsnode.passwordsize = 8;
break;
}
pw = pw->next;
}
qbbsnode.flags = 0;
switch (dphone)
{
case 0:
break;
case 1:
qbbsnode.flags |= B_zone;
break;
case 2:
qbbsnode.flags |= B_region;
break;
case 3:
qbbsnode.flags |= B_host;
break;
case 4:
qbbsnode.flags |= B_hub;
break;
}
if (strstr (p, "CM"))
{
qbbsnode.flags |= B_CM;
}
/* Stick in a CM flag is there is one done manually */
cm = cm_head;
while (cm != NULL)
{
if (((addrs[0] == cm->zone) || (cm->zone == -1)) &&
(addrs[2] == cm->net) && (node == cm->node))
{
qbbsnode.flags |= B_CM;
break;
}
cm = cm->next;
}
qbbsnode.baudrate = n_baud;
qbbsnode.cost = n_cost;
write (qnl_dat_bbs, (char *) &qbbsnode, sizeof (struct qdat));
}
if (nodelist_ext != -1)
{
memset (&bt_node, 0, sizeof (struct extrastuff));
/* Stick in a password if there is one */
pw = pw_head;
while (pw != NULL)
{
if (((addrs[0] == pw->zone) || (pw->zone == -1)) &&
(addrs[2] == pw->net) && (node == pw->node))
{
strncpy (bt_node.password, &(pw->pw[1]), 8);
break;
}
pw = pw->next;
}
bt_node.flags1 = 0;
switch (dphone)
{
case 0:
break;
case 1:
bt_node.flags1 |= B_zone;
break;
case 2:
bt_node.flags1 |= B_region;
break;
case 3:
bt_node.flags1 |= B_host;
break;
case 4:
bt_node.flags1 |= B_hub;
break;
}
if (strstr (p, "CM"))
{
bt_node.flags1 |= B_CM;
}
/* Stick in a CM flag is there is one done manually */
cm = cm_head;
while (cm != NULL)
{
if (((addrs[0] == cm->zone) || (cm->zone == -1)) &&
(addrs[2] == cm->net) && (node == cm->node))
{
bt_node.flags1 |= B_CM;
break;
}
cm = cm->next;
}
write (nodelist_ext, (char *) &bt_node, sizeof (struct extrastuff));
}
if (nodelist_dog != -1)
{
if (node <= 0)
{
if (seanet.numnodes)
{
write (netlist_dog, (char *) &seanet, sizeof (struct netls));
seanetcnt += sizeof (struct netls);
}
memset (&seanet, 0, sizeof (struct netls));
seanet.netnum = addrs[2];
strncpy (seanet.netname, b2, 13);
p1 = seanet.netname;
while ((p1 = strchr (p1, '_')) != NULL)
{
*p1 = ' ';
}
strncpy (seanet.netcity, b3, 39);
p1 = seanet.netcity;
while ((p1 = strchr (p1, '_')) != NULL)
{
*p1 = ' ';
}
seanet.nodeptr = seanodecnt;
}
if (seacnt < 4000)
{
if (seaptr != NULL)
{
seaptr->idxnet = addrs[2];
seaptr->idxnode = node;
seaptr->netlptr = seanetcnt;
seaptr->nodelptr = seanodecnt;
++seaptr;
}
}
else
{
seacnt = 3999;
}
memset (&seanode, 0, sizeof (struct nodels));
seanode.nodenum = node;
strncpy (seanode.nodename, b2, 13);
p1 = seanode.nodename;
while ((p1 = strchr (p1, '_')) != NULL)
{
*p1 = ' ';
}
strncpy (seanode.nodecity, b3, 39);
p1 = seanode.nodecity;
while ((p1 = strchr (p1, '_')) != NULL)
{
*p1 = ' ';
}
strncpy (seanode.nodephone, b5, 39);
if (cur_addr_lev == 4)
{
seanode.havehub = 1;
seanode.nodehub = addrs[3];
}
seanode.nodecost = n_cost;
seanode.nodebaud = n_baud;
write (nodelist_dog, (char *) &seanode, sizeof (struct nodels));
++seanet.numnodes;
seanodecnt += sizeof (struct nodels);
++seacnt;
}
if (nodelist_sys != -1)
{
memset (&old_node, 0, sizeof (struct _oldnode));
old_node.number = node;
old_node.net = addrs[2];
old_node.cost = n_cost;
old_node.rate = n_baud;
strncpy (old_node.name, b2, 19);
p1 = old_node.name;
while ((p1 = strchr (p1, '_')) != NULL)
{
*p1 = ' ';
}
strncpy (old_node.phone, b5, 39);
strncpy (old_node.city, b3, 39);
p1 = old_node.city;
while ((p1 = strchr (p1, '_')) != NULL)
{
*p1 = ' ';
}
/* Stick in a password if there is one */
pw = pw_head;
while (pw != NULL)
{
if (((addrs[0] == pw->zone) || (pw->zone == -1)) &&
(addrs[2] == pw->net) && (node == pw->node))
{
strncpy (&(old_node.city[strlen (old_node.city) + 1]), pw->pw, 8);
break;
}
pw = pw->next;
}
write (nodelist_sys, (char *) &old_node, sizeof (struct _oldnode));
}
if (nodelist_idx != -1)
{
if ((node == 0) && (dphone <= 2))
{
if ((ntyp != 'Z') || (!usezone))
n_out = -1;
else
n_out = -2;
}
else
{
n_out = node;
}
write (nodelist_idx, (char *) &n_out, sizeof (int));
write (nodelist_idx, (char *) &addrs[2], sizeof (int));
}
if (dphone == 3)
{
seanet.havehost = 1;
seanet.nethost = 0;
}
if ((ntyp == 'G') || (ntyp == 'I'))
{
seanet.havegate = 1;
seanet.netgate = node;
}
}
/* Print out the Nodelist.Prn file */
if ((!this_list) && (nodelist_prn != NULL) && !def)
{
++prn_pg_lines;
if (dphone && (dphone <= 3) && (prn_pg_lines >= 40))
{
header (1);
prn_pg_lines = 4;
}
if (prn_pg_lines >= 60)
{
header (1);
prn_pg_lines = 4;
}
fprintf (nodelist_prn,
"%-10.10s %4d %-20.20s %-20.20s %-25.25s %-20.20s %4d %-20.20s\n",
b1, n_num, b2, orig_phone, b3, b4, n_baud, p);
}
/* Print out the Nodelist.Txt file */
if ((!this_list) && (nodelist_txt != NULL) && !def)
{
++txt_pg_lines;
if (dphone && (dphone <= 3) && (txt_pg_lines >= 40))
{
header (0);
txt_pg_lines = 4;
}
if (txt_pg_lines >= 60)
{
header (0);
txt_pg_lines = 4;
}
fprintf (nodelist_txt,
"%-10.10s %4d %-20.20s %-17.17s %-19.19s %4d\n",
b1, n_num, b2, orig_phone, b3, n_baud);
}
/* Print out the Fidouser.$$1 file */
if (fidouser_$$1 != NULL)
{
/* Should we just be on our way? */
if ((myzone > 0) && (myzone != addrs[0]) && (udata == 2))
{
continue;
}
how_likely (p, dphone, addrs, node, n_baud);
/* If this is a bad place, make it horrible */
if (hold || pvt || def)
likely = 100;
p = b4;
b1[1] = b2[1] = b3[1] = b5[1] = '\0';
p1 = b1;
while ((*p) && (*p != '_'))
{
*p1++ = *p++;
}
*p1 = '\0';
if (*p != '\0')
++p;
p1 = b2;
while ((*p) && (*p != '_'))
{
*p1++ = *p++;
}
*p1 = '\0';
if (*p != '\0')
++p;
p1 = b3;
while ((*p) && (*p != '_'))
{
*p1++ = *p++;
}
*p1 = '\0';
p1 = b5;
while ((*p) && (*p != '_'))
{
*p1++ = *p++;
}
*p1 = '\0';
if (*p == '_')
continue;
b5[0] = toupper (b5[0]);
b3[0] = toupper (b3[0]);
b2[0] = toupper (b2[0]);
b1[0] = toupper (b1[0]);
strlwr (&b5[1]);
strlwr (&b3[1]);
strlwr (&b2[1]);
strlwr (&b1[1]);
if (b5[0] != '\0')
{
sprintf (buff, "%s, %s %s %s", b5, b1, b2, b3);
}
else
if (b3[0] != '\0')
{
sprintf (buff, "%s, %s %s", b3, b1, b2);
}
else
if (b2[0] != '\0')
{
sprintf (buff, "%s, %s", b2, b1);
}
else
if (b1[0] != '\0')
{
sprintf (buff, "%s", b1);
}
else
{
continue;
}
if ((myzone > 0) && (myzone != addrs[0]))
{
sprintf (b5, "%d:%d", addrs[0], addrs[2]);
}
else
{
sprintf (b5, "%d", addrs[2]);
}
fprintf (fidouser_$$1, "%-40.40s%13.13s/%-6d%5d\n", buff, b5, node, likely);
}
}
/* close (f); */
fclose (f);
if (fn != NULL)
fn = fn->next;
}
void
header (which)
int which;
{
if (which == 1)
{
if (prn_pagenum != 0)
{
fprintf (nodelist_prn, "\n");
}
++prn_pagenum;
fprintf (nodelist_prn, "%s %d\n", prn_first_line, prn_pagenum);
fprintf (nodelist_prn, "Type Node Board's Name Phone Number City Sysop's Name Baud Flags\n");
fprintf (nodelist_prn, "==== ==== ============ ============ ==== ============ ==== =====\n\n");
}
else if (which == 0)
{
if (txt_pagenum != 0)
{
fprintf (nodelist_txt, "\n");
}
++txt_pagenum;
fprintf (nodelist_txt, "%s %d\n", txt_first_line, txt_pagenum);
fprintf (nodelist_txt, "Type Node Board's Name Phone Number City Baud\n");
fprintf (nodelist_txt, "==== ==== ============ ============ ==== ====\n");
}
}
/*
char mybuf[4097];
char *myptr = mybuf;
int got_tok;
get_data (buffer, f)
char *buffer;
int f;
{
char *s;
char *save;
int n;
s = NULL;
if (got_tok)
{
s = strtok (NULL, "\n");
}
got_tok = 0;
if (s != NULL)
{
save = myptr;
myptr = s + strlen (s) + 1;
if (myptr < mybuf + 4097)
strcpy (buffer, s);
else
{
s = NULL;
myptr = save;
}
}
if (s == NULL)
{
strcpy (buffer, myptr);
if ((n = read (f, mybuf, 4096)) <= 0)
return (1);
mybuf[n] = '\0';
myptr = mybuf;
s = strtok (myptr, "\n");
if (s == NULL)
return (1);
strcat (buffer, s);
myptr = s + strlen (s) + 1;
}
got_tok = 1;
return (0);
}
*/