提交 754d3970 编写于 作者: O openharmony_ci 提交者: Gitee

!51 修改L2 init

Merge pull request !51 from 钟柠/init0708
...@@ -156,12 +156,30 @@ if (defined(ohos_lite)) { ...@@ -156,12 +156,30 @@ if (defined(ohos_lite)) {
part_name = "init" 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") { group("startup_init") {
deps = [ deps = [
":init", ":init",
":init.cfg", ":init.cfg",
":passwd", ":passwd",
":init.Hi3516DV300.cfg", ":init.Hi3516DV300.cfg",
":init.usb.cfg",
":init.usb.configfs.cfg",
":init.Hi3516DV300.usb.cfg",
":updaterueventd", ":updaterueventd",
"//base/startup/init_lite/services/param:getparam", "//base/startup/init_lite/services/param:getparam",
"//base/startup/init_lite/services/param:paramclient", "//base/startup/init_lite/services/param:paramclient",
......
...@@ -5,7 +5,10 @@ ...@@ -5,7 +5,10 @@
"/init.${ro.hardware}.cfg", "/init.${ro.hardware}.cfg",
"/init.Hi3516DV300.cfg", "/init.Hi3516DV300.cfg",
"/init.usb.configfs.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" : [{ "jobs" : [{
"name" : "pre-init", "name" : "pre-init",
...@@ -17,15 +20,15 @@ ...@@ -17,15 +20,15 @@
"mkdir /dev/memcg/apps/ 0755 system system", "mkdir /dev/memcg/apps/ 0755 system system",
"mkdir /dev/memcg/system 0550 system system", "mkdir /dev/memcg/system 0550 system system",
"start ueventd", "start ueventd",
"start console",
"mkdir /vendor", "mkdir /vendor",
"mkdir /data", "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/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", "name" : "init",
"cmds" : [ "cmds" : [
"start console",
"copy /proc/cmdline /dev/urandom", "copy /proc/cmdline /dev/urandom",
"copy /system/etc/prop.default /dev/urandom", "copy /system/etc/prop.default /dev/urandom",
"symlink /proc/self/fd/0 /dev/stdin", "symlink /proc/self/fd/0 /dev/stdin",
...@@ -554,6 +557,7 @@ ...@@ -554,6 +557,7 @@
"name" : "console", "name" : "console",
"path" : ["/system/bin/sh"], "path" : ["/system/bin/sh"],
"disabled" : 1, "disabled" : 1,
"console" : 1,
"uid" : "root", "uid" : "root",
"gid" : ["shell", "log", "readproc"] "gid" : ["shell", "log", "readproc"]
}, { }, {
......
{
"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
}
]
}
{
"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}"
]
}
]
}
...@@ -38,6 +38,7 @@ extern "C" { ...@@ -38,6 +38,7 @@ extern "C" {
#define SERVICE_ATTR_IMPORTANT 0x010 // will reboot if it crash #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_CRITICAL 0x020 // critical, will reboot if it crash 4 times in 4 minutes
#define SERVICE_ATTR_DISABLED 0x040 // disabled #define SERVICE_ATTR_DISABLED 0x040 // disabled
#define SERVICE_ATTR_CONSOLE 0x080 // console
#define MAX_SERVICE_NAME 32 #define MAX_SERVICE_NAME 32
#define MAX_WRITEPID_FILES 100 #define MAX_WRITEPID_FILES 100
......
...@@ -32,6 +32,7 @@ extern "C" { ...@@ -32,6 +32,7 @@ extern "C" {
#define BIN_SH_NOT_ALLOWED "/bin/sh" #define BIN_SH_NOT_ALLOWED "/bin/sh"
#define CRITICAL_STR_IN_CFG "critical" #define CRITICAL_STR_IN_CFG "critical"
#define DISABLED_STR_IN_CFG "disabled" #define DISABLED_STR_IN_CFG "disabled"
#define CONSOLE_STR_IN_CFG "console"
#define MAX_SERVICES_CNT_IN_FILE 100 #define MAX_SERVICES_CNT_IN_FILE 100
......
...@@ -37,6 +37,7 @@ int DecodeUid(const char *name); ...@@ -37,6 +37,7 @@ int DecodeUid(const char *name);
void CheckAndCreateDir(const char *fileName); void CheckAndCreateDir(const char *fileName);
char* ReadFileToBuf(const char *configFile); char* ReadFileToBuf(const char *configFile);
int SplitString(char *srcPtr, char **dstPtr, int maxNum); int SplitString(char *srcPtr, char **dstPtr, int maxNum);
void WaitForFile(const char *source, unsigned int maxCount);
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
......
...@@ -34,6 +34,14 @@ void MountBasicFs() ...@@ -34,6 +34,14 @@ void MountBasicFs()
if (mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755") != 0) { if (mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755") != 0) {
INIT_LOGE("Mount tmpfs failed. %s\n", strerror(errno)); 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) { if (mount("proc", "/proc", "proc", 0, "hidepid=2") != 0) {
INIT_LOGE("Mount procfs failed. %s\n", strerror(errno)); INIT_LOGE("Mount procfs failed. %s\n", strerror(errno));
} }
......
...@@ -85,7 +85,7 @@ static int GetServiceStringCaps(const cJSON* filedJ, Service* curServ) ...@@ -85,7 +85,7 @@ static int GetServiceStringCaps(const cJSON* filedJ, Service* curServ)
for (; i < curServ->servPerm.capsCnt; ++i) { for (; i < curServ->servPerm.capsCnt; ++i) {
if (cJSON_GetArrayItem(filedJ, i) == NULL || !cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i)) if (cJSON_GetArrayItem(filedJ, i) == NULL || !cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i))
|| strlen(cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i))) <= 0) { // check all errors || 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; break;
} }
char* fieldStr = cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i)); char* fieldStr = cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i));
...@@ -99,12 +99,12 @@ static int GetServiceStringCaps(const cJSON* filedJ, Service* curServ) ...@@ -99,12 +99,12 @@ static int GetServiceStringCaps(const cJSON* filedJ, Service* curServ)
if (j < mapSize) { if (j < mapSize) {
curServ->servPerm.caps[i] = g_capStrCapNum[j].CapNum; curServ->servPerm.caps[i] = g_capStrCapNum[j].CapNum;
} else { } 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; break;
} }
if (curServ->servPerm.caps[i] > CAP_LAST_CAP && curServ->servPerm.caps[i] != FULL_CAP) { if (curServ->servPerm.caps[i] > CAP_LAST_CAP && curServ->servPerm.caps[i] != FULL_CAP) {
// resources will be released by function: ReleaseServiceMem // 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; return SERVICE_FAILURE;
} }
} }
...@@ -121,7 +121,7 @@ int GetServiceCaps(const cJSON* curArrItem, Service* curServ) ...@@ -121,7 +121,7 @@ int GetServiceCaps(const cJSON* curArrItem, Service* curServ)
return SERVICE_SUCCESS; return SERVICE_SUCCESS;
} }
if (!cJSON_IsArray(filedJ)) { 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; return SERVICE_FAILURE;
} }
// caps array does not exist, means do not need any capability // caps array does not exist, means do not need any capability
...@@ -130,13 +130,13 @@ int GetServiceCaps(const cJSON* curArrItem, Service* curServ) ...@@ -130,13 +130,13 @@ int GetServiceCaps(const cJSON* curArrItem, Service* curServ)
return SERVICE_SUCCESS; return SERVICE_SUCCESS;
} }
if (capsCnt > MAX_CAPS_CNT_FOR_ONE_SERVICE) { 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); curServ->name, capsCnt, MAX_CAPS_CNT_FOR_ONE_SERVICE);
return SERVICE_FAILURE; return SERVICE_FAILURE;
} }
curServ->servPerm.caps = (unsigned int*)malloc(sizeof(unsigned int) * capsCnt); curServ->servPerm.caps = (unsigned int*)malloc(sizeof(unsigned int) * capsCnt);
if (curServ->servPerm.caps == NULL) { 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; return SERVICE_FAILURE;
} }
curServ->servPerm.capsCnt = capsCnt; curServ->servPerm.capsCnt = capsCnt;
...@@ -145,13 +145,13 @@ int GetServiceCaps(const cJSON* curArrItem, Service* curServ) ...@@ -145,13 +145,13 @@ int GetServiceCaps(const cJSON* curArrItem, Service* curServ)
cJSON* capJ = cJSON_GetArrayItem(filedJ, i); cJSON* capJ = cJSON_GetArrayItem(filedJ, i);
if (!cJSON_IsNumber(capJ) || cJSON_GetNumberValue(capJ) < 0) { if (!cJSON_IsNumber(capJ) || cJSON_GetNumberValue(capJ) < 0) {
// resources will be released by function: ReleaseServiceMem // 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; break;
} }
curServ->servPerm.caps[i] = (unsigned int)cJSON_GetNumberValue(capJ); 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 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 // 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; return SERVICE_FAILURE;
} }
} }
......
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
#define OCTAL_TYPE 8 // 8 means octal to decimal #define OCTAL_TYPE 8 // 8 means octal to decimal
#define MAX_BUFFER 256 #define MAX_BUFFER 256
#define AUTHORITY_MAX_SIZE 128 #define AUTHORITY_MAX_SIZE 128
#define CONVERT_MICROSEC_TO_SEC(x) ((x) / 1000 / 1000) #define WAIT_MAX_COUNT 10
static const char *g_supportCfg[] = { static const char *g_supportCfg[] = {
"/etc/patch.cfg", "/etc/patch.cfg",
...@@ -305,22 +305,6 @@ static char* CopySubStr(const char* srcStr, size_t startPos, size_t endPos) ...@@ -305,22 +305,6 @@ static char* CopySubStr(const char* srcStr, size_t startPos, size_t endPos)
return retStr; 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) static int GetMountFlag(unsigned long* mountflags, const char* targetStr, const char *source)
{ {
if (targetStr == NULL) { if (targetStr == NULL) {
...@@ -338,7 +322,7 @@ static int GetMountFlag(unsigned long* mountflags, const char* targetStr, const ...@@ -338,7 +322,7 @@ static int GetMountFlag(unsigned long* mountflags, const char* targetStr, const
} else if (strncmp(targetStr, "noatime", strlen("noatime")) == 0) { } else if (strncmp(targetStr, "noatime", strlen("noatime")) == 0) {
(*mountflags) |= MS_NOATIME; (*mountflags) |= MS_NOATIME;
} else if (strncmp(targetStr, "wait", strlen("wait")) == 0) { } else if (strncmp(targetStr, "wait", strlen("wait")) == 0) {
WaitForFile(source); WaitForFile(source, WAIT_MAX_COUNT);
} else { } else {
return 0; return 0;
} }
......
...@@ -80,7 +80,7 @@ static int GetMountStatusForMountPoint(const char *mountPoint) ...@@ -80,7 +80,7 @@ static int GetMountStatusForMountPoint(const char *mountPoint)
const char *mountFile = "/proc/mounts"; const char *mountFile = "/proc/mounts";
FILE *fp = fopen(mountFile, "r"); FILE *fp = fopen(mountFile, "r");
if (fp == NULL) { if (fp == NULL) {
INIT_LOGE("[init] DoReboot %s can't open.\n", mountPoint); INIT_LOGE("DoReboot %s can't open.\n", mountPoint);
return 1; return 1;
} }
...@@ -103,24 +103,32 @@ static int GetMountStatusForMountPoint(const char *mountPoint) ...@@ -103,24 +103,32 @@ static int GetMountStatusForMountPoint(const char *mountPoint)
void DoReboot(const char *value) void DoReboot(const char *value)
{ {
if (value == NULL) { if (value == NULL) {
INIT_LOGE("[init] DoReboot value = NULL\n"); INIT_LOGE("DoReboot value = NULL\n");
return; return;
} }
INIT_LOGI("[init] DoReboot value = %s\n", value); INIT_LOGI("DoReboot value = %s\n", value);
if (strlen(value) > MAX_VALUE_LENGTH) { 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; return;
} }
const char *valueData = NULL; const char *valueData = NULL;
if (strncmp(value, "reboot,", strlen("reboot,")) != 0) { 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; return;
} else { } else {
valueData = value + strlen("reboot,"); 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 (GetMountStatusForMountPoint("/vendor")) {
if (umount("/vendor") != 0) { if (umount("/vendor") != 0) {
INIT_LOGE("DoReboot umount vendor failed! errno = %d.\n", errno); INIT_LOGE("DoReboot umount vendor failed! errno = %d.\n", errno);
...@@ -131,7 +139,6 @@ void DoReboot(const char *value) ...@@ -131,7 +139,6 @@ void DoReboot(const char *value)
INIT_LOGE("DoReboot umount data failed! errno = %d.\n", errno); INIT_LOGE("DoReboot umount data failed! errno = %d.\n", errno);
} }
} }
StopAllServicesBeforeReboot();
// "shutdown" // "shutdown"
if (strncmp(valueData, "shutdown", strlen("shutdown")) == 0) { if (strncmp(valueData, "shutdown", strlen("shutdown")) == 0) {
int ret = reboot(RB_POWER_OFF); int ret = reboot(RB_POWER_OFF);
...@@ -145,7 +152,7 @@ void DoReboot(const char *value) ...@@ -145,7 +152,7 @@ void DoReboot(const char *value)
struct RBMiscUpdateMessage msg; struct RBMiscUpdateMessage msg;
bool ret = RBMiscReadUpdaterMessage(miscFile, &msg); bool ret = RBMiscReadUpdaterMessage(miscFile, &msg);
if(!ret) { if(!ret) {
INIT_LOGE("[init] DoReboot RBMiscReadUpdaterMessage error.\n"); INIT_LOGE("DoReboot RBMiscReadUpdaterMessage error.\n");
return; return;
} }
const int commandSize = 12; const int commandSize = 12;
...@@ -155,13 +162,13 @@ void DoReboot(const char *value) ...@@ -155,13 +162,13 @@ void DoReboot(const char *value)
if (strlen(valueData) > strlen("updater:") && strncmp(valueData, "updater:", strlen("updater:")) == 0) { if (strlen(valueData) > strlen("updater:") && strncmp(valueData, "updater:", strlen("updater:")) == 0) {
const char *p = valueData + strlen("updater:"); const char *p = valueData + strlen("updater:");
if (snprintf(msg.update, MAX_UPDATE_SIZE, "%s", p) > MAX_UPDATE_SIZE) { 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; return;
} }
msg.update[MAX_UPDATE_SIZE - 1] = 0; msg.update[MAX_UPDATE_SIZE - 1] = 0;
ret = RBMiscWriteUpdaterMessage(miscFile, &msg); ret = RBMiscWriteUpdaterMessage(miscFile, &msg);
if(true != ret) { if(true != ret) {
INIT_LOGE("[init] DoReboot updater: RBMiscWriteUpdaterMessage error\n"); INIT_LOGE("DoReboot updater: RBMiscWriteUpdaterMessage error\n");
return; return;
} }
ret = reboot(RB_AUTOBOOT); ret = reboot(RB_AUTOBOOT);
...@@ -173,7 +180,7 @@ void DoReboot(const char *value) ...@@ -173,7 +180,7 @@ void DoReboot(const char *value)
if (strlen(valueData) == strlen("updater") && strncmp(valueData, "updater", strlen("updater")) == 0) { if (strlen(valueData) == strlen("updater") && strncmp(valueData, "updater", strlen("updater")) == 0) {
ret = RBMiscWriteUpdaterMessage(miscFile, &msg); ret = RBMiscWriteUpdaterMessage(miscFile, &msg);
if(true != ret) { if(true != ret) {
INIT_LOGE("[init] DoReboot updater RBMiscWriteUpdaterMessage error\n"); INIT_LOGE("DoReboot updater RBMiscWriteUpdaterMessage error\n");
return; return;
} }
ret = reboot(RB_AUTOBOOT); ret = reboot(RB_AUTOBOOT);
......
...@@ -15,10 +15,16 @@ ...@@ -15,10 +15,16 @@
#include "init_service.h" #include "init_service.h"
#include <bits/ioctl.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h>
#include <signal.h> #include <signal.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#ifdef __MUSL__
#include <stropts.h>
#endif
#include <sys/param.h> #include <sys/param.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <time.h> #include <time.h>
...@@ -29,9 +35,14 @@ ...@@ -29,9 +35,14 @@
#include "init_log.h" #include "init_log.h"
#include "init_perms.h" #include "init_perms.h"
#include "init_service_socket.h" #include "init_service_socket.h"
#include "init_utils.h"
#define CAP_NUM 2 #define CAP_NUM 2
#define WAIT_MAX_COUNT 10
#ifndef TIOCSCTTY
#define TIOCSCTTY 0x540E
#endif
// 240 seconds, 4 minutes // 240 seconds, 4 minutes
static const int CRASH_TIME_LIMIT = 240; static const int CRASH_TIME_LIMIT = 240;
// maximum number of crashes within time CRASH_TIME_LIMIT for one service // maximum number of crashes within time CRASH_TIME_LIMIT for one service
...@@ -110,6 +121,23 @@ static int SetPerms(const Service *service) ...@@ -110,6 +121,23 @@ static int SetPerms(const Service *service)
return SERVICE_SUCCESS; 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) int ServiceStart(Service *service)
{ {
if (service == NULL) { if (service == NULL) {
...@@ -141,6 +169,9 @@ int ServiceStart(Service *service) ...@@ -141,6 +169,9 @@ int ServiceStart(Service *service)
_exit(0x7f); // 0x7f: user specified _exit(0x7f); // 0x7f: user specified
} }
} }
if (service->attribute & SERVICE_ATTR_CONSOLE) {
OpenConsole();
}
// permissions // permissions
if (SetPerms(service) != SERVICE_SUCCESS) { if (SetPerms(service) != SERVICE_SUCCESS) {
INIT_LOGE("service %s exit! set perms failed! err %d.\n", service->name, errno); INIT_LOGE("service %s exit! set perms failed! err %d.\n", service->name, errno);
......
...@@ -348,8 +348,9 @@ static int GetServiceNumber(const cJSON* curArrItem, Service* curServ, const cha ...@@ -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 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, DISABLED_STR_IN_CFG, strlen(DISABLED_STR_IN_CFG)) == 0
|| strncmp(targetField, ONCE_STR_IN_CFG, strlen(ONCE_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)) { || 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, 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)) { if (!cJSON_IsNumber(filedJ)) {
...@@ -384,6 +385,11 @@ static int GetServiceNumber(const cJSON* curArrItem, Service* curServ, const cha ...@@ -384,6 +385,11 @@ static int GetServiceNumber(const cJSON* curArrItem, Service* curServ, const cha
if (value == 1) { if (value == 1) {
curServ->attribute |= SERVICE_ATTR_DISABLED; 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 { } else {
INIT_LOGE("GetServiceNumber, item = %s, not expected, error.\n", targetField); INIT_LOGE("GetServiceNumber, item = %s, not expected, error.\n", targetField);
return SERVICE_FAILURE; return SERVICE_FAILURE;
...@@ -574,7 +580,7 @@ static int GetServiceOnRestart(const cJSON* curArrItem, Service* curServ) ...@@ -574,7 +580,7 @@ static int GetServiceOnRestart(const cJSON* curArrItem, Service* curServ)
static int CheckServiceKeyName(const cJSON* curService) static int CheckServiceKeyName(const cJSON* curService)
{ {
char *cfgServiceKeyList[] = {"name", "path", "uid", "gid", "once", char *cfgServiceKeyList[] = {"name", "path", "uid", "gid", "once",
"importance", "caps", "disabled", "writepid", "critical", "socket", "importance", "caps", "disabled", "writepid", "critical", "socket", "console"
}; };
if (curService == NULL) { if (curService == NULL) {
return SERVICE_FAILURE; return SERVICE_FAILURE;
...@@ -645,9 +651,10 @@ void ParseAllServices(const cJSON* fileRoot) ...@@ -645,9 +651,10 @@ void ParseAllServices(const cJSON* fileRoot)
int ret6 = GetServiceNumber(curItem, &tmp[i], IMPORTANT_STR_IN_CFG); int ret6 = GetServiceNumber(curItem, &tmp[i], IMPORTANT_STR_IN_CFG);
int ret7 = GetServiceNumber(curItem, &tmp[i], CRITICAL_STR_IN_CFG); // critical int ret7 = GetServiceNumber(curItem, &tmp[i], CRITICAL_STR_IN_CFG); // critical
int ret8 = GetServiceNumber(curItem, &tmp[i], DISABLED_STR_IN_CFG); // disabled int ret8 = GetServiceNumber(curItem, &tmp[i], DISABLED_STR_IN_CFG); // disabled
int ret9 = GetWritepidStrings(curItem, &tmp[i]); // writepid int ret9 = GetServiceNumber(curItem, &tmp[i], CONSOLE_STR_IN_CFG); // console
int reta = GetServiceCaps(curItem, &tmp[i]); int reta = GetWritepidStrings(curItem, &tmp[i]); // writepid
int retAll = ret1 | ret2 | ret3 | ret4 | ret5 | ret6 | ret7 | ret8 | ret9 | reta; int retb = GetServiceCaps(curItem, &tmp[i]);
int retAll = ret1 | ret2 | ret3 | ret4 | ret5 | ret6 | ret7 | ret8 | ret9 | reta | retb;
if (retAll != SERVICE_SUCCESS) { if (retAll != SERVICE_SUCCESS) {
// release resources if it fails // release resources if it fails
ReleaseServiceMem(&tmp[i]); ReleaseServiceMem(&tmp[i]);
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include "init_utils.h" #include "init_utils.h"
#include "securec.h" #include "securec.h"
#define WAIT_MAX_COUNT 10
#define MAX_BUF_SIZE 1024 #define MAX_BUF_SIZE 1024
#ifdef STARTUP_UT #ifdef STARTUP_UT
#define LOG_FILE_NAME "/media/sf_ubuntu/test/log.txt" #define LOG_FILE_NAME "/media/sf_ubuntu/test/log.txt"
...@@ -43,6 +44,7 @@ ...@@ -43,6 +44,7 @@
#define MAX_BUFFER 256 #define MAX_BUFFER 256
#define MAX_EACH_CMD_LENGTH 30 #define MAX_EACH_CMD_LENGTH 30
#define MAX_JSON_FILE_LEN 102400 // max init.cfg size 100KB #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) struct CmdArgs* GetCmd(const char *cmdContent, const char *delim)
{ {
...@@ -177,3 +179,23 @@ int SplitString(char *srcPtr, char **dstPtr, int maxNum) ...@@ -177,3 +179,23 @@ int SplitString(char *srcPtr, char **dstPtr, int maxNum)
} }
return num; 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;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册