void start_usb_apps(void) { int need_restart_fw = 0; #if defined(APP_FTPD) run_ftp(); if (nvram_match("ftpd_wopen", "1")) need_restart_fw |= is_ftp_run(); #endif #if defined(APP_SMBD) run_samba(); #endif #if defined(APP_NFSD) run_nfsd(); #endif #if defined(APP_MINIDLNA) run_dms(0); #endif #if defined(APP_FIREFLY) run_itunes(); #endif #if defined(APP_TRMD) run_torrent(); need_restart_fw |= is_torrent_run(); #endif #if defined(APP_ARIA) run_aria(); need_restart_fw |= is_aria_run(); #endif if (need_restart_fw && nvram_match("fw_enable_x", "1")) restart_firewall(); }
void restart_aria(void) { int is_run_before = is_aria_run(); int is_run_after; stop_aria(); if (count_sddev_mountpoint()) run_aria(); is_run_after = is_aria_run(); if ((is_run_after != is_run_before) && nvram_match("fw_enable_x", "1")) restart_firewall(); }
void restart_sshd(void) { int is_run_before = is_sshd_run(); int is_run_after; stop_sshd(); start_sshd(); is_run_after = is_sshd_run(); if ((is_run_after != is_run_before) && nvram_match("sshd_wopen", "1") && nvram_match("fw_enable_x", "1")) restart_firewall(); }
void restart_vpn_server(void) { xl2tpd_killed_vpns = 0; stop_vpn_server(); start_vpn_server(); restart_firewall(); #if defined(APP_NFSD) reload_nfsd(); #endif /* restore L2TP WAN client or L2TP VPNC */ if (xl2tpd_killed_vpns && (nvram_match("l2tp_wan_t", "1") || nvram_match("l2tp_cli_t", "1"))) safe_start_xl2tpd(); }
void full_restart_ipv6(int ipv6_type_old) { int ipv6_type = get_ipv6_type(); int ipv6_toggled = ((ipv6_type == IPV6_DISABLED || ipv6_type_old == IPV6_DISABLED) && (ipv6_type != ipv6_type_old)) ? 1 : 0; if (ipv6_toggled) { stop_lltd(); stop_httpd(); } stop_upnp(); stop_dhcp6c(); stop_dns_dhcpd(); if (ipv6_type == IPV6_DISABLED) { clear_all_route6(); clear_all_addr6(); clear_if_neigh6(IFNAME_BR); stop_sit_tunnel(); reset_lan6_vars(); reset_wan6_vars(); control_if_ipv6_all(0); set_libc_gai(1); update_resolvconf(0, 1); reload_nat_modules(); restart_firewall(); start_dns_dhcpd(0); } else { set_libc_gai(0); control_if_ipv6_all(1); clear_all_addr6(); reset_lan6_vars(); reload_lan_addr6(); full_restart_wan(); if (!is_dns_dhcpd_run()) start_dns_dhcpd(0); } if (ipv6_toggled) { start_httpd(0); start_lltd(); } }
void restart_vpn_client(void) { xl2tpd_killed_vpnc = 0; stop_vpn_client_force(); stop_vpn_client(); restore_dns_from_vpnc(); sleep(1); start_vpn_client(); restart_firewall(); /* restore L2TP WAN client or L2TP VPNS */ if (xl2tpd_killed_vpnc && (nvram_match("l2tp_wan_t", "1") || nvram_match("l2tp_srv_t", "1"))) safe_start_xl2tpd(); }
void handle_notifications(void) { int i, stop_handle = 0; char notify_name[256]; DIR *directory = opendir(DIR_RC_NOTIFY); if (!directory) return; // handle max 10 requests at once (prevent deadlock) for (i=0; i < 10; i++) { struct dirent *entry; FILE *test_fp; entry = readdir(directory); if (!entry) break; if (strcmp(entry->d_name, ".") == 0) continue; if (strcmp(entry->d_name, "..") == 0) continue; /* Remove the marker file. */ snprintf(notify_name, sizeof(notify_name), "%s/%s", DIR_RC_NOTIFY, entry->d_name); remove(notify_name); printf("rc notification: %s\n", entry->d_name); /* Take the appropriate action. */ if (!strcmp(entry->d_name, RCN_RESTART_REBOOT)) { stop_handle = 1; sys_exit(); } else if (!strcmp(entry->d_name, "flash_firmware")) { stop_handle = 1; flash_firmware(); } #if defined (USE_IPV6) else if (!strcmp(entry->d_name, RCN_RESTART_IPV6)) { if (!get_ap_mode()) { full_restart_ipv6(nvram_ipv6_type); nvram_ipv6_type = get_ipv6_type(); } } else if (strcmp(entry->d_name, RCN_RESTART_RADVD) == 0) { restart_dhcpd(); restart_radvd(); } #endif else if (!strcmp(entry->d_name, RCN_RESTART_WAN)) { full_restart_wan(); } else if (!strcmp(entry->d_name, RCN_RESTART_LAN)) { full_restart_lan(); } else if (!strcmp(entry->d_name, "stop_whole_wan")) { stop_wan(); } else if (!strcmp(entry->d_name, RCN_RESTART_IPTV)) { int is_ap_mode = get_ap_mode(); restart_iptv(is_ap_mode); if (!is_ap_mode) restart_firewall(); } else if(!strcmp(entry->d_name, "deferred_wan_connect")) { deferred_wan_connect(); } else if(!strcmp(entry->d_name, "auto_wan_reconnect")) { auto_wan_reconnect(); } else if(!strcmp(entry->d_name, "auto_wan_reconnect_pause")) { auto_wan_reconnect_pause(); } else if(!strcmp(entry->d_name, "manual_wan_reconnect")) { manual_wan_reconnect(); } else if(!strcmp(entry->d_name, "manual_wan_disconnect")) { manual_wan_disconnect(); } else if(!strcmp(entry->d_name, "manual_ddns_hostname_check")) { manual_ddns_hostname_check(); } #if (BOARD_NUM_USB_PORTS > 0) else if (!strcmp(entry->d_name, RCN_RESTART_MODEM)) { int wan_stopped = 0; int modules_reloaded = 0; int need_restart_wan = get_usb_modem_wan(0); int modem_rule = nvram_get_int("modem_rule"); int modem_type = nvram_get_int("modem_type"); if (nvram_modem_rule != modem_rule) { nvram_modem_rule = modem_rule; if (need_restart_wan) { wan_stopped = 1; stop_wan(); } if (modem_rule > 0) { modules_reloaded = 1; reload_modem_modules(modem_type, 1); } else { unload_modem_modules(); } } if (nvram_modem_type != modem_type) { if (nvram_modem_type == 3 || modem_type == 3) { if (modem_rule > 0 && !modules_reloaded) { if (need_restart_wan && !wan_stopped) stop_wan(); reload_modem_modules(modem_type, 1); } } nvram_modem_type = modem_type; } if (need_restart_wan) full_restart_wan(); } else if (strcmp(entry->d_name, RCN_RESTART_SPOOLER) == 0) { restart_usb_printer_spoolers(); } else if (strcmp(entry->d_name, RCN_RESTART_HDDTUNE) == 0) { system("/sbin/hddtune.sh"); set_pagecache_reclaim(); } #if defined(APP_FTPD) else if (strcmp(entry->d_name, RCN_RESTART_FTPD) == 0) { restart_ftpd(); } #endif #if defined(APP_SMBD) else if (strcmp(entry->d_name, RCN_RESTART_SMBD) == 0) { restart_smbd(); } #endif #if defined(APP_NFSD) else if (strcmp(entry->d_name, RCN_RESTART_NFSD) == 0) { restart_nfsd(); } #endif #if defined(APP_MINIDLNA) else if (strcmp(entry->d_name, "restart_dms_rescan") == 0) { restart_dms(1); } else if (strcmp(entry->d_name, RCN_RESTART_DMS) == 0) { restart_dms(0); } #endif #if defined(APP_FIREFLY) else if (strcmp(entry->d_name, RCN_RESTART_ITUNES) == 0) { restart_itunes(); } #endif #if defined(APP_TRMD) else if (strcmp(entry->d_name, RCN_RESTART_TRMD) == 0) { restart_torrent(); } #endif #if defined(APP_ARIA) else if (strcmp(entry->d_name, RCN_RESTART_ARIA) == 0) { restart_aria(); } #endif else if (!strcmp(entry->d_name, "on_hotplug_usb_storage")) { // deferred run usb apps nvram_set_int_temp("usb_hotplug_ms", 1); alarm(5); } else if (!strcmp(entry->d_name, "on_unplug_usb_storage")) { umount_ejected(); } else if (!strcmp(entry->d_name, "on_hotplug_usb_printer")) { // deferred run usb printer daemons nvram_set_int_temp("usb_hotplug_lp", 1); alarm(5); } else if (!strcmp(entry->d_name, "on_unplug_usb_printer")) { // deferred stop usb printer daemons nvram_set_int_temp("usb_unplug_lp", 1); alarm(5); } else if (!strcmp(entry->d_name, "on_hotplug_usb_modem")) { // deferred run usb modem to wan nvram_set_int_temp("usb_hotplug_md", 1); alarm(5); } else if (!strcmp(entry->d_name, "on_unplug_usb_modem")) { // deferred restart wan nvram_set_int_temp("usb_unplug_md", 1); alarm(5); } #endif else if (strcmp(entry->d_name, RCN_RESTART_HTTPD) == 0) { restart_httpd(); } else if (strcmp(entry->d_name, RCN_RESTART_TELNETD) == 0) { stop_telnetd(); start_telnetd(); } #if defined(APP_SSHD) else if (strcmp(entry->d_name, RCN_RESTART_SSHD) == 0) { restart_sshd(); } #endif #if defined(APP_SMBD) || defined(APP_NMBD) else if (strcmp(entry->d_name, RCN_RESTART_NMBD) == 0) { restart_nmbd(); } else if (strcmp(entry->d_name, RCN_RESTART_WINS) == 0) { restart_nmbd(); restart_dhcpd(); reload_vpn_server(); } #endif else if (strcmp(entry->d_name, RCN_RESTART_LLTD) == 0) { restart_lltd(); } else if (strcmp(entry->d_name, RCN_RESTART_ADSC) == 0) { restart_infosvr(); } else if (strcmp(entry->d_name, RCN_RESTART_VPNSVR) == 0) { restart_vpn_server(); } else if (strcmp(entry->d_name, RCN_RESTART_VPNCLI) == 0) { restart_vpn_client(); } else if (strcmp(entry->d_name, "start_vpn_client") == 0) { start_vpn_client(); } else if (strcmp(entry->d_name, "stop_vpn_client") == 0) { stop_vpn_client(); } else if (strcmp(entry->d_name, RCN_RESTART_DDNS) == 0) { stop_ddns(); start_ddns(1); } else if (strcmp(entry->d_name, RCN_RESTART_DI) == 0) { if (get_ap_mode() || has_wan_ip4(0)) notify_run_detect_internet(2); } else if (strcmp(entry->d_name, RCN_RESTART_DHCPD) == 0) { if (get_ap_mode()) update_hosts_ap(); restart_dhcpd(); } else if (strcmp(entry->d_name, RCN_RESTART_UPNP) == 0) { restart_upnp(); } else if (strcmp(entry->d_name, RCN_RESTART_SWITCH_CFG) == 0) { config_bridge(get_ap_mode()); switch_config_base(); switch_config_storm(); switch_config_link(); } else if (strcmp(entry->d_name, RCN_RESTART_SWITCH_VLAN) == 0) { notify_reset_detect_link(); switch_config_vlan(0); } else if (strcmp(entry->d_name, RCN_RESTART_SYSLOG) == 0) { stop_logger(); start_logger(0); } else if (strcmp(entry->d_name, RCN_RESTART_WDG) == 0) { restart_watchdog_cpu(); } else if (strcmp(entry->d_name, RCN_RESTART_TWEAKS) == 0) { notify_leds_detect_link(); } else if (strcmp(entry->d_name, "restart_firewall_wan") == 0) { restart_firewall(); } else if (strcmp(entry->d_name, RCN_RESTART_FIREWALL) == 0) { reload_nat_modules(); restart_firewall(); } else if (strcmp(entry->d_name, RCN_RESTART_NTPC) == 0) { notify_watchdog_time(); } else if (strcmp(entry->d_name, RCN_RESTART_TIME) == 0) { stop_logger(); set_timezone(); notify_watchdog_time(); notify_rstats_time(); start_logger(0); } else if (strcmp(entry->d_name, RCN_RESTART_SYSCTL) == 0) { int nf_nat_type = nvram_get_int("nf_nat_type"); restart_all_sysctl(); /* flush conntrack after NAT model changing */ if (nvram_nf_nat_type != nf_nat_type) { nvram_nf_nat_type = nf_nat_type; flush_conntrack_table(NULL); } } else if (!strcmp(entry->d_name, RCN_RESTART_WIFI5)) { int radio_on = get_enabled_radio_wl(); if (radio_on) radio_on = is_radio_allowed_wl(); restart_wifi_wl(radio_on, 1); } else if (!strcmp(entry->d_name, RCN_RESTART_WIFI2)) { int radio_on = get_enabled_radio_rt(); if (radio_on) radio_on = is_radio_allowed_rt(); restart_wifi_rt(radio_on, 1); } else if (!strcmp(entry->d_name, "control_wifi_guest_wl")) { int guest_on = is_guest_allowed_wl(); control_guest_wl(guest_on, 1); } else if (!strcmp(entry->d_name, "control_wifi_guest_rt")) { int guest_on = is_guest_allowed_rt(); control_guest_rt(guest_on, 1); } else if (!strcmp(entry->d_name, "control_wifi_guest_wl_on")) { control_guest_wl(1, 0); } else if (!strcmp(entry->d_name, "control_wifi_guest_wl_off")) { control_guest_wl(0, 0); } else if (!strcmp(entry->d_name, "control_wifi_guest_rt_on")) { control_guest_rt(1, 0); } else if (!strcmp(entry->d_name, "control_wifi_guest_rt_off")) { control_guest_rt(0, 0); } else if (!strcmp(entry->d_name, "control_wifi_radio_wl")) { int radio_on = get_enabled_radio_wl(); if (radio_on) radio_on = is_radio_allowed_wl(); control_radio_wl(radio_on, 1); } else if (!strcmp(entry->d_name, "control_wifi_radio_rt")) { int radio_on = get_enabled_radio_rt(); if (radio_on) radio_on = is_radio_allowed_rt(); control_radio_rt(radio_on, 1); } else if (!strcmp(entry->d_name, "control_wifi_radio_wl_on")) { control_radio_wl(1, 0); } else if (!strcmp(entry->d_name, "control_wifi_radio_wl_off")) { control_radio_wl(0, 0); } else if (!strcmp(entry->d_name, "control_wifi_radio_rt_on")) { control_radio_rt(1, 0); } else if (!strcmp(entry->d_name, "control_wifi_radio_rt_off")) { control_radio_rt(0, 0); } else if (!strcmp(entry->d_name, "control_wifi_config_wl")) { gen_ralink_config_5g(0); } else if (!strcmp(entry->d_name, "control_wifi_config_rt")) { gen_ralink_config_2g(0); } else { dbg("WARNING: rc notified of unrecognized event `%s'.\n", entry->d_name); } /* * If there hasn't been another request for the same event made since * we started, we can safely remove the ``action incomplete'' marker. * Otherwise, we leave the marker because we'll go through here again * for this even and mark it complete only after we've completed it * without getting another request for the same event while handling * it. */ test_fp = fopen(notify_name, "r"); if (test_fp != NULL) { fclose(test_fp); } else { /* Remove the marker file. */ snprintf(notify_name, sizeof(notify_name), "%s/%s", DIR_RC_INCOMPLETE, entry->d_name); remove(notify_name); } if (stop_handle) break; } closedir(directory); }
int main(int argc, char **argv) { int ret; char *base = strrchr(argv[0], '/'); const applet_rc_t *app; base = base ? base + 1 : argv[0]; /* init */ if (!strcmp(base, "init")) { if (getpid() != 1 ) { dbg("error: %s must be run as PID 1!\n", base); return -1; } init_main_loop(); return 0; } /* stub for early kernel hotplug */ if (!strcmp(base, "hotplug")) { return 0; } if (!strcmp(base, "reboot")) { return sys_exit(); } if (!strcmp(base, "shutdown") || !strcmp(base, "halt")) { return sys_stop(); } if (!strcmp(base, "rc")) { dbg("error: cannot run rc directly!\n"); return EINVAL; } /* Set TZ for all rc programs */ setenv_tz(); /* Start applets */ for (app = applets_rc; app->name; app++) { if (strcmp(base, app->name) == 0) return app->main(argc, argv); } ret = 0; if (!strcmp(base, "reset_to_defaults")) { erase_nvram(); sys_exit(); } else if (!strcmp(base, "run_ftpsamba")) { #if defined(APP_SMBD) restart_smbd(); #else ; #endif #if defined(APP_FTPD) restart_ftpd(); #endif } #if defined(APP_SMBD) else if (!strcmp(base, "run_samba")) { restart_smbd(); } #endif #if defined(APP_FTPD) else if (!strcmp(base, "run_ftp")) { restart_ftpd(); } #endif #if defined(APP_NFSD) else if (!strcmp(base, "run_nfsd")) { run_nfsd(); } #endif #if defined(APP_MINIDLNA) else if (!strcmp(base, "run_minidlna")) { restart_dms(0); } #endif #if defined(APP_FIREFLY) else if (!strcmp(base, "run_firefly")) { restart_itunes(); } #endif #if defined(APP_TRMD) else if (!strcmp(base, "run_transmission")) { restart_torrent(); } #endif #if defined(APP_ARIA) else if (!strcmp(base, "run_aria")) { restart_aria(); } #endif #if defined(APP_FTPD) else if (!strcmp(base, "stop_ftp")) { stop_ftp(); } #endif #if defined(APP_SMBD) else if (!strcmp(base, "stop_samba")) { stop_samba(0); } #endif else if (!strcmp(base, "stop_ftpsamba")) { #if defined(APP_FTPD) stop_ftp(); #endif #if defined(APP_SMBD) stop_samba(0); #else ; #endif } #if defined(APP_NFSD) else if (!strcmp(base, "stop_nfsd")) { stop_nfsd(); } #endif #if defined(APP_MINIDLNA) else if (!strcmp(base, "stop_minidlna")) { stop_dms(); } #endif #if defined(APP_FIREFLY) else if (!strcmp(base, "stop_firefly")) { stop_itunes(); } #endif #if defined(APP_TRMD) else if (!strcmp(base, "stop_transmission")) { stop_torrent(); } #endif #if defined(APP_ARIA) else if (!strcmp(base, "stop_aria")) { stop_aria(); } #endif else if (!strcmp(base, "start_ddns")) { start_ddns(1); } else if (!strcmp(base, "stop_wan")) { notify_rc("manual_wan_disconnect"); } else if (!strcmp(base, "restart_wan")) { notify_rc("manual_wan_reconnect"); } else if (!strcmp(base, "restart_dns")) { restart_dns(); } else if (!strcmp(base, "restart_dhcpd")) { restart_dhcpd(); } else if (!strcmp(base, "restart_networkmap")) { restart_networkmap(); } else if (!strcmp(base, "run_telnetd")) { run_telnetd(); } else if (!strcmp(base, "restart_firewall")) { restart_firewall(); } else if (!strcmp(base, "radio2_toggle")) { manual_toggle_radio_rt(-1); } else if (!strcmp(base, "radio2_toggle_on")) { manual_toggle_radio_rt(1); } else if (!strcmp(base, "radio2_toggle_off")) { manual_toggle_radio_rt(0); } else if (!strcmp(base, "radio2_enable")) { manual_change_radio_rt(1); } else if (!strcmp(base, "radio2_disable")) { manual_change_radio_rt(0); } else if (!strcmp(base, "radio2_guest_enable")) { manual_change_guest_rt(1); } else if (!strcmp(base, "radio2_guest_disable")) { manual_change_guest_rt(0); } else if (!strcmp(base, "radio2_eeprom_mac")) { if (argc > 1 && strlen(argv[1]) == 17) ret = set_wireless_mac(0, argv[1]); else { printf("Usage: %s XX:XX:XX:XX:XX:XX\n\n", base); ret = get_wireless_mac(0); } } else if (!strcmp(base, "radio2_restart")) { int radio_on = get_enabled_radio_rt(); if (radio_on) radio_on = is_radio_allowed_rt(); restart_wifi_rt(radio_on, 1); } #if BOARD_HAS_5G_RADIO else if (!strcmp(base, "radio5_toggle")) { manual_toggle_radio_wl(-1); } else if (!strcmp(base, "radio5_toggle_on")) { manual_toggle_radio_wl(1); } else if (!strcmp(base, "radio5_toggle_off")) { manual_toggle_radio_wl(0); } else if (!strcmp(base, "radio5_enable")) { manual_change_radio_wl(1); } else if (!strcmp(base, "radio5_disable")) { manual_change_radio_wl(0); } else if (!strcmp(base, "radio5_guest_enable")) { manual_change_guest_wl(1); } else if (!strcmp(base, "radio5_guest_disable")) { manual_change_guest_wl(0); } else if (!strcmp(base, "radio5_eeprom_mac")) { if (argc > 1 && strlen(argv[1]) == 17) ret = set_wireless_mac(1, argv[1]); else { printf("Usage: %s XX:XX:XX:XX:XX:XX\n\n", base); ret = get_wireless_mac(1); } } else if (!strcmp(base, "radio5_restart")) { int radio_on = get_enabled_radio_wl(); if (radio_on) radio_on = is_radio_allowed_wl(); restart_wifi_wl(radio_on, 1); } #endif #if (BOARD_NUM_USB_PORTS > 0) else if (!strcmp(base, "ejusb")) { int port = 0; char *devn = NULL; if (argc > 1) { if (strncmp(argv[1], "sd", 2) == 0) devn = argv[1]; else { port = atoi(argv[1]); if (argc > 2) devn = argv[2]; } } ret = safe_remove_usb_device(port, devn, 1); } else if (!strcmp(base, "ejusb1")) { char *devn = (argc > 1) ? argv[1] : NULL; ret = safe_remove_usb_device(1, devn, 1); } #if (BOARD_NUM_USB_PORTS > 1) else if (!strcmp(base, "ejusb2")) { char *devn = (argc > 1) ? argv[1] : NULL; ret = safe_remove_usb_device(2, devn, 1); } #endif #endif else if (!strcmp(base, "pids")) { if (argc > 1) ret = pids_main(argv[1]); else ret = EINVAL; } else { printf("Unknown applet: %s\n", base); ret = EINVAL; } return ret; }
void control_ftp_fw(int is_run_before) { if (!is_run_before && is_ftp_run() && nvram_match("ftpd_wopen", "1") && nvram_match("fw_enable_x", "1")) restart_firewall(); }
void start_httpd(int restart_fw) { int http_proto, argv_index, http_port, restart_fw_need; char http_port_s[8]; #if defined (SUPPORT_HTTPS) char https_port_s[8]; #endif char *httpd_argv[] = { "/usr/sbin/httpd", NULL, NULL, NULL, NULL, NULL, }; argv_index = 1; http_port = 0; restart_fw_need = 0; #if defined (SUPPORT_HTTPS) http_proto = nvram_get_int("http_proto"); #else http_proto = 0; #endif if (http_proto == 0 || http_proto == 2) { http_port = nvram_get_int("http_lanport"); if (http_port < 80 || http_port > 65535) { http_port = 80; nvram_set_int("http_lanport", http_port); } sprintf(http_port_s, "%d", http_port); httpd_argv[argv_index++] = "-p"; httpd_argv[argv_index++] = http_port_s; restart_fw_need |= nvram_get_int("misc_http_x"); } #if defined (SUPPORT_HTTPS) if (http_proto == 1 || http_proto == 2) { int https_port = nvram_get_int("https_lport"); if (https_port < 81 || https_port > 65535 || https_port == http_port) { https_port = 443; nvram_set_int("https_lport", https_port); } sprintf(https_port_s, "%d", https_port); httpd_argv[argv_index++] = "-s"; httpd_argv[argv_index++] = https_port_s; restart_fw_need |= nvram_get_int("https_wopen"); } #endif _eval(httpd_argv, NULL, 0, NULL); if (restart_fw && restart_fw_need && nvram_match("fw_enable_x", "1")) restart_firewall(); }