X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Frssclient%2Fserv_rssclient.c;h=465d02348716827264d577aeae48f98b30ff023a;hb=cf934431c7c8c1091b38c0b374f6a3b9293841ca;hp=c9461a673934ed8d45ad0231aa3abd9b3e36ee1d;hpb=84a0666848ccbea920f0bd398baf149c1a12ea74;p=citadel.git diff --git a/citadel/modules/rssclient/serv_rssclient.c b/citadel/modules/rssclient/serv_rssclient.c index c9461a673..465d02348 100644 --- a/citadel/modules/rssclient/serv_rssclient.c +++ b/citadel/modules/rssclient/serv_rssclient.c @@ -25,23 +25,23 @@ #include #include #include +#include #include #include "citadel.h" #include "server.h" #include "citserver.h" #include "support.h" #include "config.h" +#include "threads.h" #include "room_ops.h" #include "ctdl_module.h" #include "clientsocket.h" #include "msgbase.h" +#include "parsedate.h" #include "database.h" #include "citadel_dirs.h" #include "md5.h" -#ifdef HAVE_EXPAT -#include - struct rssnetcfg { struct rssnetcfg *next; @@ -162,13 +162,13 @@ void rss_save_item(struct rss_item *ri) { CtdlSubmitMsg(msg, recp, NULL); CtdlFreeMessage(msg); - free_recipients(recp); /* write the uidl to the use table so we don't store this item again */ strcpy(ut.ut_msgid, utmsgid); ut.ut_timestamp = time(NULL); cdb_store(CDB_USETABLE, utmsgid, strlen(utmsgid), &ut, sizeof(struct UseTable) ); } + free_recipients(recp); } @@ -179,6 +179,7 @@ void rss_save_item(struct rss_item *ri) { time_t rdf_parsedate(char *p) { struct tm tm; + time_t t = 0; if (!p) return 0L; if (strlen(p) < 10) return 0L; @@ -195,13 +196,16 @@ time_t rdf_parsedate(char *p) tm.tm_hour = atoi(&p[11]); tm.tm_min = atoi(&p[14]); } + return mktime(&tm); } - else { - /* FIXME try an imap timestamp conversion */ - } + /* hmm... try RFC822 date stamp format */ + + t = parsedate(p); + if (t > 0) return(t); - return mktime(&tm); + /* yeesh. ok, just return the current date and time. */ + return(time(NULL)); } @@ -465,6 +469,7 @@ retry: lprintf(CTDL_NOTICE, "Connecting to <%s>\n", rsshost); strcpy(buf, &buf[9]); striplt(buf); if (parse_url(buf, rsshost, &rssport, rssurl) == 0) { + sock_close(sock); goto retry; } else { @@ -580,17 +585,19 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data) /* * Scan for rooms that have RSS client requests configured */ -void rssclient_scan(void) { +void *rssclient_scan(void *args) { static time_t last_run = 0L; static int doing_rssclient = 0; struct rssnetcfg *rptr = NULL; + struct CitContext rssclientCC; - /* - * Run RSS client no more frequently than once every n seconds - */ - if ( (time(NULL) - last_run) < config.c_net_freq ) { - return; - } + /* Give this thread its own private CitContext */ + memset(&rssclientCC, 0, sizeof(struct CitContext)); + rssclientCC.internal_pgm = 1; + rssclientCC.cs_pid = 0; + pthread_setspecific(MyConKey, (void *)&rssclientCC ); + + CtdlThreadAllocTSD(); /* * This is a simple concurrency check to make sure only one rssclient run @@ -598,7 +605,7 @@ void rssclient_scan(void) { * don't really require extremely fine granularity here, we'll do it * with a static variable instead. */ - if (doing_rssclient) return; + if (doing_rssclient) return NULL; doing_rssclient = 1; lprintf(CTDL_DEBUG, "rssclient started\n"); @@ -615,22 +622,17 @@ void rssclient_scan(void) { lprintf(CTDL_DEBUG, "rssclient ended\n"); last_run = time(NULL); doing_rssclient = 0; + CtdlThreadSchedule ("RSS Client", CTDLTHREAD_BIGSTACK, rssclient_scan, NULL, last_run + config.c_net_freq); + return NULL; } -#endif /* HAVE_EXPAT */ - CTDL_MODULE_INIT(rssclient) { - if (!threading) + if (threading) { -#ifdef HAVE_EXPAT - CtdlRegisterSessionHook(rssclient_scan, EVT_TIMER); -#else - lprintf(CTDL_INFO, "This server is missing the Expat XML parser. RSS client will be disabled.\n"); -#endif + CtdlThreadSchedule ("RSS Client", CTDLTHREAD_BIGSTACK, rssclient_scan, NULL, 0); } - /* return our Subversion id for the Log */ return "$Id: serv_rssclient.c 5652 2007-10-29 20:14:48Z ajc $"; }