HashList *RSSFetchUrls = NULL; /* -> rss_aggregator; ->RefCount access to be locked too. */
eNextState RSSAggregatorTerminate(AsyncIO *IO);
-
+eNextState RSSAggregatorShutdownAbort(AsyncIO *IO);
struct CitContext rss_CC;
struct rssnetcfg *rnclist = NULL;
At = GetNewHashPos(RSSQueueRooms, 0);
- GetHashPosFromKey(RSSQueueRooms, LKEY(QRnumber), At);
- GetHashPos(RSSQueueRooms, At, &HKLen, &HK, &vData);
- if (vData != NULL)
+ if (GetHashPosFromKey(RSSQueueRooms, LKEY(QRnumber), At))
{
- pRoomC = (rss_room_counter *) vData;
- pRoomC->count --;
- if (pRoomC->count == 0)
- DeleteEntryFromHash(RSSQueueRooms, At);
+ GetHashPos(RSSQueueRooms, At, &HKLen, &HK, &vData);
+ if (vData != NULL)
+ {
+ pRoomC = (rss_room_counter *) vData;
+ pRoomC->count --;
+ if (pRoomC->count == 0)
+ DeleteEntryFromHash(RSSQueueRooms, At);
+ }
}
DeleteHashPos(&At);
}
UnlinkRooms(Cfg);
At = GetNewHashPos(RSSFetchUrls, 0);
- if (GetHashPosFromKey(RSSFetchUrls, SKEY(Cfg->Url), At) == 0)
+ if (GetHashPosFromKey(RSSFetchUrls, SKEY(Cfg->Url), At))
{
DeleteEntryFromHash(RSSFetchUrls, At);
}
cdb_store(CDB_USETABLE, SKEY(Ctx->ThisMsg->MsgGUID), &Ctx->ThisMsg->ut, sizeof(struct UseTable) );
if (GetNextHashPos(Ctx->Messages, Ctx->Pos, &len, &Key, (void**) &Ctx->ThisMsg))
- return QueueDBOperation(IO, RSS_FetchNetworkUsetableEntry);
+ return NextDBOperation(IO, RSS_FetchNetworkUsetableEntry);
else
return eAbort;
}
#ifndef DEBUG_RSS
if (cdbut != NULL) {
/* Item has already been seen */
- syslog(LOG_DEBUG, "%s has already been seen\n", ChrPtr(Ctx->ThisMsg->MsgGUID));
+ EV_syslog(LOG_DEBUG, "%s has already been seen\n", ChrPtr(Ctx->ThisMsg->MsgGUID));
cdb_free(cdbut);
/* rewrite the record anyway, to update the timestamp */
&Ctx->ThisMsg->ut, sizeof(struct UseTable) );
if (GetNextHashPos(Ctx->Messages, Ctx->Pos, &len, &Key, (void**) &Ctx->ThisMsg))
- return QueueDBOperation(IO, RSS_FetchNetworkUsetableEntry);
+ return NextDBOperation(IO, RSS_FetchNetworkUsetableEntry);
else
return eAbort;
}
int msglen = 0;
StrBuf *Message;
StrBuf *guid;
+ AsyncIO *IO = &Cfg->IO;
int n;
}
/* translate Item into message. */
- syslog(LOG_DEBUG, "RSS: translating item...\n");
+ EVM_syslog(LOG_DEBUG, "RSS: translating item...\n");
if (ri->description == NULL) ri->description = NewStrBufPlain(HKEY(""));
StrBufSpaceToBlank(ri->description);
msg = malloc(sizeof(struct CtdlMessage));
if ((Cfg->next_poll != 0) && (now < Cfg->next_poll))
return 0;
- Cfg->RefCount++;
ri = (rss_item*) malloc(sizeof(rss_item));
memset(ri, 0, sizeof(rss_item));
IO->CitContext = CloneContext(&rss_CC);
IO->Data = Cfg;
+ safestrncpy(((CitContext*)IO->CitContext)->cs_host,
+ ChrPtr(Cfg->Url),
+ sizeof(((CitContext*)IO->CitContext)->cs_host));
syslog(LOG_DEBUG, "Fetching RSS feed <%s>\n", ChrPtr(Cfg->Url));
ParseURL(&IO->ConnectMe, Cfg->Url, 80);
NULL,
"Citadel RSS Client",
ParseRSSReply,
- RSSAggregatorTerminate))
+ RSSAggregatorTerminate,
+ RSSAggregatorShutdownAbort))
{
syslog(LOG_DEBUG, "Unable to initialize libcurl.\n");
return 0;
void DeleteRssCfg(void *vptr)
{
rss_aggregator *rncptr = (rss_aggregator *)vptr;
+ AsyncIO *IO = &rncptr->IO;
+ EVM_syslog(LOG_DEBUG, "RSS: destroying\n");
FreeStrBuf(&rncptr->Url);
FreeStrBuf(&rncptr->rooms);
DeleteHash(&rncptr->OtherQRnumbers);
FreeURL(&rncptr->IO.ConnectMe);
+ DeleteHashPos (&rncptr->Pos);
+ DeleteHash (&rncptr->Messages);
+ if (rncptr->recp.recp_room != NULL)
+ free(rncptr->recp.recp_room);
+
+
if (rncptr->Item != NULL)
{
FreeStrBuf(&rncptr->Item->guid);
eNextState RSSAggregatorTerminate(AsyncIO *IO)
{
rss_aggregator *rncptr = (rss_aggregator *)IO->Data;
-
- HashPos *At;
- long HKLen;
- const char *HK;
- void *vData;
- pthread_mutex_lock(&RSSQueueMutex);
- rncptr->RefCount --;
- if (rncptr->RefCount == 0)
- {
- UnlinkRSSAggregator(rncptr);
+ EVM_syslog(LOG_DEBUG, "RSS: Terminating.\n");
- }
- pthread_mutex_unlock(&RSSQueueMutex);
- At = GetNewHashPos(RSSFetchUrls, 0);
+ UnlinkRSSAggregator(rncptr);
+ return eAbort;
+}
+eNextState RSSAggregatorShutdownAbort(AsyncIO *IO)
+{
+ const char *pUrl;
+ rss_aggregator *rncptr = (rss_aggregator *)IO->Data;
- pthread_mutex_lock(&RSSQueueMutex);
- GetHashPosFromKey(RSSFetchUrls, SKEY(rncptr->Url), At);
- GetHashPos(RSSFetchUrls, At, &HKLen, &HK, &vData);
- DeleteEntryFromHash(RSSFetchUrls, At);
- pthread_mutex_unlock(&RSSQueueMutex);
- DeleteHashPos (&rncptr->Pos);
- DeleteHash (&rncptr->Messages);
- if (rncptr->recp.recp_room != NULL)
- free(rncptr->recp.recp_room);
- DeleteHashPos(&At);
+ pUrl = IO->ConnectMe->PlainUrl;
+ if (pUrl == NULL)
+ pUrl = "";
+
+ EV_syslog(LOG_DEBUG, "RSS: Aborting by shutdown: %s.\n", pUrl);
+
+
+ UnlinkRSSAggregator(rncptr);
return eAbort;
}
use_this_rncptr = (rss_aggregator *)vptr;
if (use_this_rncptr != NULL)
{
- /* mustn't attach to an active session */
- if (use_this_rncptr->RefCount > 0)
+ long *QRnumber;
+ StrBufAppendBufPlain(use_this_rncptr->rooms,
+ qrbuf->QRname,
+ -1, 0);
+ if (use_this_rncptr->roomlist_parts == 1)
{
- DeleteRssCfg(rncptr);
- Count->count--;
+ use_this_rncptr->OtherQRnumbers = NewHash(1, lFlathash);
}
- else
- {
- long *QRnumber;
- StrBufAppendBufPlain(use_this_rncptr->rooms,
- qrbuf->QRname,
- -1, 0);
- if (use_this_rncptr->roomlist_parts == 1)
- {
- use_this_rncptr->OtherQRnumbers = NewHash(1, lFlathash);
- }
- QRnumber = (long*)malloc(sizeof(long));
- *QRnumber = qrbuf->QRnumber;
- Put(use_this_rncptr->OtherQRnumbers, LKEY(qrbuf->QRnumber), QRnumber, NULL);
- use_this_rncptr->roomlist_parts++;
- }
- pthread_mutex_unlock(&RSSQueueMutex);
+ QRnumber = (long*)malloc(sizeof(long));
+ *QRnumber = qrbuf->QRnumber;
+ Put(use_this_rncptr->OtherQRnumbers, LKEY(qrbuf->QRnumber), QRnumber, NULL);
+ use_this_rncptr->roomlist_parts++;
+ pthread_mutex_unlock(&RSSQueueMutex);
FreeStrBuf(&rncptr->Url);
free(rncptr);
*/
if (doing_rssclient) return;
doing_rssclient = 1;
+ if ((GetCount(RSSQueueRooms) > 0) || (GetCount(RSSFetchUrls) > 0))
+ return;
syslog(LOG_DEBUG, "rssclient started\n");
CtdlForEachRoom(rssclient_scan_room, NULL);
GetNextHashPos(RSSFetchUrls, it, &len, &Key, &vrptr) &&
(vrptr != NULL)) {
rptr = (rss_aggregator *)vrptr;
- if (rptr->RefCount == 0)
- if (!rss_do_fetching(rptr))
- UnlinkRSSAggregator(rptr);
+ if (!rss_do_fetching(rptr))
+ UnlinkRSSAggregator(rptr);
}
DeleteHashPos(&it);
pthread_mutex_unlock(&RSSQueueMutex);