/* Path to the 'uudecode' utility (needed for network file transfers) */
#define UUDECODE "/usr/bin/uudecode"
+/* Files used by the networker */
+#define MAILSYSINFO "./network/mail.sysinfo"
+
/* Uncomment the DEBUG def to see noisy traces */
#define DEBUG 1
extern char bbs_home_directory[];
extern int home_specified;
+GDBM_FILE use_table;
+
#ifndef HAVE_STRERROR
/*
/*
- * we also load the network/mail.sysinfo table into memory, make changes
+ * we also load the mail.sysinfo table into memory, make changes
* as we learn more about the network from incoming messages, and write
* the table back to disk when we're done.
*/
char insys = 0;
char buf[128];
- fp = fopen("network/mail.sysinfo", "r");
+ fp = fopen(MAILSYSINFO, "r");
if (fp == NULL)
return (1);
time_t now;
time(&now);
- newfp = fopen("network/mail.sysinfo", "w");
+ newfp = fopen(MAILSYSINFO, "w");
for (stemp = slist; stemp != NULL; stemp = stemp->next) {
if (!strcasecmp(stemp->s_name, config.c_nodename)) {
time(&stemp->s_lastcontact);
* Load all of the fields of a message, except the actual text, into a
* table in memory (so we know how to process the message).
*/
-void msgfind(char *msgfile, struct minfo *buffer)
+void fpmsgfind(FILE *fp, struct minfo *buffer)
{
int b, e, mtype, aflag;
char bbb[1024];
char userid[1024];
- FILE *fp;
strcpy(userid, "");
- fp = fopen(msgfile, "rb");
- if (fp == NULL) {
- syslog(LOG_ERR, "can't open message file: %s", strerror(errno));
- return;
- }
e = getc(fp);
if (e != 255) {
- syslog(LOG_ERR, "incorrect message format");
+ syslog(LOG_ERR, "Magic number check failed for this message");
goto END;
}
+
+ memset(buffer, 0, sizeof(struct minfo));
mtype = getc(fp);
aflag = getc(fp);
- buffer->I = 0L;
- buffer->R[0] = 0;
- buffer->E[0] = 0;
- buffer->H[0] = 0;
- buffer->S[0] = 0;
- buffer->B[0] = 0;
- buffer->G[0] = 0;
BONFGM: b = getc(fp);
if (b < 0)
strcpy(buffer->G, bbb);
if (b == 'E')
strcpy(buffer->E, bbb);
+ if (b == 'Z')
+ strcpy(buffer->Z, bbb);
goto BONFGM;
-END: fclose(fp);
+END:
/* NOTE: we used to use the following two lines of code to assign
* the timestamp as a message-ID if there was no message-ID already
}
+/*
+ * msgfind() is the same as fpmsgfind() except it accepts a filename
+ * instead of a file handle.
+ */
+void msgfind(char *msgfile, struct minfo *buffer) {
+ FILE *fp;
+
+ fp = fopen(msgfile, "rb");
+ if (fp == NULL) {
+ syslog(LOG_ERR, "can't open %s: %s", msgfile, strerror(errno));
+ return;
+ }
+
+ fpmsgfind(fp, buffer);
+ fclose(fp);
+}
+
+
+
+
/*
* process incoming files in ./network/spoolin
*/
char buf[256];
long msglen;
int bloklen;
- GDBM_FILE use_table;
/* temp file names */
sprintf(tname, tmpnam(NULL));
/* Make sure we're in the right directory */
chdir(bbs_home_directory);
- /* Open the use table */
- use_table = gdbm_open("./data/usetable.gdbm", 512,
- GDBM_WRCREAT, 0600, 0);
- if (use_table == NULL) {
- syslog(LOG_ERR, "could not open use table: %s",
- strerror(errno));
- }
-
-
/* temporary file to contain a log of rejected dups */
duplist = tmpfile();
fclose(message);
/* process the individual mesage */
- minfo.D[0] = 0;
- minfo.C[0] = 0;
- minfo.B[0] = 0;
- minfo.G[0] = 0;
- minfo.R[0] = 0;
msgfind(tname, &minfo);
strncpy(recentmsg.RMnodename, minfo.N, 9);
recentmsg.RMnodename[9] = 0;
/* otherwise process it as a normal message */
else {
-
if (!strcasecmp(minfo.R, "postmaster")) {
strcpy(minfo.R, "");
strcpy(minfo.C, "Aide");
}
fclose(message);
+
}
unlink(tname);
} while (ptr != NULL);
unlink(iname);
- purge_use_table(use_table);
- gdbm_close(use_table);
-
/*
* If dups were rejected, post a message saying so
}
/*
- * implement split horizon algorithm
+ * Implement split horizon algorithm (prevent infinite spooling loops
+ * by refusing to send any node a message which already contains its
+ * nodename in the path).
*/
-int ismsgok(long int mpos, FILE * mmfp, char *sysname)
+int ismsgok(FILE *mmfp, char *sysname)
{
int a;
int ok = 0; /* fail safe - no path, don't send it */
char fbuf[256];
- fseek(mmfp, mpos, 0);
+ fseek(mmfp, 0L, 0);
if (getc(mmfp) != 255)
return (0);
getc(mmfp);
int msgs_spooled = 0;
long msg_len;
int blok_len;
+ static struct minfo minfo;
char buf[256];
char curr_rm[256];
rewind(mmfp);
- if (ismsgok(0L, mmfp, sysname)) {
+ if (ismsgok(mmfp, sysname)) {
++msgs_spooled;
fflush(stdout);
fseek(mmfp, 0L, 0);
putc(a, destfp);
} while (a > 0);
}
+
+ /* Get this message into the use table, so we can reject it
+ * if a misconfigured remote system sends it back to us.
+ */
+ fseek(mmfp, 0L, 0);
+ fpmsgfind(mmfp, &minfo);
+ already_received(use_table, &minfo);
+
}
fclose(mmfp);
}
syslog(LOG_ERR, "cannot load sysinfo");
setup_special_nodes();
- inprocess(); /* first collect incoming stuff */
+ /* Open the use table */
+ use_table = gdbm_open("./data/usetable.gdbm", 512,
+ GDBM_WRCREAT, 0600, 0);
+ if (use_table == NULL) {
+ syslog(LOG_ERR, "could not open use table: %s",
+ strerror(errno));
+ }
+
+ /* first collect incoming stuff */
+ inprocess();
+ /* Now process outbound messages, but NOT if this is just a
+ * quick import-only run (i.e. the -i command-line option
+ * was specified)
+ */
if (import_only != 1) {
allfp = (FILE *) popen("cd ./network/systems; ls", "r");
if (allfp != NULL) {
/* import again in case anything new was generated */
inprocess();
}
+
+ /* Update mail.sysinfo with new information we learned */
rewrite_syslist();
+
+ /* Close the use table */
+ purge_use_table(use_table);
+ gdbm_close(use_table);
+
syslog(LOG_NOTICE, "processing ended.");
cleanup(0);
return 0;