From f4f1153a964cf70beeafb637d60b3827f327418b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Wed, 29 Apr 2009 21:42:05 +0000 Subject: [PATCH] * temporary solution to our ser_readln migration: have a buffer on the session, read there to, and copy it over then. * remove some more serv_readln's, add some more GetServerStatus'es --- webcit/auth.c | 2 +- webcit/context_loop.c | 4 +++ webcit/tcp_sockets.c | 77 +++++++++++++------------------------------ webcit/useredit.c | 34 ++++++++++--------- webcit/webcit.c | 2 +- webcit/webcit.h | 1 + webcit/webserver.c | 3 -- webcit/who.c | 27 ++++++++------- 8 files changed, 63 insertions(+), 87 deletions(-) diff --git a/webcit/auth.c b/webcit/auth.c index 3f4a4e783..56228f7b7 100644 --- a/webcit/auth.c +++ b/webcit/auth.c @@ -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) diff --git a/webcit/context_loop.c b/webcit/context_loop.c index a85c87b8e..39a85d5c9 100644 --- a/webcit/context_loop.c +++ b/webcit/context_loop.c @@ -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); diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index b1205c7e8..f4bb02d58 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -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; diff --git a/webcit/useredit.c b/webcit/useredit.c index 4b3b0aeab..672dbc732 100644 --- a/webcit/useredit.c +++ b/webcit/useredit.c @@ -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; diff --git a/webcit/webcit.c b/webcit/webcit.c index 31d5197b6..dcef892e6 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -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) { diff --git a/webcit/webcit.h b/webcit/webcit.h index 3f73d9fa7..a2bc14335 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -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 */ diff --git a/webcit/webserver.c b/webcit/webserver.c index ac21038e7..74bff8c48 100644 --- a/webcit/webserver.c +++ b/webcit/webserver.c @@ -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)); diff --git a/webcit/who.c b/webcit/who.c index 320ef0153..f93d9624d 100644 --- a/webcit/who.c +++ b/webcit/who.c @@ -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; } -- 2.30.2