Updates to Tomato RAF including NGINX && PHP
[tomato.git] / release / src / router / httpd / webio.c
blob1c2b978f6df117eb2b26fcaddbfd750eb80d926c
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_putj_utf8(const char *buffer)
45 char *p;
47 p = utf8_to_js_string(buffer);
48 if (p) {
49 web_puts(p);
50 free(p);
54 void web_puth(const char *buffer)
56 char *p;
58 p = html_string(buffer);
59 if (p) {
60 web_puts(p);
61 free(p);
65 void web_puth_utf8(const char *buffer)
67 char *p;
69 p = utf8_to_html_string(buffer);
70 if (p) {
71 web_puts(p);
72 free(p);
76 int _web_printf(wofilter_t wof, const char *format, ...)
78 va_list args;
79 char *b, *p;
80 int size;
81 int n;
83 size = 1024;
84 while (1) {
85 if ((b = malloc(size)) == NULL) return 0;
87 va_start(args, format);
88 n = vsnprintf(b, size, format, args);
89 va_end(args);
91 if (n > -1) {
92 if (n < size) {
93 switch (wof) {
94 case WOF_JAVASCRIPT:
95 p = js_string(b);
96 free(b);
97 break;
98 case WOF_HTML:
99 p = html_string(b);
100 free(b);
101 break;
102 default:
103 p = b;
104 break;
106 if (!p) return 0;
107 web_puts(p);
108 free(p);
109 return 1;
111 size = n + 1;
113 else size *= 2;
115 free(b);
116 if (size > (10 * 1024)) return 0;
120 int web_write(const char *buffer, int len)
122 int n = len;
123 int r = 0;
125 while (n > 0) {
126 r = fwrite(buffer, 1, n, connfp);
127 if ((r == 0) && (errno != EINTR)) return -1;
128 buffer += r;
129 n -= r;
131 return r;
134 int web_read(void *buffer, int len)
136 int r;
137 if (len <= 0) return 0;
138 while ((r = fread(buffer, 1, len, connfp)) == 0) {
139 if (errno != EINTR) return -1;
141 return r;
144 int web_read_x(void *buffer, int len)
146 int n;
147 int t = 0;
148 while (len > 0) {
149 n = web_read(buffer, len);
150 if (n <= 0) return len;
151 buffer += n;
152 len -= n;
153 t += n;
155 return t;
158 int web_eat(int max)
160 char buf[512];
161 int n;
162 while (max > 0) {
163 if ((n = web_read(buf, (max < sizeof(buf)) ? max : sizeof(buf))) <= 0) return 0;
164 max -= n;
166 return 1;
169 int web_flush(void)
171 return (fflush(connfp) == 0);
174 int web_open(void)
176 if (do_ssl) {
177 #ifdef TCONFIG_HTTPS
178 if ((connfp = ssl_server_fopen(connfd)) != NULL) return 1;
179 #endif
181 else {
182 if ((connfp = fdopen(connfd, "r+")) != NULL) return 1;
184 return 0;
187 int web_close(void)
189 if (connfp != NULL) {
190 fflush(connfp);
191 fclose(connfp);
192 connfp = NULL;
194 if (connfd != -1) {
195 // shutdown(connfd, SHUT_RDWR);
196 close(connfd);
197 connfd = -1;
199 return 1;
203 // --------------------------------------------------------------------------------------------------------------------
206 static void _web_putfile(FILE *f, wofilter_t wof)
208 char buf[2048];
209 int nr;
211 while ((nr = fread(buf, 1, sizeof(buf) - 1, f)) > 0) {
212 buf[nr] = 0;
213 switch (wof) {
214 case WOF_JAVASCRIPT:
215 web_putj_utf8(buf);
216 break;
217 case WOF_HTML:
218 web_puth_utf8(buf);
219 break;
220 default:
221 web_puts(buf);
222 break;
227 int web_putfile(const char *fname, wofilter_t wof)
229 FILE *f;
231 if ((f = fopen(fname, "r")) != NULL) {
232 _web_putfile(f, wof);
233 fclose(f);
234 return 1;
236 return 0;
239 int web_pipecmd(const char *cmd, wofilter_t wof)
241 FILE *f;
243 if ((f = popen(cmd, "r")) != NULL) {
244 _web_putfile(f, wof);
245 pclose(f);
246 return 1;
248 return 0;