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)
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;
}
}
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);
-
-/*
- * 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;
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;
UserListEntry* NewUserListOneEntry(StrBuf *SerializedUser)
{
+ const char *Pos;
UserListEntry *ul;
if (StrLength(SerializedUser) < 8)
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;
}
UserListEntry* NewUserListEntry(StrBuf *SerializedUserList)
{
+ const char *Pos = NULL;
UserListEntry *ul;
if (StrLength(SerializedUserList) < 8)
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;
}
/* 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) {
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 */
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));
}
-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;
FreeStrBuf(&Buf);
return 1;
}
- else
+ else {
+ FreeStrBuf(&Buf);
return 0;
+ }
}
/*
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;
}