*
*/
-
-/* FIXME
-
-there's stuff in here that makes the assumption that /tmp is on the same
-filesystem as Citadel, and makes calls to link() on that basis. fix this.
-
-*/
-
#include "sysdep.h"
#include <stdlib.h>
#include <unistd.h>
void cmd_gnet(char *argbuf) {
- char filename[256];
- char buf[256];
+ char filename[SIZ];
+ char buf[SIZ];
FILE *fp;
if (CtdlAccessCheck(ac_room_aide)) return;
void cmd_snet(char *argbuf) {
- char tempfilename[256];
- char filename[256];
- char buf[256];
+ char tempfilename[SIZ];
+ char filename[SIZ];
+ char buf[SIZ];
FILE *fp;
if (CtdlAccessCheck(ac_room_aide)) return;
}
fclose(fp);
- /* Now that we've got the whole file, put it in place */
+ /* Now copy the temp file to its permanent location
+ * (We use /bin/mv instead of link() because they may be on
+ * different filesystems)
+ */
unlink(filename);
- link(tempfilename, filename);
- unlink(tempfilename);
+ snprintf(buf, sizeof buf, "/bin/mv %s %s", tempfilename, filename);
+ system(buf);
}
struct namelist *nptr;
int err;
char *instr = NULL;
+ int instr_len = 0;
struct CtdlMessage *imsg;
sc = (struct SpoolControl *)userdata;
if (err != 0) return;
lprintf(9, "Generating delivery instructions\n");
- instr = mallok(2048); /* FIXME this won't be enough */
+ instr_len = 4096;
+ instr = mallok(instr_len);
sprintf(instr,
"Content-type: %s\n\nmsgid|%ld\nsubmitted|%ld\n"
"bounceto|postmaster@%s\n" ,
imsg->cm_fields['A'] = strdoop("Citadel");
imsg->cm_fields['M'] = instr;
-
- /* FIXME generate delivery instructions for each recipient */
+ /* Generate delivery instructions for each recipient */
for (nptr = sc->listrecps; nptr != NULL; nptr = nptr->next) {
+ if (instr_len - strlen(instr) < SIZ) {
+ instr_len = instr_len * 2;
+ instr = reallok(instr, instr_len);
+ }
sprintf(&instr[strlen(instr)], "remote|%s|0||\n",
nptr->name);
}
- /* FIXME save delivery instructions in spoolout room */
+ /* Save delivery instructions in spoolout room */
CtdlSaveMsg(imsg, "", SMTP_SPOOLOUT_ROOM, MES_LOCAL);
CtdlFreeMessage(imsg);
- /* FIXME update lastseen */
-
+ /* update lastsent */
+ sc->lastsent = msgnum;
}
* Batch up and send all outbound traffic from the current room
*/
void network_spoolout_current_room(void) {
- char filename[256];
- char buf[256];
- char instr[256];
+ char filename[SIZ];
+ char buf[SIZ];
+ char instr[SIZ];
FILE *fp;
struct SpoolControl sc;
/* struct namelist *digestrecps = NULL; */
fclose(fp);
-
/* Do something useful */
- CtdlForEachMessage(MSGS_ALL, 0L, (-63), NULL, NULL, network_spool_msg, &sc);
-
+ CtdlForEachMessage(MSGS_GT, sc.lastsent, (-63), NULL, NULL,
+ network_spool_msg, &sc);
/* Now rewrite the config file */
fp = fopen(filename, "w");
if (fp == NULL) {
- lprintf(1, "ERROR: cannot open %s: %s\n", filename, strerror(errno));
+ lprintf(1, "ERROR: cannot open %s: %s\n",
+ filename, strerror(errno));
}
else {
fprintf(fp, "lastsent|%ld\n", sc.lastsent);