diff options
author | Tom Cherry | 2018-07-20 21:01:14 -0500 |
---|---|---|
committer | Gerrit Code Review | 2018-07-20 21:01:14 -0500 |
commit | 258109ce4ab00bbb831212c04e6c986899d7bd85 (patch) | |
tree | fa97f432cb397c1c7764b8fb260ad5512521f552 /init | |
parent | 21d03d83fa60f1ac06204ae28c733ea994e922bb (diff) | |
parent | 74069d17347eb64ec932831f8383448fd16e6e0f (diff) | |
download | platform-system-core-258109ce4ab00bbb831212c04e6c986899d7bd85.tar.gz platform-system-core-258109ce4ab00bbb831212c04e6c986899d7bd85.tar.xz platform-system-core-258109ce4ab00bbb831212c04e6c986899d7bd85.zip |
Merge "init: clean up logging initialization"
Diffstat (limited to 'init')
-rw-r--r-- | init/Android.bp | 1 | ||||
-rw-r--r-- | init/init.cpp | 31 | ||||
-rw-r--r-- | init/log.cpp | 89 | ||||
-rw-r--r-- | init/log.h | 32 | ||||
-rw-r--r-- | init/selinux.cpp | 19 | ||||
-rw-r--r-- | init/ueventd.cpp | 3 | ||||
-rw-r--r-- | init/watchdogd.cpp | 4 |
7 files changed, 48 insertions, 131 deletions
diff --git a/init/Android.bp b/init/Android.bp index 5bbb7a09c..859aeb663 100644 --- a/init/Android.bp +++ b/init/Android.bp | |||
@@ -108,7 +108,6 @@ cc_library_static { | |||
108 | "init.cpp", | 108 | "init.cpp", |
109 | "init_first_stage.cpp", | 109 | "init_first_stage.cpp", |
110 | "keychords.cpp", | 110 | "keychords.cpp", |
111 | "log.cpp", | ||
112 | "parser.cpp", | 111 | "parser.cpp", |
113 | "persistent_properties.cpp", | 112 | "persistent_properties.cpp", |
114 | "persistent_properties.proto", | 113 | "persistent_properties.proto", |
diff --git a/init/init.cpp b/init/init.cpp index 686cd6ed9..12c3d6c4b 100644 --- a/init/init.cpp +++ b/init/init.cpp | |||
@@ -51,7 +51,6 @@ | |||
51 | #include "import_parser.h" | 51 | #include "import_parser.h" |
52 | #include "init_first_stage.h" | 52 | #include "init_first_stage.h" |
53 | #include "keychords.h" | 53 | #include "keychords.h" |
54 | #include "log.h" | ||
55 | #include "property_service.h" | 54 | #include "property_service.h" |
56 | #include "reboot.h" | 55 | #include "reboot.h" |
57 | #include "security.h" | 56 | #include "security.h" |
@@ -582,6 +581,34 @@ void HandleKeychord(const std::vector<int>& keycodes) { | |||
582 | } | 581 | } |
583 | } | 582 | } |
584 | 583 | ||
584 | static void InitAborter(const char* abort_message) { | ||
585 | // When init forks, it continues to use this aborter for LOG(FATAL), but we want children to | ||
586 | // simply abort instead of trying to reboot the system. | ||
587 | if (getpid() != 1) { | ||
588 | android::base::DefaultAborter(abort_message); | ||
589 | return; | ||
590 | } | ||
591 | |||
592 | RebootSystem(ANDROID_RB_RESTART2, "bootloader"); | ||
593 | } | ||
594 | |||
595 | static void InitKernelLogging(char* argv[]) { | ||
596 | // Make stdin/stdout/stderr all point to /dev/null. | ||
597 | int fd = open("/sys/fs/selinux/null", O_RDWR); | ||
598 | if (fd == -1) { | ||
599 | int saved_errno = errno; | ||
600 | android::base::InitLogging(argv, &android::base::KernelLogger, InitAborter); | ||
601 | errno = saved_errno; | ||
602 | PLOG(FATAL) << "Couldn't open /sys/fs/selinux/null"; | ||
603 | } | ||
604 | dup2(fd, 0); | ||
605 | dup2(fd, 1); | ||
606 | dup2(fd, 2); | ||
607 | if (fd > 2) close(fd); | ||
608 | |||
609 | android::base::InitLogging(argv, &android::base::KernelLogger, InitAborter); | ||
610 | } | ||
611 | |||
585 | int main(int argc, char** argv) { | 612 | int main(int argc, char** argv) { |
586 | if (!strcmp(basename(argv[0]), "ueventd")) { | 613 | if (!strcmp(basename(argv[0]), "ueventd")) { |
587 | return ueventd_main(argc, argv); | 614 | return ueventd_main(argc, argv); |
@@ -592,7 +619,7 @@ int main(int argc, char** argv) { | |||
592 | } | 619 | } |
593 | 620 | ||
594 | if (argc > 1 && !strcmp(argv[1], "subcontext")) { | 621 | if (argc > 1 && !strcmp(argv[1], "subcontext")) { |
595 | InitKernelLogging(argv); | 622 | android::base::InitLogging(argv, &android::base::KernelLogger); |
596 | const BuiltinFunctionMap function_map; | 623 | const BuiltinFunctionMap function_map; |
597 | return SubcontextMain(argc, argv, &function_map); | 624 | return SubcontextMain(argc, argv, &function_map); |
598 | } | 625 | } |
diff --git a/init/log.cpp b/init/log.cpp deleted file mode 100644 index 6198fc25f..000000000 --- a/init/log.cpp +++ /dev/null | |||
@@ -1,89 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2015 The Android Open Source Project | ||
3 | * | ||
4 | * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | * you may not use this file except in compliance with the License. | ||
6 | * You may obtain a copy of the License at | ||
7 | * | ||
8 | * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | * | ||
10 | * Unless required by applicable law or agreed to in writing, software | ||
11 | * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | * See the License for the specific language governing permissions and | ||
14 | * limitations under the License. | ||
15 | */ | ||
16 | |||
17 | #include "log.h" | ||
18 | |||
19 | #include <fcntl.h> | ||
20 | #include <linux/audit.h> | ||
21 | #include <string.h> | ||
22 | #include <unistd.h> | ||
23 | |||
24 | #include <android-base/logging.h> | ||
25 | #include <cutils/android_reboot.h> | ||
26 | #include <selinux/selinux.h> | ||
27 | |||
28 | #include "reboot.h" | ||
29 | |||
30 | namespace android { | ||
31 | namespace init { | ||
32 | |||
33 | static void InitAborter(const char* abort_message) { | ||
34 | // When init forks, it continues to use this aborter for LOG(FATAL), but we want children to | ||
35 | // simply abort instead of trying to reboot the system. | ||
36 | if (getpid() != 1) { | ||
37 | android::base::DefaultAborter(abort_message); | ||
38 | return; | ||
39 | } | ||
40 | |||
41 | // DoReboot() does a lot to try to shutdown the system cleanly. If something happens to call | ||
42 | // LOG(FATAL) in the shutdown path, we want to catch this and immediately use the syscall to | ||
43 | // reboot instead of recursing here. | ||
44 | static bool has_aborted = false; | ||
45 | if (!has_aborted) { | ||
46 | has_aborted = true; | ||
47 | // Do not queue "shutdown" trigger since we want to shutdown immediately and it's not likely | ||
48 | // that we can even run the ActionQueue at this point. | ||
49 | DoReboot(ANDROID_RB_RESTART2, "reboot", "bootloader", false); | ||
50 | } else { | ||
51 | RebootSystem(ANDROID_RB_RESTART2, "bootloader"); | ||
52 | } | ||
53 | } | ||
54 | |||
55 | void InitKernelLogging(char* argv[]) { | ||
56 | // Make stdin/stdout/stderr all point to /dev/null. | ||
57 | int fd = open("/sys/fs/selinux/null", O_RDWR); | ||
58 | if (fd == -1) { | ||
59 | int saved_errno = errno; | ||
60 | android::base::InitLogging(argv, &android::base::KernelLogger, InitAborter); | ||
61 | errno = saved_errno; | ||
62 | PLOG(FATAL) << "Couldn't open /sys/fs/selinux/null"; | ||
63 | } | ||
64 | dup2(fd, 0); | ||
65 | dup2(fd, 1); | ||
66 | dup2(fd, 2); | ||
67 | if (fd > 2) close(fd); | ||
68 | |||
69 | android::base::InitLogging(argv, &android::base::KernelLogger, InitAborter); | ||
70 | } | ||
71 | |||
72 | int selinux_klog_callback(int type, const char *fmt, ...) { | ||
73 | android::base::LogSeverity severity = android::base::ERROR; | ||
74 | if (type == SELINUX_WARNING) { | ||
75 | severity = android::base::WARNING; | ||
76 | } else if (type == SELINUX_INFO) { | ||
77 | severity = android::base::INFO; | ||
78 | } | ||
79 | char buf[1024]; | ||
80 | va_list ap; | ||
81 | va_start(ap, fmt); | ||
82 | vsnprintf(buf, sizeof(buf), fmt, ap); | ||
83 | va_end(ap); | ||
84 | android::base::KernelLogger(android::base::MAIN, severity, "selinux", nullptr, 0, buf); | ||
85 | return 0; | ||
86 | } | ||
87 | |||
88 | } // namespace init | ||
89 | } // namespace android | ||
diff --git a/init/log.h b/init/log.h deleted file mode 100644 index 5a4eba6b5..000000000 --- a/init/log.h +++ /dev/null | |||
@@ -1,32 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2010 The Android Open Source Project | ||
3 | * | ||
4 | * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | * you may not use this file except in compliance with the License. | ||
6 | * You may obtain a copy of the License at | ||
7 | * | ||
8 | * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | * | ||
10 | * Unless required by applicable law or agreed to in writing, software | ||
11 | * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | * See the License for the specific language governing permissions and | ||
14 | * limitations under the License. | ||
15 | */ | ||
16 | |||
17 | #ifndef _INIT_LOG_H_ | ||
18 | #define _INIT_LOG_H_ | ||
19 | |||
20 | #include <sys/cdefs.h> | ||
21 | |||
22 | namespace android { | ||
23 | namespace init { | ||
24 | |||
25 | void InitKernelLogging(char* argv[]); | ||
26 | |||
27 | int selinux_klog_callback(int level, const char* fmt, ...) __printflike(2, 3); | ||
28 | |||
29 | } // namespace init | ||
30 | } // namespace android | ||
31 | |||
32 | #endif | ||
diff --git a/init/selinux.cpp b/init/selinux.cpp index 0ba5c4ae3..94f206ede 100644 --- a/init/selinux.cpp +++ b/init/selinux.cpp | |||
@@ -59,7 +59,6 @@ | |||
59 | #include <android-base/unique_fd.h> | 59 | #include <android-base/unique_fd.h> |
60 | #include <selinux/android.h> | 60 | #include <selinux/android.h> |
61 | 61 | ||
62 | #include "log.h" | ||
63 | #include "util.h" | 62 | #include "util.h" |
64 | 63 | ||
65 | using android::base::ParseInt; | 64 | using android::base::ParseInt; |
@@ -448,10 +447,26 @@ void SelinuxRestoreContext() { | |||
448 | selinux_android_restorecon("/sbin/sload.f2fs", 0); | 447 | selinux_android_restorecon("/sbin/sload.f2fs", 0); |
449 | } | 448 | } |
450 | 449 | ||
450 | int SelinuxKlogCallback(int type, const char* fmt, ...) { | ||
451 | android::base::LogSeverity severity = android::base::ERROR; | ||
452 | if (type == SELINUX_WARNING) { | ||
453 | severity = android::base::WARNING; | ||
454 | } else if (type == SELINUX_INFO) { | ||
455 | severity = android::base::INFO; | ||
456 | } | ||
457 | char buf[1024]; | ||
458 | va_list ap; | ||
459 | va_start(ap, fmt); | ||
460 | vsnprintf(buf, sizeof(buf), fmt, ap); | ||
461 | va_end(ap); | ||
462 | android::base::KernelLogger(android::base::MAIN, severity, "selinux", nullptr, 0, buf); | ||
463 | return 0; | ||
464 | } | ||
465 | |||
451 | // This function sets up SELinux logging to be written to kmsg, to match init's logging. | 466 | // This function sets up SELinux logging to be written to kmsg, to match init's logging. |
452 | void SelinuxSetupKernelLogging() { | 467 | void SelinuxSetupKernelLogging() { |
453 | selinux_callback cb; | 468 | selinux_callback cb; |
454 | cb.func_log = selinux_klog_callback; | 469 | cb.func_log = SelinuxKlogCallback; |
455 | selinux_set_callback(SELINUX_CB_LOG, cb); | 470 | selinux_set_callback(SELINUX_CB_LOG, cb); |
456 | } | 471 | } |
457 | 472 | ||
diff --git a/init/ueventd.cpp b/init/ueventd.cpp index b42a4c62a..cd45a3fb7 100644 --- a/init/ueventd.cpp +++ b/init/ueventd.cpp | |||
@@ -36,7 +36,6 @@ | |||
36 | 36 | ||
37 | #include "devices.h" | 37 | #include "devices.h" |
38 | #include "firmware_handler.h" | 38 | #include "firmware_handler.h" |
39 | #include "log.h" | ||
40 | #include "selinux.h" | 39 | #include "selinux.h" |
41 | #include "uevent_listener.h" | 40 | #include "uevent_listener.h" |
42 | #include "ueventd_parser.h" | 41 | #include "ueventd_parser.h" |
@@ -223,7 +222,7 @@ int ueventd_main(int argc, char** argv) { | |||
223 | */ | 222 | */ |
224 | umask(000); | 223 | umask(000); |
225 | 224 | ||
226 | InitKernelLogging(argv); | 225 | android::base::InitLogging(argv, &android::base::KernelLogger); |
227 | 226 | ||
228 | LOG(INFO) << "ueventd started!"; | 227 | LOG(INFO) << "ueventd started!"; |
229 | 228 | ||
diff --git a/init/watchdogd.cpp b/init/watchdogd.cpp index e0164b419..e03a2c31d 100644 --- a/init/watchdogd.cpp +++ b/init/watchdogd.cpp | |||
@@ -23,8 +23,6 @@ | |||
23 | 23 | ||
24 | #include <android-base/logging.h> | 24 | #include <android-base/logging.h> |
25 | 25 | ||
26 | #include "log.h" | ||
27 | |||
28 | #ifdef _INIT_INIT_H | 26 | #ifdef _INIT_INIT_H |
29 | #error "Do not include init.h in files used by ueventd or watchdogd; it will expose init's globals" | 27 | #error "Do not include init.h in files used by ueventd or watchdogd; it will expose init's globals" |
30 | #endif | 28 | #endif |
@@ -35,7 +33,7 @@ namespace android { | |||
35 | namespace init { | 33 | namespace init { |
36 | 34 | ||
37 | int watchdogd_main(int argc, char **argv) { | 35 | int watchdogd_main(int argc, char **argv) { |
38 | InitKernelLogging(argv); | 36 | android::base::InitLogging(argv, &android::base::KernelLogger); |
39 | 37 | ||
40 | int interval = 10; | 38 | int interval = 10; |
41 | if (argc >= 2) interval = atoi(argv[1]); | 39 | if (argc >= 2) interval = atoi(argv[1]); |