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/config.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/config.c')
-rw-r--r-- | release/src/router/httpd/config.c | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/release/src/router/httpd/config.c b/release/src/router/httpd/config.c new file mode 100644 index 00000000..52e4f5c5 --- /dev/null +++ b/release/src/router/httpd/config.c @@ -0,0 +1,180 @@ +/* + + Tomato Firmware + Copyright (C) 2006-2009 Jonathan Zarate + +*/ + +#include "tomato.h" + +#include <fcntl.h> +#include <errno.h> +#include <sys/stat.h> +#include <sys/wait.h> +#include <typedefs.h> +#include <sys/reboot.h> + +// #define DEBUG + +#ifdef DEBUG +#define NVRAMCMD "/tmp/nvram" +#else +#define NVRAMCMD "nvram" +#endif + +void wo_defaults(char *url) +{ + const char *v; + int mode; + + if ((v = webcgi_get("mode")) != NULL) { + mode = atoi(v); + if ((mode == 1) || (mode == 2)) { + prepare_upgrade(); + + parse_asp("reboot-default.asp"); + web_close(); + + killall("pppoecd", SIGTERM); + + led(LED_DIAG, 1); + sleep(2); + + if (mode == 1) { + // eval(NVRAMCMD, "defaults", "--yes"); + nvram_set("restore_defaults", "1"); + nvram_commit(); + } + else { + eval("mtd-erase", "-d", "nvram"); + } + + set_action(ACT_REBOOT); + // kill(1, SIGTERM); + reboot(RB_AUTOBOOT); + exit(0); + } + } + + redirect("/admin-config.asp"); +} + +void wo_backup(char *url) +{ + char tmp[64]; + char msg[64]; + static char *args[] = { + NVRAMCMD, "backup", NULL, NULL + }; + + strcpy(tmp, "/tmp/backupXXXXXX"); + mktemp(tmp); + args[2] = tmp; + + sprintf(msg, ">%s.msg", tmp); + + if (_eval(args, msg, 0, NULL) == 0) { + send_header(200, NULL, mime_binary, 0); + do_file(tmp); + unlink(tmp); + } + else { + resmsg_fread(msg + 1); + send_header(200, NULL, mime_html, 0); + parse_asp("error.asp"); + } + + unlink(msg + 1); +} + +void wi_restore(char *url, int len, char *boundary) +{ + char *buf; + const char *error; + int ok; + int n; + char tmp[64]; + + check_id(url); + + tmp[0] = 0; + buf = NULL; + error = "Error reading file"; + ok = 0; + + if (!skip_header(&len)) { + goto ERROR; + } + + if ((len < 64) || (len > (NVRAM_SPACE * 2))) { + error = "Invalid file"; + goto ERROR; + } + + if ((buf = malloc(len)) == NULL) { + error = "Not enough memory"; + goto ERROR; + } + + n = web_read(buf, len); + len -= n; + + strcpy(tmp, "/tmp/restoreXXXXXX"); + mktemp(tmp); + if (f_write(tmp, buf, n, 0, 0600) != n) { + error = "Error writing temporary file"; + goto ERROR; + } + + rboot = 1; + prepare_upgrade(); + + char msg[64]; + static char *args[] = { + NVRAMCMD, "restore", NULL, NULL + }; + + args[2] = tmp; + + sprintf(msg, ">%s.msg", tmp); + + if (_eval(args, msg, 0, NULL) != 0) { + resmsg_fread(msg + 1); + } +#ifndef DEBUG + unlink(msg + 1); +#endif + error = NULL; + +ERROR: + free(buf); + if (error != NULL) resmsg_set(error); + web_eat(len); +#ifndef DEBUG + if (tmp[0]) unlink(tmp); +#endif +} + + +void wo_restore(char *url) +{ + if (rboot) { + parse_asp("reboot.asp"); + web_close(); + + killall("pppoecd", SIGTERM); + sleep(2); + +#ifdef DEBUG + cprintf("---reboot=%d\n", rboot); +#else + set_action(ACT_REBOOT); + // kill(1, SIGTERM); + sync(); + reboot(RB_AUTOBOOT); +#endif + exit(0); + } + + parse_asp("error.asp"); +} |