int resmsg_fread(const char *fname) { char s[256]; char *p; f_read_string(fname, s, sizeof(s)); if ((p = strchr(s, '\n')) != NULL) *p = 0; if (s[0]) { resmsg_set(s); return 1; } return 0; }
void wi_bwmrestore(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 > 10240)) { goto ERROR; } if ((buf = malloc(len)) == NULL) { error = "Not enough memory"; goto ERROR; } n = web_read(buf, len); len -= n; sprintf(tmp, "%s.new", hfn); if (f_write(tmp, buf, n, 0, 0600) != n) { unlink(tmp); error = "Error writing temporary file"; goto ERROR; } f_write("/var/tmp/rstats-load", NULL, 0, 0, 0600); killall("rstats", SIGHUP); sleep(1); error = NULL; rboot = 1; // used as "ok" ERROR: free(buf); web_eat(len); if (error != NULL) resmsg_set(error); }
static void wo_tomato(char *url) { char *v; int i; int ajax; int nvset; const char *red; int commit; // _dprintf("tomato.cgi\n"); red = webcgi_safeget("_redirect", ""); if (!*red) send_header(200, NULL, mime_html, 0); commit = atoi(webcgi_safeget("_commit", "1")); ajax = atoi(webcgi_safeget("_ajax", "0")); nvset = atoi(webcgi_safeget("_nvset", "1")); if (nvset) { if (!save_variables(0)) { if (ajax) { web_printf("@msg:%s", resmsg_get()); } else { parse_asp("error.asp"); } return; } commit = save_variables(1) && commit; resmsg_set("設定已儲存."); } rboot = atoi(webcgi_safeget("_reboot", "0")); if (rboot) { parse_asp("reboot.asp"); } else { if (ajax) { web_printf("@msg:%s", resmsg_get()); } else if (atoi(webcgi_safeget("_moveip", "0"))) { parse_asp("saved-moved.asp"); } else if (!*red) { parse_asp("saved.asp"); } } if (commit) { _dprintf("commit from tomato.cgi\n"); if (!nvram_match("debug_nocommit", "1")) { nvram_commit(); } } if ((v = webcgi_get("_service")) != NULL) { if (!*red) { if (ajax) web_printf(" 某些服務已重新啟動..."); web_close(); } sleep(1); if (*v == '*') { kill(1, SIGHUP); } else if (*v != 0) { exec_service(v); } } for (i = atoi(webcgi_safeget("_sleep", "0")); i > 0; --i) sleep(1); if (*red) redirect(red); if (rboot) { web_close(); sleep(1); kill(1, SIGTERM); } }
static int save_variables(int write) { const nvset_t *v; char *p, *e; int n; long l; unsigned u[6]; int ok; char s[256]; int dirty; static const char *msgf = "欄位 \"%s\" 不正確. 請回報這個問題."; dirty = 0; for (v = nvset_list; v->name; ++v) { // _dprintf("[%s] %p\n", v->name, webcgi_get((char*)v->name)); if ((p = webcgi_get((char*)v->name)) == NULL) continue; ok = 1; switch (v->vtype) { case VT_TEXT: p = unix_string(p); // NOTE: p = malloc'd // drop case VT_LENGTH: n = strlen(p); if ((n < v->va.i) || (n > v->vb.i)) ok = 0; break; case VT_RANGE: l = strtol(p, &e, 10); if ((p == e) || (*e) || (l < v->va.l) || (l > v->vb.l)) ok = 0; break; case VT_IP: if ((sscanf(p, "%3u.%3u.%3u.%3u", &u[0], &u[1], &u[2], &u[3]) != 4) || (u[0] > 255) || (u[1] > 255) || (u[2] > 255) || (u[3] > 255)) ok = 0; break; case VT_MAC: if ((sscanf(p, "%2x:%2x:%2x:%2x:%2x:%2x", &u[0], &u[1], &u[2], &u[3], &u[4], &u[5]) != 6) || (u[0] > 255) || (u[1] > 255) || (u[2] > 255) || (u[3] > 255) || (u[4] > 255) || (u[5] > 255)) ok = 0; break; default: // shutup gcc break; } if (!ok) { if (v->vtype == VT_TEXT) free(p); sprintf(s, msgf, v->name); resmsg_set(s); return 0; } if (write) { if (!nvram_match((char *)v->name, p)) { if (v->vtype != VT_TEMP) dirty = 1; nvram_set(v->name, p); } } if (v->vtype == VT_TEXT) free(p); } // special cases char *p1, *p2; if (((p1 = webcgi_get("set_password_1")) != NULL) && (strcmp(p1, "**********") != 0)) { if (((p2 = webcgi_get("set_password_2")) != NULL) && (strcmp(p1, p2) == 0)) { if ((write) && (!nvram_match("http_passwd", p1))) { dirty = 1; nvram_set("http_passwd", p1); } } else { sprintf(s, msgf, "password"); resmsg_set(s); return 0; } } for (n = 0; n < 50; ++n) { sprintf(s, "rrule%d", n); if ((p = webcgi_get(s)) != NULL) { if (strlen(p) > 2048) { sprintf(s, msgf, s); resmsg_set(s); return 0; } if ((write) && (!nvram_match(s, p))) { dirty = 1; nvram_set(s, p); } } } return (write) ? dirty : 1; }