#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 DBGLOG(LEVEL) if ((LEVEL != LOG_DEBUG) || (POP3ClientDebugEnabled != 0))
+
+#define EVP3C_syslog(LEVEL, FORMAT, ...) \
+ DBGLOG(LEVEL) syslog(LEVEL, \
+ "IO[%ld]CC[%d][%ld]" FORMAT, \
+ IO->ID, CCID, N, __VA_ARGS__)
+
+#define EVP3CM_syslog(LEVEL, FORMAT) \
+ DBGLOG(LEVEL) syslog(LEVEL, \
+ "IO[%ld]CC[%d][%ld]" FORMAT, \
+ IO->ID, CCID, N)
+
+#define EVP3CCS_syslog(LEVEL, FORMAT, ...) \
+ DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]" FORMAT, \
+ IO->ID, N, __VA_ARGS__)
+
+#define EVP3CCSM_syslog(LEVEL, FORMAT) \
+ DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]" FORMAT, \
+ IO->ID, N)
+
+#define POP3C_DBG_SEND() \
+ EVP3C_syslog(LOG_DEBUG, \
+ "POP3: > %s\n", \
+ ChrPtr(RecvMsg->IO.SendBuf.Buf))
#define POP3C_DBG_READ() \
- syslog(LOG_DEBUG, \
- "POP3 client[%ld]: < %s\n", \
- RecvMsg->n, \
- ChrPtr(RecvMsg->IO.IOBuf))
+ EVP3C_syslog(LOG_DEBUG, \
+ "POP3: < %s\n", \
+ ChrPtr(RecvMsg->IO.IOBuf))
struct CitContext pop3_client_CC;
HashPos *It;
pop3aggr *cptr = (pop3aggr *)IO->Data;
- syslog(LOG_DEBUG, "Terminating Aggregator; bye.\n");
+ EVP3CM_syslog(LOG_DEBUG, "Terminating Aggregator; bye.\n");
It = GetNewHashPos(POP3FetchUrls, 0);
pthread_mutex_lock(&POP3QueueMutex);
eNextState POP3C_ReadGreeting(pop3aggr *RecvMsg)
{
+ AsyncIO *IO = &RecvMsg->IO;
POP3C_DBG_READ();
/* Read the server greeting */
if (!POP3C_OK) return eTerminateConnection;
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
eNextState POP3C_GetUserState(pop3aggr *RecvMsg)
{
+ AsyncIO *IO = &RecvMsg->IO;
POP3C_DBG_READ();
if (!POP3C_OK) return eTerminateConnection;
else return eSendReply;
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, "<PASS <password>\n");
+ EVP3CM_syslog(LOG_DEBUG, "<PASS <password>\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;
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();
eNextState POP3C_GetListCommandState(pop3aggr *RecvMsg)
{
+ AsyncIO *IO = &RecvMsg->IO;
POP3C_DBG_READ();
if (!POP3C_OK) return eTerminateConnection;
RecvMsg->MsgNumbers = NewHash(1, NULL);
eNextState POP3C_GetListOneLine(pop3aggr *RecvMsg)
{
+ AsyncIO *IO = &RecvMsg->IO;
#if 0
int rc;
#endif
/* 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;
eNextState POP3C_GetOneMessageIDState(pop3aggr *RecvMsg)
{
+ AsyncIO *IO = &RecvMsg->IO;
#if 0
int rc;
rc = TestValidateHash(RecvMsg->MsgNumbers);
eNextState POP3C_SendGetOneMsg(pop3aggr *RecvMsg)
{
+ AsyncIO *IO = &RecvMsg->IO;
long HKLen;
const char *HKey;
void *vData;
eNextState POP3C_ReadMessageBodyFollowing(pop3aggr *RecvMsg)
{
+ AsyncIO *IO = &RecvMsg->IO;
POP3C_DBG_READ();
if (!POP3C_OK) return eTerminateConnection;
RecvMsg->IO.ReadMsg = NewAsyncMsg(HKEY("."),
StrLength(RecvMsg->CurrMsg->MsgUID),
&ut,
sizeof(struct UseTable) );
-
+ StopDBWatchers(IO);
return QueueEventContext(&RecvMsg->IO, POP3_C_ReAttachToFetchMessages);
}
eNextState POP3C_SaveMsg(AsyncIO *IO)
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);
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);
}
eNextState POP3C_ReadDeleteState(pop3aggr *RecvMsg)
{
+ AsyncIO *IO = &RecvMsg->IO;
POP3C_DBG_READ();
RecvMsg->State = GetOneMessageIDState;
return eReadMessage;
eNextState POP3C_SendQuit(pop3aggr *RecvMsg)
{
+ AsyncIO *IO = &RecvMsg->IO;
/* Log out */
StrBufPlain(RecvMsg->IO.SendBuf.Buf,
HKEY("QUIT\r\n3)"));
eNextState POP3C_ReadQuitState(pop3aggr *RecvMsg)
{
+ AsyncIO *IO = &RecvMsg->IO;
POP3C_DBG_READ();
return eTerminateConnection;
}
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:
FinalizePOP3AggrRun(IO);
return eAbort;
}
+eNextState POP3_C_TerminateDB(AsyncIO *IO)
+{
+/// pop3aggr *pMsg = (pop3aggr *)IO->Data;
+
+ syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
+ FinalizePOP3AggrRun(IO);
+ return eAbort;
+}
eNextState POP3_C_Timeout(AsyncIO *IO)
{
pop3aggr *pMsg = IO->Data;
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);
syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
int pop3_do_fetching(pop3aggr *cpptr)
{
- InitIOStruct(&cpptr->IO,
+ AsyncIO *IO = &cpptr->IO;
+
+ InitIOStruct(IO,
cpptr,
eReadMessage,
POP3_C_ReadServerStatus,
POP3_C_DispatchWriteDone,
POP3_C_DispatchReadDone,
POP3_C_Terminate,
+ POP3_C_TerminateDB,
POP3_C_ConnFail,
POP3_C_Timeout,
POP3_C_Shutdown);
&lPtr,
'|');
- StrBufPrintf(cptr->Url, "pop3://%s:%s@%s/%s",
- ChrPtr(cptr->pop3user),
- ChrPtr(cptr->pop3pass),
- ChrPtr(Tmp),
- ChrPtr(cptr->RoomName));
+ 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, Tmp, 0);
+ StrBufAppendBufPlain(cptr->Url, HKEY("/"), 0);
+ StrBufUrlescAppend(cptr->Url, cptr->RoomName, NULL);
+
FreeStrBuf(&Tmp);
ParseURL(&cptr->IO.ConnectMe, cptr->Url, 110);
}
pthread_mutex_unlock(&RSSQueueMutex);
#endif
-
+ cptr->n = Pop3ClientID++;
pthread_mutex_lock(&POP3QueueMutex);
Put(POP3FetchUrls,
SKEY(cptr->Url),
DeleteHash(&POP3QueueRooms);
}
+
+
+void LogDebugEnablePOP3Client(const int n)
+{
+ POP3ClientDebugEnabled = n;
+}
+
CTDL_MODULE_INIT(pop3client)
{
if (!threading)
POP3FetchUrls = NewHash(1, NULL);
CtdlRegisterSessionHook(pop3client_scan, EVT_TIMER);
CtdlRegisterEVCleanupHook(pop3_cleanup);
+ CtdlRegisterDebugFlagHook(HKEY("pop3client"), LogDebugEnablePOP3Client, &POP3ClientDebugEnabled);
}
/* return our module id for the log */