}
}
-RoomProcList *CreateRoomProcListEntry(struct ctdlroom *qrbuf, const OneRoomNetCfg *OneRNCFG)
+RoomProcList *CreateRoomProcListEntry(struct ctdlroom *qrbuf, OneRoomNetCfg *OneRNCFG)
{
int i;
struct RoomProcList *ptr;
ptr->lcname[ptr->namelen] = '\0';
ptr->key = hashlittle(ptr->lcname, ptr->namelen, 9872345);
+ ptr->lastsent = OneRNCFG->lastsent;
ptr->OneRNCfg = OneRNCFG;
return ptr;
}
/*
* Batch up and send all outbound traffic from the current room
*/
-void network_queue_interesting_rooms(struct ctdlroom *qrbuf, void *data, const OneRoomNetCfg *OneRNCfg)
+void network_queue_interesting_rooms(struct ctdlroom *qrbuf, void *data, OneRoomNetCfg *OneRNCfg)
{
struct RoomProcList *ptr;
roomlists *RP = (roomlists*) data;
+ if (!HaveSpoolConfig(OneRNCfg))
+ return;
+
ptr = CreateRoomProcListEntry(qrbuf, OneRNCfg);
ptr->next = RP->rplist;
int network_room_handler (struct ctdlroom *qrbuf)
{
struct RoomProcList *ptr;
- const OneRoomNetCfg* RNCfg;
+ OneRoomNetCfg* RNCfg;
if (qrbuf->QRdefaultview == VIEW_QUEUE)
return 1;
if (RNCfg == NULL)
return 1;
+ if (!HaveSpoolConfig(RNCfg))
+ return 1;
+
ptr = CreateRoomProcListEntry(qrbuf, RNCfg);
if (ptr == NULL)
return 1;
+ ptr->OneRNCfg = NULL;
begin_critical_section(S_RPLIST);
ptr->next = rplist;
rplist = ptr;
}
-
+void free_network_spoolout_room(SpoolControl *sc)
+{
+ if (sc != NULL)
+ {
+ int i;
+ for (i = subpending; i < maxRoomNetCfg; i++)
+ FreeStrBuf(&sc->Users[i]);
+ free(sc);
+ }
+}
HashList *the_netmap = NULL;
int netmap_changed = 0;
roomlists RL;
+ SpoolControl *sc = NULL;
+ SpoolControl *pSC;
/*
* Run the full set of processing tasks no more frequently
}
if (ptr->namelen > 0) {
- network_spoolout_room(ptr,
- working_ignetcfg,
- the_netmap);
+ InspectQueuedRoom(&sc,
+ ptr,
+ working_ignetcfg,
+ the_netmap);
}
ptr = ptr->next;
}
}
+
+ pSC = sc;
+ while (pSC != NULL)
+ {
+ network_spoolout_room(pSC);
+ pSC = pSC->next;
+ }
+
+ pSC = sc;
+ while (pSC != NULL)
+ {
+ sc = pSC->next;
+ free_network_spoolout_room(pSC);
+ pSC = sc;
+ }
/* If there is anything in the inbound queue, process it */
if (!server_shutting_down) {
network_do_spoolin(working_ignetcfg,
/* Save the network map back to disk */
if (netmap_changed) {
StrBuf *MapStr = CtdlSerializeNetworkMap(the_netmap);
- CtdlPutSysConfig(IGNETMAP, SmashStrBuf(&MapStr));
+ char *pMapStr = SmashStrBuf(&MapStr);
+ CtdlPutSysConfig(IGNETMAP, pMapStr);
+ free(pMapStr);
}
/* combine singe message files into one spool entry per remote node. */
last_run = time(NULL);
}
destroy_network_queue_room(RL.rplist);
+ SaveChangedConfigs();
+
}