NETCFG: save messages if changed.
authorWilfried Goesgens <dothebart@citadel.org>
Mon, 21 Jan 2013 23:51:01 +0000 (00:51 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Mon, 21 Jan 2013 23:51:01 +0000 (00:51 +0100)
citadel/include/ctdl_module.h
citadel/modules/network/serv_netspool.c
citadel/modules/network/serv_network.c
citadel/modules/pop3client/serv_pop3client.c
citadel/modules/rssclient/serv_rssclient.c
citadel/netconfig.c
citadel/room_ops.c

index e4ca400830e82b95c65082d019d06c59ff3d317f..1217783e6989409341e028edf6b3c2800132d35a 100644 (file)
@@ -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;
index 659f8e25918dfd20ea8aad048041f043e8a97ca6..47e1f18082b9277c64e3a8308bb374a1e14e68d3 100644 (file)
@@ -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) {
index 65645d9abe89b8b2e3ca50ad6ec0788de74276b4..f65dda3e496fd4bdc4076e78eabb077602956981 100644 (file)
@@ -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();
+
 }
 
 
index 4fe026efab3bcf691205fedf815e91c90ba48bae..25c835c7561022bd276c5e8093b879101a1ce8d6 100644 (file)
@@ -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;
index 77612beceedc337df694a3b123dd3332fa6039a0..c2d95d34a88de0e68b0510524129fcfccafa16ba 100644 (file)
@@ -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;
index 3aac29463e616fc753e7b6d9b0df2dcce54980fc..649fd5e021e74b78fdad925867fa33b654679bdd 100644 (file)
@@ -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);
index 23e5c9e03b59674f189d4a1f9ac153aa656b1a87..14ddd8e53c154dc058222343b4367d59bf585e81 100644 (file)
@@ -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) ||