4 * This module will eventually replace netproc and some of its utilities.
5 * Copyright (C) 2000 by Art Cancro and others.
6 * This code is released under the terms of the GNU General Public License.
13 there's stuff in here that makes the assumption that /tmp is on the same
14 filesystem as Citadel, and makes calls to link() on that basis. fix this.
26 #include <sys/types.h>
34 #include "sysdep_decls.h"
35 #include "citserver.h"
38 #include "dynloader.h"
45 #include "internet_addressing.h"
46 #include "serv_network.h"
49 void cmd_gnet(char *argbuf) {
54 if (CtdlAccessCheck(ac_room_aide)) return;
55 assoc_file_name(filename, &CC->quickroom, "netconfigs");
56 cprintf("%d Network settings for room #%ld <%s>\n",
58 CC->quickroom.QRnumber, CC->quickroom.QRname);
60 fp = fopen(filename, "r");
62 while (fgets(buf, sizeof buf, fp) != NULL) {
63 buf[strlen(buf)-1] = 0;
73 void cmd_snet(char *argbuf) {
74 char tempfilename[256];
79 if (CtdlAccessCheck(ac_room_aide)) return;
80 safestrncpy(tempfilename, tmpnam(NULL), sizeof tempfilename);
81 assoc_file_name(filename, &CC->quickroom, "netconfigs");
83 fp = fopen(tempfilename, "w");
85 cprintf("%d Cannot open %s: %s\n",
91 cprintf("%d %s\n", SEND_LISTING, tempfilename);
92 while (client_gets(buf), strcmp(buf, "000")) {
93 fprintf(fp, "%s\n", buf);
97 /* Now that we've got the whole file, put it in place */
99 link(tempfilename, filename);
100 unlink(tempfilename);
106 * Spools out one message from the list.
108 void network_spool_msg(long msgnum, void *userdata) {
109 struct SpoolControl *sc;
110 struct namelist *nptr;
113 sc = (struct SpoolControl *)userdata;
115 /* If no recipients, bail out now.
116 * (May need to tweak this when we add other types of targets)
118 if (sc->listrecps == NULL) return;
120 /* First, copy it to the spoolout room */
121 err = CtdlSaveMsgPointerInRoom(SMTP_SPOOLOUT_ROOM, msgnum, 0);
122 if (err != 0) return;
124 /* FIXME generate delivery instructions for each recipient */
125 for (nptr = sc->listrecps; nptr != NULL; nptr = nptr->next) {
128 /* FIXME save delivery instructions in spoolout room */
130 /* FIXME update lastseen */
138 * Batch up and send all outbound traffic from the current room
140 void network_spoolout_current_room(void) {
145 struct SpoolControl sc;
146 /* struct namelist *digestrecps = NULL; */
147 struct namelist *nptr;
149 memset(&sc, 0, sizeof(struct SpoolControl));
150 assoc_file_name(filename, &CC->quickroom, "netconfigs");
152 fp = fopen(filename, "r");
154 lprintf(7, "Outbound batch processing skipped for <%s>\n",
155 CC->quickroom.QRname);
159 lprintf(5, "Outbound batch processing started for <%s>\n",
160 CC->quickroom.QRname);
162 while (fgets(buf, sizeof buf, fp) != NULL) {
163 buf[strlen(buf)-1] = 0;
165 extract(instr, buf, 0);
166 if (!strcasecmp(instr, "lastsent")) {
167 sc.lastsent = extract_long(buf, 1);
169 else if (!strcasecmp(instr, "listrecp")) {
170 nptr = (struct namelist *)
171 mallok(sizeof(struct namelist));
172 nptr->next = sc.listrecps;
173 extract(nptr->name, buf, 1);
183 /* Do something useful */
184 CtdlForEachMessage(MSGS_ALL, 0L, (-63), NULL, NULL, network_spool_msg, &sc);
188 /* Now rewrite the config file */
189 fp = fopen(filename, "w");
191 lprintf(1, "ERROR: cannot open %s: %s\n", filename, strerror(errno));
194 fprintf(fp, "lastsent|%ld\n", sc.lastsent);
196 /* Write out the listrecps while freeing from memory at the
197 * same time. Am I clever or what? :)
199 while (sc.listrecps != NULL) {
200 fprintf(fp, "listrecp|%s\n", sc.listrecps->name);
201 nptr = sc.listrecps->next;
209 lprintf(5, "Outbound batch processing finished for <%s>\n",
210 CC->quickroom.QRname);
215 /* FIXME temporary server command for batch send */
216 void cmd_batc(char *argbuf) {
217 if (CtdlAccessCheck(ac_aide)) return;
219 network_spoolout_current_room();
221 cprintf("%d FIXME cmd_batc() ok\n", OK);
226 char *Dynamic_Module_Init(void)
228 CtdlRegisterProtoHook(cmd_gnet, "GNET", "Get network config");
229 CtdlRegisterProtoHook(cmd_snet, "SNET", "Get network config");
232 temporary server command for batch send
234 CtdlRegisterProtoHook(cmd_batc, "BATC", "send out batch (temp)");