int do_exec(int nargs, char **args) { pid_t pid; int status, i, j; char *par[MAX_PARAMETERS]; char prop_val[PROP_VALUE_MAX]; int len; if (nargs > MAX_PARAMETERS) { return -1; } for(i=0, j=1; i<(nargs-1) ;i++,j++) { if ((args[j]) && (!expand_props(prop_val, args[j], sizeof(prop_val)))) { len = strlen(args[j]); if (strlen(prop_val) <= len) { /* Overwrite arg with expansion. * * For now, only allow an expansion length that * can fit within the original arg length to * avoid extra allocations. * On failure, use original argument. */ strncpy(args[j], prop_val, len + 1); } } par[i] = args[j]; } par[i] = (char*)0; pid = fork(); if (!pid) { char tmp[32]; int fd, sz; get_property_workspace(&fd, &sz); sprintf(tmp, "%d,%d", dup(fd), sz); setenv("ANDROID_PROPERTY_WORKSPACE", tmp, 1); execve(par[0], par, environ); exit(0); } else { while(wait(&status)!=pid); } return 0; }
int do_write(int nargs, char **args) { const char *path = args[1]; const char *value = args[2]; char expanded_value[256]; if (expand_props(expanded_value, value, sizeof(expanded_value))) { ERROR("cannot expand '%s' while writing to '%s'\n", value, path); return -EINVAL; } return write_file(path, expanded_value); }
int do_write(int nargs, char **args) { const char *path = args[1]; const char *value = args[2]; char prop_val[PROP_VALUE_MAX]; int ret; ret = expand_props(prop_val, value, sizeof(prop_val)); if (ret) { ERROR("cannot expand '%s' while writing to '%s'\n", value, path); return -EINVAL; } return write_file(path, prop_val); }
int do_powerctl(int nargs, char **args) { char command[PROP_VALUE_MAX]; int res; int len = 0; int cmd = 0; const char *reboot_target; void (*callback_on_ro_remount)(const struct mntent*) = NULL; res = expand_props(command, args[1], sizeof(command)); if (res) { ERROR("powerctl: cannot expand '%s'\n", args[1]); return -EINVAL; } if (strncmp(command, "shutdown", 8) == 0) { if (property_get_bool("init.shutdown_to_charging", false)) { return android_reboot(ANDROID_RB_RESTART2, 0, "charging"); } cmd = ANDROID_RB_POWEROFF; len = 8; callback_on_ro_remount = unmount_and_fsck; } else if (strncmp(command, "reboot", 6) == 0) { cmd = ANDROID_RB_RESTART2; len = 6; } else { ERROR("powerctl: unrecognized command '%s'\n", command); return -EINVAL; } if (command[len] == ',') { char prop_value[PROP_VALUE_MAX] = {0}; reboot_target = &command[len + 1]; if ((property_get("init.svc.recovery", prop_value) == 0) && (strncmp(reboot_target, "keys", 4) == 0)) { ERROR("powerctl: permission denied\n"); return -EINVAL; } } else if (command[len] == '\0') { reboot_target = ""; } else { ERROR("powerctl: unrecognized reboot target '%s'\n", &command[len]); return -EINVAL; } return android_reboot_with_callback(cmd, 0, reboot_target, callback_on_ro_remount); }
int do_setprop(int nargs, char **args) { const char *name = args[1]; const char *value = args[2]; char prop_val[PROP_VALUE_MAX]; int ret; ret = expand_props(prop_val, value, sizeof(prop_val)); if (ret) { ERROR("cannot expand '%s' while assigning to '%s'\n", value, name); return -EINVAL; } property_set(name, prop_val); return 0; }
static int insmod(const char *filename, char *options) { char filename_val[PROP_VALUE_MAX]; if (expand_props(filename_val, filename, sizeof(filename_val)) == -1) { ERROR("insmod: cannot expand '%s'\n", filename); return -EINVAL; } std::string module; if (!read_file(filename_val, &module)) { return -1; } // TODO: use finit_module for >= 3.8 kernels. return init_module(&module[0], module.size(), options); }
int do_powerctl(int nargs, char **args) { char command[PROP_VALUE_MAX]; int res; int len = 0; int cmd = 0; const char *reboot_target; res = expand_props(command, args[1], sizeof(command)); if (res) { ERROR("powerctl: cannot expand '%s'\n", args[1]); return -EINVAL; } if (strncmp(command, "shutdown", 8) == 0) { cmd = ANDROID_RB_POWEROFF; len = 8; } else if (strncmp(command, "reboot", 6) == 0) { cmd = ANDROID_RB_RESTART2; len = 6; } else { ERROR("powerctl: unrecognized command '%s'\n", command); return -EINVAL; } if (command[len] == ',') { char prop_value[PROP_VALUE_MAX] = {0}; reboot_target = &command[len + 1]; if ((property_get("init.svc.recovery", prop_value) == 0) && (strncmp(reboot_target, "keys", 4) == 0)) { ERROR("powerctl: permission denied\n"); return -EINVAL; } } else if (command[len] == '\0') { reboot_target = ""; } else { ERROR("powerctl: unrecognized reboot target '%s'\n", &command[len]); return -EINVAL; } return android_reboot(cmd, 0, reboot_target); }
int do_loglevel(int nargs, char **args) { int log_level; char log_level_str[PROP_VALUE_MAX] = ""; if (nargs != 2) { ERROR("loglevel: missing argument\n"); return -EINVAL; } if (expand_props(log_level_str, args[1], sizeof(log_level_str))) { ERROR("loglevel: cannot expand '%s'\n", args[1]); return -EINVAL; } log_level = atoi(log_level_str); if (log_level < KLOG_ERROR_LEVEL || log_level > KLOG_DEBUG_LEVEL) { ERROR("loglevel: invalid log level'%d'\n", log_level); return -EINVAL; } klog_set_level(log_level); return 0; }
int do_powerctl(int nargs, char **args) { char command[PROP_VALUE_MAX]; int res; int len = 0; int cmd = 0; char *reboot_target; res = expand_props(command, args[1], sizeof(command)); if (res) { ERROR("powerctl: cannot expand '%s'\n", args[1]); return -EINVAL; } if (strncmp(command, "shutdown", 8) == 0) { cmd = ANDROID_RB_POWEROFF; len = 8; } else if (strncmp(command, "reboot", 6) == 0) { cmd = ANDROID_RB_RESTART2; len = 6; } else { ERROR("powerctl: unrecognized command '%s'\n", command); return -EINVAL; } if (command[len] == ',') { reboot_target = &command[len + 1]; } else if (command[len] == '\0') { reboot_target = ""; } else { ERROR("powerctl: unrecognized reboot target '%s'\n", &command[len]); return -EINVAL; } return android_reboot(cmd, 0, reboot_target); }