* use modern functions for downloads.
authorWilfried Göesgens <willi@citadel.org>
Thu, 23 Apr 2009 21:29:32 +0000 (21:29 +0000)
committerWilfried Göesgens <willi@citadel.org>
Thu, 23 Apr 2009 21:29:32 +0000 (21:29 +0000)
webcit/downloads.c
webcit/messages.c
webcit/serv_func.c
webcit/tcp_sockets.c
webcit/webcit.c
webcit/webcit.h

index 0c03ea0a95e4602d260b91955005aa8ce91beedd..82079a39d23a963c9de1bce52e2c8714f5566ff2 100644 (file)
@@ -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 
index 5d0209c71dad80a795a7b233989d3490cd416473..9b16e2a94b4d0a8a1f0a7ff6d32f4c38b45c1e72 100644 (file)
@@ -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);
 }
 
 
index 63d77171724d506af5dd98c4286fba023f1f763e..50dd83b52b9212bfc6bce34ce01b4793b26fe8bf 100644 (file)
@@ -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);
 }
 
index 22733ef58eac12f7771e21b9d468609611167ff8..345b1d56eb5e8277d23f671744a19c184b121bd5 100644 (file)
@@ -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);
index ad2d501f96aef251ed9c6bb0719b9876a5e9c16e..a47f5f31eca2064a602f049229a1d861bf6ff95b 100644 (file)
@@ -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;
index dfb00d8137851692ef422922f6d25c2131f983c5..7a991ce5f9f71fd1cfa18320572bdf0a81fdb0fd 100644 (file)
@@ -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);