Tomato 1.28
[tomato.git] / release / src / router / httpd / webio.c
blob11e8a67af6d1d36430f0d81548940b5f31c85063
1 /*
3 Tomato Firmware
4 Copyright (C) 2006-2009 Jonathan Zarate
6 */
7 #include "tomato.h"
9 #include "../mssl/mssl.h"
10 extern int do_ssl;
12 #include <errno.h>
13 #include <stdarg.h>
15 extern FILE *connfp;
16 extern int connfd;
18 int web_getline(char *buffer, int max)
20 while (fgets(buffer, max, connfp) == NULL) {
21 if (errno != EINTR) return 0;
23 // cprintf("%s", buffer);
24 return 1;
27 void web_puts(const char *buffer)
29 web_write(buffer, strlen(buffer));
32 void web_putj(const char *buffer)
34 char *p;
36 p = js_string(buffer);
37 if (p) {
38 web_puts(p);
39 free(p);
43 void web_puth(const char *buffer)
45 char *p;
47 p = html_string(buffer);
48 if (p) {
49 web_puts(p);
50 free(p);
54 int _web_printf(wofilter_t wof, const char *format, ...)
56 va_list args;
57 char *b, *p;
58 int size;
59 int n;
61 size = 1024;
62 while (1) {
63 if ((b = malloc(size)) == NULL) return 0;
65 va_start(args, format);
66 n = vsnprintf(b, size, format, args);
67 va_end(args);
69 if (n > -1) {
70 if (n < size) {
71 switch (wof) {
72 case WOF_JAVASCRIPT:
73 p = js_string(b);
74 free(b);
75 break;
76 case WOF_HTML:
77 p = html_string(b);
78 free(b);
79 break;
80 default:
81 p = b;
82 break;
84 if (!p) return 0;
85 web_puts(p);
86 free(p);
87 return 1;
89 size = n + 1;
91 else size *= 2;
93 free(b);
94 if (size > (10 * 1024)) return 0;
98 int web_write(const char *buffer, int len)
100 int n = len;
101 int r = 0;
103 while (n > 0) {
104 r = fwrite(buffer, 1, n, connfp);
105 if ((r == 0) && (errno != EINTR)) return -1;
106 buffer += r;
107 n -= r;
109 return r;
112 int web_read(void *buffer, int len)
114 int r;
115 if (len <= 0) return 0;
116 while ((r = fread(buffer, 1, len, connfp)) == 0) {
117 if (errno != EINTR) return -1;
119 return r;
122 int web_read_x(void *buffer, int len)
124 int n;
125 int t = 0;
126 while (len > 0) {
127 n = web_read(buffer, len);
128 if (n <= 0) return len;
129 (unsigned char *)buffer += n;
130 len -= n;
131 t += n;
133 return t;
136 int web_eat(int max)
138 char buf[512];
139 int n;
140 while (max > 0) {
141 if ((n = web_read(buf, (max < sizeof(buf)) ? max : sizeof(buf))) <= 0) return 0;
142 max -= n;
144 return 1;
147 int web_flush(void)
149 return (fflush(connfp) == 0);
152 int web_open(void)
154 if (do_ssl) {
155 #ifdef TCONFIG_HTTPS
156 if ((connfp = ssl_server_fopen(connfd)) != NULL) return 1;
157 #endif
159 else {
160 if ((connfp = fdopen(connfd, "r+")) != NULL) return 1;
162 return 0;
165 int web_close(void)
167 if (connfp != NULL) {
168 fflush(connfp);
169 fclose(connfp);
170 connfp = NULL;
172 if (connfd != -1) {
173 // shutdown(connfd, SHUT_RDWR);
174 close(connfd);
175 connfd = -1;
177 return 1;
181 // --------------------------------------------------------------------------------------------------------------------
184 static void _web_putfile(FILE *f, wofilter_t wof)
186 char buf[2048];
187 int nr;
189 while ((nr = fread(buf, 1, sizeof(buf) - 1, f)) > 0) {
190 buf[nr] = 0;
191 switch (wof) {
192 case WOF_JAVASCRIPT:
193 web_putj(buf);
194 break;
195 case WOF_HTML:
196 web_puth(buf);
197 break;
198 default:
199 web_puts(buf);
200 break;
205 int web_putfile(const char *fname, wofilter_t wof)
207 FILE *f;
209 if ((f = fopen(fname, "r")) != NULL) {
210 _web_putfile(f, wof);
211 fclose(f);
212 return 1;
214 return 0;
217 int web_pipecmd(const char *cmd, wofilter_t wof)
219 FILE *f;
221 if ((f = popen(cmd, "r")) != NULL) {
222 _web_putfile(f, wof);
223 pclose(f);
224 return 1;
226 return 0;