int nvram_del_env(partition_t part, char *envvar, int evlen) { int last, current, pos, i; char *buffer; if(!part.addr) return -1; last=find_last_envvar(part); current = pos = get_past_env_pos(part, envvar, evlen); // TODO is this really required? /* go back to non-0 value */ current--; while (nvram_read_byte(current)) current--; // TODO is this required? current++; buffer=get_nvram_buffer(last-pos); for (i=0; i<last-pos; i++) buffer[i]=nvram_read_byte(i+pos); for (i=0; i<last-pos; i++) nvram_write_byte(i+current, buffer[i]); free_nvram_buffer(buffer); erase_nvram(last, current+last-pos); return 0; }
static int btn_check_reset(void) { unsigned int i_button_value = !BTN_PRESSED; #if defined (BOARD_GPIO_LED_POWER) int i_led; #endif #if defined (BOARD_GPIO_BTN_WPS) /* check WPS pressed */ if (btn_count_wps > 0) return 0; #endif #if defined (BOARD_GPIO_BTN_WLTOG) /* check WLTOG pressed */ if (btn_count_wlt > 0) return 0; #endif if (cpu_gpio_get_pin(BOARD_GPIO_BTN_RESET, &i_button_value) < 0) return 0; if (i_button_value == BTN_PRESSED) { /* "RESET" pressed */ btn_count_reset++; #if defined (BOARD_GPIO_LED_POWER) /* flash power LED */ i_led = get_state_led_pwr(); if (btn_count_reset == 1) cpu_gpio_set_pin(BOARD_GPIO_LED_POWER, i_led); else if (btn_count_reset > BTN_RESET_WAIT_COUNT) { cpu_gpio_set_pin(BOARD_GPIO_LED_POWER, (btn_count_reset % 2) ? !i_led : i_led); dbg("You can release RESET button now!\n"); } #endif } else { /* "RESET" released */ int press_count = btn_count_reset; btn_count_reset = 0; if (press_count > BTN_RESET_WAIT_COUNT) { /* pressed >= 5sec, reset! */ wd_alarmtimer(0, 0); #if defined (BOARD_GPIO_LED_POWER) cpu_gpio_set_pin(BOARD_GPIO_LED_POWER, LED_OFF); #endif erase_nvram(); erase_storage(); sys_exit(); } else if (press_count > 0) { #if defined (BOARD_GPIO_LED_POWER) LED_CONTROL(BOARD_GPIO_LED_POWER, LED_ON); #endif } } return (i_button_value != BTN_PRESSED) ? 0 : 1; }
int main(int argc, char **argv) { char *base; int f; /* Make sure std* are valid since several functions attempt to close these handles. If nvram_*() runs first, nvram=0, nvram gets closed. - zzz */ if ((f = open("/dev/null", O_RDWR)) < 0) { } else if(f < 3) { dup(f); dup(f); } else { close(f); } base = strrchr(argv[0], '/'); base = base ? base + 1 : argv[0]; #if 0 if (strcmp(base, "rc") == 0) { if (argc < 2) return 1; if (strcmp(argv[1], "start") == 0) return kill(1, SIGUSR2); if (strcmp(argv[1], "stop") == 0) return kill(1, SIGINT); if (strcmp(argv[1], "restart") == 0) return kill(1, SIGHUP); ++argv; --argc; base = argv[0]; } #endif #ifdef RTCONFIG_RALINK if(getpid() != 1) { #endif #if defined(DEBUG_NOISY) if (nvram_match("debug_logrc", "1")) { int i; cprintf("[rc %d] ", getpid()); for (i = 0; i < argc; ++i) { cprintf("%s ", argv[i]); } cprintf("\n"); } #endif #if defined(DEBUG_NOISY) if (nvram_match("debug_ovrc", "1")) { char tmp[256]; char *a[32]; realpath(argv[0], tmp); if ((strncmp(tmp, "/tmp/", 5) != 0) && (argc < 32)) { sprintf(tmp, "%s%s", "/tmp/", base); if (f_exists(tmp)) { cprintf("[rc] override: %s\n", tmp); memcpy(a, argv, argc * sizeof(a[0])); a[argc] = 0; a[0] = tmp; execvp(tmp, a); exit(0); } } } #endif #ifdef RTCONFIG_RALINK } #endif const applets_t *a; for (a = applets; a->name; ++a) { if (strcmp(base, a->name) == 0) { openlog(base, LOG_PID, LOG_USER); return a->main(argc, argv); } } if(!strcmp(base, "restart_wireless")){ printf("restart wireless...\n"); restart_wireless(); return 0; } else if(!strcmp(base, "nvram_erase")){ erase_nvram(); return 0; } #ifdef RTCONFIG_USB else if(!strcmp(base, "get_apps_name")){ if(argc != 2){ printf("Usage: get_apps_name [File name]\n"); return 0; } return get_apps_name(argv[1]); } else if(!strcmp(base, "asus_sd")){ if(argc != 3){ printf("Usage: asus_sd [device_name] [action]\n"); return 0; } return asus_sd(argv[1], argv[2]); } else if(!strcmp(base, "asus_lp")){ if(argc != 3){ printf("Usage: asus_lp [device_name] [action]\n"); return 0; } return asus_lp(argv[1], argv[2]); } else if(!strcmp(base, "asus_sg")){ if(argc != 3){ printf("Usage: asus_sg [device_name] [action]\n"); return 0; } return asus_sg(argv[1], argv[2]); } else if(!strcmp(base, "asus_sr")){ if(argc != 3){ printf("Usage: asus_sr [device_name] [action]\n"); return 0; } return asus_sr(argv[1], argv[2]); } else if(!strcmp(base, "asus_tty")){ if(argc != 3){ printf("Usage: asus_tty [device_name] [action]\n"); return 0; } return asus_tty(argv[1], argv[2]); } else if(!strcmp(base, "asus_usbbcm")){ if(argc != 3){ printf("Usage: asus_usbbcm [device_name] [action]\n"); return 0; } return asus_usbbcm(argv[1], argv[2]); } else if(!strcmp(base, "asus_usb_interface")){ if(argc != 3){ printf("Usage: asus_usb_interface [device_name] [action]\n"); return 0; } return asus_usb_interface(argv[1], argv[2]); } else if (!strcmp(base, "usb_notify")) { #if defined(RTCONFIG_APP_PREINSTALLED) || defined(RTCONFIG_APP_NETINSTALLED) usb_notify(); #endif return 0; } #if defined(RTCONFIG_APP_PREINSTALLED) || defined(RTCONFIG_APP_NETINSTALLED) else if(!strcmp(base, "run_app_script")){ if(argc != 3){ printf("Usage: run_app_script [Package name | allpkg] [APP action]\n"); return 0; } if(!strcmp(argv[1], "allpkg")) return run_app_script(NULL, argv[2]); else return run_app_script(argv[1], argv[2]); } else if (!strcmp(base, "chk_app_state")) { #define PID_FILE "/var/run/chk_app_state.pid" FILE *fp; char chk_value[4]; if(f_read_string(PID_FILE, chk_value, 4) > 0 && atoi(chk_value) != getpid()){ _dprintf("Already running!\n"); return 0; } if((fp = fopen(PID_FILE, "w")) == NULL){ _dprintf("Can't open the pid file!\n"); return 0; } fprintf(fp, "%d", getpid()); fclose(fp); memset(chk_value, 0, 4); strncpy(chk_value, nvram_safe_get("apps_state_switch"), 4); if(strcmp(chk_value, "")){ if(atoi(chk_value) != APPS_SWITCH_FINISHED && !pids("app_switch.sh")){ _dprintf("Don't have the switch script.\n"); nvram_set("apps_state_switch", ""); } unlink(PID_FILE); return 0; } memset(chk_value, 0, 4); strncpy(chk_value, nvram_safe_get("apps_state_install"), 4); if(strcmp(chk_value, "")){ if(atoi(chk_value) != APPS_INSTALL_FINISHED && !pids("app_install.sh")){ _dprintf("Don't have the install script.\n"); nvram_set("apps_state_install", ""); } unlink(PID_FILE); return 0; } memset(chk_value, 0, 4); strncpy(chk_value, nvram_safe_get("apps_state_upgrade"), 4); if(strcmp(chk_value, "")){ if(atoi(chk_value) != APPS_UPGRADE_FINISHED && !pids("app_upgrade.sh")){ _dprintf("Don't have the upgrade script.\n"); nvram_set("apps_state_upgrade", ""); } unlink(PID_FILE); return 0; } memset(chk_value, 0, 4); strncpy(chk_value, nvram_safe_get("apps_state_enable"), 4); if(strcmp(chk_value, "")){ if(atoi(chk_value) != APPS_ENABLE_FINISHED && !pids("app_set_enabled.sh")){ _dprintf("Don't have the enable script.\n"); nvram_set("apps_state_enable", ""); } unlink(PID_FILE); return 0; } unlink(PID_FILE); return 0; } #endif #endif else if(!strcmp(base, "ATE")) { if( argc == 2 || argc == 3 || argc == 4) { asus_ate_command(argv[1], argv[2], argv[3]); } else printf("ATE_ERROR\n"); return 0; } #if defined(RTCONFIG_RALINK) else if (!strcmp(base, "FWRITE")) { if (argc == 3) return FWRITE(argv[1], argv[2]); else return 0; } else if (!strcmp(base, "FREAD")) { if (argc == 3) { unsigned int addr; int len; addr = strtoul(argv[1], NULL, 16); if(argv[2][0] == '0' && argv[2][1] == 'x') len = (int) strtoul(argv[2], NULL, 16); else len = (int) strtoul(argv[2], NULL, 10); if(len > 0) return FREAD(addr, len); } printf("ATE_ERROR\n"); return 0; } else if (!strcmp(base, "asuscfe_5g")) { if (argc == 2) return asuscfe(argv[1], WIF_5G); else return EINVAL; } else if (!strcmp(base, "asuscfe_2g")) { if (argc == 2) return asuscfe(argv[1], WIF_2G); else return EINVAL; } else if (!strcmp(base, "stainfo_2g")) { return stainfo(0); } else if (!strcmp(base, "stainfo_5g")) { return stainfo(1); } #ifdef RTCONFIG_DSL else if(!strcmp(base, "gen_ralink_config")){ if(argc != 3){ printf("Usage: gen_ralink_config [band] [is_iNIC]\n"); return 0; } return gen_ralink_config(atoi(argv[1]), atoi(argv[2])); } #endif #endif else if(!strcmp(base, "run_telnetd")) { run_telnetd(); return 0; } #if defined(RTCONFIG_PPTPD) || defined(RTCONFIG_ACCEL_PPTPD) else if(!strcmp(base, "run_pptpd")) { start_pptpd(); return 0; } #endif #ifdef RTCONFIG_PARENTALCTRL else if(!strcmp(base, "pc")) { pc_main(argc, argv); return 0; } #endif #ifdef CONFIG_BCMWL5 else if (!strcmp(base, "wlcscan")) { return wlcscan_main(); } #endif #ifdef RTCONFIG_WIRELESSREPEATER else if (!strcmp(base, "wlcconnect")) { return wlcconnect_main(); } else if (!strcmp(base, "setup_dnsmq")) { if(argc != 2) return 0; return setup_dnsmq(atoi(argv[1])); } #endif else if (!strcmp(base, "add_multi_routes")) { return add_multi_routes(); } else if (!strcmp(base, "led_ctrl")) { if (argc != 3) return 0; return(led_control(atoi(argv[1]), atoi(argv[2]))); } #ifdef RTCONFIG_BCMARM /* mtd-erase2 [device] */ else if (!strcmp(base, "mtd-erase2")) { if (argv[1] && ((!strcmp(argv[1], "boot")) || (!strcmp(argv[1], "linux")) || (!strcmp(argv[1], "linux2")) || (!strcmp(argv[1], "rootfs")) || (!strcmp(argv[1], "rootfs2")) || (!strcmp(argv[1], "nvram")))) { return mtd_erase(argv[1]); } else { fprintf(stderr, "usage: mtd-erase2 [device]\n"); return EINVAL; } } /* mtd-write2 [path] [device] */ else if (!strcmp(base, "mtd-write2")) { if (argc >= 3) return mtd_write(argv[1], argv[2]); else { fprintf(stderr, "usage: mtd-write2 [path] [device]\n"); return EINVAL; } } #endif else if (!strcmp(base, "free_caches")) { int c; unsigned int test_num; char *set_value = NULL; int clean_time = 1; int threshold = 0; if(argc){ while((c = getopt(argc, argv, "c:w:t:")) != -1){ switch(c){ case 'c': // set the clean-cache mode: 0~3. test_num = strtol(optarg, NULL, 10); if(test_num == LONG_MIN || test_num == LONG_MAX){ _dprintf("ERROR: unknown value %s...\n", optarg); return 0; } if(test_num < 0 || test_num > 3){ _dprintf("ERROR: the value %s was over the range...\n", optarg); return 0; } set_value = optarg; break; case 'w': // set the waited time for cleaning. test_num = strtol(optarg, NULL, 10); if(test_num < 0 || test_num == LONG_MIN || test_num == LONG_MAX){ _dprintf("ERROR: unknown value %s...\n", optarg); return 0; } clean_time = test_num; break; case 't': // set the waited time for cleaning. test_num = strtol(optarg, NULL, 10); if(test_num < 0 || test_num == LONG_MIN || test_num == LONG_MAX){ _dprintf("ERROR: unknown value %s...\n", optarg); return 0; } threshold = test_num; break; default: fprintf(stderr, "Usage: free_caches [ -c clean_mode ] [ -w clean_time ] [ -t threshold ]\n"); break; } } } if(!set_value) set_value = FREE_MEM_PAGE; free_caches(set_value, clean_time, threshold); return 0; } printf("Unknown applet: %s\n", base); return 0; }
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 ez_event_long(int btn_id) { int ez_action, ez_param = 2; #if defined (BOARD_GPIO_BTN_WLTOG) if (btn_id == 1) { ez_action = nvram_get_int("wlt_action_long"); ez_param = 4; } else #endif ez_action = nvram_get_int("ez_action_long"); #if defined (BOARD_GPIO_LED_POWER) int led_state = LED_ON; switch (ez_action) { case 7: // Router reboot case 8: // Router shutdown led_state = LED_OFF; break; case 11: // Front LED toggle led_state = -1; break; } if (led_state >= 0) LED_CONTROL(BOARD_GPIO_LED_POWER, led_state); #endif switch (ez_action) { case 1: // WiFi 2.4GHz force Enable/Disable trigger ez_action_change_wifi2(); break; case 2: // WiFi 5GHz force Enable/Disable trigger ez_action_change_wifi5(); break; case 3: // WiFi 2.4 & 5GHz force Enable/Disable trigger ez_action_change_wifi2(); ez_action_change_wifi5(); break; case 4: // Safe removal all USB ez_action_usb_saferemoval(); break; case 5: // WAN down ez_action_wan_down(); break; case 6: // WAN reconnect ez_action_wan_reconnect(); break; case 7: // Router reboot sys_exit(); break; case 8: // Router shutdown ez_action_shutdown(); break; case 9: // WAN up/down toggle ez_action_wan_toggle(); break; case 10: // Run user script ez_action_user_script(ez_param); break; case 11: // Front LED toggle ez_action_led_toggle(); break; case 12: // WiFi AP Guest 2.4GHz Enable/Disable trigger ez_action_change_guest_wifi2(); break; case 13: // WiFi AP Guest 5GHz Enable/Disable trigger ez_action_change_guest_wifi5(); break; case 14: // WiFi AP Guest 2.4 & 5GHz Enable/Disable trigger ez_action_change_guest_wifi2(); ez_action_change_guest_wifi5(); break; case 15: // Reset settings erase_nvram(); erase_storage(); sys_exit(); break; } }
static void btn_check_reset(void) { unsigned int i_button_value = 1; #if defined(BTN_WPS) // check WPS pressed if (btn_pressed_wps != 0) return; #endif if (cpu_gpio_get_pin(BTN_RESET, &i_button_value) < 0) return; // reset button is on low phase if (!i_button_value) { // "RESET" pressed if (!btn_pressed_reset) { btn_pressed_reset = 1; btn_count_reset = 0; alarmtimer(0, URGENT_PERIOD); } else { /* Whenever it is pushed steady */ if (++btn_count_reset > RESET_WAIT_COUNT) { dbg("You can release RESET button now!\n"); btn_pressed_reset = 2; } if (btn_pressed_reset == 2) { if (btn_count_reset % 2) cpu_gpio_set_pin(LED_POWER, LED_OFF); else cpu_gpio_set_pin(LED_POWER, LED_ON); } } } else { // "RESET" released if (btn_pressed_reset == 1) { // pressed < 5sec, cancel btn_count_reset = 0; btn_pressed_reset = 0; LED_CONTROL(LED_POWER, LED_ON); alarmtimer(NORMAL_PERIOD, 0); } else if (btn_pressed_reset == 2) { // pressed >= 5sec, reset! LED_CONTROL(LED_POWER, LED_OFF); alarmtimer(0, 0); erase_nvram(); erase_storage(); sys_exit(); } } }