diff --git a/services/BUILD.gn b/services/BUILD.gn index c0bcef5d694bd7b31249682033b83ed95982d002..8f75903c18fd8e7f7210876d75dd5e5edae9c0d6 100644 --- a/services/BUILD.gn +++ b/services/BUILD.gn @@ -156,12 +156,30 @@ if (defined(ohos_lite)) { part_name = "init" } + ohos_prebuilt_etc("init.usb.cfg") { + source = "//base/startup/init_lite/services/etc/init.usb.cfg" + part_name = "init" + } + + ohos_prebuilt_etc("init.usb.configfs.cfg") { + source = "//base/startup/init_lite/services/etc/init.usb.configfs.cfg" + part_name = "init" + } + + ohos_prebuilt_etc("init.Hi3516DV300.usb.cfg") { + source = "//device/hisilicon/hi3516dv300/build/rootfs/init.Hi3516DV300.usb.cfg" + part_name = "init" + } + group("startup_init") { deps = [ ":init", ":init.cfg", ":passwd", ":init.Hi3516DV300.cfg", + ":init.usb.cfg", + ":init.usb.configfs.cfg", + ":init.Hi3516DV300.usb.cfg", ":updaterueventd", "//base/startup/init_lite/services/param:getparam", "//base/startup/init_lite/services/param:paramclient", diff --git a/services/etc/init.cfg b/services/etc/init.cfg index 657a7bca3c2702ed69b494ac82b27efbf7a24504..cf96169dee08efeb3127930c706b2302ffa31db0 100755 --- a/services/etc/init.cfg +++ b/services/etc/init.cfg @@ -5,7 +5,10 @@ "/init.${ro.hardware}.cfg", "/init.Hi3516DV300.cfg", "/init.usb.configfs.cfg", - "/init.${ro.zygote}.cfg" + "/init.${ro.zygote}.cfg", + "/init.Hi3516DV300.usb.cfg", + "/init.usb.configfs.cfg", + "/init.usb.cfg" ], "jobs" : [{ "name" : "pre-init", @@ -17,15 +20,15 @@ "mkdir /dev/memcg/apps/ 0755 system system", "mkdir /dev/memcg/system 0550 system system", "start ueventd", - "start console", "mkdir /vendor", "mkdir /data", "mount ext4 /dev/block/platform/soc/10100000.himci.eMMC/by-name/vendor /vendor wait rdonly barrier=1", - "mount ext4 /dev/block/platform/soc/10100000.himci.eMMC/by-name/userdata /data wait nosuid nodev noatime barrier=1,data=o rdered,noauto_da_alloc" + "mount ext4 /dev/block/platform/soc/10100000.himci.eMMC/by-name/userdata /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc" ] }, { "name" : "init", "cmds" : [ + "start console", "copy /proc/cmdline /dev/urandom", "copy /system/etc/prop.default /dev/urandom", "symlink /proc/self/fd/0 /dev/stdin", @@ -554,6 +557,7 @@ "name" : "console", "path" : ["/system/bin/sh"], "disabled" : 1, + "console" : 1, "uid" : "root", "gid" : ["shell", "log", "readproc"] }, { diff --git a/services/etc/init.usb.cfg b/services/etc/init.usb.cfg new file mode 100755 index 0000000000000000000000000000000000000000..a71a74418ded0d35632cbbd9f4cfc13de772dd87 --- /dev/null +++ b/services/etc/init.usb.cfg @@ -0,0 +1,161 @@ +{ + "jobs" : [{ + "name" : "post-fs-data", + "cmds" : [ + "chown system system /sys/class/android_usb/android0/f_mass_storage/lun/file", + "chmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun/file", + "chown system system /sys/class/android_usb/android0/f_rndis/ethaddr", + "chmod 0660 /sys/class/android_usb/android0/f_rndis/ethaddr", + "mkdir /data/misc/adb 02750 system shell", + "mkdir /data/adb 0700 root root", + "start adbd" + ] + }, { + "name" : "boot", + "cmds" : [ + "setparam sys.usb.configfs 0" + ] + }, { + "name" : "property:sys.usb.config=none && property:sys.usb.configfs=0", + "condition" : "sys.usb.config=none && sys.usb.configfs=0", + "cmds" : [ + "stop adbd", + "write /sys/class/android_usb/android0/enable 0", + "write /sys/class/android_usb/android0/bDeviceClass 0", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=adb && property:sys.usb.configfs=0", + "condition" : "sys.usb.config=adb && sys.usb.configfs=0", + "cmds" : [ + "write /sys/class/android_usb/android0/enable 0", + "write /sys/class/android_usb/android0/idVendor 18d1", + "write /sys/class/android_usb/android0/idProduct 4EE7", + "write /sys/class/android_usb/android0/functions ${sys.usb.config}", + "write /sys/class/android_usb/android0/enable 1", + "start adbd", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=accessory && property:sys.usb.configfs=0", + "condition" : "sys.usb.config=accessory && sys.usb.configfs=0", + "cmds" : [ + "write /sys/class/android_usb/android0/enable 0", + "write /sys/class/android_usb/android0/idVendor 18d1", + "write /sys/class/android_usb/android0/idProduct 2d00", + "write /sys/class/android_usb/android0/functions ${sys.usb.config}", + "write /sys/class/android_usb/android0/enable 1", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=accessory,adb && property:sys.usb.configfs=0", + "condition" : "sys.usb.config=accessory,adb && sys.usb.configfs=0", + "cmds" : [ + "write /sys/class/android_usb/android0/enable 0", + "write /sys/class/android_usb/android0/idVendor 18d1", + "write /sys/class/android_usb/android0/idProduct 2d01", + "write /sys/class/android_usb/android0/functions ${sys.usb.config}", + "write /sys/class/android_usb/android0/enable 1", + "start adbd", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=audio_source && property:sys.usb.configfs=0", + "condition" : "sys.usb.config=audio_source && sys.usb.configfs=0", + "cmds" : [ + "write /sys/class/android_usb/android0/enable 0", + "write /sys/class/android_usb/android0/idVendor 18d1", + "write /sys/class/android_usb/android0/idProduct 2d02", + "write /sys/class/android_usb/android0/functions ${sys.usb.config}", + "write /sys/class/android_usb/android0/enable 1", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=0", + "condition" : "sys.usb.config=audio_source,adb && sys.usb.configfs=0", + "cmds" : [ + "write /sys/class/android_usb/android0/enable 0", + "write /sys/class/android_usb/android0/idVendor 18d1", + "write /sys/class/android_usb/android0/idProduct 2d03", + "write /sys/class/android_usb/android0/functions ${sys.usb.config}", + "write /sys/class/android_usb/android0/enable 1", + "start adbd", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=accessory,audio_source && property:sys.usb.configfs=0", + "condition" : "sys.usb.config=accessory,audio_source && sys.usb.configfs=0", + "cmds" : [ + "write /sys/class/android_usb/android0/enable 0", + "write /sys/class/android_usb/android0/idVendor 18d1", + "write /sys/class/android_usb/android0/idProduct 2d04", + "write /sys/class/android_usb/android0/functions ${sys.usb.config}", + "write /sys/class/android_usb/android0/enable 1", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=0", + "condition" : "sys.usb.config=accessory,audio_source,adb && sys.usb.configfs=0", + "cmds" : [ + "write /sys/class/android_usb/android0/enable 0", + "write /sys/class/android_usb/android0/idVendor 18d1", + "write /sys/class/android_usb/android0/idProduct 2d05", + "write /sys/class/android_usb/android0/functions ${sys.usb.config}", + "write /sys/class/android_usb/android0/enable 1", + "start adbd", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.typec.mode=dfp", + "condition" : "sys.usb.typec.mode=dfp", + "cmds" : [ + "write /sys/class/dual_role_usb/otg_default/mode ${sys.usb.typec.mode}", + "setparam sys.usb.typec.state ${sys.usb.typec.mode}" + ] + }, { + "name" : "property:sys.usb.typec.mode=ufp", + "condition" : "sys.usb.typec.mode=ufp", + "cmds" : [ + "write /sys/class/dual_role_usb/otg_default/mode ${sys.usb.typec.mode}", + "setparam sys.usb.typec.state ${sys.usb.typec.mode}" + ] + }, { + "name" : "property:sys.usb.typec.data_role=device", + "condition" : "sys.usb.typec.data_role=device", + "cmds" : [ + "write /sys/class/dual_role_usb/otg_default/data_role ${sys.usb.typec.data_role}", + "setparam sys.usb.typec.state ${sys.usb.typec.data_role}" + ] + }, { + "name" : "property:sys.usb.typec.data_role=host", + "condition" : "sys.usb.typec.data_role=host", + "cmds" : [ + "write /sys/class/dual_role_usb/otg_default/data_role ${sys.usb.typec.data_role}", + "setparam sys.usb.typec.state ${sys.usb.typec.data_role}" + ] + }, { + "name" : "property:sys.usb.typec.power_role=source", + "condition" : "sys.usb.typec.power_role=source", + "cmds" : [ + "write /sys/class/dual_role_usb/otg_default/power_role ${sys.usb.typec.power_role}", + "setparam sys.usb.typec.state ${sys.usb.typec.power_role}" + ] + }, { + "name" : "property:sys.usb.typec.power_role=sink", + "condition" : "sys.usb.typec.power_role=sink", + "cmds" : [ + "write /sys/class/dual_role_usb/otg_default/power_role ${sys.usb.typec.power_role}", + "setparam sys.usb.typec.state ${sys.usb.typec.power_role}" + ] + } + ], + "services" : [{ + "name" : "adbd", + "path" : ["/system/bin/hdcd"], + "socket" : [ + "adbd seqpacket 660 system system false" + ], + "disabled" : 1 + } + ] +} diff --git a/services/etc/init.usb.configfs.cfg b/services/etc/init.usb.configfs.cfg new file mode 100755 index 0000000000000000000000000000000000000000..823cbfaa6217575dc76d6692e8499c6738c498a6 --- /dev/null +++ b/services/etc/init.usb.configfs.cfg @@ -0,0 +1,220 @@ +{ + "jobs" : [{ + "name" : "property:sys.usb.config=none && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=none && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/UDC \"none\"", + "stop adbd", + "setparam sys.usb.ffs.ready 0", + "write /config/usb_gadget/g1/bDeviceClass 0", + "write /config/usb_gadget/g1/bDeviceSubClass 0", + "write /config/usb_gadget/g1/bDeviceProtocol 0", + "rm /config/usb_gadget/g1/configs/b.1/f1", + "rm /config/usb_gadget/g1/configs/b.1/f2", + "rm /config/usb_gadget/g1/configs/b.1/f3", + "rmdir /config/usb_gadget/g1/functions/rndis.gs4", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:init.svc.adbd=stopped", + "condition" : "init.svc.adbd=stopped", + "cmds" : [ + "setparam sys.usb.ffs.ready 0" + ] + }, { + "name" : "property:sys.usb.config=adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=adb && sys.usb.configfs=1", + "cmds" : [ + "start adbd" + ] + }, { + "name" : "property:sys.usb.ffs.ready=1 && property:sys.usb.config=adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.ffs.ready=1 && sys.usb.config=adb && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"adb\"", + "symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=mtp && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=mtp && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"mtp\"", + "symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=mtp,adb && sys.usb.configfs=1", + "cmds" : [ + "start adbd" + ] + }, { + "name" : "property:sys.usb.ffs.ready=1 && property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.ffs.ready=1 && sys.usb.config=mtp,adb && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"mtp_adb\"", + "symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1", + "symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=ptp && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=ptp && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"ptp\"", + "symlink /config/usb_gadget/g1/functions/ptp.gs1 /config/usb_gadget/g1/configs/b.1/f1", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=ptp,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=ptp,adb && sys.usb.configfs=1", + "cmds" : [ + "start adbd" + ] + }, { + "name" : "property:sys.usb.ffs.ready=1 && property:sys.usb.config=ptp,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.ffs.ready=1 && sys.usb.config=ptp,adb && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"ptp_adb\"", + "symlink /config/usb_gadget/g1/functions/ptp.gs1 /config/usb_gadget/g1/configs/b.1/f1", + "symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=accessory && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=accessory && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"accessory\"", + "symlink /config/usb_gadget/g1/functions/accessory.gs2 /config/usb_gadget/g1/configs/b.1/f1", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=accessory,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=accessory,adb && sys.usb.configfs=1", + "cmds" : [ + "start adbd" + ] + }, { + "name" : "property:sys.usb.ffs.ready=1 && property:sys.usb.config=accessory,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.ffs.ready=1 && sys.usb.config=accessory,adb && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"accessory_adb\"", + "symlink /config/usb_gadget/g1/functions/accessory.gs2 /config/usb_gadget/g1/configs/b.1/f1", + "symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=audio_source && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=audio_source && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"audiosource\"", + "symlink /config/usb_gadget/g1/functions/audio_source.gs3 /config/usb_gadget/g1/configs/b.1/f1", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=audio_source,adb && sys.usb.configfs=1", + "cmds" : [ + "start adbd" + ] + }, { + "name" : "property:sys.usb.ffs.ready=1 && property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.ffs.ready=1 && sys.usb.config=audio_source,adb && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"audiosource_adb\"", + "symlink /config/usb_gadget/g1/functions/audio_source.gs3 /config/usb_gadget/g1/configs/b.1/f1", + "symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=accessory,audio_source && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=accessory,audio_source && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"accessory_audiosource\"", + "symlink /config/usb_gadget/g1/functions/accessory.gs2 /config/usb_gadget/g1/configs/b.1/f1", + "symlink /config/usb_gadget/g1/functions/audio_source.gs3 /config/usb_gadget/g1/configs/b.1/f2", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=accessory,audio_source,adb && sys.usb.configfs=1", + "cmds" : [ + "start adbd" + ] + }, { + "name" : "property:sys.usb.ffs.ready=1 && property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.ffs.ready=1 && sys.usb.config=accessory,audio_source,adb && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"accessory_audiosource_adb\"", + "symlink /config/usb_gadget/g1/functions/accessory.gs2 /config/usb_gadget/g1/configs/b.1/f1", + "symlink /config/usb_gadget/g1/functions/audio_source.gs3 /config/usb_gadget/g1/configs/b.1/f2", + "symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=midi && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=midi && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"midi\"", + "symlink /config/usb_gadget/g1/functions/midi.gs5 /config/usb_gadget/g1/configs/b.1/f1", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=midi,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=midi,adb && sys.usb.configfs=1", + "cmds" : [ + "start adbd" + ] + }, { + "name" : "property:sys.usb.ffs.ready=1 && property:sys.usb.config=midi,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.ffs.ready=1 && sys.usb.config=midi,adb && sys.usb.configfs=1", + "cmds" : [ + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"midi_adb\"", + "symlink /config/usb_gadget/g1/functions/midi.gs5 /config/usb_gadget/g1/configs/b.1/f1", + "symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=rndis && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=rndis && sys.usb.configfs=1", + "cmds" : [ + "mkdir /config/usb_gadget/g1/functions/rndis.gs4", + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"rndis\"", + "symlink /config/usb_gadget/g1/functions/rndis.gs4 /config/usb_gadget/g1/configs/b.1/f1", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + }, { + "name" : "property:sys.usb.config=rndis,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.config=rndis,adb && sys.usb.configfs=1", + "cmds" : [ + "start adbd" + ] + }, { + "name" : "property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,adb && property:sys.usb.configfs=1", + "condition" : "sys.usb.ffs.ready=1 && sys.usb.config=rndis,adb && sys.usb.configfs=1", + "cmds" : [ + "mkdir /config/usb_gadget/g1/functions/rndis.gs4", + "write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration \"rndis_adb\"", + "symlink /config/usb_gadget/g1/functions/rndis.gs4 /config/usb_gadget/g1/configs/b.1/f1", + "symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2", + "write /config/usb_gadget/g1/UDC ${sys.usb.controller}", + "setparam sys.usb.state ${sys.usb.config}" + ] + } + ] +} diff --git a/services/include/init_service.h b/services/include/init_service.h index ba4e046744cfbd2f80f6f2c243434e275bf68e3c..c020524d49f63a388f88e072342285659477ad1c 100644 --- a/services/include/init_service.h +++ b/services/include/init_service.h @@ -38,6 +38,7 @@ extern "C" { #define SERVICE_ATTR_IMPORTANT 0x010 // will reboot if it crash #define SERVICE_ATTR_CRITICAL 0x020 // critical, will reboot if it crash 4 times in 4 minutes #define SERVICE_ATTR_DISABLED 0x040 // disabled +#define SERVICE_ATTR_CONSOLE 0x080 // console #define MAX_SERVICE_NAME 32 #define MAX_WRITEPID_FILES 100 diff --git a/services/include/init_service_manager.h b/services/include/init_service_manager.h index 33a8c7608bd348fc2582f9616e64a02dffa35cbf..ae3e7c5799e79307a0f20fc888369b8b48164fcc 100644 --- a/services/include/init_service_manager.h +++ b/services/include/init_service_manager.h @@ -32,6 +32,7 @@ extern "C" { #define BIN_SH_NOT_ALLOWED "/bin/sh" #define CRITICAL_STR_IN_CFG "critical" #define DISABLED_STR_IN_CFG "disabled" +#define CONSOLE_STR_IN_CFG "console" #define MAX_SERVICES_CNT_IN_FILE 100 diff --git a/services/include/init_utils.h b/services/include/init_utils.h index e09dea4cbf4f224293a17c26f0464a5557082ff4..502cd34f4a44beafeffa97e43483667981e33a59 100644 --- a/services/include/init_utils.h +++ b/services/include/init_utils.h @@ -37,6 +37,7 @@ int DecodeUid(const char *name); void CheckAndCreateDir(const char *fileName); char* ReadFileToBuf(const char *configFile); int SplitString(char *srcPtr, char **dstPtr, int maxNum); +void WaitForFile(const char *source, unsigned int maxCount); #ifdef __cplusplus #if __cplusplus diff --git a/services/src/device.c b/services/src/device.c index d9e9dfffe0c2da92b7540e42f07e5312a1606d7b..42152839d23da3101d957009e024d958b01c8864 100644 --- a/services/src/device.c +++ b/services/src/device.c @@ -34,6 +34,14 @@ void MountBasicFs() if (mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755") != 0) { INIT_LOGE("Mount tmpfs failed. %s\n", strerror(errno)); } +#ifndef __LITEOS__ + if (mkdir("/dev/pts", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) != 0) { + INIT_LOGE("mkdir /dev/pts failed. %s\n", strerror(errno)); + } + if (mount("devpts", "/dev/pts", "devpts", 0, NULL) != 0) { + INIT_LOGE("Mount devpts failed. %s\n", strerror(errno)); + } +#endif if (mount("proc", "/proc", "proc", 0, "hidepid=2") != 0) { INIT_LOGE("Mount procfs failed. %s\n", strerror(errno)); } diff --git a/services/src/init_capability.c b/services/src/init_capability.c index 4d47ebdf64115c9eadd793ef98efc25d5bf117da..59ba0edf6c571551e8f796f4d0a8228643788778 100644 --- a/services/src/init_capability.c +++ b/services/src/init_capability.c @@ -85,7 +85,7 @@ static int GetServiceStringCaps(const cJSON* filedJ, Service* curServ) for (; i < curServ->servPerm.capsCnt; ++i) { if (cJSON_GetArrayItem(filedJ, i) == NULL || !cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i)) || strlen(cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i))) <= 0) { // check all errors - INIT_LOGE("[init] service=%s, parse item[%d] as string, error.\n", curServ->name, i); + INIT_LOGE("service=%s, parse item[%d] as string, error.\n", curServ->name, i); break; } char* fieldStr = cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i)); @@ -99,12 +99,12 @@ static int GetServiceStringCaps(const cJSON* filedJ, Service* curServ) if (j < mapSize) { curServ->servPerm.caps[i] = g_capStrCapNum[j].CapNum; } else { - INIT_LOGE("[init] service=%s, CapbilityName=%s, error.\n", curServ->name, fieldStr); + INIT_LOGE("service=%s, CapbilityName=%s, error.\n", curServ->name, fieldStr); break; } if (curServ->servPerm.caps[i] > CAP_LAST_CAP && curServ->servPerm.caps[i] != FULL_CAP) { // resources will be released by function: ReleaseServiceMem - INIT_LOGE("[init] service=%s, cap = %d, error.\n", curServ->name, curServ->servPerm.caps[i]); + INIT_LOGE("service=%s, cap = %d, error.\n", curServ->name, curServ->servPerm.caps[i]); return SERVICE_FAILURE; } } @@ -121,7 +121,7 @@ int GetServiceCaps(const cJSON* curArrItem, Service* curServ) return SERVICE_SUCCESS; } if (!cJSON_IsArray(filedJ)) { - INIT_LOGE("[init] service=%s, caps is not a list, error.\n", curServ->name); + INIT_LOGE("service=%s, caps is not a list, error.\n", curServ->name); return SERVICE_FAILURE; } // caps array does not exist, means do not need any capability @@ -130,13 +130,13 @@ int GetServiceCaps(const cJSON* curArrItem, Service* curServ) return SERVICE_SUCCESS; } if (capsCnt > MAX_CAPS_CNT_FOR_ONE_SERVICE) { - INIT_LOGE("[init], service=%s, too many caps[cnt %d] for one service, max is %d.\n", + INIT_LOGE("service=%s, too many caps[cnt %d] for one service, max is %d.\n", curServ->name, capsCnt, MAX_CAPS_CNT_FOR_ONE_SERVICE); return SERVICE_FAILURE; } curServ->servPerm.caps = (unsigned int*)malloc(sizeof(unsigned int) * capsCnt); if (curServ->servPerm.caps == NULL) { - INIT_LOGE("[init] GetServiceCaps, service=%s, malloc error.\n", curServ->name); + INIT_LOGE("GetServiceCaps, service=%s, malloc error.\n", curServ->name); return SERVICE_FAILURE; } curServ->servPerm.capsCnt = capsCnt; @@ -145,13 +145,13 @@ int GetServiceCaps(const cJSON* curArrItem, Service* curServ) cJSON* capJ = cJSON_GetArrayItem(filedJ, i); if (!cJSON_IsNumber(capJ) || cJSON_GetNumberValue(capJ) < 0) { // resources will be released by function: ReleaseServiceMem - INIT_LOGI("[init], service=%s, Capbility is not a number or < 0, error.\n", curServ->name); + INIT_LOGI("service=%s, Capbility is not a number or < 0, error.\n", curServ->name); break; } curServ->servPerm.caps[i] = (unsigned int)cJSON_GetNumberValue(capJ); if (curServ->servPerm.caps[i] > CAP_LAST_CAP && curServ->servPerm.caps[i] != FULL_CAP) { // CAP_LAST_CAP = 37 // resources will be released by function: ReleaseServiceMem - INIT_LOGE("[init] service=%s, caps = %d, error.\n", curServ->name, curServ->servPerm.caps[i]); + INIT_LOGE("service=%s, caps = %d, error.\n", curServ->name, curServ->servPerm.caps[i]); return SERVICE_FAILURE; } } diff --git a/services/src/init_cmds.c b/services/src/init_cmds.c index 8af044e9891d5de9b3f42e6bbabd95fef300d1cb..6db7b6fcb93433e27d395411ff8aef2bfcd0a399 100644 --- a/services/src/init_cmds.c +++ b/services/src/init_cmds.c @@ -51,7 +51,7 @@ #define OCTAL_TYPE 8 // 8 means octal to decimal #define MAX_BUFFER 256 #define AUTHORITY_MAX_SIZE 128 -#define CONVERT_MICROSEC_TO_SEC(x) ((x) / 1000 / 1000) +#define WAIT_MAX_COUNT 10 static const char *g_supportCfg[] = { "/etc/patch.cfg", @@ -305,22 +305,6 @@ static char* CopySubStr(const char* srcStr, size_t startPos, size_t endPos) return retStr; } -static void WaitForFile(const char *source) -{ - struct stat sourceInfo; - unsigned int waitTime = 500000; - int maxCount = 10; // 10 means that sleep 10 times, 500ms at a time - int count = 0; - do { - usleep(waitTime); - count++; - } while ((stat(source, &sourceInfo) < 0) && (errno == ENOENT) && (count < maxCount)); - if (count == maxCount) { - INIT_LOGE("wait for file:%s failed after %d.\n", source, maxCount * CONVERT_MICROSEC_TO_SEC(waitTime)); - } - return; -} - static int GetMountFlag(unsigned long* mountflags, const char* targetStr, const char *source) { if (targetStr == NULL) { @@ -338,7 +322,7 @@ static int GetMountFlag(unsigned long* mountflags, const char* targetStr, const } else if (strncmp(targetStr, "noatime", strlen("noatime")) == 0) { (*mountflags) |= MS_NOATIME; } else if (strncmp(targetStr, "wait", strlen("wait")) == 0) { - WaitForFile(source); + WaitForFile(source, WAIT_MAX_COUNT); } else { return 0; } diff --git a/services/src/init_reboot.c b/services/src/init_reboot.c index 4fcf90743717c672a7c9f0c358864f7b2df8df1a..be0db3e02b931eb12266378014655abe77d44664 100644 --- a/services/src/init_reboot.c +++ b/services/src/init_reboot.c @@ -80,7 +80,7 @@ static int GetMountStatusForMountPoint(const char *mountPoint) const char *mountFile = "/proc/mounts"; FILE *fp = fopen(mountFile, "r"); if (fp == NULL) { - INIT_LOGE("[init] DoReboot %s can't open.\n", mountPoint); + INIT_LOGE("DoReboot %s can't open.\n", mountPoint); return 1; } @@ -103,24 +103,32 @@ static int GetMountStatusForMountPoint(const char *mountPoint) void DoReboot(const char *value) { if (value == NULL) { - INIT_LOGE("[init] DoReboot value = NULL\n"); + INIT_LOGE("DoReboot value = NULL\n"); return; } - INIT_LOGI("[init] DoReboot value = %s\n", value); + INIT_LOGI("DoReboot value = %s\n", value); if (strlen(value) > MAX_VALUE_LENGTH) { - INIT_LOGE("[init] DoReboot reboot value error, value = %s.\n", value); + INIT_LOGE("DoReboot reboot value error, value = %s.\n", value); return; } const char *valueData = NULL; if (strncmp(value, "reboot,", strlen("reboot,")) != 0) { - INIT_LOGE("[init] DoReboot reboot value = %s, must started with reboot ,error.\n", value); + INIT_LOGE("DoReboot reboot value = %s, must started with reboot ,error.\n", value); return; } else { valueData = value + strlen("reboot,"); } + if (strncmp(valueData, "shutdown", strlen("shutdown")) != 0 + && strncmp(valueData, "updater:", strlen("updater:")) != 0 + && strncmp(valueData, "updater", strlen("updater")) != 0 + && strncmp(valueData, "NoArgument", strlen("NoArgument")) != 0) { + INIT_LOGE("DoReboot value = %s, parameters error.\n", value); + return; + } + StopAllServicesBeforeReboot(); if (GetMountStatusForMountPoint("/vendor")) { if (umount("/vendor") != 0) { INIT_LOGE("DoReboot umount vendor failed! errno = %d.\n", errno); @@ -131,7 +139,6 @@ void DoReboot(const char *value) INIT_LOGE("DoReboot umount data failed! errno = %d.\n", errno); } } - StopAllServicesBeforeReboot(); // "shutdown" if (strncmp(valueData, "shutdown", strlen("shutdown")) == 0) { int ret = reboot(RB_POWER_OFF); @@ -145,7 +152,7 @@ void DoReboot(const char *value) struct RBMiscUpdateMessage msg; bool ret = RBMiscReadUpdaterMessage(miscFile, &msg); if(!ret) { - INIT_LOGE("[init] DoReboot RBMiscReadUpdaterMessage error.\n"); + INIT_LOGE("DoReboot RBMiscReadUpdaterMessage error.\n"); return; } const int commandSize = 12; @@ -155,13 +162,13 @@ void DoReboot(const char *value) if (strlen(valueData) > strlen("updater:") && strncmp(valueData, "updater:", strlen("updater:")) == 0) { const char *p = valueData + strlen("updater:"); if (snprintf(msg.update, MAX_UPDATE_SIZE, "%s", p) > MAX_UPDATE_SIZE) { - INIT_LOGE("[init] DoReboot updater: RBMiscWriteUpdaterMessage error\n"); + INIT_LOGE("DoReboot updater: RBMiscWriteUpdaterMessage error\n"); return; } msg.update[MAX_UPDATE_SIZE - 1] = 0; ret = RBMiscWriteUpdaterMessage(miscFile, &msg); if(true != ret) { - INIT_LOGE("[init] DoReboot updater: RBMiscWriteUpdaterMessage error\n"); + INIT_LOGE("DoReboot updater: RBMiscWriteUpdaterMessage error\n"); return; } ret = reboot(RB_AUTOBOOT); @@ -173,7 +180,7 @@ void DoReboot(const char *value) if (strlen(valueData) == strlen("updater") && strncmp(valueData, "updater", strlen("updater")) == 0) { ret = RBMiscWriteUpdaterMessage(miscFile, &msg); if(true != ret) { - INIT_LOGE("[init] DoReboot updater RBMiscWriteUpdaterMessage error\n"); + INIT_LOGE("DoReboot updater RBMiscWriteUpdaterMessage error\n"); return; } ret = reboot(RB_AUTOBOOT); diff --git a/services/src/init_service.c b/services/src/init_service.c index 8529422f6908bee497446cd6c73cbe1c39a42f4c..fc52e5ed76fde737afa6f17e9652cc37e61fd601 100644 --- a/services/src/init_service.c +++ b/services/src/init_service.c @@ -15,10 +15,16 @@ #include "init_service.h" +#include #include +#include #include #include +#include #include +#ifdef __MUSL__ +#include +#endif #include #include #include @@ -29,9 +35,14 @@ #include "init_log.h" #include "init_perms.h" #include "init_service_socket.h" +#include "init_utils.h" #define CAP_NUM 2 +#define WAIT_MAX_COUNT 10 +#ifndef TIOCSCTTY +#define TIOCSCTTY 0x540E +#endif // 240 seconds, 4 minutes static const int CRASH_TIME_LIMIT = 240; // maximum number of crashes within time CRASH_TIME_LIMIT for one service @@ -110,6 +121,23 @@ static int SetPerms(const Service *service) return SERVICE_SUCCESS; } +static void OpenConsole() +{ + setsid(); + WaitForFile("/dev/console", WAIT_MAX_COUNT); + int fd = open("/dev/console", O_RDWR); + if (fd >= 0) { + ioctl(fd, TIOCSCTTY, 0); + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + close(fd); + } else { + INIT_LOGE("Open /dev/console failed. err = %d\n", errno); + } + return; +} + int ServiceStart(Service *service) { if (service == NULL) { @@ -141,6 +169,9 @@ int ServiceStart(Service *service) _exit(0x7f); // 0x7f: user specified } } + if (service->attribute & SERVICE_ATTR_CONSOLE) { + OpenConsole(); + } // permissions if (SetPerms(service) != SERVICE_SUCCESS) { INIT_LOGE("service %s exit! set perms failed! err %d.\n", service->name, errno); diff --git a/services/src/init_service_manager.c b/services/src/init_service_manager.c index ad3a4bdc895ca2d092315d237ed7d00b0ee74208..e8b8c39873631ff3e234a16da663c37e127e2c4a 100644 --- a/services/src/init_service_manager.c +++ b/services/src/init_service_manager.c @@ -348,8 +348,9 @@ static int GetServiceNumber(const cJSON* curArrItem, Service* curServ, const cha if (filedJ == NULL && (strncmp(targetField, CRITICAL_STR_IN_CFG, strlen(CRITICAL_STR_IN_CFG)) == 0 || strncmp(targetField, DISABLED_STR_IN_CFG, strlen(DISABLED_STR_IN_CFG)) == 0 || strncmp(targetField, ONCE_STR_IN_CFG, strlen(ONCE_STR_IN_CFG)) == 0 - || strncmp(targetField, IMPORTANT_STR_IN_CFG, strlen(IMPORTANT_STR_IN_CFG)) == 0)) { - return SERVICE_SUCCESS; // not found "critical","disabled","once","importance" item is ok + || strncmp(targetField, IMPORTANT_STR_IN_CFG, strlen(IMPORTANT_STR_IN_CFG)) == 0 + || strncmp(targetField, CONSOLE_STR_IN_CFG, strlen(CONSOLE_STR_IN_CFG)) == 0)) { + return SERVICE_SUCCESS; // not found "critical","disabled","once","importance","console" item is ok } if (!cJSON_IsNumber(filedJ)) { @@ -384,6 +385,11 @@ static int GetServiceNumber(const cJSON* curArrItem, Service* curServ, const cha if (value == 1) { curServ->attribute |= SERVICE_ATTR_DISABLED; } + } else if (strncmp(targetField, CONSOLE_STR_IN_CFG, strlen(CONSOLE_STR_IN_CFG)) == 0) { // set console + curServ->attribute &= ~SERVICE_ATTR_CONSOLE; + if (value == 1) { + curServ->attribute |= SERVICE_ATTR_CONSOLE; + } } else { INIT_LOGE("GetServiceNumber, item = %s, not expected, error.\n", targetField); return SERVICE_FAILURE; @@ -574,7 +580,7 @@ static int GetServiceOnRestart(const cJSON* curArrItem, Service* curServ) static int CheckServiceKeyName(const cJSON* curService) { char *cfgServiceKeyList[] = {"name", "path", "uid", "gid", "once", - "importance", "caps", "disabled", "writepid", "critical", "socket", + "importance", "caps", "disabled", "writepid", "critical", "socket", "console" }; if (curService == NULL) { return SERVICE_FAILURE; @@ -645,9 +651,10 @@ void ParseAllServices(const cJSON* fileRoot) int ret6 = GetServiceNumber(curItem, &tmp[i], IMPORTANT_STR_IN_CFG); int ret7 = GetServiceNumber(curItem, &tmp[i], CRITICAL_STR_IN_CFG); // critical int ret8 = GetServiceNumber(curItem, &tmp[i], DISABLED_STR_IN_CFG); // disabled - int ret9 = GetWritepidStrings(curItem, &tmp[i]); // writepid - int reta = GetServiceCaps(curItem, &tmp[i]); - int retAll = ret1 | ret2 | ret3 | ret4 | ret5 | ret6 | ret7 | ret8 | ret9 | reta; + int ret9 = GetServiceNumber(curItem, &tmp[i], CONSOLE_STR_IN_CFG); // console + int reta = GetWritepidStrings(curItem, &tmp[i]); // writepid + int retb = GetServiceCaps(curItem, &tmp[i]); + int retAll = ret1 | ret2 | ret3 | ret4 | ret5 | ret6 | ret7 | ret8 | ret9 | reta | retb; if (retAll != SERVICE_SUCCESS) { // release resources if it fails ReleaseServiceMem(&tmp[i]); diff --git a/services/src/init_utils.c b/services/src/init_utils.c index 3dafda804a894df13236764778fe1c3a9cb48d47..b378e945556e0eaad6966c8e1e263d53793d09a6 100644 --- a/services/src/init_utils.c +++ b/services/src/init_utils.c @@ -34,6 +34,7 @@ #include "init_utils.h" #include "securec.h" +#define WAIT_MAX_COUNT 10 #define MAX_BUF_SIZE 1024 #ifdef STARTUP_UT #define LOG_FILE_NAME "/media/sf_ubuntu/test/log.txt" @@ -43,6 +44,7 @@ #define MAX_BUFFER 256 #define MAX_EACH_CMD_LENGTH 30 #define MAX_JSON_FILE_LEN 102400 // max init.cfg size 100KB +#define CONVERT_MICROSEC_TO_SEC(x) ((x) / 1000 / 1000.0) struct CmdArgs* GetCmd(const char *cmdContent, const char *delim) { @@ -177,3 +179,23 @@ int SplitString(char *srcPtr, char **dstPtr, int maxNum) } return num; } + +void WaitForFile(const char *source, unsigned int maxCount) +{ + if (maxCount > WAIT_MAX_COUNT) { + INIT_LOGE("WaitForFile max time is 5s"); + maxCount = WAIT_MAX_COUNT; + } + struct stat sourceInfo; + unsigned int waitTime = 500000; + unsigned int count = 0; + do { + usleep(waitTime); + count++; + } while ((stat(source, &sourceInfo) < 0) && (errno == ENOENT) && (count < maxCount)); + if (count == maxCount) { + INIT_LOGE("wait for file:%s failed after %f.\n", source, maxCount * CONVERT_MICROSEC_TO_SEC(waitTime)); + } + return; +} +