X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fpop3client%2Fserv_pop3client.c;h=32426e0c3c3d148e3bf542b2bf8bd4584b9adffb;hb=7cced4381b0497cf3d99a489bbb1a4f5375ded32;hp=06b391e4b769c7a6bad254952a97abd682e1595c;hpb=fabb4ea2916a3d68c5f65e86e12ae27440dbbad9;p=citadel.git diff --git a/citadel/modules/pop3client/serv_pop3client.c b/citadel/modules/pop3client/serv_pop3client.c index 06b391e4b..32426e0c3 100644 --- a/citadel/modules/pop3client/serv_pop3client.c +++ b/citadel/modules/pop3client/serv_pop3client.c @@ -136,6 +136,9 @@ void DeletePOP3Aggregator(void *vptr) FreeStrBuf(&ptr->IO.SendBuf.Buf); FreeStrBuf(&ptr->IO.RecvBuf.Buf); DeleteAsyncMsg(&ptr->IO.ReadMsg); + ((struct CitContext*)ptr->IO.CitContext)->state = CON_IDLE; + ((struct CitContext*)ptr->IO.CitContext)->kill_me = 1; + FreeAsyncIOContents(&ptr->IO); free(ptr); } @@ -145,6 +148,7 @@ typedef eNextState(*Pop3ClientHandler)(pop3aggr* RecvMsg); eNextState POP3_C_Shutdown(AsyncIO *IO); eNextState POP3_C_Timeout(AsyncIO *IO); eNextState POP3_C_ConnFail(AsyncIO *IO); +eNextState POP3_C_DNSFail(AsyncIO *IO); eNextState POP3_C_DispatchReadDone(AsyncIO *IO); eNextState POP3_C_DispatchWriteDone(AsyncIO *IO); eNextState POP3_C_Terminate(AsyncIO *IO); @@ -161,8 +165,8 @@ eNextState FinalizePOP3AggrRun(AsyncIO *IO) It = GetNewHashPos(POP3FetchUrls, 0); pthread_mutex_lock(&POP3QueueMutex); { - GetHashPosFromKey(POP3FetchUrls, SKEY(cptr->Url), It); - DeleteEntryFromHash(POP3FetchUrls, It); + if (GetHashPosFromKey(POP3FetchUrls, SKEY(cptr->Url), It)) + DeleteEntryFromHash(POP3FetchUrls, It); } pthread_mutex_unlock(&POP3QueueMutex); DeleteHashPos(&It); @@ -322,7 +326,7 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO) cdb_store(CDB_USETABLE, SKEY(RecvMsg->CurrMsg->MsgUID), &ut, sizeof(struct UseTable) ); - RecvMsg->CurrMsg->NeedFetch = 1; ////TODO0; + RecvMsg->CurrMsg->NeedFetch = 0; ////TODO0; } else { @@ -592,6 +596,7 @@ void POP3SetTimeout(eNextState NextTCPState, pop3aggr *pMsg) syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); switch (NextTCPState) { + case eSendFile: case eSendReply: case eSendMore: Timeout = POP3_C_SendTimeouts[pMsg->State]; @@ -602,6 +607,7 @@ void POP3SetTimeout(eNextState NextTCPState, pop3aggr *pMsg) } */ break; + case eReadFile: case eReadMessage: Timeout = POP3_C_ReadTimeouts[pMsg->State]; /* @@ -680,6 +686,14 @@ eNextState POP3_C_ConnFail(AsyncIO *IO) StrBufPlain(IO->ErrMsg, CKEY(POP3C_ReadErrors[pMsg->State])); return FailAggregationRun(IO); } +eNextState POP3_C_DNSFail(AsyncIO *IO) +{ + pop3aggr *pMsg = (pop3aggr *)IO->Data; + + 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__); @@ -708,12 +722,14 @@ eReadState POP3_C_ReadServerStatus(AsyncIO *IO) case eAbort: Finished = eReadFail; break; + case eSendFile: case eSendReply: case eSendMore: case eReadMore: case eReadMessage: Finished = StrBufChunkSipLine(IO->IOBuf, &IO->RecvBuf); break; + case eReadFile: case eReadPayload: Finished = CtdlReadMessageBodyAsync(IO); break; @@ -739,24 +755,17 @@ eNextState POP3_C_ReAttachToFetchMessages(AsyncIO *IO) return IO->NextState; } -eNextState connect_ip(AsyncIO *IO) +eNextState pop3_connect_ip(AsyncIO *IO) { - pop3aggr *cpptr = IO->Data; - syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); - -//// IO->ConnectMe = &cpptr->Pop3Host; - /* Bypass the ns lookup result like this: IO->Addr.sin_addr.s_addr = inet_addr("127.0.0.1"); */ - /////// SetConnectStatus(IO); - - return InitEventIO(IO, cpptr, - POP3_C_ConnTimeout, - POP3_C_ReadTimeouts[0], - 1); + return EvConnectSock(IO, + POP3_C_ConnTimeout, + POP3_C_ReadTimeouts[0], + 1); } -eNextState get_one_host_ip_done(AsyncIO *IO) +eNextState pop3_get_one_host_ip_done(AsyncIO *IO) { pop3aggr *cpptr = IO->Data; struct hostent *hostent; @@ -787,13 +796,13 @@ eNextState get_one_host_ip_done(AsyncIO *IO) addr->sin_port = htons(DefaultPOP3Port); } - return connect_ip(IO); + return pop3_connect_ip(IO); } else return eAbort; } -eNextState get_one_host_ip(AsyncIO *IO) +eNextState pop3_get_one_host_ip(AsyncIO *IO) { pop3aggr *cpptr = IO->Data; /* @@ -818,7 +827,7 @@ eNextState get_one_host_ip(AsyncIO *IO) cpptr->IO.ConnectMe->Host, &cpptr->IO, &cpptr->HostLookup, - get_one_host_ip_done); + pop3_get_one_host_ip_done); IO->NextState = eReadDNSReply; return IO->NextState; } @@ -827,39 +836,29 @@ eNextState get_one_host_ip(AsyncIO *IO) int pop3_do_fetching(pop3aggr *cpptr) { - CitContext *SubC; - - cpptr->IO.Data = cpptr; - - cpptr->IO.SendDone = POP3_C_DispatchWriteDone; - cpptr->IO.ReadDone = POP3_C_DispatchReadDone; - cpptr->IO.Terminate = POP3_C_Terminate; - cpptr->IO.LineReader = POP3_C_ReadServerStatus; - cpptr->IO.ConnFail = POP3_C_ConnFail; - cpptr->IO.Timeout = POP3_C_Timeout; - cpptr->IO.ShutdownAbort = POP3_C_Shutdown; - - cpptr->IO.SendBuf.Buf = NewStrBufPlain(NULL, 1024); - cpptr->IO.RecvBuf.Buf = NewStrBufPlain(NULL, 1024); - cpptr->IO.IOBuf = NewStrBuf(); - - cpptr->IO.NextState = eReadMessage; -/* TODO - syslog(LOG_DEBUG, "POP3: %s %s %s \n", roomname, pop3host, pop3user); - syslog(LOG_DEBUG, "Connecting to <%s>\n", pop3host); -*/ - - SubC = CloneContext (&pop3_client_CC); - SubC->session_specific_data = (char*) cpptr; - cpptr->IO.CitContext = SubC; + InitIOStruct(&cpptr->IO, + cpptr, + eReadMessage, + POP3_C_ReadServerStatus, + POP3_C_DNSFail, + POP3_C_DispatchWriteDone, + POP3_C_DispatchReadDone, + POP3_C_Terminate, + POP3_C_ConnFail, + POP3_C_Timeout, + POP3_C_Shutdown); + + safestrncpy(((CitContext *)cpptr->IO.CitContext)->cs_host, + ChrPtr(cpptr->Url), + sizeof(((CitContext *)cpptr->IO.CitContext)->cs_host)); if (cpptr->IO.ConnectMe->IsIP) { QueueEventContext(&cpptr->IO, - connect_ip); + pop3_connect_ip); } - else { /* uneducated admin has chosen to add DNS to the equation... */ + else { QueueEventContext(&cpptr->IO, - get_one_host_ip); + pop3_get_one_host_ip); } return 1; } @@ -1029,11 +1028,10 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data) FreeStrBuf(&CfgData); } +static int doing_pop3client = 0; void pop3client_scan(void) { static time_t last_run = 0L; - static int doing_pop3client = 0; -/// struct pop3aggr *pptr; time_t fastest_scan; HashPos *it; long len; @@ -1041,6 +1039,8 @@ void pop3client_scan(void) { void *vrptr; pop3aggr *cptr; + become_session(&pop3_client_CC); + if (config.c_pop3_fastest < config.c_pop3_fetch) fastest_scan = config.c_pop3_fastest; else @@ -1097,6 +1097,7 @@ void pop3client_scan(void) { void pop3_cleanup(void) { /* citthread_mutex_destroy(&POP3QueueMutex); TODO */ + while (doing_pop3client != 0) ; DeleteHash(&POP3FetchUrls); DeleteHash(&POP3QueueRooms); }