]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/networkclient/serv_networkclient.c
find places which access information after the context is not owned anymore
[citadel.git] / citadel / modules / networkclient / serv_networkclient.c
index 2d57f90b75d8f2735de915cf4393b35a39167d2a..41ce83c041a05626a379a269928d939dd0cb8f19 100644 (file)
@@ -82,21 +82,21 @@ int NetworkClientDebugEnabled = 0;
 
 #define EVN_syslog(LEVEL, FORMAT, ...)                                 \
        NCDBGLOG(LEVEL) syslog(LEVEL,                                   \
-                              "IO[%ld]CC[%d]NW[%s][%ld]" FORMAT,       \
-                              IO->ID, CCID, NODE, N, __VA_ARGS__)
+                              "%s[%ld]CC[%d]NW[%s][%ld]" FORMAT,       \
+                              IOSTR, IO->ID, CCID, NODE, N, __VA_ARGS__)
 
 #define EVNM_syslog(LEVEL, FORMAT)                                     \
        NCDBGLOG(LEVEL) syslog(LEVEL,                                   \
-                              "IO[%ld]CC[%d]NW[%s][%ld]" FORMAT,       \
-                              IO->ID, CCID, NODE, N)
+                              "%s[%ld]CC[%d]NW[%s][%ld]" FORMAT,       \
+                              IOSTR, IO->ID, CCID, NODE, N)
 
 #define EVNCS_syslog(LEVEL, FORMAT, ...) \
-       NCDBGLOG(LEVEL) syslog(LEVEL, "IO[%ld]NW[%s][%ld]" FORMAT,      \
-                              IO->ID, NODE, N, __VA_ARGS__)
+       NCDBGLOG(LEVEL) syslog(LEVEL, "%s[%ld]NW[%s][%ld]" FORMAT,      \
+                              IOSTR, IO->ID, NODE, N, __VA_ARGS__)
 
 #define EVNCSM_syslog(LEVEL, FORMAT) \
-       NCDBGLOG(LEVEL) syslog(LEVEL, "IO[%ld]NW[%s][%ld]" FORMAT,      \
-                              IO->ID, NODE, N)
+       NCDBGLOG(LEVEL) syslog(LEVEL, "%s[%ld]NW[%s][%ld]" FORMAT,      \
+                              IOSTR, IO->ID, NODE, N)
 
 
 typedef enum _eNWCState {
@@ -194,12 +194,14 @@ void DeleteNetworker(void *vptr)
 #define NWC_DBG_READ() EVN_syslog(LOG_DEBUG, ": < %s\n", ChrPtr(NW->IO.IOBuf))
 #define NWC_OK (strncasecmp(ChrPtr(NW->IO.IOBuf), "+OK", 3) == 0)
 
-eNextState SendFailureMessage(AsyncIO *IO)
+eNextState NWC_SendFailureMessage(AsyncIO *IO)
 {
        AsyncNetworker *NW = IO->Data;
        long lens[2];
        const char *strs[2];
 
+       EVN_syslog(LOG_DEBUG, "NWC: %s\n", __FUNCTION__);
+
        strs[0] = ChrPtr(NW->node);
        lens[0] = StrLength(NW->node);
        
@@ -242,8 +244,8 @@ eNextState NWC_ReadGreeting(AsyncNetworker *NW)
                             "Connected to node \"%s\" but I was expecting to connect to node \"%s\".",
                             connected_to, ChrPtr(NW->node));
                EVN_syslog(LOG_ERR, "%s\n", ChrPtr(NW->IO.ErrMsg));
-               StopClientWatchers(IO, 1);
-               return QueueDBOperation(IO, SendFailureMessage);
+
+               return EventQueueDBOperation(IO, NWC_SendFailureMessage, 1);
        }
        return eSendReply;
 }
@@ -286,8 +288,7 @@ eNextState NWC_ReadAuthReply(AsyncNetworker *NW)
                else {
                        SetNWCState(IO, eNWCVSAuthFailNTT);
                        EVN_syslog(LOG_ERR, "%s\n", ChrPtr(NW->IO.ErrMsg));
-                       StopClientWatchers(IO, 1);
-                       return QueueDBOperation(IO, SendFailureMessage);
+                       return EventQueueDBOperation(IO, NWC_SendFailureMessage, 1);
                }
                return eAbort;
        }
@@ -844,41 +845,37 @@ eReadState NWC_ReadServerStatus(AsyncIO *IO)
 eNextState NWC_FailNetworkConnection(AsyncIO *IO)
 {
        SetNWCState(IO, eNWCVSConnFail);
-       StopClientWatchers(IO, 1);
-       return QueueDBOperation(IO, SendFailureMessage);
+       return EventQueueDBOperation(IO, NWC_SendFailureMessage, 1);
 }
 
 void NWC_SetTimeout(eNextState NextTCPState, AsyncNetworker *NW)
 {
-       AsyncIO *IO = &NW->IO;
        double Timeout = 0.0;
 
-       EVN_syslog(LOG_DEBUG, "%s - %d\n", __FUNCTION__, NextTCPState);
+       //EVN_syslog(LOG_DEBUG, "%s - %d\n", __FUNCTION__, NextTCPState);
 
        switch (NextTCPState) {
-       case eSendReply:
        case eSendMore:
-               break;
-       case eReadFile:
+       case eSendReply:
        case eReadMessage:
                Timeout = NWC_ReadTimeouts[NW->State];
                break;
+       case eReadFile:
+       case eSendFile:
        case eReadPayload:
                Timeout = 100000;
-               /* TODO!!! */
                break;
        case eSendDNSQuery:
        case eReadDNSReply:
+       case eDBQuery:
+       case eReadMore:
        case eConnect:
-       case eSendFile:
-//TODO
        case eTerminateConnection:
-       case eDBQuery:
        case eAbort:
-       case eReadMore://// TODO
                return;
        }
        if (Timeout > 0) {
+               AsyncIO *IO = &NW->IO;
                EVN_syslog(LOG_DEBUG, 
                           "%s - %d %f\n",
                           __FUNCTION__,
@@ -896,9 +893,15 @@ eNextState NWC_DispatchReadDone(AsyncIO *IO)
        eNextState rc;
 
        rc = NWC_ReadHandlers[NW->State](NW);
-       if (rc != eReadMore)
+
+       if ((rc != eReadMore) &&
+           (rc != eAbort) && 
+           (rc != eDBQuery)) {
                NW->State++;
+       }
+
        NWC_SetTimeout(rc, NW);
+
        return rc;
 }
 eNextState NWC_DispatchWriteDone(AsyncIO *IO)