* temporary solution to our ser_readln migration: have a buffer on the session, read...
authorWilfried Göesgens <willi@citadel.org>
Wed, 29 Apr 2009 21:42:05 +0000 (21:42 +0000)
committerWilfried Göesgens <willi@citadel.org>
Wed, 29 Apr 2009 21:42:05 +0000 (21:42 +0000)
* remove some more serv_readln's, add some more GetServerStatus'es

webcit/auth.c
webcit/context_loop.c
webcit/tcp_sockets.c
webcit/useredit.c
webcit/webcit.c
webcit/webcit.h
webcit/webserver.c
webcit/who.c

index 3f4a4e7833757e6e915c7eb6585d8bfbc03dbafe..56228f7b7fc41033aa698d6be51307f94d4a42b9 100644 (file)
@@ -153,7 +153,7 @@ void become_logged_in(const StrBuf *user, const StrBuf *pass, StrBuf *serv_respo
                const char *pch;
 
                pch = ChrPtr(Buf) + 4;
-               WCC->new_mail = StrBufExtractNext_long(Buf, &pch, '|');
+               WCC->new_mail  = StrBufExtractNext_long(Buf, &pch, '|');
                WCC->need_regi = StrBufExtractNext_long(Buf, &pch, '|');
                WCC->need_vali = StrBufExtractNext_long(Buf, &pch, '|');
                if (WCC->cs_inet_email == NULL)
index a85c87b8ef186c5c67fb530c7323954b6c280da8..39a85d5c94bd2392533d88849664257b2f91d12e 100644 (file)
@@ -54,6 +54,7 @@ void DestroySession(wcsession **sessions_to_kill)
        FreeStrBuf(&((*sessions_to_kill)->httpauth_pass));
        FreeStrBuf(&((*sessions_to_kill)->ImportantMsg));
        FreeStrBuf(&((*sessions_to_kill)->cs_inet_email));
+       FreeStrBuf(&((*sessions_to_kill)->MigrateReadLineBuf));
        free((*sessions_to_kill));
        (*sessions_to_kill) = NULL;
 }
@@ -516,6 +517,9 @@ void context_loop(int *sock)
                }
                else TheSession->httpauth_pass = NewStrBufPlain(httpauth_user, -1);
 
+               if (TheSession->MigrateReadLineBuf != NULL)
+                       FlushStrBuf(TheSession->MigrateReadLineBuf);
+               else TheSession->MigrateReadLineBuf = NewStrBuf();
                TheSession->CLineBuf = NewStrBuf();
                TheSession->hash_prefs = NewHash(1,NULL);       /* Get a hash table for the user preferences */
                pthread_mutex_init(&TheSession->SessionMutex, NULL);
index b1205c7e8dd2eb4f58878e3888406059b23b7c77..f4bb02d580b752af6482c5c3028b022b0e472ed9 100644 (file)
@@ -115,60 +115,6 @@ int tcp_connectsock(char *host, char *service)
 
 
 
-
-/*
- *  Input binary data from socket
- *  buf the buffer to get the input to
- *  bytes the maximal number of bytes to read
- */
-inline void _serv_read(char *buf, int bytes, wcsession *WCC)
-{
-       int len, rlen;
-
-       len = 0;
-       while ((len < bytes) && (WCC->serv_sock != -1)){
-               rlen = read(WCC->serv_sock, &buf[len], bytes - len);
-               if (rlen < 1) {
-                       lprintf(1, "Server connection broken: %s\n",
-                               strerror(errno));
-                       wc_backtrace();
-                       close(WCC->serv_sock);
-                       WCC->serv_sock = (-1);
-                       WCC->connected = 0;
-                       WCC->logged_in = 0;
-                       memset(buf, 0, bytes);
-                       return;
-               }
-               len = len + rlen;
-       }
-}
-
-/*
- *  input string from pipe
- */
-int serv_getln(char *strbuf, int bufsize)
-{
-       wcsession *WCC = WC;
-       int ch, len;
-       char buf[2];
-
-       WCC->ReadPos = NULL;
-       len = 0;
-       strbuf[0] = 0;
-       do {
-               _serv_read(&buf[0], 1, WCC);
-               ch = buf[0];
-               if ((ch != 13) && (ch != 10)) {
-                       strbuf[len++] = ch;
-               }
-       } while ((ch != 10) && (ch != 0) && (len < (bufsize-1)) && (WCC->serv_sock != -1));
-       strbuf[len] = 0;
-#ifdef SERV_TRACE
-       lprintf(9, "%3d>%s\n", WC->serv_sock, strbuf);
-#endif
-       return len;
-}
-
 int StrBuf_ServGetln(StrBuf *buf)
 {
        wcsession *WCC = WC;
@@ -189,6 +135,29 @@ int StrBuf_ServGetln(StrBuf *buf)
        return rc;
 }
 
+/*
+ *  input string from pipe
+ */
+int serv_getln(char *strbuf, int bufsize)
+{
+       wcsession *WCC = WC;
+       int len;
+       
+       WCC->ReadPos = NULL;
+
+       StrBuf_ServGetln(WCC->MigrateReadLineBuf);
+       len = StrLength(WCC->MigrateReadLineBuf);
+       if (len > bufsize)
+               len = bufsize - 1;
+       memcpy(strbuf, ChrPtr(WCC->MigrateReadLineBuf), len);
+       strbuf[len] = 0;
+#ifdef SERV_TRACE
+       lprintf(9, "%3d>%s\n", WC->serv_sock, strbuf);
+#endif
+       return len;
+}
+
+
 int StrBuf_ServGetlnBuffered(StrBuf *buf)
 {
        wcsession *WCC = WC;
index 4b3b0aeab559e3302c240298e5a7b204acb0991e..672dbc732aed6818c8e34db83fd239c90774dcb5 100644 (file)
@@ -36,6 +36,7 @@ typedef struct _UserListEntry {
 
 UserListEntry* NewUserListOneEntry(StrBuf *SerializedUser)
 {
+       const char *Pos;
        UserListEntry *ul;
 
        if (StrLength(SerializedUser) < 8) 
@@ -45,15 +46,15 @@ UserListEntry* NewUserListOneEntry(StrBuf *SerializedUser)
        ul->UserName = NewStrBuf();
        ul->Passvoid = NewStrBuf();
 
-       StrBufExtract_token(ul->UserName, SerializedUser, 0, '|');
-       StrBufExtract_token(ul->Passvoid, SerializedUser, 1, '|');
-       ul->Flags = (unsigned int)StrBufExtract_long(SerializedUser, 2, '|');
-       ul->nLogons = StrBufExtract_int(SerializedUser, 3, '|');
-       ul->nPosts = StrBufExtract_int(SerializedUser, 4, '|');
-       ul->AccessLevel = StrBufExtract_int(SerializedUser, 5, '|');
-       ul->UID = StrBufExtract_int(SerializedUser, 6, '|');
-       ul->LastLogonT = StrBufExtract_long(SerializedUser, 7, '|');
-       ul->DaysTillPurge = StrBufExtract_int(SerializedUser, 8, '|');
+       StrBufExtract_NextToken(ul->UserName,               SerializedUser, &Pos, '|');
+       StrBufExtract_NextToken(ul->Passvoid,               SerializedUser, &Pos, '|');
+       ul->Flags         = StrBufExtractNext_unsigned_long(SerializedUser, &Pos, '|');
+       ul->nLogons       = StrBufExtractNext_int(          SerializedUser, &Pos, '|');
+       ul->nPosts        = StrBufExtractNext_int(          SerializedUser, &Pos, '|');
+       ul->AccessLevel   = StrBufExtractNext_int(          SerializedUser, &Pos, '|');
+       ul->UID           = StrBufExtractNext_int(          SerializedUser, &Pos, '|');
+       ul->LastLogonT    = StrBufExtractNext_long(         SerializedUser, &Pos, '|');
+       ul->DaysTillPurge = StrBufExtractNext_int(          SerializedUser, &Pos, '|');
        return ul;
 }
 
@@ -68,6 +69,7 @@ void DeleteUserListEntry(void *vUserList)
 
 UserListEntry* NewUserListEntry(StrBuf *SerializedUserList)
 {
+       const char *Pos = NULL;
        UserListEntry *ul;
 
        if (StrLength(SerializedUserList) < 8) 
@@ -77,13 +79,13 @@ UserListEntry* NewUserListEntry(StrBuf *SerializedUserList)
        ul->UserName = NewStrBuf();
        ul->Passvoid = NewStrBuf();
 
-       StrBufExtract_token(ul->UserName, SerializedUserList, 0, '|');
-       ul->AccessLevel = StrBufExtract_int(SerializedUserList, 1, '|');
-       ul->UID = StrBufExtract_int(SerializedUserList, 2, '|');
-       ul->LastLogonT = StrBufExtract_long(SerializedUserList, 3, '|');
-       ul->nLogons = StrBufExtract_int(SerializedUserList, 4, '|');
-       ul->nPosts = StrBufExtract_int(SerializedUserList, 5, '|');
-       StrBufExtract_token(ul->Passvoid, SerializedUserList, 6, '|');
+       StrBufExtract_NextToken(ul->UserName,    SerializedUserList, &Pos, '|');
+       ul->AccessLevel = StrBufExtractNext_int( SerializedUserList, &Pos, '|');
+       ul->UID         = StrBufExtractNext_int( SerializedUserList, &Pos, '|');
+       ul->LastLogonT  = StrBufExtractNext_long(SerializedUserList, &Pos, '|');
+       ul->nLogons     = StrBufExtractNext_int( SerializedUserList, &Pos, '|');
+       ul->nPosts      = StrBufExtractNext_int( SerializedUserList, &Pos, '|');
+       StrBufExtract_NextToken(ul->Passvoid,    SerializedUserList, &Pos, '|');
        ul->Flags = 0;
        ul->DaysTillPurge = -1;
        return ul;
index 31d5197b6a8934b0498fd1bd9d180495bda4bd94..dcef892e63f61d50ca48e42036c09b7f512ecf78 100644 (file)
@@ -805,7 +805,7 @@ void session_loop(HashList *HTTPHeaders,
        }
 
        /* If the client sent a nonce that is incorrect, kill the request. */
-       if (strlen(bstr("nonce")) > 0) {
+       if (havebstr("nonce")) {
                lprintf(9, "Comparing supplied nonce %s to session nonce %ld\n", 
                        bstr("nonce"), WCC->nonce);
                if (ibstr("nonce") != WCC->nonce) {
index 3f73d9fa763984c176a025d76b802b7ca07e729b..a2bc143358a66e1109af76dec8733448eda25433 100644 (file)
@@ -347,6 +347,7 @@ struct wcsession {
        int http_sock;                          /**< HTTP server socket */
        int serv_sock;                          /**< Client socket to Citadel server */
        StrBuf *ReadBuf;                        /**< here we keep our stuff while reading linebuffered from the server. */
+       StrBuf *MigrateReadLineBuf;             /**< here we buffer legacy server read stuff */
        const char *ReadPos;                    /**< whats our read position in ReadBuf? */
        int chat_sock;                          /**< Client socket to Citadel server - for chat */
        time_t lastreq;                         /**< Timestamp of most recent HTTP */
index ac21038e7bd1a1d11a156b900624ea6412f43404..74bff8c4812c2627fd3c88e7d5103c813ffa6d7d 100644 (file)
@@ -275,13 +275,10 @@ long end_burst(void)
         fd_set wset;
         int fdflags;
 
-       //#ifdef HAVE_ZLIB
-       /* Perform gzip compression, if enabled and supported by client */
        if (!DisableGzip && (WCC->gzip_ok) && CompressBuffer(WCC->WBuf))
        {
                hprintf("Content-encoding: gzip\r\n");
        }
-       //#endif        /* HAVE_ZLIB */
 
        hprintf("Content-length: %d\r\n\r\n", StrLength(WCC->WBuf));
 
index 320ef01538701f61f988376210b9bc24c089bc45..f93d9624d93cf67aa5961488512d769b1cc16c31 100644 (file)
@@ -40,20 +40,17 @@ int CompareUserStruct(const void *VUser1, const void *VUser2)
 }
 
 
-int GetWholistSection(HashList *List, time_t now)
+int GetWholistSection(HashList *List, time_t now, StrBuf *Buf)
 {
-       StrBuf *Buf;
        wcsession *WCC = WC;
        UserStateStruct *User, *OldUser;
        void *VOldUser;
        size_t BufLen;
-       char buf[SIZ];
        const char *Pos;
 
        serv_puts("RWHO");
-       serv_getln(buf, sizeof buf);
-       if (buf[0] == '1') {
-               Buf = NewStrBuf();
+       StrBuf_ServGetlnBuffered(Buf);
+       if (GetServerStatus(Buf, NULL) == 1) {
                while (BufLen = StrBuf_ServGetlnBuffered(Buf), strcmp(ChrPtr(Buf), "000")) {
                        if (BufLen <= 0)
                            continue;
@@ -111,8 +108,10 @@ int GetWholistSection(HashList *List, time_t now)
                FreeStrBuf(&Buf);
                return 1;
        }
-       else
+       else {
+               FreeStrBuf(&Buf);
                return 0;
+       }
 }
 
 /*
@@ -216,21 +215,25 @@ void _terminate_session(void) {
 HashList *GetWholistHash(StrBuf *Target, WCTemplputParams *TP)
 
 {
+       StrBuf *Buf;
        HashList *List;
-       char buf[SIZ];
         time_t now;
 
+       Buf = NewStrBuf();
+
        serv_puts("TIME");
-       serv_getln(buf, sizeof buf);
-       if (buf[0] == '2') {
-               now = extract_long(&buf[4], 0);
+       StrBuf_ServGetlnBuffered(Buf);
+       if (GetServerStatus(Buf, NULL)  == 2) {
+               const char *pos = ChrPtr(Buf) + 4;
+               now = StrBufExtractNext_long(Buf, &pos, '|');
        }
        else {
                now = time(NULL);
        }
 
        List = NewHash(1, NULL);
-       GetWholistSection(List, now);
+       GetWholistSection(List, now, Buf);
+       FreeStrBuf(&Buf);
        return List;
 }