提交 c0f5a512 编写于 作者: Z zhong_ning

modify l2 init

Signed-off-by: Nzhong_ning <zhong_ning@hoperun.com>
上级 6af95970
......@@ -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",
......
......@@ -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"]
}, {
......
{
"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" {
#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
......
......@@ -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
......
......@@ -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
......
......@@ -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);
......
......@@ -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));
}
......
......@@ -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;
}
......
......@@ -15,10 +15,16 @@
#include "init_service.h"
#include <bits/ioctl.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef __MUSL__
#include <stropts.h>
#endif
#include <sys/param.h>
#include <sys/stat.h>
#include <time.h>
......@@ -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);
......
......@@ -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]);
......
......@@ -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;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册