Updates for area create
This commit is contained in:
parent
883534d4a9
commit
d36590738e
@ -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
|
||||
|
133
mbfido/areamgr.c
133
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);
|
||||
|
295
mbfido/createm.c
295
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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -5,6 +5,8 @@
|
||||
|
||||
|
||||
int create_msgarea(char *, faddr *);
|
||||
int CheckEchoGroup(char *, int, faddr *);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user