static int usb_status() { if (usb_busy) return 0; else if (nvram_invmatch("usb_path1", "") || nvram_invmatch("usb_path2", "")) return 1; else return 0; }
int start_dhcpd(void) { FILE *fp; // char name[100]; char *lan_ifname=nvram_safe_get("lan_ifname"); dprintf("%s %s %s %s\n", nvram_safe_get("lan_ifname"), nvram_safe_get("dhcp_start"), nvram_safe_get("dhcp_end"), nvram_safe_get("lan_lease")); if (nvram_invmatch("dhcp_enable", "1")) return -1; ifconfig(lan_ifname, IFUP, nvram_safe_get("lan_ipaddr"), nvram_safe_get("lan_netmask")); /* 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")); fprintf(fp, "option lease %s\n", nvram_safe_get("lan_lease")); //snprintf(name, sizeof(name), "%s_wins", nvram_safe_get("dhcp_wins")); //if (nvram_invmatch(name, "")) // fprintf(fp, "option wins %s\n", nvram_get(name)); //snprintf(name, sizeof(name), "%s_domain", nvram_safe_get("dhcp_domain")); if (nvram_invmatch("lan_domain", "")) fprintf(fp, "option domain %s\n", nvram_safe_get("lan_domain")); fclose(fp); system("udhcpd /tmp/udhcpd.conf"); dprintf("done\n"); return 0; }
int wpacli_main(int argc, char **argv) { if (argc < 3) return EINVAL; if (!argv[1]) return EINVAL; if (nvram_invmatch("wan_auth_mode", "2")) return 0; if (strncmp(argv[2], "EAP-SUCCESS", 11) != 0) { logmessage("eapol-md5", "%s", argv[2]); } #if 0 /* disable DHCP lease force renew by issues with some ISP (lease losted after force renew) */ else if (nvram_match("wan0_proto", "dhcp")) { /* Renew DHCP lease */ system("killall -SIGUSR1 udhcpc"); } #endif return 0; }
unsigned char *get_hwaddr(char *ifname, void *buf, int size) { #ifdef USE_IFNAME struct ifreq ifr; int fd, res; int addrlen = size > ETHER_ADDR_LEN ? ETHER_ADDR_LEN : size; if ((fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) return NULL; memset(&ifr, 0, sizeof(ifr)); snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", ifname); res = ioctl(fd, SIOCGIFHWADDR, &ifr); close(fd); if (res < 0 || ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) return NULL; memmove(buf, ifr.ifr_hwaddr.sa_data, addrlen); return buf; #else if (!nvram_invmatch("et0macaddr", "")) return NULL; ether_atoe(nvram_safe_get("et0macaddr"), buf); return buf; #endif }
int DeletePortMapping( UFILE *uclient, PService psvc, PAction ac, pvar_entry_t args, int nargs) /* {"NewRemoteHost", VAR_RemoteHost, VAR_IN}, */ /* {"NewExternalPort", VAR_ExternalPort, VAR_IN}, */ /* {"NewProtocol", VAR_PortMappingProtocol, VAR_IN}, */ { int i, parse_status, status = 0; netconf_nat_t e; mapping_t mapping; // bypass port mapping when NAT is disabled if (nvram_invmatch("wan_nat_x", "1")) return 0; parse_status = (int) parse_dnat(&e, ac->params[2].value, /* NewProtocol */ ac->params[0].value, /* NewRemoteHost */ ac->params[1].value, NULL, /* NewExternalPort */ NULL, /* NewInternalClient */ NULL, NULL /* NewInternalPort */ ); if (!parse_status) { status = SOAP_INVALID_ARGS; } else { status = SOAP_NOSUCHENTRYINARRAY; for (i = 0; mapmgr_get_port_map(i, &mapping); i++) { if (SameMatchInfo(&e, (netconf_nat_t*)&mapping)) { mapmgr_delete_port_map(i); status = 0; /* SUCCESS! */ } } } if (status) soap_error( uclient, status ); return (status == 0); }
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); }
int start_shorewall(void) { if (!nvram_invmatch("shorewall_enable", "0")) return 0; stop_firewall(); stop_shorewall(); mkdir("/var/shorewall", 0700); nvram2file("sh_interfaces", "/var/shorewall/interfaces"); nvram2file("sh_masq", "/var/shorewall/masq"); nvram2file("sh_policy", "/var/shorewall/policy"); nvram2file("sh_routestopped", "/var/shorewall/route_stopped"); nvram2file("sh_rules", "/var/shorewall/rules"); nvram2file("sh_zones", "/var/shorewall/zones"); symlink("/usr/sbin/shorewall", "/var/shorewall/shorewall"); symlink("/usr/sbin/shorewall.conf", "/var/shorewall/shorewall.conf"); symlink("/usr/sbin/firewall", "/var/shorewall/firewall"); symlink("/usr/sbin/functions", "/var/shorewall/functions"); symlink("/usr/sbin/common.def", "/var/shorewall/common.def"); symlink("/usr/sbin/version", "/var/shorewall/version"); system("/var/shorewall/shorewall start"); return 0; }
/* update current status of printer */ void sig_usr1(int sig) { char prninfo[256]/*, status[32]*/; int isUsb; //fp=fopen("/etc/linuxigd/printer.log","w"); memset( prninfo , 0 , sizeof(prninfo) ); if (check_par_usb_prn() == TRUE) //uese USB when return TRUE { //fputs( "INTERFACE=USB\n" , fp ); nvram_set("printer_ifname", "usb"); readUsbPrnID(prninfo); isUsb = 1; } else { // Goto this step, then printer must be turn on //fputs( "INTERFACE=PAR\n" , fp ); nvram_set("printer_ifname", "par"); readParPrnID(prninfo); isUsb = 0; } if (strcmp(prninfo, " ")==0 || strlen(prninfo)==0) { //fprintf(fp, "MODEL=\"\"\n"); nvram_set("printer_model_t", ""); if (!isUsb) { /* Retry, only when paraport is plugged and no device id is returned */ printf("Try again 2 seconds later\n"); g_retry++; if (g_retry<MAX_GETID_RETRY) alarm(6); else g_retry = 0; } } else { //fprintf(fp, "MODEL=\"%s\"\n", prninfo); nvram_set("printer_model_t", prninfo); } /* update status of printer */ if (nvram_invmatch("printer_model_t", "")) { readPrnStatus(); } else { nvram_set("printer_status_t", ""); nvram_set("printer_user_t", ""); } // PRINT("Enter sig_usr1\n"); // nosiy... }
static void inet_handler(void) { if (nvram_match("wan_route_x", "IP_Routed")) { if (nvram_invmatch("wan_gateway_t", "") && has_wan_ip(0)) { /* sync time to ntp server if necessary */ ntpc_handler(); } } else { if (nvram_invmatch("lan_gateway_t", "")) ntpc_handler(); } }
int start_infosvr(void) { if (nvram_invmatch("adsc_enable", "1")) return 1; return eval("/usr/sbin/infosvr", IFNAME_BR); }
int start_lltd(void) { if (nvram_invmatch("lltd_enable", "1")) return 1; return eval("/bin/lld2d", IFNAME_BR); }
int start_rstats(void) { if (nvram_invmatch("rstats_enable", "1")) return 1; return eval("/sbin/rstats"); }
void ej_show_wan_domain(webs_t wp, int argc, char_t ** argv) { if (nvram_invmatch("wan_domain", "")) tf_webWriteESCNV(wp, "wan_domain"); else tf_webWriteESCNV(wp, "wan_get_domain"); return; }
void reload_nfsd(void) { if (nvram_invmatch("nfsd_enable", "1")) return; write_nfsd_exports(); eval("/usr/bin/nfsd.sh", "reload"); }
void run_nfsd(void) { if (nvram_invmatch("nfsd_enable", "1")) return; // always update nfsd exports write_nfsd_exports(); eval("/usr/bin/nfsd.sh", "start"); }
static int check_usb2() { if (usb_busy) return 0; else if ((model==MODEL_RTAC56U||model==MODEL_RTAC68U) && nvram_invmatch("usb_path2", "")) return 1; else return 0; }
void wan6_up(char *wan_ifname) { int ipv6_type, start_radvd_now; char *wan_addr6, *wan_gate6, *wan_addr4; ipv6_type = get_ipv6_type(); if (ipv6_type == IPV6_DISABLED) return; stop_dhcp6c(); build_dns6_var(); control_if_ipv6_dad(IFNAME_BR, 1); start_radvd_now = 1; if (ipv6_type == IPV6_6IN4 || ipv6_type == IPV6_6TO4 || ipv6_type == IPV6_6RD) { wan_addr4 = nvram_safe_get("wan0_ipaddr"); wan_addr6 = nvram_safe_get("wan0_addr6"); start_sit_tunnel(ipv6_type, wan_addr4, wan_addr6); } else { control_if_ipv6_dad(wan_ifname, 1); if (ipv6_type == IPV6_NATIVE_STATIC) { wan_addr6 = nvram_safe_get("wan0_addr6"); wan_gate6 = nvram_safe_get("wan0_gate6"); control_if_ipv6_radv(wan_ifname, 0); clear_if_addr6(wan_ifname); if (*wan_addr6) doSystem("ip -6 addr add %s dev %s", wan_addr6, wan_ifname); if (*wan_gate6) { doSystem("ip -6 route add %s dev %s", wan_gate6, wan_ifname); doSystem("ip -6 route add default via %s metric %d", wan_gate6, 1); } } else { doSystem("ip -6 route add default dev %s metric %d", wan_ifname, 2048); control_if_ipv6_autoconf(wan_ifname, nvram_invmatch("ip6_wan_dhcp", "1")); control_if_ipv6_radv(wan_ifname, 1); /* wait for interface ready */ sleep(2); start_dhcp6c(wan_ifname); if (nvram_match("ip6_lan_auto", "1")) start_radvd_now = 0; } } if (start_radvd_now) reload_radvd(); }
int is_lan_radv_on(void) { int ipv6_type = get_ipv6_type(); if (ipv6_type == IPV6_DISABLED) return -1; if (nvram_invmatch("ip6_lan_radv", "0")) return 1; return 0; }
static int check_usb3() { if (usb_busy) return 0; #ifndef RTCONFIG_BCMARM else if (nvram_match("usb_path1_host", "3") || nvram_match("usb_path2_host", "3")) #else else if ((model==MODEL_RTAC56U||model==MODEL_RTAC68U) && nvram_invmatch("usb_path1", "")) #endif return 1; else return 0; }
void reload_vpn_server(void) { int i_type; if (nvram_invmatch("vpns_enable", "1") || get_ap_mode()) return; i_type = nvram_get_int("vpns_type"); #if defined(APP_OPENVPN) if (i_type != 2) #endif create_vpns_pppd_options(i_type); }
void start_privoxy(void) { if (!nvram_match("privoxy_enable", "1")) return; int mode = 0; char *ip = nvram_safe_get("lan_ipaddr"); sysprintf("grep -q nobody /etc/passwd || echo \"nobody:*:65534:65534:nobody:/var:/bin/false\" >> /etc/passwd"); mkdir("/var/log/privoxy", 0777); char *wan = get_wan_ipaddr(); if (nvram_match("privoxy_transp_enable", "1")) { sysprintf("iptables -t nat -D PREROUTING -p tcp -d ! %s --dport 80 -j REDIRECT --to-port 8118", wan); sysprintf("iptables -t nat -I PREROUTING -p tcp -d ! %s --dport 80 -j REDIRECT --to-port 8118", wan); mode = 1; } FILE *fp = fopen("/tmp/privoxy.conf", "wb"); if (nvram_match("privoxy_advanced", "1") && nvram_invmatch("privoxy_conf", "")) { fprintf(fp, "%s", nvram_safe_get("privoxy_conf")); } else { fprintf(fp, "confdir /etc/privoxy\n" "logdir /var/log/privoxy\n" "actionsfile match-all.action\n" "actionsfile default.action\n" "actionsfile user.action\n" "filterfile default.filter\n" "logfile logfile\n" "listen-address %s:8118\n" "toggle 1\n" "enable-remote-toggle 0\n" "enable-remote-http-toggle 0\n" "enable-edit-actions 0\n" "buffer-limit 4096\n" "accept-intercepted-requests %d\n" "split-large-forms 0\n" "keep-alive-timeout 5\n" "socket-timeout 300\n" "max-client-connections 64\n" "handle-as-empty-doc-returns-ok 1\n", ip, mode); } fclose(fp); eval("privoxy", "/tmp/privoxy.conf"); syslog(LOG_INFO, "Privoxy : privoxy started\n"); return; }
/* * Called when link comes up */ int ipup_main(int argc, char **argv) { FILE *fp; char *wan_ifname; char *value; char buf[256]; char tmp[100], prefix[WAN_PREFIX_SZ]; if (ppp_prefix(&wan_ifname, prefix) < 0) return -1; umask(022); /* Touch connection file */ if (!(fp = fopen(strcat_r("/tmp/ppp/link.", wan_ifname, tmp), "a"))) { perror(tmp); return errno; } fclose(fp); if ((value = getenv("IPLOCAL"))) { if (nvram_invmatch(strcat_r(prefix, "ipaddr", tmp), value)) ifconfig(wan_ifname, IFUP, "0.0.0.0", NULL); _ifconfig(wan_ifname, IFUP, value, "255.255.255.255", getenv("IPREMOTE")); nvram_set(strcat_r(prefix, "ipaddr", tmp), value); nvram_set(strcat_r(prefix, "netmask", tmp), "255.255.255.255"); } if ((value = getenv("IPREMOTE"))) nvram_set(strcat_r(prefix, "gateway", tmp), value); strcpy(buf, ""); if (getenv("DNS1")) sprintf(buf, "%s", getenv("DNS1")); if (getenv("DNS2")) sprintf(buf + strlen(buf), "%s%s", strlen(buf) ? " " : "", getenv("DNS2")); nvram_set(strcat_r(prefix, "dns", tmp), buf); wan_up(wan_ifname); logmessage(nvram_safe_get("wan_proto_t"), "connected to ISP"); wanmessage(""); dprintf("done\n"); return 0; }
void start_sshd(void) { int dirty = 0; 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"); dirty |= check_host_key("ecdsa", "sshd_hostkey", "/etc/dropbear/dropbear_ecdsa_host_key"); if (dirty) nvram_commit_x(); /* xstart("dropbear", "-a", "-p", nvram_safe_get("sshd_port"), nvram_get_int("sshd_pass") ? "" : "-s"); */ char *argv[11]; int argc; char *p; argv[0] = "dropbear"; argv[1] = "-p"; argv[2] = nvram_safe_get("sshd_port"); argc = 3; if (nvram_get_int("sshd_remote") && nvram_invmatch("sshd_rport", nvram_safe_get("sshd_port"))) { argv[argc++] = "-p"; argv[argc++] = nvram_safe_get("sshd_rport"); } 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); }
void start_syslog(void) { int ret1 = 0, ret2 = 0; if (!nvram_invmatch("syslogd_enable", "0")) return; if (strlen(nvram_safe_get("syslogd_rem_ip")) > 0) ret1 = eval("syslogd", "-L", "-R", nvram_safe_get("syslogd_rem_ip")); else ret1 = eval("syslogd", "-L"); dd_syslog(LOG_INFO, "syslogd : syslog daemon successfully started\n"); ret2 = eval("klogd"); dd_syslog(LOG_INFO, "klogd : klog daemon successfully started\n"); return; }
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 start_snmp(void) { int ret = 0; pid_t pid; char *snmpd_argv[] = { "snmpd", "-c", SNMP_CONF_FILE, NULL }; FILE *fp = NULL; stop_snmp(); if (!nvram_invmatch("snmpd_enable", "0")) return; fp = fopen(SNMP_CONF_FILE, "w"); if (NULL == fp) return; if (strlen(nvram_safe_get("snmpd_syslocation")) > 0) fprintf(fp, "syslocation %s\n", nvram_safe_get("snmpd_syslocation")); if (strlen(nvram_safe_get("snmpd_syscontact")) > 0) fprintf(fp, "syscontact %s\n", nvram_safe_get("snmpd_syscontact")); if (strlen(nvram_safe_get("snmpd_sysname")) > 0) fprintf(fp, "sysname %s\n", nvram_safe_get("snmpd_sysname")); if (strlen(nvram_safe_get("snmpd_rocommunity")) > 0) fprintf(fp, "rocommunity %s\n", nvram_safe_get("snmpd_rocommunity")); if (strlen(nvram_safe_get("snmpd_rwcommunity")) > 0) fprintf(fp, "rwcommunity %s\n", nvram_safe_get("snmpd_rwcommunity")); fprintf(fp, "sysservices 9\n"); fprintf(fp, "pass_persist .1.3.6.1.4.1.2021.255 /etc/wl_snmpd.sh\n"); fclose(fp); ret = _evalpid(snmpd_argv, NULL, 0, &pid); cprintf("done\n"); dd_syslog(LOG_INFO, "snmpd : SNMP daemon successfully started\n"); return; }
void aoss_save(webs_t wp) { char buf[32]; nvram_set("aoss_enable", websGetVar(wp, "aoss_enable", "0")); nvram_set("aoss_aes", websGetVar(wp, "aoss_aes", "0")); nvram_set("aoss_tkip", websGetVar(wp, "aoss_tkip", "0")); nvram_set("aoss_wep", websGetVar(wp, "aoss_wep", "0")); #ifdef HAVE_WPS nvram_set("wps_enabled", websGetVar(wp, "wps_enabled", "0")); char *pin = websGetVar(wp, "wps_ap_pin", NULL); if (pin) nvram_set("pincode", pin); #endif // check if at least one value was set if (nvram_match("aoss_aes", "0") && nvram_match("aoss_tkip", "0") && nvram_match("aoss_wep", "0")) { nvram_set("aoss_aes", "1"); } if (strlen(nvram_safe_get("aoss_vifs"))) { nvram_unset("ath0_vifs"); nvram_unset("aoss_vifs"); nvram_commit(); } if (strlen(nvram_safe_get("aossa_vifs"))) { nvram_unset("ath1_vifs"); nvram_unset("aossa_vifs"); nvram_commit(); } char *registrar = websGetVar(wp, "wps_registrar", NULL); if (registrar && nvram_invmatch("wps_registrar", registrar)) { nvram_set("wps_registrar", registrar); addAction("wireless"); nvram_set("nowebaction", "1"); service_restart(); } // all other vars //validate_cgi(wp); }
void stop_openvpn_wandone(void) { if (nvram_invmatch("openvpncl_enable", "1")) return; if (stop_process("openvpn", "OpenVPN daemon (Client)")) { if (nvram_match("wshaper_enable", "1")) { stop_wshaper(); start_wshaper(); } //remove ebtables rules on shutdown system("/usr/sbin/ebtables -t nat -D POSTROUTING -o tap1 --pkttype-type multicast -j DROP"); unlink("/tmp/openvpncl/ca.crt"); unlink("/tmp/openvpncl/client.crt"); unlink("/tmp/openvpncl/client.key"); unlink("/tmp/openvpncl/ta.key"); unlink("/tmp/openvpncl/cert.p12"); unlink("/tmp/openvpncl/static.key"); unlink("/tmp/openvpncl/openvpncl.conf"); unlink("/tmp/openvpncl/route-up.sh"); unlink("/tmp/openvpncl/route-down.sh"); } }
int control_static_routes(char *ift, char *ifname, int is_add) { char word[128], *next; char *route_buf; char *ipaddr, *netmask, *gateway, *metric; if (is_add && nvram_invmatch("sr_enable_x", "1")) return 0; route_buf = (char *)malloc(SR_BUF_LEN*sizeof(char)); if (!route_buf) return -1; fill_static_routes(route_buf, SR_BUF_LEN, ift); foreach(word, route_buf, next) { netmask = word; ipaddr = strsep(&netmask, ":"); if (!ipaddr || !netmask) continue; gateway = netmask; netmask = strsep(&gateway, ":"); if (!netmask || !gateway) continue; metric = gateway; gateway = strsep(&metric, ":"); if (!gateway || !metric) continue; if (!is_valid_ipv4(gateway)) gateway = nvram_safe_get("wanx_gateway"); // oleg patch if (is_add) route_add(ifname, atoi(metric), ipaddr, gateway, netmask); else route_del(ifname, atoi(metric), ipaddr, gateway, netmask); }
void sta_info_init(void) { int i; stainfo_g.mode = STATION_MODE_INFRA; stainfo_g.chan = 1; strcpy(stainfo_g.ssid, "WirelessHD"); stainfo_g.rate = 0; stainfo_g.wep = 0; stainfo_g.wepkeylen = 0; stainfo_g.wepkeyactive = 0; stainfo_g.sharedkeyauth = 0; stainfo_g.brgmacclone = 0; stainfo_g.preamble = 0; stainfo_g.profileCount = 0; // initial sites info wl_read_profile(); stainfo_g.profileCount = profiles_g_count; /* Check if client mode is disabled */ if (nvram_invmatch("wlp_clientmode_x", "0") && profiles_g_count!=0) { //int pref = atoi(nvram_safe_get("wlp_pref_x")); //if (pref < profiles_g_count) // sta_start_connecting_one(&profiles_g[pref]); //else sta_start_connecting_profile(0); if (nvram_match("wlp_clientmode_x", "2")) nvram_set("wl0_mode", "wet"); else nvram_set("wl0_mode", "sta"); eval("wlconfig", "eth2"); sta_start_scanning_profile(0); } else if (nvram_match("wlp_beap_x", "1")) sta_start_being_ap(); else sta_stop(); }