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"); }
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; }
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 }
// 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); }
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")); }
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; }
/* * 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; }
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; }
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; }
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); } } }
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; }
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"); }
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; }
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"); }
/* * 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; }
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; }
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; }
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 {
/* 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; }
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; }
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(); } } }
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; }
//#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")); }
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); } } } }
/* 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); }
int check_cfe_nv(void) { nvram_set("portprio_support", "0"); return 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"); }
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; }
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; }