From 62f10ff4075c07af64d35390374c95aa1c1ffee0 Mon Sep 17 00:00:00 2001 From: Michiel Broek Date: Thu, 14 Feb 2002 21:24:27 +0000 Subject: [PATCH] Fixed filemgr tick=on crash, added auto echomail area create --- ChangeLog | 6 ++ lib/dbnode.c | 17 ++++++ lib/dbnode.h | 3 + lib/noderecord.c | 1 + mbfido/Makefile | 6 +- mbfido/createm.c | 128 ++++++++++++++++++++++++++++++++++++++++ mbfido/createm.h | 1 + mbfido/filemgr.c | 26 +++----- mbfido/mbfido.c | 4 -- mbfido/postnetmail.c | 2 +- mbfido/tosspkt.c | 137 +++++-------------------------------------- 11 files changed, 185 insertions(+), 146 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2dab7c5e..37d1ee5a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4604,6 +4604,12 @@ v0.33.20 10-Feb-2002 mbfido: In AreaMgr and FileMgr changed aka matching for area connections. Code cleanups. + In FileMgr when %tick=on/off command was received, mbfido + crashed. + Implemented auto area create comparing a new received echo + from a uplink which has a echomail taglist in one of the + mailgroups defined. The area is created with the defaults + from the mailgroup. mball: Will not crash anymore when it needs more then 10 minutes to diff --git a/lib/dbnode.c b/lib/dbnode.c index 476a89a6..3e7ad031 100644 --- a/lib/dbnode.c +++ b/lib/dbnode.c @@ -30,6 +30,7 @@ #include "libs.h" #include "structs.h" +#include "common.h" #include "users.h" #include "records.h" #include "clcomm.h" @@ -81,6 +82,22 @@ int TestNode(fidoaddr aka) } +int SearchNodeFaddr(faddr *n) +{ + fidoaddr Sys; + + memset(&Sys, 0, sizeof(Sys)); + Sys.zone = n->zone; + Sys.net = n->net; + Sys.node = n->node; + Sys.point = n->point; + if (n->domain != NULL) + strncpy(Sys.domain, n->domain, 12); + + return SearchNode(Sys); +} + + int SearchNode(fidoaddr aka) { diff --git a/lib/dbnode.h b/lib/dbnode.h index f49810fb..c755e616 100644 --- a/lib/dbnode.h +++ b/lib/dbnode.h @@ -1,3 +1,5 @@ +/* $Id$ */ + #ifndef _DBNODE_H #define _DBNODE_H @@ -8,6 +10,7 @@ int nodes_cnt; /* Node records in database */ int InitNode(void); /* Initialize nodes database */ int TestNode(fidoaddr); /* Check if noderecord is loaded */ +int SearchNodeFaddr(faddr *); /* Search specified node and load */ int SearchNode(fidoaddr); /* Search specified node and load */ int UpdateNode(void); /* Update record if changed. */ char *GetNodeMailGrp(int); /* Get nodes mailgroup record */ diff --git a/lib/noderecord.c b/lib/noderecord.c index 97830738..5f3e3380 100644 --- a/lib/noderecord.c +++ b/lib/noderecord.c @@ -30,6 +30,7 @@ #include "libs.h" #include "structs.h" +#include "common.h" #include "users.h" #include "records.h" #include "dbnode.h" diff --git a/mbfido/Makefile b/mbfido/Makefile index 06348b14..04e6952b 100644 --- a/mbfido/Makefile +++ b/mbfido/Makefile @@ -189,7 +189,7 @@ mbseq.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/c notify.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/msg.h ../lib/msgtext.h ../lib/dbnode.h filemgr.h areamgr.h sendmail.h notify.h postnetmail.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/dbcfg.h ../lib/dbuser.h ../lib/dbnode.h ../lib/dbftn.h ../lib/common.h ../lib/clcomm.h tracker.h addpkt.h storenet.h ftn2rfc.h areamgr.h filemgr.h ping.h bounce.h postemail.h scannews.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/mbinet.h ../lib/dbdupe.h ../lib/dbnode.h ../lib/dbmsgs.h ../lib/msg.h ../lib/msgtext.h mkftnhdr.h hash.h rollover.h pack.h storeecho.h rfc2ftn.h scannews.h -tosspkt.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/msg.h ../lib/msgtext.h ../lib/dbcfg.h ../lib/dbnode.h ../lib/dbmsgs.h ../lib/dbdupe.h ../lib/dbuser.h ../lib/dbftn.h tosspkt.h postnetmail.h postecho.h rollover.h +tosspkt.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/msg.h ../lib/msgtext.h ../lib/dbcfg.h ../lib/dbnode.h ../lib/dbmsgs.h ../lib/dbdupe.h ../lib/dbuser.h ../lib/dbftn.h tosspkt.h postnetmail.h postecho.h rollover.h createm.h mbfkill.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbcfg.h mbfkill.h mbfutil.h mbfutil.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbcfg.h mbfutil.h mbfile.h mbfindex.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbcfg.h mbfutil.h mbfindex.h @@ -202,5 +202,7 @@ virscan.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib mbftoberep.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbcfg.h mbfutil.h mbftoberep.h mbfmove.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbcfg.h mbfutil.h mbfmove.h mbfdel.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbcfg.h mbfutil.h mbfmove.h -bounce.o: +bounce.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/msg.h ../lib/msgtext.h ../lib/dbcfg.h ../lib/dbnode.h ../lib/dbtic.h ../lib/dbdupe.h ../lib/dbuser.h ../lib/dbftn.h sendmail.h mgrutil.h postnetmail.h ping.h +createm.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h createm.h +createf.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h createm.h # End of generated dependencies diff --git a/mbfido/createm.c b/mbfido/createm.c index 6223feb2..89ce7eea 100644 --- a/mbfido/createm.c +++ b/mbfido/createm.c @@ -36,3 +36,131 @@ #include "../lib/clcomm.h" #include "createm.h" + +#define MCHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + + +int create_msgarea(char *marea, faddr *p_from) +{ + char *temp, *buf, *tag, *desc, *p; + FILE *gp, *ap, *mp; + long offset; + int i; + sysconnect System; + + temp = calloc(PATH_MAX, sizeof(char)); + sprintf(temp, "%s/etc/mgroups.data", getenv("MBSE_ROOT")); + if ((gp = fopen(temp, "r")) == NULL) { + WriteError("$Can't open %s", temp); + free(temp); + return FALSE; + } + fread(&mgrouphdr, sizeof(mgrouphdr), 1, gp); + + fseek(gp, mgrouphdr.hdrsize, SEEK_SET); + while ((fread(&mgroup, mgrouphdr.recsize, 1, gp)) == 1) { + if ((mgroup.UpLink.zone == p_from->zone) && (mgroup.UpLink.net == p_from->net) && + (mgroup.UpLink.node == p_from->node) && (mgroup.UpLink.point == p_from->point) && + strlen(mgroup.AreaFile)) { + Syslog('m', "Checking echogroup %s %s", mgroup.Name, mgroup.Comment); + sprintf(temp, "%s/%s", CFG.alists_path , mgroup.AreaFile); + if ((ap = fopen(temp, "r")) == NULL) { + WriteError("$Can't open %s", temp); + free(temp); + fclose(gp); + return FALSE; + } else { + buf = calloc(4097, sizeof(char)); + while (fgets(buf, 4096, ap)) { + tag = strtok(buf, "\t \r\n\0"); + p = strtok(NULL, "\r\n\0"); + desc = p; + while ((*desc == ' ') || (*desc == '\t')) + desc++; + if (strcmp(tag, marea) == 0) { + Syslog('m', "Found tag \"%s\" desc \"%s\"", tag, desc); + sprintf(temp, "%s/etc/mareas.data", getenv("MBSE_ROOT")); + if ((mp = fopen(temp, "r+")) == NULL) { + WriteError("$Can't open %s", temp); + fclose(ap); + fclose(gp); + free(buf); + free(temp); + return FALSE; + } + fread(&msgshdr, sizeof(msgshdr), 1, mp); + offset = msgshdr.hdrsize + ((mgroup.StartArea -1) * (msgshdr.recsize + msgshdr.syssize)); + if (fseek(mp, offset, SEEK_SET) == -1) { + WriteError("$Can't seek in %s", temp); + fclose(ap); + fclose(gp); + fclose(mp); + free(buf); + free(temp); + return FALSE; + } + while (fread(&msgs, sizeof(msgs), 1, mp) == 1) { + if (!msgs.Active) { + fseek(mp, - msgshdr.recsize, SEEK_CUR); + memset(&msgs, 0, sizeof(msgs)); + offset = ((ftell(mp) - msgshdr.hdrsize) / (msgshdr.recsize + msgshdr.syssize)) + 1; + Syslog('m', "Found free slot at %ld", offset); + strncpy(msgs.Tag, tag, 50); + strncpy(msgs.Name, desc, 40); + strncpy(msgs.QWKname, tag, 20); + msgs.MsgKinds = PUBLIC; + msgs.Type = ECHOMAIL; + msgs.DaysOld = CFG.defdays; + msgs.MaxMsgs = CFG.defmsgs; + msgs.UsrDelete = mgroup.UsrDelete; + msgs.RDSec = mgroup.RDSec; + msgs.WRSec = mgroup.WRSec; + msgs.SYSec = mgroup.SYSec; + strncpy(msgs.Group, mgroup.Name, 12); + msgs.Aka = mgroup.UseAka; + strncpy(msgs.Origin, CFG.origin, 50); + msgs.Aliases = mgroup.Aliases; + msgs.NetReply = mgroup.NetReply; + msgs.Active = TRUE; + msgs.Quotes = mgroup.Quotes; + msgs.Rfccode = CHRS_DEFAULT_RFC; + msgs.Ftncode = CHRS_DEFAULT_FTN; + msgs.MaxArticles = CFG.maxarticles; + tag = tl(tag); + sprintf(msgs.Base, "%s/%s", mgroup.BasePath, tag); + fwrite(&msgs, sizeof(msgs), 1, mp); + + memset(&System, 0, sizeof(System)); + System.aka = mgroup.UpLink; + System.sendto = System.receivefrom = TRUE; + fwrite(&System, sizeof(System), 1, mp); + memset(&System, 0, sizeof(System)); + for (i = 1; i < (msgshdr.syssize / sizeof(System)); i++) + fwrite(&System, sizeof(System), 1, mp); + + fclose(mp); + fclose(gp); + fclose(ap); + free(buf); + free(temp); + return TRUE; + } + /* + * Skip systems + */ + fseek(mp, msgshdr.syssize, SEEK_CUR); + } + /* + * No free slot at the end, append a slot. + */ + } + } + free(buf); + fclose(ap); + } + } + } + fclose(gp); + return FALSE; +} + diff --git a/mbfido/createm.h b/mbfido/createm.h index b2a736fe..8d996713 100644 --- a/mbfido/createm.h +++ b/mbfido/createm.h @@ -4,6 +4,7 @@ #define _CREATEM_H +int create_msgarea(char *, faddr *); #endif diff --git a/mbfido/filemgr.c b/mbfido/filemgr.c index 5bb7dcb2..6c4050f2 100644 --- a/mbfido/filemgr.c +++ b/mbfido/filemgr.c @@ -756,8 +756,6 @@ void F_Pause(faddr *t, int Pause, FILE *tmp) void F_Message(faddr *t, char *Buf, FILE *tmp) { - fidoaddr Node; - ShiftBuf(Buf, 8); CleanBuf(Buf); @@ -769,8 +767,7 @@ void F_Message(faddr *t, char *Buf, FILE *tmp) return; UpdateNode(); - memcpy(&Node, faddr2fido(t), sizeof(fidoaddr)); - SearchNode(Node); + SearchNodeFaddr(t); Syslog('+', "FileMgr: Message %s", GetBool(nodes.Message)); fprintf(tmp, "FileMgr Message file is %s\n", GetBool(nodes.Message)); } @@ -779,11 +776,9 @@ void F_Message(faddr *t, char *Buf, FILE *tmp) void F_Tick(faddr *t, char *Buf, FILE *tmp) { - fidoaddr Node; - ShiftBuf(Buf, 5); CleanBuf(Buf); - + if (!strncasecmp(Buf, "on", 2)) { nodes.Tic = TRUE; nodes.AdvTic = FALSE; @@ -795,16 +790,15 @@ void F_Tick(faddr *t, char *Buf, FILE *tmp) return; UpdateNode(); - memcpy(&Node, faddr2fido(t), sizeof(fidoaddr)); - SearchNode(Node); - Syslog('+', "FileMgr: Tick %s, Advanced %s", nodes.Tic, nodes.AdvTic); + SearchNodeFaddr(t); + Syslog('+', "FileMgr: Tick %s, Advanced %s", GetBool(nodes.Tic), GetBool(nodes.AdvTic)); if (nodes.Tic) if (nodes.AdvTic) - fprintf(tmp, "Tick mode is advanced"); + fprintf(tmp, "Tick mode is advanced\n"); else - fprintf(tmp, "Tick mode is normal"); + fprintf(tmp, "Tick mode is normal\n"); else - fprintf(tmp, "Tick mode is off"); + fprintf(tmp, "Tick mode is off\n"); } @@ -814,7 +808,6 @@ int FileMgr(faddr *f, faddr *t, char *replyid, char *subj, time_t mdate, int fla int i, rc = 0, spaces; char *Buf; FILE *tmp, *np; - fidoaddr Node; f_help = f_stat = f_unlnk = f_list = f_query = FALSE; filemgr++; @@ -837,7 +830,7 @@ int FileMgr(faddr *f, faddr *t, char *replyid, char *subj, time_t mdate, int fla net_bad++; return FALSE; } - + Buf = calloc(2049, sizeof(char)); rewind(fp); @@ -846,8 +839,7 @@ int FileMgr(faddr *f, faddr *t, char *replyid, char *subj, time_t mdate, int fla /* * Make sure we refresh the nodes record. */ - memcpy(&Node, faddr2fido(f), sizeof(fidoaddr)); - SearchNode(Node); + SearchNodeFaddr(f); spaces = 0; for (i = 0; i < strlen(Buf); i++) { diff --git a/mbfido/mbfido.c b/mbfido/mbfido.c index c765c74c..88d634bc 100644 --- a/mbfido/mbfido.c +++ b/mbfido/mbfido.c @@ -83,7 +83,6 @@ int do_unsec = FALSE; /* Unsecure tossing */ int do_learn = FALSE; /* News articles learnmode */ int check_crc = TRUE; /* Check .tic crc values */ int check_dupe = TRUE; /* Check duplicates */ -int autocrea = FALSE; /* Autocreate new msg areas */ extern int do_quiet; /* Quiet flag */ extern int e_pid; /* Pid of child process */ extern int show_log; /* Show logging on screen */ @@ -131,7 +130,6 @@ void Help(void) colour(9, 0); printf(" Options are:\n\n"); colour(3, 0); - printf(" -a -auto Autocreate new msg areas\n"); printf(" -f -full Full Mailscan\n"); printf(" -l -learn Learn News dupes\n"); printf(" -noc -nocrc Skip CRC checking\n"); @@ -369,8 +367,6 @@ int main(int argc, char **argv) do_mail = TRUE; else if (strncmp(tl(argv[i]), "w", 1) == 0) do_stat = TRUE; - else if (strncmp(tl(argv[i]), "-a", 2) == 0) - autocrea = TRUE; else if (strncmp(tl(argv[i]), "-f", 2) == 0) do_full = TRUE; else if (strncmp(tl(argv[i]), "-l", 2) == 0) diff --git a/mbfido/postnetmail.c b/mbfido/postnetmail.c index 40d8967d..5d3c4a0f 100644 --- a/mbfido/postnetmail.c +++ b/mbfido/postnetmail.c @@ -31,12 +31,12 @@ #include "../lib/libs.h" #include "../lib/structs.h" #include "../lib/users.h" +#include "../lib/common.h" #include "../lib/records.h" #include "../lib/dbcfg.h" #include "../lib/dbuser.h" #include "../lib/dbnode.h" #include "../lib/dbftn.h" -#include "../lib/common.h" #include "../lib/clcomm.h" #include "tracker.h" #include "addpkt.h" diff --git a/mbfido/tosspkt.c b/mbfido/tosspkt.c index 0742da38..a3cd2191 100644 --- a/mbfido/tosspkt.c +++ b/mbfido/tosspkt.c @@ -46,6 +46,7 @@ #include "postnetmail.h" #include "postecho.h" #include "rollover.h" +#include "createm.h" @@ -55,7 +56,6 @@ extern int do_quiet; extern int do_unsec; extern int check_dupe; -extern int autocrea; extern time_t t_start; extern int most_debug; @@ -92,7 +92,6 @@ static int at_zero = 0; */ char *aread(char *, int, FILE *); int importmsg(faddr *, faddr *, faddr *, char *, char *, time_t, int, int, FILE *); -void autocreate(char *, faddr *); @@ -206,26 +205,25 @@ int importmsg(faddr *p_from, faddr *f, faddr *t, char *orig, char *subj, } if (!SearchMsgs(marea)) { - WriteError("Unknown echo area %s", marea); - if (autocrea) { - autocreate(marea, p_from); - if (!SearchMsgs(marea)) { - WriteError("Autocreate of area %s failed.", area); - echo_bad++; - echo_in++; - bad = TRUE; - free(marea); - free(buf); - return 4; - } - } else { + Syslog('m', "Unknown echo area %s", marea); + if (!create_msgarea(marea, p_from)) { + WriteError("Create echomail area %s failed", marea); + echo_bad++; + echo_in++; + bad = TRUE; + free(marea); + free(buf); + return 4; + } + if (!SearchMsgs(marea)) { + WriteError("Unknown echo area %s", marea); echo_bad++; echo_in++; bad = TRUE; - free(buf); free(marea); + free(buf); return 4; - } + } } echomail = TRUE; free(marea); @@ -246,111 +244,6 @@ int importmsg(faddr *p_from, faddr *f, faddr *t, char *orig, char *subj, -/* - * Create echomail area if it doesn't excist and allowed. - * Contributed by Redy Rodriguez. - */ -void autocreate(char *marea, faddr *p_from) -{ - FILE *pMsgs; - char temp[250]; - int i; - struct _sysconnect syscon; - - if (!SearchMsgs((char *)"DEFAULT")){ - WriteError("Can't find DEFAULT area, can't autocreate:"); - autocrea = FALSE; - return; - } - sprintf(temp, "%s/etc/mareas.data", getenv("MBSE_ROOT")); - if ((pMsgs = fopen(temp, "r+")) == NULL) { - WriteError("$Database error: Can't create %s", temp); - return; - } - strncat(msgs.Name,marea,40-strlen(msgs.Name)); - strncpy(msgs.Tag,marea,50); - strncpy(msgs.QWKname,marea,20); - strncat(msgs.Base,marea,64-strlen(msgs.Base)); - fseek(pMsgs, 0, SEEK_END); - Syslog('+', "Autocreate area %s", marea); - - memset(&syscon, 0, sizeof(syscon)); - syscon.aka.zone = p_from->zone; - syscon.aka.node = p_from->node; - syscon.aka.net = p_from->net; - if (SearchFidonet(p_from->zone)) - strcpy(syscon.aka.domain,fidonet.domain); - else { - WriteError("New area %s from node of unknown zone %d not created.", marea,p_from->zone); - fclose(pMsgs); - return; - } - syscon.sendto = TRUE; - syscon.receivefrom = TRUE; - if (msgs.Aka.zone == 0) { - for (i = 0; i < 40; i++) { - if (CFG.akavalid[i]) { - msgs.Aka.zone=CFG.aka[i].zone; - msgs.Aka.net=CFG.aka[i].net; - msgs.Aka.node=CFG.aka[i].node; - msgs.Aka.point=CFG.aka[i].point; - strcpy(msgs.Aka.domain,CFG.aka[i].domain); - i=40; - } - } - for (i = 0; i < 40; i++) { - if (CFG.akavalid[i] && (strcmp(CFG.aka[i].domain,msgs.Aka.domain)==0)) { - msgs.Aka.zone=CFG.aka[i].zone; - msgs.Aka.net=CFG.aka[i].net; - msgs.Aka.node=CFG.aka[i].node; - msgs.Aka.point=CFG.aka[i].point; - strcpy(msgs.Aka.domain,CFG.aka[i].domain); - i=40; - } - } - for (i = 0; i < 40; i++) { - if ((CFG.akavalid[i]) && (CFG.aka[i].zone == p_from->zone)) { - msgs.Aka.zone=CFG.aka[i].zone; - msgs.Aka.net=CFG.aka[i].net; - msgs.Aka.node=CFG.aka[i].node; - msgs.Aka.point=CFG.aka[i].point; - strcpy(msgs.Aka.domain,CFG.aka[i].domain); - i=40; - } - } - for (i = 0; i < 40; i++) { - if ((CFG.akavalid[i]) && (CFG.aka[i].zone == p_from->zone) && (CFG.aka[i].net == p_from->net)) { - msgs.Aka.zone=CFG.aka[i].zone; - msgs.Aka.net=CFG.aka[i].net; - msgs.Aka.node=CFG.aka[i].node; - msgs.Aka.point=CFG.aka[i].point; - strcpy(msgs.Aka.domain,CFG.aka[i].domain); - i=40; - } - } - for (i = 0; i < 40; i++) { - if ((CFG.akavalid[i]) && (CFG.aka[i].zone == p_from->zone) && - (CFG.aka[i].net == p_from->net) && (CFG.aka[i].node == p_from->node)) { - msgs.Aka.zone=CFG.aka[i].zone; - msgs.Aka.net=CFG.aka[i].net; - msgs.Aka.node=CFG.aka[i].node; - msgs.Aka.point=CFG.aka[i].point; - strcpy(msgs.Aka.domain,CFG.aka[i].domain); - i=40; - } - } - } - fwrite(&msgs, msgshdr.recsize, 1, pMsgs); - fwrite(&syscon, sizeof(syscon), 1, pMsgs); - memset(&syscon, 0, sizeof(syscon)); - for (i = 1 ; i < CFG.toss_systems; i++ ) - fwrite(&syscon, sizeof(syscon), 1, pMsgs); - fclose(pMsgs); - return; -} - - - /* * Toss one packet. *