Code cleanups for nodelist processing
This commit is contained in:
parent
19ad88a5db
commit
962fe209c6
@ -481,8 +481,6 @@ typedef struct _nlusr {
|
|||||||
#define NL_HOLD 0x02 /* Node is Hold */
|
#define NL_HOLD 0x02 /* Node is Hold */
|
||||||
#define NL_PVT 0x04 /* Private node */
|
#define NL_PVT 0x04 /* Private node */
|
||||||
#define NL_DUMMY 0x08 /* Dummy entry */
|
#define NL_DUMMY 0x08 /* Dummy entry */
|
||||||
#define NL_ISDN 0x10 /* ISDN Only node */
|
|
||||||
#define NL_TCPIP 0x20 /* TCP/IP Only node */
|
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
|
@ -99,16 +99,12 @@ int nlinfo(faddr *addr)
|
|||||||
* Show P flags
|
* Show P flags
|
||||||
*/
|
*/
|
||||||
printf("P Flag :");
|
printf("P Flag :");
|
||||||
if (nlent->pflag & 0x01)
|
if (nlent->pflag & NL_DOWN)
|
||||||
printf(" Down");
|
printf(" Down");
|
||||||
if (nlent->pflag & 0x02)
|
if (nlent->pflag & NL_HOLD)
|
||||||
printf(" Hold");
|
printf(" Hold");
|
||||||
if (nlent->pflag & 0x04)
|
if (nlent->pflag & NL_PVT)
|
||||||
printf(" Pvt");
|
printf(" Pvt");
|
||||||
if (nlent->pflag & 0x10)
|
|
||||||
printf(" ISDN");
|
|
||||||
if (nlent->pflag & 0x20)
|
|
||||||
printf(" TCP/IP");
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
if (nlent->t1) {
|
if (nlent->t1) {
|
||||||
printf("System open : ");
|
printf("System open : ");
|
||||||
|
742
mbfido/mbindex.c
742
mbfido/mbindex.c
@ -48,6 +48,9 @@ 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 */
|
||||||
@ -56,6 +59,83 @@ 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we don't know what to type
|
* If we don't know what to type
|
||||||
@ -304,18 +384,18 @@ int comp_node(nl_list **fap1, nl_list **fap2)
|
|||||||
|
|
||||||
int compile(char *nlname, unsigned short zo, unsigned short ne, unsigned short no)
|
int compile(char *nlname, unsigned short zo, unsigned short ne, unsigned short no)
|
||||||
{
|
{
|
||||||
int num, i, rc = 0, lineno, boss = FALSE, bossvalid = FALSE;
|
int num, i, lineno, boss = FALSE, bossvalid = FALSE;
|
||||||
unsigned short upnet, upnode;
|
unsigned short upnet, upnode;
|
||||||
char buf[MAXNLLINELEN], *p, *q;
|
char buf[MAXNLLINELEN], *p, *q;
|
||||||
faddr *tmpa;
|
faddr *tmpa;
|
||||||
FILE *nl;
|
FILE *nl;
|
||||||
struct _nlidx ndx;
|
struct _nlidx ndx;
|
||||||
struct _nlusr udx;
|
struct _nlusr udx;
|
||||||
|
nodelist_modem **tmpm;
|
||||||
|
|
||||||
rc = 0;
|
|
||||||
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));
|
||||||
return 102;
|
return MBERR_INIT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Syslog('+', "Compiling \"%s\" (%d)", nlname, filenr);
|
Syslog('+', "Compiling \"%s\" (%d)", nlname, filenr);
|
||||||
@ -357,104 +437,116 @@ int compile(char *nlname, unsigned short zo, unsigned short ne, unsigned short n
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*(p=buf+strlen(buf) -1) == '\n')
|
if (*(p=buf+strlen(buf) -1) == '\n')
|
||||||
*p-- = '\0';
|
*p-- = '\0';
|
||||||
if (*p == '\r')
|
if (*p == '\r')
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
if ((buf[0] == ';') || (buf[0] == '\032') || (buf[0] == '\0'))
|
if ((buf[0] == ';') || (buf[0] == '\032') || (buf[0] == '\0'))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (CFG.slow_util && do_quiet) {
|
if (CFG.slow_util && do_quiet) {
|
||||||
if (zo) {
|
if (zo) {
|
||||||
msleep(1);
|
msleep(1);
|
||||||
} else {
|
} else {
|
||||||
if ((lineno % 40) == 0)
|
if ((lineno % 40) == 0)
|
||||||
msleep(1);
|
msleep(1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((p = strchr(buf, ',')))
|
||||||
|
*p++ = '\0';
|
||||||
|
else {
|
||||||
|
/*
|
||||||
|
* Extra check for valid datalines, there should be at least one comma.
|
||||||
|
*/
|
||||||
|
WriteError("%s(%u): invalid dataline", nlname,lineno);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ((q = strchr(p, ',')))
|
||||||
|
*q++ = '\0';
|
||||||
|
else {
|
||||||
|
WriteError("%s(%u): invalid dataline", nlname,lineno);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ndx.type = NL_NONE;
|
||||||
|
ndx.pflag = 0;
|
||||||
|
|
||||||
|
if (buf[0] == '\0') {
|
||||||
|
if (boss)
|
||||||
|
ndx.type = NL_POINT;
|
||||||
|
else
|
||||||
|
ndx.type = NL_NODE;
|
||||||
|
} else {
|
||||||
|
if (strcasecmp(buf,"Boss") == 0) {
|
||||||
|
ndx.type = NL_POINT;
|
||||||
|
bossvalid = FALSE;
|
||||||
|
if ((tmpa=parsefnode(p)) == NULL) {
|
||||||
|
WriteError("%s(%u): unparsable Boss addr \"%s\"", nlname,lineno,p);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
boss = TRUE;
|
||||||
if ((p = strchr(buf, ',')))
|
if (tmpa->zone)
|
||||||
*p++ = '\0';
|
ndx.zone = tmpa->zone;
|
||||||
if ((q = strchr(p, ',')))
|
ndx.net = tmpa->net;
|
||||||
*q++ = '\0';
|
ndx.node = tmpa->node;
|
||||||
|
ndx.point = 0;
|
||||||
|
tidy_faddr(tmpa);
|
||||||
ndx.type = NL_NONE;
|
ndx.type = NL_NONE;
|
||||||
ndx.pflag = 0;
|
|
||||||
|
|
||||||
if (buf[0] == '\0') {
|
if (in_nllist(ndx, &nll, FALSE)) {
|
||||||
if (boss)
|
bossvalid = TRUE;
|
||||||
ndx.type = NL_POINT;
|
}
|
||||||
else
|
continue; /* no further processing */
|
||||||
ndx.type = NL_NODE;
|
} else {
|
||||||
} else
|
boss = FALSE;
|
||||||
if (strcasecmp(buf,"Boss") == 0) {
|
ndx.type = NL_NONE;
|
||||||
ndx.type = NL_POINT;
|
if (!strcasecmp(buf, "Down")) {
|
||||||
bossvalid = FALSE;
|
ndx.pflag |= NL_DOWN;
|
||||||
if ((tmpa=parsefnode(p)) == NULL) {
|
ndx.type = NL_NODE;
|
||||||
WriteError("%s(%u): unparsable Boss addr \"%s\"", nlname,lineno,p);
|
}
|
||||||
continue;
|
if (!strcasecmp(buf, "Hold")) {
|
||||||
}
|
ndx.pflag |= NL_HOLD;
|
||||||
boss = TRUE;
|
ndx.type = NL_NODE;
|
||||||
if (tmpa->zone)
|
}
|
||||||
ndx.zone = tmpa->zone;
|
if (!strcasecmp(buf, "Pvt")) {
|
||||||
ndx.net = tmpa->net;
|
ndx.pflag |= NL_PVT;
|
||||||
ndx.node = tmpa->node;
|
ndx.type = NL_NODE;
|
||||||
ndx.point = 0;
|
|
||||||
tidy_faddr(tmpa);
|
|
||||||
ndx.type = NL_NONE;
|
|
||||||
|
|
||||||
if (in_nllist(ndx, &nll, FALSE)) {
|
|
||||||
bossvalid = TRUE;
|
|
||||||
}
|
|
||||||
continue; /* no further processing */
|
|
||||||
} else {
|
|
||||||
boss = FALSE;
|
|
||||||
ndx.type = NL_NONE;
|
|
||||||
if (!strcasecmp(buf, "Down")) {
|
|
||||||
ndx.pflag |= NL_DOWN;
|
|
||||||
ndx.type = NL_NODE;
|
|
||||||
}
|
|
||||||
if (!strcasecmp(buf, "Hold")) {
|
|
||||||
ndx.pflag |= NL_HOLD;
|
|
||||||
ndx.type = NL_NODE;
|
|
||||||
}
|
|
||||||
if (!strcasecmp(buf, "Pvt")) {
|
|
||||||
ndx.pflag |= NL_PVT;
|
|
||||||
ndx.type = NL_NODE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strcasecmp(buf, "Zone"))
|
|
||||||
ndx.type = NL_ZONE;
|
|
||||||
if (!strcasecmp(buf, "Region"))
|
|
||||||
ndx.type = NL_REGION;
|
|
||||||
if (!strcasecmp(buf, "Host"))
|
|
||||||
ndx.type = NL_HOST;
|
|
||||||
if (!strcasecmp(buf, "Hub"))
|
|
||||||
ndx.type = NL_HUB;
|
|
||||||
if (!strcasecmp(buf, "Point")) {
|
|
||||||
ndx.type = NL_POINT;
|
|
||||||
bossvalid = TRUE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ndx.type == NL_NONE) {
|
if (!strcasecmp(buf, "Zone"))
|
||||||
for (q = buf; *q; q++)
|
ndx.type = NL_ZONE;
|
||||||
if (*q < ' ')
|
if (!strcasecmp(buf, "Region"))
|
||||||
*q='.';
|
ndx.type = NL_REGION;
|
||||||
WriteError("%s(%u): unidentified entry \"%s\"", nlname, lineno, buf);
|
if (!strcasecmp(buf, "Host"))
|
||||||
continue;
|
ndx.type = NL_HOST;
|
||||||
|
if (!strcasecmp(buf, "Hub"))
|
||||||
|
ndx.type = NL_HUB;
|
||||||
|
if (!strcasecmp(buf, "Point")) {
|
||||||
|
ndx.type = NL_POINT;
|
||||||
|
bossvalid = TRUE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((num=atoi(p)) == 0) {
|
if (ndx.type == NL_NONE) {
|
||||||
WriteError("%s(%u): bad numeric \"%s\"", nlname,lineno,p);
|
for (q = buf; *q; q++)
|
||||||
continue;
|
if (*q < ' ')
|
||||||
}
|
*q='.';
|
||||||
|
WriteError("%s(%u): unidentified entry \"%s\"", nlname, lineno, buf);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
if ((num=atoi(p)) == 0) {
|
||||||
* now update the current address
|
WriteError("%s(%u): bad numeric \"%s\"", nlname,lineno,p);
|
||||||
*/
|
continue;
|
||||||
switch (ndx.type) {
|
}
|
||||||
case NL_REGION: ndx.net = num;
|
|
||||||
|
/*
|
||||||
|
* now update the current address
|
||||||
|
*/
|
||||||
|
switch (ndx.type) {
|
||||||
|
case NL_REGION: ndx.net = num;
|
||||||
ndx.node = 0;
|
ndx.node = 0;
|
||||||
ndx.point = 0;
|
ndx.point = 0;
|
||||||
ndx.upnet = ndx.zone;
|
ndx.upnet = ndx.zone;
|
||||||
@ -463,7 +555,7 @@ int compile(char *nlname, unsigned short zo, unsigned short ne, unsigned short n
|
|||||||
upnet = num;
|
upnet = num;
|
||||||
upnode = 0;
|
upnode = 0;
|
||||||
break;
|
break;
|
||||||
case NL_ZONE: ndx.zone = num;
|
case NL_ZONE: ndx.zone = num;
|
||||||
ndx.net = num;
|
ndx.net = num;
|
||||||
ndx.node = 0;
|
ndx.node = 0;
|
||||||
ndx.point = 0;
|
ndx.point = 0;
|
||||||
@ -473,7 +565,7 @@ int compile(char *nlname, unsigned short zo, unsigned short ne, unsigned short n
|
|||||||
upnet = num;
|
upnet = num;
|
||||||
upnode = 0;
|
upnode = 0;
|
||||||
break;
|
break;
|
||||||
case NL_HOST: ndx.net = num;
|
case NL_HOST: ndx.net = num;
|
||||||
ndx.node = 0;
|
ndx.node = 0;
|
||||||
ndx.point = 0;
|
ndx.point = 0;
|
||||||
ndx.upnet = ndx.region;
|
ndx.upnet = ndx.region;
|
||||||
@ -481,107 +573,99 @@ int compile(char *nlname, unsigned short zo, unsigned short ne, unsigned short n
|
|||||||
upnet = num;
|
upnet = num;
|
||||||
upnode = 0;
|
upnode = 0;
|
||||||
break;
|
break;
|
||||||
case NL_HUB: ndx.node = num;
|
case NL_HUB: ndx.node = num;
|
||||||
ndx.point = 0;
|
ndx.point = 0;
|
||||||
ndx.upnet = ndx.net;
|
ndx.upnet = ndx.net;
|
||||||
ndx.upnode= 0;
|
ndx.upnode= 0;
|
||||||
upnet = ndx.net;
|
upnet = ndx.net;
|
||||||
upnode = num;
|
upnode = num;
|
||||||
break;
|
break;
|
||||||
case NL_NODE: ndx.node = num;
|
case NL_NODE: ndx.node = num;
|
||||||
ndx.point = 0;
|
ndx.point = 0;
|
||||||
ndx.upnet = upnet;
|
ndx.upnet = upnet;
|
||||||
ndx.upnode= upnode;
|
ndx.upnode= upnode;
|
||||||
break;
|
break;
|
||||||
case NL_POINT: ndx.point = num;
|
case NL_POINT: ndx.point = num;
|
||||||
ndx.upnet = ndx.net;
|
ndx.upnet = ndx.net;
|
||||||
ndx.upnode= ndx.node;
|
ndx.upnode= ndx.node;
|
||||||
if ((!ndx.region) && bossvalid)
|
if ((!ndx.region) && bossvalid)
|
||||||
ndx.region = regio;
|
ndx.region = regio;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
if (!do_quiet) {
|
|
||||||
printf("\rZone %-6uRegion %-6uNet %-6uNode %-6uPoint %-6u",
|
|
||||||
ndx.zone, ndx.region, ndx.net, ndx.node, ndx.point);
|
|
||||||
fflush(stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&udx, 0, sizeof(udx));
|
|
||||||
udx.record = total;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read nodelist line and extract username.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < 3; i++) {
|
|
||||||
p = q;
|
|
||||||
if (p == NULL)
|
|
||||||
continue;
|
|
||||||
if ((q = strchr(p, ',')))
|
|
||||||
*q++ = '\0';
|
|
||||||
if (q == NULL)
|
|
||||||
q = p;
|
|
||||||
}
|
|
||||||
if (strlen(p) > 35)
|
|
||||||
p[35] = '\0';
|
|
||||||
sprintf(udx.user, "%s", p);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now search for the baudrate field, 300 means it's
|
|
||||||
* and ISDN or TCP/IP only node which is a special case.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < 2; i++) {
|
|
||||||
p = q;
|
|
||||||
if (p == NULL)
|
|
||||||
continue;
|
|
||||||
if ((q = strchr(p, ',')))
|
|
||||||
*q++ = '\0';
|
|
||||||
if (q == NULL)
|
|
||||||
q = p;
|
|
||||||
}
|
|
||||||
if ((strlen(p) == 3) && (!strcmp(p, "300")) && (q != NULL)) {
|
|
||||||
if ((strstr(q, (char *)"X75")) ||
|
|
||||||
(strstr(q, (char *)"V110L")) ||
|
|
||||||
(strstr(q, (char *)"V110H")) ||
|
|
||||||
(strstr(q, (char *)"V120L")) ||
|
|
||||||
(strstr(q, (char *)"V120H")) ||
|
|
||||||
(strstr(q, (char *)"ISDN")))
|
|
||||||
ndx.pflag |= NL_ISDN;
|
|
||||||
if ((strstr(q, (char *)"IFC")) ||
|
|
||||||
(strstr(q, (char *)"IBN")) ||
|
|
||||||
(strstr(q, (char *)"ITN")) ||
|
|
||||||
(strstr(q, (char *)"IVM")) ||
|
|
||||||
(strstr(q, (char *)"IFT")) ||
|
|
||||||
(strstr(q, (char *)"IP")))
|
|
||||||
ndx.pflag |= NL_TCPIP;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If zone, net and node given, then this list is an
|
|
||||||
* overlay so we will call in_list() to replace the
|
|
||||||
* existing records, or append them if they don't exist.
|
|
||||||
* Also, only points with a valid boss will be added.
|
|
||||||
*/
|
|
||||||
if (zo) {
|
|
||||||
if (!(in_nllist(ndx, &nll, TRUE))) {
|
|
||||||
if (ndx.point && bossvalid) {
|
|
||||||
fill_nllist(ndx, &nll);
|
|
||||||
}
|
|
||||||
if (!ndx.point)
|
|
||||||
fill_nllist(ndx, &nll);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
fill_nllist(ndx, &nll);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(nl);
|
|
||||||
Syslog('+', "%d entries", entries);
|
|
||||||
|
|
||||||
if (!do_quiet) {
|
if (!do_quiet) {
|
||||||
printf(" %ld entries\n", entries);
|
printf("\rZone %-6uRegion %-6uNet %-6uNode %-6uPoint %-6u",
|
||||||
fflush(stdout);
|
ndx.zone, ndx.region, ndx.net, ndx.node, ndx.point);
|
||||||
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
memset(&udx, 0, sizeof(udx));
|
||||||
|
udx.record = total;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read nodelist line and extract username.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
p = q;
|
||||||
|
if (p == NULL)
|
||||||
|
continue;
|
||||||
|
if ((q = strchr(p, ',')))
|
||||||
|
*q++ = '\0';
|
||||||
|
if (q == NULL)
|
||||||
|
q = p;
|
||||||
|
}
|
||||||
|
if (strlen(p) > 35)
|
||||||
|
p[35] = '\0';
|
||||||
|
sprintf(udx.user, "%s", p);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now search for the baudrate field, 300 means it's
|
||||||
|
* and ISDN or TCP/IP only node which is a special case.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
p = q;
|
||||||
|
if (p == NULL)
|
||||||
|
continue;
|
||||||
|
if ((q = strchr(p, ',')))
|
||||||
|
*q++ = '\0';
|
||||||
|
if (q == NULL)
|
||||||
|
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
|
||||||
|
* overlay so we will call in_list() to replace the
|
||||||
|
* existing records, or append them if they don't exist.
|
||||||
|
* Also, only points with a valid boss will be added.
|
||||||
|
*/
|
||||||
|
if (zo) {
|
||||||
|
if (!(in_nllist(ndx, &nll, TRUE))) {
|
||||||
|
if (ndx.point && bossvalid) {
|
||||||
|
fill_nllist(ndx, &nll);
|
||||||
|
}
|
||||||
|
if (!ndx.point)
|
||||||
|
fill_nllist(ndx, &nll);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
fill_nllist(ndx, &nll);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(nl);
|
||||||
|
Syslog('+', "%d entries", entries);
|
||||||
|
|
||||||
|
if (!do_quiet) {
|
||||||
|
printf(" %ld entries\n", entries);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -591,13 +675,13 @@ int compile(char *nlname, unsigned short zo, unsigned short ne, unsigned short n
|
|||||||
*/
|
*/
|
||||||
void tidy_fdlist(fd_list **fdp)
|
void tidy_fdlist(fd_list **fdp)
|
||||||
{
|
{
|
||||||
fd_list *tmp, *old;
|
fd_list *tmp, *old;
|
||||||
|
|
||||||
for (tmp = *fdp; tmp; tmp = old) {
|
for (tmp = *fdp; tmp; tmp = old) {
|
||||||
old = tmp->next;
|
old = tmp->next;
|
||||||
free(tmp);
|
free(tmp);
|
||||||
}
|
}
|
||||||
*fdp = NULL;
|
*fdp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -607,13 +691,13 @@ void tidy_fdlist(fd_list **fdp)
|
|||||||
*/
|
*/
|
||||||
void fill_fdlist(fd_list **fdp, char *filename, time_t filedate)
|
void fill_fdlist(fd_list **fdp, char *filename, time_t filedate)
|
||||||
{
|
{
|
||||||
fd_list *tmp;
|
fd_list *tmp;
|
||||||
|
|
||||||
tmp = (fd_list *)malloc(sizeof(fd_list));
|
tmp = (fd_list *)malloc(sizeof(fd_list));
|
||||||
tmp->next = *fdp;
|
tmp->next = *fdp;
|
||||||
sprintf(tmp->fname, "%s", filename);
|
sprintf(tmp->fname, "%s", filename);
|
||||||
tmp->fdate = filedate;
|
tmp->fdate = filedate;
|
||||||
*fdp = tmp;
|
*fdp = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -766,124 +850,188 @@ 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;
|
char *im, *fm, *um, *old, *new, *p, buf[256];
|
||||||
struct _nlfil fdx;
|
struct _nlfil fdx;
|
||||||
FILE *fp;
|
FILE *fp, *dbf;
|
||||||
nl_list *tmp;
|
nl_list *tmp;
|
||||||
|
|
||||||
memset(&fdx, 0, sizeof(fdx));
|
memset(&fdx, 0, sizeof(fdx));
|
||||||
im = xstrcpy(fullpath((char *)"temp.index"));
|
im = xstrcpy(fullpath((char *)"temp.index"));
|
||||||
fm = xstrcpy(fullpath((char *)"temp.files"));
|
fm = xstrcpy(fullpath((char *)"temp.files"));
|
||||||
um = xstrcpy(fullpath((char *)"temp.users"));
|
um = xstrcpy(fullpath((char *)"temp.users"));
|
||||||
|
|
||||||
if ((ifp = fopen(im, "w+")) == NULL) {
|
|
||||||
WriteError("$Can't create %s",MBSE_SS(im));
|
|
||||||
return 101;
|
|
||||||
}
|
|
||||||
if ((ufp = fopen(um, "w+")) == NULL) {
|
|
||||||
WriteError("$Can't create %s", MBSE_SS(um));
|
|
||||||
fclose(ifp);
|
|
||||||
unlink(im);
|
|
||||||
return 101;
|
|
||||||
}
|
|
||||||
if ((ffp = fopen(fm, "w+")) == NULL) {
|
|
||||||
WriteError("$Can't create %s", MBSE_SS(fm));
|
|
||||||
fclose(ifp);
|
|
||||||
unlink(im);
|
|
||||||
fclose(ufp);
|
|
||||||
unlink(um);
|
|
||||||
return 101;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!do_quiet) {
|
|
||||||
colour(3, 0);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((fp = fopen(fidonet_fil, "r")) == 0)
|
|
||||||
rc = 102;
|
|
||||||
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);
|
|
||||||
if (rc)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (rc)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if ((ifp = fopen(im, "w+")) == NULL) {
|
||||||
|
WriteError("$Can't create %s",MBSE_SS(im));
|
||||||
|
return MBERR_GENERAL;
|
||||||
|
}
|
||||||
|
if ((ufp = fopen(um, "w+")) == NULL) {
|
||||||
|
WriteError("$Can't create %s", MBSE_SS(um));
|
||||||
|
fclose(ifp);
|
||||||
|
unlink(im);
|
||||||
|
return MBERR_GENERAL;
|
||||||
|
}
|
||||||
|
if ((ffp = fopen(fm, "w+")) == NULL) {
|
||||||
|
WriteError("$Can't create %s", MBSE_SS(fm));
|
||||||
|
fclose(ifp);
|
||||||
|
unlink(im);
|
||||||
fclose(ufp);
|
fclose(ufp);
|
||||||
|
unlink(um);
|
||||||
|
return MBERR_GENERAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!do_quiet) {
|
||||||
|
colour(CYAN, BLACK);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
nl_isdn = NULL;
|
||||||
|
nl_tcpip = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read and parse ~/etc/nodelist.conf
|
||||||
|
*/
|
||||||
|
nlpath = calloc(PATH_MAX, sizeof(char));
|
||||||
|
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);
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
if (rc == 0) {
|
*p-- = '\0';
|
||||||
IsDoing("Sorting nodes");
|
while ((p >= buf) && isspace(*p))
|
||||||
sort_nllist(&nll);
|
*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++;
|
||||||
|
|
||||||
IsDoing("Writing files");
|
if ((*k == '\0') || (*k == '#')) {
|
||||||
for (tmp = nll; tmp; tmp = tmp->next)
|
continue;
|
||||||
fwrite(&tmp->idx, sizeof(struct _nlidx), 1, ifp);
|
}
|
||||||
fclose(ifp);
|
for (i = 0; keytab[i].key; i++)
|
||||||
|
if (strcasecmp(k,keytab[i].key) == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
Syslog('+', "Compiled %d entries", total);
|
// if (keytab[i].key != NULL) {
|
||||||
|
// WriteError("%s(%d): %s %s - unknown keyword", nlpath, linecnt, MBSE_SS(k), MBSE_SS(v));
|
||||||
/*
|
// rc = MBERR_GENERAL;
|
||||||
* Rename existing files to old.*, they stay on disk in
|
// break;
|
||||||
* case they are open by some program. The temp.* files
|
// } else
|
||||||
* are then renamed to node.*
|
if ((keytab[i].prc(keytab[i].dest))) {
|
||||||
*/
|
rc = MBERR_GENERAL;
|
||||||
old = xstrcpy(fullpath((char *)"old.index"));
|
break;
|
||||||
new = xstrcpy(fullpath((char *)"node.index"));
|
}
|
||||||
unlink(old);
|
|
||||||
rename(new, old);
|
|
||||||
rename(im, new);
|
|
||||||
free(old);
|
|
||||||
free(new);
|
|
||||||
old = xstrcpy(fullpath((char *)"old.users"));
|
|
||||||
new = xstrcpy(fullpath((char *)"node.users"));
|
|
||||||
unlink(old);
|
|
||||||
rename(new, old);
|
|
||||||
rename(um, new);
|
|
||||||
free(old);
|
|
||||||
free(new);
|
|
||||||
old = xstrcpy(fullpath((char *)"old.files"));
|
|
||||||
new = xstrcpy(fullpath((char *)"node.files"));
|
|
||||||
unlink(old);
|
|
||||||
rename(new, old);
|
|
||||||
rename(fm, new);
|
|
||||||
free(old);
|
|
||||||
free(new);
|
|
||||||
} else {
|
|
||||||
fclose(ifp);
|
|
||||||
Syslog('+', "Compile failed, rc=%d", rc);
|
|
||||||
unlink(im);
|
|
||||||
unlink(fm);
|
|
||||||
unlink(um);
|
|
||||||
}
|
}
|
||||||
|
fclose(dbf);
|
||||||
|
}
|
||||||
|
free(nlpath);
|
||||||
|
|
||||||
free(im);
|
if (rc == 0) {
|
||||||
free(fm);
|
if ((fp = fopen(fidonet_fil, "r")) == 0)
|
||||||
free(um);
|
rc = MBERR_GENERAL;
|
||||||
tidy_nllist(&nll);
|
else {
|
||||||
|
fread(&fidonethdr, sizeof(fidonethdr), 1, fp);
|
||||||
|
|
||||||
return rc;
|
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);
|
||||||
|
if (rc)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rc)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(ufp);
|
||||||
|
fclose(ffp);
|
||||||
|
|
||||||
|
if (rc == 0) {
|
||||||
|
IsDoing("Sorting nodes");
|
||||||
|
sort_nllist(&nll);
|
||||||
|
|
||||||
|
IsDoing("Writing files");
|
||||||
|
for (tmp = nll; tmp; tmp = tmp->next)
|
||||||
|
fwrite(&tmp->idx, sizeof(struct _nlidx), 1, ifp);
|
||||||
|
fclose(ifp);
|
||||||
|
|
||||||
|
Syslog('+', "Compiled %d entries", total);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Rename existing files to old.*, they stay on disk in
|
||||||
|
* case they are open by some program. The temp.* files
|
||||||
|
* are then renamed to node.*
|
||||||
|
*/
|
||||||
|
old = xstrcpy(fullpath((char *)"old.index"));
|
||||||
|
new = xstrcpy(fullpath((char *)"node.index"));
|
||||||
|
unlink(old);
|
||||||
|
rename(new, old);
|
||||||
|
rename(im, new);
|
||||||
|
free(old);
|
||||||
|
free(new);
|
||||||
|
old = xstrcpy(fullpath((char *)"old.users"));
|
||||||
|
new = xstrcpy(fullpath((char *)"node.users"));
|
||||||
|
unlink(old);
|
||||||
|
rename(new, old);
|
||||||
|
rename(um, new);
|
||||||
|
free(old);
|
||||||
|
free(new);
|
||||||
|
old = xstrcpy(fullpath((char *)"old.files"));
|
||||||
|
new = xstrcpy(fullpath((char *)"node.files"));
|
||||||
|
unlink(old);
|
||||||
|
rename(new, old);
|
||||||
|
rename(fm, new);
|
||||||
|
free(old);
|
||||||
|
free(new);
|
||||||
|
} else {
|
||||||
|
fclose(ifp);
|
||||||
|
Syslog('+', "Compile failed, rc=%d", rc);
|
||||||
|
unlink(im);
|
||||||
|
unlink(fm);
|
||||||
|
unlink(um);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(im);
|
||||||
|
free(fm);
|
||||||
|
free(um);
|
||||||
|
tidy_nllist(&nll);
|
||||||
|
tidy_nl_modem(&nl_isdn);
|
||||||
|
tidy_nl_modem(&nl_tcpip);
|
||||||
|
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,14 +1,27 @@
|
|||||||
#ifndef _MBINDEX_H
|
#ifndef _MBINDEX_H
|
||||||
#define _MBINDEX_H
|
#define _MBINDEX_H
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
typedef struct _fd_list {
|
typedef struct _fd_list {
|
||||||
struct _fd_list *next;
|
struct _fd_list *next;
|
||||||
char fname[65];
|
char fname[65];
|
||||||
time_t fdate;
|
time_t fdate;
|
||||||
} 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