X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=citadel%2Fmodules%2Frssclient%2Fserv_rssclient.c;h=b8d1b4495ec9cdd260d13ff61b0caf50094f09e6;hp=67c325a476b0f267333dd54d50ae47ae561ac9f1;hb=91acc8a0f1f9c4638613c6d2c177e28db1027366;hpb=2b402dc292b6dcdbc7a3786a6c722e06e3be5ab5 diff --git a/citadel/modules/rssclient/serv_rssclient.c b/citadel/modules/rssclient/serv_rssclient.c index 67c325a47..b8d1b4495 100644 --- a/citadel/modules/rssclient/serv_rssclient.c +++ b/citadel/modules/rssclient/serv_rssclient.c @@ -62,12 +62,15 @@ #define TMP_SHORTER_URL_OFFSET 0xFE #define TMP_SHORTER_URLS 0xFD +time_t last_run = 0L; + pthread_mutex_t RSSQueueMutex; /* locks the access to the following vars: */ HashList *RSSQueueRooms = NULL; /* rss_room_counter */ HashList *RSSFetchUrls = NULL; /* -> rss_aggregator; ->RefCount access to be locked too. */ eNextState RSSAggregatorTerminate(AsyncIO *IO); +struct CitContext rss_CC; struct rssnetcfg *rnclist = NULL; void AppendLink(StrBuf *Message, StrBuf *link, StrBuf *LinkTitle, const char *Title) @@ -139,11 +142,10 @@ void UnlinkRooms(rss_aggregator *Cfg) } /* if (server_shutting_down) - break; /* TODO */ + break; / * TODO */ DeleteHashPos(&At); } - } void UnlinkRSSAggregator(rss_aggregator *Cfg) @@ -158,6 +160,7 @@ void UnlinkRSSAggregator(rss_aggregator *Cfg) DeleteEntryFromHash(RSSFetchUrls, At); } DeleteHashPos(&At); + last_run = time(NULL); } eNextState FreeNetworkSaveMessage (AsyncIO *IO) @@ -179,6 +182,7 @@ eNextState FreeNetworkSaveMessage (AsyncIO *IO) FreeStrBuf(&Ctx->Message); FreeStrBuf(&Ctx->MsgGUID); free(Ctx); + last_run = time(NULL); return eAbort; } @@ -243,7 +247,7 @@ void RSSQueueSaveMessage(struct CtdlMessage *Msg, struct recptypes *recp, StrBuf Ctx->Cfg = Cfg; Ctx->recp = recp; Ctx->IO.Data = Ctx; - Ctx->IO.CitContext = CloneContext(CC); + Ctx->IO.CitContext = CloneContext(&rss_CC); Ctx->IO.Terminate = FreeNetworkSaveMessage; Ctx->IO.ShutdownAbort = AbortNetworkSaveMessage; QueueDBOperation(&Ctx->IO, RSS_FetchNetworkUsetableEntry); @@ -342,6 +346,10 @@ void rss_save_item(rss_item *ri, rss_aggregator *Cfg) StrBufRFC2047encode(&Encoded, ri->author_or_creator); msg->cm_fields['A'] = SmashStrBuf(&Encoded); msg->cm_fields['P'] = strdup("rss@localhost"); + + } + if (ri->pubdate <= 0) { + ri->pubdate = time(NULL); } } } @@ -430,7 +438,7 @@ int rss_do_fetching(rss_aggregator *Cfg) memset(ri, 0, sizeof(rss_item)); Cfg->Item = ri; IO = &Cfg->IO; - IO->CitContext = CloneContext(CC); + IO->CitContext = CloneContext(&rss_CC); IO->Data = Cfg; @@ -462,8 +470,9 @@ void DeleteRssCfg(void *vptr) FreeStrBuf(&rncptr->rooms); FreeStrBuf(&rncptr->CData); FreeStrBuf(&rncptr->Key); - + FreeStrBuf(&rncptr->IO.HttpReq.ReplyData); DeleteHash(&rncptr->OtherQRnumbers); + FreeURL(&rncptr->IO.ConnectMe); if (rncptr->Item != NULL) { @@ -487,11 +496,12 @@ void DeleteRssCfg(void *vptr) eNextState RSSAggregatorTerminate(AsyncIO *IO) { rss_aggregator *rncptr = (rss_aggregator *)IO->Data; - HashPos *At; - long HKLen; - const char *HK; - void *vData; - + /* + HashPos *At; + long HKLen; + const char *HK; + void *vData; + */ pthread_mutex_lock(&RSSQueueMutex); rncptr->RefCount --; if (rncptr->RefCount == 0) @@ -519,7 +529,7 @@ eNextState RSSAggregatorTerminate(AsyncIO *IO) */ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data) { - StrBuf *CfgData; + StrBuf *CfgData=NULL; StrBuf *CfgType; StrBuf *Line; rss_room_counter *Count = NULL; @@ -558,9 +568,19 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data) } if (server_shutting_down) - return + return; + + if (fstat(fd, &statbuf) == -1) { + syslog(LOG_DEBUG, "ERROR: could not stat configfile '%s' - %s\n", + filename, strerror(errno)); + return; + } + + if (server_shutting_down) + return; CfgData = NewStrBufPlain(NULL, statbuf.st_size + 1); + if (StrBufReadBLOB(CfgData, &fd, 1, statbuf.st_size, &Err) < 0) { close(fd); FreeStrBuf(&CfgData); @@ -624,6 +644,11 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data) use_this_rncptr->roomlist_parts++; } pthread_mutex_unlock(&RSSQueueMutex); + + + FreeStrBuf(&rncptr->Url); + free(rncptr); + rncptr = NULL; continue; } pthread_mutex_unlock(&RSSQueueMutex); @@ -663,11 +688,11 @@ void rssclient_scan(void) { long len; const char *Key; - /* Run no more than once every 15 minutes. * / + /* Run no more than once every 15 minutes. */ if ((time(NULL) - last_run) < 900) { return; } -*/ + /* * This is a simple concurrency check to make sure only one rssclient run * is done at a time. We could do this with a mutex, but since we @@ -711,6 +736,7 @@ CTDL_MODULE_INIT(rssclient) { if (threading) { + CtdlFillSystemContext(&rss_CC, "rssclient"); pthread_mutex_init(&RSSQueueMutex, NULL); RSSQueueRooms = NewHash(1, lFlathash); RSSFetchUrls = NewHash(1, NULL);