summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/arch/linux-arm/AndroidConfig.h2
-rwxr-xr-xinit/init.c47
-rw-r--r--init/ueventd.c19
-rwxr-xr-xinit/util.c30
-rw-r--r--init/util.h1
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