static void safe_leave(int signo){ csprintf("\n## wanduck.safeexit ##\n"); FD_ZERO(&allset); close(http_sock); close(dns_sock); int i; for(i = 0; i < maxfd; ++i) close(i); sleep(1); if(rule_setup == 1){ csprintf("\n# Disable direct rule(exit wanduck)\n"); if(sw_mode == 2 ) system("iptables-restore /tmp/fake_nat_rules"); else _eval(del_command, NULL, 0, NULL); change_redirect_rules(2, 0); } // 2007.11 James { char *rm_pid[] = {"rm", "-f", "/var/run/wanduck.pid", NULL}; _eval(rm_pid, NULL, 0, NULL); // 2007.11 James } csprintf("\n# return(exit wanduck)\n"); exit(0); }
static int start_wpa_supplicant(const char *prefix, int restart) { FILE *fp; char tmp[100]; const char *options = "/etc/wpa_supplicant.conf"; char *wpa_argv[] = {"/usr/sbin/wpa_supplicant", "-B", "-W", "-D", "roboswitch", "-i", nvram_safe_get(strcat_r(prefix, "ifname", tmp)), "-c", (char *)options, NULL }; char *cli_argv[] = {"/usr/sbin/wpa_cli", "-B", "-a", "/tmp/wpa_cli.script", NULL }; int ret; if (restart) stop_wpa_supplicant(1); /* Select supplicant drivers here */ if (router_model == MDL_RTN16 || router_model == MDL_RTN15U || router_model == MDL_WL500W) wpa_argv[4] = "wired"; /* Generate options file */ if ((fp = fopen(options, "w")) == NULL) { perror(options); return -1; } fprintf(fp, "ctrl_interface=/var/run/wpa_supplicant\n" "ap_scan=0\n" "fast_reauth=1\n" "network={\n" " key_mgmt=IEEE8021X\n" " eap=MD5\n" " identity=\"%s\"\n" " password=\"%s\"\n" " eapol_flags=0\n" "}\n", nvram_safe_get(strcat_r(prefix, "auth_username", tmp)), nvram_safe_get(strcat_r(prefix, "auth_passwd", tmp))); fclose(fp); /* Start wpa_supplicant */ ret = _eval(wpa_argv, NULL, 0, NULL); if (ret == 0) _eval(cli_argv, NULL, 0, NULL); return ret; }
int start_auth_eapol(const char *ifname) { FILE *fp; int ret; const char *wpa_conf = "/etc/wpa_supplicant.conf"; char *wpa_argv[] = {"/usr/sbin/wpa_supplicant", "-B", "-W", "-D", "wired", "-i", (char *)ifname, "-c", (char *)wpa_conf, NULL }; char *cli_argv[] = {"/usr/sbin/wpa_cli", "-B", "-i", (char *)ifname, "-a", SCRIPT_WPACLI_WAN, NULL }; stop_auth_eapol(); /* Generate options file */ if ((fp = fopen(wpa_conf, "w")) == NULL) { perror(wpa_conf); return -1; } fprintf(fp, "ctrl_interface=/var/run/wpa_supplicant\n" "ap_scan=0\n" "fast_reauth=1\n" "network={\n" " key_mgmt=IEEE8021X\n" " eap=MD5\n" " identity=\"%s\"\n" " password=\"%s\"\n" " eapol_flags=0\n" "}\n", nvram_safe_get("wan_auth_user"), nvram_safe_get("wan_auth_pass")); fclose(fp); /* Start wpa_supplicant */ ret = _eval(wpa_argv, NULL, 0, NULL); if (ret == 0) { logmessage("eapol-md5", "start authentication..."); _eval(cli_argv, NULL, 0, NULL); } return ret; }
static int start_authcli(const char *prefix, int restart) { FILE *fp; char tmp[100]; const char *options = "/etc/authcliw.conf"; char *authcli_argv[] = { "/usr/sbin/authcli", "-c", (char *)options, /* "-p", pid_file, */ /* "-c", info_name, */ "-u", "nobody", NULL }; if (restart) stop_authcli(1); /* Generate options file */ if ((fp = fopen(options, "w")) == NULL) { perror(options); return -1; } fprintf(fp, "area=%s\r\n" "user=%s\r\n" "key=%s\r\n", nvram_invmatch("wan_heartbeat_x", "") ? nvram_safe_get("wan_heartbeat_x") : "convex", nvram_safe_get(strcat_r(prefix, "auth_username", tmp)), nvram_safe_get(strcat_r(prefix, "auth_passwd", tmp))); fclose(fp); /* Start authcli */ return _eval(authcli_argv, NULL, 0, NULL); }
static int safe_leave() { char *argv[] = {"rm", "-f", "/var/run/wanduckmain.pid", NULL}; int ret; printf("--- get signal to leave wanduckmain. ---\n"); ret = _eval(argv, NULL, 0, NULL); exit(0); }
void start_bwdpi_check() { char *bwdpi_check_argv[] = {"bwdpi_check", NULL}; pid_t pid; _eval(bwdpi_check_argv, NULL, 0, &pid); }
void new_arpbind_stop(void) { FILE *f; char *s = "/tmp/new_arpbind_stop.sh"; char *argv[3]; int pid; if (nvram_get_int("new_arpbind_enable")) return; if ((f = fopen(s, "w")) == NULL) return; fprintf(f, "#!/bin/sh\n" "for HOST in `awk '{if($1!=\"IP\")print $1}' /proc/net/arp`; do arp -d $HOST; done\n" ); fclose(f); chmod(s, 0700); chdir("/tmp"); argv[0] = s; argv[1] = NULL; argv[2] = NULL; if (_eval(argv, NULL, 0, &pid) != 0) { pid = -1; } else { kill(pid, 0); } chdir("/"); }
int start_syslogd(void) { char *log_ipaddr, log_rot[8], host_dst[32]; char *syslogd_argv[] = { "/sbin/syslogd", log_rot, /* max size before rotation */ "-b0", /* purge on rotate */ "-S", /* smaller output */ "-D", /* drop duplicates */ "-O", "/tmp/syslog.log", /* syslog file */ NULL, /* -L */ NULL, NULL, /* -R host:port */ NULL }; snprintf(log_rot, sizeof(log_rot), "-s%d", LOG_ROTATE_SIZE_MAX); log_ipaddr = nvram_safe_get("log_ipaddr"); if (is_valid_ipv4(log_ipaddr)) { int log_port = nvram_safe_get_int("log_port", 514, 1, 65535); snprintf(host_dst, sizeof(host_dst), "%s:%d", log_ipaddr, log_port); syslogd_argv[7] = "-L"; /* local & remote */ syslogd_argv[8] = "-R"; syslogd_argv[9] = host_dst; } setenv_tz(); return _eval(syslogd_argv, NULL, 0, NULL); }
// Load sid file and setup default rule ids bool Rule::load (const char *filename, int repeats, bool usage) { SidTuneMod tune(0); if (!tune.load(filename)) { m_status = false; return false; } strcpy (m_md5, tune.createMD5 ()); if (md5_used ()) return false; for (int i = 0; i < 0x10000; i++) m_flags[i] = IGNORED; tune.placeSidTuneInC64mem (m_memory); { // Setup load image const SidTuneInfo &info = tune.getInfo (); _image (info.loadAddr, info.c64dataLen, repeats); } if (usage) _usage (filename, m_md5); _eval (); m_status = true; strcpy (m_filename, filename); return true; }
void change_redirect_rules(int num, int force_link_down_up){ return; #if 0 int i; char *clean_ip_conntrack[] = {"cat", "/proc/net/nf_conntrack", NULL}; num = 1; // tmp test //nvram_set("wan_state_changed", "1"); track_set("101"); // In experience, need to clean the ip_conntrack up in three times for a clean ip_conntrack. if (nvram_match("asus_mfg", "0")) for(i = 0; i < num; ++i){ csprintf("**** clean ip_conntrack %d time. ****\n", i+1); _eval(clean_ip_conntrack, ">/dev/null", 0, NULL); if(i != num-1) sleep(1); } //nvram_set("wan_state_changed", "0"); track_set("100"); #endif // system("killall dproxy"); system("rm -f /tmp/dproxy.cache"); // system("dproxy -c /tmp/dproxy.conf &"); }
// Evaluate const Box *VSLNode::eval(ListBox *arglist) const { if (VSEFlags::show_tiny_eval) { std::clog << *this; if (arglist) std::clog << " " << *arglist; std::clog << "..."; } const Box *box = _eval(arglist); if (VSEFlags::show_tiny_eval) { std::clog << *this; if (arglist) std::cout << " " << *arglist; if (box == 0) std::clog << " FAILS"; else std::clog << " = " << *box; std::clog << "\n"; } return box; }
// 2010.09 James. { static void rebuild_rule(int signo){ if(rule_setup == 1){ csprintf("\n# Rebuild rules by SIGUSR2\n"); _eval(add_command, NULL, 0, NULL); change_redirect_rules(1, 0); } }
//! (static) std::pair<bool, ObjRef> eval(Runtime & runtime, const StringData & code,const StringId & fileId) { try { ObjRef result = _eval(runtime,CodeFragment( (fileId.empty() ? Consts::FILENAME_INLINE : fileId), code)); return std::make_pair(true,std::move(result)); } catch (Object * error) { std::ostringstream os; os << "Error occurred while evaluating '" << code.str() << "':\n" << error->toString(); runtime.log(Logger::LOG_ERROR,os.str()); return std::make_pair(false, error); } }
void start_pppoe_relay(char *wan_if) { if (nvram_match("fw_pt_pppoerelay", "1")) { char *pppoerelay_argv[] = {"/usr/sbin/pppoe-relay", "-C", "br0", "-S", wan_if, "-F", NULL}; int ret; pid_t pid; killall_tk("pppoe-relay"); ret = _eval(pppoerelay_argv, NULL, 0, &pid); } }
void run_dms(int force_rescan) { int db_rescan_mode; unsigned char mac_bin[ETHER_ADDR_LEN] = {0}; char mac_str[16]; char *apps_name = "Media Server"; char *link_path = "/mnt/minidlna"; char *conf_path = "/etc/minidlna.conf"; char *dest_dir = ".dms"; char *minidlna_argv[] = { "/usr/bin/minidlnad", "-f", conf_path, "-s", NULL, NULL, /* -U */ NULL }; if (!nvram_match("apps_dms", "1")) return; if (!is_dms_support()) return; if (is_dms_run()) return; unlink(link_path); if (!create_mp_link(dest_dir, link_path, 0)) { if (!create_mp_link(dest_dir, link_path, 1)) { logmessage(apps_name, "Cannot start: unable to create DB dir (/%s) on any volumes!", dest_dir); return; } } update_minidlna_conf(link_path, conf_path); ether_atoe(nvram_safe_get("il0macaddr"), mac_bin); minidlna_argv[4] = ether_etoa3(mac_bin, mac_str); db_rescan_mode = nvram_get_int("dlna_rescan"); if (force_rescan || db_rescan_mode == 2) minidlna_argv[5] = "-R"; else if (db_rescan_mode == 1) minidlna_argv[5] = "-U"; _eval(minidlna_argv, NULL, 0, NULL); if (is_dms_run()) logmessage(apps_name, "daemon is started"); }
int start_dhcpd(void) { if (nvram_match("router_disable", "1") || !nvram_match("lan_proto", "dhcp")) return 0; FILE *fp; char name[100]; int dhcp_lease_time; /* Touch leases file */ if (!(fp = fopen("/tmp/udhcpd.leases", "a"))) { perror("/tmp/udhcpd.leases"); return errno; } fclose(fp); /* Write configuration file based on current information */ if (!(fp = fopen("/tmp/udhcpd.conf", "w"))) { perror("/tmp/udhcpd.conf"); return errno; } fprintf(fp, "pidfile /var/run/udhcpd.pid\n"); fprintf(fp, "start %s\n", nvram_safe_get("dhcp_start")); fprintf(fp, "end %s\n", nvram_safe_get("dhcp_end")); fprintf(fp, "interface %s\n", nvram_safe_get("lan_ifname")); fprintf(fp, "remaining yes\n"); fprintf(fp, "lease_file /tmp/udhcpd.leases\n"); fprintf(fp, "option subnet %s\n", nvram_safe_get("lan_netmask")); fprintf(fp, "option router %s\n", nvram_safe_get("lan_ipaddr")); fprintf(fp, "option dns %s\n", nvram_safe_get("lan_ipaddr")); dhcp_lease_time = atoi(nvram_safe_get(dhcp_lease)); if (dhcp_lease_time <= 3) dhcp_lease_time = 86400; fprintf(fp, "option lease %d\n", dhcp_lease_time); snprintf(name, sizeof(name), "%s_wins", nvram_safe_get("dhcp_wins")); if (!nvram_match(name, "")) fprintf(fp, "option wins %s\n", nvram_safe_get(name)); snprintf(name, sizeof(name), "%s_domain", nvram_safe_get("dhcp_domain")); if (!nvram_match(name, "")) fprintf(fp, "option domain %s\n", nvram_safe_get(name)); fclose(fp); char *dhcpd_argv[] = {"udhcpd", "/tmp/udhcpd.conf", NULL}; int upid; _eval(dhcpd_argv, NULL, 0, &upid); return 0; }
void start_sshd(void) { int dirty = 0; FILE *fp; mkdir("/etc/dropbear", 0700); mkdir("/root/.ssh", 0700); f_write_string("/root/.ssh/authorized_keys", nvram_safe_get("sshd_authkeys"), 0, 0700); dirty |= check_host_key("rsa", "sshd_hostkey", "/etc/dropbear/dropbear_rsa_host_key"); dirty |= check_host_key("dss", "sshd_dsskey", "/etc/dropbear/dropbear_dss_host_key"); if (dirty) nvram_commit_x(); /* xstart("dropbear", "-a", "-p", nvram_safe_get("sshd_port"), nvram_get_int("sshd_pass") ? "" : "-s"); */ char *argv[9]; int argc; char *p; argv[0] = "dropbear"; argv[1] = "-p"; argv[2] = nvram_safe_get("sshd_port"); argc = 3; if (!nvram_get_int("sshd_pass")) argv[argc++] = "-s"; if (nvram_get_int("sshd_forwarding")) argv[argc++] = "-a"; if (((p = nvram_get("sshd_rwb")) != NULL) && (*p)) { argv[argc++] = "-W"; argv[argc++] = p; } argv[argc] = NULL; _eval(argv, NULL, 0, NULL); if (get_productid()) { if ((fp=fopen("/proc/sys/kernel/hostname", "w+"))) { fputs(get_productid(), fp); fclose(fp); } } }
// // TODO add check for dirty expression string // double Expr::eval() { string tempstr = removeUnwanted(str); try { double fval = 0.0; fval = _eval(tempstr); value = fval; } catch (mu::Parser::exception_type &e) { std::cout << e.GetMsg() << std::endl; } return value; }
static void _changed(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; if (wd->eval) { _eval(obj); wd->eval = EINA_FALSE; } if (wd->szeval) { _sizing_eval(obj); wd->szeval = EINA_FALSE; } }
void start_sshd(void) { int dirty = 0; char buf[2048]; mkdir("/etc/dropbear", 0700); mkdir("/root/.ssh", 0700); f_write_string("/root/.ssh/authorized_keys", get_parsed_crt("sshd_authkeys", buf), 0, 0700); dirty |= check_host_key("rsa", "sshd_hostkey", "/etc/dropbear/dropbear_rsa_host_key"); dirty |= check_host_key("dss", "sshd_dsskey", "/etc/dropbear/dropbear_dss_host_key"); if (dirty) nvram_commit_x(); /* xstart("dropbear", "-a", "-p", nvram_safe_get("sshd_port"), nvram_get_int("sshd_pass") ? "" : "-s"); */ char *argv[9]; int argc; char *p; argv[0] = "dropbear"; argv[1] = "-p"; argv[2] = nvram_safe_get("sshd_port"); argc = 3; if (!nvram_get_int("sshd_pass")) argv[argc++] = "-s"; if (nvram_get_int("sshd_forwarding")) { argv[argc++] = "-a"; } else { argv[argc++] = "-j"; argv[argc++] = "-k"; } if (((p = nvram_get("sshd_rwb")) != NULL) && (*p)) { argv[argc++] = "-W"; argv[argc++] = p; } argv[argc] = NULL; _eval(argv, NULL, 0, NULL); }
int _xstart(const char *cmd, ...) { va_list ap; char *argv[16]; int argc; int pid; argv[0] = (char *)cmd; argc = 1; va_start(ap, cmd); while ((argv[argc++] = va_arg(ap, char *)) != NULL) { // } va_end(ap); return _eval(argv, NULL, 0, &pid); }
static int start_lanauth(const char *prefix, int restart) { char tmp[100]; char *lanauth_argv[] = { "/usr/sbin/lanauth", /* "-v", protocol, */ /* "-l", acces level, */ "-p", nvram_safe_get(strcat_r(prefix, "auth_passwd", tmp)), nvram_invmatch("wan_heartbeat_x", "") ? "-s" : NULL, nvram_safe_get("wan_heartbeat_x"), NULL }; if (restart) stop_lanauth(1); /* Start lanauth */ return _eval(lanauth_argv, NULL, 0, NULL); }
void sta_start_being_ap() { PROFILES profile; pid_t pid; char *nas_cmd[]={"nas", "/tmp/nas.conf", NULL}; //printf("set as a AP"); /* Become an AP with SSID = Shared Name */ memset(&profile, 0, sizeof(profile)); profile.mode = STATION_MODE_AP; strcpy(profile.ssid, nvram_safe_get("wl0_ssid")); //printf("ssid: %s\n", profile->ssid); stainfo_g.mode = profile.mode; stainfo_g.chan = profile.chan; strncpy(stainfo_g.ssid, profile.ssid, 32); stainfo_g.rate = profile.rate; stainfo_g.wep = profile.wep; stainfo_g.wepkeylen = profile.wepkeylen; stainfo_g.wepkeyactive = profile.wepkeyactive; stainfo_g.sharedkeyauth = profile.sharedkeyauth; stainfo_g.brgmacclone = profile.brgmacclone; stainfo_g.preamble = profile.preamble; if (nvram_match("wl_wdsmode_x", "1")) nvram_set("wl0_mode", "wds"); else nvram_set("wl0_mode", "ap"); //eval("wlconf", "eth2", "up"); eval("wlconfig", "eth2"); eval("killall", "nas"); _eval(nas_cmd, NULL, 0, &pid); stop_dhcpd(); if (!is_dhcpd_exist()) { printf("start your own dhcp server\n"); start_dhcpd(); } sta_state = STA_STATE_BEING_AP; sta_status_report(sta_state, 0); }
void do_export(char *path, webs_t stream, ...) { FILE *ifp, *ofp; int c; char cfg_file[] = "/tmp/export.cfg"; char encoded_file[] = "/tmp/encoded.cfg"; char *write_argv[4]; write_argv[0] = "/usr/sbin/nvram"; write_argv[1] = "export"; write_argv[2] = cfg_file; write_argv[3] = NULL; _eval(write_argv, NULL, 10, NULL) ; if (!(ifp = fopen(cfg_file, "r"))) { return; } if (!(ofp = fopen(encoded_file, "w"))) { fclose(ifp); unlink(cfg_file); return; } /* Encode. */ /* Note: c must be an integer to compare with EOF. */ while ((c = fgetc(ifp)) != EOF) { encode((char *)&c, 1); fputc(c, ofp); } fclose(ifp); fclose(ofp); /* Export the file itself. */ do_file(encoded_file, stream, NULL); unlink(cfg_file); unlink(encoded_file); }
int start_openvpn_server(void) { int i_mode_tun; char vpns_cfg[64], vpns_scr[64]; char *server_conf = "server.conf"; char *openvpn_argv[] = { OPENVPN_EXE, "--daemon", "openvpn-srv", "--cd", SERVER_ROOT_DIR, "--config", server_conf, NULL }; sprintf(vpns_cfg, "%s/%s", SERVER_ROOT_DIR, server_conf); sprintf(vpns_scr, "%s/%s", SERVER_ROOT_DIR, SCRIPT_OVPN_SERVER); doSystem("mkdir -p -m %s %s", "755", SERVER_ROOT_DIR); doSystem("mkdir -p -m %s %s", "777", COMMON_TEMP_DIR); i_mode_tun = (nvram_get_int("vpns_ov_mode") == 1) ? 1 : 0; /* create conf file */ if (openvpn_create_server_conf(vpns_cfg, i_mode_tun)) return 1; /* create tun or tap device (and add tap to bridge) */ if (i_mode_tun) openvpn_tunif_start(IFNAME_SERVER_TUN); else openvpn_tapif_start(IFNAME_SERVER_TAP, 1); /* create script symlink */ symlink("/sbin/rc", vpns_scr); logmessage(LOGNAME, "starting %s...", SERVER_LOG_NAME); return _eval(openvpn_argv, NULL, 0, NULL); }
int start_openvpn_client(void) { int i_mode_tun; char vpnc_cfg[64], vpnc_scr[64]; char *client_conf = "client.conf"; char *openvpn_argv[] = { OPENVPN_EXE, "--daemon", "openvpn-cli", "--cd", CLIENT_ROOT_DIR, "--config", client_conf, NULL }; sprintf(vpnc_cfg, "%s/%s", CLIENT_ROOT_DIR, client_conf); sprintf(vpnc_scr, "%s/%s", CLIENT_ROOT_DIR, SCRIPT_OVPN_CLIENT); doSystem("mkdir -p -m %s %s", "755", CLIENT_ROOT_DIR); i_mode_tun = (nvram_get_int("vpnc_ov_mode") == 1) ? 1 : 0; /* create conf file */ if (openvpn_create_client_conf(vpnc_cfg, i_mode_tun)) return 1; /* create tun or tap device */ if (i_mode_tun) openvpn_tunif_start(IFNAME_CLIENT_TUN); else openvpn_tapif_start(IFNAME_CLIENT_TAP, (nvram_get_int("vpnc_ov_cnat") == 1) ? 0 : 1); /* create script symlink */ symlink("/sbin/rc", vpnc_scr); logmessage(LOGNAME, "starting %s...", CLIENT_LOG_NAME); return _eval(openvpn_argv, NULL, 0, NULL); }
void run_nvscript(const char *nv, const char *arg1, int wtime) { FILE *f; char *script; char s[256]; char *argv[3]; int pid; script = nvram_get(nv); if ((script) && (*script != 0)) { sprintf(s, "/tmp/%s.sh", nv); if ((f = fopen(s, "w")) != NULL) { fputs("#!/bin/sh\n", f); fputs(script, f); fputs("\n", f); fclose(f); chmod(s, 0700); chdir("/tmp"); argv[0] = s; argv[1] = (char *)arg1; argv[2] = NULL; if (_eval(argv, NULL, 0, &pid) != 0) { pid = -1; } else { while (wtime-- > 0) { if (kill(pid, 0) != 0) break; sleep(1); } } chdir("/"); } } }
void start_dsl() { // todo: is it necessary? init_dsl_before_start_wan(); char *argv_tp_init[] = {"tp_init", NULL}; int pid; // if setting cfg file is from annex a, annex b will has invalid values if(nvram_match("productid", "DSL-N55U-B")) { if (nvram_get_int("dslx_annex") != 0) { nvram_set_int("dslx_annex", 0); //Paul add 2012/8/22, for Annex B model should always be 0 nvram_set_int("dslx_config_num", 0); } } eval("mkdir", "/tmp/adsl"); /* Paul comment 2012/7/25, the "never overcommit" policy would cause Ralink WiFi driver kernel panic when configure DUT through external registrar. * * So let this value be the default which is 0, the kernel will estimate the amount of free memory left when userspace requests more memory. */ //system("echo 2 > /proc/sys/vm/overcommit_memory"); #ifdef RTCONFIG_DUALWAN if (get_dualwan_secondary()==WANS_DUALWAN_IF_NONE) { if (get_dualwan_primary()!=WANS_DUALWAN_IF_DSL) { // it does not need to start dsl driver when using other modes // but it still need to run tp_init to have firmware version info printf("get modem info\n"); eval("tp_init", "eth_wan_mode_only"); return; } } #endif int config_num = nvram_get_int("dslx_config_num"); _eval(argv_tp_init, NULL, 0, &pid); // IPTV if (nvram_match("x_Setting", "1") && config_num > 1) { int x; char wan_if[9]; char wan_num[2]; char buf_ip[32]; eval("brctl", "addbr", "br1"); for(x=2; x<=config_num; x++) { sprintf(wan_if, "eth2.1.%d", x); sprintf(wan_num, "%d", x); eval("vconfig", "add", "eth2.1", wan_num); eval("ifconfig", wan_if, "up"); eval("brctl", "addif", "br1", wan_if); } eval("brctl", "addif", "br1", "eth2.3"); // it needs assign a IPv4 address to enable packet forwarding pick_a_random_ipv4(buf_ip); eval("ifconfig", "br1", "up"); eval("ifconfig", "br1", buf_ip); } // auto detection if (nvram_match("x_Setting", "0") && config_num == 0) { int x; char wan_if[9]; char wan_num[2]; char country_value[8]; char cmd_buf[64]; char *argv_auto_det[] = {"auto_det", country_value, NULL}; int pid; for(x=2; x<=8; x++) { sprintf(wan_if, "eth2.1.%d", x); sprintf(wan_num, "%d", x); eval("vconfig", "add", "eth2.1", wan_num); eval("ifconfig", wan_if, "up"); } // nvram_set("dsltmp_autodet_state", "Detecting"); // call auto detection with country code get_country_code_from_rc(country_value); _eval(argv_auto_det, NULL, 0, &pid); } }
// read nvram into files void new_arpbind_start(void) { FILE *f; char *buf; char *g; char *p; char *ipaddr;//ip address char *macaddr;//mac address char *s = "/tmp/new_arpbind_start.sh"; char *argv[3]; int pid; int i; char lan[24]; const char *router_ip; int host[256]; //arpbind is enable if (!nvram_get_int("new_arpbind_enable")) return; //read arpbind_list from nvram g = buf = strdup(nvram_safe_get("new_arpbind_list")); //read arpbind_list into file if ((f = fopen(s, "w")) == NULL) return; fprintf(f, "#!/bin/sh\n" "for HOST in `awk '{if($1!=\"IP\")print $1}' /proc/net/arp`; do arp -d $HOST; done\n" ); memset(host, 0, sizeof(host)); //get network ip prefix router_ip = nvram_safe_get("lan_ipaddr"); strlcpy(lan, router_ip, sizeof(lan)); if ((p = strrchr(lan, '.')) != NULL) { host[atoi(p+1)] = 1; *p = '\0'; } while (g) { /* macaddr<ipaddr */ if ((p = strsep(&g, ">")) == NULL) break; i = vstrsep(p, "<", &macaddr, &ipaddr); fprintf(f, "arp -s %s %s\n", ipaddr, macaddr); if ((p = strrchr(ipaddr, '.')) != NULL) { *p = '\0'; if (!strcmp(ipaddr, lan)) host[atoi(p+1)] = 1; } } if (nvram_get_int("new_arpbind_only")) { for (i = 1; i < 255; i++) { if (!host[i]) { fprintf(f, "arp -s %s.%d 00:00:00:00:00:00\n", lan, i); } } } free(buf); fclose(f); chmod(s, 0700); chdir("/tmp"); argv[0] = s; argv[1] = NULL; argv[2] = NULL; if (_eval(argv, NULL, 0, &pid) != 0) { pid = -1; } else { kill(pid, 0); } chdir("/"); }
char *processPacket(int sockfd, char *pdubuf) { IBOX_COMM_PKT_HDR *phdr; IBOX_COMM_PKT_HDR_EX *phdr_ex; IBOX_COMM_PKT_RES_EX *phdr_res; PKT_GET_INFO *ginfo; PKT_GET_INFO_STA *stainfo; PKT_GET_INFO_EX1 *cmd; PKT_GET_INFO_EX1 *res; PKT_GET_INFO_SITES *res_sites; PKT_GET_INFO_PROFILE *cmd_profiles, *res_profiles; int i; phdr = (IBOX_COMM_PKT_HDR *)pdubuf; phdr_res = (IBOX_COMM_PKT_RES_EX *)pdubuf_res; //printf("Get: %x %x %x\n", phdr->ServiceID, phdr->PacketType, phdr->OpCode); if (phdr->ServiceID==NET_SERVICE_ID_IBOX_INFO && phdr->PacketType==NET_PACKET_TYPE_CMD) { if (phdr->OpCode!=NET_CMD_ID_GETINFO && phdr_res->OpCode==phdr->OpCode && phdr_res->Info==phdr->Info) { // if transaction id is equal to the transaction id of the last response message, just re-send message again; return pdubuf_res; } phdr_res->ServiceID=NET_SERVICE_ID_IBOX_INFO; phdr_res->PacketType=NET_PACKET_TYPE_RES; phdr_res->OpCode=phdr->OpCode; if (phdr->OpCode!=NET_CMD_ID_GETINFO) { phdr_ex = (IBOX_COMM_PKT_HDR_EX *)pdubuf; // Check Mac Address if (memcpy(phdr_ex->MacAddress, mac, 6)==0) { //printf("Mac Error %2x%2x%2x%2x%2x%2x\n", // (unsigned char)phdr_ex->MacAddress[0], // (unsigned char)phdr_ex->MacAddress[1], // (unsigned char)phdr_ex->MacAddress[2], // (unsigned char)phdr_ex->MacAddress[3], // (unsigned char)phdr_ex->MacAddress[4], // (unsigned char)phdr_ex->MacAddress[5] // ); return NULL; } // Check Password //if (strcmp(phdr_ex->Password, "admin")!=0) //{ // phdr_res->OpCode = phdr->OpCode | NET_RES_ERR_PASSWORD; // printf("Password Error %s\n", phdr_ex->Password); // return NULL; //} phdr_res->Info = phdr_ex->Info; memcpy(phdr_res->MacAddress, phdr_ex->MacAddress, 6); } switch(phdr->OpCode) { case NET_CMD_ID_GETINFO: ginfo=(PKT_GET_INFO *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES)); memset(ginfo, 0, sizeof(ginfo)); #ifdef PRNINFO readPrnID(ginfo->PrinterInfo); #else memset(ginfo->PrinterInfo, 0, sizeof(ginfo->PrinterInfo)); #endif strcpy(ginfo->SSID, ssid_g); strcpy(ginfo->NetMask, netmask_g); strcpy(ginfo->ProductID, productid_g); strcpy(ginfo->FirmwareVersion, firmver_g); memcpy(ginfo->MacAddress, mac, 6); #ifdef WCLIENT ginfo->OperationMode = OPERATION_MODE_WB; ginfo->Regulation = 0xff; #endif sendInfo(sockfd, pdubuf_res); return pdubuf_res; #ifdef WCLIENT case NET_CMD_ID_GETINFO_EX: cmd = (PKT_GET_INFO_EX1 *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX)); res = (PKT_GET_INFO_EX1 *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX)); stainfo = (PKT_GET_INFO_STA *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX)+sizeof(PKT_GET_INFO_EX1)); if (cmd->FieldID!=FIELD_GENERAL_CURRENT_STA) return NULL; res->FieldCount=1; res->FieldID=FIELD_GENERAL_CURRENT_STA; memcpy(stainfo, &stainfo_g, sizeof(stainfo_g)); stainfo->connectionStatus = sta_status(); //printf("GetSTA: %s\n", stainfo->ssid); sendInfo(sockfd, pdubuf_res); return pdubuf_res; case NET_CMD_ID_SETINFO: cmd=(PKT_GET_INFO_EX1 *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX)); stainfo = (PKT_GET_INFO_STA *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX)+sizeof(PKT_GET_INFO_EX1)); //printf("SSID: %s\n", stainfo->ssid); sendInfo(sockfd, pdubuf_res); return pdubuf_res; case NET_CMD_ID_GETINFO_SITES: cmd=(PKT_GET_INFO_EX1 *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX)); res_sites = (PKT_GET_INFO_SITES *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX)); sta_start_scanning(); //sta_count_reset(); sleep(2); wl_scan_results(); printf("Get INFO %d\n", sites_g_count); res_sites->Count = sites_g_count; for(i=0;i<res_sites->Count&&i<MAX_SITE_NUMBER;i++) { memcpy(&res_sites->Sites[i%8], &sites_g[i], sizeof(SITES)); if (i%8==0&&i!=0) { res_sites->Index = i/8; sendInfo(sockfd, pdubuf_res); } } if (i%8!=0) { res_sites->Index = i/8; sendInfo(sockfd, pdubuf_res); printf("Send:%d %d\n", res_sites->Index, res_sites->Count); } return pdubuf_res; case NET_CMD_ID_GETINFO_PROF: cmd_profiles = (PKT_GET_INFO_PROFILE *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX)); res_profiles = (PKT_GET_INFO_PROFILE *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX)); res_profiles->StartIndex = cmd_profiles->StartIndex; res_profiles->Count = cmd_profiles->Count; for(i=0;i<cmd_profiles->Count;i++) { memcpy(&res_profiles->p.Profiles[i], &profiles_g[cmd_profiles->StartIndex+i], sizeof(PROFILES)); } sendInfo(sockfd, pdubuf_res); return pdubuf_res; case NET_CMD_ID_SETINFO_PROF: cmd_profiles =(PKT_GET_INFO_PROFILE *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX)); res_profiles = (PKT_GET_INFO_SITES *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX)); if (cmd_profiles->Count==0) { if (cmd_profiles->StartIndex == 0xff) // Save to file { } else { scan_g_type = cmd_profiles->p.ProfileControl.ButtonType; scan_g_mode = cmd_profiles->p.ProfileControl.ButtonMode; stainfo_g.profileCount = cmd_profiles->p.ProfileControl.ProfileCount; sta_start_connecting_one(&profiles_g[cmd_profiles->StartIndex]); //printf("set: %d %d\n", cmd_profiles->StartIndex, stainfo_g.profileCount); profiles_g_count = stainfo_g.profileCount; wl_write_profile(); } } else { for(i=0;i<cmd_profiles->Count;i++) { memcpy(&profiles_g[cmd_profiles->StartIndex + i], &cmd_profiles->p.Profiles[i], sizeof(PROFILES)); } } sendInfo(sockfd, pdubuf_res); return pdubuf_res; #endif case NET_CMD_ID_MANU_CMD: { #define MAXSYSCMD 64 #define MAXPARA 6 #define SIZEOFHDR 46 #define SIZEOFRES 14 char cmdstr[MAXSYSCMD]; char *cmdargv[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL}; char *cmdptr; int cmdcnt; PKT_SYSCMD *syscmd; PKT_SYSCMD_RES *syscmd_res; FILE *fp; syscmd = (PKT_SYSCMD *)(pdubuf+SIZEOFHDR); syscmd_res = (PKT_SYSCMD_RES *)(pdubuf_res+SIZEOFRES); if (syscmd->len>=MAXSYSCMD) syscmd->len=MAXSYSCMD; syscmd->cmd[syscmd->len]=0; syscmd->len=strlen(syscmd->cmd); //printf("system cmd: %d %d %d %d %s\n", sizeof(IBOX_COMM_PKT_RES_EX), sizeof(unsigned short), sizeof(IBOX_COMM_PKT_HDR_EX) + syscmd->len, syscmd->cmd); strcpy(cmdstr, syscmd->cmd); cmdptr = cmdstr; while (strsep(&cmdptr, " ")); cmdcnt=0; /* Set token values */ for (cmdptr = cmdstr; cmdptr < &cmdstr[syscmd->len] && *cmdptr && cmdcnt<MAXPARA; cmdptr += strlen(cmdptr) + 1) { cmdargv[cmdcnt++] = cmdptr; } if (cmdcnt==0) syscmd_res->len=0; else { _eval(cmdargv, ">/tmp/syscmd.out", 0, NULL); fp = fopen("/tmp/syscmd.out", "r"); if (fp!=NULL) { syscmd_res->len = fread(syscmd_res->res, 1, sizeof(syscmd_res->res), fp); fclose(fp); } else syscmd_res->len=0; } //printf("res : %d %s\n", syscmd_res->len, syscmd_res->res); sendInfo(sockfd, pdubuf_res); return pdubuf_res; } default: return NULL; } } return NULL; }