]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/rssclient/serv_rssclient.c
Memleak: fix the varous handler & config lists of the rss module on exit.
[citadel.git] / citadel / modules / rssclient / serv_rssclient.c
index 341e8b02597b5cff03d7654d29b878b2fa7b7d12..13156ba0df047eca2b55796bc577d30c4e166738 100644 (file)
@@ -64,6 +64,7 @@ struct rssnetcfg {
        char *rooms;
        time_t last_error_when;
        int ItemType;
+       time_t next_poll;
 };
 
 #define RSS_UNSET       (1<<0)
@@ -1252,6 +1253,12 @@ void rss_do_fetching(rssnetcfg *Cfg) {
        const char *at;
        long len;
 
+       time_t now;
+
+        now = time(NULL);
+
+       if ((Cfg->next_poll != 0) && (now < Cfg->next_poll))
+               return;
        memset(&ri, 0, sizeof(rss_item));
        rssc.Item = &ri;
        rssc.Cfg = Cfg;
@@ -1373,6 +1380,8 @@ shutdown:
        flush_rss_item(&ri);
        FreeStrBuf(&rssc.CData);
        FreeStrBuf(&rssc.Key);
+
+        Cfg->next_poll = time(NULL) + config.c_net_freq; 
 }
 
 
@@ -1424,6 +1433,7 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data)
                        /* Otherwise create a new client request */
                        if (use_this_rncptr == NULL) {
                                rncptr = (rssnetcfg *) malloc(sizeof(rssnetcfg));
+                               memset(rncptr, 0, sizeof(rssnetcfg));
                                rncptr->ItemType = RSS_UNSET;
                                if (rncptr != NULL) {
                                        rncptr->next = rnclist;
@@ -1529,6 +1539,14 @@ void LoadUrlShorteners(void)
        close(fd);
 }
 
+void rss_cleanup(void)
+{
+        DeleteHash(&StartHandlers);
+        DeleteHash(&EndHandlers);
+       DeleteHash(&UrlShorteners);
+       DeleteHash(&KnownNameSpaces);
+}
+
 CTDL_MODULE_INIT(rssclient)
 {
        if (threading)
@@ -1622,6 +1640,7 @@ CTDL_MODULE_INIT(rssclient)
                /* we don't like these namespaces because of they shadow our usefull parameters. */
                Put(KnownNameSpaces, HKEY("http://search.yahoo.com/mrss/"), NULL, reference_free_handler);
 #endif
+                CtdlRegisterCleanupHook(rss_cleanup);
        }
        return "rssclient";
 }