From 3395b2dbe9d460d5381497850ed833c60befb746 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Thu, 23 Apr 2009 21:29:32 +0000 Subject: [PATCH] * use modern functions for downloads. --- webcit/downloads.c | 62 +++++++++++++++++++++++--------------------- webcit/messages.c | 45 +++++++++++++++++--------------- webcit/serv_func.c | 11 +++----- webcit/tcp_sockets.c | 6 +++-- webcit/webcit.c | 2 +- webcit/webcit.h | 4 +-- 6 files changed, 67 insertions(+), 63 deletions(-) diff --git a/webcit/downloads.c b/webcit/downloads.c index 0c03ea0a9..82079a39d 100644 --- a/webcit/downloads.c +++ b/webcit/downloads.c @@ -240,40 +240,40 @@ void display_mime_icon(void) void download_file(void) { - char buf[256]; + wcsession *WCC = WC; + StrBuf *Buf; off_t bytes; - char content_type[256]; - char *content = NULL; + StrBuf *ContentType = NewStrBufPlain(HKEY("application/octet-stream")); /* Setting to nonzero forces a MIME type of application/octet-stream */ int force_download = 1; - safestrncpy(buf, ChrPtr(WC->UrlFragment2), sizeof buf); - unescape_input(buf); - serv_printf("OPEN %s", buf); - serv_getln(buf, sizeof buf); - if (buf[0] == '2') { - bytes = extract_long(&buf[4], 0); - content = malloc(bytes + 2); - if (force_download) { - strcpy(content_type, "application/octet-stream"); - } - else { - extract_token(content_type, &buf[4], 3, '|', sizeof content_type); + Buf = NewStrBuf(); + StrBufUnescape(WCC->UrlFragment2, 1); + serv_printf("OPEN %s", ChrPtr(WCC->UrlFragment2)); + StrBuf_ServGetlnBuffered(Buf); + if (GetServerStatus(Buf, NULL) == 2) { + StrBufCutLeft(Buf, 4); + bytes = StrBufExtract_long(Buf, 0, '|'); + if (!force_download) { + StrBufExtract_token(ContentType, Buf, 3, '|'); } output_headers(0, 0, 0, 0, 0, 0); - read_server_binary(WC->WBuf, bytes); + read_server_binary(WCC->WBuf, bytes, Buf); serv_puts("CLOS"); - serv_getln(buf, sizeof buf); - http_transmit_thing(content_type, 0); - free(content); + StrBuf_ServGetlnBuffered(Buf); + http_transmit_thing(ChrPtr(ContentType), 0); } else { - hprintf("HTTP/1.1 404 %s\n", &buf[4]); + StrBufCutLeft(Buf, 4); + hprintf("HTTP/1.1 404 %s\n", ChrPtr(Buf)); output_headers(0, 0, 0, 0, 0, 0); hprintf("Content-Type: text/plain\r\n"); - wprintf(_("An error occurred while retrieving this file: %s\n"), &buf[4]); + wprintf(_("An error occurred while retrieving this file: %s\n"), + ChrPtr(Buf)); end_burst(); } + FreeStrBuf(&ContentType); + FreeStrBuf(&Buf); } @@ -352,22 +352,23 @@ void upload_file(void) */ void output_image(void) { - char blank_gif[SIZ]; + StrBuf *Buf; wcsession *WCC = WC; - char buf[SIZ]; off_t bytes; const char *MimeType; + Buf = NewStrBuf(); serv_printf("OIMG %s|%s", bstr("name"), bstr("parm")); - serv_getln(buf, sizeof buf); - if (buf[0] == '2') { - bytes = extract_long(&buf[4], 0); + StrBuf_ServGetlnBuffered(Buf); + if (GetServerStatus(Buf, NULL) == 2) { + StrBufCutLeft(Buf, 4); + bytes = StrBufExtract_long(Buf, 0, '|'); /** Read it from the server */ - if (read_server_binary(WCC->WBuf, bytes) > 0) { + if (read_server_binary(WCC->WBuf, bytes, Buf) > 0) { serv_puts("CLOS"); - serv_getln(buf, sizeof buf); + StrBuf_ServGetlnBuffered(Buf); MimeType = GuessMimeType (ChrPtr(WCC->WBuf), StrLength(WCC->WBuf)); /** Write it to the browser */ @@ -385,8 +386,9 @@ void output_image(void) * Instead of an ugly 404, send a 1x1 transparent GIF * when there's no such image on the server. */ - snprintf (blank_gif, SIZ, "%s%s", static_dirs[0], "/blank.gif"); - output_static(blank_gif); + StrBufPrintf (Buf, "%s%s", static_dirs[0], "/blank.gif"); + output_static(ChrPtr(Buf)); + FreeStrBuf(&Buf); } void diff --git a/webcit/messages.c b/webcit/messages.c index 5d0209c71..9b16e2a94 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -1541,44 +1541,47 @@ void postpart(StrBuf *partnum, StrBuf *filename, int force_download) void mimepart(int force_download) { wcsession *WCC = WC; - - char buf[256]; + StrBuf *Buf; off_t bytes; - char content_type[256]; - const char *ContentType = &content_type[0]; + StrBuf *ContentType = NewStrBufPlain(HKEY("application/octet-stream")); + const char *CT; + Buf = NewStrBuf(); serv_printf("OPNA %s|%s", ChrPtr(WCC->UrlFragment2), ChrPtr(WCC->UrlFragment3)); - serv_getln(buf, sizeof buf); - if (buf[0] == '2') { - bytes = extract_long(&buf[4], 0); - if (force_download) { - strcpy(content_type, "application/octet-stream"); - } - else { - extract_token(content_type, &buf[4], 3, '|', sizeof content_type); + StrBuf_ServGetlnBuffered(Buf); + if (GetServerStatus(Buf, NULL) == 2) { + StrBufCutLeft(Buf, 4); + bytes = StrBufExtract_long(Buf, 0, '|'); + if (!force_download) { + StrBufExtract_token(ContentType, Buf, 3, '|'); } - read_server_binary(WCC->WBuf, bytes); + read_server_binary(WCC->WBuf, bytes, Buf); serv_puts("CLOS"); - serv_getln(buf, sizeof buf); + StrBuf_ServGetlnBuffered(Buf); + CT = ChrPtr(ContentType); if (!force_download) { - if (!strcasecmp(ContentType, "application/octet-stream")) { - ContentType = GuessMimeByFilename(SKEY(WCC->UrlFragment4)); + if (!strcasecmp(ChrPtr(ContentType), "application/octet-stream")) { + CT = GuessMimeByFilename(SKEY(WCC->UrlFragment4)); } - if (!strcasecmp(ContentType, "application/octet-stream")) { - ContentType = GuessMimeType(SKEY(WCC->WBuf)); + if (!strcasecmp(ChrPtr(ContentType), "application/octet-stream")) { + CT = GuessMimeType(SKEY(WCC->WBuf)); } } output_headers(0, 0, 0, 0, 0, 0); - http_transmit_thing(ContentType, 0); + http_transmit_thing(CT, 0); } else { - hprintf("HTTP/1.1 404 %s\n", &buf[4]); + StrBufCutLeft(Buf, 4); + hprintf("HTTP/1.1 404 %s\n", ChrPtr(Buf)); output_headers(0, 0, 0, 0, 0, 0); hprintf("Content-Type: text/plain\r\n"); - wprintf(_("An error occurred while retrieving this part: %s\n"), &buf[4]); + wprintf(_("An error occurred while retrieving this part: %s\n"), + ChrPtr(Buf)); end_burst(); } + FreeStrBuf(&ContentType); + FreeStrBuf(&Buf); } diff --git a/webcit/serv_func.c b/webcit/serv_func.c index 63d771717..50dd83b52 100644 --- a/webcit/serv_func.c +++ b/webcit/serv_func.c @@ -438,14 +438,12 @@ void server_to_text() * server READ commands. * \return the read content as StrBuf */ -int read_server_binary(StrBuf *Ret, size_t total_len) +int read_server_binary(StrBuf *Ret, size_t total_len, StrBuf *Buf) { char buf[SIZ]; size_t bytes = 0; size_t thisblock = 0; - StrBuf *Buf; - Buf = NewStrBuf(); if (Ret == NULL) return -1; @@ -460,18 +458,18 @@ int read_server_binary(StrBuf *Ret, size_t total_len) } } serv_printf("READ %d|%d", (int)bytes, (int)thisblock); - if (StrBuf_ServGetln(Buf) > 0) + if (StrBuf_ServGetlnBuffered(Buf) > 0) { if (GetServerStatus(Buf, NULL) == 6) { - StrBufCutLeft(Buf, 4); /*/ TODO : thisblock = (size_t)atoi(&buf[4]); */ + StrBufCutLeft(Buf, 4); thisblock = StrTol(Buf); if (!WC->connected) { FlushStrBuf(Ret); FreeStrBuf(&Buf); return -1; } - StrBuf_ServGetBLOB(Ret, thisblock); + StrBuf_ServGetBLOBBuffered(Ret, thisblock); bytes += thisblock; } else { @@ -481,7 +479,6 @@ int read_server_binary(StrBuf *Ret, size_t total_len) } } } - FreeStrBuf(&Buf); return StrLength(Ret); } diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index 22733ef58..345b1d56e 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -38,13 +38,15 @@ int uds_connectsock(char *sockpath) s = socket(AF_UNIX, SOCK_STREAM, 0); if (s < 0) { - lprintf(1, "Can't create socket: %s\n", + lprintf(1, "Can't create socket[%s]: %s\n", + sockpath, strerror(errno)); return(-1); } if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { - lprintf(1, "Can't connect: %s\n", + lprintf(1, "Can't connect [%s]: %s\n", + sockpath, strerror(errno)); close(s); return(-1); diff --git a/webcit/webcit.c b/webcit/webcit.c index ad2d501f9..a47f5f31e 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -283,7 +283,7 @@ void print_menu_box(char* Title, char *Class, int nLines, ...) /* * dump out static pages from disk */ -void output_static(char *what) +void output_static(const char *what) { int fd; struct stat statbuf; diff --git a/webcit/webcit.h b/webcit/webcit.h index dfb00d813..7a991ce5f 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -576,7 +576,7 @@ void output_headers( int do_httpheaders, void output_custom_content_header(const char *ctype); void wprintf(const char *format,...)__attribute__((__format__(__printf__,1,2))); void hprintf(const char *format,...)__attribute__((__format__(__printf__,1,2))); -void output_static(char *what); +void output_static(const char *what); void print_menu_box(char* Title, char *Class, int nLines, ...); long stresc(char *target, long tSize, char *strbuf, int nbsp, int nolinebreaks); @@ -708,7 +708,7 @@ int ical_ctdl_is_overlap( extern char *months[]; extern char *days[]; -int read_server_binary(StrBuf *Ret, size_t total_len); +int read_server_binary(StrBuf *Ret, size_t total_len, StrBuf *Buf); int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize); int StrBuf_ServGetBLOBBuffered(StrBuf *buf, long BlobSize); int read_server_text(StrBuf *Buf, long *nLines); -- 2.30.2