diff --git a/mbfido/Makefile b/mbfido/Makefile index fce06cc2..f3471efc 100644 --- a/mbfido/Makefile +++ b/mbfido/Makefile @@ -172,7 +172,7 @@ msgutil.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib postecho.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 ftn2rfc.h postecho.h storeecho.h addpkt.h rollover.h rollover.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h rollover.h tic.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/dbftn.h ../lib/clcomm.h ulock.h ptic.h fsort.h pack.h tic.h -areamgr.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 sendmail.h mgrutil.h scan.h areamgr.h +areamgr.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 sendmail.h mgrutil.h scan.h createm.h areamgr.h filefind.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbcfg.h ../lib/msg.h ../lib/msgtext.h fflist.h filefind.h msgutil.h grlist.o: ../lib/libs.h ../lib/clcomm.h grlist.h maketags.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h maketags.h @@ -203,6 +203,6 @@ mbftoberep.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.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: ../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 +createm.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h mgrutil.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/areamgr.c b/mbfido/areamgr.c index d078183e..e638d534 100644 --- a/mbfido/areamgr.c +++ b/mbfido/areamgr.c @@ -45,6 +45,7 @@ #include "sendmail.h" #include "mgrutil.h" #include "scan.h" +#include "createm.h" #include "areamgr.h" @@ -765,12 +766,11 @@ void A_Disconnect(faddr *t, char *Area, FILE *tmp) void A_Connect(faddr *, char *, FILE *); void A_Connect(faddr *t, char *Area, FILE *tmp) { - int i, First, rc = 0; - long offset; - char *Group, *temp, *buf, *desc, *p, *tag; + int i, First; + char *Group, *temp; faddr *b; sysconnect Sys; - FILE *gp, *mp, *ap; + FILE *gp; Syslog('+', "AreaMgr: \"%s\"", printable(Area, 0)); @@ -794,129 +794,10 @@ void A_Connect(faddr *t, char *Area, FILE *tmp) while ((fread(&mgroup, mgrouphdr.recsize, 1, gp)) == 1) { if ((mgroup.UseAka.zone == t->zone) && (mgroup.UseAka.net == t->net) && mgroup.UpLink.zone && strlen(mgroup.AreaFile) && mgroup.Active && mgroup.UserChange) { - 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); - } 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, Area) == 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; - } - fread(&msgshdr, sizeof(msgshdr), 1, mp); - offset = msgshdr.hdrsize + ((mgroup.StartArea -1) * (msgshdr.recsize + msgshdr.syssize)); - if (fseek(mp, offset, SEEK_SET)) { - WriteError("$Can't seek in %s", temp); - fclose(ap); - fclose(gp); - fclose(mp); - free(buf); - free(temp); - return; - } - sprintf(temp, "+%s", Area); - if (UplinkRequest(fido2faddr(mgroup.UpLink), FALSE, temp)) { - WriteError("Can't send netmail to uplink"); - fclose(ap); - fclose(gp); - fclose(mp); - free(buf); - free(temp); - return; - } - while (fread(&msgs, sizeof(msgs), 1, mp) == 1) { - if (!msgs.Active) { - fseek(mp, - msgshdr.recsize, SEEK_CUR); - offset = ((ftell(mp) - msgshdr.hdrsize) / (msgshdr.recsize + msgshdr.syssize)) + 1; - Syslog('m', "Found free slot at %ld", offset); - rc = 1; - break; - } - /* - * Skip systems - */ - fseek(mp, msgshdr.syssize, SEEK_CUR); - } - if (!rc) { - Syslog('m', "No free slot, append after last record"); - fseek(mp, 0, SEEK_END); - if (ftell(mp) < msgshdr.hdrsize + ((mgroup.StartArea -1) * (msgshdr.recsize + msgshdr.syssize))) { - Syslog('m', "Database too small, expanding..."); - memset(&msgs, 0, sizeof(msgs)); - memset(&Sys, 0, sizeof(Sys)); - while (TRUE) { - fwrite(&msgs, sizeof(msgs), 1, mp); - for (i = 0; i < (msgshdr.syssize / sizeof(Sys)); i++) - fwrite(&Sys, sizeof(Sys), 1, mp); - if (ftell(mp) >= msgshdr.hdrsize + ((mgroup.StartArea -1) * (msgshdr.recsize + msgshdr.syssize))) - break; - } - } - rc = 1; - } - offset = ((ftell(mp) - msgshdr.hdrsize) / (msgshdr.recsize + msgshdr.syssize)) + 1; - memset(&msgs, 0, sizeof(msgs)); - 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); - for (i = 0; i < strlen(tag); i++) - if (tag[i] == '.') - tag[i] = '/'; - sprintf(msgs.Base, "%s/%s", mgroup.BasePath, tag); - fwrite(&msgs, sizeof(msgs), 1, mp); - - memset(&Sys, 0, sizeof(Sys)); - Sys.aka = mgroup.UpLink; - Sys.sendto = Sys.receivefrom = TRUE; - fwrite(&Sys, sizeof(Sys), 1, mp); - memset(&Sys, 0, sizeof(Sys)); - for (i = 1; i < (msgshdr.syssize / sizeof(Sys)); i++) - fwrite(&Sys, sizeof(Sys), 1, mp); - Syslog('+', "Created echo %s, group %s, area %ld, for node %s", - msgs.Tag, msgs.Group, offset, ascfnode(t, 0x1f)); - fclose(mp); - rc = 1; - } /* if (strcmp(tag, Area) == 0) */ - } /* while (fgets(buf, 4096, ap)) */ - free(buf); - fclose(ap); - } /* else ((ap = fopen(temp, "r")) == NULL) */ - if (rc) + if (CheckEchoGroup(Area, TRUE, t) == 0) { break; - } /* if possible matching group */ + } + } } fclose(gp); free(temp); diff --git a/mbfido/createm.c b/mbfido/createm.c index 58f84754..f8a73c65 100644 --- a/mbfido/createm.c +++ b/mbfido/createm.c @@ -34,6 +34,7 @@ #include "../lib/records.h" #include "../lib/common.h" #include "../lib/clcomm.h" +#include "mgrutil.h" #include "createm.h" @@ -42,11 +43,8 @@ int create_msgarea(char *marea, faddr *p_from) { - char *temp, *buf, *tag, *desc, *p; - FILE *gp, *ap, *mp; - long offset; - int i, rc = 0; - sysconnect System; + char *temp; + FILE *gp; temp = calloc(PATH_MAX, sizeof(char)); sprintf(temp, "%s/etc/mgroups.data", getenv("MBSE_ROOT")); @@ -56,130 +54,16 @@ int create_msgarea(char *marea, faddr *p_from) return FALSE; } fread(&mgrouphdr, sizeof(mgrouphdr), 1, gp); + free(temp); 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); + if (CheckEchoGroup(marea, FALSE, p_from) == 0) { 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)) { - 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); - offset = ((ftell(mp) - msgshdr.hdrsize) / (msgshdr.recsize + msgshdr.syssize)) + 1; - Syslog('m', "Found free slot at %ld", offset); - rc = 1; - break; - } - /* - * Skip systems - */ - fseek(mp, msgshdr.syssize, SEEK_CUR); - } - if (!rc) { - Syslog('m', "No free slot, append after last record"); - fseek(mp, 0, SEEK_END); - if (ftell(mp) < msgshdr.hdrsize + ((mgroup.StartArea -1) * (msgshdr.recsize + msgshdr.syssize))) { - Syslog('m', "Database too small, expanding..."); - memset(&msgs, 0, sizeof(msgs)); - memset(&System, 0, sizeof(System)); - while (TRUE) { - fwrite(&msgs, sizeof(msgs), 1, mp); - for (i = 0; i < (msgshdr.syssize / sizeof(System)); i++) - fwrite(&System, sizeof(System), 1, mp); - if (ftell(mp) >= msgshdr.hdrsize + ((mgroup.StartArea -1) * (msgshdr.recsize + msgshdr.syssize))) - break; - } - } - rc = 1; - } - - offset = ((ftell(mp) - msgshdr.hdrsize) / (msgshdr.recsize + msgshdr.syssize)) + 1; - memset(&msgs, 0, sizeof(msgs)); - 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); - for (i = 0; i < strlen(tag); i++) - if (tag[i] == '.') - tag[i] = '/'; - 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); - Syslog('+', "Auto created echo %s, group %s, area %ld, for node %s", - msgs.Tag, msgs.Group, offset, ascfnode(p_from, 0x1f)); - return TRUE; - } /* if (strcmp(tag, marea) == 0) */ - } - free(buf); - fclose(ap); + return TRUE; } } } @@ -187,3 +71,170 @@ int create_msgarea(char *marea, faddr *p_from) return FALSE; } + + +/* + * Check echomail group AREAS file if requested area exists. + * If so, create echomail area and if SendUplink is TRUE, + * send the uplink a AreaMgr request to connect this area. + * The echomail group record (mgroup) must be in memory. + * Return codes: + * 0 - All Seems Well + * 1 - Some error + * + * The current nodes record may be destroyed after this! + */ +int CheckEchoGroup(char *Area, int SendUplink, faddr *f) +{ + char *temp, *buf, *tag, *desc, *p; + FILE *ap, *mp; + long offset; + int i, rc = 0; + sysconnect System; + + temp = calloc(PATH_MAX, sizeof(char)); + 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); + return 1; + } + + 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, Area) == 0) { + Syslog('m', "Found tag \"%s\" desc \"%s\"", tag, desc); + + /* + * Area is in AREAS file, now create area. + * If needed, connect at uplink. + */ + if (SendUplink) { + sprintf(temp, "+%s", Area); + if (UplinkRequest(fido2faddr(mgroup.UpLink), FALSE, temp)) { + WriteError("Can't send netmail to uplink"); + fclose(ap); + free(buf); + free(temp); + return 1; + } + } + + sprintf(temp, "%s/etc/mareas.data", getenv("MBSE_ROOT")); + if ((mp = fopen(temp, "r+")) == NULL) { + WriteError("$Can't open %s", temp); + fclose(ap); + free(buf); + free(temp); + return 1; + } + fread(&msgshdr, sizeof(msgshdr), 1, mp); + offset = msgshdr.hdrsize + ((mgroup.StartArea -1) * (msgshdr.recsize + msgshdr.syssize)); + if (fseek(mp, offset, SEEK_SET)) { + WriteError("$Can't seek in %s", temp); + fclose(ap); + fclose(mp); + free(buf); + free(temp); + return 1; + } + + /* + * Search a free record + */ + while (fread(&msgs, sizeof(msgs), 1, mp) == 1) { + if (!msgs.Active) { + fseek(mp, - msgshdr.recsize, SEEK_CUR); + offset = ((ftell(mp) - msgshdr.hdrsize) / (msgshdr.recsize + msgshdr.syssize)) + 1; + Syslog('m', "Found free slot at %ld", offset); + rc = 1; + break; + } + /* + * Skip systems + */ + fseek(mp, msgshdr.syssize, SEEK_CUR); + } + + if (!rc) { + Syslog('m', "No free slot, append after last record"); + fseek(mp, 0, SEEK_END); + if (ftell(mp) < msgshdr.hdrsize + ((mgroup.StartArea -1) * (msgshdr.recsize + msgshdr.syssize))) { + Syslog('m', "Database too small, expanding..."); + memset(&msgs, 0, sizeof(msgs)); + memset(&System, 0, sizeof(System)); + while (TRUE) { + fwrite(&msgs, sizeof(msgs), 1, mp); + for (i = 0; i < (msgshdr.syssize / sizeof(System)); i++) + fwrite(&System, sizeof(System), 1, mp); + if (ftell(mp) >= msgshdr.hdrsize + ((mgroup.StartArea -1) * (msgshdr.recsize + msgshdr.syssize))) + break; + } + } + rc = 1; + } + + /* + * Create the record with the defaults from the group record. + */ + offset = ((ftell(mp) - msgshdr.hdrsize) / (msgshdr.recsize + msgshdr.syssize)) + 1; + memset(&msgs, 0, sizeof(msgs)); + 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); + for (i = 0; i < strlen(tag); i++) + if (tag[i] == '.') + tag[i] = '/'; + 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(ap); + free(buf); + free(temp); + Syslog('+', "Auto created echo %s, group %s, area %ld, for node %s", + msgs.Tag, msgs.Group, offset, ascfnode(f , 0x1f)); + return 0; + } /* if (strcmp(tag, Area) == 0) */ + } /* while (fgets(buf, 4096, ap)) */ + + free(buf); + fclose(ap); + free(temp); + return 1; +} + + diff --git a/mbfido/createm.h b/mbfido/createm.h index 8d996713..92db357d 100644 --- a/mbfido/createm.h +++ b/mbfido/createm.h @@ -5,6 +5,8 @@ int create_msgarea(char *, faddr *); +int CheckEchoGroup(char *, int, faddr *); + #endif