X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fpop3client%2Fserv_pop3client.c;h=433309f38895ed0d9e6877f510ad40848e985d3c;hb=3e3d387a634d0d82ed22a8db85f4cc036b60df17;hp=fa151f6694707e9fbae3c8f9ca883ba957be8c04;hpb=7503f872f1d5fba349e0c6af6a017881fe97316b;p=citadel.git diff --git a/citadel/modules/pop3client/serv_pop3client.c b/citadel/modules/pop3client/serv_pop3client.c index fa151f669..433309f38 100644 --- a/citadel/modules/pop3client/serv_pop3client.c +++ b/citadel/modules/pop3client/serv_pop3client.c @@ -54,17 +54,52 @@ #define POP3C_OK (strncasecmp(ChrPtr(RecvMsg->IO.IOBuf), "+OK", 3) == 0) +int Pop3ClientID = 0; +int POP3ClientDebugEnabled = 0; -#define POP3C_DBG_SEND() \ - syslog(LOG_DEBUG, \ - "POP3 client[%ld]: > %s\n", \ - RecvMsg->n, ChrPtr(RecvMsg->IO.SendBuf.Buf)) +#define N ((pop3aggr*)IO->Data)->n -#define POP3C_DBG_READ() \ - syslog(LOG_DEBUG, \ - "POP3 client[%ld]: < %s\n", \ - RecvMsg->n, \ - ChrPtr(RecvMsg->IO.IOBuf)) +#define DBGLOG(LEVEL) if ((LEVEL != LOG_DEBUG) || (POP3ClientDebugEnabled != 0)) + +#define EVP3C_syslog(LEVEL, FORMAT, ...) \ + DBGLOG(LEVEL) syslog(LEVEL, \ + "IO[%ld]CC[%d][%ld]POP3: " FORMAT, \ + IO->ID, CCID, N, __VA_ARGS__) + +#define EVP3CM_syslog(LEVEL, FORMAT) \ + DBGLOG(LEVEL) syslog(LEVEL, \ + "IO[%ld]CC[%d][%ld]POP3: " FORMAT, \ + IO->ID, CCID, N) + +#define EVP3CQ_syslog(LEVEL, FORMAT, ...) \ + DBGLOG(LEVEL) syslog(LEVEL, \ + "P3Q:" FORMAT, \ + __VA_ARGS__) + +#define EVP3CQM_syslog(LEVEL, FORMAT) \ + DBGLOG(LEVEL) syslog(LEVEL, \ + "P3Q" FORMAT \ + ) + +#define EVP3CCS_syslog(LEVEL, FORMAT, ...) \ + DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]POP3: " FORMAT, \ + IO->ID, N, __VA_ARGS__) + +#define EVP3CCSM_syslog(LEVEL, FORMAT) \ + DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]POP3: " FORMAT, \ + IO->ID, N) + +#define POP3C_DBG_SEND() \ + EVP3C_syslog(LOG_DEBUG, \ + "IO[%ld]CC[%d][%ld]POP3: > %s\n", \ + IO->ID, CCID, N, \ + ChrPtr(RecvMsg->IO.SendBuf.Buf)) + +#define POP3C_DBG_READ() \ + EVP3C_syslog(LOG_DEBUG, \ + "IO[%ld]CC[%d][%ld]POP3: < %s\n", \ + IO->ID, CCID, N, \ + ChrPtr(RecvMsg->IO.IOBuf)) struct CitContext pop3_client_CC; @@ -127,6 +162,8 @@ struct pop3aggr { AsyncIO IO; long n; + double IOStart; + long count; long RefCount; DNSQueryParts HostLookup; @@ -136,6 +173,7 @@ struct pop3aggr { StrBuf *Url; StrBuf *pop3user; StrBuf *pop3pass; + StrBuf *Host; StrBuf *RoomName; // TODO: fill me int keep; time_t interval; @@ -153,6 +191,7 @@ void DeletePOP3Aggregator(void *vptr) // FreeStrBuf(&ptr->rooms); FreeStrBuf(&ptr->pop3user); FreeStrBuf(&ptr->pop3pass); + FreeStrBuf(&ptr->Host); FreeStrBuf(&ptr->RoomName); FreeURL(&ptr->IO.ConnectMe); FreeStrBuf(&ptr->Url); @@ -169,14 +208,21 @@ void DeletePOP3Aggregator(void *vptr) eNextState FinalizePOP3AggrRun(AsyncIO *IO) { HashPos *It; - pop3aggr *cptr = (pop3aggr *)IO->Data; + pop3aggr *cpptr = (pop3aggr *)IO->Data; - syslog(LOG_DEBUG, "Terminating Aggregator; bye.\n"); + EVP3C_syslog(LOG_INFO, + "%s@%s: fetched %ld new of %d messages in %fs. bye.", + ChrPtr(cpptr->pop3user), + ChrPtr(cpptr->Host), + cpptr->count, + GetCount(cpptr->MsgNumbers), + IO->Now - cpptr->IOStart + ); It = GetNewHashPos(POP3FetchUrls, 0); pthread_mutex_lock(&POP3QueueMutex); { - if (GetHashPosFromKey(POP3FetchUrls, SKEY(cptr->Url), It)) + if (GetHashPosFromKey(POP3FetchUrls, SKEY(cpptr->Url), It)) DeleteEntryFromHash(POP3FetchUrls, It); } pthread_mutex_unlock(&POP3QueueMutex); @@ -191,6 +237,7 @@ eNextState FailAggregationRun(AsyncIO *IO) eNextState POP3C_ReadGreeting(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; POP3C_DBG_READ(); /* Read the server greeting */ if (!POP3C_OK) return eTerminateConnection; @@ -199,6 +246,7 @@ eNextState POP3C_ReadGreeting(pop3aggr *RecvMsg) eNextState POP3C_SendUser(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; /* Identify ourselves. NOTE: we have to append a CR to each command. * The LF will automatically be appended by sock_puts(). Believe it * or not, leaving out the CR will cause problems if the server happens @@ -213,6 +261,7 @@ eNextState POP3C_SendUser(pop3aggr *RecvMsg) eNextState POP3C_GetUserState(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; POP3C_DBG_READ(); if (!POP3C_OK) return eTerminateConnection; else return eSendReply; @@ -220,16 +269,18 @@ eNextState POP3C_GetUserState(pop3aggr *RecvMsg) eNextState POP3C_SendPassword(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; /* Password */ StrBufPrintf(RecvMsg->IO.SendBuf.Buf, "PASS %s\r\n", ChrPtr(RecvMsg->pop3pass)); - syslog(LOG_DEBUG, "\n"); + EVP3CM_syslog(LOG_DEBUG, "\n"); // POP3C_DBG_SEND(); No, we won't write the passvoid to syslog... return eReadMessage; } eNextState POP3C_GetPassState(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; POP3C_DBG_READ(); if (!POP3C_OK) return eTerminateConnection; else return eSendReply; @@ -237,6 +288,7 @@ eNextState POP3C_GetPassState(pop3aggr *RecvMsg) eNextState POP3C_SendListCommand(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; /* Get the list of messages */ StrBufPlain(RecvMsg->IO.SendBuf.Buf, HKEY("LIST\r\n")); POP3C_DBG_SEND(); @@ -245,6 +297,7 @@ eNextState POP3C_SendListCommand(pop3aggr *RecvMsg) eNextState POP3C_GetListCommandState(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; POP3C_DBG_READ(); if (!POP3C_OK) return eTerminateConnection; RecvMsg->MsgNumbers = NewHash(1, NULL); @@ -255,6 +308,7 @@ eNextState POP3C_GetListCommandState(pop3aggr *RecvMsg) eNextState POP3C_GetListOneLine(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; #if 0 int rc; #endif @@ -288,14 +342,14 @@ eNextState POP3C_GetListOneLine(pop3aggr *RecvMsg) #if 0 rc = TestValidateHash(RecvMsg->MsgNumbers); if (rc != 0) - syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc); + EVP3CCS_syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc); #endif Put(RecvMsg->MsgNumbers, LKEY(OneMsg->MSGID), OneMsg, HfreeFetchItem); #if 0 rc = TestValidateHash(RecvMsg->MsgNumbers); if (rc != 0) - syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc); + EVP3CCS_syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc); #endif //RecvMsg->State --; /* read next Line */ return eReadMore; @@ -309,7 +363,8 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO) struct cdbdata *cdbut; pop3aggr *RecvMsg = (pop3aggr *) IO->Data; - if(GetNextHashPos(RecvMsg->MsgNumbers, + if((RecvMsg->Pos != NULL) && + GetNextHashPos(RecvMsg->MsgNumbers, RecvMsg->Pos, &HKLen, &HKey, @@ -320,9 +375,9 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO) return eAbort; RecvMsg->CurrMsg = (FetchItem*) vData; - syslog(LOG_DEBUG, - "CHECKING: whether %s has already been seen: ", - ChrPtr(RecvMsg->CurrMsg->MsgUID)); + EVP3CCS_syslog(LOG_DEBUG, + "CHECKING: whether %s has already been seen: ", + ChrPtr(RecvMsg->CurrMsg->MsgUID)); /* Find out if we've already seen this item */ safestrncpy(ut.ut_msgid, @@ -333,7 +388,7 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO) cdbut = cdb_fetch(CDB_USETABLE, SKEY(RecvMsg->CurrMsg->MsgUID)); if (cdbut != NULL) { /* Item has already been seen */ - syslog(LOG_DEBUG, "YES\n"); + EVP3CCSM_syslog(LOG_DEBUG, "YES\n"); cdb_free(cdbut); /* rewrite the record anyway, to update the timestamp */ @@ -344,7 +399,7 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO) } else { - syslog(LOG_DEBUG, "NO\n"); + EVP3CCSM_syslog(LOG_DEBUG, "NO\n"); RecvMsg->CurrMsg->NeedFetch = 1; } return NextDBOperation(&RecvMsg->IO, @@ -355,13 +410,14 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO) /* ok, now we know them all, * continue with reading the actual messages. */ DeleteHashPos(&RecvMsg->Pos); - + StopDBWatchers(IO); return QueueEventContext(IO, POP3_C_ReAttachToFetchMessages); } } eNextState POP3C_GetOneMessagID(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; long HKLen; const char *HKey; void *vData; @@ -370,9 +426,10 @@ eNextState POP3C_GetOneMessagID(pop3aggr *RecvMsg) int rc; rc = TestValidateHash(RecvMsg->MsgNumbers); if (rc != 0) - syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc); + EVP3CCS_syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc); #endif - if(GetNextHashPos(RecvMsg->MsgNumbers, + if((RecvMsg->Pos != NULL) && + GetNextHashPos(RecvMsg->MsgNumbers, RecvMsg->Pos, &HKLen, &HKey, &vData)) @@ -386,7 +443,7 @@ eNextState POP3C_GetOneMessagID(pop3aggr *RecvMsg) } else { - RecvMsg->State++; + RecvMsg->State++; DeleteHashPos(&RecvMsg->Pos); /// done receiving uidls.. start looking them up now. RecvMsg->Pos = GetNewHashPos(RecvMsg->MsgNumbers, 0); @@ -398,11 +455,12 @@ eNextState POP3C_GetOneMessagID(pop3aggr *RecvMsg) eNextState POP3C_GetOneMessageIDState(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; #if 0 int rc; rc = TestValidateHash(RecvMsg->MsgNumbers); if (rc != 0) - syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc); + EVP3CCS_syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc); #endif POP3C_DBG_READ(); @@ -428,12 +486,14 @@ eNextState POP3C_GetOneMessageIDState(pop3aggr *RecvMsg) eNextState POP3C_SendGetOneMsg(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; long HKLen; const char *HKey; void *vData; RecvMsg->CurrMsg = NULL; - while (GetNextHashPos(RecvMsg->MsgNumbers, + while ((RecvMsg->Pos != NULL) && + GetNextHashPos(RecvMsg->MsgNumbers, RecvMsg->Pos, &HKLen, &HKey, &vData) && @@ -459,6 +519,7 @@ eNextState POP3C_SendGetOneMsg(pop3aggr *RecvMsg) eNextState POP3C_ReadMessageBodyFollowing(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; POP3C_DBG_READ(); if (!POP3C_OK) return eTerminateConnection; RecvMsg->IO.ReadMsg = NewAsyncMsg(HKEY("."), @@ -476,9 +537,9 @@ eNextState POP3C_StoreMsgRead(AsyncIO *IO) pop3aggr *RecvMsg = (pop3aggr *) IO->Data; struct UseTable ut; - syslog(LOG_DEBUG, - "MARKING: %s as seen: ", - ChrPtr(RecvMsg->CurrMsg->MsgUID)); + EVP3CCS_syslog(LOG_DEBUG, + "MARKING: %s as seen: ", + ChrPtr(RecvMsg->CurrMsg->MsgUID)); safestrncpy(ut.ut_msgid, ChrPtr(RecvMsg->CurrMsg->MsgUID), @@ -489,7 +550,7 @@ eNextState POP3C_StoreMsgRead(AsyncIO *IO) StrLength(RecvMsg->CurrMsg->MsgUID), &ut, sizeof(struct UseTable) ); - + StopDBWatchers(IO); return QueueEventContext(&RecvMsg->IO, POP3_C_ReAttachToFetchMessages); } eNextState POP3C_SaveMsg(AsyncIO *IO) @@ -511,20 +572,23 @@ eNextState POP3C_SaveMsg(AsyncIO *IO) } CtdlFreeMessage(RecvMsg->CurrMsg->Msg); + RecvMsg->count ++; return NextDBOperation(&RecvMsg->IO, POP3C_StoreMsgRead); } eNextState POP3C_ReadMessageBody(pop3aggr *RecvMsg) { - syslog(LOG_DEBUG, "Converting message...\n"); + AsyncIO *IO = &RecvMsg->IO; + EVP3CM_syslog(LOG_DEBUG, "Converting message..."); RecvMsg->CurrMsg->Msg = convert_internet_message_buf(&RecvMsg->IO.ReadMsg->MsgBuf); - + StopClientWatchers(IO, 0); return QueueDBOperation(&RecvMsg->IO, POP3C_SaveMsg); } eNextState POP3C_SendDelete(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; if (!RecvMsg->keep) { StrBufPrintf(RecvMsg->IO.SendBuf.Buf, "DELE %ld\r\n", RecvMsg->CurrMsg->MSGID); @@ -538,6 +602,7 @@ eNextState POP3C_SendDelete(pop3aggr *RecvMsg) } eNextState POP3C_ReadDeleteState(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; POP3C_DBG_READ(); RecvMsg->State = GetOneMessageIDState; return eReadMessage; @@ -545,6 +610,7 @@ eNextState POP3C_ReadDeleteState(pop3aggr *RecvMsg) eNextState POP3C_SendQuit(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; /* Log out */ StrBufPlain(RecvMsg->IO.SendBuf.Buf, HKEY("QUIT\r\n3)")); @@ -555,6 +621,7 @@ eNextState POP3C_SendQuit(pop3aggr *RecvMsg) eNextState POP3C_ReadQuitState(pop3aggr *RecvMsg) { + AsyncIO *IO = &RecvMsg->IO; POP3C_DBG_READ(); return eTerminateConnection; } @@ -627,9 +694,10 @@ const long POP3_C_ReadTimeouts[] = { void POP3SetTimeout(eNextState NextTCPState, pop3aggr *pMsg) { + AsyncIO *IO = &pMsg->IO; double Timeout = 0.0; - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); + EVP3C_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); switch (NextTCPState) { case eSendFile: @@ -673,7 +741,7 @@ void POP3SetTimeout(eNextState NextTCPState, pop3aggr *pMsg) } eNextState POP3_C_DispatchReadDone(AsyncIO *IO) { - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); +/* EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); to noisy anyways. */ pop3aggr *pMsg = IO->Data; eNextState rc; @@ -685,10 +753,10 @@ eNextState POP3_C_DispatchReadDone(AsyncIO *IO) } eNextState POP3_C_DispatchWriteDone(AsyncIO *IO) { - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); pop3aggr *pMsg = IO->Data; eNextState rc; +/* EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); to noisy anyways. */ rc = POP3C_SendHandlers[pMsg->State](pMsg); POP3SetTimeout(rc, pMsg); return rc; @@ -702,7 +770,7 @@ eNextState POP3_C_Terminate(AsyncIO *IO) { /// pop3aggr *pMsg = (pop3aggr *)IO->Data; - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); + EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); FinalizePOP3AggrRun(IO); return eAbort; } @@ -710,7 +778,7 @@ eNextState POP3_C_TerminateDB(AsyncIO *IO) { /// pop3aggr *pMsg = (pop3aggr *)IO->Data; - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); + EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); FinalizePOP3AggrRun(IO); return eAbort; } @@ -718,7 +786,7 @@ eNextState POP3_C_Timeout(AsyncIO *IO) { pop3aggr *pMsg = IO->Data; - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); + EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); StrBufPlain(IO->ErrMsg, CKEY(POP3C_ReadErrors[pMsg->State])); return FailAggregationRun(IO); } @@ -726,7 +794,7 @@ eNextState POP3_C_ConnFail(AsyncIO *IO) { pop3aggr *pMsg = (pop3aggr *)IO->Data; - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); + EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); StrBufPlain(IO->ErrMsg, CKEY(POP3C_ReadErrors[pMsg->State])); return FailAggregationRun(IO); } @@ -734,13 +802,13 @@ eNextState POP3_C_DNSFail(AsyncIO *IO) { pop3aggr *pMsg = (pop3aggr *)IO->Data; - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); + EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); StrBufPlain(IO->ErrMsg, CKEY(POP3C_ReadErrors[pMsg->State])); return FailAggregationRun(IO); } eNextState POP3_C_Shutdown(AsyncIO *IO) { - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); + EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); //// pop3aggr *pMsg = IO->Data; ////pMsg->MyQEntry->Status = 3; @@ -789,7 +857,7 @@ eNextState POP3_C_ReAttachToFetchMessages(AsyncIO *IO) { pop3aggr *cpptr = IO->Data; - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); + EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); ////??? cpptr->State ++; if (cpptr->Pos == NULL) cpptr->Pos = GetNewHashPos(cpptr->MsgNumbers, 0); @@ -802,7 +870,12 @@ eNextState POP3_C_ReAttachToFetchMessages(AsyncIO *IO) eNextState pop3_connect_ip(AsyncIO *IO) { - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); + pop3aggr *cpptr = IO->Data; + + if (cpptr->IOStart == 0.0) /* whith or without DNS? */ + cpptr->IOStart = IO->Now; + + EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); return EvConnectSock(IO, POP3_C_ConnTimeout, @@ -852,23 +925,17 @@ eNextState pop3_get_one_host_ip_done(AsyncIO *IO) eNextState pop3_get_one_host_ip(AsyncIO *IO) { pop3aggr *cpptr = IO->Data; - /* - * here we start with the lookup of one host. it might be... - * - the relay host *sigh* - * - the direct hostname if there was no mx record - * - one of the mx'es - */ - InitC_ares_dns(IO); + cpptr->IOStart = IO->Now; - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); + EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); - syslog(LOG_DEBUG, - "POP3 client[%ld]: looking up %s-Record %s : %d ...\n", - cpptr->n, - (cpptr->IO.ConnectMe->IPv6)? "aaaa": "a", - cpptr->IO.ConnectMe->Host, - cpptr->IO.ConnectMe->Port); + EVP3CCS_syslog(LOG_DEBUG, + "POP3 client[%ld]: looking up %s-Record %s : %d ...\n", + cpptr->n, + (cpptr->IO.ConnectMe->IPv6)? "aaaa": "a", + cpptr->IO.ConnectMe->Host, + cpptr->IO.ConnectMe->Port); QueueQuery((cpptr->IO.ConnectMe->IPv6)? ns_t_aaaa : ns_t_a, cpptr->IO.ConnectMe->Host, @@ -883,7 +950,9 @@ eNextState pop3_get_one_host_ip(AsyncIO *IO) int pop3_do_fetching(pop3aggr *cpptr) { - InitIOStruct(&cpptr->IO, + AsyncIO *IO = &cpptr->IO; + + InitIOStruct(IO, cpptr, eReadMessage, POP3_C_ReadServerStatus, @@ -934,11 +1003,12 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data) pthread_mutex_lock(&POP3QueueMutex); if (GetHash(POP3QueueRooms, LKEY(qrbuf->QRnumber), &vptr)) { - syslog(LOG_DEBUG, - "pop3client: [%ld] %s already in progress.\n", + pthread_mutex_unlock(&POP3QueueMutex); + EVP3CQ_syslog(LOG_DEBUG, + "pop3client: [%ld] %s already in progress.", qrbuf->QRnumber, qrbuf->QRname); - pthread_mutex_unlock(&POP3QueueMutex); + return; } pthread_mutex_unlock(&POP3QueueMutex); @@ -957,10 +1027,10 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data) if (server_shutting_down) return; if (fstat(fd, &statbuf) == -1) { - syslog(LOG_DEBUG, - "ERROR: could not stat configfile '%s' - %s\n", - filename, - strerror(errno)); + EVP3CQ_syslog(LOG_INFO, + "ERROR: could not stat configfile '%s' - %s", + filename, + strerror(errno)); return; } if (server_shutting_down) @@ -969,7 +1039,8 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data) if (StrBufReadBLOB(CfgData, &fd, 1, statbuf.st_size, &Err) < 0) { close(fd); FreeStrBuf(&CfgData); - syslog(LOG_DEBUG, "ERROR: reading config '%s' - %s
\n", + EVP3CQ_syslog(LOG_INFO, + "ERROR: reading config '%s' - %s", filename, strerror(errno)); return; } @@ -992,7 +1063,6 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data) if (!strcasecmp("pop3client", ChrPtr(CfgType))) { pop3aggr *cptr; - StrBuf *Tmp; /* if (Count == NULL) { @@ -1011,9 +1081,10 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data) cptr->pop3pass = NewStrBufPlain(NULL, StrLength(Line)); cptr->Url = NewStrBuf(); - Tmp = NewStrBuf(); + cptr->Host = + NewStrBufPlain(NULL, StrLength(Line)); - StrBufExtract_NextToken(Tmp, Line, &lPtr, '|'); + StrBufExtract_NextToken(cptr->Host, Line, &lPtr, '|'); StrBufExtract_NextToken(cptr->pop3user, Line, &lPtr, @@ -1032,12 +1103,15 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data) &lPtr, '|'); - StrBufPrintf(cptr->Url, "pop3://%s:%s@%s/%s", - ChrPtr(cptr->pop3user), - ChrPtr(cptr->pop3pass), - ChrPtr(Tmp), - ChrPtr(cptr->RoomName)); - FreeStrBuf(&Tmp); + StrBufAppendBufPlain(cptr->Url, HKEY("pop3://"), 0); + StrBufUrlescUPAppend(cptr->Url, cptr->pop3user, NULL); + StrBufAppendBufPlain(cptr->Url, HKEY(":"), 0); + StrBufUrlescUPAppend(cptr->Url, cptr->pop3pass, NULL); + StrBufAppendBufPlain(cptr->Url, HKEY("@"), 0); + StrBufAppendBuf(cptr->Url, cptr->Host, 0); + StrBufAppendBufPlain(cptr->Url, HKEY("/"), 0); + StrBufUrlescAppend(cptr->Url, cptr->RoomName, NULL); + ParseURL(&cptr->IO.ConnectMe, cptr->Url, 110); @@ -1082,7 +1156,7 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data) } pthread_mutex_unlock(&RSSQueueMutex); #endif - + cptr->n = Pop3ClientID++; pthread_mutex_lock(&POP3QueueMutex); Put(POP3FetchUrls, SKEY(cptr->Url), @@ -1137,7 +1211,7 @@ void pop3client_scan(void) { if (doing_pop3client) return; doing_pop3client = 1; - syslog(LOG_DEBUG, "pop3client started"); + EVP3CQM_syslog(LOG_DEBUG, "pop3client started"); CtdlForEachRoom(pop3client_scan_room, NULL); pthread_mutex_lock(&POP3QueueMutex); @@ -1163,7 +1237,7 @@ void pop3client_scan(void) { DeleteHashPos(&it); pthread_mutex_unlock(&POP3QueueMutex); - syslog(LOG_DEBUG, "pop3client ended"); + EVP3CQM_syslog(LOG_DEBUG, "pop3client ended"); last_run = time(NULL); doing_pop3client = 0; } @@ -1177,6 +1251,13 @@ void pop3_cleanup(void) DeleteHash(&POP3QueueRooms); } + + +void LogDebugEnablePOP3Client(const int n) +{ + POP3ClientDebugEnabled = n; +} + CTDL_MODULE_INIT(pop3client) { if (!threading) @@ -1185,8 +1266,9 @@ CTDL_MODULE_INIT(pop3client) pthread_mutex_init(&POP3QueueMutex, NULL); POP3QueueRooms = NewHash(1, lFlathash); POP3FetchUrls = NewHash(1, NULL); - CtdlRegisterSessionHook(pop3client_scan, EVT_TIMER); + CtdlRegisterSessionHook(pop3client_scan, EVT_TIMER, PRIO_AGGR + 50); CtdlRegisterEVCleanupHook(pop3_cleanup); + CtdlRegisterDebugFlagHook(HKEY("pop3client"), LogDebugEnablePOP3Client, &POP3ClientDebugEnabled); } /* return our module id for the log */