summaryrefslogtreecommitdiff
path: root/init/builtins.cpp
AgeCommit message (Collapse)Author
2019-12-04FscryptInstallKeyring: don't re-create keyring if it's already createdNikita Ioffe
During userspace reboot FscryptInstallKeyring will be called again, this CL will make it second call a no-op, which IMHO is better than having a special logic in init to conditionally call FscryptInstallKeyring depending on whenever it's normal boot, or userspace reboot. Test: adb reboot userspace Test: checked in kernel logs that new keyring is not created Bug: 135984674 Change-Id: I4ad5aee6887b7318fb1cd02bf1c7be8da6ece599
2019-11-25Merge RP1A.191120.001Steven Laver
Change-Id: I734444bb3a8b0732c851f593849dc58fc3e79cbd
2019-11-19Merge RP1A.191114.001Steven Laver
Change-Id: I14d1258c263f4b8e653405bb90208a50337287c1
2019-11-15Make userspace_reboot.in_progress sysprop-as-apiNikita Ioffe
sys.init.userspace_reboot.in_progress will be used to notify all the processes (including vendor ones) that userspace reboot is happening, hence it should be treated as stable public api. All other sys.init.userspace_reboot.* props will be internal to /system partition and don't require any stability guarantees. Test: builds Test: adb reboot userspace Bug: 135984674 Change-Id: Ifb64a6bfae2de76bac67edea68df44e33c9cfe2d
2019-11-14Add sysprops for start & end of userspace rebootNikita Ioffe
There will be useful in debugging/logging events to statsd. Also as part of this CL, sys.init.userspace_reboot.in_progress property is now used as a mean of synchronization. It is set directly in DoUserspaceReboot, to make sure that all the setprop actions triggered by userspace-reboot-requested were processed. Test: adb reboot userspace Test: adb shell getprop sys.init.userspace_reboot.last_started Test: adb shell getprop sys.init.userspace_reboot.last_finished Bug: 135984674 Change-Id: I9debcd4f058e790855200d5295344dafb30e496a
2019-11-13init: make triggering shutdown from vendor_init betterTom Cherry
Previously, we assumed that TriggerShutdown() should never be called from vendor_init and used property service as a back up in case it ever did. We have since then found out that vendor_init may indeed call TriggerShutdown() and we want to make it just as strict as it is in init, wherein it will immediately start the shutdown sequence without executing any further commands. Test: init unit tests, trigger shuttdown from init and vendor_init Change-Id: I1f44dae801a28269eb8127879a8b7d6adff6f353
2019-11-09Merge RP1A.191031.003Steven Laver
Change-Id: I29456b03457ecabeb0264f0ebc3fe6d22eaf653e
2019-11-08userspace reboot: don't re-install keyring when remounting userdataNikita Ioffe
From the implementation of FscryptInstallKeyring it looks like it will install a new keyring on each call. Another approach would be change FscryptInstallKeyring to first call request_key[0] (http://man7.org/linux/man-pages/man2/request_key.2.html), and don't add keyring in case request_key succeeded, but it looks like that libkeyutils doesn't provide such functionality. Since I was there, I've also added checks that we are not trying to remount userdata on FDE devices. Test: adb reboot userspace Bug: 135984674 Change-Id: I2e063d7d87a3c2c26810e913a33e3a5c0364332b
2019-11-05Make encryption action an argument to mkdirPaul Crowley
FscryptSetDirectoryPolicy no longer tries to infer the action from the filename. Well mostly; it still assumes top-level directories in /data should be encrypted unless the mkdir arguments say otherwise, but it warns. Bug: 26641735 Test: boot, check log messages Change-Id: Id6d2cea7fb856f17323897d85cf6190c981b443c
2019-11-05Merge RP1A.191024.001Steven Laver
Change-Id: Ia87bdd95c8f51e6fdb6ce86b473189bc073862bc
2019-10-25Userspace reboot: Support remounting userdata for f2fsNikita Ioffe
Test: adb reboot userspace Test: adb shell /system/bin/vdc startCheckpoint 1; adb reboot userspace Bug: 135984674 Change-Id: I227f2c1cc18495d893decb2df5173fc7a7919df6
2019-10-11init: trigger shutdown directly from builtinsTom Cherry
Especially now that property_service is a thread, there may be some delay between when init sets sys.powerctl and when the main thread of init receives this and triggers shutdown. It's possible that outstanding init commands are run during this gap and that is not desirable. Instead, have builtins call TriggerShutdown() directly, so we can be sure that the next action that init runs will be to shutdown the device. Test: reboot works Test: reboot into recovery due to bad /data works Change-Id: I26fb9f4f57f46c7451b8b58187138cfedd6fd9eb
2019-10-07Merge RP1A.190923.001Steven Laver
Change-Id: I7f2a2533917f63711b8d372608e239cb6ced3aa6
2019-09-13init: add reboot_on_failure service optionTom Cherry
This replaces the recently added `exec_reboot_on_failure` builtin, since it'll be cleaner to extend service definitions than extending `exec`. This is in line with what we decided when adding `exec_start` instead of extending `exec` to add parameters for priority. Test: `exec_start` a service with a reboot_on_failure option and watch the system reboot appropriately when the service is not found and when the service terminates with a non-zero exit code. Change-Id: I332bf9839fa94840d159a810c4a6ba2522189d0b
2019-09-05Reland^2: "init: run property service in a thread"Tom Cherry
It's been a long standing issue that init cannot respond to property set messages when it is running a builtin command. This is particularly problematic when the commands involve IPC to vold or other daemons, as it prevents them from being able to set properties. This change has init run property service in a thread, which eliminates the above issue. This change may also serve as a starting block to running property service in an entirely different process to better isolate init from handling property requests. Reland: during reboot, init stops processing property_changed messages from property service, since it will not act on these anyway. This had an unexpected effect of causing future property_set calls to block indefinitely, since the buffer between init and property_service was filling up and the send() call from property_service would then block. This change has init tell property_service to stop sending it property_changed messages once reboot begins. Test: CF boots, walleye boots, properties are set appropriately Change-Id: I26902708e8be788caa6dbcf4b6d2968d90962785
2019-09-04init: add exec_reboot_on_failure builtinTom Cherry
Add exec_reboot_on_failure builtin and refactor the VDC commands that had similar functionality. These will now also reboot in the case that the program cannot be found or run for any reason. Test: boots normally, reboots if command is not found or if command returns status '1' Change-Id: I1c99498c2b741512a50188e1a325c25e9ec8fba0
2019-08-28Merge "Revert "Reland: "init: run property service in a thread"""Tom Cherry
2019-08-28Revert "Reland: "init: run property service in a thread""Tom Cherry
This reverts commit 8efca4bbb378ff5bd3af06d8511ea75a7ed49f99. Reason for revert: Still broken Change-Id: I3b37b1b00ff4b19f2eec2d8bd72042463d47cee3
2019-08-28Merge "Reland: "init: run property service in a thread""Tom Cherry
2019-08-27Merge RP1A.190822.001Scott Lobdell
Change-Id: Ib450652d72bd41c9fd4fb24183dac97ef56f4f12
2019-08-27Merge changes I1c1445ba,Ic0c8b163Paul Crowley
* changes: Straighten out do_mkdir Convert fscrypt_set_directory_policy to C++
2019-08-26Reland: "init: run property service in a thread"Tom Cherry
It's been a long standing issue that init cannot respond to property set messages when it is running a builtin command. This is particularly problematic when the commands involve IPC to vold or other daemons, as it prevents them from being able to set properties. This change has init run property service in a thread, which eliminates the above issue. This change may also serve as a starting block to running property service in an entirely different process to better isolate init from handling property requests. Test: CF boots, walleye boots, properties are set appropriately Change-Id: I13b8bf240c9fcb1d2d5890a8be2f0ef74efd4adf
2019-08-26Merge "Move fscrypt_init_extensions into system/core"Treehugger Robot
2019-08-26Straighten out do_mkdirPaul Crowley
Use lstat(), and then make only the system calls needed to fix the directory up. Bug: 140027478 Test: boots twice, no worrying log messages. Change-Id: I1c1445baae3ec1c1ce17626ede388aa04d5f7781
2019-08-26Convert fscrypt_set_directory_policy to C++Paul Crowley
Bug: 140027478 Test: compiles, boots Change-Id: Ic0c8b163fe37b11787cab49cc2eea38a1de377e9
2019-08-26Move fscrypt_init_extensions into system/corePaul Crowley
Bug: 140027478 Test: treehugger Change-Id: I9f8b76a501be0b261b6fdd1da98447601e0fd32b
2019-08-26Revert "init: run property service in a thread"Tom Cherry
This reverts commit 26f5e7da3a8d99813d1db00bfb04e4ccd49e3221. Reason for revert: bluecross boot stability issue Bug: 140009641 Change-Id: I7ddb9509dfb2c6f644037129aa9d3fb9ff1740aa
2019-08-21init: run property service in a threadTom Cherry
It's been a long standing issue that init cannot respond to property set messages when it is running a builtin command. This is particularly problematic when the commands involve IPC to vold or other daemons, as it prevents them from being able to set properties. This change has init run property service in a thread, which eliminates the above issue. This change may also serve as a starting block to running property service in an entirely different process to better isolate init from handling property requests. Test: CF boots, walleye boots, properties are set appropriately Change-Id: Id9534a5916abb2f7d2a49cda54e33c1b69c50c2f
2019-08-15Revert "init: Handle properties in the background of calling fs_mgr"Tom Cherry
This reverts commit 71bdf2820ee0fbf698840f84fdd1255dbf8d3aee. Test: boot
2019-08-08Merge RP1A.190528.001Steven Laver
Change-Id: I31b3fcf7dfe4a5740870d57029d10413820f413e
2019-08-06Merge "init: ignore ENOENT from fewer builtins"Tom Cherry
2019-08-01init: check the arguments of builtins during the buildTom Cherry
Host init verifier already checks that the names and number of arguments for builtins are correct, but it can check more. This change ensures that property expansions are well formed, and that arguments that can be parsed on the host are correct. For example it checks that UIDs and GIDs exist, that numerical values can be parsed, and that rlimit strings are correct. Test: build Change-Id: Ied8882498a88a9f8324db6b8d1020aeeccc8177b
2019-07-30init: ignore ENOENT from fewer builtinsTom Cherry
Previously we were ignoring ENOENT from all builtins as rootdir/init.rc has many legacy commands that we need to keep for backwards compatibility, but are otherwise no longer relevant. However, this wasn't catching actual issues, for example chown failing due to not finding the user or group name. This change therefore reduces the scope of ignoring ENOENT to the only the extraneous errors in builtins. Test: boot CF and walleye without seeing errors from init.rc Test: see errors from invalid users/groups in chown Change-Id: Ia8e14fa2591e083cb1736c313a3e55515bc5d15e
2019-07-23init: simplify keyword_mapTom Cherry
I've heard that keyword_map is too complex, in particular the tuple and the pair in BuiltinFunctionMap, so this change removes a lot of that complexity and, more importantly, better documents how all of this works. Test: boot, init unit tests Change-Id: I74e5f9de7f2ec524cb6127bb9da2956b5f307f56
2019-07-22Ignore class_{reset|start}_post_data on non-updatable APEX.Martijn Coenen
For devices that use FDE and don't support updatable APEXes, don't stop and restart all processes - there is no need and it only increases boot time for these devices. Additionally, some daemons have never been restarted in the past, and restarting them exposes certain issues. Bug: 137251597 Bug: 136777273 Bug: 135627804 Test: verified manually w/ ro.updatable.apex=false CRs-Fixed: 2485762 Change-Id: I9590f2c2cdfab0a49f39846896460305d44221ee (cherry picked from commit 728586f5b23d830b1d14c61abcf85cd72dc95412)
2019-07-17Ignore class_{reset|start}_post_data on non-updatable APEX.Martijn Coenen
For devices that use FDE and don't support updatable APEXes, don't stop and restart all processes - there is no need and it only increases boot time for these devices. Additionally, some daemons have never been restarted in the past, and restarting them exposes certain issues. Bug: 137251597 Bug: 136777273 Bug: 135627804 Test: verified manually w/ ro.updatable.apex=false Change-Id: I9590f2c2cdfab0a49f39846896460305d44221ee
2019-07-09Fix a few clang-tidy issues and add NOLINT for othersTom Cherry
android-base: * Add NOLINT for expanding namespace std for std::string* ostream overload libdm: * Fix missing parentesis around macro parameters init: * Fix missing CLOEXEC usage and add NOLINT for the intended usages. * Fix missing parentesis around macro parameters * Fix erase() / remove_if() idiom * Correctly specific unsigned char when intended * 'namespace flags' should be signed, since 'flags' it signed for clone() * Add clear to property restore vector<string> to empty after move * Explicit comparison against 0 for strcmp Test: build Change-Id: I8c31dafda2c43ebc5aa50124cbbd6e23ed2c4101
2019-07-05init: fix to avoid loading apex *.rc files twiceJooyung Han
Test: adb shell dmesg | grep "init: Parsing file /apex" shows a single entry for each APEX'es *rc file Change-Id: I9006cc3d0cb7bdfe7532279f29d8095b7d16a807
2019-06-26init: clean up host_init_stubs a bitTom Cherry
In retrospect, these always should have been header only. We don't need setgroups() anymore either, since we have the right symbols now. Test: build Change-Id: If6fbf6f8ee288ed261576207d90a7ec5674853f9
2019-06-26init: remove last init.cpp globalTom Cherry
By moving it into builtins.cpp..., but that's less bad than it is now, especially since this is defunct in code targeting Q+. Remove the guards that init.h isn't being included by other files too as it's not useful anymore. Test: build Change-Id: Ic564fcff9e8716ec924098b07a8c9d94ca25f960
2019-06-26Split out ServiceList and ServiceParser from service.cpp/.hTom Cherry
These always should have been in their own files. Test: build Change-Id: I201109b5ee63016e78901bbfd404846d45e1d4e6
2019-06-24init: Handle properties in the background of calling fs_mgrTom Cherry
It's been a long standing problem that init calls fs_mgr functions synchronously and therefore stops handling properties, which causes deadlocks if either fs_mgr, or vdc, or vold attempt to set properties. Previous work, b/21904461, shows that there is a large performance penalty for adding any amount of locking to properties, so moving property service into its own thread generically is not a viable option. However, we can be sure that init is not setting properties while the fs_mgr functions are running, so we can poll the property socket in a thread while we call these functions. The other alternative would have been to separate the fs_mgr functions into smaller pieces and revisit the main init loop between each piece. Unfortunately, this would be difficult, since fs_mgr_mount_all() calls out to different processes via logwrapper, which synchronously polls on a logging FD from the child, among other complexities that would make this strategy much more difficult than it would be worth. Bug: 21904461 Test: device boots, including when setting property in fs_mgr_mount_all() Change-Id: Ib0b7123024035884f9d90f9b489c1e2f5a2e1707
2019-06-11Merge "Read *.rc files from flattened APEX"Treehugger Robot
2019-06-10init: replace Result<Success> with Result<void>Tom Cherry
Now that Result<T> is actually expected<T, ...>, and the expected proposal states expected<void, ...> as the way to indicate an expected object that returns either successfully with no object or an error, let's move init's Result<Success> to the preferred Result<void>. Bug: 132145659 Test: boot, init unit tests Change-Id: Ib2f98396d8e6e274f95a496fcdfd8341f77585ee
2019-06-10Read *.rc files from flattened APEXJiyong Park
This change fixes a bug that *.rc files in APEXes are not read when the APEXes are flattened. This was because init used "/apex/*@*/etc/*.rc" glob pattern to find the files, which gives 0 result with flattened APEXes; with flattend APEXes /system/apex is just bind-mounted to /apex, and therefore, the name@version directories don't exist. Fixing the issue by globing /apex/*/etc/*.rc and filter-out the paths with @ to avoid double parsing the *.rc files in case of non-flattend APEXes. Bug: 134067086 Test: revert I75ec6b69cca1cef071b50fac9a4cf8b8ceddb142 build sdk_gphone_x86_64 and record a video in the camera app. The recording works. `ps -A | grep media.swcodec` shows media.swcodec process. `atest CtsStatsdHostTestCases:android.cts.statsd.atom.UidAtomTests#testAudioState` passes Test: build sdk_phone_x86_64 and do the same. Change-Id: I00af1910a8e8a330addc4c6903e5f3695aeb6865
2019-05-29init: Refactor selinux.h/cppVic Yang
This change factors out functions that handle selabels from selinux.h/cpp into selabel.h/cpp. This allows util.cpp to be used by the upcoming native zygote without a bunch of define flags that are required for selinux.cpp. Bug: 133443795 Test: Build and boot cuttlefish. Change-Id: Ie238a96c6407c6698a605dd8803c1727abfaae7b
2019-05-23Merge QP1A.190523.001Scott Lobdell
Change-Id: I9a00cf883d9f1905f771c33b7ef3d5b57ada6e07
2019-05-21init: don't import rc files during mount_all after QTom Cherry
Importing rc files during mount_all was at best a stop gap until Treble's first stage mount and at worst a bad idea. It doesn't have a reason to exist now that first stage mount exists and is required, and always had edge cases where init could not handle loading some aspects of scripts after it had started processing actions. This change removes this functionality for devices launching after Q. Test: devices boot Change-Id: I3181289572968637b884e150d36651f453d40362
2019-05-16class_start_post_data also starts disabled services.Martijn Coenen
This keyword was introduced to support restarting services on devices using APEX and FDE. The current implementation is not a restart, but rather a 'reset' followed by a 'start', because the real /data must be mounted in-between those two actions. But we effectively want this to be a restart, which means that we also want to start 'disabled' services that were running at the time we called 'class_reset_post_data'. To implement this, keep track of whether a service was running when its class was reset at post-data, and start all those services. Bug: 132592548 Test: manual testing on FDE Taimen Change-Id: I1e81e2c8e0ab2782150073d74e50e4cd734af7b9 Merged-In: I1e81e2c8e0ab2782150073d74e50e4cd734af7b9
2019-05-15class_start_post_data also starts disabled services.Martijn Coenen
This keyword was introduced to support restarting services on devices using APEX and FDE. The current implementation is not a restart, but rather a 'reset' followed by a 'start', because the real /data must be mounted in-between those two actions. But we effectively want this to be a restart, which means that we also want to start 'disabled' services that were running at the time we called 'class_reset_post_data'. To implement this, keep track of whether a service was running when its class was reset at post-data, and start all those services. Bug: 132592548 Test: manual testing on FDE Taimen Change-Id: I1e81e2c8e0ab2782150073d74e50e4cd734af7b9