From 14e6739d6869ed53c1a7dc49fa92ce7699bc4fcc Mon Sep 17 00:00:00 2001 From: Michiel Broek Date: Sat, 24 Jul 2004 15:32:30 +0000 Subject: [PATCH] Initial *.msg support works --- ChangeLog | 6 + mbfido/Makefile | 2 +- mbfido/mbfido.c | 2 + mbfido/msg.c | 284 ++++++++++++++++++++++++++++++++++++++++++++++- mbfido/msgutil.c | 17 +-- 5 files changed, 301 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 225b3458..3b926c12 100644 --- a/ChangeLog +++ b/ChangeLog @@ -36,6 +36,7 @@ v0.61.2 11-Jul-2004 removed. With nodes that were marked crash, this will prevent continuous calling. Changed to use direct instead of immediate mail. + Changed binkp IsDoing info. mbfido: Added code to un_attach files during tic import that are @@ -48,6 +49,11 @@ v0.61.2 11-Jul-2004 seems solved. In rfc2ftn added check for ".\n" to change to " .\n" instead of only check for ".\r\n". + Added support for *.msg files. If any are found, they are + processed and put in a netmail area. From there the mbfido scan + function is automatic called so that the message is sent out or + stays in the area if it has a local destination. File attaches + are supported. mbout: Changed to use direct instead of immediate mail. diff --git a/mbfido/Makefile b/mbfido/Makefile index 4beb1912..d60c2da8 100644 --- a/mbfido/Makefile +++ b/mbfido/Makefile @@ -201,5 +201,5 @@ msgflags.o: ../config.h ../lib/mbselib.h msgflags.h dirsession.o: ../config.h ../lib/mbselib.h dirsession.h queue.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/mbsedb.h fsort.h dirsession.h queue.h dirlock.o: ../config.h ../lib/mbselib.h flock.h dirlock.h -msg.o: ../config.h ../lib/mbselib.h msg.h +msg.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/mbsedb.h ../lib/msgtext.h ../lib/msg.h msgflags.h msg.h # End of generated dependencies diff --git a/mbfido/mbfido.c b/mbfido/mbfido.c index 844601de..9bcfea17 100644 --- a/mbfido/mbfido.c +++ b/mbfido/mbfido.c @@ -521,6 +521,8 @@ int main(int argc, char **argv) if (Notify(Options)) { do_flush = TRUE; } + if (do_tic || do_toss) + toss_msgs(); if (do_tic) { if (IsSema((char *)"mailin")) RemoveSema((char *)"mailin"); diff --git a/mbfido/msg.c b/mbfido/msg.c index 26aa2216..32c8db75 100644 --- a/mbfido/msg.c +++ b/mbfido/msg.c @@ -30,10 +30,19 @@ #include "../config.h" #include "../lib/mbselib.h" +#include "../lib/users.h" +#include "../lib/mbsedb.h" +#include "../lib/msgtext.h" +#include "../lib/msg.h" +#include "msgflags.h" #include "msg.h" extern int net_msgs; +extern int do_scan; + + +int toss_onemsg(char *); int toss_msgs(void) @@ -58,8 +67,8 @@ int toss_msgs(void) } Syslog('m', "Process %s", de->d_name); + toss_onemsg(de->d_name); files++; - } } closedir(dp); @@ -73,3 +82,276 @@ int toss_msgs(void) } + +/* + * Toss one message and post into a JAM messagebase. Returns: + * 0 = Ok + * 1 = Can't open *.msg + * 2 = Can't read message + * 3 = Missing zone info + * 4 = No ftn network or netmailboard in setup + * 5 = Can't open JAM area + */ +int toss_onemsg(char *msgname) +{ + int rc = 0; + char *temp, *dospath, *flagstr = NULL, *l, *r, *msgid = NULL; + char fromUserName[36], toUserName[36], subject[72], DateTime[20]; + FILE *fp, *np; + faddr *ta; + unsigned char buf[0xbd]; + unsigned short destNode = 0, destNet = 0, destZone = 0, destPoint = 0; + unsigned short origNode = 0, origNet = 0, origZone = 0, origPoint = 0; + unsigned short Attribute = 0; + struct stat sb; + + temp = calloc(PATH_MAX, sizeof(char)); + sprintf(temp, "%s/%s", CFG.msgs_path, msgname); + + if ((fp = fopen(temp, "r")) == NULL) { + WriteError("$Can't open %s", temp); + free(temp); + return 1; + } + + /* + * First read message header information we need. + */ + memset(&fromUserName, 0, sizeof(fromUserName)); + memset(&toUserName, 0, sizeof(toUserName)); + memset(&subject, 0, sizeof(subject)); + memset(&DateTime, 0, sizeof(DateTime)); + + if (fread(&buf, 1, 0xbe, fp) != 0xbe) { + WriteError("$Could not read header (%s)", temp); + fclose(fp); + free(temp); + return 2; + } + + strncpy(fromUserName, buf, 36); + strncpy(toUserName, buf+0x24, 36); + strncpy(subject, buf+0x48, 72); + strncpy(DateTime, buf+0x90, 20); + + Syslog('m', "\"%s\"", printable(fromUserName, 0)); + Syslog('m', "\"%s\"", printable(toUserName, 0)); + Syslog('m', "\"%s\"", printable(subject, 0)); + Syslog('m', "\"%s\"", printable(DateTime, 0)); + + destNode = (buf[0xa7] << 8) + buf[0xa6]; + origNode = (buf[0xa9] << 8) + buf[0xa8]; + origNet = (buf[0xad] << 8) + buf[0xac]; + destNet = (buf[0xaf] << 8) + buf[0xae]; + destZone = (buf[0xb1] << 8) + buf[0xb0]; + origZone = (buf[0xb3] << 8) + buf[0xb2]; + destPoint = (buf[0xb5] << 8) + buf[0xb4]; + origPoint = (buf[0xb7] << 8) + buf[0xb6]; + Attribute = (buf[0xbb] << 8) + buf[0xba]; + + Syslog('m', "From %d:%d/%d.%d to %d:%d/%d.%d", origZone, origNet, origNode, origPoint, destZone, destNet, destNode, destPoint); + + while (fgets(temp, PATH_MAX-1, fp)) { + Striplf(temp); + if (temp[strlen(temp)-1] == '\r') + temp[strlen(temp)-1] = '\0'; + Syslogp('m', printable(temp, 0)); + if (!strncmp(temp, "\001MSGID: ", 8)) { + msgid = xstrcpy(temp + 8); + /* + * Extra test to see if the mail comes from a pointaddress. + */ + l = strtok(temp," \0"); + l = strtok(NULL," \0"); + if ((ta = parsefnode(l))) { + if (ta->net == origNet && ta->node == origNode && !origPoint && ta->point) { + Syslog('m', "Setting pointinfo (%d) from MSGID", ta->point); + origPoint = ta->point; + } + if ((ta->net == origNet) && (ta->node == origNode) && (origZone == 0) && ta->zone) { + /* + * Missing zone info, maybe later we will see a INTL kludge or so, but for + * now, just in case we fix it. And we need that for some Aka collecting + * sysop who doesn't know how to configure his system right. + */ + Syslog('m', "No from zone set, setting zone %d from MSGID", ta->zone); + origZone = ta->zone; + /* + * 99.9 % chance that the destination zone is also missing. + */ + if (destZone == 0) { + destZone = ta->zone; + Syslog('m', "No dest zone set, setting zone %d from MSGID", ta->zone); + } + } + tidy_faddr(ta); + } + if (msgid) + free(msgid); + msgid = NULL; + } + if (!strncmp(temp, "\001FMPT", 5)) { + l = strtok(temp, " \0"); + l = strtok(NULL, " \0"); + origPoint = atoi(l); + } + if (!strncmp(temp, "\001TOPT", 5)) { + l = strtok(temp, " \0"); + l = strtok(NULL, " \0"); + destPoint = atoi(l); + } + if (!strncmp(temp, "\001INTL", 5)) { + Syslog('m', "Setting addresses from INTL kludge"); + l = strtok(temp," \0"); + l = strtok(NULL," \0"); + r = strtok(NULL," \0"); + if ((ta = parsefnode(l))) { + destPoint = ta->point; + destNode = ta->node; + destNet = ta->net; + destZone = ta->zone; + tidy_faddr(ta); + } + if ((ta = parsefnode(r))) { + origPoint = ta->point; + origNode = ta->node; + origNet = ta->net; + origZone = ta->zone; + tidy_faddr(ta); + } + } + /* + * Check FLAGS kludge + */ + if (!strncmp(buf, "\001FLAGS ", 7)) { + flagstr = xstrcpy(buf + 7); + Syslog('m', "^aFLAGS %s", flagstr); + } + if (!strncmp(buf, "\001FLAGS: ", 8)) { + flagstr = xstrcpy(buf + 8); + Syslog('m', "^aFLAGS: %s", flagstr); + } + } + + Syslog('m', "From %d:%d/%d.%d to %d:%d/%d.%d", origZone, origNet, origNode, origPoint, destZone, destNet, destNode, destPoint); + + if ((origZone == 0) || (destZone == 0)) { + WriteError("No zone info in %s/%s", CFG.msgs_path, msgname); + fclose(fp); + free(temp); + return 3; + } + + if (SearchFidonet(origZone) == FALSE) { + WriteError("Can't find network for zone %d", origZone); + fclose(fp); + free(temp); + return 4; + } + + if (SearchNetBoard(origZone, origNet) == FALSE) { + WriteError("Can't find netmail board for zone:net %d:%d", origZone, origNet); + fclose(fp); + free(temp); + return 4; + } + + if (Msg_Open(msgs.Base) && Msg_Lock(30L)) { + Msg_New(); + strcpy(Msg.From, fromUserName); + strcpy(Msg.To, toUserName); + strcpy(Msg.Subject, subject); + if (Attribute & M_FILE) { + if ((stat(subject, &sb) == 0) && (S_ISREG(sb.st_mode))) { + dospath = xstrcpy(Unix2Dos(subject)); + Syslog('+', "Fileattach %s in message %s", subject, msgname); + if (strlen(CFG.dospath)) + strcpy(Msg.Subject, dospath); + Msg.FileAttach = TRUE; + free(dospath); + } else { + WriteError("Fileattach %s in message %s not found", subject, msgname); + } + } + Msg.Written = parsefdate(DateTime, NULL); + Msg.Arrived = time(NULL) - (gmt_offset((time_t)0) * 60); + Msg.Local = TRUE; + + Msg.KillSent = ((Attribute & M_KILLSENT)); + Msg.Hold = ((Attribute & M_HOLD)); + Msg.Crash = ((Attribute & M_CRASH) || flag_on((char *)"CRA", flagstr)); + Msg.ReceiptRequest = ((Attribute & M_RRQ) || flag_on((char *)"RRQ", flagstr)); + Msg.Orphan = ((Attribute & M_ORPHAN)); + Msg.Intransit = ((Attribute & M_TRANSIT)); + Msg.FileRequest = ((Attribute & M_REQ) || flag_on((char *)"FRQ", flagstr)); + Msg.ConfirmRequest = ((Attribute & M_AUDIT) || flag_on((char *)"CFM", flagstr)); + Msg.Immediate = flag_on((char *)"IMM", flagstr); + Msg.Direct = flag_on((char *)"DIR", flagstr); + Msg.Gate = flag_on((char *)"ZON", flagstr); + + Msg.Private = TRUE; + + if (origPoint) + sprintf(Msg.FromAddress, "%d:%d/%d.%d@%s", origZone, origNet, origNode, origPoint, fidonet.domain); + else + sprintf(Msg.FromAddress, "%d:%d/%d@%s", origZone, origNet, origNode, fidonet.domain); + if (SearchFidonet(destZone)) { + if (destPoint) + sprintf(Msg.ToAddress, "%d:%d/%d.%d@%s", destZone, destNet, destNode, destPoint, fidonet.domain); + else + sprintf(Msg.ToAddress, "%d:%d/%d@%s", destZone, destNet, destNode, fidonet.domain); + } else { + if (destPoint) + sprintf(Msg.ToAddress, "%d:%d/%d.%d", destZone, destNet, destNode, destPoint); + else + sprintf(Msg.ToAddress, "%d:%d/%d", destZone, destNet, destNode); + } + + /* + * Add original message text + */ + fseek(fp, 0xbe, SEEK_SET); + while (fgets(temp, PATH_MAX-1, fp)) { + Striplf(temp); + if (temp[strlen(temp)-1] == '\r') + temp[strlen(temp)-1] = '\0'; + MsgText_Add2(temp); + } + + Msg_AddMsg(); + Msg_UnLock(); + Syslog('+', "%s => %s (%ld) to \"%s\", \"%s\"", msgname, msgs.Name, Msg.Id, Msg.To, Msg.Subject); + + msgs.LastPosted = time(NULL); + msgs.Posted.total++; + msgs.Posted.tweek++; + msgs.Posted.tdow[Diw]++; + msgs.Posted.month[Miy]++; + UpdateMsgs(); + + do_scan = TRUE; + sprintf(temp, "%s/tmp/netmail.jam", getenv("MBSE_ROOT")); + if ((np = fopen(temp, "a")) != NULL) { + fprintf(np, "%s %lu\n", msgs.Base, Msg.Id); + fclose(np); + } + + Msg_Close(); + + } else { + WriteError("Can't open JAM %s", msgs.Base); + rc = 5; + } + + fclose(fp); + + if (rc == 0) { + sprintf(temp, "%s/%s", CFG.msgs_path, msgname); + Syslog('m', "unlink(%s) rc=%d", temp, unlink(temp)); + } + + free(temp); + return rc; +} + + diff --git a/mbfido/msgutil.c b/mbfido/msgutil.c index f37de32d..eaa0535d 100644 --- a/mbfido/msgutil.c +++ b/mbfido/msgutil.c @@ -159,17 +159,18 @@ long Msg_Top(char *template, int language, fidoaddr aka) MacroVars("Y", "s", aka2str(aka)); Msg_Macro(fi); fileptr = ftell(fi); - + + MacroVars("pqrf", "dsss", 0, "", "", ""); + if (strlen(CFG.IP_Flags) && strlen(CFG.IP_Phone)) { + MacroVars("pqrf", "dsds", 2, CFG.IP_Phone, CFG.IP_Speed, CFG.IP_Flags); + fseek(fi, fileptr, SEEK_SET); + Msg_Macro(fi); + hasmodems = TRUE; + } + sprintf(temp, "%s/etc/ttyinfo.data", getenv("MBSE_ROOT")); if ((fp = fopen(temp, "r")) != NULL) { fread(&ttyinfohdr, sizeof(ttyinfohdr), 1, fp); - - MacroVars("pqrf", "dsss", 0, "", "", ""); - if (strlen(CFG.IP_Flags) && strlen(CFG.IP_Phone)) { - MacroVars("pqrf", "dsds", 2, CFG.IP_Phone, CFG.IP_Speed, CFG.IP_Flags); - fseek(fi, fileptr, SEEK_SET); - Msg_Macro(fi); - } while (fread(&ttyinfo, ttyinfohdr.recsize, 1, fp) == 1) { if (((ttyinfo.type == POTS) || (ttyinfo.type == ISDN)) && ttyinfo.available && strlen(ttyinfo.phone)) { MacroVars("pqrf", "dsss", ttyinfo.type, ttyinfo.phone, ttyinfo.speed, ttyinfo.flags);