#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <expat.h>
#include <libcitadel.h>
#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 <expat.h>
-
struct rssnetcfg {
struct rssnetcfg *next;
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);
}
time_t rdf_parsedate(char *p)
{
struct tm tm;
+ time_t t = 0;
if (!p) return 0L;
if (strlen(p) < 10) return 0L;
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));
}
strcpy(buf, &buf[9]);
striplt(buf);
if (parse_url(buf, rsshost, &rssport, rssurl) == 0) {
+ sock_close(sock);
goto retry;
}
else {
/*
* 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
* 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");
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 $";
}