diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2015-01-03 13:58:15 +0100 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2015-01-03 13:58:15 +0100 |
commit | 4aca87515a5083ae0e31ce3177189fd43b6d05ac (patch) | |
tree | 7b1d9a31393ca090757dc6f0d3859b4fcd93f271 /release/src/router/httpd/webio.c | |
parent | 008d0be72b2f160382c6e880765e96b64a050c65 (diff) | |
download | tomato-4aca87515a5083ae0e31ce3177189fd43b6d05ac.tar.gz tomato-4aca87515a5083ae0e31ce3177189fd43b6d05ac.tar.bz2 |
patch to Vanilla Tomato 1.28
Diffstat (limited to 'release/src/router/httpd/webio.c')
-rw-r--r-- | release/src/router/httpd/webio.c | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/release/src/router/httpd/webio.c b/release/src/router/httpd/webio.c new file mode 100644 index 00000000..11e8a67a --- /dev/null +++ b/release/src/router/httpd/webio.c @@ -0,0 +1,229 @@ +/* + + Tomato Firmware + Copyright (C) 2006-2009 Jonathan Zarate + +*/ +#include "tomato.h" + +#include "../mssl/mssl.h" +extern int do_ssl; + +#include <errno.h> +#include <stdarg.h> + +extern FILE *connfp; +extern int connfd; + +int web_getline(char *buffer, int max) +{ + while (fgets(buffer, max, connfp) == NULL) { + if (errno != EINTR) return 0; + } +// cprintf("%s", buffer); + return 1; +} + +void web_puts(const char *buffer) +{ + web_write(buffer, strlen(buffer)); +} + +void web_putj(const char *buffer) +{ + char *p; + + p = js_string(buffer); + if (p) { + web_puts(p); + free(p); + } +} + +void web_puth(const char *buffer) +{ + char *p; + + p = html_string(buffer); + if (p) { + web_puts(p); + free(p); + } +} + +int _web_printf(wofilter_t wof, const char *format, ...) +{ + va_list args; + char *b, *p; + int size; + int n; + + size = 1024; + while (1) { + if ((b = malloc(size)) == NULL) return 0; + + va_start(args, format); + n = vsnprintf(b, size, format, args); + va_end(args); + + if (n > -1) { + if (n < size) { + switch (wof) { + case WOF_JAVASCRIPT: + p = js_string(b); + free(b); + break; + case WOF_HTML: + p = html_string(b); + free(b); + break; + default: + p = b; + break; + } + if (!p) return 0; + web_puts(p); + free(p); + return 1; + } + size = n + 1; + } + else size *= 2; + + free(b); + if (size > (10 * 1024)) return 0; + } +} + +int web_write(const char *buffer, int len) +{ + int n = len; + int r = 0; + + while (n > 0) { + r = fwrite(buffer, 1, n, connfp); + if ((r == 0) && (errno != EINTR)) return -1; + buffer += r; + n -= r; + } + return r; +} + +int web_read(void *buffer, int len) +{ + int r; + if (len <= 0) return 0; + while ((r = fread(buffer, 1, len, connfp)) == 0) { + if (errno != EINTR) return -1; + } + return r; +} + +int web_read_x(void *buffer, int len) +{ + int n; + int t = 0; + while (len > 0) { + n = web_read(buffer, len); + if (n <= 0) return len; + (unsigned char *)buffer += n; + len -= n; + t += n; + } + return t; +} + +int web_eat(int max) +{ + char buf[512]; + int n; + while (max > 0) { + if ((n = web_read(buf, (max < sizeof(buf)) ? max : sizeof(buf))) <= 0) return 0; + max -= n; + } + return 1; +} + +int web_flush(void) +{ + return (fflush(connfp) == 0); +} + +int web_open(void) +{ + if (do_ssl) { +#ifdef TCONFIG_HTTPS + if ((connfp = ssl_server_fopen(connfd)) != NULL) return 1; +#endif + } + else { + if ((connfp = fdopen(connfd, "r+")) != NULL) return 1; + } + return 0; +} + +int web_close(void) +{ + if (connfp != NULL) { + fflush(connfp); + fclose(connfp); + connfp = NULL; + } + if (connfd != -1) { +// shutdown(connfd, SHUT_RDWR); + close(connfd); + connfd = -1; + } + return 1; +} + + +// -------------------------------------------------------------------------------------------------------------------- + + +static void _web_putfile(FILE *f, wofilter_t wof) +{ + char buf[2048]; + int nr; + + while ((nr = fread(buf, 1, sizeof(buf) - 1, f)) > 0) { + buf[nr] = 0; + switch (wof) { + case WOF_JAVASCRIPT: + web_putj(buf); + break; + case WOF_HTML: + web_puth(buf); + break; + default: + web_puts(buf); + break; + } + } +} + +int web_putfile(const char *fname, wofilter_t wof) +{ + FILE *f; + + if ((f = fopen(fname, "r")) != NULL) { + _web_putfile(f, wof); + fclose(f); + return 1; + } + return 0; +} + +int web_pipecmd(const char *cmd, wofilter_t wof) +{ + FILE *f; + + if ((f = popen(cmd, "r")) != NULL) { + _web_putfile(f, wof); + pclose(f); + return 1; + } + return 0; +} + + |