From: Wilfried Goesgens Date: Mon, 21 Jan 2013 23:51:01 +0000 (+0100) Subject: NETCFG: save messages if changed. X-Git-Tag: v8.20~145 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=b160dd583e9165da4689e1a09cd4d675dedb6ca4 NETCFG: save messages if changed. --- diff --git a/citadel/include/ctdl_module.h b/citadel/include/ctdl_module.h index e4ca40083..1217783e6 100644 --- a/citadel/include/ctdl_module.h +++ b/citadel/include/ctdl_module.h @@ -245,10 +245,11 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf, void CtdlPutRoomLock(struct ctdlroom *qrbuf); typedef void (*ForEachRoomCallBack)(struct ctdlroom *EachRoom, void *out_data); void CtdlForEachRoom(ForEachRoomCallBack CB, void *in_data); -typedef void (*ForEachRoomNetCfgCallBack)(struct ctdlroom *EachRoom, void *out_data, const OneRoomNetCfg *OneRNCFG); +typedef void (*ForEachRoomNetCfgCallBack)(struct ctdlroom *EachRoom, void *out_data, OneRoomNetCfg *OneRNCFG); void CtdlForEachNetCfgRoom(ForEachRoomNetCfgCallBack CB, void *in_data, RoomNetCfg filter); +void SaveChangedConfigs(void); void CtdlDeleteRoom(struct ctdlroom *qrbuf); int CtdlRenameRoom(char *old_name, char *new_name, int new_floor); @@ -423,7 +424,7 @@ void SerializeGeneric(const CfgLineType *ThisOne, StrBuf *OutputBuffer, OneRoomN void DeleteGenericCfgLine(const CfgLineType *ThisOne, RoomNetCfgLine **data); RoomNetCfgLine *DuplicateOneGenericCfgLine(const RoomNetCfgLine *data); -const OneRoomNetCfg* CtdlGetNetCfgForRoom(long QRNumber); +OneRoomNetCfg* CtdlGetNetCfgForRoom(long QRNumber); typedef struct _nodeconf { int DeleteMe; diff --git a/citadel/modules/network/serv_netspool.c b/citadel/modules/network/serv_netspool.c index 659f8e259..47e1f1808 100644 --- a/citadel/modules/network/serv_netspool.c +++ b/citadel/modules/network/serv_netspool.c @@ -157,6 +157,12 @@ void network_spoolout_room(RoomProcList *room_to_spool, SpoolControl sc; int i; + memset(&sc, 0, sizeof(SpoolControl)); + sc.RNCfg = room_to_spool->OneRNCfg; + sc.lastsent = room_to_spool->OneRNCfg->lastsent; + sc.working_ignetcfg = working_ignetcfg; + sc.the_netmap = the_netmap; + if ((sc.RNCfg->NetConfigs[listrecp] == NULL) && (sc.RNCfg->NetConfigs[digestrecp] == NULL) && (sc.RNCfg->NetConfigs[participate] == NULL) && @@ -178,10 +184,6 @@ void network_spoolout_room(RoomProcList *room_to_spool, syslog(LOG_INFO, "Networking started for <%s>\n", CCC->room.QRname); - sc.RNCfg = room_to_spool->OneRNCfg; - sc.lastsent = room_to_spool->OneRNCfg->lastsent; - sc.working_ignetcfg = working_ignetcfg; - sc.the_netmap = the_netmap; /* If there are digest recipients, we have to build a digest */ if (sc.RNCfg->NetConfigs[digestrecp] != NULL) { diff --git a/citadel/modules/network/serv_network.c b/citadel/modules/network/serv_network.c index 65645d9ab..f65dda3e4 100644 --- a/citadel/modules/network/serv_network.c +++ b/citadel/modules/network/serv_network.c @@ -231,7 +231,7 @@ void cmd_nsyn(char *argbuf) { } } -RoomProcList *CreateRoomProcListEntry(struct ctdlroom *qrbuf, const OneRoomNetCfg *OneRNCFG) +RoomProcList *CreateRoomProcListEntry(struct ctdlroom *qrbuf, OneRoomNetCfg *OneRNCFG) { int i; struct RoomProcList *ptr; @@ -261,7 +261,7 @@ RoomProcList *CreateRoomProcListEntry(struct ctdlroom *qrbuf, const OneRoomNetCf /* * 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; @@ -278,7 +278,7 @@ void network_queue_interesting_rooms(struct ctdlroom *qrbuf, void *data, const O int network_room_handler (struct ctdlroom *qrbuf) { struct RoomProcList *ptr; - const OneRoomNetCfg* RNCfg; + OneRoomNetCfg* RNCfg; if (qrbuf->QRdefaultview == VIEW_QUEUE) return 1; @@ -547,6 +547,8 @@ void network_do_queue(void) last_run = time(NULL); } destroy_network_queue_room(RL.rplist); + SaveChangedConfigs(); + } diff --git a/citadel/modules/pop3client/serv_pop3client.c b/citadel/modules/pop3client/serv_pop3client.c index 4fe026efa..25c835c75 100644 --- a/citadel/modules/pop3client/serv_pop3client.c +++ b/citadel/modules/pop3client/serv_pop3client.c @@ -983,7 +983,7 @@ int pop3_do_fetching(pop3aggr *cpptr) /* * Scan a room's netconfig to determine whether it requires POP3 aggregation */ -void pop3client_scan_room(struct ctdlroom *qrbuf, void *data, const OneRoomNetCfg *OneRNCFG) +void pop3client_scan_room(struct ctdlroom *qrbuf, void *data, OneRoomNetCfg *OneRNCFG) { const RoomNetCfgLine *pLine; void *vptr; diff --git a/citadel/modules/rssclient/serv_rssclient.c b/citadel/modules/rssclient/serv_rssclient.c index 77612bece..c2d95d34a 100644 --- a/citadel/modules/rssclient/serv_rssclient.c +++ b/citadel/modules/rssclient/serv_rssclient.c @@ -556,7 +556,7 @@ int rss_do_fetching(rss_aggregator *RSSAggr) /* * Scan a room's netconfig to determine whether it is requesting any RSS feeds */ -void rssclient_scan_room(struct ctdlroom *qrbuf, void *data, const OneRoomNetCfg *OneRNCFG) +void rssclient_scan_room(struct ctdlroom *qrbuf, void *data, OneRoomNetCfg *OneRNCFG) { const RoomNetCfgLine *pLine; rss_room_counter *Count = NULL; diff --git a/citadel/netconfig.c b/citadel/netconfig.c index 3aac29463..649fd5e02 100644 --- a/citadel/netconfig.c +++ b/citadel/netconfig.c @@ -201,22 +201,22 @@ int ReadRoomNetConfigFile(OneRoomNetCfg **pOneRNCFG, char *filename) int SaveRoomNetConfigFile(OneRoomNetCfg *OneRNCFG, char *filename) { RoomNetCfg eCfg; - StrBuf *Cfg; + StrBuf *Cfg = NULL; + StrBuf *OutBuffer = NULL; char tempfilename[PATH_MAX]; int TmpFD; long len; time_t unixtime; struct timeval tv; long reltid; /* if we don't have SYS_gettid, use "random" value */ - StrBuf *OutBuffer; int rc; HashPos *CfgIt; len = strlen(filename); memcpy(tempfilename, filename, len + 1); -#if defined(HAVE_SYONERNCFGALL_H) && defined (SYS_gettid) - reltid = syOneRNCFGall(SYS_gettid); +#if defined(HAVE_SYSCALL_H) && defined (SYS_gettid) + reltid = syscall(SYS_gettid); #endif gettimeofday(&tv, NULL); /* Promote to time_t; types differ on some OSes (like darwin) */ @@ -230,9 +230,11 @@ int SaveRoomNetConfigFile(OneRoomNetCfg *OneRNCFG, char *filename) syslog(LOG_CRIT, "ERROR: cannot open %s: %s\n", filename, strerror(errno)); unlink(tempfilename); + FreeStrBuf(&Cfg); return 0; } else { + OutBuffer = NewStrBuf(); CfgIt = GetNewHashPos(CfgTypeHash, 1); fchown(TmpFD, config.c_ctdluid, 0); for (eCfg = subpending; eCfg < maxRoomNetCfg; eCfg ++) @@ -264,9 +266,10 @@ int SaveRoomNetConfigFile(OneRoomNetCfg *OneRNCFG, char *filename) } rc = write(TmpFD, ChrPtr(OutBuffer), StrLength(OutBuffer)); - if ((rc >=0 ) && (rc == StrLength(Cfg))) + if ((rc >=0 ) && (rc == StrLength(OutBuffer))) { close(TmpFD); + unlink(filename); rename(tempfilename, filename); rc = 1; } @@ -282,9 +285,28 @@ int SaveRoomNetConfigFile(OneRoomNetCfg *OneRNCFG, char *filename) FreeStrBuf(&OutBuffer); } + FreeStrBuf(&Cfg); return rc; } +void SaveModifiedRooms(struct ctdlroom *qrbuf, void *data, OneRoomNetCfg *OneRNCfg) +{ + char filename[PATH_MAX]; + + if (OneRNCfg->changed) + { + assoc_file_name(filename, sizeof filename, qrbuf, ctdl_netcfg_dir); + SaveRoomNetConfigFile(OneRNCfg, filename); + OneRNCfg->changed = 0; + } +} +void SaveChangedConfigs(void) +{ + CtdlForEachNetCfgRoom(SaveModifiedRooms, + NULL, + maxRoomNetCfg); +} + void vFreeRoomNetworkStruct(void *vOneRoomNetCfg) { @@ -321,7 +343,7 @@ void FreeRoomNetworkStruct(OneRoomNetCfg **pOneRNCFG) *pOneRNCFG=NULL; } -const OneRoomNetCfg* CtdlGetNetCfgForRoom(long QRNumber) +OneRoomNetCfg* CtdlGetNetCfgForRoom(long QRNumber) { void *pv; GetHash(RoomConfigs, LKEY(QRNumber), &pv); diff --git a/citadel/room_ops.c b/citadel/room_ops.c index 23e5c9e03..14ddd8e53 100644 --- a/citadel/room_ops.c +++ b/citadel/room_ops.c @@ -608,7 +608,7 @@ void CtdlForEachNetCfgRoom(ForEachRoomNetCfgCallBack CB, room_sanity_check(&qrbuf); if (qrbuf.QRflags & QR_INUSE) { - const OneRoomNetCfg* RNCfg; + OneRoomNetCfg* RNCfg; RNCfg = CtdlGetNetCfgForRoom(qrbuf.QRnumber); if ((RNCfg != NULL) && ((filter == maxRoomNetCfg) ||