From c0f5a512606691c65ea47e0b27b0191a37da2acd Mon Sep 17 00:00:00 2001 From: zhong_ning Date: Thu, 8 Jul 2021 21:23:20 +0800 Subject: [PATCH 1/4] modify l2 init Signed-off-by: zhong_ning --- services/BUILD.gn | 18 ++ services/etc/init.cfg | 3 +- services/etc/init.usb.cfg | 161 +++++++++++++++++ services/etc/init.usb.configfs.cfg | 220 ++++++++++++++++++++++++ services/include/init_service.h | 1 + services/include/init_service_manager.h | 1 + services/include/init_utils.h | 1 + services/log/init_log.c | 2 +- services/src/device.c | 8 + services/src/init_cmds.c | 20 +-- services/src/init_service.c | 31 ++++ services/src/init_service_manager.c | 19 +- services/src/init_utils.c | 17 ++ 13 files changed, 476 insertions(+), 26 deletions(-) create mode 100755 services/etc/init.usb.cfg create mode 100755 services/etc/init.usb.configfs.cfg diff --git a/services/BUILD.gn b/services/BUILD.gn index c0bcef5d6..8f75903c1 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 657a7bca3..67036a28c 100755 --- a/services/etc/init.cfg +++ b/services/etc/init.cfg @@ -17,7 +17,6 @@ "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", @@ -26,6 +25,7 @@ }, { "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 +554,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 000000000..a71a74418 --- /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 000000000..823cbfaa6 --- /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 ba4e04674..c020524d4 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 33a8c7608..ae3e7c579 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 e09dea4cb..3b2d3ee21 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, int maxCount); #ifdef __cplusplus #if __cplusplus diff --git a/services/log/init_log.c b/services/log/init_log.c index 4f8ec071c..2d0446101 100644 --- a/services/log/init_log.c +++ b/services/log/init_log.c @@ -42,7 +42,7 @@ void InitLog(const char *tag, InitLogLevel logLevel, const char *fileName, int l if (logLevel < g_logLevel) { return; } - // 可以替换stdout这个为对应的文件句柄 + // ????stdout?????????? time_t logTime; time(&logTime); struct tm *t = gmtime(&logTime); diff --git a/services/src/device.c b/services/src/device.c index d9e9dfffe..42152839d 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_cmds.c b/services/src/init_cmds.c index 8af044e98..6db7b6fcb 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_service.c b/services/src/init_service.c index 8529422f6..fc52e5ed7 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 ad3a4bdc8..e8b8c3987 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 3dafda804..489ed284d 100644 --- a/services/src/init_utils.c +++ b/services/src/init_utils.c @@ -43,6 +43,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) struct CmdArgs* GetCmd(const char *cmdContent, const char *delim) { @@ -177,3 +178,19 @@ int SplitString(char *srcPtr, char **dstPtr, int maxNum) } return num; } + +void WaitForFile(const char *source, int maxCount) +{ + struct stat sourceInfo; + unsigned int waitTime = 500000; + 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; +} + -- Gitee From 6e579a6b7aeef86a5f39e057f1f57616d1779b52 Mon Sep 17 00:00:00 2001 From: zhong_ning Date: Thu, 8 Jul 2021 22:20:16 +0800 Subject: [PATCH 2/4] fix bug Signed-off-by: zhong_ning --- services/etc/init.cfg | 7 +++++-- services/include/init_utils.h | 2 +- services/log/init_log.c | 2 +- services/src/init_capability.c | 16 ++++++++-------- services/src/init_reboot.c | 27 +++++++++++++++++---------- services/src/init_utils.c | 9 +++++++-- 6 files changed, 39 insertions(+), 24 deletions(-) diff --git a/services/etc/init.cfg b/services/etc/init.cfg index 67036a28c..cf96169de 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", @@ -20,7 +23,7 @@ "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", diff --git a/services/include/init_utils.h b/services/include/init_utils.h index 3b2d3ee21..502cd34f4 100644 --- a/services/include/init_utils.h +++ b/services/include/init_utils.h @@ -37,7 +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, int maxCount); +void WaitForFile(const char *source, unsigned int maxCount); #ifdef __cplusplus #if __cplusplus diff --git a/services/log/init_log.c b/services/log/init_log.c index 2d0446101..4f8ec071c 100644 --- a/services/log/init_log.c +++ b/services/log/init_log.c @@ -42,7 +42,7 @@ void InitLog(const char *tag, InitLogLevel logLevel, const char *fileName, int l if (logLevel < g_logLevel) { return; } - // ????stdout?????????? + // 可以替换stdout这个为对应的文件句柄 time_t logTime; time(&logTime); struct tm *t = gmtime(&logTime); diff --git a/services/src/init_capability.c b/services/src/init_capability.c index 4d47ebdf6..59ba0edf6 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_reboot.c b/services/src/init_reboot.c index 4fcf90743..be0db3e02 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_utils.c b/services/src/init_utils.c index 489ed284d..9c7abcfa4 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" @@ -179,11 +180,15 @@ int SplitString(char *srcPtr, char **dstPtr, int maxNum) return num; } -void WaitForFile(const char *source, int maxCount) +void WaitForFile(const char *source, unsigned int maxCount) { + if (maxCount > WAIT_MAX_COUNT ) { + INIT_LOGE("WaitForFile max time is 50ms"); + return; + } struct stat sourceInfo; unsigned int waitTime = 500000; - int count = 0; + unsigned int count = 0; do { usleep(waitTime); count++; -- Gitee From 38f26edf475a16e659161554d6ba26a0d45735e6 Mon Sep 17 00:00:00 2001 From: zhong_ning Date: Thu, 8 Jul 2021 22:31:17 +0800 Subject: [PATCH 3/4] fix bug Signed-off-by: zhong_ning --- services/src/init_utils.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/src/init_utils.c b/services/src/init_utils.c index 9c7abcfa4..71902848f 100644 --- a/services/src/init_utils.c +++ b/services/src/init_utils.c @@ -182,9 +182,9 @@ int SplitString(char *srcPtr, char **dstPtr, int maxNum) void WaitForFile(const char *source, unsigned int maxCount) { - if (maxCount > WAIT_MAX_COUNT ) { - INIT_LOGE("WaitForFile max time is 50ms"); - return; + if (maxCount > WAIT_MAX_COUNT) { + INIT_LOGE("WaitForFile max time is 5s"); + maxCount = WAIT_MAX_COUNT; } struct stat sourceInfo; unsigned int waitTime = 500000; -- Gitee From 7173a750cbfeba7f5a4ab245792c6492056f0947 Mon Sep 17 00:00:00 2001 From: zhong_ning Date: Thu, 8 Jul 2021 22:41:31 +0800 Subject: [PATCH 4/4] fix bug Signed-off-by: zhong_ning --- services/src/init_utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/src/init_utils.c b/services/src/init_utils.c index 71902848f..b378e9455 100644 --- a/services/src/init_utils.c +++ b/services/src/init_utils.c @@ -44,7 +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) +#define CONVERT_MICROSEC_TO_SEC(x) ((x) / 1000 / 1000.0) struct CmdArgs* GetCmd(const char *cmdContent, const char *delim) { @@ -194,7 +194,7 @@ void WaitForFile(const char *source, unsigned int maxCount) 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)); + INIT_LOGE("wait for file:%s failed after %f.\n", source, maxCount * CONVERT_MICROSEC_TO_SEC(waitTime)); } return; } -- Gitee