You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
freshtomato-arm/release/src-rt-6.x.4708/router/httpd/webio.c

269 lines
3.5 KiB
C

/*
*
* Tomato Firmware
* Copyright (C) 2006-2009 Jonathan Zarate
*
* Fixes/updates (C) 2018 - 2024 pedro
*
*/
#include "tomato.h"
#ifdef TCONFIG_HTTPS
#include "mssl.h"
#endif
#include <errno.h>
#include <stdarg.h>
extern int do_ssl;
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_putj_utf8(const char *buffer)
{
char *p;
p = utf8_to_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);
}
}
void web_puth_utf8(const char *buffer)
{
char *p;
p = utf8_to_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;
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, ((unsigned int) max < sizeof(buf)) ? (unsigned int) 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_utf8(buf);
break;
case WOF_HTML:
web_puth_utf8(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;
}