From: Wilfried Göesgens Date: Sun, 3 Aug 2008 18:06:36 +0000 (+0000) Subject: * migrate bstr backend to strbuf X-Git-Tag: v7.86~2055 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=5b8eae516c5277a1409378676151f2cc6083df1d * migrate bstr backend to strbuf * add more DBG_* defines around hash log printers * create ENT0 headers with strbuf --- diff --git a/webcit/auth.c b/webcit/auth.c index 41489194a..db5ed181c 100644 --- a/webcit/auth.c +++ b/webcit/auth.c @@ -412,7 +412,7 @@ void finalize_openid_login(void) while (GetNextHashPos(WCC->urlstrings, Cursor, &HKLen, &HKey, &U)) { u = (urlcontent*) U; if (!strncasecmp(u->url_key, "openid.", 7)) { - serv_printf("%s|%s", &u->url_key[7], u->url_data); + serv_printf("%s|%s", &u->url_key[7], ChrPtr(u->url_data)); } } diff --git a/webcit/iconbar.c b/webcit/iconbar.c index bbc0b9f31..665272c7b 100644 --- a/webcit/iconbar.c +++ b/webcit/iconbar.c @@ -42,12 +42,14 @@ long IconbarIsENABLED(const char *key, size_t keylen, long defval) return defval; } +#ifdef DBG_ICONBAR_HASH static char nbuf[32]; inline const char *PrintInt(void *Prefstr) { snprintf(nbuf, sizeof(nbuf), "%ld", (long)Prefstr); return nbuf; } +#endif void LoadIconSettings(void) { @@ -79,7 +81,10 @@ void LoadIconSettings(void) (void*)val, DontDeleteThis); } } + +#ifdef DBG_ICONBAR_HASH dbg_PrintHash(WCC->IconBarSetttings, PrintInt, NULL); +#endif FreeStrBuf(&key); FreeStrBuf(&buf); @@ -792,7 +797,9 @@ void commit_iconbar(void) { "choices to continue.")); wprintf("\n"); wDumpContent(2); +#ifdef DBG_ICONBAR_HASH dbg_PrintHash(WC->IconBarSetttings, PrintInt, NULL); +#endif } diff --git a/webcit/messages.c b/webcit/messages.c index 19806559a..1b5351235 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -3084,33 +3084,24 @@ void post_mime_to_server(void) { */ void post_message(void) { - urlcontent *u; - void *U; char buf[1024]; - char *encoded_subject = NULL; + StrBuf *encoded_subject = NULL; static long dont_post = (-1L); struct wc_attachment *att, *aptr; int is_anonymous = 0; - const char *display_name; - long dpLen = 0; + const StrBuf *display_name = NULL; struct wcsession *WCC = WC; - char *ptr = NULL; - + if (havebstr("force_room")) { gotoroom(bstr("force_room")); } - if (GetHash(WC->urlstrings, HKEY("display_name"), &U)) { - u = (urlcontent*) U; - display_name = u->url_data; - dpLen = u->url_data_size; - } - else { - display_name=""; - } - if (!strcmp(display_name, "__ANONYMOUS__")) { - display_name = ""; - is_anonymous = 1; + if (havebstr("display_name")) { + display_name = sbstr("display_name"); + if (!strcmp(ChrPtr(display_name), "__ANONYMOUS__")) { + display_name = NULL; + is_anonymous = 1; + } } if (WCC->upload_length > 0) { @@ -3169,71 +3160,65 @@ void post_message(void) "saved this message.")); } else { const char CMD[] = "ENT0 1|%s|%d|4|%s|%s||%s|%s|%s|%s|%s"; - const char *Recp = ""; - const char *Cc = ""; - const char *Bcc = ""; - const char *Wikipage = ""; - const char *my_email_addr = ""; - char *CmdBuf = NULL;; - long len = 0; - size_t nLen; - char references[SIZ] = ""; - size_t references_len = 0; - - safestrncpy(references, bstr("references"), sizeof references); - lprintf(9, "Converting: %s\n", references); - for (ptr=references; *ptr != 0; ++ptr) { - if (*ptr == '|') *ptr = '!'; - ++references_len; - } - lprintf(9, "Converted: %s\n", references); - + const StrBuf *Recp = NULL; + const StrBuf *Cc = NULL; + const StrBuf *Bcc = NULL; + const StrBuf *Wikipage = NULL; + const StrBuf *my_email_addr = NULL; + StrBuf *CmdBuf = NULL;; + StrBuf *references = NULL; + + if (havebstr("references")) + { + const StrBuf *ref = sbstr("references"); + references = NewStrBufPlain(ChrPtr(ref), StrLength(ref)); + lprintf(9, "Converting: %s\n", ChrPtr(references)); + StrBufReplaceChars(references, '|', '!'); + lprintf(9, "Converted: %s\n", ChrPtr(references)); + } if (havebstr("subject")) { - char *Subj; - size_t SLen; + const StrBuf *Subj; /* * make enough room for the encoded string; * plus the QP header */ - Subj = xbstr("subject", &SLen); - len = SLen * 3 + 32; - encoded_subject = malloc (len); - len = webcit_rfc2047encode(encoded_subject, len, Subj, SLen); - if (len < 0) { - free (encoded_subject); - return; - } - } - len += sizeof (CMD) + dpLen; - Recp = xbstr("recp", &nLen); - len += nLen; - Cc = xbstr("cc", &nLen); - len += nLen; - Bcc = xbstr("bcc", &nLen); - len += nLen; - Wikipage = xbstr("wikipage", &nLen); - len += nLen; - my_email_addr = xbstr("my_email_addr", &nLen); - len += nLen; - len += references_len; - - CmdBuf = (char*) malloc (len + 11); - - snprintf(CmdBuf, len + 1, CMD, - Recp, - is_anonymous, - (encoded_subject ? encoded_subject : ""), - display_name, - Cc, - Bcc, - Wikipage, - my_email_addr, - references); + Subj = sbstr("subject"); + + StrBufRFC2047encode(&encoded_subject, Subj); + } + Recp = sbstr("recp"); + Cc = sbstr("cc"); + Bcc = sbstr("bcc"); + Wikipage = sbstr("wikipage"); + my_email_addr = sbstr("my_email_addr"); + + CmdBuf = NewStrBufPlain(NULL, + sizeof (CMD) + + StrLength(Recp) + + StrLength(encoded_subject) + + StrLength(Cc) + + StrLength(Bcc) + + StrLength(Wikipage) + + StrLength(my_email_addr) + + StrLength(references)); + + StrBufPrintf(CmdBuf, + CMD, + ChrPtr(Recp), + is_anonymous, + ChrPtr(encoded_subject), + ChrPtr(display_name), + ChrPtr(Cc), + ChrPtr(Bcc), + ChrPtr(Wikipage), + ChrPtr(my_email_addr), + ChrPtr(references)); + lprintf(9, "%s\n", CmdBuf); - serv_puts(CmdBuf); + serv_puts(ChrPtr(CmdBuf)); serv_getln(buf, sizeof buf); - free (CmdBuf); - if (encoded_subject) free(encoded_subject); + FreeStrBuf(&CmdBuf); + FreeStrBuf(&encoded_subject); if (buf[0] == '4') { post_mime_to_server(); if ( (havebstr("recp")) @@ -3289,14 +3274,13 @@ void display_enter(void) char buf[SIZ]; StrBuf *ebuf; long now; - char *display_name; + const StrBuf *display_name = NULL; struct wc_attachment *att; int recipient_required = 0; int subject_required = 0; int recipient_bad = 0; int is_anonymous = 0; long existing_page = (-1L); - size_t dplen; struct wcsession *WCC = WC; now = time(NULL); @@ -3305,10 +3289,9 @@ void display_enter(void) gotoroom(bstr("force_room")); } - display_name = xbstr("display_name", &dplen); - if (!strcmp(display_name, "__ANONYMOUS__")) { - display_name = ""; - dplen = 0; + display_name = sbstr("display_name"); + if (!strcmp(ChrPtr(display_name), "__ANONYMOUS__")) { + display_name = NULL; is_anonymous = 1; } @@ -3370,34 +3353,37 @@ void display_enter(void) /* Now check our actual recipients if there are any */ if (recipient_required) { - const char *Recp = ""; - const char *Cc = ""; - const char *Bcc = ""; - const char *Wikipage = ""; - char *CmdBuf = NULL;; - size_t len = 0; - size_t nLen; + const StrBuf *Recp = NULL; + const StrBuf *Cc = NULL; + const StrBuf *Bcc = NULL; + const StrBuf *Wikipage = NULL; + StrBuf *CmdBuf = NULL;; const char CMD[] = "ENT0 0|%s|%d|0||%s||%s|%s|%s"; - len = sizeof(CMD) + dplen; - Recp = xbstr("recp", &nLen); - len += nLen; - Cc = xbstr("cc", &nLen); - len += nLen; - Bcc = xbstr("bcc", &nLen); - len += nLen; - Wikipage = xbstr("wikipage", &nLen); - len += nLen; + Recp = sbstr("recp"); + Cc = sbstr("cc"); + Bcc = sbstr("bcc"); + Wikipage = sbstr("wikipage"); - - CmdBuf = (char*) malloc (len + 1); - - snprintf(CmdBuf, len, CMD, - Recp, is_anonymous, - display_name, - Cc, Bcc, Wikipage); - serv_puts(CmdBuf); + CmdBuf = NewStrBufPlain(NULL, + sizeof (CMD) + + StrLength(Recp) + + StrLength(display_name) + + StrLength(Cc) + + StrLength(Bcc) + + StrLength(Wikipage)); + + StrBufPrintf(CmdBuf, + CMD, + ChrPtr(Recp), + is_anonymous, + ChrPtr(display_name), + ChrPtr(Cc), + ChrPtr(Bcc), + ChrPtr(Wikipage)); + serv_puts(ChrPtr(CmdBuf)); serv_getln(buf, sizeof buf); + FreeStrBuf(&CmdBuf); if (!strncmp(buf, "570", 3)) { /** 570 means we have an invalid recipient listed */ if (havebstr("recp") && diff --git a/webcit/preferences.c b/webcit/preferences.c index 11ad3f34f..c76aff119 100644 --- a/webcit/preferences.c +++ b/webcit/preferences.c @@ -9,10 +9,12 @@ #include "webserver.h" #include "groupdav.h" +#ifdef DBG_PREFS_HASH inline const char *PrintPref(void *Prefstr) { return ChrPtr(Prefstr); } +#endif /* * display preferences dialog @@ -141,7 +143,9 @@ void save_preferences(void) { StrBuf *SubBuf = NULL; Hash = WC->hash_prefs; +#ifdef DBG_PREFS_HASH dbg_PrintHash(Hash, PrintPref, NULL); +#endif HashPos = GetNewHashPos(); while (GetNextHashPos(Hash, HashPos, &len, &Key, &Value)!=0) { @@ -202,8 +206,9 @@ void save_preferences(void) { int get_PREFERENCE(const char *key, size_t keylen, StrBuf **value) { void *hash_value = NULL; - +#ifdef DBG_PREFS_HASH dbg_PrintHash(WC->hash_prefs, PrintPref, NULL); +#endif if (GetHash(WC->hash_prefs, key, keylen, &hash_value) == 0) { *value = NULL; return 0; diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index fa5429d32..a786c6cbe 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -218,7 +218,7 @@ int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize) * \param buf the buffer to write to citadel server * \param nbytes how many bytes to send to citadel server */ -void serv_write(char *buf, int nbytes) +void serv_write(const char *buf, int nbytes) { int bytes_written = 0; int retval; @@ -243,7 +243,7 @@ void serv_write(char *buf, int nbytes) * \brief send line to server * \param string the line to send to the citadel server */ -void serv_puts(char *string) +void serv_puts(const char *string) { #ifdef SERV_TRACE lprintf(9, "%3d<%s\n", WC->serv_sock, string); diff --git a/webcit/webcit.c b/webcit/webcit.c index bc0fd5317..f0fd0a269 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -88,66 +88,71 @@ long unescape_input(char *buf) void free_url(void *U) { urlcontent *u = (urlcontent*) U; - free(u->url_data); + FreeStrBuf(&u->url_data); free(u); } /* * Extract variables from the URL. */ -void addurls(char *url, long ulen) +void addurls(StrBuf *url) { - char *aptr, *bptr, *eptr; - char *up; - char *buf; + const char *aptr, *bptr, *eptr, *up; +/// char *buf; int len, keylen; urlcontent *u; struct wcsession *WCC = WC; if (WCC->urlstrings == NULL) WCC->urlstrings = NewHash(1, NULL); - buf = (char*) malloc (ulen + 1); - memcpy(buf, url, ulen); - buf[ulen] = '\0'; - eptr = buf + ulen; - up = buf; +// buf = (char*) malloc (ulen + 1); +// memcpy(buf, url, ulen); +/// buf[ulen] = '\0'; + eptr = ChrPtr(url) + StrLength(url); + up = ChrPtr(url); while ((up < eptr) && (!IsEmptyStr(up))) { aptr = up; while ((aptr < eptr) && (*aptr != '\0') && (*aptr != '=')) aptr++; if (*aptr != '=') { - free(buf); + ///free(buf); return; } - *aptr = '\0'; + ///*aptr = '\0'; aptr++; bptr = aptr; while ((bptr < eptr) && (*bptr != '\0') && (*bptr != '&') && (*bptr != '?') && (*bptr != ' ')) { bptr++; } - *bptr = '\0'; - u = (urlcontent *) malloc(sizeof(urlcontent)); + //*bptr = '\0'; + keylen = aptr - up - 1; /* -1 -> '=' */ + if(keylen > sizeof(u->url_key)) { + lprintf(1, "URLkey to long! [%s]", up); + continue; + } - keylen = safestrncpy(u->url_key, up, sizeof u->url_key); - if (keylen < 0){ + u = (urlcontent *) malloc(sizeof(urlcontent)); + memcpy(u->url_key, up, keylen); + u->url_key[keylen] = '\0'; + if (keylen < 0) { lprintf(1, "URLkey to long! [%s]", up); + free(u); continue; } Put(WCC->urlstrings, u->url_key, keylen, u, free_url); len = bptr - aptr; - u->url_data = malloc(len + 2); - safestrncpy(u->url_data, aptr, len + 2); - u->url_data_size = unescape_input(u->url_data); - u->url_data[u->url_data_size] = '\0'; + u->url_data = NewStrBufPlain(aptr, len); + StrBufUnescape(u->url_data, 1); + up = bptr; ++up; #ifdef DEBUG_URLSTRINGS - lprintf(9, "%s = [%ld] %s\n", u->url_key, u->url_data_size, u->url_data); + lprintf(9, "%s = [%ld] %s\n", u->url_key, u->url_data_size, ChrPtr(u->url_data)); #endif } - free(buf); + //free(buf); } /* @@ -174,7 +179,7 @@ void dump_vars(void) Cursor = GetNewHashPos (); while (GetNextHashPos(WCC->urlstrings, Cursor, &HKLen, &HKey, &U)) { u = (urlcontent*) U; - wprintf("%38s = %s\n", u->url_key, u->url_data); + wprintf("%38s = %s\n", u->url_key, ChrPtr(u->url_data)); } } @@ -188,8 +193,8 @@ const char *XBstr(char *key, size_t keylen, size_t *len) if ((WC->urlstrings != NULL) && GetHash(WC->urlstrings, key, keylen, &U)) { - *len = ((urlcontent *)U)->url_data_size; - return ((urlcontent *)U)->url_data; + *len = StrLength(((urlcontent *)U)->url_data); + return ChrPtr(((urlcontent *)U)->url_data); } else { *len = 0; @@ -203,8 +208,8 @@ const char *XBSTR(char *key, size_t *len) if ((WC->urlstrings != NULL) && GetHash(WC->urlstrings, key, strlen (key), &U)){ - *len = ((urlcontent *)U)->url_data_size; - return ((urlcontent *)U)->url_data; + *len = StrLength(((urlcontent *)U)->url_data); + return ChrPtr(((urlcontent *)U)->url_data); } else { *len = 0; @@ -219,7 +224,7 @@ const char *BSTR(char *key) if ((WC->urlstrings != NULL) && GetHash(WC->urlstrings, key, strlen (key), &U)) - return ((urlcontent *)U)->url_data; + return ChrPtr(((urlcontent *)U)->url_data); else return (""); } @@ -230,18 +235,40 @@ const char *Bstr(char *key, size_t keylen) if ((WC->urlstrings != NULL) && GetHash(WC->urlstrings, key, keylen, &U)) - return ((urlcontent *)U)->url_data; + return ChrPtr(((urlcontent *)U)->url_data); else return (""); } +const StrBuf *SBSTR(const char *key) +{ + void *U; + + if ((WC->urlstrings != NULL) && + GetHash(WC->urlstrings, key, strlen (key), &U)) + return ((urlcontent *)U)->url_data; + else + return NULL; +} + +const StrBuf *SBstr(const char *key, size_t keylen) +{ + void *U; + + if ((WC->urlstrings != NULL) && + GetHash(WC->urlstrings, key, keylen, &U)) + return ((urlcontent *)U)->url_data; + else + return NULL; +} + long LBstr(char *key, size_t keylen) { void *U; if ((WC->urlstrings != NULL) && GetHash(WC->urlstrings, key, keylen, &U)) - return atol(((urlcontent *)U)->url_data); + return StrTol(((urlcontent *)U)->url_data); else return (0); } @@ -252,7 +279,7 @@ long LBSTR(char *key) if ((WC->urlstrings != NULL) && GetHash(WC->urlstrings, key, strlen(key), &U)) - return atol(((urlcontent *)U)->url_data); + return StrTol(((urlcontent *)U)->url_data); else return (0); } @@ -263,7 +290,7 @@ int IBstr(char *key, size_t keylen) if ((WC->urlstrings != NULL) && GetHash(WC->urlstrings, key, keylen, &U)) - return atoi(((urlcontent *)U)->url_data); + return StrTol(((urlcontent *)U)->url_data); else return (0); } @@ -274,7 +301,7 @@ int IBSTR(char *key) if ((WC->urlstrings != NULL) && GetHash(WC->urlstrings, key, strlen(key), &U)) - return atoi(((urlcontent *)U)->url_data); + return StrToi(((urlcontent *)U)->url_data); else return (0); } @@ -285,7 +312,7 @@ int HaveBstr(char *key, size_t keylen) if ((WC->urlstrings != NULL) && GetHash(WC->urlstrings, key, keylen, &U)) - return ((urlcontent *)U)->url_data_size != 0; + return (StrLength(((urlcontent *)U)->url_data) != 0); else return (0); } @@ -296,7 +323,7 @@ int HAVEBSTR(char *key) if ((WC->urlstrings != NULL) && GetHash(WC->urlstrings, key, strlen(key), &U)) - return ((urlcontent *)U)->url_data_size != 0; + return (StrLength(((urlcontent *)U)->url_data) != 0); else return (0); } @@ -308,7 +335,7 @@ int YesBstr(char *key, size_t keylen) if ((WC->urlstrings != NULL) && GetHash(WC->urlstrings, key, keylen, &U)) - return strcmp( ((urlcontent *)U)->url_data, "yes") == 0; + return strcmp( ChrPtr(((urlcontent *)U)->url_data), "yes") == 0; else return (0); } @@ -319,7 +346,7 @@ int YESBSTR(char *key) if ((WC->urlstrings != NULL) && GetHash(WC->urlstrings, key, strlen(key), &U)) - return strcmp( ((urlcontent *)U)->url_data, "yes") == 0; + return strcmp( ChrPtr(((urlcontent *)U)->url_data), "yes") == 0; else return (0); } @@ -1163,10 +1190,8 @@ void upload_handler(char *name, char *filename, char *partnum, char *disp, u = (urlcontent *) malloc(sizeof(urlcontent)); safestrncpy(u->url_key, name, sizeof(u->url_key)); - u->url_data = malloc(length + 1); - u->url_data_size = length; - memcpy(u->url_data, content, length); - u->url_data[length] = 0; + u->url_data = NewStrBufPlain(content, length); + Put(WC->urlstrings, u->url_key, strlen(u->url_key), u, free_url); #ifdef DEBUG_URLSTRINGS lprintf(9, "Key: <%s> len: [%ld] Data: <%s>\n", u->url_key, u->url_data_size, u->url_data); @@ -1473,7 +1498,11 @@ void session_loop(struct httprequest *req) client_read(WCC->http_sock, &content[body_start], ContentLength); if (!strncasecmp(ContentType, "application/x-www-form-urlencoded", 33)) { - addurls(&content[body_start], ContentLength); + StrBuf *Content; + + Content = _NewConstStrBuf(&content[body_start],ContentLength); + addurls(Content); + FreeStrBuf(&Content); } else if (!strncasecmp(ContentType, "multipart", 9)) { content_end = content + ContentLength + body_start; mime_parser(content, content_end, *upload_handler, NULL, NULL, NULL, 0); @@ -1491,13 +1520,16 @@ void session_loop(struct httprequest *req) len = strlen(cmd); for (a = 0; a < len; ++a) { if ((cmd[a] == '?') || (cmd[a] == '&')) { + StrBuf *Params; for (b = a; b < len; ++b) { if (isspace(cmd[b])){ cmd[b] = 0; len = b - 1; } } - addurls(&cmd[a + 1], len - a); + //cmd[len - a] = '\0'; + Params = _NewConstStrBuf(&cmd[a + 1], len - a); + addurls(Params); cmd[a] = 0; len = a - 1; } diff --git a/webcit/webcit.h b/webcit/webcit.h index 19f176b31..8737160e4 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -228,8 +228,7 @@ struct httprequest { typedef struct urlcontent urlcontent; struct urlcontent { char url_key[32]; /**< the variable name */ - char *url_data; /**< its value */ - size_t url_data_size; /**< how big is it? */ + StrBuf *url_data; /**< its value */ }; /** @@ -498,7 +497,7 @@ int uds_connectsock(char *); int tcp_connectsock(char *, char *); int serv_getln(char *strbuf, int bufsize); int StrBuf_ServGetln(StrBuf *buf); -void serv_puts(char *string); +void serv_puts(const char *string); void who(void); void who_inner_div(void); void ajax_mini_calendar(void); @@ -506,10 +505,11 @@ void fmout(char *align); void pullquote_fmout(void); void wDumpContent(int); -/* TODO: get rid of the non-const-typecast */ -#define bstr(a) (char*) Bstr(a, sizeof(a) - 1) -const char *BSTR(char *key); -const char *Bstr(char *key, size_t keylen); + +/* These may return NULL if not foud */ +#define sbstr(a) SBstr(a, sizeof(a) - 1) +const StrBuf *SBSTR(const char *key); +const StrBuf *SBstr(const char *key, size_t keylen); #define xbstr(a, b) (char*) XBstr(a, sizeof(a) - 1, b) const char *XBstr(char *key, size_t keylen, size_t *len); @@ -531,6 +531,10 @@ int HAVEBSTR(char *key); int YesBstr(char *key, size_t keylen); int YESBSTR(char *key); +/* TODO: get rid of the non-const-typecast */ +#define bstr(a) (char*) Bstr(a, sizeof(a) - 1) +const char *BSTR(char *key); +const char *Bstr(char *key, size_t keylen); void urlescputs(char *); void jsesc(char *, size_t, char *); @@ -575,8 +579,8 @@ void display_graphics_upload(char *, char *, char *); void do_graphics_upload(char *upl_cmd); void serv_read(char *buf, int bytes); void serv_gets(char *strbuf); -void serv_write(char *buf, int nbytes); -void serv_puts(char *string); +void serv_write(const char *buf, int nbytes); +void serv_puts(const char *string); void serv_printf(const char *format,...)__attribute__((__format__(__printf__,1,2))); void load_floorlist(void); void shutdown_sessions(void);