コード例 #1
0
void start_sysinit(void)
{
	time_t tm = 0;

	if (!nvram_match("disable_watchdog", "1"))
		eval("watchdog");
	/*
	 * Setup console 
	 */

	cprintf("sysinit() klogctl\n");
	klogctl(8, NULL, atoi(nvram_safe_get("console_loglevel")));
	cprintf("sysinit() get router\n");

	/*
	 * network drivers 
	 */
	fprintf(stderr, "load ATH Ethernet Driver\n");
	system("insmod ag71xx || insmod ag7240_mod");
	insmod("ledtrig-netdev");

	FILE *fp = fopen("/dev/mtdblock/0", "rb");
	char mac[32];
	if (fp) {
		unsigned char buf2[256];
		fseek(fp, 0x1fc00, SEEK_SET);
		fread(buf2, 256, 1, fp);
		fclose(fp);
		unsigned int copy[256];
		int i;
		for (i = 0; i < 256; i++)
			copy[i] = buf2[i] & 0xff;
		sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", copy[0], copy[1], copy[2], copy[3], copy[4], copy[5]);
		fprintf(stderr, "configure eth0 to %s\n", mac);
		MAC_SUB(mac);
		eval("ifconfig", "eth0", "hw", "ether", mac);
		MAC_ADD(mac);
		MAC_ADD(mac);
		fprintf(stderr, "configure eth1 to %s\n", mac);
		eval("ifconfig", "eth1", "hw", "ether", mac);
#ifndef HAVE_ATH9K
		MAC_SUB(mac);
#endif
	}

	eval("ifconfig", "eth0", "up");
	eval("ifconfig", "eth1", "up");

#ifdef HAVE_SWCONFIG

#ifdef HAVE_WDR2543
	system("swconfig dev switch0 set reset 1");
	system("swconfig dev switch0 set enable_vlan 1");
	system("swconfig dev switch0 vlan 1 set ports \"1 2 3 4 9t\"");
	system("swconfig dev switch0 vlan 2 set ports \"0 9t\"");
	system("swconfig dev switch0 set apply");
	eval("vconfig", "set_name_type", "VLAN_PLUS_VID_NO_PAD");
	eval("vconfig", "add", "eth0", "1");
	eval("vconfig", "add", "eth0", "2");

#else
	system("swconfig dev eth1 set reset 1");
	system("swconfig dev eth1 set enable_vlan 0");
	system("swconfig dev eth1 vlan 1 set ports \"0 1 2 3 4\"");
	system("swconfig dev eth1 set apply");
	setEthLED(17, "eth0");
	setSwitchLED(13, 0x2);
	setSwitchLED(14, 0x4);
	setSwitchLED(15, 0x8);
	setSwitchLED(16, 0x10);
#endif

#endif

	struct ifreq ifr;
	int s;

	if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW))) {
		char eabuf[32];

		strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
		ioctl(s, SIOCGIFHWADDR, &ifr);
		nvram_set("et0macaddr", ether_etoa((unsigned char *)ifr.ifr_hwaddr.sa_data, eabuf));
		nvram_set("et0macaddr_safe", ether_etoa((unsigned char *)ifr.ifr_hwaddr.sa_data, eabuf));
		close(s);
	}
	detect_wireless_devices();
#ifndef HAVE_ATH9K
	fprintf(stderr, "configure wifi0 to %s\n", mac);
	eval("ifconfig", "wifi0", "hw", "ether", mac);
#endif
	//enable wlan led (card gpio based)
#if defined(HAVE_WR841v7) || defined(HAVE_WR842) || defined(HAVE_MR3420)
	setWirelessLedPhy0(0);
#else
	setWirelessLedPhy0(1);
#endif
	led_control(LED_POWER, LED_ON);
	led_control(LED_SES, LED_OFF);
	led_control(LED_SES2, LED_OFF);
	led_control(LED_DIAG, LED_OFF);
	led_control(LED_BRIDGE, LED_OFF);
	led_control(LED_WLAN0, LED_OFF);
	led_control(LED_WLAN1, LED_OFF);
	led_control(LED_CONNECTED, LED_OFF);

	/*
	 * Set a sane date 
	 */
	stime(&tm);
	nvram_set("wl0_ifname", "ath0");

	return;
	cprintf("done\n");
}
コード例 #2
0
static int import_main(int argc, char **argv)
{
	FILE *f;
	char s[10240];
	int n;
	char *k, *v;
	char *p, *q;
	int all;
	int same, skip, set;

	all = 0;
	if (strcmp(argv[1], "--forceall") == 0) {
		all = 1;
		++argv;
	}
	
	if ((f = fopen(argv[1], "r")) == NULL) {
		printf("Error opening file.\n");
		return 1;
	}
	
	same = skip = set = 0;

	while (fgets(s, sizeof(s), f) != NULL) {
		n = strlen(s);
		while ((--n > 0) && (isspace(s[n]))) ;
		if ((n <= 0) || (s[n] != '"')) continue;
		s[n] = 0;
		
		k = s;
		while (isspace(*k)) ++k;
		if (*k != '"') continue;
		++k;
		
		if ((v = strchr(k, '=')) == NULL) continue;
		*v++ = 0;
		
		p = q = v;
		while (*p) {
			if (*p == '\\') {
				++p;
				switch (*p) {
				case 't':
					*q++ = '\t';
					break;
				case 'r':
					*q++ = '\n';
					break;
				case 'n':
					*q++ = '\n';
					break;
				case '\\':
				case '"':
					*q++ = *p;
					break;
				default:
					printf("Error unescaping %s=%s\n", k, v);
					return 1;
				}
			}
			else {
				*q++ = *p;
			}
			++p;
		}
		*q = 0;
		
		if ((all) || (in_defaults(k))) {
			if (nvram_match(k, v)) {
				++same;
//				printf("SAME: %s=%s\n", k, v);
			}
			else {
				++set;
				printf("%s=%s\n", k, v);
				nvram_set(k, v);
			}
		}
		else {
			++skip;
//			printf("SKIP: %s=%s\n", k, v);
		}
	}

	fclose(f);	
	
	printf("---\n%d skipped, %d same, %d set\n", skip, same, set);
	return 0;
}
コード例 #3
0
int init_dualwan(int argc, char *argv[])
{
	int unit = 0;
	int caps;
	int if_id;
	char wan_if[10];

	caps = get_wans_dualwan();

	if ( (caps & WANSCAP_WAN) && (caps & WANSCAP_LAN))
		nvram_set("wandevs", WANDEVS_DUAL);
	else
		nvram_set("wandevs", WANDEVS_SING);

	set_lan_phy(LANIF_ETH);

	if (!(caps & WANSCAP_2G))
		add_lan_phy(LANIF_2G);
#ifdef RTCONFIG_HAS_5G
	if (!(caps & WANSCAP_5G))
		add_lan_phy(LANIF_5G);
#endif

	if (nvram_get("wans_dualwan")) {
		set_wan_phy("");
		for(unit = WAN_UNIT_FIRST; unit < WAN_UNIT_MAX; ++unit) {
			if_id = get_dualwan_by_unit(unit);
			if (if_id == WANS_DUALWAN_IF_LAN) {
				if (caps & WANSCAP_WAN)
					add_wan_phy(WANIF_WAN1);
				else
					add_wan_phy(WANIF_ETH);
			}
			else if (if_id == WANS_DUALWAN_IF_2G)
				add_wan_phy(LANIF_2G);
#ifdef RTCONFIG_HAS_5G
			else if (if_id == WANS_DUALWAN_IF_5G)
				add_wan_phy(LANIF_5G);
#endif
			else if (if_id == WANS_DUALWAN_IF_WAN) {
				/* tag by IPTV */
				if (nvram_get("switch_wantag") && !nvram_match("switch_wantag", "") && !nvram_match("switch_wantag", "none")) {
					if (!nvram_match("switch_wan0tagid", "")) {
						sprintf(wan_if, "vlan%s", nvram_safe_get("switch_wan0tagid"));
						add_wan_phy(wan_if);
					}
					else
						add_wan_phy(WANIF_ETH);
				}
				else if (caps &WANSCAP_LAN)
					add_wan_phy(WANIF_WAN0);
				else
					add_wan_phy(WANIF_ETH);
			}
#ifdef RTCONFIG_USB_MODEM
			else if (if_id == WANS_DUALWAN_IF_USB)
				add_wan_phy(WANIF_USB);
#endif
		}
	}
#ifdef RTCONFIG_USB_MODEM
	else
		nvram_set("wan_ifnames", WANIF_ETH_USB);
#endif
}
コード例 #4
0
ファイル: qos.c プロジェクト: ECRS/Asus-RT-N16
// in mangle table
void ipt_qos(void)
{
	char *buf;
	char *g;
	char *p;
	char *addr_type, *addr;
	char *proto;
	char *port_type, *port;
	char *class_prio;
	char *ipp2p, *layer7;
	char *bcount;
	char *dscp;
	char *desc;
	int class_num;
	int proto_num;
	int v4v6_ok;
	int i;
	char sport[192];
	char saddr[192];
	char end[256];
	char s[32];
	char app[128];
	int inuse;
	const char *chain;
	unsigned long min;
	unsigned long max;
	unsigned long prev_max;
	int gum;
	const char *qface;
	int sizegroup;
	int class_flag;
	int rule_num;

	if (!nvram_get_int("qos_enable")) return;

	inuse = 0;
	gum = 0x100;
	sizegroup = 0;
	prev_max = 0;
	rule_num = 0;

	ip46t_write(
		":QOSO - [0:0]\n"
		"-A QOSO -j CONNMARK --restore-mark --mask 0xff\n"
		"-A QOSO -m connmark ! --mark 0/0x0f00 -j RETURN\n");

	g = buf = strdup(nvram_safe_get("qos_orules"));
	while (g) {

		/*

		addr_type<addr<proto<port_type<port<ipp2p<L7<bcount<dscp<class_prio<desc

		addr_type:
			0 = any
			1 = dest ip
			2 = src ip
			3 = src mac
		addr:
			ip/mac if addr_type == 1-3
		proto:
			0-65535 = protocol
			-1 = tcp or udp
			-2 = any protocol
		port_type:
			if proto == -1,tcp,udp:
				d = dest
				s = src
				x = both
				a = any
		port:
			port # if proto == -1,tcp,udp
		bcount:
			min:max
			blank = none
		dscp:
			empty - any
			numeric (0:63) - dscp value
			afXX, csX, be, ef - dscp class
		class_prio:
			0-10				// was 0-8 - Changed from 8 in pkt_sched.h - Toastman
			-1 = disabled

		*/

		if ((p = strsep(&g, ">")) == NULL) break;
		i = vstrsep(p, "<", &addr_type, &addr, &proto, &port_type, &port, &ipp2p, &layer7, &bcount, &dscp, &class_prio, &desc);
		rule_num++;
		if (i == 10) {
			// fixup < v1.28.XX55
			desc = class_prio;
			class_prio = dscp;
			dscp = "";
		}
		else if (i == 9) {
			// fixup < v0.08		// !!! temp
			desc = class_prio;
			class_prio = bcount;
			bcount = "";
			dscp = "";
		}
		else if (i != 11) continue;

		class_num = atoi(class_prio);
		if ((class_num < 0) || (class_num > 9)) continue;

		i = 1 << class_num;
		++class_num;

		if ((inuse & i) == 0) {
			inuse |= i;
		}
		
		v4v6_ok = IPT_V4;
#ifdef TCONFIG_IPV6
		if (ipv6_enabled())
			v4v6_ok |= IPT_V6;
#endif
		class_flag = gum;

		//
		if (ipt_ipp2p(ipp2p, app)) v4v6_ok &= ~IPT_V6;
		else ipt_layer7(layer7, app);
		if (app[0]) {
			v4v6_ok &= ~IPT_V6; // temp: l7 not working either!
			class_flag = 0x100;
			// IPP2P and L7 rules may need more than one packet before matching
			// so port-based rules that come after them in the list can't be sticky
			// or else these rules might never match.
			gum = 0;
		}
		strcpy(end, app);

		// dscp
		if (ipt_dscp(dscp, s)) {
#ifndef LINUX26
			v4v6_ok &= ~IPT_V6; // dscp ipv6 match is not present in K2.4
#endif
			strcat(end, s);
		}

		// mac or ip address
		if ((*addr_type == '1') || (*addr_type == '2')) {	// match ip
			v4v6_ok &= ipt_addr(saddr, sizeof(saddr), addr, (*addr_type == '1') ? "dst" : "src", 
				v4v6_ok, (v4v6_ok==IPT_V4), "QoS", desc);
			if (!v4v6_ok) continue;
		}
		else if (*addr_type == '3') {						// match mac
			sprintf(saddr, "-m mac --mac-source %s", addr);	// (-m mac modified, returns !match in OUTPUT)
		}
		else {
			saddr[0] = 0;
		}


		// -m connbytes --connbytes x:y --connbytes-dir both --connbytes-mode bytes
		if (*bcount) {
			min = strtoul(bcount, &p, 10);
			if (*p != 0) {
				strcat(end, " -m connbytes --connbytes-mode bytes --connbytes-dir both --connbytes ");
				++p;
				if (*p == 0) {
					sprintf(end + strlen(end), "%lu:", min * 1024);
				}
				else {
					max = strtoul(p, NULL, 10);
					sprintf(end + strlen(end), "%lu:%lu", min * 1024, (max * 1024) - 1);
					if (gum) {
						if (!sizegroup) {
							// Create table of connbytes sizes, pass appropriate connections there
							// and only continue processing them if mark was wiped
							ip46t_write(
								":QOSSIZE - [0:0]\n"
								"-I QOSO 3 -m connmark ! --mark 0/0xff000 -j QOSSIZE\n"
								"-I QOSO 4 -m connmark ! --mark 0/0xff000 -j RETURN\n");
						}
						if (max != prev_max && sizegroup<255) {
							class_flag = ++sizegroup << 12;
							prev_max = max;
							ip46t_flagged_write(v4v6_ok,
								"-A QOSSIZE -m connmark --mark 0x%x/0xff000"
								" -m connbytes --connbytes-mode bytes --connbytes-dir both --connbytes %lu: -j CONNMARK --set-return 0x00000/0xFF\n",
									(sizegroup << 12), (max * 1024));
						}
						else {
							class_flag = sizegroup << 12;
						}
					}
				}

			}
			else {
				bcount = "";
			}
		}

		chain = "QOSO";
		class_num |= class_flag;
		class_num |= rule_num << 20;
		sprintf(end + strlen(end), " -j CONNMARK --set-return 0x%x/0xFF\n", class_num);

		// protocol & ports
		proto_num = atoi(proto);
		if (proto_num > -2) {
			if ((proto_num == 6) || (proto_num == 17) || (proto_num == -1)) {
				if (*port_type != 'a') {
					if ((*port_type == 'x') || (strchr(port, ','))) {
						// dst-or-src port matches, and anything with multiple lists "," use multiport
						sprintf(sport, "-m multiport --%sports %s", (*port_type == 's') ? "s" : ((*port_type == 'd') ? "d" : ""), port);
					}
					else {
						// single or simple x:y range, use built-in tcp/udp match
						sprintf(sport, "--%sport %s", (*port_type == 's') ? "s" : ((*port_type == 'd') ? "d" : ""), port);
					}
				}
				else {
					sport[0] = 0;
				}
				if (proto_num != 6) ip46t_flagged_write(v4v6_ok, "-A %s -p %s %s %s %s", chain, "udp", sport, saddr, end);
				if (proto_num != 17) ip46t_flagged_write(v4v6_ok, "-A %s -p %s %s %s %s", chain, "tcp", sport, saddr, end);
			}
			else {
				ip46t_flagged_write(v4v6_ok, "-A %s -p %d %s %s", chain, proto_num, saddr, end);
			}
		}
		else {	// any protocol
			ip46t_flagged_write(v4v6_ok, "-A %s %s %s", chain, saddr, end);
		}

	}
	free(buf);

	qface = wanfaces.iface[0].name;

	i = nvram_get_int("qos_default");
	if ((i < 0) || (i > 9)) i = 3;	// "low"
	class_num = i + 1;
	class_num |= 0xFF00000; // use rule_num=255 for default
	ip46t_write("-A QOSO -j CONNMARK --set-return 0x%x\n", class_num);
	
	ipt_write(
		"-A FORWARD -o %s -j QOSO\n"
		"-A OUTPUT -o %s -j QOSO\n",
			qface, qface);

#ifdef TCONFIG_IPV6
	if (*wan6face) {
		ip6t_write(
			"-A FORWARD -o %s -j QOSO\n"
			"-A OUTPUT -o %s -j QOSO\n",
			wan6face, wan6face);
	}
#endif

	inuse |= (1 << i) | 1;	// default and highest are always built
	sprintf(s, "%d", inuse);
	nvram_set("qos_inuse", s);


	g = buf = strdup(nvram_safe_get("qos_irates"));
	
	for (i = 0; i < 10; ++i) 
	{
		if ((!g) || ((p = strsep(&g, ",")) == NULL)) continue;
		if ((inuse & (1 << i)) == 0) continue;
		
		unsigned int rate;
		unsigned int ceil;
		
		// check if we've got a percentage definition in the form of "rate-ceiling"
		// and that rate > 1
		if ((sscanf(p, "%u-%u", &rate, &ceil) == 2) && (rate >= 1))
		{		
			ipt_write("-A PREROUTING -i %s -j CONNMARK --restore-mark --mask 0xff\n", qface);


		if (nvram_get_int("qos_udp")) {
			ipt_write("-A PREROUTING -i %s -p tcp -j IMQ --todev %s\n", qface, qosImqDeviceNumberString);	// pass only tcp
		}
		else {
			ipt_write("-A PREROUTING -i %s -j IMQ --todev %s\n", qface, qosImqDeviceNumberString);	// pass everything thru ingress
		}

#ifdef TCONFIG_IPV6
			if (*wan6face)
			{
				ip6t_write("-A PREROUTING -i %s -j CONNMARK --restore-mark --mask 0xff\n", wan6face);

				if (nvram_get_int("qos_udp")) {
						ip6t_write("-A PREROUTING -i %s -p tcp -j IMQ --todev %s\n", wan6face, qosImqDeviceNumberString);	// pass only tcp
				}
				else {
						ip6t_write("-A PREROUTING -i %s -j IMQ --todev %s\n", wan6face, qosImqDeviceNumberString);	// pass everything thru ingress
				}
			}
#endif
			break;
		}
	}
	free(buf);
}
コード例 #5
0
ファイル: shutils.c プロジェクト: schidler/flyzjhz-rt-n56u
void time_zone_x_mapping()
{
	char tmpstr[32];
	char *ptr;

	strcpy(tmpstr, nvram_safe_get("time_zone"));

	/* replace . with : */
	if ((ptr=strchr(tmpstr, '.'))!=NULL) *ptr = ':';
	/* remove *_? */
	if ((ptr=strchr(tmpstr, '_'))!=NULL) *ptr = 0x0;

	/* special mapping */
	if (strcmp(tmpstr, "JST") == 0)
		nvram_set("time_zone_x", "UCT-9");
	else if (strcmp(tmpstr, "TST-10TDT") == 0)
		nvram_set("time_zone_x", "UCT-10");
	else if (strcmp(tmpstr, "CST-9:30CDT") == 0)
		nvram_set("time_zone_x", "UCT-9:30");
	else if (strcmp(tmpstr, "EET-2EETDST") == 0)
		nvram_set("time_zone_x", "EET-2EETDST,M3.5.0/3,M10.5.0/4");
	else if (strcmp(tmpstr, "MET-1METDST") == 0 ||
	         strcmp(tmpstr, "MEZ-1MESZ") == 0 ||
	         strcmp(tmpstr, "CET-1CEST") == 0)
		nvram_set("time_zone_x", "CET-1CEST,M3.5.0,M10.5.0/3");
	else if (strcmp(tmpstr, "GMT0BST") == 0)
		nvram_set("time_zone_x", "GMT0BST,M3.5.0/1,M10.5.0");
	else if (strcmp(tmpstr, "EUT1EUTDST") == 0)
		nvram_set("time_zone_x", "AZOT1AZOST,M3.5.0/0,M10.5.0/1");
	else if (strcmp(tmpstr, "BRT3BRST") == 0)
		nvram_set("time_zone_x", "BRT3BRST,M10.3.0/0,M2.3.0/0");
	else if (strcmp(tmpstr, "AST4ADT") == 0)
		nvram_set("time_zone_x", "AST4ADT,M3.2.0,M11.1.0");
	else if (strcmp(tmpstr, "EST5EDT") == 0)
		nvram_set("time_zone_x", "EST5EDT,M3.2.0,M11.1.0");
	else if (strcmp(tmpstr, "CST6CDT") == 0)
		nvram_set("time_zone_x", "CST6CDT,M3.2.0,M11.1.0");
	else if (strcmp(tmpstr, "MST7MDT") == 0)
		nvram_set("time_zone_x", "MST7MDT,M3.2.0,M11.1.0");
	else if (strcmp(tmpstr, "PST8PDT") == 0)
		nvram_set("time_zone_x", "PST8PDT,M3.2.0,M11.1.0");
	else if (strcmp(tmpstr, "NAST9NADT") == 0)
		nvram_set("time_zone_x", "AKST9AKDT,M3.2.0,M11.1.0");
	else
		nvram_set("time_zone_x", tmpstr);

	doSystem("echo %s > /etc/TZ", nvram_safe_get("time_zone_x"));
}
コード例 #6
0
int led_control(int which, int mode)
{
	int use_gpio;
//	int gpio_value;
	int enable, disable;
	int model;

	model = get_model();

	// Did the user disable the leds?
	if ((mode == LED_ON) && (nvram_get_int("led_disable") == 1) && (which != LED_TURBO)
#ifdef RTCONFIG_QTN
		&& (which != BTN_QTN_RESET)
#endif
	)
		return 0;

	get_gpio_values_once();
	switch(which) {
		case LED_POWER:
			use_gpio = led_pwr_gpio;
			break;
		case LED_USB:
			use_gpio = led_usb_gpio;
			break;
		case LED_USB3:
			use_gpio = led_usb3_gpio;
			break;
		case LED_WPS:	
			use_gpio = led_wps_gpio;
			break;
		case LED_2G:
			if ((model == MODEL_RTN66U) || (model == MODEL_RTAC66U) || (model == MODEL_RTN16)) {
				if (mode == LED_ON)
					eval("wl", "-i", "eth1", "leddc", "0");
				else if (mode == LED_OFF)
					eval("wl", "-i", "eth1", "leddc", "1");
				use_gpio = 0xff;
			} else if (model == MODEL_RTAC56U) {
				if (mode == LED_ON)
					eval("wl", "-i", "eth1", "ledbh", "3", "7");
				else if (mode == LED_OFF)
					eval("wl", "-i", "eth1", "ledbh", "3", "0");
			} else if ((model == MODEL_RTAC68U) || (model == MODEL_RTAC87U)) {
				if (mode == LED_ON)
					eval("wl", "ledbh", "10", "7");
				else if (mode == LED_OFF)
					eval("wl", "ledbh", "10", "0");
			} else {
				use_gpio = led_2g_gpio;
			}
			break;
		case LED_5G_FORCED:
			if (model == MODEL_RTAC68U) {
				if (mode == LED_ON) {
					nvram_set("led_5g", "1");
		                        eval("wl", "-i", "eth2", "ledbh", "10", "7");
				} else if (mode == LED_OFF) {
					nvram_set("led_5g", "0");
					eval("wl", "-i", "eth2", "ledbh", "10", "0");
				}
				use_gpio = led_5g_gpio;
			}
			// Fall through regular LED_5G to handle other models
		case LED_5G:
			if ((model == MODEL_RTN66U) || (model == MODEL_RTN16)) {
                                if (mode == LED_ON)
                                        eval("wl", "-i", "eth2", "leddc", "0");
                                else if (mode == LED_OFF)
                                        eval("wl", "-i", "eth2", "leddc", "1");
				use_gpio = 0xff;
			} else if ((model == MODEL_RTAC66U) || (model == MODEL_RTAC56U)) {
				if (mode == LED_ON)
					nvram_set("led_5g", "1");
				else if (mode == LED_OFF)
					nvram_set("led_5g", "0");
				use_gpio = led_5g_gpio;
                        } else {
                                use_gpio = led_5g_gpio;
			}
#if defined(RTAC56U) || defined(RTAC56S)
			if(nvram_match("5g_fail", "1"))
				return -1;
#endif
			break;
#ifdef RTCONFIG_LAN4WAN_LED
		case LED_LAN1:
			use_gpio = led_lan1_gpio;
			break;
		case LED_LAN2:
			use_gpio = led_lan2_gpio;
			break;
		case LED_LAN3:
			use_gpio = led_lan3_gpio;
			break;
		case LED_LAN4:
			use_gpio = led_lan4_gpio;
			break;
#else
		case LED_LAN:
			use_gpio = led_lan_gpio;
			break;
#endif
		case LED_WAN:
			use_gpio = led_wan_gpio;
			break;
		case FAN:
			use_gpio = fan_gpio;
			break;
		case HAVE_FAN:
			use_gpio = have_fan_gpio;
			break;
		case LED_SWITCH:
			if (mode == LED_ON) {
				eval("et", "robowr", "0x00", "0x18", "0x01ff");
				eval("et", "robowr", "0x00", "0x1a", "0x01ff");
			} else if (mode == LED_OFF) {
				eval("et", "robowr", "0x00", "0x18", "0x01e0");
				eval("et", "robowr", "0x00", "0x1a", "0x01e0");
			}
			use_gpio = 0xff;
			break;
#ifdef RTCONFIG_LED_ALL
		case LED_ALL:
			use_gpio = led_all_gpio;
			break;
#endif
		case LED_TURBO:
			use_gpio = led_turbo_gpio;
			break;
#ifdef RTCONFIG_QTN
		case BTN_QTN_RESET:
			use_gpio = reset_qtn_gpio;
			break;
#endif
		default:
			use_gpio = 0xff;
			break;
	}

	if((use_gpio&0xff) != 0xff)
	{
		enable = (use_gpio&GPIO_ACTIVE_LOW)==0 ? 1 : 0;
		disable = (use_gpio&GPIO_ACTIVE_LOW)==0 ? 0: 1;

		switch(mode) {
			case LED_ON:
			case FAN_ON:
			case HAVE_FAN_ON:
				set_gpio((use_gpio&0xff), enable);
				break;
			case LED_OFF:	
			case FAN_OFF:
			case HAVE_FAN_OFF:
				set_gpio((use_gpio&0xff), disable);
				break;
		}
	}
	return 0;
}
コード例 #7
0
/*
 * Called when link goes down
 */
int ipdown_main(int argc, char **argv)
{
	if (check_action() != ACT_IDLE)
		return -1;
	runStartup("/etc/config", ".ipdown");
#ifdef HAVE_REGISTER
	if (isregistered_real())
#endif
	{
#ifdef HAVE_RB500
		runStartup("/usr/local/etc/config", ".ipdown");
#else
		runStartup("/jffs/etc/config", ".ipdown");
		runStartup("/mmc/etc/config", ".ipdown");
		runStartup("/tmp/etc/config", ".ipdown");
#endif
	}
	stop_ddns();
	stop_ntpc();

	unlink("/tmp/ppp/link");

	if (nvram_match("wan_proto", "l2tp")) {
		/*
		 * clear dns from the resolv.conf 
		 */
		nvram_set("wan_get_dns", "");
		dns_to_resolv();

		// todo
		route_del(nvram_safe_get("wan_ifname"), 0, nvram_safe_get("l2tp_server_ip"), nvram_safe_get("wan_gateway_buf"), "255.255.255.255");
		/*
		 * Restore the default gateway for WAN interface 
		 */
		nvram_set("wan_gateway", nvram_safe_get("wan_gateway_buf"));

		/*
		 * Set default route to gateway if specified 
		 */
		route_add(nvram_safe_get("wan_ifname"), 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0");
	}
	if (nvram_match("wan_proto", "pptp")) {
		eval("route", "del", "default");
		nvram_set("wan_gateway", nvram_safe_get("wan_gateway_buf"));
		eval("route", "add", "default", "gw", nvram_safe_get("wan_gateway"));
		sysprintf("iptables -t nat -A POSTROUTING -o %s -j MASQUERADE\n", nvram_safe_get("pptp_ifname"));
	}
#ifdef HAVE_3G
#if defined(HAVE_TMK) || defined(HAVE_BKM)
	else if (nvram_match("wan_proto", "3g")) {
		char *gpio3g = nvram_get("gpio3g");
		if (gpio3g != NULL)
			set_gpio(atoi(gpio3g), 0);
	}
#endif
#endif

	nvram_set("pppoe_ifname", "");
	nvram_set("pppd_pppifname", "");

	// write PPP traffic statistics to nvram if wanted
	if (nvram_match("ppp_traffic", "1")) {
		char buffer[64];
		long long old_in, old_out;
		long long in, out;
		char *pin;
		char *pout;
		time_t stamp;

		old_in = atol(nvram_safe_get("ppp_byte_in"));
		old_out = atol(nvram_safe_get("ppp_byte_out"));

		if ((pin = getenv("BYTES_RCVD")))
			in = atol(pin);
		else
			in = 0;

		if ((pout = getenv("BYTES_SENT")))
			out = atol(pout);
		else
			out = 0;

		in += old_in;
		out += old_out;
		snprintf(buffer, 63, "%lld", in);
		nvram_set("ppp_byte_in", buffer);
		snprintf(buffer, 63, "%lld", out);
		nvram_set("ppp_byte_out", buffer);
		if ((stamp = time(NULL)) < 1087818160)	// clock is not set
			// properly
			stamp = 0;
		snprintf(buffer, 63, "%ld", stamp);
		nvram_set("ppp_byte_stamp", buffer);
		nvram_commit();
	}

	if (nvram_match("ppp_demand", "1")
	    && (nvram_match("wan_proto", "pptp")
		|| nvram_match("wan_proto", "l2tp")
		|| nvram_match("wan_proto", "pppoe"))) {
		stop_process("listen", "activity listener");
		eval("listen", nvram_safe_get("lan_ifname"));
	}

	return 1;
}
コード例 #8
0
int main(int argc, char **argv)
{
	char *dev;
	int oldMonitor, newMonitor;
	u_char packet[4096];
	int pktlen;
	wiviz_cfg cfg;
	int i;
	int defaultHopSeq[] = { 1, 3, 6, 8, 11 };
	int s, one;
	memset(&cfg, 0, sizeof(cfg));
#ifdef HAVE_RT2880
	wl_dev = "ra0";
#elif HAVE_MADWIFI
	wl_dev = nvram_safe_get("wifi_display");
#else
	char tmp[32];
	sprintf(tmp, "%s_ifname", nvram_safe_get("wifi_display"));
	wl_dev = nvram_safe_get(tmp);
#endif
	if (argc > 1)
		if (!strcmp(argv[1], "terminate")) {
#ifdef HAVE_MADWIFI
			// return to original channel
#ifdef HAVE_ATH9K
			if (!is_ath9k(wl_dev))
#endif
			{
				sysprintf("iwconfig %s channel %sM", get_monitor(), nvram_nget("%s_channel", nvram_safe_get("wifi_display")));
				sleep(1);
				sysprintf("ifconfig %s down", get_monitor());
				if (is_ar5008(nvram_safe_get("wifi_display"))) {
					sysprintf("80211n_wlanconfig %s destroy", get_monitor());
				} else {
					sysprintf("wlanconfig %s destroy", get_monitor());
				}
			}
#elif HAVE_RT2880
			nvram_set("wl0_mode", nvram_safe_get("wl0_oldmode"));
			sysprintf("startservice configurewifi");
			if (nvram_match("wl0_mode", "sta") || nvram_match("wl0_mode", "apsta")) {
				sysprintf("startstop wan");
			}
#else
			oldMonitor = 0;
			wl_ioctl(wl_dev, WLC_SET_MONITOR, &oldMonitor, 4);
#endif
			return 0;
		}

	global_cfg = &cfg;
	signal(SIGUSR1, &signal_handler);
	signal(SIGUSR2, &signal_handler);

	printf("Wi-Viz 2 infogathering daemon by Nathan True\n");
	printf("http://wiviz.natetrue.com\n");

	memset(&cfg, 0, sizeof(wiviz_cfg));
	cfg.numHosts = 0;
	cfg.lastKeepAlive = time(NULL);
	cfg.channelHopping = 0;
	cfg.channelDwellTime = 1000;
	cfg.channelHopSeqLen = 5;
	memcpy(cfg.channelHopSeq, defaultHopSeq, sizeof(defaultHopSeq));

#if !defined(HAVE_MADWIFI) && !defined(HAVE_RT2880)
	wl_ioctl(wl_dev, WLC_GET_MAGIC, &i, 4);
	if (i != WLC_IOCTL_MAGIC) {
		printf("Wireless magic not correct, not querying wl for info %X!=%X\n", i, WLC_IOCTL_MAGIC);
		cfg.readFromWl = 0;
	} else {
		cfg.readFromWl = 1;
		wl_ioctl(wl_dev, WLC_GET_MONITOR, &oldMonitor, 4);
		newMonitor = 1;
		wl_ioctl(wl_dev, WLC_SET_MONITOR, &newMonitor, 4);
	}

#elif HAVE_RT2880
	nvram_set("wl0_oldmode", nvram_safe_get("wl0_mode"));
	nvram_set("wl0_mode", "sta");
	if (!nvram_match("wl0_oldmode", "sta"))
		sysprintf("startservice configurewifi");
	sysprintf("iwconfig ra0 mode monitor");
	cfg.readFromWl = 1;
#else
#ifdef HAVE_ATH9K
	if (!is_ath9k(nvram_safe_get("wifi_display")))
#endif
	{
		if (is_ar5008(nvram_safe_get("wifi_display"))) {
			sysprintf("80211n_wlanconfig %s create wlandev %s wlanmode monitor", get_monitor(), getWifi(nvram_safe_get("wifi_display")));
		} else {
			sysprintf("wlanconfig %s create wlandev %s wlanmode monitor", get_monitor(), getWifi(nvram_safe_get("wifi_display")));
		}
		sysprintf("ifconfig %s up", get_monitor());
	}
	cfg.readFromWl = 1;
#endif
	reloadConfig();

#if defined(HAVE_MADWIFI) || defined(HAVE_RT2880)
	s = openMonitorSocket(get_monitor());	// for testing we use ath0
#else

	if (nvram_match("wifi_display", "wl1"))
		s = openMonitorSocket("prism1");
	else
		s = openMonitorSocket("prism0");
#endif
	if (s == -1)
		return;
	one = 1;
	ioctl(s, FIONBIO, (char *)&one);

	if (cfg.readFromWl) {
		readWL(&cfg);
	}
#ifdef WIVIZ_GPS
	gps_init(&cfg);
#endif

	while (!stop) {
#ifdef WIVIZ_GPS
		gps_tick();
#else
		if (time(NULL) - cfg.lastKeepAlive > 30)
			stop = 1;
#endif
		pktlen = recv(s, packet, 4096, 0);
		if (pktlen <= 0)
			continue;
		dealWithPacket(&cfg, pktlen, packet);
	}

	signal_handler(SIGUSR1);

	if (cfg.channelHopperPID)
		kill(cfg.channelHopperPID, SIGKILL);

#ifndef WIVIZ_GPS
	for (i = 0; i < MAX_HOSTS; i++) {
		print_host(stderr, cfg.hosts + i);
		if (cfg.hosts[i].occupied)
			printf("\n");
		if (cfg.hosts[i].apInfo)
			free(cfg.hosts[i].apInfo);
		if (cfg.hosts[i].staInfo)
			free(cfg.hosts[i].staInfo);
	}
#endif
	close(s);
	return 0;
}
コード例 #9
0
int start_timemachine()
{
	int ret = 0;
	char cnid_path[80];
	char backup_path[80];
	char token_path[80];
	char test_log[100];
	char *mount_point_name;

	char prefix[] = "usb_pathXXXXXXXXXXXXXXXXX_", tmp[100];
	char usb1_vid[8], usb1_pid[8], usb1_serial[64];
	char usb2_vid[8], usb2_pid[8], usb2_serial[64];

	snprintf(prefix, sizeof(prefix), "usb_path%s", "1");
	memset(usb1_vid, 0, 8);
	strncpy(usb1_vid, nvram_safe_get(strcat_r(prefix, "_vid", tmp)), 8);
	memset(usb1_pid, 0, 8);
	strncpy(usb1_pid, nvram_safe_get(strcat_r(prefix, "_pid", tmp)), 8);
	memset(usb1_serial, 0, 64);
	strncpy(usb1_serial, nvram_safe_get(strcat_r(prefix, "_serial", tmp)), 8);

	snprintf(prefix, sizeof(prefix), "usb_path%s", "2");
	memset(usb2_vid, 0, 8);
	strncpy(usb2_vid, nvram_safe_get(strcat_r(prefix, "_vid", tmp)), 8);
	memset(usb2_pid, 0, 8);
	strncpy(usb2_pid, nvram_safe_get(strcat_r(prefix, "_pid", tmp)), 8);
	memset(usb2_serial, 0, 64);
	strncpy(usb2_serial, nvram_safe_get(strcat_r(prefix, "_serial", tmp)), 8);

	//clear_timemachine_tokeninfo();
	//find_tokenfile_partition();

	if(!nvram_match("timemachine_enable", "1"))
		return -1;

	if(nvram_safe_get("tm_device_name") == NULL)
	{
		_dprintf("Timemachine: no device name to backup\n");
		logmessage("Timemachine", "no device name to backup");
		return -1;
	}
#if 1
	if(nvram_match("tm_ui_setting", "1")){
		logmessage("Timemachine", "User select disk start TimeMachine");
		mount_point_name = find_mountpoint(nvram_safe_get("tm_device_name"));
		nvram_set("tm_ui_setting", "0");
	}else{
	//check mountpoint exchange or not
	if(!nvram_match("tm_usb_path_vid", "")
		&& (nvram_match("tm_usb_path_vid",usb1_vid)) 
		&& (nvram_match("tm_usb_path_pid",usb1_pid)) 
		&& (nvram_match("tm_usb_path_serial",usb1_serial)))
	{
		sprintf(test_log, "Time Machine interface1 change %s -> %s", nvram_safe_get("tm_device_name"),nvram_safe_get("tm_partition_num"));
		mount_point_name = find_mountpoint(nvram_safe_get("tm_device_name"));
		logmessage("Timemachine", test_log);
	}
	else if(!nvram_match("tm_usb_path_vid", "")
		&& (nvram_match("tm_usb_path_vid",usb2_vid)) 
		&& (nvram_match("tm_usb_path_pid",usb2_pid))
		&& (nvram_match("tm_usb_path_serial",usb2_serial)))
	{
		sprintf(test_log, "tm_device_name interface2 change %s -> %s", nvram_safe_get("tm_device_name"),nvram_safe_get("tm_partition_num"));
		mount_point_name = find_mountpoint(nvram_safe_get("tm_device_name"));
		logmessage("Timemachine", test_log);
	}else{
		logmessage("Timemachine", "No disk to auto start TimeMachine");
		mount_point_name = find_mountpoint(nvram_safe_get("tm_device_name"));
	}
	}
#endif

	if(mount_point_name == NULL)
	{
		_dprintf("Timemachine: can not find the correct mount point name\n");
		logmessage("Timemachine", "can not find the correct mount point name");
		return -1;
	}

	if(!check_if_dir_exist(mount_point_name))
	{
		_dprintf("Timemachine: mount point name doesn't exist\n");
		logmessage("Timemachine", "mount point name doesn't exist");
		return -1;
	}

	// Create directory for use by afpd daemon and configuration file
	//if(!check_if_dir_exist(AFP_LOCK_PATH)) mkdir(AFP_LOCK_PATH, 0777);
	//if(!check_if_dir_exist(AFP_CONFIG_PATH)) mkdir(AFP_CONFIG_PATH, 0777);
	mkdir_if_none(AFP_LOCK_PATH);
	mkdir_if_none(AFP_CONFIG_PATH);

	// Create directory for use by avahi daemon and configuration file
	//if(!check_if_dir_exist(AVAHI_CONFIG_PATH)) mkdir(AVAHI_CONFIG_PATH, 0777);
	//if(!check_if_dir_exist(AVAHI_SERVICES_PATH)) mkdir(AVAHI_SERVICES_PATH, 0777);
	mkdir_if_none(AVAHI_CONFIG_PATH);
	mkdir_if_none(AVAHI_SERVICES_PATH);

	// Create directory for use by cnid_metad and cnid_dbd daemon
	sprintf(cnid_path, "%s/%s", mount_point_name, CNID_DIR_NAME);
	sprintf(backup_path, "%s", mount_point_name);

	//Create token file
	//sprintf(token_path, "%s/%s", mount_point_name, TIMEMACHINE_TOKEN_FILE);
	//if(!check_if_file_exist(token_path))
	//	ret = generate_timemachine_token_file(token_path);

	//if(!check_if_dir_exist(cnid_path)) mkdir(cnid_path, 0777);
	//if(!check_if_dir_exist(backup_path)) mkdir(backup_path, 0777);
	mkdir_if_none(cnid_path);
	//mkdir_if_none(backup_path);

	ret = generate_afp_config(mount_point_name);
	start_afpd();
	start_cnid_metad();
	restart_mdns();

	logmessage("Timemachine", "daemon is started");

	return ret;
}
コード例 #10
0
static void save(int exiting)
{
	int i;
	time_t now;
	char *bi, *bo;
	int n;
	char hgz[256];
	char tmp[128];

	_dprintf("save\n");

	f_write("/var/lib/misc/rstats-stime", &save_utime, sizeof(save_utime), 0, 0);

	comp(speed_fn, speed, sizeof(speed[0]) * speed_count);
	
	if ((now = time(0)) < Y2K) {
		_dprintf("time not set\n");
		return;
	}
	
	comp(history_fn, &history, sizeof(history));
	
	if (exiting) {
		_dprintf("exiting=1\n");
		return;
	}

	_dprintf("save ext\n");
	
	sprintf(hgz, "%s.gz", history_fn);
	
	if (strcmp(save_path, "*nvram") == 0) {
		if (!wait_action_idle(10)) {
			_dprintf("busy, not saving\n");
			return;
		}

		if ((n = f_read_alloc(hgz, &bi, 20 * 1024)) > 0) {
			if ((bo = malloc(base64_encoded_len(n) + 1)) != NULL) {
				n = base64_encode(bi, bo, n);
				bo[n] = 0;
				_dprintf("rstats_data=%s\n", bo);
				nvram_set("rstats_data", bo);
				if (!nvram_match("debug_nocommit", "1")) nvram_commit();
				free(bo);
			}
		}
		free(bi);
	}
	else if (save_path[0] != 0) {
		strcpy(tmp, save_path);
		strcat(tmp, "_tmp");

		for (i = 15; i > 0; --i) {
			if (!wait_action_idle(10)) {
				_dprintf("busy, not saving\n");
			}
			else {
				_dprintf("copy %s to %s\n", hgz, save_path);
				if (eval("cp", hgz, tmp) == 0) {
					_dprintf("copy ok\n");
					if (rename(tmp, save_path) == 0) {
						_dprintf("rename ok\n");
						break;
					}
				}
			}

			// might not be ready
			sleep(3);
		}
	}
}
コード例 #11
0
ファイル: nvram.c プロジェクト: schidler/RT5350
int ralink_nvram_ioctl(struct inode *inode, struct file *file, unsigned int req,
		unsigned long arg)
#endif
{
	int index, len;
	const char *p;
	nvram_ioctl_t *nvr;
	char *value;

	switch (req) {
	case RALINK_NVRAM_IOCTL_GET:
		nvr = (nvram_ioctl_t __user *)arg;
		p = nvram_get(nvr->index, nvr->name);
		if (p == NULL)
			p = "";

		len = strlen(p) + 1;
		if (nvr->size < len) {
			nvr->size = len;
			return -EOVERFLOW;
		}

		if (copy_to_user(nvr->value, p, strlen(p) + 1))
			return -EFAULT;
		break;
	case RALINK_NVRAM_IOCTL_GETALL:
		nvr = (nvram_ioctl_t __user *)arg;
		index = nvr->index;
		len = fb[index].flash_max_len - sizeof(fb[index].env.crc);

		if (nvram_getall(index, fb[index].env.data) == 0) {
			if (copy_to_user(nvr->value, fb[index].env.data, len))
				return -EFAULT;
		}
		break;
	case RALINK_NVRAM_IOCTL_SET:
		nvr = (nvram_ioctl_t *)arg;
		len = ((nvr->size + MAX_VALUE_LEN) / MAX_VALUE_LEN) * MAX_VALUE_LEN; // Align size+1 bytes to MAX_VALUE_LEN boundary
		if ((len > MAX_PERMITTED_VALUE_LEN) || (len < 0))
			return -EOVERFLOW;
		
		value = (char *)kzalloc(len, GFP_KERNEL);
		if (!value)
			return -ENOMEM;
		
		if (copy_from_user(value, nvr->value, nvr->size)) {
			KFREE(value);
			return -EFAULT;
		}

		nvram_set(nvr->index, nvr->name, value);
		KFREE(value);
		break;
	case RALINK_NVRAM_IOCTL_COMMIT:
		nvr = (nvram_ioctl_t __user *)arg;
		nvram_commit(nvr->index);
		break;
	case RALINK_NVRAM_IOCTL_CLEAR:
		nvr = (nvram_ioctl_t __user *)arg;
		nvram_clear(nvr->index);
	default:
		break;
	}

	return 0;
}
コード例 #12
0
void start_sysinit(void)
{
	time_t tm = 0;

	if (!nvram_match("disable_watchdog", "1"))
		eval("watchdog");
	/*
	 * Setup console 
	 */

	cprintf("sysinit() klogctl\n");
	klogctl(8, NULL, atoi(nvram_safe_get("console_loglevel")));
	cprintf("sysinit() get router\n");

	/*
	 * network drivers 
	 */
	fprintf(stderr, "load ATH Ethernet Driver\n");
	system("insmod ag71xx || insmod ag7100_mod");
	char mac1[32];
	char mac2[32];
	system("swconfig dev rtl8366s set reset 1");
	system("swconfig dev rtl8366s set enable_vlan 0");
	system("swconfig dev rtl8366s set apply");
#ifndef HAVE_WNDR3700
	FILE *fp = fopen("/dev/mtdblock/7", "rb");
	if (fp) {
#ifdef HAVE_WRT400
		char mactmp[6];
		int copy[6];
		int i;
		fseek(fp, 0x7f120c, SEEK_SET);
		fread(mactmp, 6, 1, fp);
		for (i = 5; i >= 3; i--)
			if (++mactmp[i] != 0x00)
				break;	// dont know what this is 
		for (i = 0; i < 6; i++)
			copy[i] = mactmp[i];
		sprintf(mac1, "%02X:%02X:%02X:%02X:%02X:%02X", copy[0],
			copy[1], copy[2], copy[3], copy[4], copy[5]);
		sprintf(mac2, "%02X:%02X:%02X:%02X:%02X:%02X", copy[0],
			copy[1], copy[2], copy[3], copy[4], copy[5]);
		MAC_ADD(mac2);

#else
		fseek(fp, 0x66ffa0, SEEK_SET);
		fread(mac1, 18, 1, fp);
		fseek(fp, 0x66ffb4, SEEK_SET);
		fread(mac2, 18, 1, fp);
		fclose(fp);
#endif
	} else
#endif
	{
		sprintf(mac1, "00:11:22:33:44:55");
		sprintf(mac2, "00:11:22:33:44:66");
	}
	eval("ifconfig", "eth0", "hw", "ether", mac1);
	eval("ifconfig", "eth1", "hw", "ether", mac2);

	eval("ifconfig", "eth0", "up");
	eval("ifconfig", "eth1", "up");
	struct ifreq ifr;
	int s;

	if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW))) {
		char eabuf[32];

		strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
		ioctl(s, SIOCGIFHWADDR, &ifr);
		nvram_set("et0macaddr",
			  ether_etoa((unsigned char *)ifr.ifr_hwaddr.sa_data,
				     eabuf));
		nvram_set("et0macaddr_safe",
			  ether_etoa((unsigned char *)ifr.ifr_hwaddr.sa_data,
				     eabuf));
		close(s);
	}
	detect_wireless_devices();
#ifdef HAVE_WRT400
//      eval("ifconfig", "wifi0", "hw", "ether", mac1);
//      eval("ifconfig", "wifi1", "hw", "ether", mac1);
	setWirelessLedPhy0(0);
	setWirelessLedPhy1(0);

	writeproc("/proc/sys/dev/wifi0/ledpin","0");
	writeproc("/proc/sys/dev/wifi0/softled","1");
	writeproc("/proc/sys/dev/wifi1/ledpin","0");
	writeproc("/proc/sys/dev/wifi1/softled","1");
	
#else

#ifndef HAVE_WNDR3700
	eval("ifconfig", "wifi0", "hw", "ether", mac1);
	eval("ifconfig", "wifi1", "hw", "ether", mac1);
#endif
	setWirelessLedPhy0(5);
	setWirelessLedPhy1(5);
#endif

	led_control(LED_POWER, LED_ON);
	led_control(LED_SES, LED_OFF);
	led_control(LED_SES2, LED_OFF);
	led_control(LED_DIAG, LED_OFF);
	led_control(LED_BRIDGE, LED_OFF);
	led_control(LED_WLAN0, LED_OFF);
	led_control(LED_WLAN1, LED_OFF);
	led_control(LED_CONNECTED, LED_OFF);

	/*
	 * Set a sane date 
	 */
	stime(&tm);
	nvram_set("wl0_ifname", "ath0");

	return;
	cprintf("done\n");
}
コード例 #13
0
static int restore_main(int argc, char **argv)
{
	char *name;
	int test;
	int force;
	int commit;
	backup_t data;
	unsigned int size;
	char s[512];
	char tmp[128];
	unsigned long hw;
	char current[NVRAM_SPACE];
	char *b, *bk, *bv;
	char *c, *ck, *cv;
	int nset;
	int nunset;
	int nsame;
	int cmp;
	int i;

	test = 0;
	force = 0;
	commit = 1;
	name = NULL;
	for (i = 1; i < argc; ++i) {
		if (argv[i][0] == '-') {
			if (strcmp(argv[i], "--test") == 0) {
				test = 1;
			}
			else if (strcmp(argv[i], "--force") == 0) {
				force = 1;
			}
			else if (strcmp(argv[i], "--forceall") == 0) {
				force = 2;
			}
			else if (strcmp(argv[i], "--nocommit") == 0) {
				commit = 0;
			}
			else {
				help();
			}
		}
		else {
			name = argv[i];
		}
	}
	if (!name) help();

	strcpy(tmp, "/tmp/nvramXXXXXX");
	mktemp(tmp);
	sprintf(s, "gzip -d < %s > %s", name, tmp);
	if (system(s) != 0) {
		unlink(tmp);
		printf("Error decompressing file.\n");
		return 1;
	}

	size = f_size(tmp);
	if ((size <= (sizeof(data) - sizeof(data.buffer))) || (size > sizeof(data)) ||
		(f_read(tmp, &data, sizeof(data)) != size)) {
		unlink(tmp);
		printf("Invalid data size or read error.\n");
		return 1;
	}

	unlink(tmp);

	if (data.sig != V1) {
		printf("Invalid signature: %08lX / %08lX\n", data.sig, V1);
		return 1;
	}

	hw = check_hw_type();
	if ((data.hwid != hw) && (!force)) {
		printf("Invalid hardware type: %08lX / %08lX\n", data.hwid, hw);
		return 1;
	}

	// 1 - check data

	size -= sizeof(data) - sizeof(data.buffer);
	if ((data.buffer[size - 1] != 0) || (data.buffer[size - 2] != 0)) {
CORRUPT:
		printf("Corrupted data area.\n");
		return 1;
	}

	b = data.buffer;
	while (*b) {
		bk = b;
		b += strlen(b) + 1;
		if ((bv = strchr(bk, '=')) == NULL) {
			goto CORRUPT;
		}
		*bv = 0;
		if (strcmp(bk, "et0macaddr") == 0) {
			if (!nvram_match(bk, bv + 1)) {
				if (!force) {
					printf("Cannot restore on a different router.\n");
					return 1;
				}
			}
		}
		*bv = '=';
	}
	if (((b - data.buffer) + 1) != size) {
		printf("Extra data found at the end.\n");
		return 1;
	}


	// 2 - set

	if (!test) {
		if (!wait_action_idle(10)) {
			printf("System busy.\n");
			return 1;
		}
		set_action(ACT_SW_RESTORE);
		led(LED_DIAG, 1);
	}

	nset = nunset = nsame = 0;

	b = data.buffer;
	while (*b) {
		bk = b;
		b += strlen(b) + 1;
		bv = strchr(bk, '=');
		*bv++ = 0;

		if ((force != 1) || (in_defaults(bk))) {
			if (!nvram_match(bk, bv)) {
				if (test) printf("nvram set \"%s=%s\"\n", bk, bv);
					else nvram_set(bk, bv);
				++nset;
			}
			else {
				++nsame;
			}
		}

		*(bv - 1) = '=';
	}


	// 3 - unset

	getall(current);
	c = current;
	while (*c) {
		ck = c;
		c += strlen(c) + 1;
		if ((cv = strchr(ck, '=')) == NULL) {
			printf("Invalid data in NVRAM: %s.", ck);
			continue;
		}
		*cv++ = 0;

		if ((force != 1) || (in_defaults(ck))) {
			cmp = 1;
			b = data.buffer;
			while (*b) {
				bk = b;
				b += strlen(b) + 1;
				bv = strchr(bk, '=');
				*bv++ = 0;
				cmp = strcmp(bk, ck);
				*(bv - 1) = '=';
				if (cmp == 0) break;
			}
			if (cmp != 0) {
				++nunset;
				if (test) printf("nvram unset \"%s\"\n", ck);
					else nvram_unset(ck);
			}
		}
	}
	

	if ((nset == 0) && (nunset == 0)) commit = 0;
	printf("\nPerformed %d set and %d unset operations. %d required no changes.\n%s\n",
		nset, nunset, nsame, commit ? "Committing..." : "Not commiting.");
	fflush(stdout);

	if (!test) {
		set_action(ACT_IDLE);
		if (commit) nvram_commit();
	}
	return 0;
}
コード例 #14
0
ファイル: upgrade_rb500.c プロジェクト: ebichu/dd-wrt
void
// do_upgrade_post(char *url, FILE *stream, int len, char *boundary)
do_upgrade_post(char *url, webs_t stream, int len, char *boundary)	// jimmy, 
									// https, 
									// 8/6/2003
{
	killall("udhcpc", SIGKILL);
#ifndef ANTI_FLASH
	char buf[1024];
	int type = 0;

	upgrade_ret = EINVAL;

	// Let below files loaded to memory
	// To avoid the successful screen is blank after web upgrade.
	// system2 ("cat /www/Success_u_s.asp > /dev/null");
	// system2 ("cat /www/Fail_u_s.asp > /dev/null");

	/*
	 * Look for our part 
	 */
	while (len > 0) {
		if (!wfgets(buf, MIN(len + 1, sizeof(buf)), stream))
			return;
		len -= strlen(buf);
		if (!strncasecmp(buf, "Content-Disposition:", 20)) {
			if (strstr(buf, "name=\"erase\"")) {
				while (len > 0 && strcmp(buf, "\n")
				       && strcmp(buf, "\r\n")) {
					if (!wfgets(buf, MIN(len + 1, sizeof(buf)), stream))
						return;
					len -= strlen(buf);
				}
				if (!wfgets(buf, MIN(len + 1, sizeof(buf)), stream))
					return;
				len -= strlen(buf);
				buf[1] = '\0';	// we only want the 1st digit
				nvram_set("sv_restore_defaults", buf);
				nvram_commit();
			} else if (strstr(buf, "name=\"file\""))	// upgrade image
			{
				type = 0;
				break;
			}
		}
	}

	/*
	 * Skip boundary and headers 
	 */
	while (len > 0) {
		if (!wfgets(buf, MIN(len + 1, sizeof(buf)), stream))
			return;
		len -= strlen(buf);
		if (!strcmp(buf, "\n") || !strcmp(buf, "\r\n"))
			break;
	}
	upgrade_ret = sys_upgrade(NULL, stream, &len, type);
	fprintf(stderr, "core upgrade done() %d\n", len);
	/*
	 * Restore factory original settings if told to. This will also cause a
	 * restore defaults on reboot of a Sveasoft firmware. 
	 */
	if (nvram_match("sv_restore_defaults", "1")) {
		system2("rm -f /usr/local/nvram/nvram.bin");
	}
	/*
	 * Slurp anything remaining in the request 
	 */
	while (len--) {
#ifdef HAVE_HTTPS
		if (do_ssl) {
			wfgets(buf, 1, stream);
		} else {
			(void)fgetc(stream);
		}
#else
		(void)fgetc(stream);
#endif

	}
#endif
	fprintf(stderr, "upgrade done()\n");

}
コード例 #15
0
/*
 * Called when link comes up
 */
int ipup_main(int argc, char **argv)
{
	FILE *fp;
	char *wan_ifname = safe_getenv("IFNAME");

	// char *wan_proto = nvram_safe_get("wan_proto");
	char *value;
	char buf[256];

	cprintf("%s\n", argv[0]);

	stop_process("listen", "activity listener");
	nvram_set("wan_iface", wan_ifname);
	if (check_action() != ACT_IDLE)
		return -1;

	/*
	 * ipup will receive bellow six arguments 
	 */
	/*
	 * interface-name tty-device speed local-IP-address remote-IP-address
	 * ipparam 
	 */

	/*
	 * Touch connection file 
	 */
	if (!(fp = fopen("/tmp/ppp/link", "a"))) {
		perror("/tmp/ppp/link");
		return errno;
	}
	fprintf(fp, "%s", argv[1]);
	fclose(fp);

	nvram_set("pppd_pppifname", wan_ifname);

	if (nvram_match("wan_proto", "pppoe"))
		nvram_set("pppoe_ifname", wan_ifname);

	if (getenv("IPLOCAL")) {
		value = getenvs("IPLOCAL");
		ifconfig(wan_ifname, IFUP, value, "255.255.255.255");
		if (nvram_match("wan_proto", "pppoe")) {
			nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr"));	// Store 
			nvram_set("wan_ipaddr", value);
			nvram_set("wan_netmask", "255.255.255.255");
#ifdef HAVE_PPPOATM
		} else if (nvram_match("wan_proto", "pppoa")) {
			nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr"));	// Store 
			nvram_set("wan_ipaddr", value);
			nvram_set("wan_netmask", "255.255.255.255");
#endif
#ifdef HAVE_PPTP
		} else if (nvram_match("wan_proto", "pptp")) {
			nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr"));	// Store 
			nvram_set("pptp_get_ip", value);
#endif
#ifdef HAVE_L2TP
		} else if (nvram_match("wan_proto", "l2tp")) {
			nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr"));	// Store 
			nvram_set("l2tp_get_ip", value);
#endif
		}
#ifdef HAVE_3G
		else if (nvram_match("wan_proto", "3g")) {
			nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr"));	// Store 
			nvram_set("wan_ipaddr", value);
			nvram_set("wan_netmask", "255.255.255.255");
			// reset 3gnetmodetoggle for mode 5
			nvram_unset("3gnetmodetoggle");
#if defined(HAVE_TMK) || defined(HAVE_BKM)
			char *gpio3g = nvram_get("gpio3g");
			if (gpio3g != NULL)
				set_gpio(atoi(gpio3g), 1);
#endif
		}
#endif
	}

	if (getenv("IPREMOTE")) {
		value = getenvs("IPREMOTE");

		if (nvram_match("wan_proto", "pptp")) {
			nvram_set("wan_gateway", value);
			eval("route", "del", "default");
			route_add(wan_ifname, 0, "0.0.0.0", value, "0.0.0.0");
		} else {
			nvram_set("wan_gateway", value);

		}
	}
	strcpy(buf, "");
	if (getenv("DNS1"))
		sprintf(buf, "%s", getenvs("DNS1"));
	if (getenv("DNS2"))
		sprintf(buf + strlen(buf), "%s%s", strlen(buf) ? " " : "", getenvs("DNS2"));
	nvram_set("wan_get_dns", buf);

	if ((value = getenv("AC_NAME")))
		nvram_set("ppp_get_ac", value);
	if ((value = getenv("SRV_NAME")))
		nvram_set("ppp_get_srv", value);
	if ((value = getenv("MTU")))
		nvram_set("wan_run_mtu", value);
	start_wan_done(wan_ifname);
	cprintf("done\n");
	return 0;
}
コード例 #16
0
void start_sysinit(void)
{
	time_t tm = 0;

	char dev[64];
	char *disk = getdisc();

	if (disk == NULL) {
		fprintf(stderr, "no valid dd-wrt partition found, calling shell");
		eval("/bin/sh");
		exit(0);
	}

	FILE *in = fopen("/usr/local/nvram/nvram.db", "rb");

	if (in != NULL) {
		fclose(in);
		mkdir("/tmp/nvram", 0700);
		eval("cp", "/etc/nvram/nvram.db", "/tmp/nvram");
		eval("cp", "/etc/nvram/offsets.db", "/tmp/nvram");
		eval("/usr/sbin/convertnvram");
		nvram_commit();
		eval("rm", "-f", "/etc/nvram/nvram.db");
		eval("rm", "-f", "/etc/nvram/offsets.db");
	}
	//recover nvram if available
	in = fopen("/usr/local/nvram/nvram.bin", "rb");
	if (in == NULL) {
		fprintf(stderr, "recover broken nvram\n");
		sprintf(dev, "/dev/%s", disk);
		in = fopen(dev, "rb");
		fseeko(in, 0, SEEK_END);
		off_t mtdlen = ftello(in);
		fseeko(in, mtdlen - (65536 * 2), SEEK_SET);
		unsigned char *mem = malloc(65536);
		fread(mem, 65536, 1, in);
		fclose(in);
		if (mem[0] == 0x46 && mem[1] == 0x4c && mem[2] == 0x53 && mem[3] == 0x48) {
			fprintf(stderr, "found recovery\n");
			in = fopen("/usr/local/nvram/nvram.bin", "wb");
			if (in != NULL) {
				fwrite(mem, 65536, 1, in);
				fclose(in);
				free(mem);
				eval("sync");
				sleep(5);
				eval("event", "5", "1", "15");
			}
		}
		free(mem);
	} else {
		fclose(in);
	}

	if (!nvram_match("disable_watchdog", "1"))
		eval("watchdog");	// system watchdog
#ifdef HAVE_ERC
	if (isregistered_real() && nvram_match("ree_resetme", "1")) {
		fprintf(stderr, "Restoring REE default nvram\n");
		eval("nvram", "restore", "/etc/defaults/x86ree.backup");
		eval("reboot");
		eval("event", "5", "1", "15");
	}
#endif

	cprintf("sysinit() setup console\n");

	/*
	 * Setup console 
	 */

	cprintf("sysinit() klogctl\n");
	klogctl(8, NULL, atoi(nvram_safe_get("console_loglevel")));
	cprintf("sysinit() get router\n");

	/*
	 * eval("insmod","md5"); eval("insmod","aes"); eval("insmod","blowfish");
	 * eval("insmod","deflate"); eval("insmod","des");
	 * eval("insmod","michael_mic"); eval("insmod","cast5");
	 * eval("insmod","crypto_null"); 
	 */

	detect_ethernet_devices();
	eval("ifconfig", "eth0", "0.0.0.0", "up");
	eval("ifconfig", "eth1", "0.0.0.0", "up");
	eval("ifconfig", "eth2", "0.0.0.0", "up");
	eval("ifconfig", "eth3", "0.0.0.0", "up");

	struct ifreq ifr;
	int s;

	if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW))) {
		char eabuf[32];

		strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
		ioctl(s, SIOCGIFHWADDR, &ifr);
		nvram_set("et0macaddr_safe", ether_etoa((unsigned char *)ifr.ifr_hwaddr.sa_data, eabuf));
		nvram_set("et0macaddr", ether_etoa((unsigned char *)ifr.ifr_hwaddr.sa_data, eabuf));
		close(s);
	}
	detect_wireless_devices();

	mknod("/dev/rtc", S_IFCHR | 0644, makedev(253, 0));
#ifdef HAVE_CPUTEMP
	// insmod("nsc_gpio");
	// insmod("scx200_gpio");
	// insmod("scx200_i2c");
	// insmod("scx200_acb");
	// insmod("lm77");
#endif

	nvram_set("wl0_ifname", "ath0");
	mknod("/dev/crypto", S_IFCHR | 0644, makedev(10, 70));
	/*
	 * Set a sane date 
	 */
	stime(&tm);
	cprintf("done\n");
	return;
}
コード例 #17
0
ファイル: nvram.c プロジェクト: gygy/asuswrt
int nvram_restore_new(char *file, char *buf)
{
	FILE *fp;
	char header[8], *p, *v;
	unsigned long count, filelen, *filelenptr, i;
	unsigned char rand, *randptr;

	if ((fp = fopen(file, "r+")) == NULL) return -1;

	count = fread(header, 1, 8, fp);
	if (count>=8 && strncmp(header, PROFILE_HEADER, 4) == 0)
	{
		filelenptr = (unsigned long *)(header + 4);
#ifdef ASUS_DEBUG
		fprintf(stderr, "restoring original text cfg of length %x\n", *filelenptr);
#endif
		fread(buf, 1, *filelenptr, fp);
	}
	else if (count>=8 && strncmp(header, PROFILE_HEADER_NEW, 4) == 0)
	{
		filelenptr = (unsigned long *)(header + 4);
		filelen = *filelenptr & 0xffffff;
#ifdef ASUS_DEBUG
		fprintf(stderr, "restoring non-text cfg of length %x\n", filelen);
#endif
		randptr = (unsigned char *)(header + 7);
		rand = *randptr;
#ifdef ASUS_DEBUG
		fprintf(stderr, "non-text cfg random number %x\n", rand);
#endif
		count = fread(buf, 1, filelen, fp);
#ifdef ASUS_DEBUG
		fprintf(stderr, "non-text cfg count %x\n", count);
#endif
		for (i = 0; i < count; i++)
		{
			if ((unsigned char) buf[i] > ( 0xfd - 0x1))
				buf[i] = 0x0;
			else
				buf[i] = 0xff + rand - buf[i];
		}
#ifdef ASUS_DEBUG
		for (i = 0; i < count; i++)
		{
			if (i % 16 == 0) fprintf(stderr, "\n");
			fprintf(stderr, "%2x ", (unsigned char) buf[i]);
		}

		for (i = 0; i < count; i++)
		{
			if (i % 16 == 0) fprintf(stderr, "\n");
			fprintf(stderr, "%c", buf[i]);
		}
#endif
	}
	else
	{
		fclose(fp);
		return 0;
	}
	fclose(fp);

	p = buf;

	while (*p)
	{
		v = strchr(p, '=');

		if (v != NULL)
		{
			*v++ = '\0';

			if (issyspara(p))
				nvram_set(p, v);

			p = v + strlen(v) + 1;
		}
		else
		{
			nvram_unset(p);
			p = p + 1;
		}
	}
	return 0;
}
コード例 #18
0
ファイル: wificonf.c プロジェクト: anchowee/linino
static void setup_bcom(int skfd, char *ifname)
{
	int val = 0, ap;
	char buf[8192];
	char wbuf[80];
	char *v;
	int wds_enabled = 0;
	
	if (bcom_ioctl(skfd, ifname, WLC_GET_MAGIC, &val, sizeof(val)) < 0)
		return;
	
	nvram_set(wl_var("ifname"), ifname);
	
	stop_bcom(skfd, ifname);

	/* Set Country */
	strncpy(buf, nvram_safe_get(wl_var("country_code")), 4);
	buf[3] = 0;
	bcom_ioctl(skfd, ifname, WLC_SET_COUNTRY, buf, 4);
	
	val = strtol(nvram_safe_get(wl_var("txpwr")),NULL,0);
	if (val <= 0)
		val = strtol(nvram_safe_get("pa0maxpwr"),NULL,0);

	if (val)
		bcom_set_int(skfd, ifname, "qtxpower", val);
	
	/* Set other options */
	val = nvram_enabled(wl_var("lazywds"));
	wds_enabled = val;
	bcom_ioctl(skfd, ifname, WLC_SET_LAZYWDS, &val, sizeof(val));
	
	if (v = nvram_get(wl_var("frag"))) {
		val = strtol(v,NULL,0);
		bcom_ioctl(skfd, ifname, WLC_SET_FRAG, &val, sizeof(val));
	}
	if ((val = strtol(nvram_safe_get(wl_var("rate")),NULL,0)) > 0) {
		val /= 500000;
		bcom_ioctl(skfd, ifname, WLC_SET_RATE, &val, sizeof(val));
	}
	if (v = nvram_get(wl_var("dtim"))) {
		val = strtol(v,NULL,0);
		bcom_ioctl(skfd, ifname, WLC_SET_DTIMPRD, &val, sizeof(val));
	}
	if (v = nvram_get(wl_var("bcn"))) {
		val = strtol(v,NULL,0);
		bcom_ioctl(skfd, ifname, WLC_SET_BCNPRD, &val, sizeof(val));
	}
	if (v = nvram_get(wl_var("rts"))) {
		val = strtol(v,NULL,0);
		bcom_ioctl(skfd, ifname, WLC_SET_RTS, &val, sizeof(val));
	}
	if (v = nvram_get(wl_var("antdiv"))) {
		val = strtol(v,NULL,0);
		bcom_ioctl(skfd, ifname, WLC_SET_ANTDIV, &val, sizeof(val));
	}
	if (v = nvram_get(wl_var("txant"))) {
		val = strtol(v,NULL,0);
		bcom_ioctl(skfd, ifname, WLC_SET_TXANT, &val, sizeof(val));
	}
	
	val = nvram_enabled(wl_var("closed"));
	bcom_ioctl(skfd, ifname, WLC_SET_CLOSED, &val, sizeof(val));

	val = nvram_enabled(wl_var("ap_isolate"));
	bcom_set_int(skfd, ifname, "ap_isolate", val);

	val = nvram_enabled(wl_var("frameburst"));
	bcom_ioctl(skfd, ifname, WLC_SET_FAKEFRAG, &val, sizeof(val));

	/* Set up MAC list */
	if (nvram_match(wl_var("macmode"), "allow"))
		val = WLC_MACMODE_ALLOW;
	else if (nvram_match(wl_var("macmode"), "deny"))
		val = WLC_MACMODE_DENY;
	else
		val = WLC_MACMODE_DISABLED;

	if ((val != WLC_MACMODE_DISABLED) && (v = nvram_get(wl_var("maclist")))) {
		struct maclist *mac_list;
		struct ether_addr *addr;
		char *next;
		
		memset(buf, 0, 8192);
		mac_list = (struct maclist *) buf;
		addr = mac_list->ea;
		
		foreach(wbuf, v, next) {
			if (ether_atoe(wbuf, addr->ether_addr_octet)) {
				mac_list->count++;
				addr++;
			}
		}
		bcom_ioctl(skfd, ifname, WLC_SET_MACLIST, buf, sizeof(buf));
	} else {
コード例 #19
0
ファイル: nvram.c プロジェクト: gygy/asuswrt
/* NVRAM utility */
int
main(int argc, char **argv)
{
	char *name, *value, *buf;
	int size;
#ifdef RTCONFIG_CFE_NVRAM_CHK
	int ret = 0;
	FILE *fp;
#endif

	/* Skip program name */
	--argc;
	++argv;

	if (!*argv) 
		usage();
	
	buf = malloc (MAX_NVRAM_SPACE);
	if (buf == NULL)	{
		perror ("Out of memory!\n");
		return -1;
	}
	
	/* Process the remaining arguments. */
	for (; *argv; argv++) {
		if (!strncmp(*argv, "get", 3)) {
			if (*++argv) {
				if ((value = nvram_get(*argv)))
					puts(value);
			}
		}
		else if (!strncmp(*argv, "set", 3)) {
			if (*++argv) {
				strncpy(value = buf, *argv, MAX_NVRAM_SPACE);
				name = strsep(&value, "=");
				
#ifdef RTCONFIG_CFE_NVRAM_CHK
				ret = nvram_set(name, value);
				if(ret == 2) {
					fp = fopen("/var/log/cfecommit_ret", "w");
					if(fp!=NULL) {
		                                fprintf(fp,"Illegal nvram\n");
						fclose(fp);
					}
					puts("Illegal nvram format!");
				}
#else
				nvram_set(name, value);
#endif
			}
		}
		else if (!strncmp(*argv, "unset", 5)) {
			if (*++argv)
				nvram_unset(*argv);
		}
		else if (!strncmp(*argv, "commit", 5)) {
			nvram_commit();
		}
		else if (!strncmp(*argv, "save", 4)) 
		{
			if (*++argv) 
			{
				nvram_getall(buf, MAX_NVRAM_SPACE);
				nvram_save_new(*argv, buf);
			}
			
		}
		else if (!strncmp(*argv, "restore", 7)) 
		{
			if (*++argv) 
			{
				nvram_restore_new(*argv, buf);
			}
			
		}
		else if (!strncmp(*argv, "show", 4) || !strncmp(*argv, "getall", 6)) {
			nvram_getall(buf, MAX_NVRAM_SPACE);
			for (name = buf; *name; name += strlen(name) + 1)
				puts(name);
			size = sizeof(struct nvram_header) + (int) name - (int) buf;
			fprintf(stderr, "size: %d bytes (%d left)\n", size, MAX_NVRAM_SPACE - size);
		}
		if (!*argv)
			break;
	}

	if (buf != NULL)
		free (buf);
	return 0;
}	
コード例 #20
0
ファイル: qtn_monitor.c プロジェクト: hajuuk/asuswrt
int
qtn_monitor_main(int argc, char *argv[])
{
    FILE *fp;
    sigset_t sigs_to_catch;
    int ret, retval = 0;
    time_t start_time = uptime();

    /* write pid */
    if ((fp = fopen("/var/run/qtn_monitor.pid", "w")) != NULL)
    {
        fprintf(fp, "%d", getpid());
        fclose(fp);
    }

    /* set the signal handler */
    sigemptyset(&sigs_to_catch);
    sigaddset(&sigs_to_catch, SIGTERM);
    sigprocmask(SIG_UNBLOCK, &sigs_to_catch, NULL);

    signal(SIGTERM, qtn_monitor_exit);

QTN_RESET:
    ret = rpc_qcsapi_init(1);
    if (ret < 0) {
        dbG("rpc_qcsapi_init error, return: %d\n", ret);
        retval = -1;
        goto ERROR;
    }
#if 0	/* replaced by STATELESS, send configuration from brcm to qtn */
    else if (nvram_get_int("qtn_restore_defaults"))
    {
        nvram_unset("qtn_restore_defaults");
        rpc_qcsapi_restore_default_config(0);
        dbG("Restaring Qcsapi init...\n");
        sleep(15);
        goto QTN_RESET;
    }
#endif

#if 0
    if(nvram_get_int("sw_mode") == SW_MODE_AP &&
            nvram_get_int("wlc_psta") == 1 &&
            nvram_get_int("wlc_band") == 1) {
        dbG("[sw_mode] start QTN PSTA mode\n");
        start_psta_qtn();
    }
#endif

    ret = qcsapi_init();
    if (ret < 0)
    {
        dbG("Qcsapi qcsapi_init error, return: %d\n", ret);
        retval = -1;
        goto ERROR;
    }
    else
        dbG("Qcsapi qcsapi init takes %ld seconds\n", uptime() - start_time);

    dbG("defer lanport_ctrl(1)\n");
    lanport_ctrl(1);
    eval("ifconfig", "br0:1", "down");
#if defined(RTCONFIG_JFFS2ND_BACKUP)
    check_2nd_jffs();
#endif
    nvram_set("qtn_ready", "1");

    if(nvram_get_int("AllLED") == 0) setAllLedOff();

    // dbG("[QTN] update router_command.sh from brcm to qtn\n");
    // qcsapi_wifi_run_script("set_test_mode", "update_router_command");

#if 1	/* STATELESS */
    if(nvram_get_int("sw_mode") == SW_MODE_AP &&
            nvram_get_int("wlc_psta") == 1 &&
            nvram_get_int("wlc_band") == 1) {
        dbG("[sw_mode] skip start_psta_qtn, QTN will run scripts automatically\n");
        // start_psta_qtn();
    } else {
        dbG("[***] rpc_parse_nvram_from_httpd\n");
        rpc_parse_nvram_from_httpd(1,-1);	/* wifi0 */
        rpc_parse_nvram_from_httpd(1,1);	/* wifi1 */
        rpc_parse_nvram_from_httpd(1,2);	/* wifi2 */
        rpc_parse_nvram_from_httpd(1,3);	/* wifi3 */
        dbG("[sw_mode] skip start_ap_qtn, QTN will run scripts automatically\n");
        // start_ap_qtn();
        qcsapi_mac_addr wl_mac_addr;
        ret = rpc_qcsapi_interface_get_mac_addr(WIFINAME, &wl_mac_addr);
        if (ret < 0)
            dbG("rpc_qcsapi_interface_get_mac_addr, return: %d\n", ret);
        else
        {
            nvram_set("1:macaddr", wl_ether_etoa((struct ether_addr *) &wl_mac_addr));
            nvram_set("wl1_hwaddr", wl_ether_etoa((struct ether_addr *) &wl_mac_addr));
        }

        rpc_update_wdslist();

        if(nvram_get_int("wps_enable") == 1) {
            ret = rpc_qcsapi_wifi_disable_wps(WIFINAME, 0);
            if (ret < 0)
                dbG("rpc_qcsapi_wifi_disable_wps %s error, return: %d\n", WIFINAME, ret);

            ret = qcsapi_wps_set_ap_pin(WIFINAME, nvram_safe_get("wps_device_pin"));
            if (ret < 0)
                dbG("qcsapi_wps_set_ap_pin %s error, return: %d\n", WIFINAME, ret);

            ret = qcsapi_wps_registrar_set_pp_devname(WIFINAME, 0, (const char *) get_productid());
            if (ret < 0)
                dbG("qcsapi_wps_registrar_set_pp_devname %s error, return: %d\n", WIFINAME, ret);
        } else {
            ret = rpc_qcsapi_wifi_disable_wps(WIFINAME, 1);
            if (ret < 0)
                dbG("rpc_qcsapi_wifi_disable_wps %s error, return: %d\n", WIFINAME, ret);
        }

        rpc_set_radio(1, 0, nvram_get_int("wl1_radio"));

    }
#endif

    if(nvram_get_int("wl1_80211h") == 1) {
        dbG("[80211h] set_80211h_on\n");
        qcsapi_wifi_run_script("router_command.sh", "80211h_on");
    } else {
        dbG("[80211h] set_80211h_off\n");
        qcsapi_wifi_run_script("router_command.sh", "80211h_off");
    }

    if(nvram_get_int("sw_mode") == SW_MODE_ROUTER ||
            (nvram_get_int("sw_mode") == SW_MODE_AP &&
             nvram_get_int("wlc_psta") == 0)) {
        if(nvram_get_int("wl1_chanspec") == 0) {
            if (nvram_match("1:ccode", "EU")) {
                if(nvram_get_int("acs_dfs") != 1) {
                    dbG("[dfs] start nodfs scanning and selection\n");
                    start_nodfs_scan_qtn();
                }
            } else {
                /* all country except EU */
                dbG("[dfs] start nodfs scanning and selection\n");
                start_nodfs_scan_qtn();
            }
        }
    }
    if(nvram_get_int("sw_mode") == SW_MODE_AP &&
            nvram_get_int("wlc_psta") == 1 &&
            nvram_get_int("wlc_band") == 0) {
        ret = qcsapi_wifi_reload_in_mode(WIFINAME, qcsapi_station);
        if (ret < 0)
            dbG("qtn reload_in_mode STA fail\n");
    }
    if(nvram_get_int("QTNTELNETSRV") == 1 && nvram_get_int("sw_mode") == SW_MODE_ROUTER) {
        dbG("[QTNT] enable telnet server\n");
        qcsapi_wifi_run_script("router_command.sh", "enable_telnet_srv 1");
    }

    dbG("[dbg] qtn_monitor startup\n");
ERROR:
    remove("/var/run/qtn_monitor.pid");

    return retval;
}
コード例 #21
0
ファイル: ntp.c プロジェクト: nick-ratbert/asuswrt-merlin
int ntp_main(int argc, char *argv[])
{
	FILE *fp;
	int ret;
	pid_t pid;
	char *args[] = {"ntpclient", "-h", servers, "-i", "3", "-l", "-s", NULL};

	strcpy(servers, nvram_safe_get("ntp_server0"));

	fp = fopen("/var/run/ntp.pid", "w");
	if (fp == NULL)
		exit(0);
	fprintf(fp, "%d", getpid());
	fclose(fp);

	dbg("starting ntp...\n");

	signal(SIGTSTP, catch_sig);
	signal(SIGTERM, catch_sig);
	signal(SIGCHLD, chld_reap);

	nvram_set("ntp_ready", "0");
	nvram_set("svc_ready", "0");

	while (1)
	{
		if (sig_cur != -1)
		{
			pause();
		}
		else if (nvram_get_int("sw_mode") == SW_MODE_ROUTER &&
			!nvram_match("link_internet", "1"))
		{
			sleep(NTP_RETRY_INTERVAL);
		}
		else if (strlen(servers))
		{
			stop_ntpc();

			nvram_set("ntp_server_tried", servers);
			ret = _eval(args, NULL, 0, &pid);
			sleep(SECONDS_TO_WAIT);

			if (strlen(nvram_safe_get("ntp_server0")))
			{
				if (server_idx)
					strcpy(servers, nvram_safe_get("ntp_server1"));
				else
					strcpy(servers, nvram_safe_get("ntp_server0"));
				server_idx = (server_idx + 1) % 2;
			}
				else strcpy(servers, "");
			args[2] = servers;

			if(nvram_get_int("ntp_ready"))
			{
				/* ntp sync every hour when time_zone set as "DST" */
				if(strstr(nvram_safe_get("time_zone_x"), "DST")) {
					struct tm local;
					time_t now;
					int diff_sec;

					time(&now);
					localtime_r(&now, &local);
//					dbg("%s: %d-%d-%d, %d:%d:%d dst:%d\n", __FUNCTION__, local.tm_year+1900, local.tm_mon+1, local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec, local.tm_isdst);

					/* every hour */
					if((local.tm_min != 0) || (local.tm_sec != 0)) {
						/* compensate for the sleep(SECONDS_TO_WAIT) */
						diff_sec = (3600 - SECONDS_TO_WAIT) - (local.tm_min * 60 + local.tm_sec);
						if(diff_sec == 0) diff_sec = 3600 - SECONDS_TO_WAIT;
						else if(diff_sec < 0) diff_sec = -diff_sec;
//						dbg("diff_sec: %d \n", diff_sec);
						sleep(diff_sec);
					}
					else sleep(3600 - SECONDS_TO_WAIT);
				}
				else	/* every 12 hours */
				{
					sleep(3600 * 12 - SECONDS_TO_WAIT);
				}
			}
			else
			{
				sleep(NTP_RETRY_INTERVAL - SECONDS_TO_WAIT);
			}
		}
		else
		{
			pause();
		}
	}
}
コード例 #22
0
void start_sysinit(void)
{
	char buf[PATH_MAX];
	struct stat tmp_stat;
	time_t tm = 0;

	unlink("/etc/nvram/.lock");
	cprintf("sysinit() proc\n");
	/*
	 * /proc 
	 */
	mount("proc", "/proc", "proc", MS_MGC_VAL, NULL);
	cprintf("sysinit() tmp\n");

	/*
	 * /tmp 
	 */
	mount("ramfs", "/tmp", "ramfs", MS_MGC_VAL, NULL);
	// fix for linux kernel 2.6
	mount("devpts", "/dev/pts", "devpts", MS_MGC_VAL, NULL);

	// load ext2 
	// eval("insmod","jbd");
	insmod("ext2");
#ifndef KERNEL_24
	if (mount
	    ("/dev/cf/card0/part3", "/usr/local", "ext2", MS_MGC_VAL, NULL))
#else
	if (mount
	    ("/dev/discs/disc0/part3", "/usr/local", "ext2", MS_MGC_VAL, NULL))
#endif
	{
		// not created yet, create ext2 partition
		eval("/sbin/mkfs.ext2", "-F", "-b", "1024", "/dev/cf/card0/part3");
		// mount ext2 
		mount("/dev/cf/card0/part3", "/usr/local", "ext2", MS_MGC_VAL,
		      NULL);
		eval("/bin/tar", "-xvvjf", "/etc/local.tar.bz2", "-C", "/");
	}
	eval("mkdir", "-p", "/usr/local/nvram");
	unlink("/tmp/nvram/.lock");
	eval("cp", "/etc/nvram/nvram.db", "/tmp/nvram");

	eval("mount", "/usr/local", "-o", "remount,ro");

	// eval ("cp", "/etc/nvram/offsets.db", "/tmp/nvram");
	cprintf("sysinit() var\n");

	/*
	 * /var 
	 */
	mkdir("/tmp/var", 0777);
	mkdir("/var/lock", 0777);
	mkdir("/var/log", 0777);
	mkdir("/var/run", 0777);
	mkdir("/var/tmp", 0777);
	cprintf("sysinit() setup console\n");

	/*
	 * Setup console 
	 */

	cprintf("sysinit() klogctl\n");
	klogctl(8, NULL, atoi(nvram_safe_get("console_loglevel")));
	cprintf("sysinit() get router\n");

	int brand = getRouterBrand();

	/*
	 * insmod("md5"); insmod("aes"); insmod("blowfish"); insmod("deflate");
	 * insmod("des"); insmod("michael_mic"); insmod("cast5");
	 * insmod("crypto_null"); 
	 */
	detect_wireless_devices();

	/*
	 * Set a sane date 
	 */
	stime(&tm);
	nvram_set("use_crypto", "0");
	nvram_set("wl0_ifname", "ath0");

	cprintf("done\n");
	return;
}
コード例 #23
0
ファイル: common.c プロジェクト: themiron/asuswrt-merlin
//#if 0
void wan_netmask_check(void)
{
	unsigned int ip, gw, nm, lip, lnm;

	if (nvram_match("wan0_proto", "static") ||
	    //nvram_match("wan0_proto", "pptp"))
	    nvram_match("wan0_proto", "pptp") || nvram_match("wan0_proto", "l2tp"))	// oleg patch
	{
		ip = inet_addr(nvram_safe_get("wan_ipaddr"));
		gw = inet_addr(nvram_safe_get("wan_gateway"));
		nm = inet_addr(nvram_safe_get("wan_netmask"));

		lip = inet_addr(nvram_safe_get("lan_ipaddr"));
		lnm = inet_addr(nvram_safe_get("lan_netmask"));

		_dprintf("ip : %x %x %x\n", ip, gw, nm);

		if (ip==0x0 && (nvram_match("wan0_proto", "pptp") || nvram_match("wan0_proto", "l2tp")))	// oleg patch
			return;

		if (ip==0x0 || (ip&lnm)==(lip&lnm))
		{
			nvram_set("wan_ipaddr", "1.1.1.1");
			nvram_set("wan_netmask", "255.0.0.0");	
			nvram_set("wan0_ipaddr", nvram_safe_get("wan_ipaddr"));
			nvram_set("wan0_netmask", nvram_safe_get("wan_netmask"));
		}

		// check netmask here
		if (gw==0 || gw==0xffffffff || (ip&nm)==(gw&nm))
		{
			nvram_set("wan0_netmask", nvram_safe_get("wan_netmask"));
		}
		else
		{		
			for (nm=0xffffffff;nm!=0;nm=(nm>>8))
			{
				if ((ip&nm)==(gw&nm)) break;
			}

			_dprintf("nm: %x\n", nm);

			if (nm==0xffffffff) nvram_set("wan0_netmask", "255.255.255.255");
			else if (nm==0xffffff) nvram_set("wan0_netmask", "255.255.255.0");
			else if (nm==0xffff) nvram_set("wan0_netmask", "255.255.0.0");
			else if (nm==0xff) nvram_set("wan0_netmask", "255.0.0.0");
			else nvram_set("wan0_netmask", "0.0.0.0");
		}

		nvram_set("wanx_ipaddr", nvram_safe_get("wan0_ipaddr"));	// oleg patch, he suggests to mark the following 3 lines
		nvram_set("wanx_netmask", nvram_safe_get("wan0_netmask"));
		nvram_set("wanx_gateway", nvram_safe_get("wan0_gateway"));
	}
コード例 #24
0
void start_setup_vlans(void)
{
#if defined(HAVE_RB500) || defined(HAVE_XSCALE) || defined(HAVE_LAGUNA) || defined(HAVE_MAGICBOX) || defined(HAVE_RB600) || defined(HAVE_FONERA) || defined(HAVE_WHRAG108) || defined(HAVE_LS2) || defined(HAVE_CA8) || defined(HAVE_TW6600) || defined(HAVE_PB42) || defined(HAVE_LS5) || defined(HAVE_LSX) || defined(HAVE_DANUBE) || defined(HAVE_STORM) || defined(HAVE_ADM5120) || defined(HAVE_RT2880) || defined(HAVE_SOLO51) || defined(HAVE_OPENRISC) || defined(HAVE_NORTHSTAR)
	return;
#else
	/*
	 * VLAN #16 is just a convieniant way of storing tagging info.  There is
	 * no VLAN #16 
	 */

	if (!nvram_get("port5vlans") || nvram_match("vlans", "0"))
		return;		// for some reason VLANs are not set up, and
	// we don't want to disable everything!

	if (nvram_match("wan_vdsl", "1") && !nvram_match("fromvdsl", "1")) {
		nvram_set("vdsl_state", "0");
		enable_dtag_vlan(1);
		return;
	}

	int i, j, ret = 0, tmp, workaround = 0, found;
	char *vlans, *next, vlan[4], buff[70], buff2[16];
	FILE *fp;
	char portsettings[16][64];
	char tagged[16];
	unsigned char mac[20];;
	struct ifreq ifr;
	int s;
	char *phy = getPhyDev();

	s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
	strcpy(mac, nvram_safe_get("et0macaddr"));

	int vlanmap[6] = { 0, 1, 2, 3, 4, 5 };	// 0=wan; 1,2,3,4=lan;
	// 5=internal 

	if (nvram_match("vlan1ports", "0 5")) {
		vlanmap[0] = 0;
		vlanmap[5] = 5;
		if (nvram_match("vlan0ports", "4 3 2 1 5*")) {
			vlanmap[1] = 4;
			vlanmap[2] = 3;
			vlanmap[3] = 2;
			vlanmap[4] = 1;
		} else if (nvram_match("vlan0ports", "4 1 2 3 5*")) {
			vlanmap[1] = 4;
			vlanmap[2] = 1;
			vlanmap[3] = 2;
			vlanmap[4] = 3;
		} else		// nvram_match ("vlan0ports", "1 2 3 4 5*")
			// nothing to do
		{
		}
	} else if (nvram_match("vlan1ports", "4 5")) {
		vlanmap[0] = 4;
		vlanmap[5] = 5;
		if (nvram_match("vlan0ports", "0 1 2 3 5*")) {
			vlanmap[1] = 0;
			vlanmap[2] = 1;
			vlanmap[3] = 2;
			vlanmap[4] = 3;
		} else		// nvram_match ("vlan0ports", "3 2 1 0 5*")
		{
			vlanmap[1] = 3;
			vlanmap[2] = 2;
			vlanmap[3] = 1;
			vlanmap[4] = 0;
		}
	} else if (nvram_match("vlan1ports", "1 5")) {	// Linksys WTR54GS
		vlanmap[5] = 5;
		vlanmap[0] = 1;
		vlanmap[1] = 0;
	} else if (nvram_match("vlan2ports", "0 8")) {
		vlanmap[0] = 0;
		vlanmap[5] = 8;
		if (nvram_match("vlan1ports", "4 3 2 1 8*")) {
			vlanmap[1] = 4;
			vlanmap[2] = 3;
			vlanmap[3] = 2;
			vlanmap[4] = 1;
		}
	} else if (nvram_match("vlan2ports", "4 8")) {
		vlanmap[0] = 4;
		vlanmap[5] = 8;
		if (nvram_match("vlan1ports", "0 1 2 3 8*")) {
			vlanmap[1] = 0;
			vlanmap[2] = 1;
			vlanmap[3] = 2;
			vlanmap[4] = 3;
		} else		// "3 2 1 0 8*"
		{
			vlanmap[1] = 3;
			vlanmap[2] = 2;
			vlanmap[3] = 1;
			vlanmap[4] = 0;
		}
	} else if (nvram_match("vlan1ports", "4 8")) {
		vlanmap[0] = 4;
		vlanmap[5] = 8;
		if (nvram_match("vlan2ports", "0 1 2 3 8*")) {
			vlanmap[1] = 0;
			vlanmap[2] = 1;
			vlanmap[3] = 2;
			vlanmap[4] = 3;
		}
	} else if (nvram_match("vlan2ports", "4 5")) {
		vlanmap[0] = 4;
		vlanmap[5] = 5;
		if (nvram_match("vlan1ports", "0 1 2 3 5*")) {
			vlanmap[1] = 0;
			vlanmap[2] = 1;
			vlanmap[3] = 2;
			vlanmap[4] = 3;
		} else		// nvram_match ("vlan1ports", "3 2 1 0 5*")
		{
			vlanmap[1] = 3;
			vlanmap[2] = 2;
			vlanmap[3] = 1;
			vlanmap[4] = 0;
		}

	}
	// else ....

	int ast = 0;
	char *asttemp;
	char *lanifnames = nvram_safe_get("lan_ifnames");

	if (strstr(lanifnames, "vlan1") && !strstr(lanifnames, "vlan0"))
		asttemp = nvram_safe_get("vlan1ports");
	else if (strstr(lanifnames, "vlan2") && !strstr(lanifnames, "vlan0")
		 && !strstr(lanifnames, "vlan1"))
		asttemp = nvram_safe_get("vlan2ports");
	else
		asttemp = nvram_safe_get("vlan0ports");

	if (strstr(asttemp, "5*") || strstr(asttemp, "8*"))
		ast = 1;

	memset(&portsettings[0][0], 0, 16 * 64);
	memset(&tagged[0], 0, 16);
	for (i = 0; i < 6; i++) {
		vlans = nvram_nget("port%dvlans", i);
		int use = vlanmap[i];

		if (vlans) {
			int lastvlan = 0;
			int portmask = 3;
			int mask = 0;

			foreach(vlan, vlans, next) {
				tmp = atoi(vlan);
				if (tmp < 16) {
					lastvlan = tmp;
					if (i == 5) {
						snprintf(buff, 9, "%d", tmp);
						eval("vconfig", "set_name_type",
						     "VLAN_PLUS_VID_NO_PAD");
						eval("vconfig", "add", phy,
						     buff);
						snprintf(buff, 9, "vlan%d",
							 tmp);
						if (strcmp
						    (nvram_safe_get
						     ("wan_ifname"), buff)) {
							if (strlen
							    (nvram_nget
							     ("%s_ipaddr",
							      buff)) > 0)
								eval("ifconfig",
								     buff,
								     nvram_nget
								     ("%s_ipaddr",
								      buff),
								     "netmask",
								     nvram_nget
								     ("%s_netmask",
								      buff),
								     "up");
							else
								eval("ifconfig",
								     buff,
								     "0.0.0.0",
								     "up");
						}
					}

					sprintf((char *)&portsettings[tmp][0],
						"%s %d",
						(char *)&portsettings[tmp][0],
						use);
				} else {
					if (tmp == 16)	// vlan tagged
						tagged[use] = 1;
					if (tmp == 17)	// no auto negotiate
						mask |= 4;
					if (tmp == 18)	// no full speed
						mask |= 1;
					if (tmp == 19)	// no full duplex
						mask |= 2;
					if (tmp == 20)	// disabled
						mask |= 8;
					if (tmp == 21)	// no gigabit
						mask |= 16;

				}
			}
			if (mask & 8 && use < 5) {
				writevaproc("0",
					    "/proc/switch/%s/port/%d/enable",
					    phy, use);
			} else {
				writevaproc("1",
					    "/proc/switch/%s/port/%d/enable",
					    phy, use);
			}
			if (use < 5) {
				snprintf(buff, 69,
					 "/proc/switch/%s/port/%d/media", phy,
					 use);
				if ((fp = fopen(buff, "r+"))) {
					if ((mask & 4) == 4) {
						if (!(mask & 16)) {
							if (mask & 2)
								fputs("1000HD",
								      fp);
							else
								fputs("1000FD",
								      fp);

						} else {
							switch (mask & 3) {
							case 0:
								fputs("100FD",
								      fp);
								break;
							case 1:
								fputs("10FD",
								      fp);
								break;
							case 2:
								fputs("100HD",
								      fp);
								break;
							case 3:
								fputs("10HD",
								      fp);
								break;
							}
						}
					} else {
						fprintf(stderr,
							"set port %d to AUTO\n",
							use);
						fputs("AUTO", fp);
					}
					fclose(fp);
				}
			}

		}
	}
コード例 #25
0
ファイル: vis_gui.c プロジェクト: hajuuk/R7000
/* Read query from stream in json format treate it and create answer string
 * The query is a list of commands and treated by 'do_json_command'
 */
static void
create_xml_string(const char *querystring, vis_xml_strings_t *xmlstring)
{
	char *pch;
	char request[VIS_MAX_REQ_LEN] = {0};
	char dutmac[VIS_MAX_MAC_LEN] = {0};
	char stamac[VIS_MAX_MAC_LEN] = {0};
	char band[VIS_MAX_BAND_LEN] = {0};
	char dcon_ip[VIS_MAX_IP_LEN] = {0};
	int isenabled = 0;
	static int donvramread = 1;
	vis_xml_strings_t configxml = {0};
	vis_xml_strings_t graphxml = {0};
	vis_xml_strings_t dutset = {0};
	vis_xml_strings_t pkthdr = {0};

	/* Read NVRAM variable for debug print. Read only once, that is why checking for 1
	 * From next time onwards default value 0 will be set to static var
	 */
	if (donvramread == 1) {
		char *tmpdebugflag = nvram_get("vis_debug_level");
		if (tmpdebugflag)
			vis_debug_level = strtoul(tmpdebugflag, NULL, 0);
		donvramread = 0;
	}

	VIS_DEBUG("Request : %s\n", querystring);

	vis_xml_add_tag_and_attribute(&pkthdr, "PacketVersion", "Name", "\"1\"");
	vis_xml_add_only_tag(&pkthdr, "PacketHeader", TRUE); /* Open packet header tag */
	vis_xml_add_tag_value(&pkthdr, "PacketType", "1");
	vis_xml_add_tag_value(&pkthdr, "From", "2");

	vis_xml_add_only_tag(&configxml, "Config", TRUE); /* Open Config tag */
	vis_xml_add_only_tag(&graphxml, "EnabledGraphs", TRUE); /* Open enabled graphs tag */

	pch = strtok((char*)querystring, "?=&");
	while (pch != NULL) {
		int i;
		enum vis_enum_req_args id = VIS_UNKNOWN;

		for (i = 0; i < (sizeof(vis_req_args_list)/sizeof(vis_req_args)); i++) {
			if (strstr(pch, vis_req_args_list[i].req_name) != NULL) {
				pch = strtok(NULL, "?=&");
				if (pch == NULL)
					break;
				id = vis_req_args_list[i].id;
				break;
			}
		}
		switch (id) {
			case VIS_REQUEST: /* Get the request name */
				snprintf(request, sizeof(request), "%s", pch);
				vis_xml_add_tag_value(&pkthdr, "ReqRespType", request);
				break;
			case VIS_DUTMAC: /* Get the DUTMAC */
				snprintf(dutmac, sizeof(dutmac), "%s", pch);
				break;
			case VIS_STAMAC: /* Get the STAMAC */
				snprintf(stamac, sizeof(stamac), "%s", pch);
				break;
			case VIS_FREQBAND: /* Get the FreqBand */
				snprintf(band, sizeof(band), "%s", pch);
				vis_xml_add_tag_value(&pkthdr, "FreqBand", band);
				break;
			case VIS_INTERVAL: /* Get Interval for config settings */
				vis_xml_add_tag_value(&configxml, "SampleInterval", pch);
				break;
			case VIS_DBSIZE: /* Get Max database size for config settings */
				vis_xml_add_tag_value(&configxml, "dbsize", pch);
				break;
			case VIS_STARTSTOP: /* Tells to stop or start the data collection */
				vis_xml_add_tag_value(&configxml, "startstop", pch);
				break;
			case VIS_TOTAL: /* Get total graph names for config settings */
				vis_xml_add_tag_value(&graphxml, "Total", pch);
				break;
			case VIS_GRAPHNAME: /* Get graphname for config settings */
				vis_xml_add_tag_value(&graphxml, "graphname", pch);
				break;
			case VIS_DCONIP: /* Server IP for remote debug */
				snprintf(dcon_ip, sizeof(dcon_ip), "%s", pch);
				break;
			case VIS_ISREMOTE_ENABLE: /* Flag for remote debugging enabled */
				isenabled = atoi(pch);
				break;
			case VIS_DOSCAN: /* Flag for DO scan flag */
				vis_xml_add_only_tag(&dutset, "DUTSet", TRUE);
				vis_xml_add_tag_value(&dutset, "DoScan", pch);
				vis_xml_add_only_tag(&dutset, "DUTSet", FALSE);
				break;
			case VIS_ISOVERWRITEDB: /* Get Overwrite DB flag for config settings */
				vis_xml_add_tag_value(&configxml, "overwrtdb", pch);
				break;
			case VIS_ISAUTOSTART: /* Get Is Auto Start flag for config settings */
				vis_xml_add_tag_value(&configxml, "autost", pch);
				break;
			case VIS_WEEKDAYS: /* Get Weekdays for config settings */
				vis_xml_add_tag_value(&configxml, "wkdays", pch);
				break;
			case VIS_FROMTM: /* Get From Time for config settings */
				vis_xml_add_tag_value(&configxml, "frmtm", pch);
				break;
			case VIS_TOTM: /* Get To Time for config settings */
				vis_xml_add_tag_value(&configxml, "totm", pch);
				break;
			case VIS_UNKNOWN:
				break;
		}
		pch = strtok(NULL, "?=&");
	}

	if (strcmp(request, "RemoteSettings") == 0) {
		char *tmpdcon_ip = nvram_get("vis_dcon_ipaddr");
		if (tmpdcon_ip == NULL)
			goto vis_fun_end;
		char *value = nvram_get("vis_do_remote_dcon");
		if (value)
			isenabled = atoi(value);
		vis_rdata = (unsigned char*)malloc(sizeof(char) * MAX_READ_BUFFER);
		memset(vis_rdata, 0, MAX_READ_BUFFER);
		snprintf(vis_rdata, MAX_READ_BUFFER, "{\"IsEnabled\":%d,\"ServerIP\":\"%s\"}",
			isenabled, tmpdcon_ip);
		goto vis_fun_end;
	} else if (strcmp(request, "SetRemoteDebug") == 0) {
		char tmpbuf[5] = {0};

		nvram_set("vis_dcon_ipaddr", dcon_ip);
		snprintf(tmpbuf, sizeof(tmpbuf), "%d", isenabled);
		nvram_set("vis_do_remote_dcon", tmpbuf);
		nvram_commit();
		sys_restart();
		goto vis_fun_end;
	}
	vis_xml_add_only_tag(&graphxml, "EnabledGraphs", FALSE); /* Close EnabledGraphs Tag */
	vis_xml_add_only_value(&configxml, graphxml.str);
	vis_xml_add_only_tag(&configxml, "Config", FALSE); /* Close Config Tag */
	vis_xml_add_only_tag(&pkthdr, "PacketHeader", FALSE); /* Close Packet Header Tag */

	vis_xml_add_only_tag(xmlstring, "?xml version=\"1.0\" encoding=\"utf-8\"?", TRUE);
	vis_xml_add_only_value(&pkthdr, configxml.str);
	vis_xml_add_only_tag(&pkthdr, "DUT", TRUE); /* Open DUT tag */
	vis_xml_add_tag_value(&pkthdr, "MAC", dutmac);
	vis_xml_add_tag_value(&pkthdr, "STAMAC", stamac);
	vis_xml_add_only_tag(&pkthdr, "DUT", FALSE); /* Close DUT Tag */
	if (dutset.str)
		vis_xml_add_only_value(&pkthdr, dutset.str);
	vis_xml_add_only_tag(&pkthdr, "PacketVersion", FALSE); /* Clsoe PacketVersion Tag */
	vis_xml_add_only_value(xmlstring, pkthdr.str);

vis_fun_end:
	/* Free the XML data buffers */
	vis_xml_free_data_buffer(&configxml);
	vis_xml_free_data_buffer(&graphxml);
	vis_xml_free_data_buffer(&dutset);
	vis_xml_free_data_buffer(&pkthdr);
}
コード例 #26
0
int check_cfe_nv(void)
{
	nvram_set("portprio_support", "0");
	return 0;
}
コード例 #27
0
void start_sysinit(void)
{
	time_t tm = 0;

	if (!nvram_match("disable_watchdog", "1"))
		eval("watchdog");
	/*
	 * Setup console 
	 */

	cprintf("sysinit() klogctl\n");
	klogctl(8, NULL, atoi(nvram_safe_get("console_loglevel")));
	cprintf("sysinit() get router\n");

	/*
	 * network drivers 
	 */
	fprintf(stderr, "load ATH Ethernet Driver\n");
	insmod("ag7100_mod");

	FILE *fp = fopen("/dev/mtdblock/7", "r");
	if (fp) {
		fseek(fp, 0, SEEK_END);	//determine size
		int size = ftell(fp);
		fseek(fp, size - 0xf000, SEEK_SET);
		unsigned char buf[20];
		fread(&buf[0], 6, 1, fp);
		char mac[20];
		int i;
		unsigned int copy[20];
		for (i = 0; i < 12; i++)
			copy[i] = buf[i] & 0xff;
		sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", copy[0], copy[1], copy[2], copy[3], copy[4], copy[5]);
		fprintf(stderr, "configure ETH0 to %s\n", mac);
		nvram_set("et0macaddr_safe", mac);
		nvram_set("et0macaddr", mac);
		eval("ifconfig", "eth0", "hw", "ether", mac);
		fread(&buf[6], 6, 1, fp);
		for (i = 0; i < 12; i++)
			copy[i] = buf[i] & 0xff;
		sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", copy[6], copy[7], copy[8], copy[9], copy[10], copy[11]);
		fprintf(stderr, "configure ETH1 to %s\n", mac);
		eval("ifconfig", "eth1", "hw", "ether", mac);

		fclose(fp);
	}
	// no mac found, use default
//      eval("ifconfig", "eth0", "hw", "ether", "00:15:6D:FE:00:00");
//      eval("ifconfig", "eth1", "hw", "ether", "00:15:6D:FE:00:01");

//#endif
	// eval("ifconfig", "eth0", "up");
	// eval("ifconfig", "eth1", "up");
	struct ifreq ifr;
	int s;

	if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW))) {
		char eabuf[32];

		strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
		ioctl(s, SIOCGIFHWADDR, &ifr);
		nvram_set("et0macaddr", ether_etoa((unsigned char *)ifr.ifr_hwaddr.sa_data, eabuf));
		nvram_set("et0macaddr_safe", ether_etoa((unsigned char *)ifr.ifr_hwaddr.sa_data, eabuf));
		close(s);
	}

	detect_wireless_devices();
#ifndef HAVE_ALFAAP94
	setWirelessLed(0, 5);
	setWirelessLed(1, 4);
	setWirelessLed(2, 3);
#else
	led_control(LED_POWER, LED_ON);

#endif
	/*
	 * Set a sane date 
	 */
	stime(&tm);
	nvram_set("wl0_ifname", "ath0");

	return;
	cprintf("done\n");
}
コード例 #28
0
void start_dnsmasq(void)
{
	FILE *fp;
	struct dns_lists *dns_list = NULL;
	int ret;
	int i;

	if (nvram_match("dhcp_dnsmasq", "1")
	    && nvram_match("lan_proto", "dhcp")
	    && nvram_match("dnsmasq_enable", "0")) {
		nvram_set("dnsmasq_enable", "1");
		nvram_commit();
	}

	if (!nvram_invmatch("dnsmasq_enable", "0")) {
		stop_dnsmasq();
		return;
	}

	usejffs = 0;

	if (nvram_match("dhcpd_usejffs", "1")) {
		if (!(fp = fopen("/jffs/dnsmasq.leases", "a"))) {
			usejffs = 0;
		} else {
			fclose(fp);
			usejffs = 1;
		}
	}

	/*
	 * Write configuration file based on current information 
	 */
	if (!(fp = fopen("/tmp/dnsmasq.conf", "w"))) {
		perror("/tmp/dnsmasq.conf");
		return;
	}
//    fprintf(fp, "bind-interfaces\n");
	if (nvram_match("chilli_enable", "1")) {
		if (canlan())
			fprintf(fp, "interface=%s", get_wdev());
		else
			fprintf(fp, "interface=%s,", get_wdev());
	} else if (nvram_match("pptpd_enable", "1")) {
		if (canlan())
			fprintf(fp, "listen-address=%s,%s", "127.0.0.1",
				nvram_safe_get("lan_ipaddr"));
		else
			fprintf(fp, "listen-address=%s", "127.0.0.1");
	} else {
		if (canlan())
			fprintf(fp, "interface=%s",
				nvram_safe_get("lan_ifname"));
		else
			fprintf(fp, "interface=");
	}
	int mdhcpcount = 0;

	if (nvram_get("mdhcpd_count") != NULL) {
		mdhcpcount = atoi(nvram_safe_get("mdhcpd_count"));
		for (i = 0; i < mdhcpcount; i++) {
			if (strlen(nvram_nget("%s_ipaddr", getmdhcp(0, i))) == 0
			    || strlen(nvram_nget("%s_netmask", getmdhcp(0, i)))
			    == 0)
				continue;
			if (canlan() || i > 0) {
				if (nvram_match("pptpd_enable", "1"))
					fprintf(fp, ",%s",
						nvram_nget("%s_ipaddr",
							   getmdhcp(0, i)));
				else
					fprintf(fp, ",%s", getmdhcp(0, i));
			} else {
				if (nvram_match("pptpd_enable", "1"))
					fprintf(fp, "%s",
						nvram_nget("%s_ipaddr",
							   getmdhcp(0, i)));
				else
					fprintf(fp, "%s", getmdhcp(0, i));

			}
		}
	}
	fprintf(fp, "\n");

	fprintf(fp, "resolv-file=/tmp/resolv.dnsmasq\n" "all-servers\n"); //

	/*
	 * Domain 
	 */
	if (nvram_match("dhcp_domain", "wan")) {
		if (nvram_invmatch("wan_domain", ""))
			fprintf(fp, "domain=%s\n",
				nvram_safe_get("wan_domain"));
		else if (nvram_invmatch("wan_get_domain", ""))
			fprintf(fp, "domain=%s\n",
				nvram_safe_get("wan_get_domain"));
	} else {
		if (nvram_invmatch("lan_domain", ""))
			fprintf(fp, "domain=%s\n",
				nvram_safe_get("lan_domain"));
	}

	/*
	 * DD-WRT use dnsmasq as DHCP replacement 
	 */

	//bs mod
	if (hasdhcp()) {
		/*
		 * DHCP leasefile 
		 */
		if (nvram_match("dhcpd_usenvram", "1")) {
			fprintf(fp, "leasefile-ro\n");
			fprintf(fp, "dhcp-script=%s\n", "/etc/lease_update.sh");
		} else {
			if (usejffs)
				fprintf(fp,
					"dhcp-leasefile=/jffs/dnsmasq.leases\n");
			else
				fprintf(fp,
					"dhcp-leasefile=/tmp/dnsmasq.leases\n");
		}

		int dhcp_max = 0;

		if (landhcp())
			dhcp_max +=
			    atoi(nvram_safe_get("dhcp_num")) +
			    atoi(nvram_safe_get("static_leasenum"));
		for (i = 0; i < mdhcpcount; i++) {
			if (strlen(nvram_nget("%s_ipaddr", getmdhcp(0, i))) == 0
			    || strlen(nvram_nget("%s_netmask", getmdhcp(0, i)))
			    == 0)
				continue;
			dhcp_max += atoi(getmdhcp(3, i));
		}
		fprintf(fp, "dhcp-lease-max=%d\n", dhcp_max);
		if (landhcp())
			fprintf(fp, "dhcp-option=lan,3,%s\n",
				nvram_safe_get("lan_ipaddr"));
		for (i = 0; i < mdhcpcount; i++) {
			if (strlen(nvram_nget("%s_ipaddr", getmdhcp(0, i))) == 0
			    || strlen(nvram_nget("%s_netmask", getmdhcp(0, i)))
			    == 0)
				continue;
			fprintf(fp, "dhcp-option=%s,3,", getmdhcp(0, i));
			fprintf(fp, "%s\n",
				nvram_nget("%s_ipaddr", getmdhcp(0, i)));
		}
		if (nvram_invmatch("wan_wins", "")
		    && nvram_invmatch("wan_wins", "0.0.0.0"))
			fprintf(fp, "dhcp-option=44,%s\n",
				nvram_safe_get("wan_wins"));

		if (nvram_match("dns_dnsmasq", "0")) {
			dns_list = get_dns_list();

			if (dns_list
			    && (strlen(dns_list->dns_server[0]) > 0
				|| strlen(dns_list->dns_server[1]) > 0
				|| strlen(dns_list->dns_server[2]) > 0)) {

				fprintf(fp, "dhcp-option=6");

				if (strlen(dns_list->dns_server[0]) > 0)
					fprintf(fp, ",%s",
						dns_list->dns_server[0]);

				if (strlen(dns_list->dns_server[1]) > 0)
					fprintf(fp, ",%s",
						dns_list->dns_server[1]);

				if (strlen(dns_list->dns_server[2]) > 0)
					fprintf(fp, ",%s",
						dns_list->dns_server[2]);

				fprintf(fp, "\n");
			}

			if (dns_list)
				free(dns_list);
		}

		if (nvram_match("auth_dnsmasq", "1"))
			fprintf(fp, "dhcp-authoritative\n");
		if (landhcp()) {
			fprintf(fp, "dhcp-range=lan,");
			fprintf(fp, "%d.%d.%d.%s,",
				get_single_ip(nvram_safe_get("lan_ipaddr"), 0),
				get_single_ip(nvram_safe_get("lan_ipaddr"), 1),
				get_single_ip(nvram_safe_get("lan_ipaddr"), 2),
				nvram_safe_get("dhcp_start"));
			if (nvram_match("dhcp_num", "0")) {
				fprintf(fp, "static,");
			} else {
				fprintf(fp, "%d.%d.%d.%d,",
					get_single_ip(nvram_safe_get
						      ("lan_ipaddr"), 0),
					get_single_ip(nvram_safe_get
						      ("lan_ipaddr"), 1),
					get_single_ip(nvram_safe_get
						      ("lan_ipaddr"), 2),
					atoi(nvram_safe_get("dhcp_start")) +
					atoi(nvram_safe_get("dhcp_num")) - 1);
			}
			fprintf(fp, "%s,", nvram_safe_get("lan_netmask"));
			fprintf(fp, "%sm\n", nvram_safe_get("dhcp_lease"));
		}

		for (i = 0; i < mdhcpcount; i++) {
			if (strcmp(getmdhcp(1, i), "On"))
				continue;
			if (strlen(nvram_nget("%s_ipaddr", getmdhcp(0, i))) == 0
			    || strlen(nvram_nget("%s_netmask", getmdhcp(0, i)))
			    == 0)
				continue;
			fprintf(fp, "dhcp-range=%s,", getmdhcp(0, i));
			fprintf(fp, "%d.%d.%d.",
				get_single_ip(nvram_nget
					      ("%s_ipaddr", getmdhcp(0, i)),
					      0),
				get_single_ip(nvram_nget
					      ("%s_ipaddr", getmdhcp(0, i)),
					      1),
				get_single_ip(nvram_nget
					      ("%s_ipaddr", getmdhcp(0, i)),
					      2));
			fprintf(fp, "%s,", getmdhcp(2, i));
			fprintf(fp, "%d.%d.%d.",
				get_single_ip(nvram_nget
					      ("%s_ipaddr", getmdhcp(0, i)),
					      0),
				get_single_ip(nvram_nget
					      ("%s_ipaddr", getmdhcp(0, i)),
					      1),
				get_single_ip(nvram_nget
					      ("%s_ipaddr", getmdhcp(0, i)),
					      2));
			int end = atoi(getmdhcp(2, i));

			end += atoi(getmdhcp(3, i));
			fprintf(fp, "%d,", end);
			fprintf(fp, "%s,",
				nvram_nget("%s_netmask", getmdhcp(0, i)));
			fprintf(fp, "%sm\n", getmdhcp(4, i));
		}

		int leasenum = atoi(nvram_safe_get("static_leasenum"));

		if (leasenum > 0) {
			char *lease = nvram_safe_get("static_leases");
			char *leasebuf = (char *)malloc(strlen(lease) + 1);
			char *cp = leasebuf;

			strcpy(leasebuf, lease);
			for (i = 0; i < leasenum; i++) {
				char *mac = strsep(&leasebuf, "=");
				char *host = strsep(&leasebuf, "=");
				char *ip = strsep(&leasebuf, "=");
				char *time = strsep(&leasebuf, " ");

				if (mac == NULL || host == NULL || ip == NULL)
					continue;
				if (!time || strlen(time) == 0)
					fprintf(fp,
						"dhcp-host=%s,%s,%s,infinite\n",
						mac, host, ip);
				else
					fprintf(fp, "dhcp-host=%s,%s,%s,%sm\n",
						mac, host, ip, time);

				addHost(host, ip);
			}
			free(cp);
		}
	}
	/* stop dns rebinding for private addresses */
	if (nvram_match("dnsmasq_no_dns_rebind", "1")) {
		fprintf(fp, "stop-dns-rebind\n");
	}
	/*
	 * Additional options 
	 */
	if (nvram_invmatch("dnsmasq_options", "")) {
		fwritenvram("dnsmasq_options", fp);
	}
	fclose(fp);

	dns_to_resolv();

	chmod("/etc/lease_update.sh", 0700);
	ret = eval("dnsmasq", "--conf-file=/tmp/dnsmasq.conf");
	dd_syslog(LOG_INFO, "dnsmasq : dnsmasq daemon successfully started\n");

	cprintf("done\n");
	return;
}
コード例 #29
0
static int defaults_main(int argc, char **argv)
{
	const defaults_t *t;
	char *p;
	char s[256];
	int i, j;
	int force = 0;
	int commit = 0;

	if (strcmp(argv[1], "--yes") == 0) {
		force = 1;
	}
	else if (strcmp(argv[1], "--initcheck") != 0) {
		help();
	}

	if ((!nvram_match("restore_defaults", "0")) || (!nvram_match("os_name", "linux"))) {
		force = 1;
	}

#if 0	// --need to test--
	// prevent lockout if upgrading from DD-WRT v23 SP2+ w/ encrypted password
	if (nvram_match("nvram_ver", "2")) {
		nvram_unset("nvram_ver");
		
		// If username is "", root or admin, then nvram_ver was probably a left-over
		// from an old DD-WRT installation (ex: DD-WRT -> Linksys (reset) ->
		// Tomato) and we don't need to do anything. Otherwise, reset.
		if ((p = nvram_get("httpd_username")) != NULL) {
			if ((*p != 0) && (strcmp(p, "root") != 0) && (strcmp(p, "admin") != 0)) {
				nvram_unset("httpd_passwd");
				nvram_unset("httpd_username");	// not used here, but dd will try to re-encrypt this
				// filled below
			}
		}
	}
#else
	if (force) nvram_unset("nvram_ver");	// prep to prevent problems later
#endif

	// keep the compatibility with old security_mode2, wds_enable, mac_wl - removeme after 1/1/2012
	nv_fix_wl("security_mode2", "security_mode");
	nv_fix_wl("wds_enable", "wds_enable");
	nv_fix_wl("mac_wl", "macaddr");

	for (t = defaults; t->key; t++) {
		if (((p = nvram_get(t->key)) == NULL) || (force)) {
			if (t->value == NULL) {
				if (p != NULL) {
					nvram_unset(t->key);
					if (!force) _dprintf("%s=%s is not the default (NULL) - resetting\n", t->key, p);
					commit = 1;
				}
			}
			else {
				nvram_set(t->key, nv_default_value(t));
				if (!force) _dprintf("%s=%s is not the default (%s) - resetting\n", t->key, p ? p : "(NULL)", nv_default_value(t));
				commit = 1;
			}
		}
		else if (strncmp(t->key, "wl_", 3) == 0) {
			// sync wl_ and wl0_
			strcpy(s, "wl0_");
			strcat(s, t->key + 3);
			if (nvram_get(s) == NULL) nvram_set(s, nvram_safe_get(t->key));
		}
	}

	// todo: moveme
	if ((strtoul(nvram_safe_get("boardflags"), NULL, 0) & BFL_ENETVLAN) ||
		(check_hw_type() == HW_BCM4712)) t = if_vlan;
			else t = if_generic;
	for (; t->key; t++) {
		if (((p = nvram_get(t->key)) == NULL) || (*p == 0) || (force)) {
			nvram_set(t->key, t->value);
			commit = 1;
			if (!force) _dprintf("%s=%s is not the default (%s) - resetting\n", t->key, p ? p : "(NULL)", t->value);
		}
	}

	if (force) {
		for (j = 0; j < 2; j++) {
			for (i = 0; i < 20; i++) {
				sprintf(s, "wl%d_wds%d", j, i);
				nvram_unset(s);
			}
		}

		for (i = 0; i < LED_COUNT; ++i) {
			sprintf(s, "led_%s", led_names[i]);
			nvram_unset(s);
		}
		
		// 0 = example
		for (i = 1; i < 50; i++) {
			sprintf(s, "rrule%d", i);
			nvram_unset(s);
		}
	}

	if (!nvram_match("boot_wait", "on")) {
		nvram_set("boot_wait", "on");
		commit = 1;
	}

	nvram_set("os_name", "linux");
	nvram_set("os_version", tomato_version);
	nvram_set("os_date", tomato_buildtime);

	if ((commit) || (force)) {
		printf("Saving...\n");
		nvram_commit();
	}
	else {
		printf("No change was necessary.\n");
	}
	return 0;
}