Code cleanup for nodelist processing
This commit is contained in:
parent
962fe209c6
commit
89efacbf9d
@ -12,14 +12,23 @@ v0.61.1 20-Jun-2004.
|
|||||||
Added compile directive for full newsgate. If this switch is
|
Added compile directive for full newsgate. If this switch is
|
||||||
used then mbfido behaves like it did upto version 0.50.0 and
|
used then mbfido behaves like it did upto version 0.50.0 and
|
||||||
mbnntp is disabled.
|
mbnntp is disabled.
|
||||||
|
Added define for nodelist line length for all programs.
|
||||||
|
|
||||||
libmsgbase.a:
|
libmsgbase.a:
|
||||||
If a message area becomes empty after a pack, all lastread
|
If a message area becomes empty after a pack, all lastread
|
||||||
pointers are reset to zero.
|
pointers are reset to zero.
|
||||||
|
|
||||||
|
mbout:
|
||||||
|
Code cleanup for nodelist processing.
|
||||||
|
|
||||||
mbfido:
|
mbfido:
|
||||||
Added compile directive for full newsgate.
|
Added compile directive for full newsgate.
|
||||||
|
|
||||||
|
mbindex:
|
||||||
|
Code cleanup for nodelist processing.
|
||||||
|
Added a extra check to see if nodelist datalines are valid to
|
||||||
|
prevent segfaults on Skynet nodelists.
|
||||||
|
|
||||||
mbnntp:
|
mbnntp:
|
||||||
If compiled in full newsmode, this program acts like a dummy.
|
If compiled in full newsmode, this program acts like a dummy.
|
||||||
|
|
||||||
|
@ -455,7 +455,10 @@ typedef struct _nlidx {
|
|||||||
*/
|
*/
|
||||||
typedef struct _nlusr {
|
typedef struct _nlusr {
|
||||||
char user[36]; /* User name */
|
char user[36]; /* User name */
|
||||||
long record; /* Record in index */
|
unsigned short zone; /* Zone number */
|
||||||
|
unsigned short net; /* Net number */
|
||||||
|
unsigned short node; /* Node number */
|
||||||
|
unsigned short point; /* Point number */
|
||||||
} nlusr;
|
} nlusr;
|
||||||
|
|
||||||
|
|
||||||
|
205
mbfido/mbindex.c
205
mbfido/mbindex.c
@ -48,9 +48,6 @@ long total = 0, entries = 0;
|
|||||||
int filenr = 0;
|
int filenr = 0;
|
||||||
unsigned short regio;
|
unsigned short regio;
|
||||||
nl_list *nll = NULL;
|
nl_list *nll = NULL;
|
||||||
static char *k, *v;
|
|
||||||
static int linecnt = 0;
|
|
||||||
static char *nlpath = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
extern int do_quiet; /* Quiet flag */
|
extern int do_quiet; /* Quiet flag */
|
||||||
@ -59,82 +56,6 @@ time_t t_start; /* Start time */
|
|||||||
time_t t_end; /* End time */
|
time_t t_end; /* End time */
|
||||||
|
|
||||||
|
|
||||||
static int getmdm(char**);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Table to parse the ~/etc/nodelist.conf file
|
|
||||||
*/
|
|
||||||
static struct _keytab {
|
|
||||||
char *key;
|
|
||||||
int (*prc)(char **);
|
|
||||||
char** dest;
|
|
||||||
} keytab[] = {
|
|
||||||
{(char *)"isdn", getmdm, (char **)&nl_isdn},
|
|
||||||
{(char *)"tcpip", getmdm, (char **)&nl_tcpip},
|
|
||||||
{NULL, NULL, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get a keyword, string, unsigned long, unsigned long
|
|
||||||
*/
|
|
||||||
static int getmdm(char **dest)
|
|
||||||
{
|
|
||||||
char *p, *q;
|
|
||||||
unsigned long tmp1, tmp2;
|
|
||||||
nodelist_modem **tmpm;
|
|
||||||
|
|
||||||
for (p = v; *p && !isspace(*p); p++);
|
|
||||||
if (*p)
|
|
||||||
*p++ = '\0';
|
|
||||||
while (*p && isspace(*p))
|
|
||||||
p++;
|
|
||||||
if (*p == '\0') {
|
|
||||||
WriteError("%s(%s): less then two tokens", nlpath, linecnt);
|
|
||||||
return MBERR_INIT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (q = p; *q && !isspace(*q); q++);
|
|
||||||
if (*q)
|
|
||||||
*q++ = '\0';
|
|
||||||
while (*q && isspace(*q))
|
|
||||||
q++;
|
|
||||||
if (*q == '\0') {
|
|
||||||
WriteError("%s(%s): less then three tokens", nlpath, linecnt);
|
|
||||||
return MBERR_INIT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (tmpm = (nodelist_modem**)dest; *tmpm; tmpm=&((*tmpm)->next));
|
|
||||||
(*tmpm) = (nodelist_modem *) xmalloc(sizeof(nodelist_modem));
|
|
||||||
(*tmpm)->next = NULL;
|
|
||||||
(*tmpm)->name = xstrcpy(v);
|
|
||||||
tmp1 = strtoul(p, NULL, 0);
|
|
||||||
tmp2 = strtoul(q, NULL, 0);
|
|
||||||
(*tmpm)->mask = tmp1;
|
|
||||||
(*tmpm)->value = tmp2;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void tidy_nl_modem(nodelist_modem **);
|
|
||||||
void tidy_nl_modem(nodelist_modem **fap)
|
|
||||||
{
|
|
||||||
nodelist_modem *tmp, *old;
|
|
||||||
|
|
||||||
for (tmp = *fap; tmp; tmp = old) {
|
|
||||||
old = tmp->next;
|
|
||||||
if (tmp->name)
|
|
||||||
free(tmp->name);
|
|
||||||
free(tmp);
|
|
||||||
}
|
|
||||||
*fap = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -391,7 +312,6 @@ int compile(char *nlname, unsigned short zo, unsigned short ne, unsigned short n
|
|||||||
FILE *nl;
|
FILE *nl;
|
||||||
struct _nlidx ndx;
|
struct _nlidx ndx;
|
||||||
struct _nlusr udx;
|
struct _nlusr udx;
|
||||||
nodelist_modem **tmpm;
|
|
||||||
|
|
||||||
if ((nl = fopen(fullpath(nlname), "r")) == NULL) {
|
if ((nl = fopen(fullpath(nlname), "r")) == NULL) {
|
||||||
WriteError("$Can't open %s", fullpath(nlname));
|
WriteError("$Can't open %s", fullpath(nlname));
|
||||||
@ -599,7 +519,6 @@ int compile(char *nlname, unsigned short zo, unsigned short ne, unsigned short n
|
|||||||
}
|
}
|
||||||
|
|
||||||
memset(&udx, 0, sizeof(udx));
|
memset(&udx, 0, sizeof(udx));
|
||||||
udx.record = total;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read nodelist line and extract username.
|
* Read nodelist line and extract username.
|
||||||
@ -614,12 +533,16 @@ int compile(char *nlname, unsigned short zo, unsigned short ne, unsigned short n
|
|||||||
q = p;
|
q = p;
|
||||||
}
|
}
|
||||||
if (strlen(p) > 35)
|
if (strlen(p) > 35)
|
||||||
p[35] = '\0';
|
p[36] = '\0';
|
||||||
sprintf(udx.user, "%s", p);
|
strcpy(udx.user, p);
|
||||||
|
udx.zone = ndx.zone;
|
||||||
|
udx.net = ndx.net;
|
||||||
|
udx.node = ndx.node;
|
||||||
|
udx.point = ndx.point;
|
||||||
|
// FIXME: the record is filled, now do something with it!
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now search for the baudrate field, 300 means it's
|
* Now search for the baudrate field, just to check if it's there.
|
||||||
* and ISDN or TCP/IP only node which is a special case.
|
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
p = q;
|
p = q;
|
||||||
@ -630,14 +553,6 @@ int compile(char *nlname, unsigned short zo, unsigned short ne, unsigned short n
|
|||||||
if (q == NULL)
|
if (q == NULL)
|
||||||
q = p;
|
q = p;
|
||||||
}
|
}
|
||||||
if ((strlen(p) == 3) && (!strcmp(p, "300")) && (q != NULL)) {
|
|
||||||
for (tmpm = &nl_isdn; *tmpm; tmpm=&((*tmpm)->next))
|
|
||||||
if (strstr(q, (*tmpm)->name))
|
|
||||||
ndx.pflag |= NL_ISDN;
|
|
||||||
for (tmpm = &nl_tcpip; *tmpm; tmpm=&((*tmpm)->next))
|
|
||||||
if (strstr(q, (*tmpm)->name))
|
|
||||||
ndx.pflag |= NL_TCPIP;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If zone, net and node given, then this list is an
|
* If zone, net and node given, then this list is an
|
||||||
@ -851,9 +766,9 @@ int makelist(char *base, unsigned short zo, unsigned short ne, unsigned short no
|
|||||||
int nodebld(void)
|
int nodebld(void)
|
||||||
{
|
{
|
||||||
int rc = 0, i;
|
int rc = 0, i;
|
||||||
char *im, *fm, *um, *old, *new, *p, buf[256];
|
char *im, *fm, *um, *old, *new;
|
||||||
struct _nlfil fdx;
|
struct _nlfil fdx;
|
||||||
FILE *fp, *dbf;
|
FILE *fp;
|
||||||
nl_list *tmp;
|
nl_list *tmp;
|
||||||
|
|
||||||
memset(&fdx, 0, sizeof(fdx));
|
memset(&fdx, 0, sizeof(fdx));
|
||||||
@ -885,95 +800,31 @@ int nodebld(void)
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
nl_isdn = NULL;
|
if ((fp = fopen(fidonet_fil, "r")) == 0)
|
||||||
nl_tcpip = NULL;
|
rc = MBERR_GENERAL;
|
||||||
|
else {
|
||||||
|
fread(&fidonethdr, sizeof(fidonethdr), 1, fp);
|
||||||
|
|
||||||
/*
|
while (fread(&fidonet, fidonethdr.recsize, 1, fp) == 1) {
|
||||||
* Read and parse ~/etc/nodelist.conf
|
if (fidonet.available) {
|
||||||
*/
|
rc = makelist(fidonet.nodelist, 0, 0, 0);
|
||||||
nlpath = calloc(PATH_MAX, sizeof(char));
|
if (rc)
|
||||||
sprintf(nlpath, "%s/etc/nodelist.conf", getenv("MBSE_ROOT"));
|
|
||||||
if ((dbf = fopen(nlpath, "r")) == NULL) {
|
|
||||||
WriteError("$Can't open %s", nlpath);
|
|
||||||
fclose(ifp);
|
|
||||||
unlink(im);
|
|
||||||
fclose(ufp);
|
|
||||||
unlink(um);
|
|
||||||
fclose(ffp);
|
|
||||||
unlink(fm);
|
|
||||||
free(nlpath);
|
|
||||||
return MBERR_GENERAL;
|
|
||||||
} else {
|
|
||||||
while (fgets(buf, sizeof(buf) -1, dbf)) {
|
|
||||||
linecnt++;
|
|
||||||
if (*(p = buf + strlen(buf) -1) != '\n') {
|
|
||||||
WriteError("%s(%d): \"%s\" - line too long", nlpath, linecnt, buf);
|
|
||||||
rc = MBERR_GENERAL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
*p-- = '\0';
|
|
||||||
while ((p >= buf) && isspace(*p))
|
|
||||||
*p-- = '\0';
|
|
||||||
k = buf;
|
|
||||||
while (*k && isspace(*k))
|
|
||||||
k++;
|
|
||||||
p = k;
|
|
||||||
while (*p && !isspace(*p))
|
|
||||||
p++;
|
|
||||||
*p++='\0';
|
|
||||||
v = p;
|
|
||||||
while (*v && isspace(*v))
|
|
||||||
v++;
|
|
||||||
|
|
||||||
if ((*k == '\0') || (*k == '#')) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (i = 0; keytab[i].key; i++)
|
|
||||||
if (strcasecmp(k,keytab[i].key) == 0)
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// if (keytab[i].key != NULL) {
|
for (i = 0; i < 6; i++) {
|
||||||
// WriteError("%s(%d): %s %s - unknown keyword", nlpath, linecnt, MBSE_SS(k), MBSE_SS(v));
|
if (fidonet.seclist[i].zone) {
|
||||||
// rc = MBERR_GENERAL;
|
rc = makelist(fidonet.seclist[i].nodelist, fidonet.seclist[i].zone,
|
||||||
// break;
|
|
||||||
// } else
|
|
||||||
if ((keytab[i].prc(keytab[i].dest))) {
|
|
||||||
rc = MBERR_GENERAL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(dbf);
|
|
||||||
}
|
|
||||||
free(nlpath);
|
|
||||||
|
|
||||||
if (rc == 0) {
|
|
||||||
if ((fp = fopen(fidonet_fil, "r")) == 0)
|
|
||||||
rc = MBERR_GENERAL;
|
|
||||||
else {
|
|
||||||
fread(&fidonethdr, sizeof(fidonethdr), 1, fp);
|
|
||||||
|
|
||||||
while (fread(&fidonet, fidonethdr.recsize, 1, fp) == 1) {
|
|
||||||
if (fidonet.available) {
|
|
||||||
rc = makelist(fidonet.nodelist, 0, 0, 0);
|
|
||||||
if (rc)
|
|
||||||
break;
|
|
||||||
|
|
||||||
for (i = 0; i < 6; i++) {
|
|
||||||
if (fidonet.seclist[i].zone) {
|
|
||||||
rc = makelist(fidonet.seclist[i].nodelist, fidonet.seclist[i].zone,
|
|
||||||
fidonet.seclist[i].net, fidonet.seclist[i].node);
|
fidonet.seclist[i].net, fidonet.seclist[i].node);
|
||||||
if (rc)
|
if (rc)
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (rc)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
if (rc)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(ufp);
|
fclose(ufp);
|
||||||
@ -1028,8 +879,6 @@ int nodebld(void)
|
|||||||
free(fm);
|
free(fm);
|
||||||
free(um);
|
free(um);
|
||||||
tidy_nllist(&nll);
|
tidy_nllist(&nll);
|
||||||
tidy_nl_modem(&nl_isdn);
|
|
||||||
tidy_nl_modem(&nl_tcpip);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -10,18 +10,6 @@ typedef struct _fd_list {
|
|||||||
} fd_list;
|
} fd_list;
|
||||||
|
|
||||||
|
|
||||||
typedef struct _nodelist_modem {
|
|
||||||
struct _nodelist_modem *next;
|
|
||||||
char *name;
|
|
||||||
unsigned long mask;
|
|
||||||
unsigned long value;
|
|
||||||
} nodelist_modem;
|
|
||||||
|
|
||||||
|
|
||||||
nodelist_modem *nl_isdn;
|
|
||||||
nodelist_modem *nl_tcpip;
|
|
||||||
|
|
||||||
|
|
||||||
int lockindex(void);
|
int lockindex(void);
|
||||||
void ulockindex(void);
|
void ulockindex(void);
|
||||||
void Help(void);
|
void Help(void);
|
||||||
|
Reference in New Issue
Block a user