Compare commits
132 Commits
openrc-0.9
...
openrc-0.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ceb62969a | ||
|
|
d5ecc9d746 | ||
|
|
6df5176462 | ||
|
|
0c6df86503 | ||
|
|
cd2d520fd1 | ||
|
|
0e3860e76f | ||
|
|
670b72b328 | ||
|
|
3ebaa31edb | ||
|
|
0f3813c8cf | ||
|
|
28c13790ff | ||
|
|
7e9861da0e | ||
|
|
6241f17e95 | ||
|
|
6cecc7b4a6 | ||
|
|
82d3918d7a | ||
|
|
ee1a698451 | ||
|
|
2486eb4989 | ||
|
|
0813a80223 | ||
|
|
3969cb2a85 | ||
|
|
b5917a817c | ||
|
|
9e196a71ad | ||
|
|
ca7d67021e | ||
|
|
8c82637e76 | ||
|
|
8d63719418 | ||
|
|
3967077da3 | ||
|
|
f971c4c0b5 | ||
|
|
9d0dce35c3 | ||
|
|
441272ff97 | ||
|
|
fd6bbfbe07 | ||
|
|
a6549a2b0f | ||
|
|
1f5072421e | ||
|
|
4943ddcb1c | ||
|
|
be5de328e9 | ||
|
|
37af1693b4 | ||
|
|
9127684553 | ||
|
|
0571a7e05b | ||
|
|
300c03203d | ||
|
|
f9162438bc | ||
|
|
533813dda0 | ||
|
|
6ac182c9ca | ||
|
|
09327f429f | ||
|
|
8104618d10 | ||
|
|
eb11953dd2 | ||
|
|
b264931034 | ||
|
|
76d3fceb58 | ||
|
|
65be94a34a | ||
|
|
c75352af3d | ||
|
|
b27a9003bb | ||
|
|
9fa54a8e80 | ||
|
|
7a1e4ef606 | ||
|
|
0dc9431bdb | ||
|
|
0fa164dff2 | ||
|
|
582c8e9868 | ||
|
|
de6323ba51 | ||
|
|
3272261479 | ||
|
|
3247184d86 | ||
|
|
32c506a4c8 | ||
|
|
04db6c3d39 | ||
|
|
3c602e7422 | ||
|
|
e4146c0945 | ||
|
|
9e3fc7f3f5 | ||
|
|
06d6701785 | ||
|
|
297720787f | ||
|
|
47c3b28459 | ||
|
|
f18763bcd8 | ||
|
|
dd2b4a067a | ||
|
|
44e4c21f05 | ||
|
|
bc581530e5 | ||
|
|
04afaa3c03 | ||
|
|
a21a2c3e32 | ||
|
|
a5509d6819 | ||
|
|
0c866e1a31 | ||
|
|
1c7d3165e4 | ||
|
|
8199dee8d6 | ||
|
|
a5ad5ba971 | ||
|
|
79d6f10926 | ||
|
|
5396bf1851 | ||
|
|
6913f1deb6 | ||
|
|
09c8c8ed9f | ||
|
|
d9dc5dc423 | ||
|
|
8c55f1e50d | ||
|
|
94661b1d22 | ||
|
|
b9cc589882 | ||
|
|
0baa57a880 | ||
|
|
f5e7e76852 | ||
|
|
5021c119c7 | ||
|
|
29a1ad3d18 | ||
|
|
659f7c2bc8 | ||
|
|
497ff7ee41 | ||
|
|
0fcc6251fc | ||
|
|
7da8394a8e | ||
|
|
0ff23f20e8 | ||
|
|
cea71369e9 | ||
|
|
fb4aa20d05 | ||
|
|
5a8344a3d1 | ||
|
|
2d2751c433 | ||
|
|
6be8a0679b | ||
|
|
58e04035ed | ||
|
|
ab9cf25197 | ||
|
|
7ea5c614d9 | ||
|
|
5d441dd376 | ||
|
|
44019f6542 | ||
|
|
de5cee2c21 | ||
|
|
3ad501218d | ||
|
|
43a155a313 | ||
|
|
fb00b10669 | ||
|
|
8b4fc05ff2 | ||
|
|
ced60319e3 | ||
|
|
cacea4e7f3 | ||
|
|
ce4c9b5397 | ||
|
|
426b94bd69 | ||
|
|
06b8084b2c | ||
|
|
e3d0fe06bd | ||
|
|
319f5003c6 | ||
|
|
30a565f80d | ||
|
|
6e2fbf6a0f | ||
|
|
2990e5a2e3 | ||
|
|
85c90f9a1d | ||
|
|
c529a57650 | ||
|
|
9c0edc5c52 | ||
|
|
d729f9d0f2 | ||
|
|
fdc8849e56 | ||
|
|
30a56cdb46 | ||
|
|
14625346c0 | ||
|
|
c3be42006b | ||
|
|
6fcc55cef8 | ||
|
|
380752f4e0 | ||
|
|
e7649f117a | ||
|
|
66f4305e1c | ||
|
|
4255ba175b | ||
|
|
d02d3af02e | ||
|
|
61e05331d1 | ||
|
|
f2e404ab66 |
4
Makefile
4
Makefile
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
SUBDIR= conf.d doc etc init.d local.d man net scripts sh src
|
SUBDIR= conf.d doc etc init.d local.d sysctl.d man net scripts sh src
|
||||||
|
|
||||||
# Build pkgconfig or not
|
# Build pkgconfig or not
|
||||||
MKPKGCONFIG?= yes
|
MKPKGCONFIG?= yes
|
||||||
@@ -25,6 +25,8 @@ include ${MK}/dist.mk
|
|||||||
include ${MK}/git.mk
|
include ${MK}/git.mk
|
||||||
|
|
||||||
_installafter:
|
_installafter:
|
||||||
|
ifneq ($(OS),Linux)
|
||||||
${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/init.d
|
${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/init.d
|
||||||
|
endif
|
||||||
${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/tmp
|
${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/tmp
|
||||||
${ECHO} "${VERSION}${GITVER}" > ${DESTDIR}/${LIBEXECDIR}/version
|
${ECHO} "${VERSION}${GITVER}" > ${DESTDIR}/${LIBEXECDIR}/version
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
NAME= openrc
|
NAME= openrc
|
||||||
VERSION= 0.9.8
|
VERSION= 0.10.4
|
||||||
PKG= ${NAME}-${VERSION}
|
PKG= ${NAME}-${VERSION}
|
||||||
|
|||||||
15
README
15
README
@@ -12,7 +12,6 @@ LIBNAME=lib64
|
|||||||
DESTDIR=/tmp/openrc-image
|
DESTDIR=/tmp/openrc-image
|
||||||
MKPAM=pam
|
MKPAM=pam
|
||||||
MKPKGCONFIG=no
|
MKPKGCONFIG=no
|
||||||
MKRCSYS=prefix
|
|
||||||
MKSELINUX=yes
|
MKSELINUX=yes
|
||||||
MKSTATICLIBS=no
|
MKSTATICLIBS=no
|
||||||
MKTERMCAP=ncurses
|
MKTERMCAP=ncurses
|
||||||
@@ -34,20 +33,6 @@ LOCAL_PREFIX should be set when to where user maintained packages are.
|
|||||||
Only set LOCAL_PREFIX if different from PKG_PREFIX.
|
Only set LOCAL_PREFIX if different from PKG_PREFIX.
|
||||||
PREFIX should be set when OpenRC is not installed to /.
|
PREFIX should be set when OpenRC is not installed to /.
|
||||||
|
|
||||||
MKRCSYS should be set only if you need to specify a default system
|
|
||||||
subtype. The subtype should be set to match the type of environment the
|
|
||||||
file is installed into, not the virtualization the environment is
|
|
||||||
capable of handling. Here is a list of subtypes and their meanings.
|
|
||||||
|
|
||||||
jail FreeBSD jail
|
|
||||||
lxc Linux container
|
|
||||||
openvz Linux OpenVZ
|
|
||||||
prefix Linux and *BSD prefix system
|
|
||||||
uml UsermodeLinux
|
|
||||||
vserver Linux vserver
|
|
||||||
xen0 Linux and NetBSD xen0 Domain
|
|
||||||
xenU Linux and NetBSD xenU Domain
|
|
||||||
|
|
||||||
If any of the following files exist then we do not overwrite them
|
If any of the following files exist then we do not overwrite them
|
||||||
/etc/devd.conf
|
/etc/devd.conf
|
||||||
/etc/rc
|
/etc/rc
|
||||||
|
|||||||
14
TODO
14
TODO
@@ -5,3 +5,17 @@
|
|||||||
- oldnet[bridging]: Review setting of bridge configuration on dynamic interface add
|
- oldnet[bridging]: Review setting of bridge configuration on dynamic interface add
|
||||||
|
|
||||||
- Document rc-depend binary.
|
- Document rc-depend binary.
|
||||||
|
|
||||||
|
- _ifindex is not a reliable means of calculating metrics:
|
||||||
|
_ifindex is used for calculating metrics for new devices but has a major
|
||||||
|
problem: Since it's only the nth entry in /proc/net/dev
|
||||||
|
And devices may be removed from that file, and reordered, you won't always
|
||||||
|
get the same result.
|
||||||
|
If you do:
|
||||||
|
- add eth0 - _ifindex (eth0=0)
|
||||||
|
- add vlan1 - _ifindex (eth0=0,vlan1=1)
|
||||||
|
- add vlan2 - _ifindex (eth0=0,vlan1=1,vlan2=2)
|
||||||
|
- rem vlan1 - _ifindex (eth0=0,vlan2=1)
|
||||||
|
- add vlan3 - _ifindex (eth0=0,vlan2=1,vlan3=2)
|
||||||
|
Now your routing table has entries for both vlan2 and vlan3 with a metric of 2.
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
|
# The consolefont service is not activated by default. If you need to
|
||||||
|
# use it, you should run "rc-update add consolefont boot" as root.
|
||||||
|
#
|
||||||
# consolefont specifies the default font that you'd like Linux to use on the
|
# consolefont specifies the default font that you'd like Linux to use on the
|
||||||
# console. You can find a good selection of fonts in /usr/share/consolefonts;
|
# console. You can find a good selection of fonts in /usr/share/consolefonts;
|
||||||
# you shouldn't specify the trailing ".psf.gz", just the font name below.
|
# you shouldn't specify the trailing ".psf.gz", just the font name below.
|
||||||
# To use the default console font, comment out the CONSOLEFONT setting below.
|
# To use the default console font, comment out the CONSOLEFONT setting below.
|
||||||
# This setting is used by the /etc/init.d/consolefont script (NOTE: if you do
|
|
||||||
# not want to use it, run "rc-update del consolefont boot" as root).
|
|
||||||
consolefont="default8x16"
|
consolefont="default8x16"
|
||||||
|
|
||||||
# consoletranslation is the charset map file to use. Leave commented to use
|
# consoletranslation is the charset map file to use. Leave commented to use
|
||||||
|
|||||||
@@ -4,18 +4,16 @@
|
|||||||
# you should set it to "local".
|
# you should set it to "local".
|
||||||
clock="UTC"
|
clock="UTC"
|
||||||
|
|
||||||
# If you want to set the Hardware Clock to the current System Time
|
# If you want the hwclock script to set the system time (software clock)
|
||||||
# (software clock) during shutdown, then say "YES" here.
|
# to match the current hardware clock during bootup, leave this
|
||||||
# You normally don't need to do this if you run a ntp daemon.
|
# commented out.
|
||||||
clock_systohc="NO"
|
# However, you can set this to "NO" ifyou are running a modern kernel
|
||||||
|
# with CONFIG_RTC_HCTOSYS set to y and your hardware clock set to UTC.
|
||||||
|
#clock_hctosys="YES"
|
||||||
|
|
||||||
# If you want to set the system time to the current hardware clock
|
# If you do not want to set the hardware clock to the current system
|
||||||
# during bootup, then say "YES" here. You do not need this if you are
|
# time (software clock) during shutdown, set this to no.
|
||||||
# running a modern kernel with CONFIG_RTC_HCTOSYS set to y.
|
#clock_systohc="YES"
|
||||||
# Also, be aware that if you set this to "NO", the system time will
|
|
||||||
# never be saved to the hardware clock unless you set
|
|
||||||
# clock_systohc="YES" above.
|
|
||||||
clock_hctosys="YES"
|
|
||||||
|
|
||||||
# If you wish to pass any other arguments to hwclock during bootup,
|
# If you wish to pass any other arguments to hwclock during bootup,
|
||||||
# you may do so here. Alpha users may wish to use --arc or --srm here.
|
# you may do so here. Alpha users may wish to use --arc or --srm here.
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
# In other words, you probably should DO NOTHING HERE...
|
# In other words, you probably should DO NOTHING HERE...
|
||||||
|
|
||||||
# Prefer ifconfig over iproute2
|
# Prefer ifconfig over iproute2
|
||||||
#modules="ifconfig"
|
#modules="!iproute2"
|
||||||
|
|
||||||
# You can also specify other modules for an interface
|
# You can also specify other modules for an interface
|
||||||
# In this case we prefer udhcpc over dhcpcd
|
# In this case we prefer udhcpc over dhcpcd
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
|
|
||||||
# If you don't specify an interface then we prefer iproute2 if it's installed
|
# If you don't specify an interface then we prefer iproute2 if it's installed
|
||||||
# To prefer ifconfig over iproute2
|
# To prefer ifconfig over iproute2
|
||||||
#modules="ifconfig"
|
#modules="!iproute2"
|
||||||
|
|
||||||
# For a static configuration, use something like this
|
# For a static configuration, use something like this
|
||||||
# (They all do exactly the same thing btw)
|
# (They all do exactly the same thing btw)
|
||||||
@@ -68,6 +68,7 @@
|
|||||||
# NOTE: ifconfig creates an aliased device for each extra IPv4 address
|
# NOTE: ifconfig creates an aliased device for each extra IPv4 address
|
||||||
# (eth0:1, eth0:2, etc)
|
# (eth0:1, eth0:2, etc)
|
||||||
# iproute2 does not do this as there is no need to
|
# iproute2 does not do this as there is no need to
|
||||||
|
# WARNING: You cannot mix multiple addresses on a line with other parameters!
|
||||||
#config_eth0="192.168.0.2/24 192.168.0.3/24 192.168.0.4/24"
|
#config_eth0="192.168.0.2/24 192.168.0.3/24 192.168.0.4/24"
|
||||||
# However, that only works with CIDR addresses, so you can't use netmask.
|
# However, that only works with CIDR addresses, so you can't use netmask.
|
||||||
|
|
||||||
@@ -85,6 +86,14 @@
|
|||||||
# If you don't want ANY address (only useful when calling for advanced stuff)
|
# If you don't want ANY address (only useful when calling for advanced stuff)
|
||||||
#config_eth0="null"
|
#config_eth0="null"
|
||||||
|
|
||||||
|
# If you need to pass parameters to go with an address, you can do so on the
|
||||||
|
# same line as the address. You should split multiple addresses with newlines.
|
||||||
|
# WARNING: You cannot mix multiple addresses on a line with other parameters!
|
||||||
|
#config_eth0="192.168.0.2/24 scope host"
|
||||||
|
#config_eth0="4321:0:1:2:3:4:567:89ab/64 nodad home preferred_lft 0"
|
||||||
|
#config_eth0="192.168.0.2/24 scope host
|
||||||
|
#4321:0:1:2:3:4:567:89ab/64 nodad home preferred_lft 0"
|
||||||
|
|
||||||
# Here's how to do routing if you need it
|
# Here's how to do routing if you need it
|
||||||
# We add an IPv4 default route, IPv4 subnet route and an IPv6 unicast route
|
# We add an IPv4 default route, IPv4 subnet route and an IPv6 unicast route
|
||||||
#routes_eth0="default via 192.168.0.1
|
#routes_eth0="default via 192.168.0.1
|
||||||
@@ -577,10 +586,15 @@
|
|||||||
#vlan_start_eth0="no"
|
#vlan_start_eth0="no"
|
||||||
|
|
||||||
# If you do the above then you may want to depend on eth0 like so
|
# If you do the above then you may want to depend on eth0 like so
|
||||||
# rc_need_vlan1="net.eth0"
|
# rc_net_vlan1_need="net.eth0"
|
||||||
# NOTE: depend functions only work in /etc/conf.d/net
|
# NOTE: depend functions only work in /etc/conf.d/net
|
||||||
# and not in profile configs such as /etc/conf.d/net.foo
|
# and not in profile configs such as /etc/conf.d/net.foo
|
||||||
|
|
||||||
|
# Also, you might want to make eth0 not provide net in this case so that
|
||||||
|
# dependent services will start when the vlan is active instead of the
|
||||||
|
# physical interface.
|
||||||
|
# rc_net_eth0_provide="!net"
|
||||||
|
|
||||||
# MAC-VLAN support
|
# MAC-VLAN support
|
||||||
# The following configuration can be used to create a new interface 'macvlan0'
|
# The following configuration can be used to create a new interface 'macvlan0'
|
||||||
# linked to 'eth0'
|
# linked to 'eth0'
|
||||||
@@ -602,14 +616,27 @@
|
|||||||
#slaves_bond0="eth0 eth1 eth2"
|
#slaves_bond0="eth0 eth1 eth2"
|
||||||
#config_bond0="null" # You may not want to assign an IP the the bond
|
#config_bond0="null" # You may not want to assign an IP the the bond
|
||||||
|
|
||||||
# You can also configure the bond here, which must be done via sysfs on 2.6
|
# Please note, that you should generally NOT try to change the MAC addresses of
|
||||||
# kernels or newer. See the kernel bonding documentation for a description of
|
# a bond interface yourself. If you do so, the kernel and your network switches
|
||||||
# these options.
|
# may not work quite right. It is permissible to set the MAC addresses of bond
|
||||||
|
# slaves BEFORE the bond comes up, but not after the bond is up (it will change
|
||||||
|
# MAC addresses of the slaves on it's own).
|
||||||
|
|
||||||
|
# You can also configure the parameters of the bond here, which must be done
|
||||||
|
# via sysfs on 2.6 kernels or newer. The description of all the options can be
|
||||||
|
# found in the kernel: /usr/src/linux-*/Documentation/networking/bonding.txt
|
||||||
|
# You will probably want the 'mode' option at the least.
|
||||||
|
# Some possible parameters: mode fail_over_mac arp_validate arp_interval
|
||||||
|
# arp_ip_target downdelay updelay lacp_rate ad_select xmit_hash_policy
|
||||||
|
# num_grat_arp num_unsol_na miimon primary primary_reselect use_carrier
|
||||||
|
# active_slave queue_id all_slaves_active resend_igmp min_links
|
||||||
|
#mode_bond0="round-robin"
|
||||||
|
#miimon_bond0="100"
|
||||||
#arp_ip_target_bond0="+26.0.0.0"
|
#arp_ip_target_bond0="+26.0.0.0"
|
||||||
|
|
||||||
# If any of the slaves require extra configuration - for example wireless or
|
# If any of the slaves require extra configuration - for example wireless or
|
||||||
# ppp devices - we need to depend function on the bonded interfaces
|
# ppp devices - we need to depend function on the bonded interfaces
|
||||||
#rc_need_bond0="net.eth0 net.eth1"
|
#rc_net_bond0_need="net.eth0 net.eth1"
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
@@ -726,7 +753,7 @@
|
|||||||
# If the link require extra configuration - for example wireless or
|
# If the link require extra configuration - for example wireless or
|
||||||
# RFC 268 bridge - we need to depend on the bridge so they get
|
# RFC 268 bridge - we need to depend on the bridge so they get
|
||||||
# configured correctly.
|
# configured correctly.
|
||||||
#rc_need_ppp0="net.nas0"
|
#rc_net_ppp0_need="net.nas0"
|
||||||
|
|
||||||
#WARNING: if MTU of the PPP interface is less than 1500 and you use this
|
#WARNING: if MTU of the PPP interface is less than 1500 and you use this
|
||||||
#machine as a router, you should add the following rule to your firewall
|
#machine as a router, you should add the following rule to your firewall
|
||||||
@@ -766,6 +793,8 @@
|
|||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# MAC changer
|
# MAC changer
|
||||||
|
# Warning: Do NOT use this on bonding interfaces! Bonding changes MACs itself.
|
||||||
|
#
|
||||||
# To set a specific MAC address
|
# To set a specific MAC address
|
||||||
#mac_eth0="00:11:22:33:44:55"
|
#mac_eth0="00:11:22:33:44:55"
|
||||||
|
|
||||||
@@ -838,7 +867,7 @@
|
|||||||
|
|
||||||
# If any of the ports require extra configuration - for example wireless or
|
# If any of the ports require extra configuration - for example wireless or
|
||||||
# ppp devices - we need to depend on them like so.
|
# ppp devices - we need to depend on them like so.
|
||||||
#rc_need_br0="net.eth0 net.eth1"
|
#rc_net_br0_need="net.eth0 net.eth1"
|
||||||
|
|
||||||
# Below is an example of configuring the bridge
|
# Below is an example of configuring the bridge
|
||||||
# Consult "man brctl" for more details
|
# Consult "man brctl" for more details
|
||||||
@@ -889,7 +918,7 @@
|
|||||||
# link_6to4="eth0" # Interface to base its addresses on
|
# link_6to4="eth0" # Interface to base its addresses on
|
||||||
# config_6to4="ip6to4"
|
# config_6to4="ip6to4"
|
||||||
# You may want to depend on eth0 like so
|
# You may want to depend on eth0 like so
|
||||||
#rc_need_6to4="net.eth0"
|
#rc_net_6to4_need="net.eth0"
|
||||||
# To ensure that eth0 is configured before 6to4. Of course, the tunnel could be
|
# To ensure that eth0 is configured before 6to4. Of course, the tunnel could be
|
||||||
# any name and this also works for any configured interface.
|
# any name and this also works for any configured interface.
|
||||||
# NOTE: If you're not using iproute2 then your 6to4 tunnel has to be called
|
# NOTE: If you're not using iproute2 then your 6to4 tunnel has to be called
|
||||||
|
|||||||
@@ -24,14 +24,5 @@ SED_EXTRA= ${SED_EXTRA-${OS}}
|
|||||||
|
|
||||||
include ${MK}/scripts.mk
|
include ${MK}/scripts.mk
|
||||||
|
|
||||||
# We can't use "ifndef" here because that treats set-but-empty
|
|
||||||
# as not-set which is not what we want
|
|
||||||
MKRCSYS ?= automagicplease
|
|
||||||
ifeq (${MKRCSYS},automagicplease)
|
|
||||||
# If the user isn't picking a default, then have the
|
|
||||||
# config go with runtime automagic detection #357247
|
|
||||||
rc.conf: SED_EXTRA += -e '/^rc_sys=""/s:^:\#:'
|
|
||||||
MKRCSYS =
|
|
||||||
endif
|
|
||||||
rc.conf: rc.conf.in rc.conf.${OS}
|
rc.conf: rc.conf.in rc.conf.${OS}
|
||||||
${SED} ${SED_REPLACE} ${SED_EXTRA} $^ > $@
|
${SED} ${SED_REPLACE} ${SED_EXTRA} $^ > $@
|
||||||
|
|||||||
@@ -4,11 +4,9 @@
|
|||||||
# This is the subsystem type. Valid options on FreeBSD:
|
# This is the subsystem type. Valid options on FreeBSD:
|
||||||
# "" - nothing special
|
# "" - nothing special
|
||||||
# "jail" - FreeBSD jails
|
# "jail" - FreeBSD jails
|
||||||
# "prefix" - Prefix
|
# If this is commented out, automatic detection will be used.
|
||||||
# If this is commented out, automatic detection will be attempted.
|
|
||||||
# Note that automatic detection does not work in a prefix environment.
|
|
||||||
#
|
#
|
||||||
# This should be set to the value representing the environment this file is
|
# This should be set to the value representing the environment this file is
|
||||||
# PRESENTLY in, not the virtualization the environment is capable of.
|
# PRESENTLY in, not the virtualization the environment is capable of.
|
||||||
rc_sys="@RC_SYS_DEFAULT@"
|
#rc_sys=""
|
||||||
|
|
||||||
|
|||||||
@@ -5,18 +5,15 @@
|
|||||||
# "" - nothing special
|
# "" - nothing special
|
||||||
# "lxc" - Linux Containers
|
# "lxc" - Linux Containers
|
||||||
# "openvz" - Linux OpenVZ
|
# "openvz" - Linux OpenVZ
|
||||||
# "prefix" - Prefix
|
|
||||||
# "uml" - Usermode Linux
|
# "uml" - Usermode Linux
|
||||||
# "vserver" - Linux vserver
|
# "vserver" - Linux vserver
|
||||||
# "xen0" - Xen0 Domain
|
# "xen0" - Xen0 Domain
|
||||||
# "xenU" - XenU Domain
|
# "xenU" - XenU Domain
|
||||||
# If this is commented out, automatic detection will be attempted.
|
# If this is commented out, automatic detection will be used.
|
||||||
# Note that autodetection will not work in a prefix environment or in a
|
|
||||||
# linux container.
|
|
||||||
#
|
#
|
||||||
# This should be set to the value representing the environment this file is
|
# This should be set to the value representing the environment this file is
|
||||||
# PRESENTLY in, not the virtualization the environment is capable of.
|
# PRESENTLY in, not the virtualization the environment is capable of.
|
||||||
rc_sys="@RC_SYS_DEFAULT@"
|
#rc_sys=""
|
||||||
|
|
||||||
# This is the number of tty's used in most of the rc-scripts (like
|
# This is the number of tty's used in most of the rc-scripts (like
|
||||||
# consolefont, numlock, etc ...)
|
# consolefont, numlock, etc ...)
|
||||||
|
|||||||
@@ -3,13 +3,11 @@
|
|||||||
|
|
||||||
# This is the subsystem type. Valid options on NetBSD:
|
# This is the subsystem type. Valid options on NetBSD:
|
||||||
# "" - nothing special
|
# "" - nothing special
|
||||||
# "prefix" - Prefix
|
|
||||||
# "xen0" - Xen0 Domain
|
# "xen0" - Xen0 Domain
|
||||||
# "xenU" - XenU Domain
|
# "xenU" - XenU Domain
|
||||||
# If this is commented out, automatic detection will be attempted.
|
# If this is commented out, automatic detection will be used.
|
||||||
# Note that automatic detection does not work in a prefix environment.
|
|
||||||
#
|
#
|
||||||
# This should be set to the value representing the environment this file is
|
# This should be set to the value representing the environment this file is
|
||||||
# PRESENTLY in, not the virtualization the environment is capable of.
|
# PRESENTLY in, not the virtualization the environment is capable of.
|
||||||
rc_sys="@RC_SYS_DEFAULT@"
|
#rc_sys=""
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,18 @@
|
|||||||
# Global OpenRC configuration settings
|
# Global OpenRC configuration settings
|
||||||
|
|
||||||
|
# Set to "YES" if you want the rc system to try and start services
|
||||||
|
# in parallel for a slight speed improvement. When running in parallel we
|
||||||
|
# prefix the service output with its name as the output will get
|
||||||
|
# jumbled up.
|
||||||
|
# WARNING: whilst we have improved parallel, it can still potentially lock
|
||||||
|
# the boot process. Don't file bugs about this unless you can supply
|
||||||
|
# patches that fix it without breaking other things!
|
||||||
|
#rc_parallel="NO"
|
||||||
|
|
||||||
# Set rc_interactive to "YES" and you'll be able to press the I key during
|
# Set rc_interactive to "YES" and you'll be able to press the I key during
|
||||||
# boot so you can choose to start specific services. Set to "NO" to disable
|
# boot so you can choose to start specific services. Set to "NO" to disable
|
||||||
# this feature.
|
# this feature. This feature is automatically disabled if rc_parallel is
|
||||||
|
# set to YES.
|
||||||
#rc_interactive="YES"
|
#rc_interactive="YES"
|
||||||
|
|
||||||
# If we need to drop to a shell, you can specify it here.
|
# If we need to drop to a shell, you can specify it here.
|
||||||
|
|||||||
1
init.d/.gitignore
vendored
1
init.d/.gitignore
vendored
@@ -11,6 +11,7 @@ network
|
|||||||
root
|
root
|
||||||
savecache
|
savecache
|
||||||
swap
|
swap
|
||||||
|
swapfiles
|
||||||
sysctl
|
sysctl
|
||||||
urandom
|
urandom
|
||||||
devfs
|
devfs
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
DIR= ${INITDIR}
|
DIR= ${INITDIR}
|
||||||
SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in netmount.in \
|
SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in netmount.in \
|
||||||
network.in root.in savecache.in staticroute.in swap.in swclock.in \
|
network.in root.in savecache.in staticroute.in swap.in swapfiles.in \
|
||||||
sysctl.in urandom.in ${SRCS-${OS}}
|
swclock.in sysctl.in urandom.in ${SRCS-${OS}}
|
||||||
BIN= ${OBJS}
|
BIN= ${OBJS}
|
||||||
|
|
||||||
INSTALLAFTER= _installafter_net.lo
|
INSTALLAFTER= _installafter_net.lo
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ depend()
|
|||||||
[ "$clock" != "UTC" -a ! -e /etc/wall_cmos_clock ]; then
|
[ "$clock" != "UTC" -a ! -e /etc/wall_cmos_clock ]; then
|
||||||
need root
|
need root
|
||||||
fi
|
fi
|
||||||
keyword -jail -prefix
|
keyword -jail
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -7,12 +7,7 @@ depend()
|
|||||||
need localmount
|
need localmount
|
||||||
before logger
|
before logger
|
||||||
after clock sysctl
|
after clock sysctl
|
||||||
keyword -prefix -timeout
|
keyword -timeout
|
||||||
}
|
|
||||||
|
|
||||||
dir_writable()
|
|
||||||
{
|
|
||||||
mkdir "$1"/.test.$$ 2>/dev/null && rmdir "$1"/.test.$$
|
|
||||||
}
|
}
|
||||||
|
|
||||||
: ${wipe_tmp:=${WIPE_TMP:-yes}}
|
: ${wipe_tmp:=${WIPE_TMP:-yes}}
|
||||||
@@ -25,7 +20,7 @@ cleanup_tmp_dir()
|
|||||||
if ! [ -d "$dir" ]; then
|
if ! [ -d "$dir" ]; then
|
||||||
mkdir -p "$dir" || return $?
|
mkdir -p "$dir" || return $?
|
||||||
fi
|
fi
|
||||||
dir_writable "$dir" || return 1
|
checkpath -W "$dir" || return 1
|
||||||
chmod a+rwt "$dir" 2> /dev/null
|
chmod a+rwt "$dir" 2> /dev/null
|
||||||
cd "$dir" || return 1
|
cd "$dir" || return 1
|
||||||
if yesno $wipe_tmp; then
|
if yesno $wipe_tmp; then
|
||||||
@@ -122,7 +117,7 @@ start()
|
|||||||
migrate_to_run /var/run /run
|
migrate_to_run /var/run /run
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if dir_writable /var/run; then
|
if checkpath -W /var/run; then
|
||||||
ebegin "Creating user login records"
|
ebegin "Creating user login records"
|
||||||
local xtra=
|
local xtra=
|
||||||
[ "$RC_UNAME" = NetBSD ] && xtra=x
|
[ "$RC_UNAME" = NetBSD ] && xtra=x
|
||||||
@@ -164,7 +159,7 @@ start()
|
|||||||
cleanup_tmp_dir "$tmp"
|
cleanup_tmp_dir "$tmp"
|
||||||
done
|
done
|
||||||
|
|
||||||
if dir_writable /tmp; then
|
if checkpath -W /tmp; then
|
||||||
# Make sure our X11 stuff have the correct permissions
|
# Make sure our X11 stuff have the correct permissions
|
||||||
# Omit the chown as bootmisc is run before network is up
|
# Omit the chown as bootmisc is run before network is up
|
||||||
# and users may be using lame LDAP auth #139411
|
# and users may be using lame LDAP auth #139411
|
||||||
@@ -177,7 +172,7 @@ start()
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if yesno $log_dmesg; then
|
if yesno $log_dmesg; then
|
||||||
if $logw || dir_writable /var/log; then
|
if $logw || checkpath -W /var/log; then
|
||||||
# Create an 'after-boot' dmesg log
|
# Create an 'after-boot' dmesg log
|
||||||
if [ "$RC_SYS" != VSERVER -a "$RC_SYS" != OPENVZ ]; then
|
if [ "$RC_SYS" != VSERVER -a "$RC_SYS" != OPENVZ ]; then
|
||||||
dmesg > /var/log/dmesg
|
dmesg > /var/log/dmesg
|
||||||
@@ -186,7 +181,6 @@ start()
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[ -w /etc/nologin ] && rm -f /etc/nologin
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ depend()
|
|||||||
{
|
{
|
||||||
need localmount termencoding
|
need localmount termencoding
|
||||||
after hotplug bootmisc
|
after hotplug bootmisc
|
||||||
keyword -openvz -prefix -uml -vserver -xenu -lxc
|
keyword -openvz -uml -vserver -xenu -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
@@ -54,7 +54,7 @@ start()
|
|||||||
eend $retval
|
eend $retval
|
||||||
|
|
||||||
# Store the last font so we can use it ASAP on boot
|
# Store the last font so we can use it ASAP on boot
|
||||||
if [ $retval -eq 0 -a -w "$RC_LIBEXECDIR" ]; then
|
if [ $retval -eq 0 ] && checkpath -W "$RC_LIBEXECDIR"; then
|
||||||
mkdir -p "$RC_LIBEXECDIR"/console
|
mkdir -p "$RC_LIBEXECDIR"/console
|
||||||
for font in /usr/share/consolefonts/"$consolefont".*; do
|
for font in /usr/share/consolefonts/"$consolefont".*; do
|
||||||
:
|
:
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ depend() {
|
|||||||
need localmount
|
need localmount
|
||||||
after bootmisc
|
after bootmisc
|
||||||
before net.lo0
|
before net.lo0
|
||||||
keyword -jail -prefix
|
keyword -jail
|
||||||
}
|
}
|
||||||
|
|
||||||
start_pre() {
|
start_pre() {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ description="Mount system critical filesystems in /dev."
|
|||||||
|
|
||||||
depend() {
|
depend() {
|
||||||
use dev
|
use dev
|
||||||
keyword -prefix -vserver
|
keyword -vserver
|
||||||
}
|
}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ description="Configures a specific kernel dump device."
|
|||||||
|
|
||||||
depend() {
|
depend() {
|
||||||
need swap
|
need swap
|
||||||
keyword -jail -prefix
|
keyword -jail
|
||||||
}
|
}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ _IFS="
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
use dev clock modules
|
use dev clock modules
|
||||||
keyword -jail -openvz -prefix -timeout -vserver -lxc
|
keyword -jail -openvz -timeout -vserver -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
_abort() {
|
_abort() {
|
||||||
@@ -71,7 +71,12 @@ start()
|
|||||||
done
|
done
|
||||||
|
|
||||||
if [ "$RC_UNAME" = Linux ]; then
|
if [ "$RC_UNAME" = Linux ]; then
|
||||||
fsck_opts="$fsck_opts -C0 -T"
|
local skiptypes x
|
||||||
|
for x in $net_fs_list $extra_net_fs_list; do
|
||||||
|
skiptypes="${skiptypes}no${x},"
|
||||||
|
done
|
||||||
|
skiptypes="${skiptypes}noopts=_netdev"
|
||||||
|
fsck_opts="$fsck_opts -C0 -T -t $skiptypes"
|
||||||
if [ -z "$fsck_passno" -a -z "$fsck_mnt" ]; then
|
if [ -z "$fsck_passno" -a -z "$fsck_mnt" ]; then
|
||||||
fsck_args=${fsck_args--A -p}
|
fsck_args=${fsck_args--A -p}
|
||||||
if echo 2>/dev/null >/.test.$$; then
|
if echo 2>/dev/null >/.test.$$; then
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ depend()
|
|||||||
{
|
{
|
||||||
use root
|
use root
|
||||||
before devd net
|
before devd net
|
||||||
keyword -jail -prefix
|
keyword -jail
|
||||||
}
|
}
|
||||||
|
|
||||||
_set()
|
_set()
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
description="Sets the hostname of the machine."
|
description="Sets the hostname of the machine."
|
||||||
|
|
||||||
depend() {
|
depend() {
|
||||||
keyword -prefix -lxc
|
keyword -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ depend()
|
|||||||
else
|
else
|
||||||
before *
|
before *
|
||||||
fi
|
fi
|
||||||
keyword -openvz -prefix -uml -vserver -xenu -lxc
|
keyword -openvz -uml -vserver -xenu -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
setupopts()
|
setupopts()
|
||||||
@@ -94,7 +94,7 @@ start()
|
|||||||
"$utc_cmd" != --utc -o \
|
"$utc_cmd" != --utc -o \
|
||||||
-n "$clock_args" ];
|
-n "$clock_args" ];
|
||||||
then
|
then
|
||||||
if yesno $clock_hctosys; then
|
if yesno ${clock_hctosys:-YES}; then
|
||||||
_hwclock --hctosys $utc_cmd $clock_args
|
_hwclock --hctosys $utc_cmd $clock_args
|
||||||
else
|
else
|
||||||
_hwclock --systz $utc_cmd $clock_args
|
_hwclock --systz $utc_cmd $clock_args
|
||||||
@@ -111,7 +111,7 @@ stop()
|
|||||||
{
|
{
|
||||||
# Don't tweak the hardware clock on LiveCD halt.
|
# Don't tweak the hardware clock on LiveCD halt.
|
||||||
[ -n "$CDBOOT" ] && return 0
|
[ -n "$CDBOOT" ] && return 0
|
||||||
yesno $clock_systohc || return 0
|
yesno ${clock_systohc:-YES} || return 0
|
||||||
|
|
||||||
local retval=0 errstr=""
|
local retval=0 errstr=""
|
||||||
setupopts
|
setupopts
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ depend()
|
|||||||
{
|
{
|
||||||
need localmount termencoding
|
need localmount termencoding
|
||||||
after bootmisc
|
after bootmisc
|
||||||
keyword -openvz -prefix -uml -vserver -xenu -lxc
|
keyword -openvz -uml -vserver -xenu -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
@@ -63,7 +63,7 @@ start()
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Save the keymapping for use immediately at boot
|
# Save the keymapping for use immediately at boot
|
||||||
if [ -w "$RC_LIBEXECDIR" ]; then
|
if checkpath -W "$RC_LIBEXECDIR"; then
|
||||||
mkdir -p "$RC_LIBEXECDIR"/console
|
mkdir -p "$RC_LIBEXECDIR"/console
|
||||||
dumpkeys >"$RC_LIBEXECDIR"/console/keymap
|
dumpkeys >"$RC_LIBEXECDIR"/console/keymap
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -4,11 +4,6 @@
|
|||||||
|
|
||||||
description="Kill all processes so we can unmount disks cleanly."
|
description="Kill all processes so we can unmount disks cleanly."
|
||||||
|
|
||||||
depend()
|
|
||||||
{
|
|
||||||
keyword -prefix
|
|
||||||
}
|
|
||||||
|
|
||||||
start()
|
start()
|
||||||
{
|
{
|
||||||
ebegin "Terminating remaining processes"
|
ebegin "Terminating remaining processes"
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ depend()
|
|||||||
need fsck
|
need fsck
|
||||||
use lvm modules mtab
|
use lvm modules mtab
|
||||||
after lvm modules
|
after lvm modules
|
||||||
keyword -jail -openvz -prefix -vserver -lxc
|
keyword -jail -openvz -vserver -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
@@ -33,6 +33,7 @@ start()
|
|||||||
|
|
||||||
stop()
|
stop()
|
||||||
{
|
{
|
||||||
|
yesno $RC_GOINGDOWN || return 0
|
||||||
# We never unmount / or /dev or $RC_SVCDIR
|
# We never unmount / or /dev or $RC_SVCDIR
|
||||||
|
|
||||||
# Bug 381783
|
# Bug 381783
|
||||||
@@ -47,7 +48,7 @@ stop()
|
|||||||
done
|
done
|
||||||
|
|
||||||
if [ "$RC_UNAME" = Linux ]; then
|
if [ "$RC_UNAME" = Linux ]; then
|
||||||
no_umounts_r="$no_umounts_r|/proc|/proc/.*|/run|/sys|/sys/.*"
|
no_umounts_r="$no_umounts_r|/proc|/proc/.*|/run|/sys|/sys/.*|/usr"
|
||||||
fi
|
fi
|
||||||
no_umounts_r="^($no_umounts_r)$"
|
no_umounts_r="^($no_umounts_r)$"
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ extra_commands="restore"
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need localmount
|
need localmount
|
||||||
keyword -jail -prefix
|
keyword -jail
|
||||||
}
|
}
|
||||||
|
|
||||||
restore()
|
restore()
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ description="Loads a user defined list of kernel modules."
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
use isapnp
|
use isapnp
|
||||||
keyword -openvz -prefix -vserver -lxc
|
keyword -openvz -vserver -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ description="Re-mount filesytems read-only for a clean reboot."
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need killprocs savecache
|
need killprocs savecache
|
||||||
keyword -prefix -openvz -vserver -lxc
|
keyword -openvz -vserver -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
@@ -23,7 +23,7 @@ start()
|
|||||||
# Bug 381783
|
# Bug 381783
|
||||||
local rc_svcdir=$(echo $RC_SVCDIR | sed 's:/lib\(32\|64\)\?/:/lib(32|64)?/:g')
|
local rc_svcdir=$(echo $RC_SVCDIR | sed 's:/lib\(32\|64\)\?/:/lib(32|64)?/:g')
|
||||||
|
|
||||||
local m="/dev|/dev/.*|/proc|/proc.*|/sys|/sys/.*|${rc_svcdir}" x= fs=
|
local m="/dev|/dev/.*|/proc|/proc.*|/sys|/sys/.*|/run|${rc_svcdir}" x= fs=
|
||||||
m="$m|/bin|/sbin|/lib(32|64)?|/libexec"
|
m="$m|/bin|/sbin|/lib(32|64)?|/libexec"
|
||||||
# RC_NO_UMOUNTS is an env var that can be set by plugins
|
# RC_NO_UMOUNTS is an env var that can be set by plugins
|
||||||
local IFS="$IFS:"
|
local IFS="$IFS:"
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ depend()
|
|||||||
{
|
{
|
||||||
need localmount
|
need localmount
|
||||||
after bootmisc
|
after bootmisc
|
||||||
keyword -jail -prefix
|
keyword -jail
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ description="Update /etc/mtab to match what the kernel knows about"
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need root
|
need root
|
||||||
keyword -prefix
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -19,13 +19,18 @@ depend()
|
|||||||
local IFVAR=$(shell_var "${IFACE}")
|
local IFVAR=$(shell_var "${IFACE}")
|
||||||
|
|
||||||
need localmount
|
need localmount
|
||||||
|
if [ "$RC_UNAME" = Linux ]; then
|
||||||
|
need sysfs
|
||||||
|
fi
|
||||||
after bootmisc
|
after bootmisc
|
||||||
provide net
|
keyword -jail -vserver
|
||||||
keyword -shutdown -jail -prefix -vserver
|
|
||||||
|
|
||||||
case "${IFACE}" in
|
case "${IFACE}" in
|
||||||
lo|lo0);;
|
lo|lo0) provide lo;;
|
||||||
*) after net.lo net.lo0 dbus;;
|
*)
|
||||||
|
after net.lo net.lo0 dbus
|
||||||
|
provide net
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [ "$(command -v "depend_${IFVAR}")" = "depend_${IFVAR}" ]; then
|
if [ "$(command -v "depend_${IFVAR}")" = "depend_${IFVAR}" ]; then
|
||||||
@@ -37,6 +42,8 @@ depend()
|
|||||||
eval prov=\$rc_${dep}_${IFVAR}
|
eval prov=\$rc_${dep}_${IFVAR}
|
||||||
if [ -n "${prov}" ]; then
|
if [ -n "${prov}" ]; then
|
||||||
${dep} ${prov}
|
${dep} ${prov}
|
||||||
|
ewarn "rc_${dep}_${IFVAR} is deprecated."
|
||||||
|
ewarn "Please use rc_net_${IFVAR}_${dep} instead."
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
@@ -169,6 +176,36 @@ _configure_variables()
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_which()
|
||||||
|
{
|
||||||
|
local i OIFS
|
||||||
|
# Empty
|
||||||
|
[ -z "$1" ] && return
|
||||||
|
# check paths
|
||||||
|
OIFS="$IFS"
|
||||||
|
IFS=:
|
||||||
|
for i in $PATH ; do
|
||||||
|
[ -x $i/$1 ] && echo $i/$1 && break
|
||||||
|
done
|
||||||
|
IFS=$OIFS
|
||||||
|
}
|
||||||
|
|
||||||
|
# Like _which, but also consider shell builtins, and multiple alternatives
|
||||||
|
_program_available()
|
||||||
|
{
|
||||||
|
[ -z "$1" ] && return 0
|
||||||
|
local x=
|
||||||
|
for x; do
|
||||||
|
case "${x}" in
|
||||||
|
/*) [ -x "${x}" ] && break;;
|
||||||
|
*) type "${x}" >/dev/null 2>&1 && break;;
|
||||||
|
esac
|
||||||
|
unset x
|
||||||
|
done
|
||||||
|
[ -n "${x}" ] && echo $x && return 0
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
_show_address()
|
_show_address()
|
||||||
{
|
{
|
||||||
einfo "received address $(_get_inet_address "${IFACE}")"
|
einfo "received address $(_get_inet_address "${IFACE}")"
|
||||||
@@ -311,11 +348,10 @@ _load_modules()
|
|||||||
|
|
||||||
eval set -- \$module_${i}_program
|
eval set -- \$module_${i}_program
|
||||||
if [ -n "$1" ]; then
|
if [ -n "$1" ]; then
|
||||||
x=
|
if ! _program_available "$@" >/dev/null; then
|
||||||
for x; do
|
vewarn "Skipping module $mod due to missing program: $@"
|
||||||
[ -x "${x}" ] && break
|
continue
|
||||||
done
|
fi
|
||||||
[ -x "${x}" ] || continue
|
|
||||||
fi
|
fi
|
||||||
if ${starting}; then
|
if ${starting}; then
|
||||||
eval set -- \$module_${i}_program_start
|
eval set -- \$module_${i}_program_start
|
||||||
@@ -323,15 +359,10 @@ _load_modules()
|
|||||||
eval set -- \$module_${i}_program_stop
|
eval set -- \$module_${i}_program_stop
|
||||||
fi
|
fi
|
||||||
if [ -n "$1" ]; then
|
if [ -n "$1" ]; then
|
||||||
x=
|
if ! _program_available "$@" >/dev/null; then
|
||||||
for x; do
|
vewarn "Skipping module $mod due to missing program: $@"
|
||||||
case "${x}" in
|
continue
|
||||||
/*) [ -x "${x}" ] && break;;
|
fi
|
||||||
*) type "${x}" >/dev/null 2>&1 && break;;
|
|
||||||
esac
|
|
||||||
unset x
|
|
||||||
done
|
|
||||||
[ -n "${x}" ] || continue
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
eval provides=\$module_${i}_provide
|
eval provides=\$module_${i}_provide
|
||||||
@@ -407,16 +438,18 @@ _load_config()
|
|||||||
set -- ${config}
|
set -- ${config}
|
||||||
|
|
||||||
# We should support a space separated array for cidr configs
|
# We should support a space separated array for cidr configs
|
||||||
|
# But only as long as they do not contain other parameters for the address
|
||||||
if [ $# = 1 ]; then
|
if [ $# = 1 ]; then
|
||||||
unset IFS
|
unset IFS
|
||||||
set -- ${config}
|
set -- ${config}
|
||||||
# Of course, we may have a single address added old style.
|
# Of course, we may have a single address added old style.
|
||||||
case "$2" in
|
# If the NEXT argument is a v4 or v6 address, it's the next config.
|
||||||
netmask|broadcast|brd|brd+|peer|pointopoint)
|
# Otherwise, it's arguments to the first config...
|
||||||
local IFS="$__IFS"
|
if [ "${2#*.*}" = "${2}" -a "${2#*:*}" = "${2}" ]; then
|
||||||
set -- ${config}
|
# Not an IPv4/IPv6
|
||||||
;;
|
local IFS="$__IFS"
|
||||||
esac
|
set -- ${config}
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Ensure that loopback has the correct address
|
# Ensure that loopback has the correct address
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ depend()
|
|||||||
need net $pmap
|
need net $pmap
|
||||||
use afc-client amd autofs openvpn
|
use afc-client amd autofs openvpn
|
||||||
use dns nfs nfsmount portmap rpcbind rpc.statd rpc.lockd
|
use dns nfs nfsmount portmap rpcbind rpc.statd rpc.lockd
|
||||||
keyword -jail -prefix -vserver
|
keyword -jail -vserver
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ depend()
|
|||||||
need localmount
|
need localmount
|
||||||
after bootmisc
|
after bootmisc
|
||||||
provide net
|
provide net
|
||||||
keyword -jail -prefix -vserver
|
keyword -jail -vserver
|
||||||
}
|
}
|
||||||
|
|
||||||
uniqify()
|
uniqify()
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ required_files="/etc/newsyslog.conf"
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need localmount
|
need localmount
|
||||||
keyword -prefix
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need localmount
|
need localmount
|
||||||
keyword -openvz -prefix -vserver -lxc
|
keyword -openvz -vserver -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
_setleds()
|
_setleds()
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ extra_started_commands="reload"
|
|||||||
|
|
||||||
depend() {
|
depend() {
|
||||||
need localmount
|
need localmount
|
||||||
keyword -jail -prefix
|
keyword -jail
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ depend()
|
|||||||
need localmount
|
need localmount
|
||||||
use logger
|
use logger
|
||||||
after bootmisc
|
after bootmisc
|
||||||
keyword -jail -prefix
|
keyword -jail
|
||||||
}
|
}
|
||||||
|
|
||||||
start_pre()
|
start_pre()
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ depend()
|
|||||||
{
|
{
|
||||||
use modules devfs
|
use modules devfs
|
||||||
need localmount
|
need localmount
|
||||||
keyword -openvz -prefix -vserver -lxc
|
keyword -openvz -vserver -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
@@ -20,6 +20,29 @@ start()
|
|||||||
|
|
||||||
[ -e /proc/filesystems ] || return 0
|
[ -e /proc/filesystems ] || return 0
|
||||||
|
|
||||||
|
# Setup Kernel Support for miscellaneous Binary Formats
|
||||||
|
if [ -d /proc/sys/fs/binfmt_misc -a ! -e /proc/sys/fs/binfmt_misc/register ]; then
|
||||||
|
if grep -qs binfmt_misc /proc/filesystems; then
|
||||||
|
ebegin "Mounting misc binary format filesystem"
|
||||||
|
mount -t binfmt_misc -o nodev,noexec,nosuid \
|
||||||
|
binfmt_misc /proc/sys/fs/binfmt_misc
|
||||||
|
if eend $? ; then
|
||||||
|
local fmts
|
||||||
|
ebegin "Loading custom binary format handlers"
|
||||||
|
fmts=$(grep -hsv -e '^[#;]' -e '^[[:space:]]*$' \
|
||||||
|
/run/binfmt.d/*.conf \
|
||||||
|
@SYSCONFDIR@/binfmt.d/*.conf \
|
||||||
|
""/usr/lib/binfmt.d/*.conf)
|
||||||
|
if [ -n "${fmts}" ]; then
|
||||||
|
echo "${fmts}" > /proc/sys/fs/binfmt_misc/register
|
||||||
|
fi
|
||||||
|
eend $?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ "$RC_SYS" = "OPENVZ" ] && return 0
|
||||||
|
|
||||||
# Check what USB fs the kernel support. Currently
|
# Check what USB fs the kernel support. Currently
|
||||||
# 2.5+ kernels, and later 2.4 kernels have 'usbfs',
|
# 2.5+ kernels, and later 2.4 kernels have 'usbfs',
|
||||||
# while older kernels have 'usbdevfs'.
|
# while older kernels have 'usbdevfs'.
|
||||||
@@ -37,27 +60,6 @@ start()
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Setup Kernel Support for miscellaneous Binary Formats
|
|
||||||
if [ -d /proc/sys/fs/binfmt_misc -a ! -e /proc/sys/fs/binfmt_misc/register ]; then
|
|
||||||
if grep -qs binfmt_misc /proc/filesystems; then
|
|
||||||
ebegin "Mounting misc binary format filesystem"
|
|
||||||
mount -t binfmt_misc -o nodev,noexec,nosuid \
|
|
||||||
binfmt_misc /proc/sys/fs/binfmt_misc
|
|
||||||
if eend $? ; then
|
|
||||||
local fmts
|
|
||||||
ebegin "Loading custom binary format handlers"
|
|
||||||
fmts=$(grep -hsv -e '^[#;]' -e '^[[:space:]]*$' \
|
|
||||||
/run/binfmt.d/*.conf \
|
|
||||||
"/etc"/binfmt.d/*.conf \
|
|
||||||
""/usr/lib/binfmt.d/*.conf)
|
|
||||||
if [ -n "${fmts}" ]; then
|
|
||||||
echo "${fmts}" > /proc/sys/fs/binfmt_misc/register
|
|
||||||
fi
|
|
||||||
eend $?
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Setup Kernel Support for SELinux
|
# Setup Kernel Support for SELinux
|
||||||
if [ -d /selinux ] && ! mountinfo -q /selinux; then
|
if [ -d /selinux ] && ! mountinfo -q /selinux; then
|
||||||
if grep -qs selinuxfs /proc/filesystems; then
|
if grep -qs selinuxfs /proc/filesystems; then
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ depend()
|
|||||||
need localmount net
|
need localmount net
|
||||||
after *
|
after *
|
||||||
before local
|
before local
|
||||||
keyword -prefix
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -7,26 +7,47 @@ description="Mount the root fs read/write"
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need fsck
|
need fsck
|
||||||
keyword -jail -openvz -prefix -vserver -lxc
|
keyword -jail -openvz -vserver -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
{
|
{
|
||||||
case ",$(fstabinfo -o /)," in
|
case ",$(fstabinfo -o /)," in
|
||||||
*,ro,*) return 0;;
|
*,ro,*)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Check if the rootfs isn't already writable.
|
||||||
|
if checkpath -W /; then
|
||||||
|
rm -f /fastboot /forcefsck
|
||||||
|
else
|
||||||
|
ebegin "Remounting root filesystem read/write"
|
||||||
|
case "$RC_UNAME" in
|
||||||
|
Linux)
|
||||||
|
mount -n -o remount,rw /
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
mount -u -o rw /
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
eend $? "Root filesystem could not be mounted read/write"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
rm -f /fastboot /forcefsck
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if echo 2>/dev/null >/.test.$$; then
|
ebegin "Remounting filesystems"
|
||||||
rm -f /.test.$$ /fastboot /forcefsck
|
local mountpoint
|
||||||
return 0
|
for mountpoint in $(fstabinfo); do
|
||||||
fi
|
case "${mountpoint}" in
|
||||||
|
/)
|
||||||
ebegin "Remounting root filesystem read/write"
|
;;
|
||||||
case "$RC_UNAME" in
|
/*)
|
||||||
Linux) mount -n -o remount,rw /;;
|
mountinfo -q "${mountpoint}" && \
|
||||||
*) mount -u -o rw /;;
|
fstabinfo --remount "${mountpoint}"
|
||||||
esac
|
;;
|
||||||
if eend $? "Root filesystem could not be mounted read/write"; then
|
esac
|
||||||
rm -f /fastboot /forcefsck
|
done
|
||||||
fi
|
eend 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ description="Saves a kernel dump."
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need localmount
|
need localmount
|
||||||
keyword -jail -prefix
|
keyword -jail
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ depend()
|
|||||||
{
|
{
|
||||||
provide net
|
provide net
|
||||||
use network
|
use network
|
||||||
keyword -jail -prefix -vserver
|
keyword -jail -vserver
|
||||||
}
|
}
|
||||||
|
|
||||||
pre_flight_checks()
|
pre_flight_checks()
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
before fsck
|
before fsck
|
||||||
keyword -jail -prefix
|
keyword -jail
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -4,14 +4,15 @@
|
|||||||
|
|
||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need localmount
|
before localmount
|
||||||
keyword -jail -openvz -prefix -vserver -lxc
|
keyword -jail -openvz -vserver -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
{
|
{
|
||||||
ebegin "Activating swap devices"
|
ebegin "Activating swap devices"
|
||||||
case "$RC_UNAME" in
|
case "$RC_UNAME" in
|
||||||
|
Linux) swapon -a -e >/dev/null;;
|
||||||
NetBSD|OpenBSD) swapctl -A -t noblk >/dev/null;;
|
NetBSD|OpenBSD) swapctl -A -t noblk >/dev/null;;
|
||||||
*) swapon -a >/dev/null;;
|
*) swapon -a >/dev/null;;
|
||||||
esac
|
esac
|
||||||
@@ -23,7 +24,7 @@ stop()
|
|||||||
ebegin "Deactivating swap devices"
|
ebegin "Deactivating swap devices"
|
||||||
|
|
||||||
# Try to unmount all tmpfs filesystems not in use, else a deadlock may
|
# Try to unmount all tmpfs filesystems not in use, else a deadlock may
|
||||||
# occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
|
# occur. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
|
||||||
cd "$RC_SVCDIR"
|
cd "$RC_SVCDIR"
|
||||||
umount -a -t tmpfs 2>/dev/null
|
umount -a -t tmpfs 2>/dev/null
|
||||||
|
|
||||||
|
|||||||
45
init.d/swapfiles.in
Normal file
45
init.d/swapfiles.in
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#!@PREFIX@/sbin/runscript
|
||||||
|
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
|
||||||
|
# Released under the 2-clause BSD license.
|
||||||
|
|
||||||
|
depend()
|
||||||
|
{
|
||||||
|
need localmount
|
||||||
|
keyword -jail -openvz -prefix -vserver -lxc
|
||||||
|
}
|
||||||
|
|
||||||
|
start()
|
||||||
|
{
|
||||||
|
ebegin "Activating additional swap space"
|
||||||
|
case "$RC_UNAME" in
|
||||||
|
NetBSD|OpenBSD) swapctl -A -t noblk >/dev/null;;
|
||||||
|
*) swapon -a >/dev/null;;
|
||||||
|
esac
|
||||||
|
eend 0 # If swapon has nothing todo it errors, so always return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
stop()
|
||||||
|
{
|
||||||
|
ebegin "Deactivating additional swap space"
|
||||||
|
|
||||||
|
# Try to unmount all tmpfs filesystems not in use, else a deadlock may
|
||||||
|
# occur. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
|
||||||
|
# fixme: Do we need this here since we are only unmounting swap files
|
||||||
|
# and loopback swap?
|
||||||
|
cd "$RC_SVCDIR"
|
||||||
|
umount -a -t tmpfs 2>/dev/null
|
||||||
|
|
||||||
|
case "$RC_UNAME" in
|
||||||
|
Linux)
|
||||||
|
while read filename type rest; do
|
||||||
|
case "$type" in
|
||||||
|
file) swapoff $filename >/dev/null;;
|
||||||
|
esac
|
||||||
|
case "$filename" in
|
||||||
|
/dev/loop*) swapoff $filename >/dev/null;;
|
||||||
|
esac
|
||||||
|
done < /proc/swaps
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
eend 0
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ depend()
|
|||||||
{
|
{
|
||||||
before *
|
before *
|
||||||
provide clock
|
provide clock
|
||||||
keyword -openvz -prefix -uml -vserver -xenu -lxc
|
keyword -openvz -uml -vserver -xenu -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
# swclock is an OpenRC built in
|
# swclock is an OpenRC built in
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
depend() {
|
depend() {
|
||||||
need localmount
|
need localmount
|
||||||
keyword -jail -prefix
|
keyword -jail
|
||||||
}
|
}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
before bootmisc logger
|
before bootmisc logger
|
||||||
keyword -prefix
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
@@ -14,7 +13,7 @@ start()
|
|||||||
local retval=0 var= comments= conf=
|
local retval=0 var= comments= conf=
|
||||||
ebegin "Configuring kernel parameters"
|
ebegin "Configuring kernel parameters"
|
||||||
eindent
|
eindent
|
||||||
for conf in /etc/sysctl.d/*.conf /etc/sysctl.conf; do
|
for conf in @SYSCONFDIR@/sysctl.conf @SYSCONFDIR@/sysctl.d/*.conf; do
|
||||||
if [ -r "$conf" ]; then
|
if [ -r "$conf" ]; then
|
||||||
vebegin "applying $conf"
|
vebegin "applying $conf"
|
||||||
while read var comments; do
|
while read var comments; do
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
before bootmisc logger
|
before bootmisc logger
|
||||||
keyword -prefix -vserver
|
keyword -lxc -vserver
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
@@ -15,12 +15,12 @@ start()
|
|||||||
ebegin "Configuring kernel parameters"
|
ebegin "Configuring kernel parameters"
|
||||||
eindent
|
eindent
|
||||||
|
|
||||||
for conf in /etc/sysctl.d/*.conf /etc/sysctl.conf; do
|
for conf in @SYSCONFDIR@/sysctl.conf @SYSCONFDIR@/sysctl.d/*.conf; do
|
||||||
if [ -r "$conf" ]; then
|
if [ -r "$conf" ]; then
|
||||||
vebegin "applying $conf"
|
vebegin "applying $conf"
|
||||||
if ! err=$(sysctl -q -p "$conf" 2>&1) ; then
|
if ! err=$(sysctl -p "$conf" 2>&1 >/dev/null) ; then
|
||||||
errs="${errs} ${err}"
|
errs="${errs} ${err}"
|
||||||
sysctl -q -e -p "${conf}"
|
sysctl -e -p "${conf}" >/dev/null
|
||||||
fi
|
fi
|
||||||
veend $? || retval=1
|
veend $? || retval=1
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ description="Mount the sys filesystem."
|
|||||||
|
|
||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
keyword -prefix -vserver
|
keyword -vserver
|
||||||
}
|
}
|
||||||
|
|
||||||
mount_sys()
|
mount_sys()
|
||||||
@@ -74,15 +74,19 @@ mount_misc()
|
|||||||
|
|
||||||
mount_cgroups()
|
mount_cgroups()
|
||||||
{
|
{
|
||||||
yesno ${rc_cgroups:-YES} || return 0
|
yesno ${rc_cgroups:-YES} && [ -e /proc/cgroups ] && \
|
||||||
if [ ! -e /proc/cgroups ]; then
|
mountinfo -q /sys/fs/cgroup || return 0
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
local agent="@LIBEXECDIR@/sh/cgroup-release-agent.sh"
|
||||||
|
mkdir /sys/fs/cgroup/openrc
|
||||||
|
mount -n -t cgroup \
|
||||||
|
-o none,nodev,noexec,nosuid,name=openrc,release_agent="$agent" \
|
||||||
|
openrc /sys/fs/cgroup/openrc
|
||||||
|
echo 1 > /sys/fs/cgroup/openrc/notify_on_release
|
||||||
while read name hier groups enabled rest; do
|
while read name hier groups enabled rest; do
|
||||||
case "${enabled}" in
|
case "${enabled}" in
|
||||||
1) mkdir /sys/fs/cgroup/${name}
|
1) mkdir /sys/fs/cgroup/${name}
|
||||||
mount -t cgroup -o nodev,noexec,nosuid,${name} \
|
mount -n -t cgroup -o nodev,noexec,nosuid,${name} \
|
||||||
${name} /sys/fs/cgroup/${name}
|
${name} /sys/fs/cgroup/${name}
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -16,5 +16,4 @@ depend()
|
|||||||
use net newsyslog
|
use net newsyslog
|
||||||
need localmount
|
need localmount
|
||||||
after bootmisc
|
after bootmisc
|
||||||
keyword -prefix
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
|
|||||||
|
|
||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
keyword -openvz -prefix -uml -vserver -xenu
|
keyword -lxc -openvz -uml -vserver -xenu
|
||||||
need root
|
use root
|
||||||
after bootmisc
|
after bootmisc
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ start()
|
|||||||
done
|
done
|
||||||
|
|
||||||
# Save the encoding for use immediately at boot
|
# Save the encoding for use immediately at boot
|
||||||
if [ -w "$RC_LIBEXECDIR" ]; then
|
if checkpath -W "$RC_LIBEXECDIR"; then
|
||||||
mkdir -p "$RC_LIBEXECDIR"/console
|
mkdir -p "$RC_LIBEXECDIR"/console
|
||||||
if yesno ${unicode:-${UNICODE}}; then
|
if yesno ${unicode:-${UNICODE}}; then
|
||||||
echo "" > "$RC_LIBEXECDIR"/console/unicode
|
echo "" > "$RC_LIBEXECDIR"/console/unicode
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
after fsck
|
after fsck
|
||||||
keyword -prefix
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ description="Initializes the random number generator."
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need localmount
|
need localmount
|
||||||
keyword -jail -openvz -prefix
|
keyword -jail -openvz
|
||||||
}
|
}
|
||||||
|
|
||||||
save_seed()
|
save_seed()
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need localmount
|
need localmount
|
||||||
keyword -prefix
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
.Op Fl D , -nodeps
|
.Op Fl D , -nodeps
|
||||||
.Op Fl d , -debug
|
.Op Fl d , -debug
|
||||||
.Op Fl s , -ifstarted
|
.Op Fl s , -ifstarted
|
||||||
|
.Op Fl S , -ifstopped
|
||||||
.Op Fl Z , -dry-run
|
.Op Fl Z , -dry-run
|
||||||
.Op Ar command ...
|
.Op Ar command ...
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
@@ -76,6 +77,8 @@ Set xtrace on in the shell to assist in debugging.
|
|||||||
Ignore all dependency information the service supplies.
|
Ignore all dependency information the service supplies.
|
||||||
.It Fl s , -ifstarted
|
.It Fl s , -ifstarted
|
||||||
Only run the command if the service has been started.
|
Only run the command if the service has been started.
|
||||||
|
.It Fl S , -ifstopped
|
||||||
|
Only run the command if the service has been stopped.
|
||||||
.It Fl q , -quiet
|
.It Fl q , -quiet
|
||||||
Turns off all informational output the service generates.
|
Turns off all informational output the service generates.
|
||||||
Output from any non OpenRC commands is not affected.
|
Output from any non OpenRC commands is not affected.
|
||||||
@@ -89,7 +92,8 @@ or stopping them.
|
|||||||
The following variables affect the service script:
|
The following variables affect the service script:
|
||||||
.Bl -tag -width "RC_DEFAULTLEVEL"
|
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||||
.It Ar extra_commands
|
.It Ar extra_commands
|
||||||
Space separated list of extra commands the service defines.
|
Space separated list of extra commands the service defines. These should
|
||||||
|
not depend on the service being stopped or started.
|
||||||
.It Ar extra_started_commands
|
.It Ar extra_started_commands
|
||||||
Space separated list of extra commands the service defines. These only work if
|
Space separated list of extra commands the service defines. These only work if
|
||||||
the service has already been started.
|
the service has already been started.
|
||||||
@@ -108,6 +112,11 @@ Daemon to start or stop via
|
|||||||
if no start or stop function is defined by the service.
|
if no start or stop function is defined by the service.
|
||||||
.It Ar command_args
|
.It Ar command_args
|
||||||
List of arguments to pass to the daemon when starting.
|
List of arguments to pass to the daemon when starting.
|
||||||
|
.It Ar command_background
|
||||||
|
Set this to "true", "yes" or "1" (case-insensitive) to force the daemon into
|
||||||
|
the background. This implies the "--make-pidfile" and "--pidfile" option of
|
||||||
|
.Xr start-stop-daemon 8
|
||||||
|
so the pidfile variable must be set.
|
||||||
.It Ar pidfile
|
.It Ar pidfile
|
||||||
Pidfile to use for the above defined command.
|
Pidfile to use for the above defined command.
|
||||||
.It Ar name
|
.It Ar name
|
||||||
@@ -115,6 +124,10 @@ Display name used for the above defined command.
|
|||||||
.It Ar retry
|
.It Ar retry
|
||||||
Retry schedule to use when stopping the daemon. It can either be a
|
Retry schedule to use when stopping the daemon. It can either be a
|
||||||
timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5).
|
timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5).
|
||||||
|
.It Ar required_dirs
|
||||||
|
A list of directories which must exist for the service to start.
|
||||||
|
.It Ar required_files
|
||||||
|
A list of files which must exist for the service to start.
|
||||||
.El
|
.El
|
||||||
.Sh DEPENDENCIES
|
.Sh DEPENDENCIES
|
||||||
You should define a
|
You should define a
|
||||||
@@ -167,8 +180,6 @@ in
|
|||||||
Same as -jail, but for Linux Resource Containers (LXC).
|
Same as -jail, but for Linux Resource Containers (LXC).
|
||||||
.It Dv -openvz
|
.It Dv -openvz
|
||||||
Same as -jail, but for OpenVZ systems.
|
Same as -jail, but for OpenVZ systems.
|
||||||
.It Dv -prefix
|
|
||||||
Same as -jail, but for Prefix systems.
|
|
||||||
.It Dv -uml
|
.It Dv -uml
|
||||||
Same as -jail, but for UML systems.
|
Same as -jail, but for UML systems.
|
||||||
.It Dv -vserver
|
.It Dv -vserver
|
||||||
@@ -296,14 +307,22 @@ Mark the service as coldplugged.
|
|||||||
Mark the service as inactive.
|
Mark the service as inactive.
|
||||||
.It Xo
|
.It Xo
|
||||||
.Ic checkpath
|
.Ic checkpath
|
||||||
|
.Op Fl D , -directory-truncate
|
||||||
.Op Fl d , -directory
|
.Op Fl d , -directory
|
||||||
|
.Op Fl F , -file-truncate
|
||||||
.Op Fl f , -file
|
.Op Fl f , -file
|
||||||
|
.Op Fl p , -pipe
|
||||||
.Op Fl m , -mode Ar mode
|
.Op Fl m , -mode Ar mode
|
||||||
.Op Fl o , owner Ar owner
|
.Op Fl o , owner Ar owner
|
||||||
.Ar path ...
|
.Ar path ...
|
||||||
.Xc
|
.Xc
|
||||||
Checks to see if the path exists, is of the right type, owned by the right
|
Checks to see if the path exists, is of the right type, owned by the right
|
||||||
people and has the correct access modes. If not, then it corrects the path.
|
people and has the correct access modes. If not, then it corrects the path.
|
||||||
|
.It Ic checkpath
|
||||||
|
.Op Fl W , -writable
|
||||||
|
.Ar path
|
||||||
|
.Xc
|
||||||
|
checks to see if the path is writable.
|
||||||
.It Ic yesno Ar value
|
.It Ic yesno Ar value
|
||||||
If
|
If
|
||||||
.Ar value
|
.Ar value
|
||||||
@@ -316,7 +335,14 @@ sets the following environment variables for use in the service scripts:
|
|||||||
.It Va RC_SVCNAME
|
.It Va RC_SVCNAME
|
||||||
Name of the service.
|
Name of the service.
|
||||||
.It Va RC_RUNLEVEL
|
.It Va RC_RUNLEVEL
|
||||||
Current runlevel that rc is in.
|
Current runlevel that rc is in. Note that, in OpenRC, the reboot
|
||||||
|
runlevel is mapped to the shutdown runlevel. This was done because most
|
||||||
|
services do not need to know if a system is shutting down or rebooting.
|
||||||
|
If you are writing a service that does need to know this, see the
|
||||||
|
RC_REBOOT variable.
|
||||||
|
.It Va RC_REBOOT
|
||||||
|
This variable contains YES if the system is rebooting. If your service
|
||||||
|
needs to know the system is rebooting, you should test this variable.
|
||||||
.It Va RC_BOOTLEVEL
|
.It Va RC_BOOTLEVEL
|
||||||
Boot runlevel chosen. Default is boot.
|
Boot runlevel chosen. Default is boot.
|
||||||
.It Va RC_DEFAULTLEVEL
|
.It Va RC_DEFAULTLEVEL
|
||||||
@@ -362,9 +388,8 @@ rc_provide_tap1="!net"
|
|||||||
# To put in in /etc/rc.conf you would do it like this
|
# To put in in /etc/rc.conf you would do it like this
|
||||||
rc_net_tap1_provide="!net"
|
rc_net_tap1_provide="!net"
|
||||||
|
|
||||||
# It's also possible to negate keywords. This is mainly useful for prefix
|
# It's also possible to negate keywords.
|
||||||
# users testing OpenRC.
|
rc_keyword="-keyword"
|
||||||
rc_keyword="!noprefix"
|
|
||||||
.Ed
|
.Ed
|
||||||
.Sh EXAMPLES
|
.Sh EXAMPLES
|
||||||
.Pp
|
.Pp
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
SFX= .Linux.in
|
SFX= .Linux.in
|
||||||
PKG_PREFIX?= /usr
|
PKG_PREFIX?= /usr
|
||||||
|
|
||||||
CPPFLAGS+= -D_BSD_SOURCE -D_XOPEN_SOURCE=600
|
CPPFLAGS+= -D_BSD_SOURCE -D_XOPEN_SOURCE=700
|
||||||
LIBDL= -Wl,-Bdynamic -ldl
|
LIBDL= -Wl,-Bdynamic -ldl
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ _PKG_SED:= $(shell ${_PKG_SED_SH})
|
|||||||
_LCL_SED_SH= if test "${PREFIX}" = "${LOCAL_PREFIX}"; then echo "-e 's:@LOCAL_PREFIX@::g'"; else echo "-e 's:@LOCAL_PREFIX@:${LOCAL_PREFIX}:g'"; fi
|
_LCL_SED_SH= if test "${PREFIX}" = "${LOCAL_PREFIX}"; then echo "-e 's:@LOCAL_PREFIX@::g'"; else echo "-e 's:@LOCAL_PREFIX@:${LOCAL_PREFIX}:g'"; fi
|
||||||
_LCL_SED:= $(shell ${_LCL_SED_SH})
|
_LCL_SED:= $(shell ${_LCL_SED_SH})
|
||||||
|
|
||||||
SED_REPLACE= -e 's:@SHELL@:${SH}:g' -e 's:@LIB@:${LIBNAME}:g' -e 's:@SYSCONFDIR@:${SYSCONFDIR}:g' -e 's:@LIBEXECDIR@:${LIBEXECDIR}:g' -e 's:@PREFIX@:${PREFIX}:g' -e 's:@RC_SYS_DEFAULT@:${MKRCSYS}:g' ${_PKG_SED} ${_LCL_SED}
|
SED_REPLACE= -e 's:@SHELL@:${SH}:g' -e 's:@LIB@:${LIBNAME}:g' -e 's:@SYSCONFDIR@:${SYSCONFDIR}:g' -e 's:@LIBEXECDIR@:${LIBEXECDIR}:g' -e 's:@PREFIX@:${PREFIX}:g' ${_PKG_SED} ${_LCL_SED}
|
||||||
|
|
||||||
# Tweak our shell scripts
|
# Tweak our shell scripts
|
||||||
%.sh: %.sh.in
|
%.sh: %.sh.in
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ SYSCONFDIR?= ${PREFIX}/etc
|
|||||||
INITDIR?= ${SYSCONFDIR}/init.d
|
INITDIR?= ${SYSCONFDIR}/init.d
|
||||||
CONFDIR?= ${SYSCONFDIR}/conf.d
|
CONFDIR?= ${SYSCONFDIR}/conf.d
|
||||||
LOCALDIR?= ${SYSCONFDIR}/local.d
|
LOCALDIR?= ${SYSCONFDIR}/local.d
|
||||||
|
SYSCTLDIR?= ${SYSCONFDIR}/sysctl.d
|
||||||
|
|
||||||
BINDIR?= ${PREFIX}/sbin
|
BINDIR?= ${PREFIX}/sbin
|
||||||
BINMODE?= 0755
|
BINMODE?= 0755
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ SRCS-Linux= iwconfig.sh.in
|
|||||||
INC-Linux= adsl.sh apipa.sh arping.sh bonding.sh br2684ctl.sh bridge.sh \
|
INC-Linux= adsl.sh apipa.sh arping.sh bonding.sh br2684ctl.sh bridge.sh \
|
||||||
ccwgroup.sh clip.sh ethtool.sh iproute2.sh ifplugd.sh ip6to4.sh \
|
ccwgroup.sh clip.sh ethtool.sh iproute2.sh ifplugd.sh ip6to4.sh \
|
||||||
ipppd.sh iwconfig.sh netplugd.sh pppd.sh pump.sh tuntap.sh udhcpc.sh \
|
ipppd.sh iwconfig.sh netplugd.sh pppd.sh pump.sh tuntap.sh udhcpc.sh \
|
||||||
vlan.sh macvlan.sh
|
vlan.sh macvlan.sh ip6rd.sh
|
||||||
|
|
||||||
SRCS-NetBSD=
|
SRCS-NetBSD=
|
||||||
INC-NetBSD= ifwatchd.sh
|
INC-NetBSD= ifwatchd.sh
|
||||||
|
|||||||
@@ -102,15 +102,21 @@ bonding_pre_start()
|
|||||||
eoutdent
|
eoutdent
|
||||||
if [ -d /sys/class/net ]; then
|
if [ -d /sys/class/net ]; then
|
||||||
sys_bonding_path=/sys/class/net/"${IFACE}"/bonding
|
sys_bonding_path=/sys/class/net/"${IFACE}"/bonding
|
||||||
|
local oiface
|
||||||
|
oiface=$IFACE
|
||||||
if [ -n "${primary}" ]; then
|
if [ -n "${primary}" ]; then
|
||||||
IFACE=$primary _down
|
IFACE=$primary
|
||||||
|
_down
|
||||||
|
IFACE=$oiface
|
||||||
echo "+${primary}" >$sys_bonding_path/slaves
|
echo "+${primary}" >$sys_bonding_path/slaves
|
||||||
echo "${primary}" >$sys_bonding_path/primary
|
echo "${primary}" >$sys_bonding_path/primary
|
||||||
fi
|
fi
|
||||||
for s in ${slaves}; do
|
for s in ${slaves}; do
|
||||||
[ "${s}" = "${primary}" ] && continue
|
[ "${s}" = "${primary}" ] && continue
|
||||||
if ! grep -q ${s} $sys_bonding_path/slaves; then
|
if ! grep -q ${s} $sys_bonding_path/slaves; then
|
||||||
IFACE=$s _down
|
IFACE=$s
|
||||||
|
_down
|
||||||
|
IFACE=$oiface
|
||||||
echo "+${s}" >$sys_bonding_path/slaves
|
echo "+${s}" >$sys_bonding_path/slaves
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -1,19 +1,10 @@
|
|||||||
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
|
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
|
||||||
# Released under the 2-clause BSD license.
|
# Released under the 2-clause BSD license.
|
||||||
|
|
||||||
_br2684ctl()
|
|
||||||
{
|
|
||||||
if [ -x /usr/sbin/br2684ctl ]; then
|
|
||||||
echo /usr/sbin/br2684ctl
|
|
||||||
else
|
|
||||||
echo /sbin/br2684ctl
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
br2684ctl_depend()
|
br2684ctl_depend()
|
||||||
{
|
{
|
||||||
before ppp
|
before ppp
|
||||||
program start $(_br2684ctl)
|
program start br2684ctl
|
||||||
}
|
}
|
||||||
|
|
||||||
_config_vars="$_config_vars bridge bridge_add brctl"
|
_config_vars="$_config_vars bridge bridge_add brctl"
|
||||||
@@ -42,7 +33,7 @@ br2684ctl_pre_start()
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
einfo "Starting RFC 2684 Bridge control on ${IFACE}"
|
einfo "Starting RFC 2684 Bridge control on ${IFACE}"
|
||||||
start-stop-daemon --start --exec $(_br2684ctl) --background \
|
start-stop-daemon --start --exec $(_which br2684ctl) --background \
|
||||||
--make-pidfile --pidfile "/var/run/br2684ctl-${IFACE}.pid" \
|
--make-pidfile --pidfile "/var/run/br2684ctl-${IFACE}.pid" \
|
||||||
-- -c "${IFACE#nas*}" ${opts}
|
-- -c "${IFACE#nas*}" ${opts}
|
||||||
eend $?
|
eend $?
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
bridge_depend()
|
bridge_depend()
|
||||||
{
|
{
|
||||||
before interface macnet
|
before interface macnet
|
||||||
program /sbin/brctl
|
program brctl
|
||||||
}
|
}
|
||||||
|
|
||||||
_config_vars="$_config_vars bridge bridge_add brctl"
|
_config_vars="$_config_vars bridge bridge_add brctl"
|
||||||
|
|||||||
@@ -1,13 +1,9 @@
|
|||||||
# Copyright (c) 2011 by Gentoo Foundation
|
# Copyright (c) 2011 by Gentoo Foundation
|
||||||
# Released under the 2-clause BSD license.
|
# Released under the 2-clause BSD license.
|
||||||
|
|
||||||
_ethtool() {
|
|
||||||
echo /usr/sbin/ethtool
|
|
||||||
}
|
|
||||||
|
|
||||||
ethtool_depend()
|
ethtool_depend()
|
||||||
{
|
{
|
||||||
program $(_ethtool)
|
program ethtool
|
||||||
before interface
|
before interface
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,7 +39,7 @@ ethtool_pre_start() {
|
|||||||
args_pretty="--${opt} $IFACE ${args_pretty}"
|
args_pretty="--${opt} $IFACE ${args_pretty}"
|
||||||
args="--${opt} $IFACE ${args}"
|
args="--${opt} $IFACE ${args}"
|
||||||
ebegin "ethtool ${args_pretty}"
|
ebegin "ethtool ${args_pretty}"
|
||||||
$(_ethtool) ${args}
|
ethtool ${args}
|
||||||
rc=$?
|
rc=$?
|
||||||
eend $rc "ethtool exit code $rc"
|
eend $rc "ethtool exit code $rc"
|
||||||
# TODO: ethtool has MANY different exit codes, with no
|
# TODO: ethtool has MANY different exit codes, with no
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
ifconfig_depend()
|
ifconfig_depend()
|
||||||
{
|
{
|
||||||
program /sbin/ifconfig
|
program /sbin/ifconfig /bin/ifconfig
|
||||||
provide interface
|
provide interface
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -19,24 +19,24 @@ _down()
|
|||||||
|
|
||||||
_exists()
|
_exists()
|
||||||
{
|
{
|
||||||
grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/dev
|
[ -e /sys/class/net/"$IFACE" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
_ifindex()
|
_ifindex()
|
||||||
{
|
{
|
||||||
local line= i=-2
|
local index=-1
|
||||||
while read line; do
|
local f v
|
||||||
: $(( i += 1 ))
|
if [ -e /sys/class/net/"${IFACE}"/ifindex ]; then
|
||||||
[ ${i} -lt 1 ] && continue
|
index=$(cat /sys/class/net/"${IFACE}"/ifindex)
|
||||||
case "${line}" in
|
else
|
||||||
"${IFACE}:"*) echo "${i}"; return 0;;
|
for f in /sys/class/net/*/ifindex ; do
|
||||||
esac
|
v=$(cat $f)
|
||||||
done < /proc/net/dev
|
[ $v -gt $index ] && index=$v
|
||||||
|
done
|
||||||
# Return the next available index
|
: $(( index += 1 ))
|
||||||
: $(( i += 1 ))
|
fi
|
||||||
echo "${i}"
|
echo "${index}"
|
||||||
return 1
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
_is_wireless()
|
_is_wireless()
|
||||||
|
|||||||
168
net/ip6rd.sh
Normal file
168
net/ip6rd.sh
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
# Copyright (c) 2011 by Gentoo Foundation
|
||||||
|
# Released under the 2-clause BSD license.
|
||||||
|
|
||||||
|
_config_vars="$_config_vars link prefix suffix ipv4mask relay"
|
||||||
|
|
||||||
|
ip6rd_depend()
|
||||||
|
{
|
||||||
|
program ip
|
||||||
|
after interface
|
||||||
|
}
|
||||||
|
|
||||||
|
ip6rd_pre_start()
|
||||||
|
{
|
||||||
|
# ALL interfaces run pre_start blocks, not just those with something
|
||||||
|
# assigned, so we must check if we need to run on this interface before we
|
||||||
|
# do so.
|
||||||
|
local config
|
||||||
|
eval config=\$config_${IFVAR}
|
||||||
|
[ "$config" = "ip6rd" ] || return 0
|
||||||
|
|
||||||
|
case "${MODULES}" in
|
||||||
|
*" ifconfig "*)
|
||||||
|
eerror "ifconfig is not supported for 6rd"
|
||||||
|
eerror "Please emerge sys-apps/iproute2"
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
local host= suffix= relay= addr= iface=${IFACE} config_ip6rd= localip= ipv4mask=
|
||||||
|
eval host=\$link_${IFVAR}
|
||||||
|
if [ -z "${host}" ]; then
|
||||||
|
eerror "link_${IFVAR} not set"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
eval host=\${link_${IFVAR}}
|
||||||
|
eval ipv4mask=\${ipv4mask_${IFVAR}:-0}
|
||||||
|
eval suffix=\${suffix_${IFVAR}:-1}
|
||||||
|
eval relay=\${relay_${IFVAR}}
|
||||||
|
eval prefix=\${prefix_${IFVAR}}
|
||||||
|
|
||||||
|
IFACE=${host}
|
||||||
|
addrs=$(_get_inet_addresses)
|
||||||
|
IFACE=${iface}
|
||||||
|
if [ -z "${addrs}" ]; then
|
||||||
|
eerror "${host} is not configured with an IPv4 address"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
# TODO: Get this settings from DHCP (Option 212)
|
||||||
|
if [ -z "${prefix}" ]; then
|
||||||
|
eerror "prefix_${IFVAR} not set"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [ -z "${relay}" ]; then
|
||||||
|
eerror "relay_${IFVAR} not set"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
for addr in ${addrs}; do
|
||||||
|
# Strip the subnet
|
||||||
|
local ip="${addr%/*}" subnet="${addr#*/}"
|
||||||
|
# We don't work on private IPv4 addresses
|
||||||
|
if _ip6rd_inet_is_private_network "${ip}"
|
||||||
|
then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
local ip6= ip6_prefix="${prefix%::/*}" ip6_subnet="${prefix#*/}"
|
||||||
|
ip6_subnet=$((ip6_subnet + (32-ipv4mask)))
|
||||||
|
eval ip6="$(printf "${ip6_prefix}:%s::%s" \
|
||||||
|
$(_ip6rd_prefix_shave_bits ${ip} ${ipv4mask}) ${suffix})"
|
||||||
|
veinfo "Derived IPv6 address: ${ip6}"
|
||||||
|
|
||||||
|
# Now apply our IPv6 address to our config
|
||||||
|
config_ip6rd="${config_ip6rd}${config_ip6rd:+ }${ip6}/${ip6_subnet}"
|
||||||
|
|
||||||
|
if [ -n "${localip}" ]; then
|
||||||
|
localip="any"
|
||||||
|
else
|
||||||
|
localip="${ip}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "${config_ip6rd}" ]; then
|
||||||
|
eerror "No global IPv4 addresses found on interface ${host}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
ebegin "Creating 6rd tunnel ${IFACE}"
|
||||||
|
if [ "${IFACE}" != "sit0" ]; then
|
||||||
|
_tunnel add "${IFACE}" mode sit ttl 255 remote any local "${localip}"
|
||||||
|
fi
|
||||||
|
_tunnel 6rd dev "${IFACE}" 6rd-prefix "${prefix}"
|
||||||
|
eend $? || return 1
|
||||||
|
_up
|
||||||
|
|
||||||
|
routes_ip6rd="2003::/3 via ::${relay} metric 2147483647"
|
||||||
|
service_set_value "config_ip6rd_$IFVAR" "$config_ip6rd"
|
||||||
|
service_set_value "routes_ip6rd_$IFVAR" "$routes_ip6rd"
|
||||||
|
}
|
||||||
|
|
||||||
|
ip6rd_start()
|
||||||
|
{
|
||||||
|
local config_ip6rd=$(service_get_value "config_ip6rd_$IFVAR")
|
||||||
|
local routes_ip6rd=$(service_get_value "routes_ip6rd_$IFVAR")
|
||||||
|
|
||||||
|
# Now apply our config
|
||||||
|
eval config_${config_index}=\'"${config_ip6rd}"\'
|
||||||
|
: $(( config_index -= 1 ))
|
||||||
|
|
||||||
|
# Add a route for us, ensuring we don't delete anything else
|
||||||
|
local routes="$(_get_array "routes_${IFVAR}")
|
||||||
|
$routes_ip6rd"
|
||||||
|
eval routes_${IFVAR}=\$routes
|
||||||
|
}
|
||||||
|
|
||||||
|
_ip6rd_inet_atoi()
|
||||||
|
{
|
||||||
|
local IFS="${IFS}." ipi=0 j=3
|
||||||
|
for i in $1 ; do
|
||||||
|
ipi=$(( ipi | i << 8*j-- ))
|
||||||
|
done
|
||||||
|
echo ${ipi}
|
||||||
|
}
|
||||||
|
|
||||||
|
_ip6rd_inet_itoa()
|
||||||
|
{
|
||||||
|
local ipi=$1
|
||||||
|
for i in 0 1 2 3; do
|
||||||
|
if [ $i != 3 ] ; then
|
||||||
|
printf "%d." $(( (ipi & ~((1<<24)-1)) >> 24 ))
|
||||||
|
ipi=$(( (ipi & ((1<<24)-1)) << 8))
|
||||||
|
else
|
||||||
|
printf "%d\n" $(( (ipi & ~((1<<24)-1)) >> 24 ))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
_ip6rd_inet_get_network()
|
||||||
|
{
|
||||||
|
echo $(_ip6rd_inet_itoa $(( ($(_ip6rd_inet_atoi $1) & ((1<<$2)-1) << (32-$2) ) )) )
|
||||||
|
}
|
||||||
|
|
||||||
|
_ip6rd_inet_is_private_network()
|
||||||
|
{
|
||||||
|
if [ "$(_ip6rd_inet_get_network $1 16)" = "192.168.0.0" ]\
|
||||||
|
|| [ "$(_ip6rd_inet_get_network $1 8)" = "10.0.0.0" ]\
|
||||||
|
|| [ "$(_ip6rd_inet_get_network $1 12)" = "172.16.0.0" ]\
|
||||||
|
|| [ "$(_ip6rd_inet_get_network $1 16)" = "169.254.0.0" ]
|
||||||
|
then
|
||||||
|
return 0;
|
||||||
|
fi
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
_ip6rd_prefix_shave_bits()
|
||||||
|
{
|
||||||
|
local ipi=
|
||||||
|
ipi=$(( ($(_ip6rd_inet_atoi $1) & (1<<(32-$2))-1) << $2))
|
||||||
|
if [ $2 -le 16 ]
|
||||||
|
then
|
||||||
|
printf "%04x:%0$(( (16-$2>>2)+(($2%4)?1:0) ))x" \
|
||||||
|
$((ipi >> 16)) $((ipi & (1<<(16-$2))-1))
|
||||||
|
elif [ $2 -lt 32 ]
|
||||||
|
then
|
||||||
|
printf "%0$(( (32-$2>>2)+(($2%4)?1:0) ))x" \
|
||||||
|
$((ipi >> 16))
|
||||||
|
fi
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ _config_vars="$_config_vars link suffix relay"
|
|||||||
ip6to4_depend()
|
ip6to4_depend()
|
||||||
{
|
{
|
||||||
after interface
|
after interface
|
||||||
|
program ip
|
||||||
}
|
}
|
||||||
|
|
||||||
ip6to4_pre_start()
|
ip6to4_pre_start()
|
||||||
|
|||||||
@@ -1,18 +1,9 @@
|
|||||||
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
|
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
|
||||||
# Released under the 2-clause BSD license.
|
# Released under the 2-clause BSD license.
|
||||||
|
|
||||||
_ip()
|
|
||||||
{
|
|
||||||
if [ -x /bin/ip ]; then
|
|
||||||
echo /bin/ip
|
|
||||||
else
|
|
||||||
echo /sbin/ip
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
iproute2_depend()
|
iproute2_depend()
|
||||||
{
|
{
|
||||||
program $(_ip)
|
program ip
|
||||||
provide interface
|
provide interface
|
||||||
after ifconfig
|
after ifconfig
|
||||||
}
|
}
|
||||||
@@ -29,24 +20,24 @@ _down()
|
|||||||
|
|
||||||
_exists()
|
_exists()
|
||||||
{
|
{
|
||||||
grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/dev
|
[ -e /sys/class/net/"$IFACE" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
_ifindex()
|
_ifindex()
|
||||||
{
|
{
|
||||||
local line= i=-2
|
local index=-1
|
||||||
while read line; do
|
local f v
|
||||||
: $(( i += 1 ))
|
if [ -e /sys/class/net/"${IFACE}"/ifindex ]; then
|
||||||
[ ${i} -lt 1 ] && continue
|
index=$(cat /sys/class/net/"${IFACE}"/ifindex)
|
||||||
case "${line}" in
|
else
|
||||||
"${IFACE}:"*) echo "${i}"; return 0;;
|
for f in /sys/class/net/*/ifindex ; do
|
||||||
esac
|
v=$(cat $f)
|
||||||
done < /proc/net/dev
|
[ $v -gt $index ] && index=$v
|
||||||
|
done
|
||||||
# Return the next available index
|
: $(( index += 1 ))
|
||||||
: $(( i += 1 ))
|
fi
|
||||||
echo "${i}"
|
echo "${index}"
|
||||||
return 1
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
_is_wireless()
|
_is_wireless()
|
||||||
@@ -110,24 +101,35 @@ _add_address()
|
|||||||
ip addr add "$@" dev "${IFACE}" 2>/dev/null
|
ip addr add "$@" dev "${IFACE}" 2>/dev/null
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
local x
|
||||||
local address netmask broadcast peer anycast label scope
|
local address netmask broadcast peer anycast label scope
|
||||||
local valid_lft preferred_lft home nodad
|
local valid_lft preferred_lft home nodad
|
||||||
local confflaglist
|
local confflaglist
|
||||||
address="$1" ; shift
|
address="$1" ; shift
|
||||||
while [ -n "$*" ]; do
|
while [ -n "$*" ]; do
|
||||||
case "$1" in
|
x=$1 ; shift
|
||||||
netmask)
|
case "$x" in
|
||||||
netmask="/$(_netmask2cidr "$2")" ; shift ; shift ;;
|
netmask|ne*)
|
||||||
broadcast|brd)
|
netmask="/$(_netmask2cidr "$1")" ; shift ;;
|
||||||
broadcast="$2" ; shift ; shift ;;
|
broadcast|brd|br*)
|
||||||
pointopoint|pointtopoint|peer)
|
broadcast="$1" ; shift ;;
|
||||||
peer="$2" ; shift ; shift ;;
|
pointopoint|pointtopoint|peer|po*|pe*)
|
||||||
anycast|label|scope|valid_lft|preferred_lft)
|
peer="$1" ; shift ;;
|
||||||
eval "$1=$2" ; shift ; shift ;;
|
anycast|label|scope|valid_lft|preferred_lft|a*|l*|s*|v*|pr*)
|
||||||
home|nodad)
|
case $x in
|
||||||
|
a*) x=anycast ;;
|
||||||
|
l*) x=label ;;
|
||||||
|
s*) x=scope ;;
|
||||||
|
v*) x=valid_lft ;;
|
||||||
|
pr*) x=preferred_lft ;;
|
||||||
|
esac
|
||||||
|
eval "$x=$1" ; shift ;;
|
||||||
|
home|nodad|h*|no*)
|
||||||
|
case $x in h*) x=home ;; n*) x=nodad ;; esac
|
||||||
# FIXME: If we need to reorder these, this will take more code
|
# FIXME: If we need to reorder these, this will take more code
|
||||||
confflaglist="${confflaglist} $1" ; shift ;;
|
confflaglist="${confflaglist} $x" ; ;;
|
||||||
|
*)
|
||||||
|
ewarn "Unknown argument to config_$IFACE: $x"
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
macchanger_depend()
|
macchanger_depend()
|
||||||
{
|
{
|
||||||
before macnet
|
before macnet
|
||||||
|
# no program 'macchanger', as we have partial functionality without it
|
||||||
}
|
}
|
||||||
|
|
||||||
_config_vars="$_config_vars mac"
|
_config_vars="$_config_vars mac"
|
||||||
|
|||||||
@@ -3,18 +3,9 @@
|
|||||||
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
|
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
|
||||||
# All rights reserved. Released under the 2-clause BSD license.
|
# All rights reserved. Released under the 2-clause BSD license.
|
||||||
|
|
||||||
_ip()
|
|
||||||
{
|
|
||||||
if [ -x /bin/ip ]; then
|
|
||||||
echo /bin/ip
|
|
||||||
else
|
|
||||||
echo /sbin/ip
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
macvlan_depend()
|
macvlan_depend()
|
||||||
{
|
{
|
||||||
program $(_ip)
|
program ip
|
||||||
after interface
|
after interface
|
||||||
before dhcp macchanger
|
before dhcp macchanger
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
tuntap_depend()
|
tuntap_depend()
|
||||||
{
|
{
|
||||||
before bridge interface macchanger
|
before bridge interface macchanger
|
||||||
|
program ip openvpn tunctl
|
||||||
}
|
}
|
||||||
|
|
||||||
_config_vars="$_config_vars iproute2 openvpn tunctl"
|
_config_vars="$_config_vars iproute2 openvpn tunctl"
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ udhcpc_start()
|
|||||||
if ${sendhost}; then
|
if ${sendhost}; then
|
||||||
local hname="$(hostname)"
|
local hname="$(hostname)"
|
||||||
if [ "${hname}" != "(none)" ] && [ "${hname}" != "localhost" ]; then
|
if [ "${hname}" != "(none)" ] && [ "${hname}" != "localhost" ]; then
|
||||||
args="${args} --hostname='${hname}'"
|
args="${args} -x hostname:'${hname}'"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|||||||
11
net/vlan.sh
11
net/vlan.sh
@@ -1,18 +1,9 @@
|
|||||||
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
|
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
|
||||||
# Released under the 2-clause BSD license.
|
# Released under the 2-clause BSD license.
|
||||||
|
|
||||||
_ip()
|
|
||||||
{
|
|
||||||
if [ -x /bin/ip ]; then
|
|
||||||
echo /bin/ip
|
|
||||||
else
|
|
||||||
echo /sbin/ip
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
vlan_depend()
|
vlan_depend()
|
||||||
{
|
{
|
||||||
program $(_ip)
|
program ip
|
||||||
after interface
|
after interface
|
||||||
before dhcp
|
before dhcp
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
BOOT= bootmisc fsck hostname localmount \
|
BOOT= bootmisc fsck hostname localmount \
|
||||||
root swap sysctl urandom ${BOOT-${OS}}
|
root swap swapfiles sysctl urandom ${BOOT-${OS}}
|
||||||
DEFAULT= local netmount
|
DEFAULT= local netmount
|
||||||
SHUTDOWN= savecache ${SHUTDOWN-${OS}}
|
SHUTDOWN= savecache ${SHUTDOWN-${OS}}
|
||||||
SYSINIT= ${SYSINIT-${OS}}
|
SYSINIT= ${SYSINIT-${OS}}
|
||||||
@@ -41,34 +41,24 @@ install:
|
|||||||
if ! test -d "${SYSINITDIR}"; then \
|
if ! test -d "${SYSINITDIR}"; then \
|
||||||
${INSTALL} -d ${SYSINITDIR} || exit $$?; \
|
${INSTALL} -d ${SYSINITDIR} || exit $$?; \
|
||||||
for x in ${SYSINIT}; do \
|
for x in ${SYSINIT}; do \
|
||||||
if test -n "${PREFIX}"; then \
|
ln -snf ${PREFIX}/etc/init.d/"$$x" ${SYSINITDIR}/"$$x" || exit $$?; \
|
||||||
grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
|
done \
|
||||||
fi; \
|
|
||||||
ln -snf ${PREFIX}/etc/init.d/"$$x" ${SYSINITDIR}/"$$x" || exit $$?; done \
|
|
||||||
fi
|
fi
|
||||||
if ! test -d "${BOOTDIR}"; then \
|
if ! test -d "${BOOTDIR}"; then \
|
||||||
${INSTALL} -d ${BOOTDIR} || exit $$?; \
|
${INSTALL} -d ${BOOTDIR} || exit $$?; \
|
||||||
for x in ${BOOT}; do \
|
for x in ${BOOT}; do \
|
||||||
if test -n "${PREFIX}"; then \
|
|
||||||
grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
|
|
||||||
fi; \
|
|
||||||
ln -snf ${PREFIX}/etc/init.d/"$$x" ${BOOTDIR}/"$$x" || exit $$?; \
|
ln -snf ${PREFIX}/etc/init.d/"$$x" ${BOOTDIR}/"$$x" || exit $$?; \
|
||||||
done \
|
done \
|
||||||
fi
|
fi
|
||||||
if ! test -d "${DEFAULTDIR}"; then \
|
if ! test -d "${DEFAULTDIR}"; then \
|
||||||
${INSTALL} -d ${DEFAULTDIR} || exit $$?; \
|
${INSTALL} -d ${DEFAULTDIR} || exit $$?; \
|
||||||
for x in ${DEFAULT}; do \
|
for x in ${DEFAULT}; do \
|
||||||
if test -n "${PREFIX}"; then \
|
ln -snf ${PREFIX}/etc/init.d/"$$x" ${DEFAULTDIR}/"$$x" || exit $$?; \
|
||||||
grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
|
done \
|
||||||
fi; \
|
|
||||||
ln -snf ${PREFIX}/etc/init.d/"$$x" ${DEFAULTDIR}/"$$x" || exit $$?; done \
|
|
||||||
fi
|
fi
|
||||||
if ! test -d "${SHUTDOWNDIR}"; then \
|
if ! test -d "${SHUTDOWNDIR}"; then \
|
||||||
${INSTALL} -d ${SHUTDOWNDIR} || exit $$?; \
|
${INSTALL} -d ${SHUTDOWNDIR} || exit $$?; \
|
||||||
for x in ${SHUTDOWN}; do \
|
for x in ${SHUTDOWN}; do \
|
||||||
if test -n "${PREFIX}"; then \
|
|
||||||
grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
|
|
||||||
fi; \
|
|
||||||
ln -snf ${PREFIX}/etc/init.d/"$$x" ${SHUTDOWNDIR}/"$$x" || exit $$?; done \
|
ln -snf ${PREFIX}/etc/init.d/"$$x" ${SHUTDOWNDIR}/"$$x" || exit $$?; done \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
3
sh/.gitignore
vendored
3
sh/.gitignore
vendored
@@ -3,8 +3,11 @@ gendepends.sh
|
|||||||
init-common-post.sh
|
init-common-post.sh
|
||||||
rc-functions.sh
|
rc-functions.sh
|
||||||
runscript.sh
|
runscript.sh
|
||||||
|
cgroup-release-agent.sh
|
||||||
init.sh
|
init.sh
|
||||||
init-early.sh
|
init-early.sh
|
||||||
ifwatchd-carrier.sh
|
ifwatchd-carrier.sh
|
||||||
ifwatchd-nocarrier.sh
|
ifwatchd-nocarrier.sh
|
||||||
udhcpc-hook.sh
|
udhcpc-hook.sh
|
||||||
|
tmpfiles.sh
|
||||||
|
migrate-to-run.sh
|
||||||
|
|||||||
10
sh/Makefile
10
sh/Makefile
@@ -1,8 +1,8 @@
|
|||||||
DIR= ${LIBEXECDIR}/sh
|
DIR= ${LIBEXECDIR}/sh
|
||||||
SRCS= init.sh.in functions.sh.in gendepends.sh.in init-common-post.sh.in \
|
SRCS= init.sh.in functions.sh.in gendepends.sh.in init-common-post.sh.in \
|
||||||
rc-functions.sh.in runscript.sh.in ${SRCS-${OS}}
|
rc-functions.sh.in runscript.sh.in tmpfiles.sh.in ${SRCS-${OS}}
|
||||||
INC= init-common-post.sh rc-mount.sh functions.sh rc-functions.sh
|
INC= init-common-post.sh rc-mount.sh functions.sh rc-functions.sh
|
||||||
BIN= gendepends.sh init.sh runscript.sh ${BIN-${OS}}
|
BIN= gendepends.sh init.sh runscript.sh tmpfiles.sh ${BIN-${OS}}
|
||||||
|
|
||||||
INSTALLAFTER= _installafter
|
INSTALLAFTER= _installafter
|
||||||
|
|
||||||
@@ -12,8 +12,10 @@ include ${MK}/os.mk
|
|||||||
SRCS-FreeBSD=
|
SRCS-FreeBSD=
|
||||||
BIN-FreeBSD=
|
BIN-FreeBSD=
|
||||||
|
|
||||||
SRCS-Linux= cgroup-release-agent.sh.in init-early.sh.in udhcpc-hook.sh.in
|
SRCS-Linux= cgroup-release-agent.sh.in init-early.sh.in migrate-to-run.sh.in \
|
||||||
BIN-Linux= cgroup-release-agent.sh init-early.sh udhcpc-hook.sh
|
udhcpc-hook.sh.in
|
||||||
|
BIN-Linux= cgroup-release-agent.sh init-early.sh migrate-to-run.sh \
|
||||||
|
udhcpc-hook.sh
|
||||||
|
|
||||||
SRCS-NetBSD= ifwatchd-carrier.sh.in ifwatchd-nocarrier.sh.in
|
SRCS-NetBSD= ifwatchd-carrier.sh.in ifwatchd-nocarrier.sh.in
|
||||||
BIN-NetBSD= ifwatchd-carrier.sh ifwatchd-nocarrier.sh
|
BIN-NetBSD= ifwatchd-carrier.sh ifwatchd-nocarrier.sh
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
|
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
|
||||||
# Released under the 2-clause BSD license.
|
# Released under the 2-clause BSD license.
|
||||||
|
|
||||||
. @SYSCONFDIR@/init.d/functions.sh
|
. @LIBEXECDIR@/sh/functions.sh
|
||||||
. @LIBEXECDIR@/sh/rc-functions.sh
|
. @LIBEXECDIR@/sh/rc-functions.sh
|
||||||
|
|
||||||
config() {
|
config() {
|
||||||
|
|||||||
@@ -5,6 +5,19 @@
|
|||||||
: ${CONSOLE:=/dev/console}
|
: ${CONSOLE:=/dev/console}
|
||||||
: ${RC_LIBEXECDIR:=@LIBEXECDIR@}
|
: ${RC_LIBEXECDIR:=@LIBEXECDIR@}
|
||||||
|
|
||||||
|
service_present()
|
||||||
|
{
|
||||||
|
local p="/etc/runlevels/$1/$2"
|
||||||
|
# fail if the file doesn't exist
|
||||||
|
[ ! -e "$p" ] && return 1
|
||||||
|
# succeed if $RC_SYS empty, can't check further, assume script will run
|
||||||
|
[ -z "$RC_SYS" ] && return 0
|
||||||
|
# fail if file contains "-$RC_SYS", because then it won't run
|
||||||
|
egrep -qi "^[[:space:]]*keyword[[:space:]].*-$RC_SYS\>" "$p" && return 1
|
||||||
|
# succeed otherwise
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
if [ -e "$RC_LIBEXECDIR"/console/unicode ]; then
|
if [ -e "$RC_LIBEXECDIR"/console/unicode ]; then
|
||||||
termencoding="%G"
|
termencoding="%G"
|
||||||
kmode="-u"
|
kmode="-u"
|
||||||
@@ -14,8 +27,8 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Try and set a font and as early as we can
|
# Try and set a font and as early as we can
|
||||||
if [ -e /etc/runlevels/"$RC_DEFAULTLEVEL"/consolefont \
|
if service_present "$RC_DEFAULTLEVEL" consolefont ||
|
||||||
-o -e /etc/runlevels/"$RC_BOOTLEVEL"/consolefont ]; then
|
service_present "$RC_BOOTLEVEL" consolefont; then
|
||||||
printf "\033%s" "$termencoding" >"$CONSOLE" 2>/dev/null
|
printf "\033%s" "$termencoding" >"$CONSOLE" 2>/dev/null
|
||||||
if [ -r "$RC_LIBEXECDIR"/console/font -a -x /usr/bin/setfont ]; then
|
if [ -r "$RC_LIBEXECDIR"/console/font -a -x /usr/bin/setfont ]; then
|
||||||
font="$(cat "$RC_LIBEXECDIR"/console/font)"
|
font="$(cat "$RC_LIBEXECDIR"/console/font)"
|
||||||
@@ -25,8 +38,8 @@ if [ -e /etc/runlevels/"$RC_DEFAULTLEVEL"/consolefont \
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Try and set a keyboard map as early as possible
|
# Try and set a keyboard map as early as possible
|
||||||
if [ -e /etc/runlevels/"$RC_DEFAULTLEVEL"/keymaps \
|
if service_present "$RC_DEFAULTLEVEL" keymaps ||
|
||||||
-o -e /etc/runlevels/"$RC_BOOTLEVEL"/keymaps ]; then
|
service_present "$RC_BOOTLEVEL" keymaps; then
|
||||||
kbd_mode $kmode -C "$CONSOLE" 2>/dev/null
|
kbd_mode $kmode -C "$CONSOLE" 2>/dev/null
|
||||||
if [ -r "$RC_LIBEXECDIR"/console/keymap ]; then
|
if [ -r "$RC_LIBEXECDIR"/console/keymap ]; then
|
||||||
loadkeys -q "$RC_LIBEXECDIR"/console/keymap 2>/dev/null
|
loadkeys -q "$RC_LIBEXECDIR"/console/keymap 2>/dev/null
|
||||||
|
|||||||
@@ -3,62 +3,6 @@
|
|||||||
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
|
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
|
||||||
# Released under the 2-clause BSD license.
|
# Released under the 2-clause BSD license.
|
||||||
|
|
||||||
# This basically mounts $RC_SVCDIR as a ramdisk.
|
|
||||||
# The tricky part is finding something our kernel supports
|
|
||||||
# tmpfs and ramfs are easy, so force one or the other.
|
|
||||||
svcdir_restorecon()
|
|
||||||
{
|
|
||||||
local rc=0
|
|
||||||
if [ -x /usr/sbin/selinuxenabled -a -c /selinux/null ] &&
|
|
||||||
selinuxenabled; then
|
|
||||||
restorecon $RC_SVCDIR
|
|
||||||
rc=$?
|
|
||||||
fi
|
|
||||||
return $rc
|
|
||||||
}
|
|
||||||
|
|
||||||
mount_svcdir()
|
|
||||||
{
|
|
||||||
# mount from fstab if we can
|
|
||||||
fstabinfo --mount "$RC_SVCDIR" && return 0
|
|
||||||
|
|
||||||
local fs= fsopts="-o rw,noexec,nodev,nosuid"
|
|
||||||
local svcsize=${rc_svcsize:-1024}
|
|
||||||
|
|
||||||
# Some buggy kernels report tmpfs even when not present :(
|
|
||||||
if grep -Eq "[[:space:]]+tmpfs$" /proc/filesystems; then
|
|
||||||
local tmpfsopts="${fsopts},mode=755,size=${svcsize}k"
|
|
||||||
mount -n -t tmpfs $tmpfsopts rc-svcdir "$RC_SVCDIR"
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
svcdir_restorecon
|
|
||||||
[ $? -eq 0 ] && return 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if grep -Eq "[[:space:]]+ramfs$" /proc/filesystems; then
|
|
||||||
fs="ramfs"
|
|
||||||
# ramfs has no special options
|
|
||||||
elif [ -e /dev/ram0 ] \
|
|
||||||
&& grep -Eq "[[:space:]]+ext2$" /proc/filesystems; then
|
|
||||||
devdir="/dev/ram0"
|
|
||||||
fs="ext2"
|
|
||||||
dd if=/dev/zero of="$devdir" bs=1k count="$svcsize"
|
|
||||||
mkfs -t "$fs" -i 1024 -vm0 "$devdir" "$svcsize"
|
|
||||||
else
|
|
||||||
echo
|
|
||||||
eerror "OpenRC requires tmpfs, ramfs or a ramdisk + ext2"
|
|
||||||
eerror "compiled into the kernel"
|
|
||||||
echo
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
mount -n -t "$fs" $fsopts rc-svcdir "$RC_SVCDIR"
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
svcdir_restorecon
|
|
||||||
[ $? -eq 0 ] && return 0
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
. "$RC_LIBEXECDIR"/sh/functions.sh
|
. "$RC_LIBEXECDIR"/sh/functions.sh
|
||||||
[ -r /etc/rc.conf ] && . /etc/rc.conf
|
[ -r /etc/rc.conf ] && . /etc/rc.conf
|
||||||
|
|
||||||
@@ -75,7 +19,7 @@ if [ -e $f ]; then
|
|||||||
if [ "$(VAR=a cat $f)" = "$(VAR=b cat $f)" ]; then
|
if [ "$(VAR=a cat $f)" = "$(VAR=b cat $f)" ]; then
|
||||||
eerror "You have cruft in /proc that should be deleted"
|
eerror "You have cruft in /proc that should be deleted"
|
||||||
else
|
else
|
||||||
einfo "/proc is already mounted, skipping"
|
einfo "/proc is already mounted"
|
||||||
mountproc=false
|
mountproc=false
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -91,24 +35,41 @@ if $mountproc; then
|
|||||||
eend $?
|
eend $?
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Mount tmpfs on /run when directory exists.
|
|
||||||
# /run is a new directory for storing volatile runtime data.
|
# /run is a new directory for storing volatile runtime data.
|
||||||
# Read more about /run at https://lwn.net/Articles/436012
|
# Read more about /run at https://lwn.net/Articles/436012
|
||||||
if [ -d /run ]; then
|
sys="$(rc --sys)"
|
||||||
if mountinfo -q /run; then
|
|
||||||
einfo "/run is already mounted, skipping"
|
if [ ! -d /run ]; then
|
||||||
else
|
if [ "$sys" = VSERVER ]; then
|
||||||
ebegin "Mounting /run"
|
if [ -e /run ]; then
|
||||||
if ! fstabinfo --mount /run; then
|
rm -rf /run
|
||||||
mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /run
|
|
||||||
fi
|
fi
|
||||||
eend $?
|
mkdir /run
|
||||||
|
else
|
||||||
|
eerror "The /run directory does not exist. Unable to continue."
|
||||||
|
return 1
|
||||||
fi
|
fi
|
||||||
checkpath -d -m 0775 -o root:uucp /run/lock
|
|
||||||
elif [ -e /run ]; then
|
|
||||||
einfo "Unable to mount /run since it is not a directory"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$sys" = VSERVER ]; then
|
||||||
|
rm -rf /run/*
|
||||||
|
elif ! mountinfo -q /run; then
|
||||||
|
ebegin "Mounting /run"
|
||||||
|
rc=0
|
||||||
|
if ! fstabinfo --mount /run; then
|
||||||
|
mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /run
|
||||||
|
rc=$?
|
||||||
|
fi
|
||||||
|
if [ $rc != 0 ]; then
|
||||||
|
eerror "Unable to mount tmpfs on /run."
|
||||||
|
eerror "Can't continue."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
checkpath -d $RC_SVCDIR
|
||||||
|
checkpath -d -m 0775 -o root:uucp /run/lock
|
||||||
|
|
||||||
# Try to mount xenfs as early as possible, otherwise rc_sys() will always
|
# Try to mount xenfs as early as possible, otherwise rc_sys() will always
|
||||||
# return RC_SYS_XENU and will think that we are in a domU while it's not.
|
# return RC_SYS_XENU and will think that we are in a domU while it's not.
|
||||||
if grep -Eq "[[:space:]]+xenfs$" /proc/filesystems; then
|
if grep -Eq "[[:space:]]+xenfs$" /proc/filesystems; then
|
||||||
@@ -119,4 +80,9 @@ if grep -Eq "[[:space:]]+xenfs$" /proc/filesystems; then
|
|||||||
eend $?
|
eend $?
|
||||||
fi
|
fi
|
||||||
|
|
||||||
. "$RC_LIBEXECDIR"/sh/init-common-post.sh
|
if [ -e "$RC_LIBEXECDIR"/cache/deptree ]; then
|
||||||
|
cp -p "$RC_LIBEXECDIR"/cache/* "$RC_SVCDIR" 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo sysinit >"$RC_SVCDIR"/softlevel
|
||||||
|
exit 0
|
||||||
|
|||||||
49
sh/migrate-to-run.sh.in
Normal file
49
sh/migrate-to-run.sh.in
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#!@SHELL@
|
||||||
|
# Copyright (c) 2012 William Hubbs <w.d.hubbs@gmail.com>
|
||||||
|
# Released under the 2-clause BSD license.
|
||||||
|
|
||||||
|
. "@LIBEXECDIR@/sh/functions.sh"
|
||||||
|
|
||||||
|
if ! mountinfo -q -f tmpfs "@LIBEXECDIR@/init.d"; then
|
||||||
|
einfo "The OpenRC dependency data has already been migrated."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "@PREFIX@/run" ]; then
|
||||||
|
eerror "'@PREFIX@/run' is not a directory."
|
||||||
|
eerror "This means the OpenRC dependency data cannot be migrated."
|
||||||
|
eerror "Please create the '@PREFIX@/run' directory and reboot the system."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! mountinfo -q -f tmpfs "@PREFIX@/run"; then
|
||||||
|
for x in "@PREFIX@/run/."* "@PREFIX@/run/"*; do
|
||||||
|
case "$x" in
|
||||||
|
"@PREFIX@/run/."|"@PREFIX@/run/..")
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if [ -e "$x" ]; then
|
||||||
|
eerror "Your '@PREFIX@/run' directory contains files."
|
||||||
|
eerror "Please reboot the system."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
mount -t tmpfs -o mode=0755,nosuid,nodev \
|
||||||
|
tmpfs "@PREFIX@/run" 2> /dev/null
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
eerror "Unable to mount a tmpfs on '@PREFIX@/run'."
|
||||||
|
eerror "This means the OpenRC dependency data cannot be migrated."
|
||||||
|
eerror "Please create the '@PREFIX@/run' directory and reboot the system."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf "@PREFIX@/run/openrc"
|
||||||
|
cp -a "@LIBEXECDIR@/init.d" "@PREFIX@/run/openrc"
|
||||||
|
rc-update -u
|
||||||
|
rm -rf "@LIBEXECDIR@/init.d"
|
||||||
|
umount "@LIBEXECDIR@/init.d"
|
||||||
|
einfo "The OpenRC dependency data was migrated successfully."
|
||||||
|
exit 0
|
||||||
@@ -4,6 +4,22 @@
|
|||||||
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
|
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
|
||||||
# Released under the 2-clause BSD license.
|
# Released under the 2-clause BSD license.
|
||||||
|
|
||||||
|
verify_boot()
|
||||||
|
{
|
||||||
|
if [ ! -e ${RC_SVCDIR}/softlevel ]; then
|
||||||
|
eerror "You are attempting to run an openrc service on a"
|
||||||
|
eerror "system which openrc did not boot."
|
||||||
|
eerror "You may be inside a chroot or you may have used"
|
||||||
|
eerror "another initialization system to boot this system."
|
||||||
|
eerror "In this situation, you will get unpredictable results!"
|
||||||
|
eerror
|
||||||
|
eerror "If you really want to do this, issue the following command:"
|
||||||
|
eerror "touch ${RC_SVCDIR}/softlevel"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
sourcex()
|
sourcex()
|
||||||
{
|
{
|
||||||
if [ "$1" = "-e" ]; then
|
if [ "$1" = "-e" ]; then
|
||||||
@@ -16,7 +32,7 @@ sourcex()
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
sourcex "@SYSCONFDIR@/init.d/functions.sh"
|
sourcex "@LIBEXECDIR@/sh/functions.sh"
|
||||||
sourcex "@LIBEXECDIR@/sh/rc-functions.sh"
|
sourcex "@LIBEXECDIR@/sh/rc-functions.sh"
|
||||||
|
|
||||||
# Support LiveCD foo
|
# Support LiveCD foo
|
||||||
@@ -24,18 +40,6 @@ if sourcex -e "/sbin/livecd-functions.sh"; then
|
|||||||
livecd_read_commandline
|
livecd_read_commandline
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -e ${RC_SVCDIR}/softlevel ]; then
|
|
||||||
eerror "You are attempting to run an openrc service on a"
|
|
||||||
eerror "system which openrc did not boot."
|
|
||||||
eerror "You may be inside a chroot or you may have used"
|
|
||||||
eerror "another initialization system to boot this system."
|
|
||||||
eerror "In this situation, you will get unpredictable results!"
|
|
||||||
eerror
|
|
||||||
eerror "If you really want to do this, issue the following command:"
|
|
||||||
eerror "touch ${RC_SVCDIR}/softlevel"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$1" -o -z "$2" ]; then
|
if [ -z "$1" -o -z "$2" ]; then
|
||||||
eerror "$RC_SVCNAME: not enough arguments"
|
eerror "$RC_SVCNAME: not enough arguments"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -124,7 +128,11 @@ start()
|
|||||||
local _background=
|
local _background=
|
||||||
ebegin "Starting ${name:-$RC_SVCNAME}"
|
ebegin "Starting ${name:-$RC_SVCNAME}"
|
||||||
if yesno "${command_background}"; then
|
if yesno "${command_background}"; then
|
||||||
_background="--background --pidfile"
|
if [ -z "${pidfile}" ]; then
|
||||||
|
eend 1 "command_background option used but no pidfile specified"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
_background="--background --make-pidfile"
|
||||||
fi
|
fi
|
||||||
if yesno "$start_inactive"; then
|
if yesno "$start_inactive"; then
|
||||||
local _inactive=false
|
local _inactive=false
|
||||||
@@ -185,6 +193,14 @@ unset _conf_d
|
|||||||
# Load any system overrides
|
# Load any system overrides
|
||||||
sourcex -e "@SYSCONFDIR@/rc.conf"
|
sourcex -e "@SYSCONFDIR@/rc.conf"
|
||||||
|
|
||||||
|
if [ "$RC_UNAME" = "Linux" -a "$1" = "start" ]; then
|
||||||
|
if [ -d /sys/fs/cgroup/openrc ]; then
|
||||||
|
mkdir -p /sys/fs/cgroup/openrc/${RC_SVCNAME}
|
||||||
|
echo $$ > /sys/fs/cgroup/openrc/${RC_SVCNAME}/tasks
|
||||||
|
fi
|
||||||
|
#todo: add processes to cgroups based on settings in conf.d
|
||||||
|
fi
|
||||||
|
|
||||||
# Apply any ulimit defined
|
# Apply any ulimit defined
|
||||||
[ -n "${rc_ulimit:-$RC_ULIMIT}" ] && ulimit ${rc_ulimit:-$RC_ULIMIT}
|
[ -n "${rc_ulimit:-$RC_ULIMIT}" ] && ulimit ${rc_ulimit:-$RC_ULIMIT}
|
||||||
|
|
||||||
@@ -217,7 +233,12 @@ while [ -n "$1" ]; do
|
|||||||
# Special case depend
|
# Special case depend
|
||||||
if [ "$1" = depend ]; then
|
if [ "$1" = depend ]; then
|
||||||
shift
|
shift
|
||||||
|
|
||||||
|
# Enter the dir of the init script to fix the globbing
|
||||||
|
# bug 412677
|
||||||
|
cd ${RC_SERVICE%/*}
|
||||||
_depend
|
_depend
|
||||||
|
cd /
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
# See if we have the required function and run it
|
# See if we have the required function and run it
|
||||||
@@ -244,7 +265,7 @@ while [ -n "$1" ]; do
|
|||||||
# we can run this command
|
# we can run this command
|
||||||
for _cmd in $extra_started_commands; do
|
for _cmd in $extra_started_commands; do
|
||||||
if [ "$_cmd" = "$1" ]; then
|
if [ "$_cmd" = "$1" ]; then
|
||||||
if ! service_started; then
|
if verify_boot && ! service_started; then
|
||||||
eerror "$RC_SVCNAME: cannot \`$1' as it has not been started"
|
eerror "$RC_SVCNAME: cannot \`$1' as it has not been started"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -254,13 +275,16 @@ while [ -n "$1" ]; do
|
|||||||
# we can run this command
|
# we can run this command
|
||||||
for _cmd in $extra_stopped_commands; do
|
for _cmd in $extra_stopped_commands; do
|
||||||
if [ "$_cmd" = "$1" ]; then
|
if [ "$_cmd" = "$1" ]; then
|
||||||
if ! service_stopped; then
|
if verify_boot && ! service_stopped; then
|
||||||
eerror "$RC_SVCNAME: cannot \`$1' as it has not been stopped"
|
eerror "$RC_SVCNAME: cannot \`$1' as it has not been stopped"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
unset _cmd
|
unset _cmd
|
||||||
|
case $1 in
|
||||||
|
start|stop|status) verify_boot;;
|
||||||
|
esac
|
||||||
if [ "$(command -v "$1_pre")" = "$1_pre" ]
|
if [ "$(command -v "$1_pre")" = "$1_pre" ]
|
||||||
then
|
then
|
||||||
"$1"_pre || exit $?
|
"$1"_pre || exit $?
|
||||||
|
|||||||
288
sh/tmpfiles.sh.in
Executable file
288
sh/tmpfiles.sh.in
Executable file
@@ -0,0 +1,288 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# This is a reimplementation of the systemd tmpfiles.d code
|
||||||
|
# Control creation, deletion, and cleaning of volatile and temporary files
|
||||||
|
#
|
||||||
|
# Copyright (c) 2012 Gentoo Foundation
|
||||||
|
#
|
||||||
|
# This instance based on the Arch Linux version:
|
||||||
|
# http://projects.archlinux.org/initscripts.git/tree/arch-tmpfiles
|
||||||
|
# As of 2012/01/01
|
||||||
|
#
|
||||||
|
# See the tmpfiles.d manpage as well:
|
||||||
|
# http://0pointer.de/public/systemd-man/tmpfiles.d.html
|
||||||
|
# This script should match the manpage as of 2012/03/12
|
||||||
|
#
|
||||||
|
|
||||||
|
warninvalid() {
|
||||||
|
printf "tmpfiles: ignoring invalid entry on line %d of \`%s'\n" "$LINENUM" "$FILE"
|
||||||
|
error=$(( error+1 ))
|
||||||
|
} >&2
|
||||||
|
|
||||||
|
relabel() {
|
||||||
|
local path
|
||||||
|
local paths=$1 mode=$2 uid=$3 gid=$4
|
||||||
|
|
||||||
|
for path in ${paths}; do
|
||||||
|
if [ -e "$path" ]; then
|
||||||
|
[ $uid != '-' ] && chown $CHOPTS "$uid" "$path"
|
||||||
|
[ $gid != '-' ] && chgrp $CHOPTS "$gid" "$path"
|
||||||
|
[ $mode != '-' ] && chmod $CHOPTS "$mode" "$path"
|
||||||
|
[ -x /sbin/restorecon ] && restorecon $CHOPTS "$path"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
_b() {
|
||||||
|
# Create a block device node if it doesn't exist yet
|
||||||
|
local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
|
||||||
|
[ ! -e "$path" ] && mknod $path b ${arg%:*} ${arg#*:}
|
||||||
|
}
|
||||||
|
|
||||||
|
_c() {
|
||||||
|
# Create a character device node if it doesn't exist yet
|
||||||
|
local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
|
||||||
|
[ ! -e "$path" ] && mknod $path c ${arg%:*} ${arg#*:}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_f() {
|
||||||
|
# Create a file if it doesn't exist yet
|
||||||
|
local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
|
||||||
|
|
||||||
|
[ $CREATE -gt 0 ] || return 0
|
||||||
|
|
||||||
|
if [ ! -e "$path" ]; then
|
||||||
|
install -m"$mode" -o"$uid" -g"$gid" /dev/null "$path"
|
||||||
|
[ -n "$arg" ] && _w "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_F() {
|
||||||
|
# Create or truncate a file
|
||||||
|
local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
|
||||||
|
|
||||||
|
[ $CREATE -gt 0 ] || return 0
|
||||||
|
|
||||||
|
install -m"$mode" -o"$uid" -g"$gid" /dev/null "$path"
|
||||||
|
[ -n "$arg" ] && _w "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
_d() {
|
||||||
|
# Create a directory if it doesn't exist yet
|
||||||
|
local path=$1 mode=$2 uid=$3 gid=$4
|
||||||
|
|
||||||
|
[ $CREATE -gt 0 ] || return 0
|
||||||
|
|
||||||
|
if [ ! -d "$path" ]; then
|
||||||
|
install -d -m"$mode" -o"$uid" -g"$gid" "$path"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_D() {
|
||||||
|
# Create or empty a directory
|
||||||
|
local path=$1 mode=$2 uid=$3 gid=$4
|
||||||
|
|
||||||
|
if [ -d "$path" ] && [ $REMOVE -gt 0 ]; then
|
||||||
|
find "$path" -mindepth 1 -maxdepth 1 -xdev -exec rm -rf {} +
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $CREATE -gt 0 ]; then
|
||||||
|
install -d -m"$mode" -o"$uid" -g"$gid" "$path"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_L() {
|
||||||
|
# Create a symlink if it doesn't exist yet
|
||||||
|
local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
|
||||||
|
[ ! -e "$path" ] && ln -s "$args" "$path"
|
||||||
|
}
|
||||||
|
|
||||||
|
_p() {
|
||||||
|
# Create a named pipe (FIFO) if it doesn't exist yet
|
||||||
|
local path=$1 mode=$2 uid=$3 gid=$4
|
||||||
|
|
||||||
|
[ $CREATE -gt 0 ] || return 0
|
||||||
|
|
||||||
|
if [ ! -p "$path" ]; then
|
||||||
|
mkfifo -m$mode "$path"
|
||||||
|
chown "$uid:$gid" "$path"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_x() {
|
||||||
|
# Ignore a path during cleaning. Use this type to exclude paths from clean-up as
|
||||||
|
# controlled with the Age parameter. Note that lines of this type do not
|
||||||
|
# influence the effect of r or R lines. Lines of this type accept shell-style
|
||||||
|
# globs in place of of normal path names.
|
||||||
|
:
|
||||||
|
# XXX: we don't implement this
|
||||||
|
}
|
||||||
|
|
||||||
|
_r() {
|
||||||
|
# Remove a file or directory if it exists. This may not be used to remove
|
||||||
|
# non-empty directories, use R for that. Lines of this type accept shell-style
|
||||||
|
# globs in place of normal path names.
|
||||||
|
local path
|
||||||
|
local paths=$1
|
||||||
|
|
||||||
|
[ $REMOVE -gt 0 ] || return 0
|
||||||
|
|
||||||
|
for path in ${paths}; do
|
||||||
|
if [ -f "$path" ]; then
|
||||||
|
rm -f "$path"
|
||||||
|
elif [ -d "$path" ]; then
|
||||||
|
rmdir "$path"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
_R() {
|
||||||
|
# Recursively remove a path and all its subdirectories (if it is a directory).
|
||||||
|
# Lines of this type accept shell-style globs in place of normal path names.
|
||||||
|
local path
|
||||||
|
local paths=$1
|
||||||
|
|
||||||
|
[ $REMOVE -gt 0 ] || return 0
|
||||||
|
|
||||||
|
for path in ${paths}; do
|
||||||
|
[ -d "$path" ] && rm -rf --one-file-system "$path"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
_w() {
|
||||||
|
# Write the argument parameter to a file, if it exists.
|
||||||
|
local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
|
||||||
|
[ -f "$path" ] && echo "$arg" >>"$path"
|
||||||
|
}
|
||||||
|
|
||||||
|
_z() {
|
||||||
|
# Set ownership, access mode and relabel security context of a file or
|
||||||
|
# directory if it exists. Lines of this type accept shell-style globs in
|
||||||
|
# place of normal path names.
|
||||||
|
[ $CREATE -gt 0 ] || return 0
|
||||||
|
|
||||||
|
relabel "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
_Z() {
|
||||||
|
# Recursively set ownership, access mode and relabel security context of a
|
||||||
|
# path and all its subdirectories (if it is a directory). Lines of this type
|
||||||
|
# accept shell-style globs in place of normal path names.
|
||||||
|
[ $CREATE -gt 0 ] || return 0
|
||||||
|
|
||||||
|
CHOPTS=-R relabel "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
CREATE=0 REMOVE=0 CLEAN=0 VERBOSE=0 DRYRUN=0 error=0 LINENO=0
|
||||||
|
FILE=
|
||||||
|
fragments=
|
||||||
|
# XXX: The harcoding of /usr/lib/ is an explicit choice by upstream
|
||||||
|
tmpfiles_dirs='/usr/lib/tmpfiles.d/ /etc/tmpfiles.d/ /run/tmpfiles.d/'
|
||||||
|
tmpfiles_basenames=''
|
||||||
|
tmpfiles_d=''
|
||||||
|
# Build a list of sorted unique basenames
|
||||||
|
# directories declared later in the tmpfiles_d array will override earlier
|
||||||
|
# directories, on a per file basename basis.
|
||||||
|
# `/etc/tmpfiles.d/foo.conf' supersedes `/usr/lib/tmpfiles.d/foo.conf'.
|
||||||
|
# `/run/tmpfiles/foo.conf' will always be read after `/etc/tmpfiles.d/bar.conf'
|
||||||
|
for d in ${tmpfiles_dirs} ; do
|
||||||
|
[ -d $d ] && for f in ${d}/*.conf ; do
|
||||||
|
[ -f $f ] && tmpfiles_basenames="${tmpfiles_basenames}\n${f##*/}"
|
||||||
|
done # for f in ${d}
|
||||||
|
done # for d in ${tmpfiles_dirs}
|
||||||
|
tmpfiles_basenames="`printf "${tmpfiles_basenames}\n" | sort | uniq`"
|
||||||
|
|
||||||
|
for b in $tmpfiles_basenames ; do
|
||||||
|
real_f=''
|
||||||
|
for d in $tmpfiles_dirs ; do
|
||||||
|
f=${d}/${b}
|
||||||
|
[ -f "${f}" ] && real_f=$f
|
||||||
|
done
|
||||||
|
[ -f "${real_f}" ] && tmpfiles_d="${tmpfiles_d} ${real_f}"
|
||||||
|
done
|
||||||
|
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case $1 in
|
||||||
|
--create) CREATE=1 ;;
|
||||||
|
--remove) REMOVE=1 ;;
|
||||||
|
--clean) CLEAN=1 ;; # TODO: Not implemented
|
||||||
|
--verbose) VERBOSE=1 ;;
|
||||||
|
--dryrun|--dry-run) DRYRUN=1 ;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $(( CREATE + REMOVE )) -ne 1 ] ; then
|
||||||
|
printf 'usage: %s [--create] [--remove] [--clean] [--verbose] [--dry-run]\n' "${0##*/}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
error=0
|
||||||
|
|
||||||
|
# loop through the gathered fragments, sorted globally by filename.
|
||||||
|
# `/run/tmpfiles/foo.conf' will always be read after `/etc/tmpfiles.d/bar.conf'
|
||||||
|
for FILE in $tmpfiles_d ; do
|
||||||
|
LINENUM=0
|
||||||
|
|
||||||
|
### FILE FORMAT ###
|
||||||
|
# XXX: We ignore the 'Age' parameter
|
||||||
|
# 1 2 3 4 5 6 7
|
||||||
|
# Cmd Path Mode UID GID Age Argument
|
||||||
|
# d /run/user 0755 root root 10d -
|
||||||
|
# Mode, UID, GID, Age, Argument may be omitted!
|
||||||
|
|
||||||
|
# XXX: Upstream says whitespace is NOT permitted in the Path argument.
|
||||||
|
# But IS allowed when globs are expanded for the x/r/R/z/Z types.
|
||||||
|
while read line; do
|
||||||
|
LINENUM=$(( LINENUM+1 ))
|
||||||
|
|
||||||
|
# This will skip over comments and empty lines
|
||||||
|
set -- $line
|
||||||
|
|
||||||
|
# Unless we have both command and path, skip this line.
|
||||||
|
if [ -z "$1" -o -z "$2" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# whine about invalid entries
|
||||||
|
case $1 in
|
||||||
|
f|F|w|d|D|p|L|c|b|x|r|R|z|Z) ;;
|
||||||
|
*) warninvalid ; continue ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
cmd=$1
|
||||||
|
path=$2
|
||||||
|
|
||||||
|
# fall back on defaults when parameters are passed as '-'
|
||||||
|
if [ "$3" = '-' -o "$3" = '' ]; then
|
||||||
|
case ${1} in
|
||||||
|
p|f|F) mode=0644 ;;
|
||||||
|
d|D) mode=0755 ;;
|
||||||
|
z|Z|x|r|R|L) ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
mode=$3
|
||||||
|
fi
|
||||||
|
uid=$4
|
||||||
|
gid=$5
|
||||||
|
age=$6
|
||||||
|
arg=$7
|
||||||
|
|
||||||
|
[ ${4} = '-' ] && uid=0
|
||||||
|
[ ${5} = '-' ] && gid=0
|
||||||
|
[ ${6} = '-' ] && age=0
|
||||||
|
[ ${7} = '-' ] && arg=''
|
||||||
|
set -- "$path" "$mode" "$uid" "$gid" "$age" "$arg"
|
||||||
|
|
||||||
|
[ "$VERBOSE" -eq "1" ] && echo _$cmd "$@"
|
||||||
|
if [ "${DRYRUN}" -eq "0" ]; then
|
||||||
|
_$cmd "$@"
|
||||||
|
rc=$?
|
||||||
|
[ $rc -ne 0 ] && error=$((error + 1))
|
||||||
|
fi
|
||||||
|
done <$FILE
|
||||||
|
done
|
||||||
|
|
||||||
|
exit $error
|
||||||
|
|
||||||
|
# vim: set ts=2 sw=2 sts=2 noet ft=sh:
|
||||||
139
src/includes/helpers.h
Normal file
139
src/includes/helpers.h
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
helpers.h
|
||||||
|
This is private to us and not for user consumption
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __HELPERS_H__
|
||||||
|
#define __HELPERS_H__
|
||||||
|
|
||||||
|
#define ERRX fprintf (stderr, "out of memory\n"); exit (1)
|
||||||
|
|
||||||
|
#define UNCONST(a) ((void *)(unsigned long)(const void *)(a))
|
||||||
|
|
||||||
|
#ifdef lint
|
||||||
|
# define _unused
|
||||||
|
#endif
|
||||||
|
#if __GNUC__ > 2 || defined(__INTEL_COMPILER)
|
||||||
|
# define _dead __attribute__((__noreturn__))
|
||||||
|
# define _unused __attribute__((__unused__))
|
||||||
|
#else
|
||||||
|
# define _dead
|
||||||
|
# define _unused
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
||||||
|
|
||||||
|
/* Some libc implemntations don't have these */
|
||||||
|
#ifndef TAILQ_CONCAT
|
||||||
|
#define TAILQ_CONCAT(head1, head2, field) do { \
|
||||||
|
if (!TAILQ_EMPTY(head2)) { \
|
||||||
|
*(head1)->tqh_last = (head2)->tqh_first; \
|
||||||
|
(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
|
||||||
|
(head1)->tqh_last = (head2)->tqh_last; \
|
||||||
|
TAILQ_INIT((head2)); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TAILQ_FOREACH_SAFE
|
||||||
|
#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
|
||||||
|
for ((var) = TAILQ_FIRST((head)); \
|
||||||
|
(var) && ((tvar) = TAILQ_NEXT((var), field), 1); \
|
||||||
|
(var) = (tvar))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GLIBC__
|
||||||
|
# if ! defined (__UCLIBC__) && ! defined (__dietlibc__)
|
||||||
|
# define strlcpy(dst, src, size) snprintf(dst, size, "%s", src)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef timespecsub
|
||||||
|
#define timespecsub(tsp, usp, vsp) \
|
||||||
|
do { \
|
||||||
|
(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \
|
||||||
|
(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \
|
||||||
|
if ((vsp)->tv_nsec < 0) { \
|
||||||
|
(vsp)->tv_sec--; \
|
||||||
|
(vsp)->tv_nsec += 1000000000L; \
|
||||||
|
} \
|
||||||
|
} while (/* CONSTCOND */ 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_unused static void *xmalloc (size_t size)
|
||||||
|
{
|
||||||
|
void *value = malloc(size);
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
return (value);
|
||||||
|
|
||||||
|
ERRX;
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
_unused static void *xrealloc(void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
void *value = realloc(ptr, size);
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
return (value);
|
||||||
|
|
||||||
|
ERRX;
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
_unused static char *xstrdup(const char *str)
|
||||||
|
{
|
||||||
|
char *value;
|
||||||
|
|
||||||
|
if (! str)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
value = strdup(str);
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
return (value);
|
||||||
|
|
||||||
|
ERRX;
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef ERRX
|
||||||
|
|
||||||
|
/* basename_c never modifies the argument. As such, if there is a trailing
|
||||||
|
* slash then an empty string is returned. */
|
||||||
|
_unused static const char *basename_c(const char *path)
|
||||||
|
{
|
||||||
|
const char *slash = strrchr(path, '/');
|
||||||
|
|
||||||
|
if (slash)
|
||||||
|
return (++slash);
|
||||||
|
return (path);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -36,6 +36,9 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "helpers.h"
|
||||||
|
|
||||||
#define RC_LEVEL_BOOT "boot"
|
#define RC_LEVEL_BOOT "boot"
|
||||||
#define RC_LEVEL_DEFAULT "default"
|
#define RC_LEVEL_DEFAULT "default"
|
||||||
@@ -51,98 +54,6 @@
|
|||||||
#define RC_SVCDIR_STARTED RC_SVCDIR "/started"
|
#define RC_SVCDIR_STARTED RC_SVCDIR "/started"
|
||||||
#define RC_SVCDIR_COLDPLUGGED RC_SVCDIR "/coldplugged"
|
#define RC_SVCDIR_COLDPLUGGED RC_SVCDIR "/coldplugged"
|
||||||
|
|
||||||
#define ERRX fprintf (stderr, "out of memory\n"); exit (1)
|
|
||||||
|
|
||||||
#define UNCONST(a) ((void *)(unsigned long)(const void *)(a))
|
|
||||||
|
|
||||||
#ifdef lint
|
|
||||||
# define _unused
|
|
||||||
#endif
|
|
||||||
#if __GNUC__ > 2 || defined(__INTEL_COMPILER)
|
|
||||||
# define _dead __attribute__((__noreturn__))
|
|
||||||
# define _unused __attribute__((__unused__))
|
|
||||||
#else
|
|
||||||
# define _dead
|
|
||||||
# define _unused
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Some libc implemntations don't have these */
|
|
||||||
#ifndef TAILQ_CONCAT
|
|
||||||
#define TAILQ_CONCAT(head1, head2, field) do { \
|
|
||||||
if (!TAILQ_EMPTY(head2)) { \
|
|
||||||
*(head1)->tqh_last = (head2)->tqh_first; \
|
|
||||||
(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
|
|
||||||
(head1)->tqh_last = (head2)->tqh_last; \
|
|
||||||
TAILQ_INIT((head2)); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TAILQ_FOREACH_SAFE
|
|
||||||
#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
|
|
||||||
for ((var) = TAILQ_FIRST((head)); \
|
|
||||||
(var) && ((tvar) = TAILQ_NEXT((var), field), 1); \
|
|
||||||
(var) = (tvar))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __GLIBC__
|
|
||||||
# if ! defined (__UCLIBC__) && ! defined (__dietlibc__)
|
|
||||||
# define strlcpy(dst, src, size) snprintf(dst, size, "%s", src)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef timespecsub
|
|
||||||
#define timespecsub(tsp, usp, vsp) \
|
|
||||||
do { \
|
|
||||||
(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \
|
|
||||||
(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \
|
|
||||||
if ((vsp)->tv_nsec < 0) { \
|
|
||||||
(vsp)->tv_sec--; \
|
|
||||||
(vsp)->tv_nsec += 1000000000L; \
|
|
||||||
} \
|
|
||||||
} while (/* CONSTCOND */ 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
_unused static void *xmalloc (size_t size)
|
|
||||||
{
|
|
||||||
void *value = malloc(size);
|
|
||||||
|
|
||||||
if (value)
|
|
||||||
return (value);
|
|
||||||
|
|
||||||
ERRX;
|
|
||||||
/* NOTREACHED */
|
|
||||||
}
|
|
||||||
|
|
||||||
_unused static void *xrealloc(void *ptr, size_t size)
|
|
||||||
{
|
|
||||||
void *value = realloc(ptr, size);
|
|
||||||
|
|
||||||
if (value)
|
|
||||||
return (value);
|
|
||||||
|
|
||||||
ERRX;
|
|
||||||
/* NOTREACHED */
|
|
||||||
}
|
|
||||||
|
|
||||||
_unused static char *xstrdup(const char *str)
|
|
||||||
{
|
|
||||||
char *value;
|
|
||||||
|
|
||||||
if (! str)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
value = strdup(str);
|
|
||||||
|
|
||||||
if (value)
|
|
||||||
return (value);
|
|
||||||
|
|
||||||
ERRX;
|
|
||||||
/* NOTREACHED */
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef ERRX
|
|
||||||
|
|
||||||
_unused static bool exists(const char *pathname)
|
_unused static bool exists(const char *pathname)
|
||||||
{
|
{
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
@@ -166,19 +77,14 @@ int svc_lock(const char *);
|
|||||||
int svc_unlock(const char *, int);
|
int svc_unlock(const char *, int);
|
||||||
pid_t exec_service(const char *, const char *);
|
pid_t exec_service(const char *, const char *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check whether path is writable or not,
|
||||||
|
* this also works properly with read-only filesystems
|
||||||
|
*/
|
||||||
|
int is_writable(const char *);
|
||||||
|
|
||||||
#define service_start(service) exec_service(service, "start");
|
#define service_start(service) exec_service(service, "start");
|
||||||
#define service_stop(service) exec_service(service, "stop");
|
#define service_stop(service) exec_service(service, "stop");
|
||||||
|
|
||||||
/* basename_c never modifies the argument. As such, if there is a trailing
|
|
||||||
* slash then an empty string is returned. */
|
|
||||||
_unused static const char *basename_c(const char *path)
|
|
||||||
{
|
|
||||||
const char *slash = strrchr(path, '/');
|
|
||||||
|
|
||||||
if (slash)
|
|
||||||
return (++slash);
|
|
||||||
return (path);
|
|
||||||
}
|
|
||||||
|
|
||||||
int parse_mode(mode_t *, char *);
|
int parse_mode(mode_t *, char *);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ const char libeinfo_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "einfo.h"
|
#include "einfo.h"
|
||||||
|
#include "helpers.h"
|
||||||
#include "hidden-visibility.h"
|
#include "hidden-visibility.h"
|
||||||
|
|
||||||
hidden_proto(ecolor)
|
hidden_proto(ecolor)
|
||||||
@@ -134,7 +135,7 @@ static const struct ecolor ecolors[] = {
|
|||||||
{ ECOLOR_BRACKET, BRACKET, "bracket" },
|
{ ECOLOR_BRACKET, BRACKET, "bracket" },
|
||||||
{ ECOLOR_NORMAL, 0, NULL },
|
{ ECOLOR_NORMAL, 0, NULL },
|
||||||
};
|
};
|
||||||
static const char *ecolors_str[sizeof(ecolors)/sizeof(ecolors[0])];
|
static const char *ecolors_str[ARRAY_SIZE(ecolors)];
|
||||||
|
|
||||||
static char *flush = NULL;
|
static char *flush = NULL;
|
||||||
static char *up = NULL;
|
static char *up = NULL;
|
||||||
@@ -225,27 +226,6 @@ strlcat(char *dst, const char *src, size_t size)
|
|||||||
|
|
||||||
return dst_n + (s - src);
|
return dst_n + (s - src);
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t
|
|
||||||
strlcpy(char *dst, const char *src, size_t size)
|
|
||||||
{
|
|
||||||
const char *s = src;
|
|
||||||
size_t n = size;
|
|
||||||
|
|
||||||
if (n && --n)
|
|
||||||
do {
|
|
||||||
if (!(*dst++ = *src++))
|
|
||||||
break;
|
|
||||||
} while (--n);
|
|
||||||
|
|
||||||
if (!n) {
|
|
||||||
if (size)
|
|
||||||
*dst = '\0';
|
|
||||||
while (*src++);
|
|
||||||
}
|
|
||||||
|
|
||||||
return src - s - 1;
|
|
||||||
}
|
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -462,7 +442,7 @@ colour_terminal(FILE * EINFO_RESTRICT f)
|
|||||||
|
|
||||||
/* Now setup our colours */
|
/* Now setup our colours */
|
||||||
p = ebuffer;
|
p = ebuffer;
|
||||||
for (i = 0; i < sizeof(ecolors) / sizeof(ecolors[0]); i++) {
|
for (i = 0; i < ARRAY_SIZE(ecolors); ++i) {
|
||||||
tmp[0] = '\0';
|
tmp[0] = '\0';
|
||||||
if (ecolors[i].name) {
|
if (ecolors[i].name) {
|
||||||
bold = _md;
|
bold = _md;
|
||||||
@@ -598,7 +578,7 @@ _ecolor(FILE * EINFO_RESTRICT f, ECOLOR color)
|
|||||||
if (!colour_terminal(f))
|
if (!colour_terminal(f))
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
for (i = 0; i < sizeof(ecolors) / sizeof(ecolors[0]); i++)
|
for (i = 0; i < ARRAY_SIZE(ecolors); ++i)
|
||||||
if (ecolors[i].color == color)
|
if (ecolors[i].color == color)
|
||||||
return ecolors_str[i];
|
return ecolors_str[i];
|
||||||
return "";
|
return "";
|
||||||
|
|||||||
@@ -687,27 +687,27 @@ rc_deptree_update_needed(time_t *newest, char *file)
|
|||||||
if (!existss(RC_DEPTREE_CACHE))
|
if (!existss(RC_DEPTREE_CACHE))
|
||||||
return true;
|
return true;
|
||||||
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_INITDIR, newest, file))
|
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_INITDIR, newest, file))
|
||||||
newer = true;
|
return true;
|
||||||
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONFDIR, newest, file))
|
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONFDIR, newest, file))
|
||||||
newer = true;
|
return true;
|
||||||
#ifdef RC_PKG_INITDIR
|
#ifdef RC_PKG_INITDIR
|
||||||
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_PKG_INITDIR, newest, file))
|
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_PKG_INITDIR, newest, file))
|
||||||
newer = true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
#ifdef RC_PKG_CONFDIR
|
#ifdef RC_PKG_CONFDIR
|
||||||
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_PKG_CONFDIR, newest, file))
|
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_PKG_CONFDIR, newest, file))
|
||||||
newer = true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
#ifdef RC_LOCAL_INITDIR
|
#ifdef RC_LOCAL_INITDIR
|
||||||
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_LOCAL_INITDIR, newest, file))
|
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_LOCAL_INITDIR, newest, file))
|
||||||
newer = true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
#ifdef RC_LOCAL_CONFDIR
|
#ifdef RC_LOCAL_CONFDIR
|
||||||
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_LOCAL_CONFDIR, newest, file))
|
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_LOCAL_CONFDIR, newest, file))
|
||||||
newer = true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONF, newest, file))
|
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONF, newest, file))
|
||||||
newer = true;
|
return true;
|
||||||
|
|
||||||
/* Some init scripts dependencies change depending on config files
|
/* Some init scripts dependencies change depending on config files
|
||||||
* outside of baselayout, like syslog-ng, so we check those too. */
|
* outside of baselayout, like syslog-ng, so we check those too. */
|
||||||
@@ -715,8 +715,7 @@ rc_deptree_update_needed(time_t *newest, char *file)
|
|||||||
TAILQ_FOREACH(s, config, entries) {
|
TAILQ_FOREACH(s, config, entries) {
|
||||||
if (!rc_newer_than(RC_DEPTREE_CACHE, s->value, newest, file)) {
|
if (!rc_newer_than(RC_DEPTREE_CACHE, s->value, newest, file)) {
|
||||||
newer = true;
|
newer = true;
|
||||||
if (newest == NULL)
|
break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rc_stringlist_free(config);
|
rc_stringlist_free(config);
|
||||||
|
|||||||
@@ -127,6 +127,53 @@ rc_getline(char **line, size_t *len, FILE *fp)
|
|||||||
}
|
}
|
||||||
librc_hidden_def(rc_getline)
|
librc_hidden_def(rc_getline)
|
||||||
|
|
||||||
|
char *
|
||||||
|
rc_proc_getent(const char *ent)
|
||||||
|
{
|
||||||
|
#ifdef __linux__
|
||||||
|
FILE *fp;
|
||||||
|
char *proc, *p, *value = NULL;
|
||||||
|
size_t i, len;
|
||||||
|
|
||||||
|
if (!exists("/proc/cmdline"))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!(fp = fopen("/proc/cmdline", "r")))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
proc = NULL;
|
||||||
|
i = 0;
|
||||||
|
if (rc_getline(&proc, &i, fp) == -1 || proc == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (proc != NULL) {
|
||||||
|
len = strlen(ent);
|
||||||
|
|
||||||
|
while ((p = strsep(&proc, " "))) {
|
||||||
|
if (strncmp(ent, p, len) == 0 && (p[len] == '\0' || p[len] == ' ' || p[len] == '=')) {
|
||||||
|
p += len;
|
||||||
|
|
||||||
|
if (*p == '=')
|
||||||
|
p++;
|
||||||
|
|
||||||
|
value = xstrdup(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!value)
|
||||||
|
errno = ENOENT;
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
free(proc);
|
||||||
|
|
||||||
|
return value;
|
||||||
|
#else
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
librc_hidden_def(rc_proc_getent)
|
||||||
|
|
||||||
RC_STRINGLIST *
|
RC_STRINGLIST *
|
||||||
rc_config_list(const char *file)
|
rc_config_list(const char *file)
|
||||||
{
|
{
|
||||||
@@ -166,6 +213,64 @@ rc_config_list(const char *file)
|
|||||||
}
|
}
|
||||||
librc_hidden_def(rc_config_list)
|
librc_hidden_def(rc_config_list)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Override some specific rc.conf options on the kernel command line
|
||||||
|
*/
|
||||||
|
#ifdef __linux__
|
||||||
|
static RC_STRINGLIST *rc_config_override(RC_STRINGLIST *config)
|
||||||
|
{
|
||||||
|
RC_STRINGLIST *overrides;
|
||||||
|
RC_STRING *cline, *override, *config_np;
|
||||||
|
char *tmp = NULL;
|
||||||
|
char *value = NULL;
|
||||||
|
size_t varlen = 0;
|
||||||
|
size_t len = 0;
|
||||||
|
|
||||||
|
overrides = rc_stringlist_new();
|
||||||
|
|
||||||
|
/* A list of variables which may be overridden on the kernel command line */
|
||||||
|
rc_stringlist_add(overrides, "rc_parallel");
|
||||||
|
|
||||||
|
TAILQ_FOREACH(override, overrides, entries) {
|
||||||
|
varlen = strlen(override->value);
|
||||||
|
value = rc_proc_getent(override->value);
|
||||||
|
|
||||||
|
/* No need to continue if there's nothing to override */
|
||||||
|
if (!value) {
|
||||||
|
free(value);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value != NULL) {
|
||||||
|
len = varlen + strlen(value) + 2;
|
||||||
|
tmp = xmalloc(sizeof(char) * len);
|
||||||
|
snprintf(tmp, len, "%s=%s", override->value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Whenever necessary remove the old config entry first to prevent
|
||||||
|
* duplicates
|
||||||
|
*/
|
||||||
|
TAILQ_FOREACH_SAFE(cline, config, entries, config_np) {
|
||||||
|
if (strncmp(override->value, cline->value, varlen) == 0
|
||||||
|
&& cline->value[varlen] == '=') {
|
||||||
|
rc_stringlist_delete(config, cline->value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add the option (var/value) to the current config */
|
||||||
|
rc_stringlist_add(config, tmp);
|
||||||
|
|
||||||
|
free(tmp);
|
||||||
|
free(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc_stringlist_free(overrides);
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
RC_STRINGLIST *
|
RC_STRINGLIST *
|
||||||
rc_config_load(const char *file)
|
rc_config_load(const char *file)
|
||||||
{
|
{
|
||||||
@@ -239,6 +344,13 @@ rc_config_load(const char *file)
|
|||||||
}
|
}
|
||||||
rc_stringlist_free(list);
|
rc_stringlist_free(list);
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
/* Only override rc.conf settings */
|
||||||
|
if (strcmp(file, RC_CONF) == 0) {
|
||||||
|
config = rc_config_override(config);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
librc_hidden_def(rc_config_load)
|
librc_hidden_def(rc_config_load)
|
||||||
@@ -279,7 +391,7 @@ rc_conf_value(const char *setting)
|
|||||||
atexit(_free_rc_conf);
|
atexit(_free_rc_conf);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Support old configs */
|
/* Support old configs. */
|
||||||
if (exists(RC_CONF_OLD)) {
|
if (exists(RC_CONF_OLD)) {
|
||||||
old = rc_config_load(RC_CONF_OLD);
|
old = rc_config_load(RC_CONF_OLD);
|
||||||
TAILQ_CONCAT(rc_conf, old, entries);
|
TAILQ_CONCAT(rc_conf, old, entries);
|
||||||
|
|||||||
@@ -216,7 +216,6 @@ rc_sys_v2(void)
|
|||||||
}
|
}
|
||||||
/* Now do detection */
|
/* Now do detection */
|
||||||
__STRING_SWITCH(systype)
|
__STRING_SWITCH(systype)
|
||||||
__STRING_CASE(RC_SYS_PREFIX) { return RC_SYS_PREFIX; }
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
__STRING_CASE(RC_SYS_JAIL) { return RC_SYS_JAIL; }
|
__STRING_CASE(RC_SYS_JAIL) { return RC_SYS_JAIL; }
|
||||||
#endif /* __FreeBSD__ */
|
#endif /* __FreeBSD__ */
|
||||||
@@ -246,10 +245,6 @@ librc_hidden_def(rc_sys_v2)
|
|||||||
const char *
|
const char *
|
||||||
rc_sys_v1(void)
|
rc_sys_v1(void)
|
||||||
{
|
{
|
||||||
#ifdef PREFIX
|
|
||||||
return RC_SYS_PREFIX;
|
|
||||||
#else
|
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
int jailed = 0;
|
int jailed = 0;
|
||||||
size_t len = sizeof(jailed);
|
size_t len = sizeof(jailed);
|
||||||
@@ -286,7 +281,6 @@ rc_sys_v1(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif /* PREFIX */
|
|
||||||
}
|
}
|
||||||
librc_hidden_def(rc_sys_v1)
|
librc_hidden_def(rc_sys_v1)
|
||||||
|
|
||||||
@@ -492,7 +486,7 @@ rc_service_exists(const char *service)
|
|||||||
{
|
{
|
||||||
char *file;
|
char *file;
|
||||||
bool retval = false;
|
bool retval = false;
|
||||||
int len;
|
size_t len;
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
|
|
||||||
if (!service) {
|
if (!service) {
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ librc_hidden_proto(rc_find_pids)
|
|||||||
librc_hidden_proto(rc_getfile)
|
librc_hidden_proto(rc_getfile)
|
||||||
librc_hidden_proto(rc_getline)
|
librc_hidden_proto(rc_getline)
|
||||||
librc_hidden_proto(rc_newer_than)
|
librc_hidden_proto(rc_newer_than)
|
||||||
|
librc_hidden_proto(rc_proc_getent)
|
||||||
librc_hidden_proto(rc_older_than)
|
librc_hidden_proto(rc_older_than)
|
||||||
librc_hidden_proto(rc_runlevel_exists)
|
librc_hidden_proto(rc_runlevel_exists)
|
||||||
librc_hidden_proto(rc_runlevel_get)
|
librc_hidden_proto(rc_runlevel_get)
|
||||||
|
|||||||
@@ -36,7 +36,11 @@ __BEGIN_DECLS
|
|||||||
#define RC_SYSCONFDIR "@SYSCONFDIR@"
|
#define RC_SYSCONFDIR "@SYSCONFDIR@"
|
||||||
#define RC_LIBDIR "@PREFIX@/@LIB@/rc"
|
#define RC_LIBDIR "@PREFIX@/@LIB@/rc"
|
||||||
#define RC_LIBEXECDIR "@LIBEXECDIR@"
|
#define RC_LIBEXECDIR "@LIBEXECDIR@"
|
||||||
|
#ifdef __linux__
|
||||||
|
#define RC_SVCDIR "@PREFIX@/run/openrc"
|
||||||
|
#else
|
||||||
#define RC_SVCDIR RC_LIBEXECDIR "/init.d"
|
#define RC_SVCDIR RC_LIBEXECDIR "/init.d"
|
||||||
|
#endif
|
||||||
#define RC_RUNLEVELDIR RC_SYSCONFDIR "/runlevels"
|
#define RC_RUNLEVELDIR RC_SYSCONFDIR "/runlevels"
|
||||||
#define RC_INITDIR RC_SYSCONFDIR "/init.d"
|
#define RC_INITDIR RC_SYSCONFDIR "/init.d"
|
||||||
#define RC_CONFDIR RC_SYSCONFDIR "/conf.d"
|
#define RC_CONFDIR RC_SYSCONFDIR "/conf.d"
|
||||||
@@ -276,7 +280,6 @@ bool rc_service_daemons_crashed(const char *);
|
|||||||
#define RC_SYS_JAIL "JAIL"
|
#define RC_SYS_JAIL "JAIL"
|
||||||
#define RC_SYS_OPENVZ "OPENVZ"
|
#define RC_SYS_OPENVZ "OPENVZ"
|
||||||
#define RC_SYS_LXC "LXC"
|
#define RC_SYS_LXC "LXC"
|
||||||
#define RC_SYS_PREFIX "PREFIX"
|
|
||||||
#define RC_SYS_UML "UML"
|
#define RC_SYS_UML "UML"
|
||||||
#define RC_SYS_VSERVER "VSERVER"
|
#define RC_SYS_VSERVER "VSERVER"
|
||||||
#define RC_SYS_XEN0 "XEN0"
|
#define RC_SYS_XEN0 "XEN0"
|
||||||
@@ -361,6 +364,11 @@ bool rc_newer_than(const char *, const char *, time_t *, char *);
|
|||||||
* @return true if source is older than target, otherwise false */
|
* @return true if source is older than target, otherwise false */
|
||||||
bool rc_older_than(const char *, const char *, time_t *, char *);
|
bool rc_older_than(const char *, const char *, time_t *, char *);
|
||||||
|
|
||||||
|
/*! Read variables/values from /proc/cmdline
|
||||||
|
* @param value
|
||||||
|
* @return pointer to the value, otherwise NULL */
|
||||||
|
char *rc_proc_getent(const char *);
|
||||||
|
|
||||||
/*! Update the cached dependency tree if it's older than any init script,
|
/*! Update the cached dependency tree if it's older than any init script,
|
||||||
* its configuration file or an external configuration file the init script
|
* its configuration file or an external configuration file the init script
|
||||||
* has specified.
|
* has specified.
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ global:
|
|||||||
rc_getline;
|
rc_getline;
|
||||||
rc_newer_than;
|
rc_newer_than;
|
||||||
rc_older_than;
|
rc_older_than;
|
||||||
|
rc_proc_getent;
|
||||||
rc_runlevel_exists;
|
rc_runlevel_exists;
|
||||||
rc_runlevel_get;
|
rc_runlevel_get;
|
||||||
rc_runlevel_list;
|
rc_runlevel_list;
|
||||||
|
|||||||
@@ -46,44 +46,87 @@
|
|||||||
#include "einfo.h"
|
#include "einfo.h"
|
||||||
#include "rc-misc.h"
|
#include "rc-misc.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
inode_unknown = 0,
|
||||||
|
inode_file = 1,
|
||||||
|
inode_dir = 2,
|
||||||
|
inode_fifo = 3,
|
||||||
|
} inode_t;
|
||||||
|
|
||||||
extern const char *applet;
|
extern const char *applet;
|
||||||
|
|
||||||
|
/* TODO: SELinux
|
||||||
|
* This needs a LOT of SELinux loving
|
||||||
|
* See systemd's src/label.c:label_mkdir
|
||||||
|
*/
|
||||||
static int
|
static int
|
||||||
do_check(char *path, uid_t uid, gid_t gid, mode_t mode, int file)
|
do_check(char *path, uid_t uid, gid_t gid, mode_t mode, inode_t type, bool trunc)
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int fd;
|
int fd, flags;
|
||||||
|
int r;
|
||||||
|
int u;
|
||||||
|
|
||||||
if (stat(path, &st)) {
|
if (stat(path, &st) || trunc) {
|
||||||
if (file) {
|
if (type == inode_file) {
|
||||||
einfo("%s: creating file", path);
|
einfo("%s: creating file", path);
|
||||||
if (!mode)
|
if (!mode) /* 664 */
|
||||||
mode = S_IRUSR | S_IWUSR | S_IRGRP |
|
mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
|
||||||
S_IWGRP | S_IROTH;
|
flags = O_CREAT|O_NDELAY|O_WRONLY|O_NOCTTY;
|
||||||
if ((fd = open(path, O_CREAT, mode)) == -1) {
|
#ifdef O_CLOEXEC
|
||||||
|
flags |= O_CLOEXEC;
|
||||||
|
#endif
|
||||||
|
#ifdef O_NOFOLLOW
|
||||||
|
flags |= O_NOFOLLOW;
|
||||||
|
#endif
|
||||||
|
if (trunc)
|
||||||
|
flags |= O_TRUNC;
|
||||||
|
u = umask(0);
|
||||||
|
fd = open(path, flags, mode);
|
||||||
|
umask(u);
|
||||||
|
if (fd == -1) {
|
||||||
eerror("%s: open: %s", applet, strerror(errno));
|
eerror("%s: open: %s", applet, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
close (fd);
|
close (fd);
|
||||||
} else {
|
} else if (type == inode_dir) {
|
||||||
einfo("%s: creating directory", path);
|
einfo("%s: creating directory", path);
|
||||||
if (!mode)
|
if (!mode) /* 775 */
|
||||||
mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;
|
mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;
|
||||||
if (mkdir(path, mode)) {
|
u = umask(0);
|
||||||
|
/* We do not recursively create parents */
|
||||||
|
r = mkdir(path, mode);
|
||||||
|
umask(u);
|
||||||
|
if (r == -1 && errno != EEXIST) {
|
||||||
eerror("%s: mkdir: %s", applet,
|
eerror("%s: mkdir: %s", applet,
|
||||||
strerror (errno));
|
strerror (errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
mode = 0;
|
mode = 0;
|
||||||
|
} else if (type == inode_fifo) {
|
||||||
|
einfo("%s: creating fifo", path);
|
||||||
|
if (!mode) /* 600 */
|
||||||
|
mode = S_IRUSR | S_IWUSR;
|
||||||
|
u = umask(0);
|
||||||
|
r = mkfifo(path, mode);
|
||||||
|
umask(u);
|
||||||
|
if (r == -1 && errno != EEXIST) {
|
||||||
|
eerror("%s: mkfifo: %s", applet,
|
||||||
|
strerror (errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((file && S_ISDIR(st.st_mode)) ||
|
if (type != inode_dir && S_ISDIR(st.st_mode)) {
|
||||||
(!file && !S_ISDIR(st.st_mode)))
|
eerror("%s: is a directory", path);
|
||||||
{
|
return 1;
|
||||||
if (file)
|
}
|
||||||
eerror("%s: is a directory", path);
|
if (type != inode_file && S_ISREG(st.st_mode)) {
|
||||||
else
|
eerror("%s: is a file", path);
|
||||||
eerror("%s: is a file", path);
|
return 1;
|
||||||
|
}
|
||||||
|
if (type != inode_fifo && S_ISFIFO(st.st_mode)) {
|
||||||
|
eerror("%s: is a fifo", path);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -142,20 +185,28 @@ parse_owner(struct passwd **user, struct group **group, const char *owner)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#include "_usage.h"
|
#include "_usage.h"
|
||||||
#define extraopts "path1 path2 ..."
|
#define extraopts "path1 [path2] [...]"
|
||||||
#define getoptstring "dfm:o:" getoptstring_COMMON
|
#define getoptstring "dDfFpm:o:W:" getoptstring_COMMON
|
||||||
static const struct option longopts[] = {
|
static const struct option longopts[] = {
|
||||||
{ "directory", 0, NULL, 'd'},
|
{ "directory", 0, NULL, 'd'},
|
||||||
{ "file", 0, NULL, 'f'},
|
{ "directory-truncate", 0, NULL, 'D'},
|
||||||
{ "mode", 1, NULL, 'm'},
|
{ "file", 0, NULL, 'f'},
|
||||||
{ "owner", 1, NULL, 'o'},
|
{ "file-truncate", 0, NULL, 'F'},
|
||||||
|
{ "pipe", 0, NULL, 'p'},
|
||||||
|
{ "mode", 1, NULL, 'm'},
|
||||||
|
{ "owner", 1, NULL, 'o'},
|
||||||
|
{ "writable", 1, NULL, 'W'},
|
||||||
longopts_COMMON
|
longopts_COMMON
|
||||||
};
|
};
|
||||||
static const char * const longopts_help[] = {
|
static const char * const longopts_help[] = {
|
||||||
"Check if a directory",
|
"Create a directory if not exists",
|
||||||
"Check if a file",
|
"Create/empty directory",
|
||||||
|
"Create a file if not exists",
|
||||||
|
"Truncate file",
|
||||||
|
"Create a named pipe (FIFO) if not exists",
|
||||||
"Mode to check",
|
"Mode to check",
|
||||||
"Owner to check (user:group)",
|
"Owner to check (user:group)",
|
||||||
|
"Check whether the path is writable or not",
|
||||||
longopts_help_COMMON
|
longopts_help_COMMON
|
||||||
};
|
};
|
||||||
#include "_usage.c"
|
#include "_usage.c"
|
||||||
@@ -169,18 +220,26 @@ checkpath(int argc, char **argv)
|
|||||||
mode_t mode = 0;
|
mode_t mode = 0;
|
||||||
struct passwd *pw = NULL;
|
struct passwd *pw = NULL;
|
||||||
struct group *gr = NULL;
|
struct group *gr = NULL;
|
||||||
bool file = 0;
|
inode_t type = inode_unknown;
|
||||||
int retval = EXIT_SUCCESS;
|
int retval = EXIT_SUCCESS;
|
||||||
|
bool trunc = 0;
|
||||||
|
|
||||||
while ((opt = getopt_long(argc, argv, getoptstring,
|
while ((opt = getopt_long(argc, argv, getoptstring,
|
||||||
longopts, (int *) 0)) != -1)
|
longopts, (int *) 0)) != -1)
|
||||||
{
|
{
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
|
case 'D':
|
||||||
|
trunc = 1;
|
||||||
case 'd':
|
case 'd':
|
||||||
file = 0;
|
type = inode_dir;
|
||||||
break;
|
break;
|
||||||
|
case 'F':
|
||||||
|
trunc = 1;
|
||||||
case 'f':
|
case 'f':
|
||||||
file = 1;
|
type = inode_file;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
type = inode_fifo;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
if (parse_mode(&mode, optarg) != 0)
|
if (parse_mode(&mode, optarg) != 0)
|
||||||
@@ -192,6 +251,11 @@ checkpath(int argc, char **argv)
|
|||||||
eerrorx("%s: owner `%s' not found",
|
eerrorx("%s: owner `%s' not found",
|
||||||
applet, optarg);
|
applet, optarg);
|
||||||
break;
|
break;
|
||||||
|
case 'W':
|
||||||
|
if (argv[optind] != NULL)
|
||||||
|
ewarn("-W/--writable takes only one path, everything else will be ignored");
|
||||||
|
exit(!is_writable(optarg));
|
||||||
|
break;
|
||||||
|
|
||||||
case_RC_COMMON_GETOPT
|
case_RC_COMMON_GETOPT
|
||||||
}
|
}
|
||||||
@@ -208,7 +272,7 @@ checkpath(int argc, char **argv)
|
|||||||
gid = gr->gr_gid;
|
gid = gr->gr_gid;
|
||||||
|
|
||||||
while (optind < argc) {
|
while (optind < argc) {
|
||||||
if (do_check(argv[optind], uid, gid, mode, file))
|
if (do_check(argv[optind], uid, gid, mode, type, trunc))
|
||||||
retval = EXIT_FAILURE;
|
retval = EXIT_FAILURE;
|
||||||
optind++;
|
optind++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,9 +93,9 @@ getmntfile(const char *file)
|
|||||||
extern const char *applet;
|
extern const char *applet;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
do_mount(struct ENT *ent)
|
do_mount(struct ENT *ent, bool remount)
|
||||||
{
|
{
|
||||||
char *argv[8];
|
char *argv[10];
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
@@ -104,9 +104,24 @@ do_mount(struct ENT *ent)
|
|||||||
argv[2] = ENT_OPTS(*ent);
|
argv[2] = ENT_OPTS(*ent);
|
||||||
argv[3] = UNCONST("-t");
|
argv[3] = UNCONST("-t");
|
||||||
argv[4] = ENT_TYPE(*ent);
|
argv[4] = ENT_TYPE(*ent);
|
||||||
argv[5] = ENT_BLOCKDEVICE(*ent);
|
if (!remount) {
|
||||||
argv[6] = ENT_FILE(*ent);
|
argv[5] = ENT_BLOCKDEVICE(*ent);
|
||||||
argv[7] = NULL;
|
argv[6] = ENT_FILE(*ent);
|
||||||
|
argv[7] = NULL;
|
||||||
|
} else {
|
||||||
|
#ifdef __linux__
|
||||||
|
argv[5] = UNCONST("-o");
|
||||||
|
argv[6] = UNCONST("remount");
|
||||||
|
argv[7] = ENT_BLOCKDEVICE(*ent);
|
||||||
|
argv[8] = ENT_FILE(*ent);
|
||||||
|
argv[9] = NULL;
|
||||||
|
#else
|
||||||
|
argv[5] = UNCONST("-u");
|
||||||
|
argv[6] = ENT_BLOCKDEVICE(*ent);
|
||||||
|
argv[7] = ENT_FILE(*ent);
|
||||||
|
argv[8] = NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
switch (pid = vfork()) {
|
switch (pid = vfork()) {
|
||||||
case -1:
|
case -1:
|
||||||
eerrorx("%s: vfork: %s", applet, strerror(errno));
|
eerrorx("%s: vfork: %s", applet, strerror(errno));
|
||||||
@@ -127,9 +142,10 @@ do_mount(struct ENT *ent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#include "_usage.h"
|
#include "_usage.h"
|
||||||
#define getoptstring "Mbmop:t:" getoptstring_COMMON
|
#define getoptstring "MRbmop:t:" getoptstring_COMMON
|
||||||
static const struct option longopts[] = {
|
static const struct option longopts[] = {
|
||||||
{ "mount", 0, NULL, 'M' },
|
{ "mount", 0, NULL, 'M' },
|
||||||
|
{ "remount", 0, NULL, 'R' },
|
||||||
{ "blockdevice", 0, NULL, 'b' },
|
{ "blockdevice", 0, NULL, 'b' },
|
||||||
{ "mountargs", 0, NULL, 'm' },
|
{ "mountargs", 0, NULL, 'm' },
|
||||||
{ "options", 0, NULL, 'o' },
|
{ "options", 0, NULL, 'o' },
|
||||||
@@ -139,6 +155,7 @@ static const struct option longopts[] = {
|
|||||||
};
|
};
|
||||||
static const char * const longopts_help[] = {
|
static const char * const longopts_help[] = {
|
||||||
"Mounts the filesytem from the mountpoint",
|
"Mounts the filesytem from the mountpoint",
|
||||||
|
"Remounts the filesystem based on the information in fstab",
|
||||||
"Extract the block device",
|
"Extract the block device",
|
||||||
"Show arguments needed to mount the entry",
|
"Show arguments needed to mount the entry",
|
||||||
"Extract the options field",
|
"Extract the options field",
|
||||||
@@ -154,6 +171,7 @@ static const char * const longopts_help[] = {
|
|||||||
#define OUTPUT_PASSNO (1 << 4)
|
#define OUTPUT_PASSNO (1 << 4)
|
||||||
#define OUTPUT_BLOCKDEV (1 << 5)
|
#define OUTPUT_BLOCKDEV (1 << 5)
|
||||||
#define OUTPUT_MOUNT (1 << 6)
|
#define OUTPUT_MOUNT (1 << 6)
|
||||||
|
#define OUTPUT_REMOUNT (1 << 7)
|
||||||
|
|
||||||
int
|
int
|
||||||
fstabinfo(int argc, char **argv)
|
fstabinfo(int argc, char **argv)
|
||||||
@@ -182,6 +200,9 @@ fstabinfo(int argc, char **argv)
|
|||||||
case 'M':
|
case 'M':
|
||||||
output = OUTPUT_MOUNT;
|
output = OUTPUT_MOUNT;
|
||||||
break;
|
break;
|
||||||
|
case 'R':
|
||||||
|
output = OUTPUT_REMOUNT;
|
||||||
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
output = OUTPUT_BLOCKDEV;
|
output = OUTPUT_BLOCKDEV;
|
||||||
break;
|
break;
|
||||||
@@ -287,7 +308,11 @@ fstabinfo(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case OUTPUT_MOUNT:
|
case OUTPUT_MOUNT:
|
||||||
result += do_mount(ent);
|
result += do_mount(ent, false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OUTPUT_REMOUNT:
|
||||||
|
result += do_mount(ent, true);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OUTPUT_MOUNTARGS:
|
case OUTPUT_MOUNTARGS:
|
||||||
|
|||||||
@@ -253,13 +253,38 @@ do_e(int argc, char **argv)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct {
|
||||||
|
const char * const name;
|
||||||
|
RC_SERVICE bit;
|
||||||
|
} service_bits[] = {
|
||||||
|
{ "service_started", RC_SERVICE_STARTED, },
|
||||||
|
{ "service_stopped", RC_SERVICE_STOPPED, },
|
||||||
|
{ "service_inactive", RC_SERVICE_INACTIVE, },
|
||||||
|
{ "service_starting", RC_SERVICE_STARTING, },
|
||||||
|
{ "service_stopping", RC_SERVICE_STOPPING, },
|
||||||
|
{ "service_hotplugged", RC_SERVICE_HOTPLUGGED, },
|
||||||
|
{ "service_wasinactive", RC_SERVICE_WASINACTIVE, },
|
||||||
|
{ "service_failed", RC_SERVICE_FAILED, },
|
||||||
|
};
|
||||||
|
|
||||||
|
static RC_SERVICE
|
||||||
|
lookup_service_state(const char *service)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < ARRAY_SIZE(service_bits); ++i)
|
||||||
|
if (!strcmp(service, service_bits[i].name))
|
||||||
|
return service_bits[i].bit;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
do_service(int argc, char **argv)
|
do_service(int argc, char **argv)
|
||||||
{
|
{
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
char *service;
|
char *service;
|
||||||
char *exec;
|
char *exec;
|
||||||
int idx = 0;
|
int idx;
|
||||||
|
RC_SERVICE state, bit;
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
service = argv[1];
|
service = argv[1];
|
||||||
@@ -269,21 +294,11 @@ do_service(int argc, char **argv)
|
|||||||
if (service == NULL || *service == '\0')
|
if (service == NULL || *service == '\0')
|
||||||
eerrorx("%s: no service specified", applet);
|
eerrorx("%s: no service specified", applet);
|
||||||
|
|
||||||
if (strcmp(applet, "service_started") == 0)
|
state = rc_service_state(service);
|
||||||
ok = (rc_service_state(service) & RC_SERVICE_STARTED);
|
bit = lookup_service_state(applet);
|
||||||
else if (strcmp(applet, "service_stopped") == 0)
|
if (bit) {
|
||||||
ok = (rc_service_state(service) & RC_SERVICE_STOPPED);
|
ok = (state & bit);
|
||||||
else if (strcmp(applet, "service_inactive") == 0)
|
} else if (strcmp(applet, "service_started_daemon") == 0) {
|
||||||
ok = (rc_service_state(service) & RC_SERVICE_INACTIVE);
|
|
||||||
else if (strcmp(applet, "service_starting") == 0)
|
|
||||||
ok = (rc_service_state(service) & RC_SERVICE_STARTING);
|
|
||||||
else if (strcmp(applet, "service_stopping") == 0)
|
|
||||||
ok = (rc_service_state(service) & RC_SERVICE_STOPPING);
|
|
||||||
else if (strcmp(applet, "service_hotplugged") == 0)
|
|
||||||
ok = (rc_service_state(service) & RC_SERVICE_HOTPLUGGED);
|
|
||||||
else if (strcmp(applet, "service_wasinactive") == 0)
|
|
||||||
ok = (rc_service_state(service) & RC_SERVICE_WASINACTIVE);
|
|
||||||
else if (strcmp(applet, "service_started_daemon") == 0) {
|
|
||||||
service = getenv("RC_SVCNAME");
|
service = getenv("RC_SVCNAME");
|
||||||
exec = argv[1];
|
exec = argv[1];
|
||||||
if (argc > 3) {
|
if (argc > 3) {
|
||||||
@@ -315,37 +330,34 @@ do_mark_service(int argc, char **argv)
|
|||||||
char *svcname = getenv("RC_SVCNAME");
|
char *svcname = getenv("RC_SVCNAME");
|
||||||
char *service = NULL;
|
char *service = NULL;
|
||||||
char *runscript_pid;
|
char *runscript_pid;
|
||||||
char *mtime;
|
/* char *mtime; */
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
size_t l;
|
RC_SERVICE bit;
|
||||||
|
/* size_t l; */
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
service = argv[1];
|
service = argv[1];
|
||||||
else
|
else
|
||||||
service = getenv("RC_SVCNAME");
|
service = svcname;
|
||||||
|
|
||||||
if (service == NULL || *service == '\0')
|
if (service == NULL || *service == '\0')
|
||||||
eerrorx("%s: no service specified", applet);
|
eerrorx("%s: no service specified", applet);
|
||||||
|
|
||||||
if (strcmp(applet, "mark_service_started") == 0)
|
if (!strncmp(applet, "mark_", 5) &&
|
||||||
ok = rc_service_mark(service, RC_SERVICE_STARTED);
|
(bit = lookup_service_state(applet + 5)))
|
||||||
else if (strcmp(applet, "mark_service_stopped") == 0)
|
ok = rc_service_mark(service, bit);
|
||||||
ok = rc_service_mark(service, RC_SERVICE_STOPPED);
|
|
||||||
else if (strcmp(applet, "mark_service_inactive") == 0)
|
|
||||||
ok = rc_service_mark(service, RC_SERVICE_INACTIVE);
|
|
||||||
else if (strcmp(applet, "mark_service_starting") == 0)
|
|
||||||
ok = rc_service_mark(service, RC_SERVICE_STARTING);
|
|
||||||
else if (strcmp(applet, "mark_service_stopping") == 0)
|
|
||||||
ok = rc_service_mark(service, RC_SERVICE_STOPPING);
|
|
||||||
else if (strcmp(applet, "mark_service_hotplugged") == 0)
|
|
||||||
ok = rc_service_mark(service, RC_SERVICE_HOTPLUGGED);
|
|
||||||
else if (strcmp(applet, "mark_service_failed") == 0)
|
|
||||||
ok = rc_service_mark(service, RC_SERVICE_FAILED);
|
|
||||||
else
|
else
|
||||||
eerrorx("%s: unknown applet", applet);
|
eerrorx("%s: unknown applet", applet);
|
||||||
|
|
||||||
/* If we're marking ourselves then we need to inform our parent
|
/* If we're marking ourselves then we need to inform our parent
|
||||||
runscript process so they do not mark us based on our exit code */
|
runscript process so they do not mark us based on our exit code */
|
||||||
|
/*
|
||||||
|
* FIXME: svcname and service are almost always equal except called from a
|
||||||
|
* shell with just argv[1] - So that doesn't seem to do what Roy initially
|
||||||
|
* expected.
|
||||||
|
* See 20120424041423.GA23657@odin.qasl.de (Tue, 24 Apr 2012 06:14:23 +0200,
|
||||||
|
* openrc@gentoo.org).
|
||||||
|
*/
|
||||||
if (ok && svcname && strcmp(svcname, service) == 0) {
|
if (ok && svcname && strcmp(svcname, service) == 0) {
|
||||||
runscript_pid = getenv("RC_RUNSCRIPT_PID");
|
runscript_pid = getenv("RC_RUNSCRIPT_PID");
|
||||||
if (runscript_pid && sscanf(runscript_pid, "%d", &pid) == 1)
|
if (runscript_pid && sscanf(runscript_pid, "%d", &pid) == 1)
|
||||||
@@ -355,6 +367,7 @@ do_mark_service(int argc, char **argv)
|
|||||||
|
|
||||||
/* Remove the exclusive time test. This ensures that it's not
|
/* Remove the exclusive time test. This ensures that it's not
|
||||||
in control as well */
|
in control as well */
|
||||||
|
/*
|
||||||
l = strlen(RC_SVCDIR "/exclusive") + strlen(svcname) +
|
l = strlen(RC_SVCDIR "/exclusive") + strlen(svcname) +
|
||||||
strlen(runscript_pid) + 4;
|
strlen(runscript_pid) + 4;
|
||||||
mtime = xmalloc(l);
|
mtime = xmalloc(l);
|
||||||
@@ -363,6 +376,7 @@ do_mark_service(int argc, char **argv)
|
|||||||
if (exists(mtime) && unlink(mtime) != 0)
|
if (exists(mtime) && unlink(mtime) != 0)
|
||||||
eerror("%s: unlink: %s", applet, strerror(errno));
|
eerror("%s: unlink: %s", applet, strerror(errno));
|
||||||
free(mtime);
|
free(mtime);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
return ok ? EXIT_SUCCESS : EXIT_FAILURE;
|
return ok ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||||
@@ -400,7 +414,7 @@ do_value(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
do_shell_var(int argc, char **argv)
|
shell_var(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *p;
|
char *p;
|
||||||
@@ -421,106 +435,127 @@ do_shell_var(int argc, char **argv)
|
|||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
is_older_than(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (argc < 3)
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
/* This test is perverted - historically the baselayout function
|
||||||
|
* returns 0 on *failure*, which is plain wrong */
|
||||||
|
for (i = 2; i < argc; ++i)
|
||||||
|
if (!rc_newer_than(argv[1], argv[i], NULL, NULL))
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
is_newer_than(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (argc < 3)
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
/* This test is correct as it's not present in baselayout */
|
||||||
|
for (i = 2; i < argc; ++i)
|
||||||
|
if (!rc_newer_than(argv[1], argv[i], NULL, NULL))
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
is_runlevel_start(_unused int argc, _unused char **argv)
|
||||||
|
{
|
||||||
|
return rc_runlevel_starting() ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
is_runlevel_stop(_unused int argc, _unused char **argv)
|
||||||
|
{
|
||||||
|
return rc_runlevel_stopping() ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
rc_abort(_unused int argc, _unused char **argv)
|
||||||
|
{
|
||||||
|
const char *p = getenv("RC_PID");
|
||||||
|
int pid;
|
||||||
|
|
||||||
|
if (p && sscanf(p, "%d", &pid) == 1) {
|
||||||
|
if (kill(pid, SIGUSR1) != 0)
|
||||||
|
eerrorx("rc-abort: failed to signal parent %d: %s",
|
||||||
|
pid, strerror(errno));
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct {
|
||||||
|
const char * const name;
|
||||||
|
int (* const applet)(int argc, char **argv);
|
||||||
|
} applets[] = {
|
||||||
|
#define A(a) { #a, a }
|
||||||
|
A(fstabinfo),
|
||||||
|
A(mountinfo),
|
||||||
|
{ "rc-depend", rc_depend, },
|
||||||
|
{ "rc-service", rc_service, },
|
||||||
|
{ "rc-status", rc_status, },
|
||||||
|
{ "rc-update", rc_update, },
|
||||||
|
{ "update-rc", rc_update, },
|
||||||
|
A(runscript),
|
||||||
|
{ "start-stop-daemon", start_stop_daemon, },
|
||||||
|
A(checkpath),
|
||||||
|
A(swclock),
|
||||||
|
A(shell_var),
|
||||||
|
A(is_older_than),
|
||||||
|
A(is_newer_than),
|
||||||
|
A(is_runlevel_start),
|
||||||
|
A(is_runlevel_stop),
|
||||||
|
{ "rc-abort", rc_abort, },
|
||||||
|
/* These are purely for init scripts and do not make sense as
|
||||||
|
* anything else */
|
||||||
|
{ "service_get_value", do_value, },
|
||||||
|
{ "service_set_value", do_value, },
|
||||||
|
{ "get_options", do_value, },
|
||||||
|
{ "save_options", do_value, },
|
||||||
|
#undef A
|
||||||
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
run_applets(int argc, char **argv)
|
run_applets(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i = 2;
|
size_t i;
|
||||||
char *p;
|
|
||||||
pid_t pid = 0;
|
|
||||||
|
|
||||||
/* Bug 351712: We need an extra way to explicitly select an applet OTHER
|
/* Bug 351712: We need an extra way to explicitly select an applet OTHER
|
||||||
* than trusting argv[0], as argv[0] is not going to be the applet value if
|
* than trusting argv[0], as argv[0] is not going to be the applet value if
|
||||||
* we are doing SELinux context switching. For this, we allow calls such as
|
* we are doing SELinux context switching. For this, we allow calls such as
|
||||||
* 'rc --applet APPLET', and shift ALL of argv down by two array items. */
|
* 'rc --applet APPLET', and shift ALL of argv down by two array items. */
|
||||||
if (strcmp(applet, "rc") == 0 && argc >= 3 &&
|
if (strcmp(applet, "rc") == 0 && argc >= 3 &&
|
||||||
(strcmp(argv[1],"--applet") == 0 || strcmp(argv[1], "-a") == 0)) {
|
(strcmp(argv[1],"--applet") == 0 || strcmp(argv[1], "-a") == 0)) {
|
||||||
applet = argv[2];
|
applet = argv[2];
|
||||||
argv += 2;
|
argv += 2;
|
||||||
argc -= 2;
|
argc -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* These are designed to be applications in their own right */
|
for (i = 0; i < ARRAY_SIZE(applets); ++i)
|
||||||
if (strcmp(applet, "fstabinfo") == 0)
|
if (!strcmp(applet, applets[i].name))
|
||||||
exit(fstabinfo(argc, argv));
|
exit(applets[i].applet(argc, argv));
|
||||||
else if (strcmp(applet, "mountinfo") == 0)
|
|
||||||
exit(mountinfo(argc, argv));
|
|
||||||
else if (strcmp(applet, "rc-depend") == 0)
|
|
||||||
exit(rc_depend(argc, argv));
|
|
||||||
else if (strcmp(applet, "rc-service") == 0)
|
|
||||||
exit(rc_service(argc, argv));
|
|
||||||
else if (strcmp(applet, "rc-status") == 0)
|
|
||||||
exit(rc_status(argc, argv));
|
|
||||||
else if (strcmp(applet, "rc-update") == 0 ||
|
|
||||||
strcmp(applet, "update-rc") == 0)
|
|
||||||
exit(rc_update(argc, argv));
|
|
||||||
else if (strcmp(applet, "runscript") == 0)
|
|
||||||
exit(runscript(argc, argv));
|
|
||||||
else if (strcmp(applet, "start-stop-daemon") == 0)
|
|
||||||
exit(start_stop_daemon(argc, argv));
|
|
||||||
else if (strcmp (applet, "checkpath") == 0)
|
|
||||||
exit(checkpath(argc, argv));
|
|
||||||
else if (strcmp(applet, "swclock") == 0)
|
|
||||||
exit(swclock(argc, argv));
|
|
||||||
|
|
||||||
/* These could also be applications in their own right */
|
|
||||||
if (strcmp(applet, "shell_var") == 0)
|
|
||||||
exit(do_shell_var(argc, argv));
|
|
||||||
|
|
||||||
/* This test is perverted - historically the baselayout function
|
|
||||||
* returns 0 on *failure*, which is plain wrong */
|
|
||||||
if (strcmp(applet, "is_older_than") == 0) {
|
|
||||||
if (argc < 3)
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
while (i < argc) {
|
|
||||||
if (!rc_newer_than(argv[1], argv[i++], NULL, NULL))
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
};
|
|
||||||
/* This test is correct as it's not present in baselayout */
|
|
||||||
if (strcmp(applet, "is_newer_than") == 0) {
|
|
||||||
if (argc < 3)
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
while (i < argc) {
|
|
||||||
if (!rc_newer_than(argv[1], argv[i++], NULL, NULL))
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (applet[0] == 'e' || (applet[0] == 'v' && applet[1] == 'e'))
|
if (applet[0] == 'e' || (applet[0] == 'v' && applet[1] == 'e'))
|
||||||
exit(do_e(argc, argv));
|
exit(do_e(argc, argv));
|
||||||
|
|
||||||
/* These are purely for init scripts and do not make sense as
|
|
||||||
* anything else */
|
|
||||||
if (strcmp(applet, "service_get_value") == 0 ||
|
|
||||||
strcmp(applet, "service_set_value") == 0 ||
|
|
||||||
strcmp(applet, "get_options") == 0 ||
|
|
||||||
strcmp(applet, "save_options") == 0)
|
|
||||||
exit(do_value(argc, argv));
|
|
||||||
|
|
||||||
if (strncmp(applet, "service_", strlen("service_")) == 0)
|
if (strncmp(applet, "service_", strlen("service_")) == 0)
|
||||||
exit(do_service(argc, argv));
|
exit(do_service(argc, argv));
|
||||||
|
|
||||||
if (strncmp(applet, "mark_service_", strlen("mark_service_")) == 0)
|
if (strncmp(applet, "mark_service_", strlen("mark_service_")) == 0)
|
||||||
exit(do_mark_service(argc, argv));
|
exit(do_mark_service(argc, argv));
|
||||||
|
|
||||||
if (strcmp(applet, "is_runlevel_start") == 0)
|
|
||||||
exit(rc_runlevel_starting() ? 0 : 1);
|
|
||||||
else if (strcmp (applet, "is_runlevel_stop") == 0)
|
|
||||||
exit(rc_runlevel_stopping() ? 0 : 1);
|
|
||||||
|
|
||||||
if (strcmp(applet, "rc-abort") == 0) {
|
|
||||||
p = getenv("RC_PID");
|
|
||||||
if (p && sscanf(p, "%d", &pid) == 1) {
|
|
||||||
if (kill(pid, SIGUSR1) != 0)
|
|
||||||
eerrorx("rc-abort: failed to signal parent %d: %s",
|
|
||||||
pid, strerror(errno));
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(applet, "rc") != 0)
|
if (strcmp(applet, "rc") != 0)
|
||||||
eerrorx("%s: unknown applet", applet);
|
eerrorx("%s: unknown applet", applet);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -280,7 +280,7 @@ rc_logger_open(const char *level)
|
|||||||
* logfile or its basedir may be read-only during sysinit and
|
* logfile or its basedir may be read-only during sysinit and
|
||||||
* shutdown so skip the error in this case
|
* shutdown so skip the error in this case
|
||||||
*/
|
*/
|
||||||
if ((strcmp(level, RC_LEVEL_SHUTDOWN) != 0) && (strcmp(level, RC_LEVEL_SYSINIT) != 0)) {
|
if (errno != EROFS && ((strcmp(level, RC_LEVEL_SHUTDOWN) != 0) && (strcmp(level, RC_LEVEL_SYSINIT) != 0))) {
|
||||||
log_error = 1;
|
log_error = 1;
|
||||||
eerror("Error: fopen(%s) failed: %s", logfile, strerror(errno));
|
eerror("Error: fopen(%s) failed: %s", logfile, strerror(errno));
|
||||||
}
|
}
|
||||||
@@ -288,8 +288,9 @@ rc_logger_open(const char *level)
|
|||||||
|
|
||||||
/* Try to keep the temporary log in case of errors */
|
/* Try to keep the temporary log in case of errors */
|
||||||
if (!log_error) {
|
if (!log_error) {
|
||||||
if (unlink(TMPLOG) == -1)
|
if (errno != EROFS && ((strcmp(level, RC_LEVEL_SHUTDOWN) != 0) && (strcmp(level, RC_LEVEL_SYSINIT) != 0)))
|
||||||
eerror("Error: unlink(%s) failed: %s", TMPLOG, strerror(errno));
|
if (unlink(TMPLOG) == -1)
|
||||||
|
eerror("Error: unlink(%s) failed: %s", TMPLOG, strerror(errno));
|
||||||
} else if (exists(TMPLOG))
|
} else if (exists(TMPLOG))
|
||||||
eerrorx("Warning: temporary logfile left behind: %s", TMPLOG);
|
eerrorx("Warning: temporary logfile left behind: %s", TMPLOG);
|
||||||
|
|
||||||
|
|||||||
@@ -331,3 +331,12 @@ parse_mode(mode_t *mode, char *text)
|
|||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
is_writable(const char *path)
|
||||||
|
{
|
||||||
|
if (access(path, W_OK) == 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
88
src/rc/rc.c
88
src/rc/rc.c
@@ -167,52 +167,6 @@ cleanup(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
|
||||||
static char *
|
|
||||||
proc_getent(const char *ent)
|
|
||||||
{
|
|
||||||
FILE *fp;
|
|
||||||
char *proc, *p, *value = NULL;
|
|
||||||
size_t i, len;
|
|
||||||
|
|
||||||
if (!exists("/proc/cmdline"))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (!(fp = fopen("/proc/cmdline", "r"))) {
|
|
||||||
eerror("failed to open `/proc/cmdline': %s", strerror(errno));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
proc = NULL;
|
|
||||||
i = 0;
|
|
||||||
if (rc_getline(&proc, &i, fp) == -1 || proc == NULL)
|
|
||||||
eerror("rc_getline: %s", strerror(errno));
|
|
||||||
|
|
||||||
if (proc != NULL) {
|
|
||||||
len = strlen(ent);
|
|
||||||
|
|
||||||
while ((p = strsep(&proc, " "))) {
|
|
||||||
if (strncmp(ent, p, len) == 0 && (p[len] == '\0' || p[len] == ' ' || p[len] == '=')) {
|
|
||||||
p += len;
|
|
||||||
|
|
||||||
if (*p == '=')
|
|
||||||
p++;
|
|
||||||
|
|
||||||
value = xstrdup(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!value)
|
|
||||||
errno = ENOENT;
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
free(proc);
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static char
|
static char
|
||||||
read_key(bool block)
|
read_key(bool block)
|
||||||
{
|
{
|
||||||
@@ -352,15 +306,6 @@ open_shell(void)
|
|||||||
run_program(shell);
|
run_program(shell);
|
||||||
}
|
}
|
||||||
|
|
||||||
_dead static void
|
|
||||||
single_user(void)
|
|
||||||
{
|
|
||||||
rc_logger_close();
|
|
||||||
execl(SHUTDOWN, SHUTDOWN, "now", (char *) NULL);
|
|
||||||
eerrorx("%s: unable to exec `" SHUTDOWN "': %s",
|
|
||||||
applet, strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
set_krunlevel(const char *level)
|
set_krunlevel(const char *level)
|
||||||
{
|
{
|
||||||
@@ -388,11 +333,11 @@ set_krunlevel(const char *level)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static size_t
|
||||||
get_krunlevel(char *buffer, int buffer_len)
|
get_krunlevel(char *buffer, int buffer_len)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
int i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
if (!exists(RC_KRUNLEVEL))
|
if (!exists(RC_KRUNLEVEL))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -713,6 +658,7 @@ do_start_services(bool parallel)
|
|||||||
interactive = want_interactive();
|
interactive = want_interactive();
|
||||||
|
|
||||||
if (interactive) {
|
if (interactive) {
|
||||||
|
parallel = false;
|
||||||
interactive_retry:
|
interactive_retry:
|
||||||
printf("\n");
|
printf("\n");
|
||||||
einfo("About to start the service %s",
|
einfo("About to start the service %s",
|
||||||
@@ -847,6 +793,13 @@ main(int argc, char **argv)
|
|||||||
env_filter();
|
env_filter();
|
||||||
env_config();
|
env_config();
|
||||||
|
|
||||||
|
/* complain about old configuration settings if they exist */
|
||||||
|
if (exists(RC_CONF_OLD)) {
|
||||||
|
ewarn("%s still exists on your system and should be removed.",
|
||||||
|
RC_CONF_OLD);
|
||||||
|
ewarn("Please migrate to the appropriate settings in %s", RC_CONF);
|
||||||
|
}
|
||||||
|
|
||||||
argc++;
|
argc++;
|
||||||
argv--;
|
argv--;
|
||||||
while ((opt = getopt_long(argc, argv, getoptstring,
|
while ((opt = getopt_long(argc, argv, getoptstring,
|
||||||
@@ -880,16 +833,9 @@ main(int argc, char **argv)
|
|||||||
eerrorx("%s: %s", applet, strerror(errno));
|
eerrorx("%s: %s", applet, strerror(errno));
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
case 'S':
|
case 'S':
|
||||||
if (rc_conf_value("rc_sys")) {
|
bootlevel = rc_sys();
|
||||||
bootlevel = rc_sys_v2();
|
if (bootlevel)
|
||||||
if (bootlevel)
|
printf("%s\n", bootlevel);
|
||||||
printf("%s\n", bootlevel);
|
|
||||||
} else {
|
|
||||||
ewarn("WARNING: rc_sys not defined in rc.conf. Falling back to automatic detection");
|
|
||||||
bootlevel = rc_sys_v1();
|
|
||||||
if (bootlevel)
|
|
||||||
printf("%s\n", bootlevel);
|
|
||||||
}
|
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
case_RC_COMMON_GETOPT
|
case_RC_COMMON_GETOPT
|
||||||
@@ -969,9 +915,9 @@ main(int argc, char **argv)
|
|||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
if (strcmp(newlevel, RC_LEVEL_SYSINIT) == 0) {
|
if (strcmp(newlevel, RC_LEVEL_SYSINIT) == 0) {
|
||||||
/* If we requested a runlevel, save it now */
|
/* If we requested a runlevel, save it now */
|
||||||
p = proc_getent("rc_runlevel");
|
p = rc_proc_getent("rc_runlevel");
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
p = proc_getent("softlevel");
|
p = rc_proc_getent("softlevel");
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
set_krunlevel(p);
|
set_krunlevel(p);
|
||||||
free(p);
|
free(p);
|
||||||
@@ -1123,7 +1069,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
/* mark any services skipped as started */
|
/* mark any services skipped as started */
|
||||||
proc = p = proc_getent("noinit");
|
proc = p = rc_proc_getent("noinit");
|
||||||
if (proc) {
|
if (proc) {
|
||||||
while ((token = strsep(&p, ",")))
|
while ((token = strsep(&p, ",")))
|
||||||
rc_service_mark(token, RC_SERVICE_STARTED);
|
rc_service_mark(token, RC_SERVICE_STARTED);
|
||||||
@@ -1144,7 +1090,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
/* mark any services skipped as stopped */
|
/* mark any services skipped as stopped */
|
||||||
proc = p = proc_getent("noinit");
|
proc = p = rc_proc_getent("noinit");
|
||||||
if (proc) {
|
if (proc) {
|
||||||
while ((token = strsep(&p, ",")))
|
while ((token = strsep(&p, ",")))
|
||||||
rc_service_mark(token, RC_SERVICE_STOPPED);
|
rc_service_mark(token, RC_SERVICE_STOPPED);
|
||||||
|
|||||||
@@ -75,7 +75,7 @@
|
|||||||
#define WARN_TIMEOUT 10 /* warn about this every N seconds */
|
#define WARN_TIMEOUT 10 /* warn about this every N seconds */
|
||||||
|
|
||||||
static const char *applet;
|
static const char *applet;
|
||||||
static char *service, *runlevel, *ibsave, *prefix;;
|
static char *service, *runlevel, *ibsave, *prefix;
|
||||||
static RC_DEPTREE *deptree;
|
static RC_DEPTREE *deptree;
|
||||||
static RC_STRINGLIST *applet_list, *services, *tmplist;
|
static RC_STRINGLIST *applet_list, *services, *tmplist;
|
||||||
static RC_STRINGLIST *restart_services, *need_services, *use_services;
|
static RC_STRINGLIST *restart_services, *need_services, *use_services;
|
||||||
@@ -288,6 +288,13 @@ cleanup(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Buffer and lock all output messages so that we get readable content */
|
||||||
|
/* FIXME: Use a dynamic lock file that contains the tty/pts as well.
|
||||||
|
* For example openrc-pts8.lock or openrc-tty1.lock.
|
||||||
|
* Using a static lock file makes no sense, esp. in multi-user environments.
|
||||||
|
* Why don't we use (f)printf, as it is thread-safe through POSIX already?
|
||||||
|
* Bug: 360013
|
||||||
|
*/
|
||||||
static int
|
static int
|
||||||
write_prefix(const char *buffer, size_t bytes, bool *prefixed)
|
write_prefix(const char *buffer, size_t bytes, bool *prefixed)
|
||||||
{
|
{
|
||||||
@@ -297,14 +304,20 @@ write_prefix(const char *buffer, size_t bytes, bool *prefixed)
|
|||||||
ssize_t ret = 0;
|
ssize_t ret = 0;
|
||||||
int fd = fileno(stdout), lock_fd = -1;
|
int fd = fileno(stdout), lock_fd = -1;
|
||||||
|
|
||||||
/* Spin until we lock the prefix */
|
/*
|
||||||
for (;;) {
|
* Lock the prefix.
|
||||||
lock_fd = open(PREFIX_LOCK, O_WRONLY | O_CREAT, 0664);
|
* open() may fail here when running as user, as RC_SVCDIR may not be writable.
|
||||||
if (lock_fd != -1)
|
*/
|
||||||
if (flock(lock_fd, LOCK_EX) == 0)
|
lock_fd = open(PREFIX_LOCK, O_WRONLY | O_CREAT, 0664);
|
||||||
break;
|
|
||||||
close(lock_fd);
|
if (lock_fd != -1) {
|
||||||
|
if (flock(lock_fd, LOCK_EX) != 0)
|
||||||
|
eerror("flock() failed: %s", strerror(errno));
|
||||||
}
|
}
|
||||||
|
#ifdef RC_DEBUG
|
||||||
|
else
|
||||||
|
ewarn("Couldn't open the prefix lock, please make sure you have enough permissions");
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < bytes; i++) {
|
for (i = 0; i < bytes; i++) {
|
||||||
/* We don't prefix eend calls (cursor up) */
|
/* We don't prefix eend calls (cursor up) */
|
||||||
@@ -332,6 +345,7 @@ write_prefix(const char *buffer, size_t bytes, bool *prefixed)
|
|||||||
|
|
||||||
/* Release the lock */
|
/* Release the lock */
|
||||||
close(lock_fd);
|
close(lock_fd);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1079,12 +1093,13 @@ service_plugable(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#include "_usage.h"
|
#include "_usage.h"
|
||||||
#define getoptstring "dDsvl:Z" getoptstring_COMMON
|
#define getoptstring "dDsSvl:Z" getoptstring_COMMON
|
||||||
#define extraopts "stop | start | restart | describe | zap"
|
#define extraopts "stop | start | restart | describe | zap"
|
||||||
static const struct option longopts[] = {
|
static const struct option longopts[] = {
|
||||||
{ "debug", 0, NULL, 'd'},
|
{ "debug", 0, NULL, 'd'},
|
||||||
{ "dry-run", 0, NULL, 'Z'},
|
{ "dry-run", 0, NULL, 'Z'},
|
||||||
{ "ifstarted", 0, NULL, 's'},
|
{ "ifstarted", 0, NULL, 's'},
|
||||||
|
{ "ifstopped", 0, NULL, 'S'},
|
||||||
{ "nodeps", 0, NULL, 'D'},
|
{ "nodeps", 0, NULL, 'D'},
|
||||||
{ "lockfd", 1, NULL, 'l'},
|
{ "lockfd", 1, NULL, 'l'},
|
||||||
longopts_COMMON
|
longopts_COMMON
|
||||||
@@ -1093,6 +1108,7 @@ static const char *const longopts_help[] = {
|
|||||||
"set xtrace when running the script",
|
"set xtrace when running the script",
|
||||||
"show what would be done",
|
"show what would be done",
|
||||||
"only run commands when started",
|
"only run commands when started",
|
||||||
|
"only run commands when stopped",
|
||||||
"ignore dependencies",
|
"ignore dependencies",
|
||||||
"fd of the exclusive lock from rc",
|
"fd of the exclusive lock from rc",
|
||||||
longopts_help_COMMON
|
longopts_help_COMMON
|
||||||
@@ -1235,6 +1251,10 @@ runscript(int argc, char **argv)
|
|||||||
if (!(rc_service_state(service) & RC_SERVICE_STARTED))
|
if (!(rc_service_state(service) & RC_SERVICE_STARTED))
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
break;
|
break;
|
||||||
|
case 'S':
|
||||||
|
if (!(rc_service_state(service) & RC_SERVICE_STOPPED))
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
deps = false;
|
deps = false;
|
||||||
break;
|
break;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user