diff options
-rw-r--r-- | include/arch/linux-arm/AndroidConfig.h | 2 | ||||
-rwxr-xr-x | init/init.c | 47 | ||||
-rw-r--r-- | init/ueventd.c | 19 | ||||
-rwxr-xr-x | init/util.c | 30 | ||||
-rw-r--r-- | init/util.h | 1 |
5 files changed, 59 insertions, 40 deletions
diff --git a/include/arch/linux-arm/AndroidConfig.h b/include/arch/linux-arm/AndroidConfig.h index 83891cd..cae112b 100644 --- a/include/arch/linux-arm/AndroidConfig.h +++ b/include/arch/linux-arm/AndroidConfig.h @@ -190,7 +190,7 @@ * with a memory address. If not defined, stack crawls will not have symbolic * information. */ -#define HAVE_DLADDR 0 +#define HAVE_DLADDR 1 /* * Defined if we have the cxxabi.h header for demangling C++ symbols. If diff --git a/init/init.c b/init/init.c index af88f30..7b4a963 100755 --- a/init/init.c +++ b/init/init.c @@ -92,7 +92,7 @@ static const char *ENV[32]; int add_environment(const char *key, const char *val) { int n; - + for (n = 0; n < 31; n++) { if (!ENV[n]) { size_t len = strlen(key) + strlen(val) + 2; @@ -156,7 +156,7 @@ void service_start(struct service *svc, const char *dynamic_args) */ svc->flags &= (~(SVC_DISABLED|SVC_RESTARTING|SVC_RESET)); svc->time_started = 0; - + /* running processes require no additional work -- if * they're in the process of exiting, we've ensured * that they will immediately restart on exit, unless @@ -381,7 +381,7 @@ static void msg_start(const char *name) svc = service_find_by_name(tmp); } - + if (svc) { service_start(svc, args); } else { @@ -455,38 +455,6 @@ static void import_kernel_nv(char *name, int in_qemu) } } -static void import_kernel_cmdline(int in_qemu) -{ - char cmdline[1024]; - char *ptr; - int fd; - - fd = open("/proc/cmdline", O_RDONLY); - if (fd >= 0) { - int n = read(fd, cmdline, 1023); - if (n < 0) n = 0; - - /* get rid of trailing newline, it happens */ - if (n > 0 && cmdline[n-1] == '\n') n--; - - cmdline[n] = 0; - close(fd); - } else { - cmdline[0] = 0; - } - - ptr = cmdline; - while (ptr && *ptr) { - char *x = strchr(ptr, ' '); - if (x != 0) *x++ = 0; - import_kernel_nv(ptr, in_qemu); - ptr = x; - } - - /* don't expose the raw commandline to nonpriv processes */ - chmod("/proc/cmdline", 0440); -} - static struct command *get_first_command(struct action *act) { struct listnode *node; @@ -609,7 +577,7 @@ static int set_init_properties_action(int nargs, char **args) char tmp[PROP_VALUE_MAX]; if (qemu[0]) - import_kernel_cmdline(1); + import_kernel_cmdline(1, import_kernel_nv); if (!strcmp(bootmode,"factory")) property_set("ro.factorytest", "1"); @@ -729,13 +697,14 @@ int main(int argc, char **argv) */ open_devnull_stdio(); klog_init(); - + INFO("reading config file\n"); init_parse_config_file("/init.rc"); /* pull the kernel commandline and ramdisk properties file in */ - import_kernel_cmdline(0); - + import_kernel_cmdline(0, import_kernel_nv); + /* don't expose the raw commandline to nonpriv processes */ + chmod("/proc/cmdline", 0440); get_hardware_name(hardware, &revision); snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware); init_parse_config_file(tmp); diff --git a/init/ueventd.c b/init/ueventd.c index ddf42be..ecf3b9b 100644 --- a/init/ueventd.c +++ b/init/ueventd.c @@ -33,6 +33,20 @@ static char hardware[32]; static unsigned revision = 0; +static void import_kernel_nv(char *name, int in_qemu) +{ + if (*name != '\0') { + char *value = strchr(name, '='); + if (value != NULL) { + *value++ = 0; + if (!strcmp(name,"androidboot.hardware")) + { + strlcpy(hardware, value, sizeof(hardware)); + } + } + } +} + int ueventd_main(int argc, char **argv) { struct pollfd ufd; @@ -51,6 +65,11 @@ int ueventd_main(int argc, char **argv) INFO("starting ueventd\n"); + /* Respect hardware passed in through the kernel cmd line. Here we will look + * for androidboot.hardware param in kernel cmdline, and save its value in + * hardware[]. */ + import_kernel_cmdline(0, import_kernel_nv); + get_hardware_name(hardware, &revision); ueventd_parse_config_file("/ueventd.rc"); diff --git a/init/util.c b/init/util.c index fd4bee2..13c9ca2 100755 --- a/init/util.c +++ b/init/util.c @@ -399,3 +399,33 @@ void get_hardware_name(char *hardware, unsigned int *revision) } } } + +void import_kernel_cmdline(int in_qemu, + void (*import_kernel_nv)(char *name, int in_qemu)) +{ + char cmdline[1024]; + char *ptr; + int fd; + + fd = open("/proc/cmdline", O_RDONLY); + if (fd >= 0) { + int n = read(fd, cmdline, 1023); + if (n < 0) n = 0; + + /* get rid of trailing newline, it happens */ + if (n > 0 && cmdline[n-1] == '\n') n--; + + cmdline[n] = 0; + close(fd); + } else { + cmdline[0] = 0; + } + + ptr = cmdline; + while (ptr && *ptr) { + char *x = strchr(ptr, ' '); + if (x != 0) *x++ = 0; + import_kernel_nv(ptr, in_qemu); + ptr = x; + } +} diff --git a/init/util.h b/init/util.h index 2e47369..9247739 100644 --- a/init/util.h +++ b/init/util.h @@ -38,4 +38,5 @@ void remove_link(const char *oldpath, const char *newpath); int wait_for_file(const char *filename, int timeout); void open_devnull_stdio(void); void get_hardware_name(char *hardware, unsigned int *revision); +void import_kernel_cmdline(int in_qemu, void (*import_kernel_nv)(char *name, int in_qemu)); #endif |