示例#1
0
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;
}
示例#2
0
文件: bwm.c 项目: NieHao/Tomato-RAF
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);
}
示例#3
0
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);
	}
}
示例#4
0
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;
}