summaryrefslogtreecommitdiff
path: root/init/init_parser.cpp
AgeCommit message (Collapse)Author
2017-07-27init: remove Parser singleton and related cleanupTom Cherry
* Remove the Parser singleton (Hooray!) * Rename parser.* to tokenizer.* as this is actually a tokenizer * Rename init_parser.* to parser.* as this is a generic parser * Move contents of init_parser_test.cpp to service_test.cpp as this actually is a test of the parsing in MakeExecOneshotService() and nothing related to (init_)parser.cpp Test: boot bullhead Test: bool sailfish Test: init unit tests Change-Id: I4fe39e6483f58ebd3ce5ee715a45dbba0acf5d91
2017-07-10Move Timer from init to libbaseTom Cherry
Test: boot bullhead Test: new libbase unit tests Change-Id: Ic398a1daa1fe92c10ea7bc1e6ac3f781cee9a5b5
2017-06-23init: create android::init:: namespaceTom Cherry
With some small fixups along the way Test: Boot bullhead Test: init unit tests Change-Id: I7beaa473cfa9397f845f810557d1631b4a462d6a
2017-05-05init: do not log directly from read_file() and write_file()Tom Cherry
Their callers may be able to add more context, so use an error string to record the error. Bug: 38038887 Test: boot bullhead Test: Init unit tests Change-Id: I46690d1c66e00a4b15cadc6fd0d6b50e990388c3
2017-04-25init: remove unused parts of parser.cppTom Cherry
Now that ueventd is using init's parser, we no longer need anything other than the tokenizer from parser.cpp. Test: Boot bullhead Change-Id: I1f70f2c4479af576174bd74dd919d81817500216
2017-04-25init: add Parser::AddSingleLineParser()Tom Cherry
Add the ability to override the current section being parsed and instead parse a line by itself if a given line starts with a specific prefix. Test: Boot bullhead Change-Id: Idbbf2682b78996b41d05f3db655c8937a8c6ccda
2017-04-21init: clean up the SectionParser interface and Parser classTom Cherry
Remove the dependency on Action and Service from what should be a generic Parser class. Make ActionParser, ImportParser, and ServiceParser take a pointer to their associated classes instead of accessing them through a singleton. Misc fixes to SectionParser Interface: 1) Make SectionParser::ParseLineSection() non-const as it always should have been. 2) Use Rvalue references where appropriate 3) Remove extra std::string& filename in SectionParser::EndFile() 4) Only have SectionParser::ParseSection() as pure virtual Document SectionParser. Make ImportParser report the filename and line number of failed imports. Make ServiceParser report the filename and line number of duplicated services. Test: Boot bullhead Change-Id: I86568a5b375fb4f27f4cb235ed1e37635f01d630
2017-04-19init: Stop combining actionsTom Cherry
In the past, I had thought it didn't make sense to have multiple Action classes with identical triggers within ActionManager::actions_, and opted to instead combine these into a single action. In theory, it should reduce memory overhead as only one copy of the triggers needs to be stored. In practice, this ends up not being a good idea. Most importantly, given a file with the below three sections in this same order: on boot setprop a b on boot && property:true=true setprop c d on boot setprop e f Assuming that property 'true' == 'true', when the `boot` event happens, the order of the setprop commands will actually be: setprop a b setprop e f setprop c d instead of the more intuitive order of: setprop a b setprop c d setprop e f This is a mistake and this CL fixes it. It also documents this order. Secondly, with a given 'Action' now spanning multiple files, in order to keep track of which file a command is run from, the 'Command' itself needs to store this. Ironically to the original intention, this increases total ram usage. This change now only stores the file name in each 'Action' instead of each 'Command'. All in all this is a negligible trade off of ram usage. Thirdly, this requires a bunch of extra code and assumptions that don't help anything else. In particular it forces to keep property triggers sorted for easy comparison, which I'm using an std::map for currently, but that is not the best data structure to contain them. Lastly, I added the filename and line number to the 'processing action' LOG(INFO) message. Test: Boot bullhead, observe above changes Test: Boot sailfish, observe no change in boot time Change-Id: I3fbcac4ee677351314e33012c758145be82346e9
2017-04-06init: more header cleanupTom Cherry
Remove includes of "log.h" that really want <android-base/logging.h> Fix header include order Remove headers included in .cpp files that their associated .h already includes Remove some unused headers Test: boot bullhead Change-Id: I2b415adfe86a5c8bbe4fb1ebc53c7b0ee2253824
2017-04-03init: Use std::string for write_file()Tom Cherry
The content parameter of write_file() previously took a char* that was then converted to a std::string in WriteStringToFd(). One unfortunate effect of this, is that it is impossible to write data that contains '\0' within it, as the new string will only contain characters up until the '\0'. This changes write_file() to take an std::string, such that std::string::size() is used to determine the length of the string, allowing it to contain null characters. Also change the path parameter of read_file() and write_file() for consistency. Lastly, add a test for handling strings with '\0' in them. Bug: 36726045 Test: Boot bullhead, run unit tests Change-Id: Idad60e4228ee2de741ab3ab6a4917065b5e63cd8
2017-03-13init: fix DumpState() loggingTom Cherry
Fix two formatting issues in Action::DumpState(), Old: on ro.crypto.state=encrypted ro.crypto.type=file zygote-start New: on ro.crypto.state=encrypted && ro.crypto.type=file && zygote-start Old: on boot %sifup lo %shostname localhost %sdomainname localdomain %swrite /proc/sys/vm/overcommit_memory 1 New: on boot ifup lo hostname localhost domainname localdomain write /proc/sys/vm/overcommit_memory 1 Also, now that we're importing many small rc files, it no longer makes sense to call Parser::DumpState() after each import. Therefore, move the conditional to call Parser::DumpState() to after /init.rc and its imports are parsed and after the late imports are parsed. Test: Boot bullhead with DumpState() enabled and check the output Change-Id: I0b81305b8938aa1a7133d7dd2055f34f47609cf9
2016-12-03Replace the "coldboot" timeout with a property.Elliott Hughes
Also rename init's existing boot-time related properties so they're all "ro.*" properties. Example result: # Three properties showing when init started... [ro.boottime.init]: [5294587604] # ...how long it waited for ueventd... [ro.boottime.init.cold_boot_wait]: [646956470] # ...and how long SELinux initialization took... [ro.boottime.init.selinux]: [45742921] # Plus one property for each service, showing when it first started. [ro.boottime.InputEventFind]: [10278767840] [ro.boottime.adbd]: [8359267180] [ro.boottime.atfwd]: [10338554773] [ro.boottime.audioserver]: [10298157478] [ro.boottime.bootanim]: [9323670089] [ro.boottime.cameraserver]: [10299402321] [ro.boottime.cnd]: [10335931856] [ro.boottime.debuggerd]: [7001352774] [ro.boottime.debuggerd64]: [7002261785] [ro.boottime.drm]: [10301082113] [ro.boottime.fingerprintd]: [10331443314] [ro.boottime.flash-nanohub-fw]: [6995265534] [ro.boottime.gatekeeperd]: [10340355242] [ro.boottime.healthd]: [7856893380] [ro.boottime.hwservicemanager]: [7856051088] [ro.boottime.imscmservice]: [10290530758] [ro.boottime.imsdatadaemon]: [10358136702] [ro.boottime.imsqmidaemon]: [10289084872] [ro.boottime.installd]: [10303296020] [ro.boottime.irsc_util]: [10279807632] [ro.boottime.keystore]: [10305034093] [ro.boottime.lmkd]: [7863506714] [ro.boottime.loc_launcher]: [10324525241] [ro.boottime.logd]: [6526221633] [ro.boottime.logd-reinit]: [7850662702] [ro.boottime.mcfg-sh]: [10337268315] [ro.boottime.media]: [10312152687] [ro.boottime.mediacodec]: [10306852530] [ro.boottime.mediadrm]: [10308707999] [ro.boottime.mediaextractor]: [10310681177] [ro.boottime.msm_irqbalance]: [7862451974] [ro.boottime.netd]: [10313523104] [ro.boottime.netmgrd]: [10285009351] [ro.boottime.oem_qmi_server]: [10293329092] [ro.boottime.per_mgr]: [7857915776] [ro.boottime.per_proxy]: [8335121605] [ro.boottime.perfd]: [10283443101] [ro.boottime.qcamerasvr]: [10329644772] [ro.boottime.qmuxd]: [10282346643] [ro.boottime.qseecomd]: [6855708593] [ro.boottime.qti]: [10286196851] [ro.boottime.ril-daemon]: [10314933677] [ro.boottime.rmt_storage]: [7859105047] [ro.boottime.servicemanager]: [7864555881] [ro.boottime.ss_ramdump]: [8337634938] [ro.boottime.ssr_setup]: [8336268324] [ro.boottime.surfaceflinger]: [7866921402] [ro.boottime.thermal-engine]: [10281249924] [ro.boottime.time_daemon]: [10322006542] [ro.boottime.ueventd]: [5618663938] [ro.boottime.vold]: [7003493920] [ro.boottime.wificond]: [10316641073] [ro.boottime.wpa_supplicant]: [18959816881] [ro.boottime.zygote]: [10295295029] [ro.boottime.zygote_secondary]: [10296637269] Bug: http://b/31800756 Test: boots Change-Id: I094cce0c1bab9406d950ca94212689dc2e15dba5
2016-10-07Traverse /etc/init in a well-defined orderGlenn Kasten
Bug: 31996208 Test: will need a CTS, not yet done Change-Id: I5ecc7f0519d42a83065b7b97a31cdb5b33549cda
2016-06-27Move init to libbase logging.Elliott Hughes
Change-Id: Ibfbefeff587a69e948978a037c555fd12a5ade6a
2015-12-04Track rename of base/ to android-base/.Elliott Hughes
Change-Id: Idf9444fece4aa89c93e15640de59a91f6e758ccf
2015-10-09init shouldn't call DumpState by default.Elliott Hughes
The cost of generating and throwing away a bunch of stuff that no one normally sees is high enough to be worth avoiding. Here's AOSP ToT on N9... init: (Parsing /system/etc/init/atrace.rc took 0.0112s.) init: (Parsing /system/etc/init/bootanim.rc took 0.0094s.) init: (Parsing /system/etc/init/crash_reporter.rc took 0.0103s.) init: (Parsing /system/etc/init/debuggerd.rc took 0.0090s.) init: (Parsing /system/etc/init/debuggerd64.rc took 0.0085s.) init: (Parsing /system/etc/init/drmserver.rc took 0.0078s.) init: (Parsing /system/etc/init/dumpstate.rc took 0.0073s.) init: (Parsing /system/etc/init/gatekeeperd.rc took 0.0063s.) init: (Parsing /system/etc/init/installd.rc took 0.0067s.) init: (Parsing /system/etc/init/keystore.rc took 0.0060s.) init: (Parsing /system/etc/init/lmkd.rc took 0.0060s.) init: (Parsing /system/etc/init/logcatd.rc took 0.0059s.) init: (Parsing /system/etc/init/logd.rc took 0.0068s.) init: (Parsing /system/etc/init/mdnsd.rc took 0.0057s.) init: (Parsing /system/etc/init/mediaserver.rc took 0.0064s.) init: (Parsing /system/etc/init/metrics_daemon.rc took 0.0063s.) init: (Parsing /system/etc/init/mtpd.rc took 0.0055s.) init: (Parsing /system/etc/init/netd.rc took 0.0066s.) init: (Parsing /system/etc/init/perfprofd.rc took 0.0057s.) init: (Parsing /system/etc/init/racoon.rc took 0.0054s.) init: (Parsing /system/etc/init/rild.rc took 0.0061s.) init: (Parsing /system/etc/init/servicemanager.rc took 0.0063s.) init: (Parsing /system/etc/init/surfaceflinger.rc took 0.0061s.) init: (Parsing /system/etc/init/uncrypt.rc took 0.0068s.) init: (Parsing /system/etc/init/vdc.rc took 0.0065s.) init: (Parsing /system/etc/init/vold.rc took 0.0063s.) 0.0112+0.0094+0.0103+0.0090+0.0085+0.0078+0.0073+0.0063+0.0067+0.0060+ 0.0060+0.0059+0.0068+0.0057+0.0064+0.0063+0.0055+0.0066+0.0057+0.0054+ 0.0061+0.0063+0.0061+0.0068+0.0065+0.0063 = 0.1809 And here it is again with the logging disabled: init: (Parsing /system/etc/init/atrace.rc took 0.0021s.) init: (Parsing /system/etc/init/bootanim.rc took 0.0006s.) init: (Parsing /system/etc/init/crash_reporter.rc took 0.0007s.) init: (Parsing /system/etc/init/debuggerd.rc took 0.0004s.) init: (Parsing /system/etc/init/debuggerd64.rc took 0.0005s.) init: (Parsing /system/etc/init/drmserver.rc took 0.0005s.) init: (Parsing /system/etc/init/dumpstate.rc took 0.0005s.) init: (Parsing /system/etc/init/gatekeeperd.rc took 0.0005s.) init: (Parsing /system/etc/init/installd.rc took 0.0005s.) init: (Parsing /system/etc/init/keystore.rc took 0.0013s.) init: (Parsing /system/etc/init/lmkd.rc took 0.0006s.) init: (Parsing /system/etc/init/logcatd.rc took 0.0013s.) init: (Parsing /system/etc/init/logd.rc took 0.0007s.) init: (Parsing /system/etc/init/mdnsd.rc took 0.0005s.) init: (Parsing /system/etc/init/mediaserver.rc took 0.0009s.) init: (Parsing /system/etc/init/metrics_daemon.rc took 0.0008s.) init: (Parsing /system/etc/init/mtpd.rc took 0.0011s.) init: (Parsing /system/etc/init/netd.rc took 0.0005s.) init: (Parsing /system/etc/init/perfprofd.rc took 0.0005s.) init: (Parsing /system/etc/init/racoon.rc took 0.0005s.) init: (Parsing /system/etc/init/rild.rc took 0.0005s.) init: (Parsing /system/etc/init/servicemanager.rc took 0.0005s.) init: (Parsing /system/etc/init/surfaceflinger.rc took 0.0005s.) init: (Parsing /system/etc/init/uncrypt.rc took 0.0005s.) init: (Parsing /system/etc/init/vdc.rc took 0.0005s.) init: (Parsing /system/etc/init/vold.rc took 0.0006s.) 0.0021+0.0006+0.0007+0.0004+0.0005+0.0005+0.0005+0.0005+0.0005+0.0013+ 0.0006+0.0013+0.0007+0.0005+0.0009+0.0008+0.0011+0.0005+0.0005+0.0005+ 0.0005+0.0005+0.0005+0.0005+0.0005+0.0006 = 0.0181 It's less than a second, but one problem is that the cost of the current dumping is proportional to the number of init.rc files, so the more cleanly you factor things, the more it would cost. Change-Id: Id96f59e7d0b082d8cfdba4bdbff43a922ba4eeee
2015-09-01init: Use classes for parsing and clean up memory allocationsTom Cherry
Create a Parser class that uses multiple SectionParser interfaces to handle parsing the different sections of an init rc. Create an ActionParser and ServiceParser that implement SectionParser and parse the sections corresponding to Action and Service classes. Remove the legacy keyword structure and replace it with std::map's that map keyword -> (minimum args, maximum args, function pointer) for Commands and Service Options. Create an ImportParser that implements SectionParser and handles the import 'section'. Clean up the unsafe memory handling of the Action class by using std::unique_ptr. Change-Id: Ic5ea5510cb956dbc3f78745a35096ca7d6da7085
2015-08-10init: replace strdup() in parse_config()Tom Cherry
Previously, the action, command, and service structs contained char*s that referenced memory within the buffer returned by the strdup() of the input buffer of parse_config. This prevented this entire memory region from being freed, leaking contents that would never be referenced again. The changes to convert the previous action, command, and service structs to C++ classes created explicit ownership of the contents within each class in the form of std::strings. With these changes, there are no remaining references to the memory allocated by this strdup(), which can now be freed. This commit replaces the strdup() with std::vector<char> to allow for the copied string to be freed when it goes out of scope instead of relying on the C strdup() and free() functions. Change-Id: Id0a5f711e33363082ba201afda6b26043998cb1c
2015-08-07Create Service and ServiceManager classesTom Cherry
Change-Id: I363a5e4751ad83d2f4096882a6fbbeddca03acfe
2015-07-31init: use std::vector<std::string> for argument passingTom Cherry
Change-Id: Ie7a64e65de3a20d0c7f7d8efc0f7c1ba121d07fe
2015-07-30init: Create classes for Action and CommandTom Cherry
This creates the concept of 'event_trigger' vs 'property_trigger' Previously these were merged into one, such that 'on property:a=b && property:b=c' is triggered when properties a=b and b=c as expected, however combinations such as 'on early-boot && boot' would trigger during both early-boot and boot. Similarly, 'on early-boot && property:a=b' would trigger on both early-boot and again when property a equals b. The event trigger distinction ensures that the first example fails to parse and the second example only triggers on early-boot if property a equals b. This coalesces Actions with the same triggers into a single Action object Change-Id: I8f661d96e8a2d40236f252301bfe10979d663ea6
2015-07-27init: Adding support to import directoriesLee Campbell
Support added so init scripts can now import directories. BUG: 22721249 Change-Id: I02b566bfb50ea84469f1ea0c6ad205435a1df286 TEST: Tested importing a folder on arm64 emulator
2015-07-24init: do expand_props before calling the builtins.Yabin Cui
Also switch expand_props to std::string. Bug: 22654233 Change-Id: I62910d4f74e2b1a5bd2b14aea440767a2a8462b7
2015-07-24init: Let property_get return std::string.Yabin Cui
Bug: 22654233 Change-Id: Id6091f58432f75e966b9871256049fbe17766c10
2015-06-17init support for cgroups.Elliott Hughes
This adds the "writepid" option that instructs init to write the child's pid to the given filenames (such as /dev/cpuctl/bg_non_interactive/cgroup.procs and/or /dev/cpuset/foreground/cgroup.procs). Bug: http://b/21163745 Change-Id: I121bb22aa208bc99c4fb334eb552fdd5bcc47c1a
2015-06-02init: change exec parsing to make SECLABEL optionalMark Salyzyn
Allow SECLABEL to be - to denote default Change-Id: I58cdc6c805dc6e50dc42b7e13e72d0eaf4864f11
2015-05-12Fix insmod module sizeTom Cherry
read_file() used to append a new line character to the end of the buffer it returns, because parse_config() isn't able to cope with input that's not '\n'-terminated. Fix read_file() to be less insane, and push the workarounds into the parse_config() callers. Longer term we should rewrite parse_config(). Change-Id: Ie9d9a7adcd33b66621726aef20c4b8cc51c08be7
2015-05-07Clean up init /proc/cmdline handling.Elliott Hughes
Helped debug a problem where the N9 bootloader incorrectly concatenated the various command lines. Bug: http://b/20906691 Change-Id: I0580b06f4185129c7eedf0bdf74b5ce17f88bf9c
2015-04-24Revert "Revert "Remove now-unusable 'setcon' command.""Elliott Hughes
This reverts commit b862bd00a4192d48c3ae82156d8c35b32283e9e4. This change was fine but an earlier change it depended on was broken. That change has been fixed and resubmitted. Bug: http://b/19702273 Change-Id: I17e565721026e48e2a73526f729f2481d4d6edb5
2015-04-24Revert "Remove now-unusable 'setcon' command."Nick Kralevich
Temporarily revert because device isn't booting. This reverts commit 7b15ac99f3bfef33c82ea109487c99a77b41ebfb. Change-Id: Ice986bac62e20c70f7bedf1744a617b97392ae8c
2015-04-23Remove now-unusable 'setcon' command.Elliott Hughes
Bug: http://b/19702273 Change-Id: Icd340c80ba074476dcc63f1c1dd5c61a5c768893
2015-04-13Fix memory leak in parse_actionTom Cherry
Change-Id: I3ed1da5674ae0b4ac50c1925e4f63af7f1748483
2015-04-03Remove execonce.Elliott Hughes
Use 'exec' instead. Change-Id: I1320d1971f7cd8b23753c27aa87089006e112a11
2015-04-01Merge "Remove no-op "capabilities"."Elliott Hughes
2015-04-01Remove no-op "capabilities".Elliott Hughes
This never worked, and implementing it would just be an attempt to cling to the pre-SELinux past. Change-Id: Iecba2affa50ee49ccf62677a607bfae95cb0aaf7
2015-03-31Revert "Revert "Adding e4crypt support""Paul Lawrence
Fix build break caused by original change This reverts commit 84b0bab58fcc7f225e9a17a15c531b0c2fc509c5. Change-Id: I99fbd7c3d1ed92db1f546033c8493bb71a327924
2015-03-28Log more timing information from init.Elliott Hughes
Also make important events in init's life NOTICE rather than INFO, and ensure that NOTICE events actually make it to the kernel log. Also fix the logging so that if you have a printf format string error, the compiler now catches it. Also give messages from init, ueventd, and watchdogd distinct tags. (Previously they'd all call themselves "init", and dmesg doesn't include pids, so you couldn't untangle them.) Also include the tag in SELinux messages. Bug: 19544788 Change-Id: Ica6daea065bfdb80155c52c0b06f346a7df208fe
2015-03-24init: missing break statementMark Salyzyn
Change-Id: Iac4a19c404590c3faba6021c7e537b01805c2d45
2015-03-19Add init command to set verified propertiesSami Tolvanen
Add a command that updates dm-verity state and sets partition.%.verified properties used by adb remount. This is needed in init since fs_mgr cannot set properties: I6a28cccb1ccce960841af20a4b20c32d424b5524 Change-Id: I0fdf5bc29c56690dcadff9d0eb216d3c68483538
2015-03-18Remove chroot from init.Elliott Hughes
This is not obviously useful. Let's wait until we have an actual need. Change-Id: I2c75c96314b281e89df25b6ed202b3dd5dfdaf15
2015-03-15Remove chdir from init.Elliott Hughes
Change-Id: Ib2880c6cb18db613deac04ee3b06b9719f5248b9
2015-03-13Remove obsolete setkey.Elliott Hughes
It's undocumented and unused. Change-Id: I685dc900adbc14f2e8b4eeebb1e4d111782f141d
2015-03-13Remove getsebool/setsebool from init and toolbox.Stephen Smalley
These were leftovers from the SELinux boolean support that was originally merged. Since Android prohibits SELinux policy booleans, we can just drop it. Change-Id: I02f646a7d8db65e153702205b082b87a73f60d73 Signed-off-by: Stephen Smalley <sds@tycho.nsa.gov>
2015-03-11builtins: remove setenforce commandNick Kralevich
Adding "setenforce 0" to init.rc isn't a supported way to turn off SELinux, and doesn't work with AOSP SELinux policy. Remove the code from init. Change-Id: If8c8149560789c9a7ba518a0a100e6033bb68898
2015-03-11Merge "Implement exec."Elliott Hughes
2015-03-04Add init support for dm-verity logging modeSami Tolvanen
Add a built-in command for loading verity state. If dm-verity will be started in logging mode, trigger verity-logging. Needs changes from Ibb82953594d234f81ad21c40f524190b88e4ac8f Change-Id: I5af4918f2f14fdd4d07f51c55837e08111fd3748
2015-02-25Implement exec.Elliott Hughes
Change-Id: I20329bc9b378479d745b498d6a00eca0872cd5ab
2015-02-12bootchart: fix bootchart can not be triggered problemYongqin Liu
bootchart uses a file on the data partition to decide if it should collect data for bootchart, but the data partition will be mounted by the mount_all command in the "on fs" section, and it will be only added into the action queue when command "trigger fs" is executed, but that's after the bootchart_init action (late_init). This change makes bootchart_init a builtin command of init, and make it executed as the first command of "on post-fs" section which will be triggered after the "on fs" section. This change also refactors the bootchart code to all be in bootchart.cpp. Change-Id: Ia74aa34ca5b785f51fcffdd383075a549b2a99d9 Signed-off-by: Yongqin Liu <yongqin.liu@linaro.org>
2015-02-06Clean up reading and writing in init.Elliott Hughes
This isn't particularly useful in and of itself, but it does introduce the first (trivial) unit test, improves the documentation (including details about how to debug init crashes), and made me aware of how unpleasant the existing parser is. I also fixed a bug in passing --- unless you thought the "peboot" and "pm" commands were features... Bug: 19217569 Change-Id: I6ab76129a543ce3ed3dab52ef2c638009874c3de
2015-02-04Stop using #if for conditional compilation.Elliott Hughes
Use regular 'if' to prevent bitrot. Also remove remaining typedefs. Change-Id: I2e6ca928e2db29b88b643cf990ff05cfb0be94a6