Compare commits
4 Commits
openrc-0.1
...
openrc-0.9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e4ce98b3b4 | ||
|
|
04e6696782 | ||
|
|
85193674da | ||
|
|
a73c26a70b |
11
Makefile
11
Makefile
@@ -4,12 +4,7 @@
|
|||||||
|
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
SUBDIR= conf.d etc init.d local.d man scripts sh src sysctl.d
|
SUBDIR= conf.d doc etc init.d local.d man net scripts sh src
|
||||||
|
|
||||||
# Build our old net foo or not
|
|
||||||
ifeq (${MKNET},oldnet)
|
|
||||||
SUBDIR+= net doc
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Build pkgconfig or not
|
# Build pkgconfig or not
|
||||||
MKPKGCONFIG?= yes
|
MKPKGCONFIG?= yes
|
||||||
@@ -30,10 +25,6 @@ include ${MK}/dist.mk
|
|||||||
include ${MK}/git.mk
|
include ${MK}/git.mk
|
||||||
|
|
||||||
_installafter:
|
_installafter:
|
||||||
ifeq (${MKPREFIX},yes)
|
|
||||||
${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/init.d
|
${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/init.d
|
||||||
else ifneq (${OS},Linux)
|
|
||||||
${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.11.1
|
VERSION= 0.9.8.3
|
||||||
PKG= ${NAME}-${VERSION}
|
PKG= ${NAME}-${VERSION}
|
||||||
|
|||||||
19
README
19
README
@@ -10,10 +10,9 @@ You may wish to tweak the installation with the below arguments
|
|||||||
PROGLDFLAGS=-static
|
PROGLDFLAGS=-static
|
||||||
LIBNAME=lib64
|
LIBNAME=lib64
|
||||||
DESTDIR=/tmp/openrc-image
|
DESTDIR=/tmp/openrc-image
|
||||||
MKNET=oldnet
|
|
||||||
MKPAM=pam
|
MKPAM=pam
|
||||||
MKPREFIX=yes
|
|
||||||
MKPKGCONFIG=no
|
MKPKGCONFIG=no
|
||||||
|
MKRCSYS=prefix
|
||||||
MKSELINUX=yes
|
MKSELINUX=yes
|
||||||
MKSTATICLIBS=no
|
MKSTATICLIBS=no
|
||||||
MKTERMCAP=ncurses
|
MKTERMCAP=ncurses
|
||||||
@@ -26,8 +25,6 @@ We don't support building a static OpenRC with PAM.
|
|||||||
You may need to use PROGLDFLAGS=-Wl,-Bstatic on glibc instead of just -static.
|
You may need to use PROGLDFLAGS=-Wl,-Bstatic on glibc instead of just -static.
|
||||||
If you debug memory under valgrind, add -DDEBUG_MEMORY to your CPPFLAGS
|
If you debug memory under valgrind, add -DDEBUG_MEMORY to your CPPFLAGS
|
||||||
so that all malloc memory should be freed at exit.
|
so that all malloc memory should be freed at exit.
|
||||||
If you are building OpenRC for a Gentoo Prefix installation, add
|
|
||||||
MKPREFIX=yes.
|
|
||||||
|
|
||||||
You can also brand OpenRC if you so wish like so
|
You can also brand OpenRC if you so wish like so
|
||||||
BRANDING=\"Gentoo/$(uname -s)\"
|
BRANDING=\"Gentoo/$(uname -s)\"
|
||||||
@@ -37,6 +34,20 @@ 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
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
The following applies only to the newnet stack, which is not presently
|
|
||||||
maintained in OpenRC. The oldnet stack is maintained instead.
|
|
||||||
- Robin H. Johnson <robbat2@gentoo.org>, 2011/02/21
|
|
||||||
|
|
||||||
OpenRC Network Ideals
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
The new style networking for OpenRC is very simplistic - provide a basic means
|
|
||||||
of configuring static interface address and routes whilst allowing the
|
|
||||||
possibility to run any command at any point.
|
|
||||||
|
|
||||||
In a nutshell, init.d/network is a wrapper around ifconfig(8) and
|
|
||||||
init.d/staticroute is wrapper around route(8).
|
|
||||||
|
|
||||||
In the Perfect World (TM) ifconfig should be able to configure everything
|
|
||||||
about the interface easily * . The BSD family almost get this right and Linux
|
|
||||||
epically fails.
|
|
||||||
|
|
||||||
* Only static configuration, including link setup.
|
|
||||||
For dynamic, static, IPv4LL, arping and per ssid IPv4 setup dhcpcd-5.x
|
|
||||||
provides your needs.
|
|
||||||
|
|
||||||
It fails because there are many tools to do the same job and often have
|
|
||||||
vastly different syntax where they could be similar. In other words, there
|
|
||||||
is no coherence.
|
|
||||||
|
|
||||||
OpenRC-0.4.x and older (inc Gentoo baselayout-1) had a collection of scripts
|
|
||||||
for each tool and allowed a script per interface. Over the years, this design
|
|
||||||
has proven very hard to maintain as each user has their own idea of how
|
|
||||||
things should work. Also, there were (and still are) race conditions.
|
|
||||||
|
|
||||||
So where do we go from here?
|
|
||||||
Well, it's possible to use the new network scripts using the tools
|
|
||||||
currently available. It's just harder as you have to know them and their
|
|
||||||
documentation can be lacking at times.
|
|
||||||
The correct end goal is a BSD style ifconfig tool.
|
|
||||||
I've started work on it, but the project has stalled somewhat.
|
|
||||||
It's display only right now and the source is not yet publicly available.
|
|
||||||
If you have the skills and share the vision then contact me privately and
|
|
||||||
we'll take it from there.
|
|
||||||
16
TODO
16
TODO
@@ -1,21 +1,7 @@
|
|||||||
- ensure all forks block, restore and unblock signals. needs review
|
- ensure all forks block, restore and unblock signals. needs review
|
||||||
|
|
||||||
- add support somehow for optional translations
|
- add support somehow for optional translations
|
||||||
|
|
||||||
- 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,11 +1,9 @@
|
|||||||
DIR= ${CONFDIR}
|
DIR= ${CONFDIR}
|
||||||
CONF= bootmisc fsck hostname localmount urandom tmpfilesd ${CONF-${OS}}
|
CONF= bootmisc fsck hostname localmount network staticroute urandom \
|
||||||
|
${CONF-${OS}}
|
||||||
|
|
||||||
ifeq (${MKNET},)
|
|
||||||
CONF+= network staticroute
|
|
||||||
TARGETS+= network staticroute
|
TARGETS+= network staticroute
|
||||||
CLEANFILES+= network staticroute
|
CLEANFILES+= network staticroute
|
||||||
endif
|
|
||||||
|
|
||||||
MK= ../mk
|
MK= ../mk
|
||||||
include ${MK}/os.mk
|
include ${MK}/os.mk
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# Set CLOCK to "UTC" if your system clock is set to UTC (also known as
|
# Set CLOCK to "UTC" if your system clock is set to UTC (also known as
|
||||||
# Greenwich Mean Time). If your clock is set to the local time, then
|
# Greenwich Mean Time). If your clock is set to the local time, then
|
||||||
# set CLOCK to "local". Note that if you dual boot with Windows, then
|
# set CLOCK to "local". Note that if you dual boot with Windows, then
|
||||||
# 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 to set the Hardware Clock to the current System Time
|
||||||
# during shutdown, then say "YES" here.
|
# during shutdown, then say "YES" here.
|
||||||
# You normally don't need to do this if you run a ntp daemon.
|
# You normally don't need to do this if you run a ntp daemon.
|
||||||
clock_systohc="NO"
|
clock_systohc="NO"
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
# 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
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
# Sets the level at which logging of messages is done to the
|
# Sets the level at which logging of messages is done to the
|
||||||
# console. See dmesg(1) for more info.
|
# console. See dmesg(8) for more info.
|
||||||
dmesg_level="1"
|
dmesg_level="1"
|
||||||
|
|||||||
@@ -1,20 +1,22 @@
|
|||||||
# Set CLOCK to "UTC" if your Hardware Clock is set to UTC (also known as
|
# Set CLOCK to "UTC" if your Hardware Clock is set to UTC (also known as
|
||||||
# Greenwich Mean Time). If that clock is set to the local time, then
|
# Greenwich Mean Time). If that clock is set to the local time, then
|
||||||
# set CLOCK to "local". Note that if you dual boot with Windows, then
|
# set CLOCK to "local". Note that if you dual boot with Windows, then
|
||||||
# you should set it to "local".
|
# you should set it to "local".
|
||||||
clock="UTC"
|
clock="UTC"
|
||||||
|
|
||||||
# If you want the hwclock script to set the system time (software clock)
|
# If you want to set the Hardware Clock to the current System Time
|
||||||
# to match the current hardware clock during bootup, leave this
|
# (software clock) during shutdown, then say "YES" here.
|
||||||
# commented out.
|
# You normally don't need to do this if you run a ntp daemon.
|
||||||
# However, you can set this to "NO" ifyou are running a modern kernel
|
clock_systohc="NO"
|
||||||
# with CONFIG_RTC_HCTOSYS set to y and your hardware clock set to UTC.
|
|
||||||
#clock_hctosys="YES"
|
|
||||||
|
|
||||||
# If you do not want to set the hardware clock to the current system
|
|
||||||
# time (software clock) during shutdown, set this to no.
|
|
||||||
#clock_systohc="YES"
|
|
||||||
|
|
||||||
|
# If you want to set the system time to the current hardware clock
|
||||||
|
# during bootup, then say "YES" here. You do not need this if you are
|
||||||
|
# running a modern kernel with CONFIG_RTC_HCTOSYS set to y.
|
||||||
|
# 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.
|
||||||
clock_args=""
|
clock_args=""
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ windowkeys="NO"
|
|||||||
extended_keymaps=""
|
extended_keymaps=""
|
||||||
#extended_keymaps="backspace keypad euro2"
|
#extended_keymaps="backspace keypad euro2"
|
||||||
|
|
||||||
# Tell dumpkeys(1) to interpret character action codes to be
|
# Tell dumpkeys(1) to interpret character action codes to be
|
||||||
# from the specified character set.
|
# from the specified character set.
|
||||||
# This only matters if you set unicode="yes" in /etc/rc.conf.
|
# This only matters if you set unicode="yes" in /etc/rc.conf.
|
||||||
# For a list of valid sets, run `dumpkeys --help`
|
# For a list of valid sets, run `dumpkeys --help`
|
||||||
|
|||||||
@@ -11,6 +11,6 @@
|
|||||||
|
|
||||||
# You can also multiplex the init script for each device like so
|
# You can also multiplex the init script for each device like so
|
||||||
# ln -s moused /etc/init.d/moused.ums0
|
# ln -s moused /etc/init.d/moused.ums0
|
||||||
# This enables you to have a config file per mouse (forces moused_device
|
# This enables you to have a config file per mouse (forces moused_device
|
||||||
# to ums0 in this case) and control each mouse.
|
# to ums0 in this case) and control each mouse.
|
||||||
# devd can also start and stop these mice, which laptop users will find handy.
|
# devd can also start and stop these mice, which laptop users will find handy.
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
# Extra options for tmpfiles.sh
|
|
||||||
#tmpfiles_opts="--verbose"
|
|
||||||
tmpfiles_opts=""
|
|
||||||
@@ -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="!iproute2"
|
#modules="ifconfig"
|
||||||
|
|
||||||
# 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="!iproute2"
|
#modules="ifconfig"
|
||||||
|
|
||||||
# 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)
|
||||||
@@ -552,34 +552,26 @@
|
|||||||
# You can also configure the VLAN - see for ip man page for more details
|
# You can also configure the VLAN - see for ip man page for more details
|
||||||
# To change the vlan interface name. If not set, the standard "iface.vlanid"
|
# To change the vlan interface name. If not set, the standard "iface.vlanid"
|
||||||
# will be used. This is the replacement for the old 'vconfig set_name_type'
|
# will be used. This is the replacement for the old 'vconfig set_name_type'
|
||||||
# functionality. If you previously relied on the DEV_PLUS_VID or
|
# functionality.
|
||||||
# DEV_PLUS_VID_NO_PAD options to have different VLANs with same ID value, on
|
|
||||||
# different interfaces, please note that you need to use both the interface and
|
|
||||||
# vlan number in the numbering. This applies for all of the options: name,
|
|
||||||
# txqueuelen, mac, broadcast, mtu, ingress, egress, flags
|
|
||||||
#vlan1_name="vlan1"
|
#vlan1_name="vlan1"
|
||||||
#eth0_vlan2_name="eth0.2"
|
#vlan2_name="eth0.2"
|
||||||
#eth1_vlan2_name="eth1.2"
|
|
||||||
|
|
||||||
# The following shows the old set_name_type setting and what new option to set:
|
# The following shows the old set_name_type setting and what new option to set:
|
||||||
# Using eth9 & VLAN VID 26 as an example.
|
# Using eth9 & VLAN VID 26 as an example.
|
||||||
# VLAN_PLUS_VID vlan26_name="vlan0026"
|
# VLAN_PLUS_VID vlan26_name="vlan0026"
|
||||||
# VLAN_PLUS_VID_NO_PAD vlan26_name="vlan26"
|
# VLAN_PLUS_VID_NO_PAD vlan26_name="vlan26"
|
||||||
# DEV_PLUS_VID eth9_vlan26_name="eth9.0026"
|
# DEV_PLUS_VID vlan26_name="eth9.0026"
|
||||||
# DEV_PLUS_VID_NO_PAD eth9_vlan26_name="eth9.26"
|
# DEV_PLUS_VID_NO_PAD vlan26_name="eth9.26"
|
||||||
|
|
||||||
# Set the vlan flags
|
# Set the vlan flags
|
||||||
#vlan1_flags="reorder_hdr off gvrp on loose_binding on"
|
#vlan1_flags="reorder_hdr off gvrp on loose_binding on"
|
||||||
#eth0_vlan1_flags="reorder_hdr off gvrp on loose_binding on"
|
|
||||||
|
|
||||||
# Configure in/egress maps
|
# Configure in/egress maps
|
||||||
#vlan1_ingress="2:6 3:5"
|
#vlan1_ingress="2:6 3:5"
|
||||||
#eth0_vlan1_egress="1:2"
|
#vlan1_egress="1:2"
|
||||||
|
|
||||||
#config_vlan1="172.16.2.1/24"
|
#config_vlan1="172.16.3.1/23"
|
||||||
#config_vlan2="172.16.3.1/24"
|
#config_vlan2="172.16.2.1/23"
|
||||||
#config_eth0_1="172.16.4.1/24"
|
|
||||||
#config_eth1_1="172.16.5.1/24"
|
|
||||||
|
|
||||||
# NOTE: Vlans can be configured with a . in their interface names
|
# NOTE: Vlans can be configured with a . in their interface names
|
||||||
# When configuring vlans with this name type, you need to replace . with a _
|
# When configuring vlans with this name type, you need to replace . with a _
|
||||||
@@ -594,15 +586,10 @@
|
|||||||
#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_net_vlan1_need="net.eth0"
|
# rc_need_vlan1="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'
|
||||||
@@ -624,39 +611,15 @@
|
|||||||
#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
|
||||||
|
|
||||||
# Please note, that you should generally NOT try to change the MAC addresses of
|
# You can also configure the bond here, which must be done via sysfs on 2.6
|
||||||
# a bond interface yourself. If you do so, the kernel and your network switches
|
# kernels or newer. See the kernel bonding documentation for a description of
|
||||||
# may not work quite right. It is permissible to set the MAC addresses of bond
|
# these options.
|
||||||
# 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_net_bond0_need="net.eth0 net.eth1"
|
#rc_need_bond0="net.eth0 net.eth1"
|
||||||
|
|
||||||
# Bonding subsume support (prevents crashes for root-on-NFS)
|
|
||||||
# - Only tested in the default bonding mode ('active-backup') with
|
|
||||||
# IPv4
|
|
||||||
# - Only subsumes basic interface characteristics (IP, netmask) and
|
|
||||||
# excludes additional routes, interface properties such as MTU,
|
|
||||||
# interface-associated netfilter rules, etc.
|
|
||||||
# In the example below, the (usually kernel-autoconfigured)
|
|
||||||
# 'eth0' interface is a member of bond0, which subsumes the
|
|
||||||
# existing interface configuration without upsetting NFS.
|
|
||||||
#slaves_bond0="eth0 eth1"
|
|
||||||
#subsume_bond0="eth0"
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# Classical IP over ATM
|
# Classical IP over ATM
|
||||||
@@ -772,7 +735,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_net_ppp0_need="net.nas0"
|
#rc_need_ppp0="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
|
||||||
@@ -812,8 +775,6 @@
|
|||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# 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"
|
||||||
|
|
||||||
@@ -886,7 +847,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_net_br0_need="net.eth0 net.eth1"
|
#rc_need_br0="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
|
||||||
@@ -937,7 +898,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_net_6to4_need="net.eth0"
|
#rc_need_6to4="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,5 +24,14 @@ 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} $^ > $@
|
||||||
|
|||||||
@@ -5,9 +5,10 @@
|
|||||||
# "" - nothing special
|
# "" - nothing special
|
||||||
# "jail" - FreeBSD jails
|
# "jail" - FreeBSD jails
|
||||||
# "prefix" - Prefix
|
# "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="@RC_SYS_DEFAULT@"
|
||||||
|
|
||||||
|
|||||||
@@ -10,20 +10,14 @@
|
|||||||
# "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 used.
|
# If this is commented out, automatic detection will be attempted.
|
||||||
|
# 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="@RC_SYS_DEFAULT@"
|
||||||
|
|
||||||
# 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 ...)
|
||||||
rc_tty_number=12
|
rc_tty_number=12
|
||||||
|
|
||||||
# If you have cgroups turned on in your kernel, this switch controls
|
|
||||||
# whether or not a group for each controler is mounted under
|
|
||||||
# /sys/fs/cgroup.
|
|
||||||
# Support for process management by cgroups is planned in the future,
|
|
||||||
# so if you turn this off, be aware that you may not be able to use that
|
|
||||||
# feature.
|
|
||||||
#rc_controller_cgroups="YES"
|
|
||||||
|
|||||||
@@ -6,9 +6,10 @@
|
|||||||
# "prefix" - Prefix
|
# "prefix" - Prefix
|
||||||
# "xen0" - Xen0 Domain
|
# "xen0" - Xen0 Domain
|
||||||
# "xenU" - XenU Domain
|
# "xenU" - XenU Domain
|
||||||
# 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="@RC_SYS_DEFAULT@"
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,8 @@
|
|||||||
# 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 is automatically disabled if rc_parallel is
|
# this feature.
|
||||||
# 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.
|
||||||
|
|||||||
3
init.d/.gitignore
vendored
3
init.d/.gitignore
vendored
@@ -11,7 +11,6 @@ network
|
|||||||
root
|
root
|
||||||
savecache
|
savecache
|
||||||
swap
|
swap
|
||||||
swapfiles
|
|
||||||
sysctl
|
sysctl
|
||||||
urandom
|
urandom
|
||||||
devfs
|
devfs
|
||||||
@@ -41,5 +40,3 @@ syslogd
|
|||||||
termencoding
|
termencoding
|
||||||
ttys
|
ttys
|
||||||
wscons
|
wscons
|
||||||
tmpfilesd.boot
|
|
||||||
tmpfilesd.sysinit
|
|
||||||
|
|||||||
@@ -1,19 +1,12 @@
|
|||||||
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 \
|
||||||
root.in savecache.in swap.in swapfiles.in \
|
network.in root.in savecache.in staticroute.in swap.in swclock.in \
|
||||||
tmpfilesd.boot.in tmpfilesd.sysinit.in \
|
sysctl.in urandom.in ${SRCS-${OS}}
|
||||||
swclock.in sysctl.in urandom.in ${SRCS-${OS}}
|
|
||||||
BIN= ${OBJS}
|
BIN= ${OBJS}
|
||||||
|
|
||||||
# Build our old net foo or not
|
|
||||||
ifeq (${MKNET},)
|
|
||||||
SRCS+= network.in staticroute.in
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq (${MKNET},oldnet)
|
|
||||||
INSTALLAFTER= _installafter_net.lo
|
INSTALLAFTER= _installafter_net.lo
|
||||||
SRCS+= net.lo.in
|
CLEANFILES+= net.lo
|
||||||
endif
|
TARGETS+= net.lo
|
||||||
|
|
||||||
MK= ../mk
|
MK= ../mk
|
||||||
include ${MK}/os.mk
|
include ${MK}/os.mk
|
||||||
@@ -23,8 +16,8 @@ NET_LO-FreeBSD= net.lo0
|
|||||||
SRCS-FreeBSD= hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \
|
SRCS-FreeBSD= hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \
|
||||||
rpcbind.in savecore.in syslogd.in
|
rpcbind.in savecore.in syslogd.in
|
||||||
# These are FreeBSD specific
|
# These are FreeBSD specific
|
||||||
SRCS-FreeBSD+= adjkerntz.in devd.in dumpon.in encswap.in ipfw.in \
|
SRCS-FreeBSD+= adjkerntz.in devd.in dumpon.in ipfw.in mixer.in nscd.in \
|
||||||
mixer.in nscd.in powerd.in syscons.in
|
powerd.in syscons.in
|
||||||
|
|
||||||
NET_LO-Linux= net.lo
|
NET_LO-Linux= net.lo
|
||||||
SRCS-Linux= devfs.in dmesg.in hwclock.in consolefont.in keymaps.in \
|
SRCS-Linux= devfs.in dmesg.in hwclock.in consolefont.in keymaps.in \
|
||||||
|
|||||||
@@ -10,6 +10,11 @@ depend()
|
|||||||
keyword -prefix -timeout
|
keyword -prefix -timeout
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dir_writable()
|
||||||
|
{
|
||||||
|
mkdir "$1"/.test.$$ 2>/dev/null && rmdir "$1"/.test.$$
|
||||||
|
}
|
||||||
|
|
||||||
: ${wipe_tmp:=${WIPE_TMP:-yes}}
|
: ${wipe_tmp:=${WIPE_TMP:-yes}}
|
||||||
: ${log_dmesg:=${LOG_DMESG:-yes}}
|
: ${log_dmesg:=${LOG_DMESG:-yes}}
|
||||||
|
|
||||||
@@ -20,7 +25,7 @@ cleanup_tmp_dir()
|
|||||||
if ! [ -d "$dir" ]; then
|
if ! [ -d "$dir" ]; then
|
||||||
mkdir -p "$dir" || return $?
|
mkdir -p "$dir" || return $?
|
||||||
fi
|
fi
|
||||||
checkpath -W "$dir" || return 1
|
dir_writable "$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
|
||||||
@@ -112,12 +117,12 @@ start()
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ "$RC_UNAME" = Linux -a -d /run ]; then
|
if [ "$RC_UNAME" = Linux -a -d /run ] && false; then
|
||||||
migrate_to_run /var/lock /run/lock
|
migrate_to_run /var/lock /run/lock
|
||||||
migrate_to_run /var/run /run
|
migrate_to_run /var/run /run
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if checkpath -W /var/run; then
|
if dir_writable /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
|
||||||
@@ -159,7 +164,7 @@ start()
|
|||||||
cleanup_tmp_dir "$tmp"
|
cleanup_tmp_dir "$tmp"
|
||||||
done
|
done
|
||||||
|
|
||||||
if checkpath -W /tmp; then
|
if dir_writable /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
|
||||||
@@ -172,7 +177,7 @@ start()
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if yesno $log_dmesg; then
|
if yesno $log_dmesg; then
|
||||||
if $logw || checkpath -W /var/log; then
|
if $logw || dir_writable /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
|
||||||
@@ -181,6 +186,7 @@ start()
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
[ -w /etc/nologin ] && rm -f /etc/nologin
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,5 +202,3 @@ stop()
|
|||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# vim: ft=sh
|
|
||||||
|
|||||||
@@ -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 ] && checkpath -W "$RC_LIBEXECDIR"; then
|
if [ $retval -eq 0 -a -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
|
||||||
:
|
:
|
||||||
|
|||||||
@@ -5,8 +5,7 @@
|
|||||||
description="Mount system critical filesystems in /dev."
|
description="Mount system critical filesystems in /dev."
|
||||||
|
|
||||||
depend() {
|
depend() {
|
||||||
use dev-mount
|
use dev
|
||||||
before dev
|
|
||||||
keyword -prefix -vserver
|
keyword -prefix -vserver
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ description="Set the dmesg level for a cleaner boot"
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
before dev modules
|
before dev modules
|
||||||
keyword -lxc -prefix -vserver
|
keyword -vserver
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
#!@PREFIX@/sbin/runscript
|
|
||||||
# Copyright 1992-2012 FreeBSD Project
|
|
||||||
# Released under the 2-clause BSD license
|
|
||||||
|
|
||||||
depend() {
|
|
||||||
before swap
|
|
||||||
}
|
|
||||||
|
|
||||||
start() {
|
|
||||||
while read device mountpoint type options rest ; do
|
|
||||||
case ":${device}:${type}:${options}" in
|
|
||||||
:#*)
|
|
||||||
;;
|
|
||||||
*.bde:swap:sw)
|
|
||||||
passphrase=$(dd if=/dev/random count=1 2>/dev/null | md5 -q)
|
|
||||||
device="${device%.bde}"
|
|
||||||
gbde init "${device}" -P "${passphrase}" || return 1
|
|
||||||
gbde attach "${device}" -p "${passphrase}" || return 1
|
|
||||||
;;
|
|
||||||
*.eli:swap:sw)
|
|
||||||
device="${device%.eli}"
|
|
||||||
geli onetime ${geli_swap_flags} "${device}" || return 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done < /etc/fstab
|
|
||||||
}
|
|
||||||
|
|
||||||
stop() {
|
|
||||||
while read device mountpoint type options rest ; do
|
|
||||||
case ":${device}:${type}:${options}" in
|
|
||||||
:#*)
|
|
||||||
;;
|
|
||||||
*.bde:swap:sw)
|
|
||||||
device="${device%.bde}"
|
|
||||||
gbde detach "${device}"
|
|
||||||
;;
|
|
||||||
*.eli:swap:sw)
|
|
||||||
# Nothing here, because geli swap devices should be
|
|
||||||
# created with the auto-detach-on-last-close option.
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done < /etc/fstab
|
|
||||||
}
|
|
||||||
@@ -71,12 +71,7 @@ start()
|
|||||||
done
|
done
|
||||||
|
|
||||||
if [ "$RC_UNAME" = Linux ]; then
|
if [ "$RC_UNAME" = Linux ]; then
|
||||||
local skiptypes x
|
fsck_opts="$fsck_opts -C0 -T"
|
||||||
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
|
||||||
|
|||||||
@@ -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:-YES}; then
|
if yesno $clock_hctosys; 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:-YES} || return 0
|
yesno $clock_systohc || return 0
|
||||||
|
|
||||||
local retval=0 errstr=""
|
local retval=0 errstr=""
|
||||||
setupopts
|
setupopts
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ start()
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Save the keymapping for use immediately at boot
|
# Save the keymapping for use immediately at boot
|
||||||
if checkpath -W "$RC_LIBEXECDIR"; then
|
if [ -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
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ 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
|
||||||
@@ -48,7 +47,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/.*|/usr"
|
no_umounts_r="$no_umounts_r|/proc|/proc/.*|/run|/sys|/sys/.*"
|
||||||
fi
|
fi
|
||||||
no_umounts_r="^($no_umounts_r)$"
|
no_umounts_r="^($no_umounts_r)$"
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,11 @@ description="Re-mount filesytems read-only for a clean reboot."
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need killprocs savecache
|
need killprocs savecache
|
||||||
keyword -openvz -prefix -vserver -lxc
|
keyword -prefix -openvz -vserver -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
{
|
{
|
||||||
local ret=0
|
|
||||||
|
|
||||||
# Flush all pending disk writes now
|
# Flush all pending disk writes now
|
||||||
sync; sync
|
sync; sync
|
||||||
|
|
||||||
@@ -25,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/.*|/run|${rc_svcdir}" x= fs=
|
local m="/dev|/dev/.*|/proc|/proc.*|/sys|/sys/.*|${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:"
|
||||||
@@ -41,9 +39,6 @@ start()
|
|||||||
do_unmount "umount -r" \
|
do_unmount "umount -r" \
|
||||||
--skip-point-regex "$m" \
|
--skip-point-regex "$m" \
|
||||||
"${fs:+--skip-fstype-regex}" $fs --nonetdev
|
"${fs:+--skip-fstype-regex}" $fs --nonetdev
|
||||||
ret=$?
|
|
||||||
|
|
||||||
eoutdent
|
eoutdent
|
||||||
|
eend $?
|
||||||
eend $ret
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,18 +19,13 @@ depend()
|
|||||||
local IFVAR=$(shell_var "${IFACE}")
|
local IFVAR=$(shell_var "${IFACE}")
|
||||||
|
|
||||||
need localmount
|
need localmount
|
||||||
if [ "$RC_UNAME" = Linux -a "$IFACE" != lo ]; then
|
|
||||||
need sysfs
|
|
||||||
fi
|
|
||||||
after bootmisc
|
after bootmisc
|
||||||
keyword -jail -prefix -vserver
|
provide net
|
||||||
|
keyword -shutdown -jail -prefix -vserver
|
||||||
|
|
||||||
case "${IFACE}" in
|
case "${IFACE}" in
|
||||||
lo|lo0) ;;
|
lo|lo0);;
|
||||||
*)
|
*) 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
|
||||||
@@ -42,8 +37,6 @@ 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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,27 +2,62 @@
|
|||||||
# 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.
|
||||||
|
|
||||||
description="Mounts network shares, other than NFS, according to /etc/fstab."
|
description="Mounts network shares according to /etc/fstab."
|
||||||
# We skip all NFS shares in this script because they require extra
|
|
||||||
# daemons to be running on the client in order to work correctly.
|
need_portmap()
|
||||||
# It is best to allow nfs-utils to handle all nfs shares.
|
{
|
||||||
|
local opts=
|
||||||
|
local IFS="
|
||||||
|
"
|
||||||
|
set -- $(fstabinfo --options --fstype nfs,nfs4)
|
||||||
|
for opts; do
|
||||||
|
case ,$opts, in
|
||||||
|
*,noauto,*|*,nolock,*);;
|
||||||
|
*) return 0;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
|
# Only have portmap as a dependency if there is a nfs mount in fstab
|
||||||
|
# that is set to mount at boot
|
||||||
|
local pmap=
|
||||||
|
if need_portmap; then
|
||||||
|
pmap="rpc.statd"
|
||||||
|
[ -x @SYSCONFDIR@/init.d/rpcbind ] \
|
||||||
|
&& pmap="$pmap rpcbind" \
|
||||||
|
|| pmap="$pmap portmap"
|
||||||
|
fi
|
||||||
|
|
||||||
config /etc/fstab
|
config /etc/fstab
|
||||||
need net
|
need net $pmap
|
||||||
use afc-client amd autofs openvpn
|
use afc-client amd autofs openvpn
|
||||||
use dns
|
use dns nfs nfsmount portmap rpcbind rpc.statd rpc.lockd
|
||||||
keyword -jail -prefix -vserver
|
keyword -jail -prefix -vserver
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
{
|
{
|
||||||
|
local myneed= myuse= pmap="portmap" nfsmounts=
|
||||||
|
[ -x @SYSCONFDIR@/init.d/rpcbind ] && pmap="rpcbind"
|
||||||
|
|
||||||
local x= fs= rc=
|
local x= fs= rc=
|
||||||
for x in $net_fs_list $extra_net_fs_list; do
|
for x in $net_fs_list $extra_net_fs_list; do
|
||||||
case "$x" in
|
case "$x" in
|
||||||
nfs|nfs4)
|
nfs|nfs4)
|
||||||
continue
|
# If the nfsmount script took care of the nfs
|
||||||
|
# filesystems, then there's no point in trying
|
||||||
|
# them twice
|
||||||
|
service_started nfsmount && continue
|
||||||
|
|
||||||
|
# Only try to mount NFS filesystems if portmap was
|
||||||
|
# started. This is to fix "hang" problems for new
|
||||||
|
# users who do not add portmap to the default runlevel.
|
||||||
|
if need_portmap && ! service_started "$pmap"; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fs="$fs${fs:+,}$x"
|
fs="$fs${fs:+,}$x"
|
||||||
@@ -47,14 +82,7 @@ stop()
|
|||||||
. "$RC_LIBEXECDIR"/sh/rc-mount.sh
|
. "$RC_LIBEXECDIR"/sh/rc-mount.sh
|
||||||
|
|
||||||
for x in $net_fs_list $extra_net_fs_list; do
|
for x in $net_fs_list $extra_net_fs_list; do
|
||||||
case "$x" in
|
fs="$fs${fs:+,}$x"
|
||||||
nfs|nfs4)
|
|
||||||
continue
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
fs="$fs${fs:+,}$x"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
done
|
||||||
if [ -n "$fs" ]; then
|
if [ -n "$fs" ]; then
|
||||||
umount -at $fs || eerror "Failed to simply unmount filesystems"
|
umount -at $fs || eerror "Failed to simply unmount filesystems"
|
||||||
@@ -63,14 +91,7 @@ stop()
|
|||||||
eindent
|
eindent
|
||||||
fs=
|
fs=
|
||||||
for x in $net_fs_list $extra_net_fs_list; do
|
for x in $net_fs_list $extra_net_fs_list; do
|
||||||
case "$x" in
|
fs="$fs${fs:+|}$x"
|
||||||
nfs|nfs4)
|
|
||||||
continue
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
fs="$fs${fs:+|}$x"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
done
|
||||||
[ -n "$fs" ] && fs="^($fs)$"
|
[ -n "$fs" ] && fs="^($fs)$"
|
||||||
do_unmount umount ${fs:+--fstype-regex} $fs --netdev
|
do_unmount umount ${fs:+--fstype-regex} $fs --netdev
|
||||||
|
|||||||
@@ -12,9 +12,7 @@ depend()
|
|||||||
{
|
{
|
||||||
need localmount
|
need localmount
|
||||||
after bootmisc
|
after bootmisc
|
||||||
if [ -n "$(interfaces)" ]; then
|
provide net
|
||||||
provide net
|
|
||||||
fi
|
|
||||||
keyword -jail -prefix -vserver
|
keyword -jail -prefix -vserver
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,6 +219,12 @@ start()
|
|||||||
eend $?
|
eend $?
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
ewarn
|
||||||
|
ewarn "The $RC_SVCNAME script is deprecated and will be"
|
||||||
|
ewarn "removed in the future."
|
||||||
|
ewarn "Please use the net.* scripts to manage your network interfaces."
|
||||||
|
ewarn
|
||||||
|
|
||||||
einfo "Starting network"
|
einfo "Starting network"
|
||||||
routeflush
|
routeflush
|
||||||
if [ "$RC_UNAME" = "Linux" ]; then
|
if [ "$RC_UNAME" = "Linux" ]; then
|
||||||
|
|||||||
@@ -20,29 +20,6 @@ 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'.
|
||||||
@@ -60,6 +37,27 @@ 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
|
||||||
|
|||||||
@@ -13,41 +13,20 @@ depend()
|
|||||||
start()
|
start()
|
||||||
{
|
{
|
||||||
case ",$(fstabinfo -o /)," in
|
case ",$(fstabinfo -o /)," in
|
||||||
*,ro,*)
|
*,ro,*) return 0;;
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# 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
|
||||||
|
|
||||||
ebegin "Remounting filesystems"
|
if echo 2>/dev/null >/.test.$$; then
|
||||||
local mountpoint
|
rm -f /.test.$$ /fastboot /forcefsck
|
||||||
for mountpoint in $(fstabinfo); do
|
return 0
|
||||||
case "${mountpoint}" in
|
fi
|
||||||
/)
|
|
||||||
;;
|
ebegin "Remounting root filesystem read/write"
|
||||||
/*)
|
case "$RC_UNAME" in
|
||||||
mountinfo -q "${mountpoint}" && \
|
Linux) mount -n -o remount,rw /;;
|
||||||
fstabinfo --remount "${mountpoint}"
|
*) mount -u -o rw /;;
|
||||||
;;
|
esac
|
||||||
esac
|
if eend $? "Root filesystem could not be mounted read/write"; then
|
||||||
done
|
rm -f /fastboot /forcefsck
|
||||||
eend 0
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,14 +13,6 @@ start()
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if ! checkpath -W "$RC_LIBEXECDIR"; then
|
|
||||||
ewarn "WARNING: ${RC_LIBEXECDIR} is not writable!"
|
|
||||||
if ! yesno "${RC_GOINGDOWN}"; then
|
|
||||||
ewarn "Unable to save deptree cache"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
ebegin "Saving dependency cache"
|
ebegin "Saving dependency cache"
|
||||||
local rc=
|
local rc=
|
||||||
if [ ! -d "$RC_LIBEXECDIR"/cache ]; then
|
if [ ! -d "$RC_LIBEXECDIR"/cache ]; then
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ description="Saves a kernel dump."
|
|||||||
|
|
||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need dumpon localmount
|
need localmount
|
||||||
before encswap
|
|
||||||
keyword -jail -prefix
|
keyword -jail -prefix
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -93,6 +93,11 @@ do_routes()
|
|||||||
|
|
||||||
start()
|
start()
|
||||||
{
|
{
|
||||||
|
ewarn
|
||||||
|
ewarn "The $RC_SVCNAME script is deprecated and will be"
|
||||||
|
ewarn "removed in the future."
|
||||||
|
ewarn "Please use the net.* scripts to manage your network interfaces."
|
||||||
|
ewarn
|
||||||
do_routes "Adding" "add"
|
do_routes "Adding" "add"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
before localmount
|
need localmount
|
||||||
keyword -jail -openvz -prefix -vserver -lxc
|
keyword -jail -openvz -prefix -vserver -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -12,7 +12,6 @@ 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
|
||||||
@@ -24,7 +23,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
|
||||||
# occur. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
|
# occure. 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
|
||||||
|
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
#!@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)
|
|
||||||
if [ -e /proc/swaps ]; then
|
|
||||||
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
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
eend 0
|
|
||||||
}
|
|
||||||
@@ -14,7 +14,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 @SYSCONFDIR@/sysctl.conf @SYSCONFDIR@/sysctl.d/*.conf; do
|
for conf in /etc/sysctl.d/*.conf /etc/sysctl.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 -lxc -prefix -vserver
|
keyword -prefix -vserver
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
@@ -15,12 +15,12 @@ start()
|
|||||||
ebegin "Configuring kernel parameters"
|
ebegin "Configuring kernel parameters"
|
||||||
eindent
|
eindent
|
||||||
|
|
||||||
for conf in @SYSCONFDIR@/sysctl.conf @SYSCONFDIR@/sysctl.d/*.conf; do
|
for conf in /etc/sysctl.d/*.conf /etc/sysctl.conf; do
|
||||||
if [ -r "$conf" ]; then
|
if [ -r "$conf" ]; then
|
||||||
vebegin "applying $conf"
|
vebegin "applying $conf"
|
||||||
if ! err=$(sysctl -p "$conf" 2>&1 >/dev/null) ; then
|
if ! err=$(sysctl -q -p "$conf" 2>&1) ; then
|
||||||
errs="${errs} ${err}"
|
errs="${errs} ${err}"
|
||||||
sysctl -e -p "${conf}" >/dev/null
|
sysctl -q -e -p "${conf}"
|
||||||
fi
|
fi
|
||||||
veend $? || retval=1
|
veend $? || retval=1
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ description="Mount the sys filesystem."
|
|||||||
|
|
||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
keyword -lxc -prefix -vserver
|
keyword -prefix -vserver
|
||||||
}
|
}
|
||||||
|
|
||||||
mount_sys()
|
mount_sys()
|
||||||
@@ -74,20 +74,15 @@ mount_misc()
|
|||||||
|
|
||||||
mount_cgroups()
|
mount_cgroups()
|
||||||
{
|
{
|
||||||
mountinfo -q /sys/fs/cgroup || return 0
|
yesno ${rc_cgroups:-YES} || return 0
|
||||||
|
if [ ! -e /proc/cgroups ]; then
|
||||||
|
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
|
|
||||||
|
|
||||||
yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0
|
|
||||||
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 -n -t cgroup -o nodev,noexec,nosuid,${name} \
|
mount -t cgroup -o nodev,noexec,nosuid,${name} \
|
||||||
${name} /sys/fs/cgroup/${name}
|
${name} /sys/fs/cgroup/${name}
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
|
|||||||
|
|
||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
keyword -lxc -openvz -prefix -uml -vserver -xenu
|
keyword -openvz -prefix -uml -vserver -xenu
|
||||||
use root
|
need 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 checkpath -W "$RC_LIBEXECDIR"; then
|
if [ -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
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
#!@PREFIX@/sbin/runscript
|
|
||||||
# Copyright 1999-2012 Gentoo Foundation
|
|
||||||
# Released under the 2-clause BSD license.
|
|
||||||
|
|
||||||
description="Create tmpfiles.d entries (boot)"
|
|
||||||
|
|
||||||
depend()
|
|
||||||
{
|
|
||||||
need localmount
|
|
||||||
}
|
|
||||||
|
|
||||||
start()
|
|
||||||
{
|
|
||||||
ebegin "Creating ${description#Create }"
|
|
||||||
@LIBEXECDIR@/sh/tmpfiles.sh --create ${tmpfiles_opts}
|
|
||||||
eend $?
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!@PREFIX@/sbin/runscript
|
|
||||||
# Copyright 1999-2012 Gentoo Foundation
|
|
||||||
# Released under the 2-clause BSD license.
|
|
||||||
|
|
||||||
description="Create tmpfiles.d entries (sysinit)"
|
|
||||||
|
|
||||||
depend()
|
|
||||||
{
|
|
||||||
# Convert to 'need dev' when the new udev is ready, for OpenRC 0.11
|
|
||||||
#need dev-mount
|
|
||||||
use dev
|
|
||||||
}
|
|
||||||
|
|
||||||
start()
|
|
||||||
{
|
|
||||||
ebegin "Creating ${description#Create }"
|
|
||||||
@LIBEXECDIR@/sh/tmpfiles.sh --create ${tmpfiles_opts}
|
|
||||||
eend $?
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,7 @@ description="Initializes the random number generator."
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need localmount
|
need localmount
|
||||||
keyword -jail -lxc -openvz -prefix
|
keyword -jail -openvz -prefix
|
||||||
}
|
}
|
||||||
|
|
||||||
save_seed()
|
save_seed()
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ install:
|
|||||||
for man in ${MAN3}; do \
|
for man in ${MAN3}; do \
|
||||||
${INSTALL} -m ${MANMODE} "$$man" ${DESTDIR}/${MANDIR}/man3 || exit $$?; \
|
${INSTALL} -m ${MANMODE} "$$man" ${DESTDIR}/${MANDIR}/man3 || exit $$?; \
|
||||||
${MAKE_LINKS} \
|
${MAKE_LINKS} \
|
||||||
done
|
done
|
||||||
${INSTALL} -d ${DESTDIR}/${MANDIR}/man8
|
${INSTALL} -d ${DESTDIR}/${MANDIR}/man8
|
||||||
for man in ${MAN8}; do \
|
for man in ${MAN8}; do \
|
||||||
${INSTALL} -m ${MANMODE} "$$man" ${DESTDIR}/${MANDIR}/man8 || exit $$?; \
|
${INSTALL} -m ${MANMODE} "$$man" ${DESTDIR}/${MANDIR}/man8 || exit $$?; \
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ to true.
|
|||||||
These functions are designed to output a whole line, so they also
|
These functions are designed to output a whole line, so they also
|
||||||
append a newline to the string. To stop this behaviour, you can use the
|
append a newline to the string. To stop this behaviour, you can use the
|
||||||
functions
|
functions
|
||||||
.Fn einfon ,
|
.Fn einfon ,
|
||||||
.Fn ewarnn ,
|
.Fn ewarnn ,
|
||||||
.Fn eerrorn ,
|
.Fn eerrorn ,
|
||||||
.Fn einfovn ,
|
.Fn einfovn ,
|
||||||
@@ -149,7 +149,7 @@ does the same as
|
|||||||
.Fn eend
|
.Fn eend
|
||||||
but prints
|
but prints
|
||||||
.Fa msg
|
.Fa msg
|
||||||
instead of ok or !! in the color
|
instead of ok or !! in the color
|
||||||
.Fa color
|
.Fa color
|
||||||
at the column
|
at the column
|
||||||
.Fa col .
|
.Fa col .
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
.Os OpenRC
|
.Os OpenRC
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
.Nm rc-service
|
.Nm rc-service
|
||||||
.Nd locate and run an OpenRC service with the given arguments
|
.Nd locate and run an OpenRC service with the given arguments
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.Nm
|
.Nm
|
||||||
.Op Fl i , -ifexists
|
.Op Fl i , -ifexists
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
.Fl r , -resolve
|
.Fl r , -resolve
|
||||||
.Ar service
|
.Ar service
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
Service scripts could be in different places on different systems.
|
Service scripts could be in different places on different systems.
|
||||||
.Nm
|
.Nm
|
||||||
locates the specified service and runs it with the given arguments.
|
locates the specified service and runs it with the given arguments.
|
||||||
If
|
If
|
||||||
|
|||||||
@@ -33,8 +33,8 @@
|
|||||||
.Op Ar runlevel
|
.Op Ar runlevel
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
.Nm
|
.Nm
|
||||||
gathers and displays information about the status of services
|
gathers and displays information about the status of services
|
||||||
in different runlevels. The default behavior is to show information
|
in different runlevels. The default behavior is to show information
|
||||||
about the current runlevel and any unassigned services that are not stopped,
|
about the current runlevel and any unassigned services that are not stopped,
|
||||||
but any runlevel can be quickly examined.
|
but any runlevel can be quickly examined.
|
||||||
.Pp
|
.Pp
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
.Os OpenRC
|
.Os OpenRC
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
.Nm rc-update
|
.Nm rc-update
|
||||||
.Nd add and remove services to and from a runlevel
|
.Nd add and remove services to and from a runlevel
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.Nm
|
.Nm
|
||||||
.Op Fl s , -stack
|
.Op Fl s , -stack
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
.Ar show
|
.Ar show
|
||||||
.Op Ar runlevel ...
|
.Op Ar runlevel ...
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
OpenRC uses named runlevels. Rather than editing some obscure
|
OpenRC uses named runlevels. Rather than editing some obscure
|
||||||
file or managing a directory of symlinks,
|
file or managing a directory of symlinks,
|
||||||
.Nm
|
.Nm
|
||||||
exists to quickly add or delete services to and from from different runlevels.
|
exists to quickly add or delete services to and from from different runlevels.
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
Run Command library (librc, -lrc)
|
Run Command library (librc, -lrc)
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.In rc.h
|
.In rc.h
|
||||||
.Ft bool Fn rc_deptree_update void
|
.Ft bool Fn rc_deptree_update void
|
||||||
.Ft bool Fn rc_deptree_update_needed void
|
.Ft bool Fn rc_deptree_update_needed void
|
||||||
.Ft RC_DEPTREE Fn rc_deptree_load void
|
.Ft RC_DEPTREE Fn rc_deptree_load void
|
||||||
@@ -77,7 +77,7 @@ loads the deptree and returns a pointer to it which needs to be freed by
|
|||||||
when done.
|
when done.
|
||||||
.Pp
|
.Pp
|
||||||
.Fn rc_deptree_depend ,
|
.Fn rc_deptree_depend ,
|
||||||
.Fn rc_deptree_depends
|
.Fn rc_deptree_depends
|
||||||
and
|
and
|
||||||
.Fn rc_deptree_order
|
.Fn rc_deptree_order
|
||||||
return a list of services from the
|
return a list of services from the
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
Run Command library (librc, -lrc)
|
Run Command library (librc, -lrc)
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.In rc.h
|
.In rc.h
|
||||||
.Ft "char *" Fn rc_runlevel_get void
|
.Ft "char *" Fn rc_runlevel_get void
|
||||||
.Ft bool Fn rc_runlevel_exists
|
.Ft bool Fn rc_runlevel_exists
|
||||||
.Ft "RC_STRINGLIST *" Fn rc_runlevel_list void
|
.Ft "RC_STRINGLIST *" Fn rc_runlevel_list void
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
Run Command library (librc, -lrc)
|
Run Command library (librc, -lrc)
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.In rc.h
|
.In rc.h
|
||||||
.Ft bool Fn rc_service_add "const char *runlevel" "const char *service"
|
.Ft bool Fn rc_service_add "const char *runlevel" "const char *service"
|
||||||
.Ft bool Fn rc_service_delete "const char *runlevel" "const char *service"
|
.Ft bool Fn rc_service_delete "const char *runlevel" "const char *service"
|
||||||
.Ft bool Fo rc_service_daemon_set
|
.Ft bool Fo rc_service_daemon_set
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
Run Command library (librc, -lrc)
|
Run Command library (librc, -lrc)
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.In rc.h
|
.In rc.h
|
||||||
.Ft "RC_STRINGLIST *" Fn rc_stringlist_new void
|
.Ft "RC_STRINGLIST *" Fn rc_stringlist_new void
|
||||||
.Ft "RC_STRING *" Fn rc_stringlist_add "RC_STRINGLIST *list" "const char *item"
|
.Ft "RC_STRING *" Fn rc_stringlist_add "RC_STRINGLIST *list" "const char *item"
|
||||||
.Ft "RC_STRING *" Fn rc_stringlist_addu "RC_STRINGLIST *list" "const char *item"
|
.Ft "RC_STRING *" Fn rc_stringlist_addu "RC_STRINGLIST *list" "const char *item"
|
||||||
.Ft bool Fn rc_stringlist_delete RC_STRINGLIST "const char *item"
|
.Ft bool Fn rc_stringlist_delete RC_STRINGLIST "const char *item"
|
||||||
|
|||||||
@@ -25,19 +25,18 @@
|
|||||||
.Dt RUNSCRIPT 8 SMM
|
.Dt RUNSCRIPT 8 SMM
|
||||||
.Os OpenRC
|
.Os OpenRC
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
.Nm runscript
|
.Nm runscript
|
||||||
.Nd a means of hooking shell commands into a service
|
.Nd a means of hooking shell commands into a service
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.Nm
|
.Nm
|
||||||
.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
|
||||||
.Nm
|
.Nm
|
||||||
is basically an interpreter for shell scripts which provides an easy interface
|
is basically an interpreter for shell scripts which provide an easy interface
|
||||||
to the often complex system commands and daemons.
|
to the often complex system commands and daemons.
|
||||||
When a service runs a command it first loads its multiplexed configuration
|
When a service runs a command it first loads its multiplexed configuration
|
||||||
file, then its master configuration file, then
|
file, then its master configuration file, then
|
||||||
@@ -77,8 +76,6 @@ 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.
|
||||||
@@ -92,8 +89,7 @@ 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. These should
|
Space separated list of extra commands the service defines.
|
||||||
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.
|
||||||
@@ -112,11 +108,6 @@ 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
|
||||||
@@ -124,10 +115,6 @@ 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
|
||||||
@@ -140,7 +127,7 @@ Here is a list of the functions you can use in a
|
|||||||
.Ic depend
|
.Ic depend
|
||||||
function. You simply pass the names of the services to it to add to that
|
function. You simply pass the names of the services to it to add to that
|
||||||
dependency type, or prefix it with ! to remove it.
|
dependency type, or prefix it with ! to remove it.
|
||||||
.Bl -tag -width "RC_DEFAULTLEVEL"
|
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||||
.It Ic need
|
.It Ic need
|
||||||
The service will refuse to start until needed services have started and it
|
The service will refuse to start until needed services have started and it
|
||||||
will refuse to stop until any services that need it have stopped.
|
will refuse to stop until any services that need it have stopped.
|
||||||
@@ -156,7 +143,7 @@ We provide this virtual service. For example, named provides dns.
|
|||||||
.It Ic config
|
.It Ic config
|
||||||
We should recalculate our dependencies if the listed files have changed.
|
We should recalculate our dependencies if the listed files have changed.
|
||||||
.It Ic keyword
|
.It Ic keyword
|
||||||
Tags a service with a keyword. These are the keywords we currently understand:
|
Tags a service with a keyword. Here's the keywords we currently understand:-
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
.It Dv -shutdown
|
.It Dv -shutdown
|
||||||
Don't stop this service when shutting the system down.
|
Don't stop this service when shutting the system down.
|
||||||
@@ -172,9 +159,9 @@ Other services should wait indefinitely for this service to start. Use
|
|||||||
this keyword if your service may take longer than 60 seconds to start.
|
this keyword if your service may take longer than 60 seconds to start.
|
||||||
.It Dv -jail
|
.It Dv -jail
|
||||||
When in a jail, exclude this service from any dependencies. The service can
|
When in a jail, exclude this service from any dependencies. The service can
|
||||||
still be run directly. Set via
|
still be run directly. Set via
|
||||||
.Ic rc_sys
|
.Ic rc_sys
|
||||||
in
|
in
|
||||||
.Pa /etc/rc.conf
|
.Pa /etc/rc.conf
|
||||||
.It Dv -lxc
|
.It Dv -lxc
|
||||||
Same as -jail, but for Linux Resource Containers (LXC).
|
Same as -jail, but for Linux Resource Containers (LXC).
|
||||||
@@ -320,11 +307,6 @@ Mark the service as inactive.
|
|||||||
.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
|
||||||
@@ -333,18 +315,11 @@ matches YES, TRUE, ON or 1 regardless of case then we return 0, otherwise 1.
|
|||||||
.Sh ENVIRONMENT
|
.Sh ENVIRONMENT
|
||||||
.Nm
|
.Nm
|
||||||
sets the following environment variables for use in the service scripts:
|
sets the following environment variables for use in the service scripts:
|
||||||
.Bl -tag -width "RC_DEFAULTLEVEL"
|
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||||
.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. Note that, in OpenRC, the reboot
|
Current runlevel that rc is in.
|
||||||
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
|
||||||
@@ -352,14 +327,8 @@ Default runlevel chosen. Default is default.
|
|||||||
.It Va RC_SYS
|
.It Va RC_SYS
|
||||||
A special variable to describe the system more.
|
A special variable to describe the system more.
|
||||||
Possible values are OPENVZ, XENU, XEN0, UML and VSERVER.
|
Possible values are OPENVZ, XENU, XEN0, UML and VSERVER.
|
||||||
.It Va RC_PREFIX
|
|
||||||
In a Gentoo Prefix installation, this variable contains the prefix
|
|
||||||
offset. Otherwise it is undefined.
|
|
||||||
.It Va RC_UNAME
|
.It Va RC_UNAME
|
||||||
The result of `uname -s`.
|
The result of `uname -s`.
|
||||||
.It Va RC_CMD
|
|
||||||
This contains the name of the command the service script is executing, such
|
|
||||||
as start, stop, restart etc.
|
|
||||||
.El
|
.El
|
||||||
.Sh FILES
|
.Sh FILES
|
||||||
.Pp
|
.Pp
|
||||||
@@ -398,7 +367,7 @@ 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. This is mainly useful for prefix
|
||||||
# users testing OpenRC.
|
# users testing OpenRC.
|
||||||
rc_keyword="!-prefix"
|
rc_keyword="!noprefix"
|
||||||
.Ed
|
.Ed
|
||||||
.Sh EXAMPLES
|
.Sh EXAMPLES
|
||||||
.Pp
|
.Pp
|
||||||
@@ -441,28 +410,14 @@ depend()
|
|||||||
_need=`service_get_value need`
|
_need=`service_get_value need`
|
||||||
else
|
else
|
||||||
if _need_dbus; then
|
if _need_dbus; then
|
||||||
_need="${_need} dbus"
|
_need="${_need} dbus"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
need ${_need}
|
need ${_need}
|
||||||
}
|
}
|
||||||
|
|
||||||
# This function does any pre-start setup. If it fails, the service will
|
|
||||||
# not be started.
|
|
||||||
# If you need this function to behave differently for a restart command,
|
|
||||||
# you should check the value of RC_CMD for "restart".
|
|
||||||
# This also applies to start_post, stop_pre and stop_post.
|
|
||||||
start_pre()
|
start_pre()
|
||||||
{
|
{
|
||||||
if [ "$RC_CMD" = restart ]; then
|
|
||||||
# This block will only execute for a restart command. Use a
|
|
||||||
# structure like this if you need special processing for a
|
|
||||||
# restart which you do not need for a normal start.
|
|
||||||
# The function can also fail from here, which will mean that a
|
|
||||||
# restart can fail.
|
|
||||||
# This logic can also be used in start_post, stop_pre and
|
|
||||||
# stop_post.
|
|
||||||
fi
|
|
||||||
# Ensure that our dirs are correct
|
# Ensure that our dirs are correct
|
||||||
checkpath --dir --owner foo:foo --mode 0664 \\
|
checkpath --dir --owner foo:foo --mode 0664 \\
|
||||||
/var/run/foo /var/cache/foo
|
/var/run/foo /var/cache/foo
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ is used in an OpenRC service, then OpenRC can in turn check to see if the
|
|||||||
daemon is still running. If not, then the service is marked as crashed.
|
daemon is still running. If not, then the service is marked as crashed.
|
||||||
.Pp
|
.Pp
|
||||||
Here are the options to specify the daemon and how it should start or stop:
|
Here are the options to specify the daemon and how it should start or stop:
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
.It Fl x , -exec Ar daemon
|
.It Fl x , -exec Ar daemon
|
||||||
The
|
The
|
||||||
.Ar daemon
|
.Ar daemon
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
SFX= .Linux.in
|
SFX= .Linux.in
|
||||||
PKG_PREFIX?= /usr
|
PKG_PREFIX?= /usr
|
||||||
|
|
||||||
CPPFLAGS+= -D_BSD_SOURCE -D_XOPEN_SOURCE=700
|
CPPFLAGS+= -D_BSD_SOURCE -D_XOPEN_SOURCE=600
|
||||||
LIBDL= -Wl,-Bdynamic -ldl
|
LIBDL= -Wl,-Bdynamic -ldl
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
# Copyright (c) 2012 William Hubbs <w.d.hubbs@gmail.com>
|
|
||||||
# Released under the 2-clause BSD license.
|
|
||||||
|
|
||||||
ifeq (${MKPREFIX},yes)
|
|
||||||
CPPFLAGS+= -DPREFIX
|
|
||||||
endif
|
|
||||||
1
mk/os.mk
1
mk/os.mk
@@ -7,6 +7,5 @@ _OS_SH= uname -s
|
|||||||
_OS:= $(shell ${_OS_SH})
|
_OS:= $(shell ${_OS_SH})
|
||||||
OS?= ${_OS}
|
OS?= ${_OS}
|
||||||
include ${MK}/os-${OS}.mk
|
include ${MK}/os-${OS}.mk
|
||||||
include ${MK}/os-prefix.mk
|
|
||||||
|
|
||||||
RC_LIB= /$(LIBNAME)/rc
|
RC_LIB= /$(LIBNAME)/rc
|
||||||
|
|||||||
@@ -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' ${_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' -e 's:@RC_SYS_DEFAULT@:${MKRCSYS}:g' ${_PKG_SED} ${_LCL_SED}
|
||||||
|
|
||||||
# Tweak our shell scripts
|
# Tweak our shell scripts
|
||||||
%.sh: %.sh.in
|
%.sh: %.sh.in
|
||||||
@@ -53,6 +53,6 @@ check test::
|
|||||||
# so we ensure that it has a bogus argument
|
# so we ensure that it has a bogus argument
|
||||||
CLEANFILES+= ${OBJS}
|
CLEANFILES+= ${OBJS}
|
||||||
clean:
|
clean:
|
||||||
@if test -n "${CLEANFILES}"; then echo "rm -f ${CLEANFILES}"; rm -f ${CLEANFILES}; fi
|
@if test -n "${CLEANFILES}"; then echo "rm -f ${CLEANFILES}"; rm -f ${CLEANFILES}; fi
|
||||||
|
|
||||||
include ${MK}/gitignore.mk
|
include ${MK}/gitignore.mk
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
# Released under the 2-clause BSD license.
|
# Released under the 2-clause BSD license.
|
||||||
|
|
||||||
_+_ ?= +
|
_+_ ?= +
|
||||||
ECHODIR ?= echo
|
ECHODIR ?= echo
|
||||||
_SUBDIR = @${_+_}for x in ${SUBDIR}; do \
|
_SUBDIR = @${_+_}for x in ${SUBDIR}; do \
|
||||||
if test -d $$x; then \
|
if test -d $$x; then \
|
||||||
${ECHODIR} "===> ${DIRPRFX}$$x (${@:realinstall=install})"; \
|
${ECHODIR} "===> ${DIRPRFX}$$x (${@:realinstall=install})"; \
|
||||||
|
|||||||
16
mk/sys.mk
16
mk/sys.mk
@@ -10,15 +10,10 @@ RANLIB?= ranlib
|
|||||||
SED?= sed
|
SED?= sed
|
||||||
SH= /bin/sh
|
SH= /bin/sh
|
||||||
|
|
||||||
PREFIX?=
|
PREFIX?=
|
||||||
ifeq (${PREFIX},)
|
_UPREFIX_SH= case "${PREFIX}" in "") echo /usr;; *) echo "${PREFIX}";; esac
|
||||||
UPREFIX= /usr
|
_UPREFIX:= $(shell ${_UPREFIX_SH})
|
||||||
else
|
UPREFIX= ${_UPREFIX}
|
||||||
UPREFIX= ${PREFIX}
|
|
||||||
ifeq (${MKPREFIX},yes)
|
|
||||||
UPREFIX= ${PREFIX}/usr
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
LOCAL_PREFIX= /usr/local
|
LOCAL_PREFIX= /usr/local
|
||||||
|
|
||||||
PICFLAG?= -fPIC
|
PICFLAG?= -fPIC
|
||||||
@@ -27,7 +22,6 @@ 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
|
||||||
@@ -49,6 +43,6 @@ MANDIR?= ${MANPREFIX}/man
|
|||||||
MANMODE?= 0444
|
MANMODE?= 0444
|
||||||
|
|
||||||
DOCDIR?= ${UPREFIX}/share/doc
|
DOCDIR?= ${UPREFIX}/share/doc
|
||||||
DOCMODE?= 0644
|
DOCMODE?= 0644
|
||||||
|
|
||||||
CONFMODE?= 0644
|
CONFMODE?= 0644
|
||||||
|
|||||||
@@ -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 ip6rd.sh
|
vlan.sh macvlan.sh
|
||||||
|
|
||||||
SRCS-NetBSD=
|
SRCS-NetBSD=
|
||||||
INC-NetBSD= ifwatchd.sh
|
INC-NetBSD= ifwatchd.sh
|
||||||
|
|||||||
@@ -4,12 +4,6 @@
|
|||||||
bonding_depend()
|
bonding_depend()
|
||||||
{
|
{
|
||||||
before interface macchanger
|
before interface macchanger
|
||||||
program /sbin/ifconfig /bin/ifconfig
|
|
||||||
# If you do not have sysfs, you MUST have this binary instead for ioctl
|
|
||||||
# Also you will loose some functionality that cannot be done via sysfs:
|
|
||||||
if [ ! -d /sys/class/net ]; then
|
|
||||||
program /sbin/ifenslave
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_config_vars="$_config_vars slaves"
|
_config_vars="$_config_vars slaves"
|
||||||
@@ -29,9 +23,6 @@ bonding_pre_start()
|
|||||||
eval primary="\$primary_${IFVAR}"
|
eval primary="\$primary_${IFVAR}"
|
||||||
unset primary_${IFVAR}
|
unset primary_${IFVAR}
|
||||||
|
|
||||||
eval subsume="\$subsume_${IFVAR}"
|
|
||||||
unset subsume_${IFVAR}
|
|
||||||
|
|
||||||
|
|
||||||
[ -z "${slaves}" ] && return 0
|
[ -z "${slaves}" ] && return 0
|
||||||
|
|
||||||
@@ -43,10 +34,6 @@ bonding_pre_start()
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -d /sys/class/net ]; then
|
|
||||||
ewarn "sysfs is not available! You will be unable to create new bonds, or change dynamic parameters!"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# We can create the interface name we like now, but this
|
# We can create the interface name we like now, but this
|
||||||
# requires sysfs
|
# requires sysfs
|
||||||
if ! _exists && [ -d /sys/class/net ]; then
|
if ! _exists && [ -d /sys/class/net ]; then
|
||||||
@@ -64,18 +51,7 @@ bonding_pre_start()
|
|||||||
|
|
||||||
# Configure the bond mode, then we can reloop to ensure we configure
|
# Configure the bond mode, then we can reloop to ensure we configure
|
||||||
# All other options
|
# All other options
|
||||||
[ -d /sys/class/net ] && for x in /sys/class/net/"${IFACE}"/bonding/mode; do
|
for x in /sys/class/net/"${IFACE}"/bonding/mode; do
|
||||||
[ -f "${x}" ] || continue
|
|
||||||
n=${x##*/}
|
|
||||||
eval s=\$${n}_${IFVAR}
|
|
||||||
if [ -n "${s}" ]; then
|
|
||||||
einfo "Setting ${n}: ${s}"
|
|
||||||
echo "${s}" >"${x}" || \
|
|
||||||
eerror "Failed to configure $n (${n}_${IFVAR})"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
# Configure link monitoring
|
|
||||||
for x in /sys/class/net/"${IFACE}"/bonding/miimon; do
|
|
||||||
[ -f "${x}" ] || continue
|
[ -f "${x}" ] || continue
|
||||||
n=${x##*/}
|
n=${x##*/}
|
||||||
eval s=\$${n}_${IFVAR}
|
eval s=\$${n}_${IFVAR}
|
||||||
@@ -86,11 +62,11 @@ bonding_pre_start()
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
# Nice and dynamic for remaining options:)
|
# Nice and dynamic for remaining options:)
|
||||||
[ -d /sys/class/net ] && for x in /sys/class/net/"${IFACE}"/bonding/*; do
|
for x in /sys/class/net/"${IFACE}"/bonding/*; do
|
||||||
[ -f "${x}" ] || continue
|
[ -f "${x}" ] || continue
|
||||||
n=${x##*/}
|
n=${x##*/}
|
||||||
eval s=\$${n}_${IFVAR}
|
eval s=\$${n}_${IFVAR}
|
||||||
[ "${n}" != "mode" -o "${n}" != "miimon" ] || continue
|
[ "${n}" != "mode" ] || continue
|
||||||
if [ -n "${s}" ]; then
|
if [ -n "${s}" ]; then
|
||||||
einfo "Setting ${n}: ${s}"
|
einfo "Setting ${n}: ${s}"
|
||||||
echo "${s}" >"${x}" || \
|
echo "${s}" >"${x}" || \
|
||||||
@@ -108,44 +84,15 @@ bonding_pre_start()
|
|||||||
_exists true || return 1
|
_exists true || return 1
|
||||||
done
|
done
|
||||||
|
|
||||||
# Unless we are subsuming an existing interface (NFS root), we down
|
# Must force the slaves to a particular state before adding them
|
||||||
# slave interfaces to work around bugs supposedly in some chipsets
|
for IFACE in ${slaves}; do
|
||||||
# that cause failure to enslave from other states.
|
_delete_addresses
|
||||||
if [ -z "${subsume}" ]; then
|
_down
|
||||||
for IFACE in ${slaves}; do
|
done
|
||||||
_delete_addresses
|
|
||||||
_down
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Now force the master to up
|
# now force the master to up
|
||||||
# - First test for interface subsume request (required for NFS root)
|
_up
|
||||||
if [ -n "${subsume}" ]; then
|
|
||||||
einfo "Subsuming ${subsume} interface characteristics."
|
|
||||||
eindent
|
|
||||||
local oiface=${IFACE}
|
|
||||||
IFACE=${subsume}
|
|
||||||
local addr="$(_get_inet_address)"
|
|
||||||
einfo "address: ${addr}"
|
|
||||||
IFACE=${oiface}
|
|
||||||
unset oiface
|
|
||||||
eoutdent
|
|
||||||
# subsume (presumably kernel auto-)configured IP
|
|
||||||
ifconfig ${IFACE} ${addr} up
|
|
||||||
else
|
|
||||||
# warn if root on nfs and no subsume interface supplied
|
|
||||||
local root_fs_type=$(mountinfo -s /)
|
|
||||||
if [ "${root_fs_type}" == "nfs" ]; then
|
|
||||||
warn_nfs=1
|
|
||||||
ewarn "NFS root detected!!!"
|
|
||||||
ewarn " If your system crashes here, /etc/conf.d/net needs"
|
|
||||||
ewarn " subsume_${IFACE}=\"<iface>\" ... where <iface> is the"
|
|
||||||
ewarn " existing, (usually kernel auto-)configured interface."
|
|
||||||
fi
|
|
||||||
# up the interface
|
|
||||||
_up
|
|
||||||
fi
|
|
||||||
|
|
||||||
# finally add in slaves
|
# finally add in slaves
|
||||||
# things needed in the process, and if they are done by ifenslave, openrc, and/or the kernel.
|
# things needed in the process, and if they are done by ifenslave, openrc, and/or the kernel.
|
||||||
@@ -158,7 +105,7 @@ bonding_pre_start()
|
|||||||
local oiface
|
local oiface
|
||||||
oiface=$IFACE
|
oiface=$IFACE
|
||||||
if [ -n "${primary}" ]; then
|
if [ -n "${primary}" ]; then
|
||||||
IFACE=$primary
|
IFACE=$primary
|
||||||
_down
|
_down
|
||||||
IFACE=$oiface
|
IFACE=$oiface
|
||||||
echo "+${primary}" >$sys_bonding_path/slaves
|
echo "+${primary}" >$sys_bonding_path/slaves
|
||||||
@@ -167,14 +114,14 @@ bonding_pre_start()
|
|||||||
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
|
IFACE=$s
|
||||||
_down
|
_down
|
||||||
IFACE=$oiface
|
IFACE=$oiface
|
||||||
echo "+${s}" >$sys_bonding_path/slaves
|
echo "+${s}" >$sys_bonding_path/slaves
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
ifenslave "${IFACE}" ${slaves} >/dev/null
|
/sbin/ifenslave "${IFACE}" ${slaves} >/dev/null
|
||||||
fi
|
fi
|
||||||
eend $?
|
eend $?
|
||||||
|
|
||||||
@@ -185,11 +132,6 @@ bonding_stop()
|
|||||||
{
|
{
|
||||||
_is_bond || return 0
|
_is_bond || return 0
|
||||||
|
|
||||||
# Wipe subsumed interface
|
|
||||||
if [ -n "${subsume}" ]; then
|
|
||||||
ifconfig ${subsume} 0.0.0.0
|
|
||||||
fi
|
|
||||||
|
|
||||||
local slaves= s=
|
local slaves= s=
|
||||||
slaves=$( \
|
slaves=$( \
|
||||||
sed -n -e 's/^Slave Interface: //p' "/proc/net/bonding/${IFACE}" \
|
sed -n -e 's/^Slave Interface: //p' "/proc/net/bonding/${IFACE}" \
|
||||||
@@ -207,7 +149,7 @@ bonding_stop()
|
|||||||
echo -"${s}" > /sys/class/net/"${IFACE}"/bonding/slaves
|
echo -"${s}" > /sys/class/net/"${IFACE}"/bonding/slaves
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
ifenslave -d "${IFACE}" ${slaves}
|
/sbin/ifenslave -d "${IFACE}" ${slaves}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# reset all slaves
|
# reset all slaves
|
||||||
|
|||||||
@@ -119,8 +119,10 @@ bridge_pre_start()
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
# The interface is known to exist now
|
# The interface is known to exist now
|
||||||
|
_set_flag promisc
|
||||||
_up
|
_up
|
||||||
if ! brctl addif "${BR_IFACE}" "${x}"; then
|
if ! brctl addif "${BR_IFACE}" "${x}"; then
|
||||||
|
_set_flag -promisc
|
||||||
eend 1
|
eend 1
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
@@ -142,7 +144,6 @@ bridge_pre_start()
|
|||||||
) || return 1
|
) || return 1
|
||||||
|
|
||||||
# Bring up the bridge
|
# Bring up the bridge
|
||||||
_set_flag promisc
|
|
||||||
_up
|
_up
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
ifconfig_depend()
|
ifconfig_depend()
|
||||||
{
|
{
|
||||||
program /sbin/ifconfig /bin/ifconfig
|
program /sbin/ifconfig
|
||||||
provide interface
|
provide interface
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -19,24 +19,24 @@ _down()
|
|||||||
|
|
||||||
_exists()
|
_exists()
|
||||||
{
|
{
|
||||||
[ -e /sys/class/net/"$IFACE" ]
|
grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/dev
|
||||||
}
|
}
|
||||||
|
|
||||||
_ifindex()
|
_ifindex()
|
||||||
{
|
{
|
||||||
local index=-1
|
local line= i=-2
|
||||||
local f v
|
while read line; do
|
||||||
if [ -e /sys/class/net/"${IFACE}"/ifindex ]; then
|
: $(( i += 1 ))
|
||||||
index=$(cat /sys/class/net/"${IFACE}"/ifindex)
|
[ ${i} -lt 1 ] && continue
|
||||||
else
|
case "${line}" in
|
||||||
for f in /sys/class/net/*/ifindex ; do
|
"${IFACE}:"*) echo "${i}"; return 0;;
|
||||||
v=$(cat $f)
|
esac
|
||||||
[ $v -gt $index ] && index=$v
|
done < /proc/net/dev
|
||||||
done
|
|
||||||
: $(( index += 1 ))
|
# Return the next available index
|
||||||
fi
|
: $(( i += 1 ))
|
||||||
echo "${index}"
|
echo "${i}"
|
||||||
return 0
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
_is_wireless()
|
_is_wireless()
|
||||||
|
|||||||
168
net/ip6rd.sh
168
net/ip6rd.sh
@@ -1,168 +0,0 @@
|
|||||||
# 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
|
|
||||||
}
|
|
||||||
@@ -10,34 +10,34 @@ iproute2_depend()
|
|||||||
|
|
||||||
_up()
|
_up()
|
||||||
{
|
{
|
||||||
ip link set dev "${IFACE}" up
|
ip link set "${IFACE}" up
|
||||||
}
|
}
|
||||||
|
|
||||||
_down()
|
_down()
|
||||||
{
|
{
|
||||||
ip link set dev "${IFACE}" down
|
ip link set "${IFACE}" down
|
||||||
}
|
}
|
||||||
|
|
||||||
_exists()
|
_exists()
|
||||||
{
|
{
|
||||||
[ -e /sys/class/net/"$IFACE" ]
|
grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/dev
|
||||||
}
|
}
|
||||||
|
|
||||||
_ifindex()
|
_ifindex()
|
||||||
{
|
{
|
||||||
local index=-1
|
local line= i=-2
|
||||||
local f v
|
while read line; do
|
||||||
if [ -e /sys/class/net/"${IFACE}"/ifindex ]; then
|
: $(( i += 1 ))
|
||||||
index=$(cat /sys/class/net/"${IFACE}"/ifindex)
|
[ ${i} -lt 1 ] && continue
|
||||||
else
|
case "${line}" in
|
||||||
for f in /sys/class/net/*/ifindex ; do
|
"${IFACE}:"*) echo "${i}"; return 0;;
|
||||||
v=$(cat $f)
|
esac
|
||||||
[ $v -gt $index ] && index=$v
|
done < /proc/net/dev
|
||||||
done
|
|
||||||
: $(( index += 1 ))
|
# Return the next available index
|
||||||
fi
|
: $(( i += 1 ))
|
||||||
echo "${index}"
|
echo "${i}"
|
||||||
return 0
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
_is_wireless()
|
_is_wireless()
|
||||||
@@ -57,7 +57,7 @@ _set_flag()
|
|||||||
flag=${flag#-}
|
flag=${flag#-}
|
||||||
opt="off"
|
opt="off"
|
||||||
fi
|
fi
|
||||||
ip link set dev "${IFACE}" "${flag}" "${opt}"
|
ip link set "${IFACE}" "${flag}" "${opt}"
|
||||||
}
|
}
|
||||||
|
|
||||||
_get_mac_address()
|
_get_mac_address()
|
||||||
@@ -79,7 +79,7 @@ _get_mac_address()
|
|||||||
|
|
||||||
_set_mac_address()
|
_set_mac_address()
|
||||||
{
|
{
|
||||||
ip link set dev "${IFACE}" address "$1"
|
ip link set "${IFACE}" address "$1"
|
||||||
}
|
}
|
||||||
|
|
||||||
_get_inet_addresses()
|
_get_inet_addresses()
|
||||||
@@ -212,7 +212,7 @@ _delete_addresses()
|
|||||||
|
|
||||||
_has_carrier()
|
_has_carrier()
|
||||||
{
|
{
|
||||||
LC_ALL=C ip link show dev "${IFACE}" | grep -q "LOWER_UP"
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
_tunnel()
|
_tunnel()
|
||||||
@@ -274,12 +274,12 @@ iproute2_pre_start()
|
|||||||
# MTU support
|
# MTU support
|
||||||
local mtu=
|
local mtu=
|
||||||
eval mtu=\$mtu_${IFVAR}
|
eval mtu=\$mtu_${IFVAR}
|
||||||
[ -n "${mtu}" ] && ip link set dev "${IFACE}" mtu "${mtu}"
|
[ -n "${mtu}" ] && ip link set "${IFACE}" mtu "${mtu}"
|
||||||
|
|
||||||
# TX Queue Length support
|
# TX Queue Length support
|
||||||
local len=
|
local len=
|
||||||
eval len=\$txqueuelen_${IFVAR}
|
eval len=\$txqueuelen_${IFVAR}
|
||||||
[ -n "${len}" ] && ip link set dev "${IFACE}" txqueuelen "${len}"
|
[ -n "${len}" ] && ip link set "${IFACE}" txqueuelen "${len}"
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@@ -287,7 +287,7 @@ iproute2_pre_start()
|
|||||||
_iproute2_ipv6_tentative()
|
_iproute2_ipv6_tentative()
|
||||||
{
|
{
|
||||||
# Only check tentative when we have a carrier.
|
# Only check tentative when we have a carrier.
|
||||||
_has_carrier || return 1
|
LC_ALL=C ip link show dev "${IFACE}" | grep -q "NO-CARRIER" && return 1
|
||||||
LC_ALL=C ip addr show dev "${IFACE}" | \
|
LC_ALL=C ip addr show dev "${IFACE}" | \
|
||||||
grep -q "^[[:space:]]*inet6 .* tentative"
|
grep -q "^[[:space:]]*inet6 .* tentative"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,12 +61,12 @@ udhcpc_start()
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
case " ${args} " in
|
case " ${args} " in
|
||||||
*" --hostname="*|*" -h "*|*" -H "*);;
|
*" --hosname="*|*" -h "*|*" -H "*);;
|
||||||
*)
|
*)
|
||||||
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} -x hostname:'${hname}'"
|
args="${args} --hostname='${hname}'"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|||||||
31
net/vlan.sh
31
net/vlan.sh
@@ -66,41 +66,26 @@ vlan_post_start()
|
|||||||
einfo "Adding VLAN ${vlan} to ${IFACE}"
|
einfo "Adding VLAN ${vlan} to ${IFACE}"
|
||||||
# We need to gather all interface configuration options
|
# We need to gather all interface configuration options
|
||||||
# 1) naming. Default to the standard "${IFACE}.${vlan}" but it can be anything
|
# 1) naming. Default to the standard "${IFACE}.${vlan}" but it can be anything
|
||||||
eval vname=\$${IFACE}_vlan${vlan}_name
|
eval vname=\$vlan${vlan}_name
|
||||||
[ -z "${vname}" ] && eval vname=\$vlan${vlan}_name
|
|
||||||
[ -z "${vname}" ] && vname="${IFACE}.${vlan}"
|
[ -z "${vname}" ] && vname="${IFACE}.${vlan}"
|
||||||
# 2) flags
|
# 2) flags
|
||||||
eval vflags=\$${IFACE}_vlan${vlan}_flags
|
eval vflags=\$vlan${vlan}_flags
|
||||||
[ -z "${vname}" ] && eval vflags=\$vlan${vlan}_flags
|
|
||||||
# 3) ingress/egress map
|
# 3) ingress/egress map
|
||||||
eval vingress=\$${IFACE}_vlan${vlan}_ingress
|
eval vingress=\$vlan${vlan}_ingress
|
||||||
[ -z "${vingress}" ] && eval vingress=\$vlan${vlan}_ingress
|
|
||||||
[ -z "${vingress}" ] || vingress="ingress-qos-map ${vingress}"
|
[ -z "${vingress}" ] || vingress="ingress-qos-map ${vingress}"
|
||||||
eval vegress=\$${IFACE}_vlan${vlan}_egress
|
eval vegress=\$vlan${vlan}_egress
|
||||||
[ -z "${vegress}" ] && eval vegress=\$vlan${vlan}_egress
|
|
||||||
[ -z "${vegress}" ] || vegress="egress-qos-map ${vegress}"
|
[ -z "${vegress}" ] || vegress="egress-qos-map ${vegress}"
|
||||||
|
|
||||||
# txqueue
|
|
||||||
local txqueuelen=
|
local txqueuelen=
|
||||||
eval txqueuelen=\$txqueuelen_${IFACE}_vlan${vlan}
|
eval txqueuelen=\$txqueuelen_vlan${vlan}
|
||||||
[ -z "${txqueuelen}" ] && eval txqueuelen=\$txqueuelen_vlan${vlan}
|
|
||||||
# mac
|
|
||||||
local mac=
|
local mac=
|
||||||
eval mac=\$mac_${IFACE}_vlan${vlan}
|
eval mac=\$mac_vlan${vlan}
|
||||||
[ -z "${mac}" ] && eval mac=\$mac_vlan${vlan}
|
|
||||||
# broadcast
|
|
||||||
local broadcast=
|
local broadcast=
|
||||||
eval broadcast=\$broadcast_${IFACE}_vlan${vlan}
|
eval broadcast=\$broadcast_vlan${vlan}
|
||||||
[ -z "${broadcast}" ] && eval broadcast=\$broadcast_vlan${vlan}
|
|
||||||
# mtu
|
|
||||||
local mtu=
|
local mtu=
|
||||||
eval mtu=\$mtu_${IFACE}_vlan${vlan}
|
eval mtu=\$mtu_vlan${vlan}
|
||||||
[ -z "${mtu}" ] && eval mtu=\$mtu_vlan${vlan}
|
|
||||||
|
|
||||||
# combine it all
|
|
||||||
local opts="${txqueuelen:+txqueuelen} ${txqueuelen} ${mac:+address} ${mac} ${broadcast:+broadcast} ${broadcast} ${mtu:+mtu} ${mtu}"
|
local opts="${txqueuelen:+txqueuelen} ${txqueuelen} ${mac:+address} ${mac} ${broadcast:+broadcast} ${broadcast} ${mtu:+mtu} ${mtu}"
|
||||||
|
|
||||||
veinfo "ip link add link \"${IFACE}\" name \"${vname}\" ${opts} type vlan id \"${vlan}\" ${vflags} ${vingress} ${vegress}"
|
|
||||||
e="$(ip link add link "${IFACE}" name "${vname}" ${opts} type vlan id "${vlan}" ${vflags} ${vingress} ${vegress} 2>&1 1>/dev/null)"
|
e="$(ip link add link "${IFACE}" name "${vname}" ${opts} type vlan id "${vlan}" ${vflags} ${vingress} ${vegress} 2>&1 1>/dev/null)"
|
||||||
if [ -n "${e}" ]; then
|
if [ -n "${e}" ]; then
|
||||||
eend 1 "${e}"
|
eend 1 "${e}"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
BOOT= bootmisc fsck hostname localmount \
|
BOOT= bootmisc fsck hostname localmount \
|
||||||
root swap swapfiles sysctl urandom ${BOOT-${OS}}
|
root swap sysctl urandom ${BOOT-${OS}}
|
||||||
DEFAULT= local netmount
|
DEFAULT= local netmount
|
||||||
SHUTDOWN= savecache ${SHUTDOWN-${OS}}
|
SHUTDOWN= savecache ${SHUTDOWN-${OS}}
|
||||||
SYSINIT= ${SYSINIT-${OS}}
|
SYSINIT= ${SYSINIT-${OS}}
|
||||||
@@ -10,12 +10,6 @@ BOOTDIR= ${LEVELDIR}/boot
|
|||||||
DEFAULTDIR= ${LEVELDIR}/default
|
DEFAULTDIR= ${LEVELDIR}/default
|
||||||
SHUTDOWNDIR= ${LEVELDIR}/shutdown
|
SHUTDOWNDIR= ${LEVELDIR}/shutdown
|
||||||
|
|
||||||
ifeq (${MKNET},)
|
|
||||||
BOOT+= network staticroute
|
|
||||||
endif
|
|
||||||
|
|
||||||
INITFILES= ../init.d
|
|
||||||
|
|
||||||
MK= ../mk
|
MK= ../mk
|
||||||
include ${MK}/sys.mk
|
include ${MK}/sys.mk
|
||||||
include ${MK}/os.mk
|
include ${MK}/os.mk
|
||||||
@@ -25,25 +19,19 @@ BOOT-${OS}=
|
|||||||
SHUTDOWN-${OS}=
|
SHUTDOWN-${OS}=
|
||||||
SYSINIT-${OS}=
|
SYSINIT-${OS}=
|
||||||
|
|
||||||
ifeq (${MKNET},oldnet)
|
|
||||||
BOOT-FreeBSD+= net.lo0
|
|
||||||
BOOT-Linux+= net.lo
|
|
||||||
BOOT-NetBSD+= net.lo0
|
|
||||||
endif
|
|
||||||
|
|
||||||
BOOT-BSD= hostid newsyslog savecore syslogd swap-blk
|
BOOT-BSD= hostid newsyslog savecore syslogd swap-blk
|
||||||
|
|
||||||
# Generic BSD stuff
|
# Generic BSD stuff
|
||||||
BOOT-FreeBSD+= hostid newsyslog savecore syslogd
|
BOOT-FreeBSD= hostid net.lo0 newsyslog savecore syslogd
|
||||||
# FreeBSD specific stuff
|
# FreeBSD specific stuff
|
||||||
BOOT-FreeBSD+= adjkerntz dumpon syscons
|
BOOT-FreeBSD+= adjkerntz dumpon syscons
|
||||||
|
|
||||||
BOOT-Linux+= hwclock keymaps modules mtab procfs termencoding tmpfilesd.boot
|
BOOT-Linux= hwclock keymaps modules mtab net.lo procfs termencoding
|
||||||
SHUTDOWN-Linux= killprocs mount-ro
|
SHUTDOWN-Linux= killprocs mount-ro
|
||||||
SYSINIT-Linux= devfs dmesg sysfs tmpfilesd.sysinit
|
SYSINIT-Linux= devfs dmesg
|
||||||
|
|
||||||
# Generic BSD stuff
|
# Generic BSD stuff
|
||||||
BOOT-NetBSD+= hostid newsyslog savecore syslogd
|
BOOT-NetBSD= hostid net.lo0 newsyslog savecore syslogd
|
||||||
# NetBSD specific stuff
|
# NetBSD specific stuff
|
||||||
BOOT-NetBSD+= devdb swap-blk ttys wscons
|
BOOT-NetBSD+= devdb swap-blk ttys wscons
|
||||||
|
|
||||||
@@ -54,34 +42,34 @@ install:
|
|||||||
${INSTALL} -d ${SYSINITDIR} || exit $$?; \
|
${INSTALL} -d ${SYSINITDIR} || exit $$?; \
|
||||||
for x in ${SYSINIT}; do \
|
for x in ${SYSINIT}; do \
|
||||||
if test -n "${PREFIX}"; then \
|
if test -n "${PREFIX}"; then \
|
||||||
grep -q "keyword .*-prefix" ${INITFILES}/"$$x" && continue; \
|
grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
|
||||||
fi; \
|
fi; \
|
||||||
ln -snf ${INITDIR}/"$$x" ${SYSINITDIR}/"$$x" || exit $$?; done \
|
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 \
|
if test -n "${PREFIX}"; then \
|
||||||
grep -q "keyword .*-prefix" ${INITFILES}/"$$x" && continue; \
|
grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
|
||||||
fi; \
|
fi; \
|
||||||
ln -snf ${INITDIR}/"$$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 \
|
if test -n "${PREFIX}"; then \
|
||||||
grep -q "keyword .*-prefix" ${INITFILES}/"$$x" && continue; \
|
grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
|
||||||
fi; \
|
fi; \
|
||||||
ln -snf ${INITDIR}/"$$x" ${DEFAULTDIR}/"$$x" || exit $$?; done \
|
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 \
|
if test -n "${PREFIX}"; then \
|
||||||
grep -q "keyword .*-prefix" ${INITFILES}/"$$x" && continue; \
|
grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
|
||||||
fi; \
|
fi; \
|
||||||
ln -snf ${INITDIR}/"$$x" ${SHUTDOWNDIR}/"$$x" || exit $$?; done \
|
ln -snf ${PREFIX}/etc/init.d/"$$x" ${SHUTDOWNDIR}/"$$x" || exit $$?; done \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
check test::
|
check test::
|
||||||
|
|||||||
3
sh/.gitignore
vendored
3
sh/.gitignore
vendored
@@ -3,11 +3,8 @@ 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 tmpfiles.sh.in ${SRCS-${OS}}
|
rc-functions.sh.in runscript.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 tmpfiles.sh ${BIN-${OS}}
|
BIN= gendepends.sh init.sh runscript.sh ${BIN-${OS}}
|
||||||
|
|
||||||
INSTALLAFTER= _installafter
|
INSTALLAFTER= _installafter
|
||||||
|
|
||||||
@@ -12,10 +12,8 @@ include ${MK}/os.mk
|
|||||||
SRCS-FreeBSD=
|
SRCS-FreeBSD=
|
||||||
BIN-FreeBSD=
|
BIN-FreeBSD=
|
||||||
|
|
||||||
SRCS-Linux= cgroup-release-agent.sh.in init-early.sh.in migrate-to-run.sh.in \
|
SRCS-Linux= cgroup-release-agent.sh.in init-early.sh.in udhcpc-hook.sh.in
|
||||||
udhcpc-hook.sh.in
|
BIN-Linux= cgroup-release-agent.sh init-early.sh udhcpc-hook.sh
|
||||||
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
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ else
|
|||||||
# the last ecmd
|
# the last ecmd
|
||||||
for _e in ebegin eend error errorn einfo einfon ewarn ewarnn ewend \
|
for _e in ebegin eend error errorn einfo einfon ewarn ewarnn ewend \
|
||||||
vebegin veend veinfo vewarn vewend; do
|
vebegin veend veinfo vewarn vewend; do
|
||||||
eval "$_e() { local _r; command $_e \"\$@\"; _r=\$?; \
|
eval "$_e() { local _r; @LIBEXECDIR@/bin/$_e \"\$@\"; _r=\$?; \
|
||||||
export EINFO_LASTCMD=$_e; return \$_r; }"
|
export EINFO_LASTCMD=$_e; return \$_r; }"
|
||||||
done
|
done
|
||||||
unset _e
|
unset _e
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
. @LIBEXECDIR@/sh/functions.sh
|
. @SYSCONFDIR@/init.d/functions.sh
|
||||||
. @LIBEXECDIR@/sh/rc-functions.sh
|
. @LIBEXECDIR@/sh/rc-functions.sh
|
||||||
|
|
||||||
config() {
|
config() {
|
||||||
|
|||||||
@@ -5,19 +5,6 @@
|
|||||||
: ${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"
|
||||||
@@ -27,8 +14,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 service_present "$RC_DEFAULTLEVEL" consolefont ||
|
if [ -e /etc/runlevels/"$RC_DEFAULTLEVEL"/consolefont \
|
||||||
service_present "$RC_BOOTLEVEL" consolefont; then
|
-o -e /etc/runlevels/"$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)"
|
||||||
@@ -38,8 +25,8 @@ if service_present "$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 service_present "$RC_DEFAULTLEVEL" keymaps ||
|
if [ -e /etc/runlevels/"$RC_DEFAULTLEVEL"/keymaps \
|
||||||
service_present "$RC_BOOTLEVEL" keymaps; then
|
-o -e /etc/runlevels/"$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,6 +3,62 @@
|
|||||||
# 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
|
||||||
|
|
||||||
@@ -19,7 +75,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"
|
einfo "/proc is already mounted, skipping"
|
||||||
mountproc=false
|
mountproc=false
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -35,41 +91,24 @@ 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
|
||||||
sys="$(rc --sys)"
|
if [ -d /run ]; then
|
||||||
|
if mountinfo -q /run; then
|
||||||
if [ ! -d /run ]; then
|
einfo "/run is already mounted, skipping"
|
||||||
if [ "$sys" = VSERVER ]; then
|
|
||||||
if [ -e /run ]; then
|
|
||||||
rm -rf /run
|
|
||||||
fi
|
|
||||||
mkdir /run
|
|
||||||
else
|
else
|
||||||
eerror "The /run directory does not exist. Unable to continue."
|
ebegin "Mounting /run"
|
||||||
return 1
|
if ! fstabinfo --mount /run; then
|
||||||
|
mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /run
|
||||||
|
fi
|
||||||
|
eend $?
|
||||||
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
|
||||||
@@ -80,9 +119,4 @@ if grep -Eq "[[:space:]]+xenfs$" /proc/filesystems; then
|
|||||||
eend $?
|
eend $?
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -e "$RC_LIBEXECDIR"/cache/deptree ]; then
|
. "$RC_LIBEXECDIR"/sh/init-common-post.sh
|
||||||
cp -p "$RC_LIBEXECDIR"/cache/* "$RC_SVCDIR" 2>/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo sysinit >"$RC_SVCDIR"/softlevel
|
|
||||||
exit 0
|
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
#!@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,22 +4,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.
|
||||||
|
|
||||||
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
|
||||||
@@ -32,7 +16,7 @@ sourcex()
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
sourcex "@LIBEXECDIR@/sh/functions.sh"
|
sourcex "@SYSCONFDIR@/init.d/functions.sh"
|
||||||
sourcex "@LIBEXECDIR@/sh/rc-functions.sh"
|
sourcex "@LIBEXECDIR@/sh/rc-functions.sh"
|
||||||
|
|
||||||
# Support LiveCD foo
|
# Support LiveCD foo
|
||||||
@@ -40,6 +24,18 @@ 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
|
||||||
@@ -128,11 +124,7 @@ 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
|
||||||
if [ -z "${pidfile}" ]; then
|
_background="--background --pidfile"
|
||||||
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
|
||||||
@@ -193,14 +185,6 @@ 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}
|
||||||
|
|
||||||
@@ -233,12 +217,7 @@ 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
|
||||||
@@ -265,7 +244,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 verify_boot && ! service_started; then
|
if ! 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
|
||||||
@@ -275,16 +254,13 @@ 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 verify_boot && ! service_stopped; then
|
if ! 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 $?
|
||||||
|
|||||||
@@ -1,308 +0,0 @@
|
|||||||
#!/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
|
|
||||||
#
|
|
||||||
|
|
||||||
DRYRUN=0
|
|
||||||
|
|
||||||
warninvalid() {
|
|
||||||
printf "tmpfiles: ignoring invalid entry on line %d of \`%s'\n" "$LINENUM" "$FILE"
|
|
||||||
error=$(( error+1 ))
|
|
||||||
} >&2
|
|
||||||
|
|
||||||
dryrun_or_real() {
|
|
||||||
local dryrun=
|
|
||||||
[ $DRYRUN -eq 1 ] && dryrun=echo
|
|
||||||
$dryrun "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
relabel() {
|
|
||||||
local path
|
|
||||||
local paths=$1 mode=$2 uid=$3 gid=$4
|
|
||||||
|
|
||||||
for path in ${paths}; do
|
|
||||||
if [ -e "$path" ]; then
|
|
||||||
[ $uid != '-' ] && dryrun_or_real chown $CHOPTS "$uid" "$path"
|
|
||||||
[ $gid != '-' ] && dryrun_or_real chgrp $CHOPTS "$gid" "$path"
|
|
||||||
[ $mode != '-' ] && dryrun_or_real chmod $CHOPTS "$mode" "$path"
|
|
||||||
[ -x /sbin/restorecon ] && dryrun_or_real 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" ] && dryrun_or_real 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" ] && dryrun_or_real 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
|
|
||||||
dryrun_or_real 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
|
|
||||||
|
|
||||||
dryrun_or_real 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
|
|
||||||
dryrun_or_real 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
|
|
||||||
dryrun_or_real find "$path" -mindepth 1 -maxdepth 1 -xdev -exec rm -rf {} +
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $CREATE -gt 0 ]; then
|
|
||||||
dryrun_or_real 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" ] && dryrun_or_real 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
|
|
||||||
dryrun_or_real mkfifo -m$mode "$path"
|
|
||||||
dryrun_or_real 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
|
|
||||||
dryrun_or_real rm -f "$path"
|
|
||||||
elif [ -d "$path" ]; then
|
|
||||||
dryrun_or_real 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" ] && dryrun_or_real 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
|
|
||||||
if [ -f "$path" ]; then
|
|
||||||
if [ $DRYRUN -eq 1 ]; then
|
|
||||||
echo "echo \"$arg\" >>\"$path\""
|
|
||||||
else
|
|
||||||
echo "$arg" >>"$path"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
_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 [ $(( CLEAN )) -eq 1 ] ; then
|
|
||||||
printf '%s clean mode is not implemented\n' "${0##*/}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
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) ;;
|
|
||||||
\#) continue ;;
|
|
||||||
*) 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}" = '-' -o "${4}" = '' ] && uid=0
|
|
||||||
[ "${5}" = '-' -o "${5}" = '' ] && gid=0
|
|
||||||
[ "${6}" = '-' -o "${6}" = '' ] && age=0
|
|
||||||
[ "${7}" = '-' -o "${7}" = '' ] && arg=''
|
|
||||||
set -- "$path" "$mode" "$uid" "$gid" "$age" "$arg"
|
|
||||||
|
|
||||||
[ "$VERBOSE" -eq "1" ] && echo _$cmd "$@"
|
|
||||||
_$cmd "$@"
|
|
||||||
rc=$?
|
|
||||||
if [ "${DRYRUN}" -eq "0" ]; then
|
|
||||||
[ $rc -ne 0 ] && error=$((error + 1))
|
|
||||||
fi
|
|
||||||
done <$FILE
|
|
||||||
done
|
|
||||||
|
|
||||||
exit $error
|
|
||||||
|
|
||||||
# vim: set ts=2 sw=2 sts=2 noet ft=sh:
|
|
||||||
@@ -1,139 +0,0 @@
|
|||||||
/*
|
|
||||||
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,9 +36,6 @@
|
|||||||
#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"
|
||||||
@@ -54,6 +51,98 @@
|
|||||||
#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;
|
||||||
@@ -77,14 +166,19 @@ 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,7 +51,6 @@ 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)
|
||||||
@@ -135,7 +134,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[ARRAY_SIZE(ecolors)];
|
static const char *ecolors_str[sizeof(ecolors)/sizeof(ecolors[0])];
|
||||||
|
|
||||||
static char *flush = NULL;
|
static char *flush = NULL;
|
||||||
static char *up = NULL;
|
static char *up = NULL;
|
||||||
@@ -226,6 +225,27 @@ 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
|
||||||
|
|
||||||
@@ -442,7 +462,7 @@ colour_terminal(FILE * EINFO_RESTRICT f)
|
|||||||
|
|
||||||
/* Now setup our colours */
|
/* Now setup our colours */
|
||||||
p = ebuffer;
|
p = ebuffer;
|
||||||
for (i = 0; i < ARRAY_SIZE(ecolors); ++i) {
|
for (i = 0; i < sizeof(ecolors) / sizeof(ecolors[0]); i++) {
|
||||||
tmp[0] = '\0';
|
tmp[0] = '\0';
|
||||||
if (ecolors[i].name) {
|
if (ecolors[i].name) {
|
||||||
bold = _md;
|
bold = _md;
|
||||||
@@ -578,7 +598,7 @@ _ecolor(FILE * EINFO_RESTRICT f, ECOLOR color)
|
|||||||
if (!colour_terminal(f))
|
if (!colour_terminal(f))
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(ecolors); ++i)
|
for (i = 0; i < sizeof(ecolors) / sizeof(ecolors[0]); i++)
|
||||||
if (ecolors[i].color == color)
|
if (ecolors[i].color == color)
|
||||||
return ecolors_str[i];
|
return ecolors_str[i];
|
||||||
return "";
|
return "";
|
||||||
|
|||||||
@@ -28,8 +28,6 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/utsname.h>
|
|
||||||
|
|
||||||
#include "librc.h"
|
#include "librc.h"
|
||||||
|
|
||||||
#define GENDEP RC_LIBEXECDIR "/sh/gendepends.sh"
|
#define GENDEP RC_LIBEXECDIR "/sh/gendepends.sh"
|
||||||
@@ -689,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))
|
||||||
return true;
|
newer = true;
|
||||||
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONFDIR, newest, file))
|
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONFDIR, newest, file))
|
||||||
return true;
|
newer = 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))
|
||||||
return true;
|
newer = 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))
|
||||||
return true;
|
newer = 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))
|
||||||
return true;
|
newer = 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))
|
||||||
return true;
|
newer = 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))
|
||||||
return true;
|
newer = 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. */
|
||||||
@@ -717,7 +715,8 @@ 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;
|
||||||
break;
|
if (newest == NULL)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rc_stringlist_free(config);
|
rc_stringlist_free(config);
|
||||||
@@ -749,15 +748,12 @@ rc_deptree_update(void)
|
|||||||
size_t i, k, l;
|
size_t i, k, l;
|
||||||
bool retval = true;
|
bool retval = true;
|
||||||
const char *sys = rc_sys();
|
const char *sys = rc_sys();
|
||||||
struct utsname uts;
|
|
||||||
|
|
||||||
/* Some init scripts need RC_LIBEXECDIR to source stuff
|
/* Some init scripts need RC_LIBEXECDIR to source stuff
|
||||||
Ideally we should be setting our full env instead */
|
Ideally we should be setting our full env instead */
|
||||||
if (!getenv("RC_LIBEXECDIR"))
|
if (!getenv("RC_LIBEXECDIR"))
|
||||||
setenv("RC_LIBEXECDIR", RC_LIBEXECDIR, 0);
|
setenv("RC_LIBEXECDIR", RC_LIBEXECDIR, 0);
|
||||||
|
|
||||||
if (uname(&uts) == 0)
|
|
||||||
setenv("RC_UNAME", uts.sysname, 1);
|
|
||||||
/* Phase 1 - source all init scripts and print dependencies */
|
/* Phase 1 - source all init scripts and print dependencies */
|
||||||
if (!(fp = popen(GENDEP, "r")))
|
if (!(fp = popen(GENDEP, "r")))
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -127,53 +127,6 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -213,64 +166,6 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -344,13 +239,6 @@ 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)
|
||||||
@@ -391,7 +279,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);
|
||||||
|
|||||||
@@ -492,7 +492,7 @@ rc_service_exists(const char *service)
|
|||||||
{
|
{
|
||||||
char *file;
|
char *file;
|
||||||
bool retval = false;
|
bool retval = false;
|
||||||
size_t len;
|
int len;
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
|
|
||||||
if (!service) {
|
if (!service) {
|
||||||
|
|||||||
@@ -87,7 +87,6 @@ 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)
|
||||||
|
|||||||
@@ -33,17 +33,10 @@
|
|||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
|
||||||
#define RC_PREFIX "@PREFIX@"
|
|
||||||
#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@"
|
||||||
#if defined(PREFIX)
|
|
||||||
#define RC_SVCDIR RC_LIBEXECDIR "/init.d"
|
#define RC_SVCDIR RC_LIBEXECDIR "/init.d"
|
||||||
#elif defined(__linux__)
|
|
||||||
#define RC_SVCDIR "@PREFIX@/run/openrc"
|
|
||||||
#else
|
|
||||||
#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"
|
||||||
@@ -368,11 +361,6 @@ 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,7 +18,6 @@ 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;
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
"Disable color output", \
|
"Disable color output", \
|
||||||
"Display software version", \
|
"Display software version", \
|
||||||
"Run verbosely", \
|
"Run verbosely", \
|
||||||
"Run quietly (Does not affect errors)"
|
"Run quietly"
|
||||||
|
|
||||||
#define case_RC_COMMON_getopt_case_C setenv ("EINFO_COLOR", "NO", 1);
|
#define case_RC_COMMON_getopt_case_C setenv ("EINFO_COLOR", "NO", 1);
|
||||||
#define case_RC_COMMON_getopt_case_h usage (EXIT_SUCCESS);
|
#define case_RC_COMMON_getopt_case_h usage (EXIT_SUCCESS);
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <features.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@@ -55,37 +56,24 @@ typedef enum {
|
|||||||
|
|
||||||
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, inode_t type,
|
do_check(char *path, uid_t uid, gid_t gid, mode_t mode, inode_t type, bool trunc)
|
||||||
bool trunc, bool chowner)
|
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int fd, flags;
|
int fd, flags;
|
||||||
int r;
|
|
||||||
int u;
|
|
||||||
|
|
||||||
if (stat(path, &st) || trunc) {
|
if (stat(path, &st)) {
|
||||||
if (type == inode_file) {
|
if (type == inode_file) {
|
||||||
einfo("%s: creating file", path);
|
einfo("%s: creating file", path);
|
||||||
if (!mode) /* 664 */
|
if (!mode) /* 664 */
|
||||||
mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
|
mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
|
||||||
flags = O_CREAT|O_NDELAY|O_WRONLY|O_NOCTTY;
|
flags = O_CREAT|O_NDELAY|O_WRONLY|O_NOCTTY;
|
||||||
#ifdef O_CLOEXEC
|
#ifdef __USE_XOPEN2K8
|
||||||
flags |= O_CLOEXEC;
|
flags |= O_CLOEXEC|O_NOFOLLOW;
|
||||||
#endif
|
|
||||||
#ifdef O_NOFOLLOW
|
|
||||||
flags |= O_NOFOLLOW;
|
|
||||||
#endif
|
#endif
|
||||||
if (trunc)
|
if (trunc)
|
||||||
flags |= O_TRUNC;
|
flags |= O_TRUNC;
|
||||||
u = umask(0);
|
if ((fd = open(path, flags, mode)) == -1) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
@@ -94,11 +82,7 @@ do_check(char *path, uid_t uid, gid_t gid, mode_t mode, inode_t type,
|
|||||||
einfo("%s: creating directory", path);
|
einfo("%s: creating directory", path);
|
||||||
if (!mode) /* 775 */
|
if (!mode) /* 775 */
|
||||||
mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;
|
mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;
|
||||||
u = umask(0);
|
if (mkdir(path, mode) == -1) {
|
||||||
/* 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;
|
||||||
@@ -108,10 +92,7 @@ do_check(char *path, uid_t uid, gid_t gid, mode_t mode, inode_t type,
|
|||||||
einfo("%s: creating fifo", path);
|
einfo("%s: creating fifo", path);
|
||||||
if (!mode) /* 600 */
|
if (!mode) /* 600 */
|
||||||
mode = S_IRUSR | S_IWUSR;
|
mode = S_IRUSR | S_IWUSR;
|
||||||
u = umask(0);
|
if (mkfifo(path, mode) == -1) {
|
||||||
r = mkfifo(path, mode);
|
|
||||||
umask(u);
|
|
||||||
if (r == -1 && errno != EEXIST) {
|
|
||||||
eerror("%s: mkfifo: %s", applet,
|
eerror("%s: mkfifo: %s", applet,
|
||||||
strerror (errno));
|
strerror (errno));
|
||||||
return -1;
|
return -1;
|
||||||
@@ -140,7 +121,7 @@ do_check(char *path, uid_t uid, gid_t gid, mode_t mode, inode_t type,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chowner && (st.st_uid != uid || st.st_gid != gid)) {
|
if (st.st_uid != uid || st.st_gid != gid) {
|
||||||
if (st.st_dev || st.st_ino)
|
if (st.st_dev || st.st_ino)
|
||||||
einfo("%s: correcting owner", path);
|
einfo("%s: correcting owner", path);
|
||||||
if (chown(path, uid, gid)) {
|
if (chown(path, uid, gid)) {
|
||||||
@@ -186,8 +167,8 @@ 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 "dDfFpm:o:W:" getoptstring_COMMON
|
#define getoptstring "dDfFpm:o:" getoptstring_COMMON
|
||||||
static const struct option longopts[] = {
|
static const struct option longopts[] = {
|
||||||
{ "directory", 0, NULL, 'd'},
|
{ "directory", 0, NULL, 'd'},
|
||||||
{ "directory-truncate", 0, NULL, 'D'},
|
{ "directory-truncate", 0, NULL, 'D'},
|
||||||
@@ -196,7 +177,6 @@ static const struct option longopts[] = {
|
|||||||
{ "pipe", 0, NULL, 'p'},
|
{ "pipe", 0, NULL, 'p'},
|
||||||
{ "mode", 1, NULL, 'm'},
|
{ "mode", 1, NULL, 'm'},
|
||||||
{ "owner", 1, NULL, 'o'},
|
{ "owner", 1, NULL, 'o'},
|
||||||
{ "writable", 1, NULL, 'W'},
|
|
||||||
longopts_COMMON
|
longopts_COMMON
|
||||||
};
|
};
|
||||||
static const char * const longopts_help[] = {
|
static const char * const longopts_help[] = {
|
||||||
@@ -207,7 +187,6 @@ static const char * const longopts_help[] = {
|
|||||||
"Create a named pipe (FIFO) if not exists",
|
"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"
|
||||||
@@ -223,20 +202,19 @@ checkpath(int argc, char **argv)
|
|||||||
struct group *gr = NULL;
|
struct group *gr = NULL;
|
||||||
inode_t type = inode_unknown;
|
inode_t type = inode_unknown;
|
||||||
int retval = EXIT_SUCCESS;
|
int retval = EXIT_SUCCESS;
|
||||||
bool trunc = false;
|
bool trunc = 0;
|
||||||
bool chowner = false;
|
|
||||||
|
|
||||||
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':
|
case 'D':
|
||||||
trunc = true;
|
trunc = 1;
|
||||||
case 'd':
|
case 'd':
|
||||||
type = inode_dir;
|
type = inode_dir;
|
||||||
break;
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
trunc = true;
|
trunc = 1;
|
||||||
case 'f':
|
case 'f':
|
||||||
type = inode_file;
|
type = inode_file;
|
||||||
break;
|
break;
|
||||||
@@ -249,16 +227,10 @@ checkpath(int argc, char **argv)
|
|||||||
applet, optarg);
|
applet, optarg);
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
chowner = true;
|
|
||||||
if (parse_owner(&pw, &gr, optarg) != 0)
|
if (parse_owner(&pw, &gr, optarg) != 0)
|
||||||
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
|
||||||
}
|
}
|
||||||
@@ -275,7 +247,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, type, trunc, chowner))
|
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, bool remount)
|
do_mount(struct ENT *ent)
|
||||||
{
|
{
|
||||||
char *argv[10];
|
char *argv[8];
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
@@ -104,24 +104,9 @@ do_mount(struct ENT *ent, bool remount)
|
|||||||
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);
|
||||||
if (!remount) {
|
argv[5] = ENT_BLOCKDEVICE(*ent);
|
||||||
argv[5] = ENT_BLOCKDEVICE(*ent);
|
argv[6] = ENT_FILE(*ent);
|
||||||
argv[6] = ENT_FILE(*ent);
|
argv[7] = NULL;
|
||||||
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));
|
||||||
@@ -142,10 +127,9 @@ do_mount(struct ENT *ent, bool remount)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#include "_usage.h"
|
#include "_usage.h"
|
||||||
#define getoptstring "MRbmop:t:" getoptstring_COMMON
|
#define getoptstring "Mbmop: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' },
|
||||||
@@ -155,7 +139,6 @@ 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",
|
||||||
@@ -171,7 +154,6 @@ 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)
|
||||||
@@ -200,9 +182,6 @@ 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;
|
||||||
@@ -282,7 +261,7 @@ fstabinfo(int argc, char **argv)
|
|||||||
END_ENT;
|
END_ENT;
|
||||||
|
|
||||||
if (!TAILQ_FIRST(files))
|
if (!TAILQ_FIRST(files))
|
||||||
eerrorx("%s: empty fstab", argv[0]);
|
eerrorx("%s: emtpy fstab", argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TAILQ_FIRST(files)) {
|
if (!TAILQ_FIRST(files)) {
|
||||||
@@ -308,11 +287,7 @@ fstabinfo(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case OUTPUT_MOUNT:
|
case OUTPUT_MOUNT:
|
||||||
result += do_mount(ent, false);
|
result += do_mount(ent);
|
||||||
break;
|
|
||||||
|
|
||||||
case OUTPUT_REMOUNT:
|
|
||||||
result += do_mount(ent, true);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OUTPUT_MOUNTARGS:
|
case OUTPUT_MOUNTARGS:
|
||||||
|
|||||||
@@ -393,7 +393,8 @@ mountinfo(int argc, char **argv)
|
|||||||
bool quiet;
|
bool quiet;
|
||||||
char *this_path;
|
char *this_path;
|
||||||
|
|
||||||
quiet = rc_yesno(getenv("EINFO_QUIET"));
|
/* Ensure that we are only quiet when explicitly told to be */
|
||||||
|
unsetenv("EINFO_QUIET");
|
||||||
|
|
||||||
#define DO_REG(_var) \
|
#define DO_REG(_var) \
|
||||||
if (_var) free(_var); \
|
if (_var) free(_var); \
|
||||||
@@ -474,6 +475,7 @@ mountinfo(int argc, char **argv)
|
|||||||
REG_FREE(args.skip_options_regex);
|
REG_FREE(args.skip_options_regex);
|
||||||
|
|
||||||
result = EXIT_FAILURE;
|
result = EXIT_FAILURE;
|
||||||
|
quiet = rc_yesno(getenv("EINFO_QUIET"));
|
||||||
|
|
||||||
/* We should report the mounts in reverse order to ease unmounting */
|
/* We should report the mounts in reverse order to ease unmounting */
|
||||||
TAILQ_FOREACH_REVERSE(s, nodes, rc_stringlist, entries) {
|
TAILQ_FOREACH_REVERSE(s, nodes, rc_stringlist, entries) {
|
||||||
|
|||||||
@@ -253,38 +253,13 @@ 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;
|
int idx = 0;
|
||||||
RC_SERVICE state, bit;
|
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
service = argv[1];
|
service = argv[1];
|
||||||
@@ -294,11 +269,21 @@ 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);
|
||||||
|
|
||||||
state = rc_service_state(service);
|
if (strcmp(applet, "service_started") == 0)
|
||||||
bit = lookup_service_state(applet);
|
ok = (rc_service_state(service) & RC_SERVICE_STARTED);
|
||||||
if (bit) {
|
else if (strcmp(applet, "service_stopped") == 0)
|
||||||
ok = (state & bit);
|
ok = (rc_service_state(service) & RC_SERVICE_STOPPED);
|
||||||
} else if (strcmp(applet, "service_started_daemon") == 0) {
|
else if (strcmp(applet, "service_inactive") == 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) {
|
||||||
@@ -330,34 +315,37 @@ 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;
|
||||||
RC_SERVICE bit;
|
size_t l;
|
||||||
/* size_t l; */
|
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
service = argv[1];
|
service = argv[1];
|
||||||
else
|
else
|
||||||
service = svcname;
|
service = getenv("RC_SVCNAME");
|
||||||
|
|
||||||
if (service == NULL || *service == '\0')
|
if (service == NULL || *service == '\0')
|
||||||
eerrorx("%s: no service specified", applet);
|
eerrorx("%s: no service specified", applet);
|
||||||
|
|
||||||
if (!strncmp(applet, "mark_", 5) &&
|
if (strcmp(applet, "mark_service_started") == 0)
|
||||||
(bit = lookup_service_state(applet + 5)))
|
ok = rc_service_mark(service, RC_SERVICE_STARTED);
|
||||||
ok = rc_service_mark(service, bit);
|
else if (strcmp(applet, "mark_service_stopped") == 0)
|
||||||
|
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)
|
||||||
@@ -367,7 +355,6 @@ 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);
|
||||||
@@ -376,7 +363,6 @@ 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;
|
||||||
@@ -414,7 +400,7 @@ do_value(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
shell_var(int argc, char **argv)
|
do_shell_var(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *p;
|
char *p;
|
||||||
@@ -435,127 +421,106 @@ 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)
|
||||||
{
|
{
|
||||||
size_t i;
|
int i = 2;
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(applets); ++i)
|
/* These are designed to be applications in their own right */
|
||||||
if (!strcmp(applet, applets[i].name))
|
if (strcmp(applet, "fstabinfo") == 0)
|
||||||
exit(applets[i].applet(argc, argv));
|
exit(fstabinfo(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 (errno != EROFS && ((strcmp(level, RC_LEVEL_SHUTDOWN) != 0) && (strcmp(level, RC_LEVEL_SYSINIT) != 0))) {
|
if ((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,9 +288,8 @@ 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 (errno != EROFS && ((strcmp(level, RC_LEVEL_SHUTDOWN) != 0) && (strcmp(level, RC_LEVEL_SYSINIT) != 0)))
|
if (unlink(TMPLOG) == -1)
|
||||||
if (unlink(TMPLOG) == -1)
|
eerror("Error: unlink(%s) failed: %s", TMPLOG, strerror(errno));
|
||||||
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);
|
||||||
|
|
||||||
|
|||||||
@@ -191,10 +191,6 @@ env_config(void)
|
|||||||
if (sys)
|
if (sys)
|
||||||
setenv("RC_SYS", sys, 1);
|
setenv("RC_SYS", sys, 1);
|
||||||
|
|
||||||
#ifdef PREFIX
|
|
||||||
setenv("RC_PREFIX", RC_PREFIX, 1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Some scripts may need to take a different code path if
|
/* Some scripts may need to take a different code path if
|
||||||
Linux/FreeBSD, etc
|
Linux/FreeBSD, etc
|
||||||
To save on calling uname, we store it in an environment variable */
|
To save on calling uname, we store it in an environment variable */
|
||||||
@@ -335,12 +331,3 @@ 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,6 +167,52 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -306,6 +352,15 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -333,11 +388,11 @@ set_krunlevel(const char *level)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t
|
static int
|
||||||
get_krunlevel(char *buffer, int buffer_len)
|
get_krunlevel(char *buffer, int buffer_len)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
size_t i = 0;
|
int i = 0;
|
||||||
|
|
||||||
if (!exists(RC_KRUNLEVEL))
|
if (!exists(RC_KRUNLEVEL))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -658,7 +713,6 @@ 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",
|
||||||
@@ -793,13 +847,6 @@ 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,
|
||||||
@@ -833,9 +880,16 @@ main(int argc, char **argv)
|
|||||||
eerrorx("%s: %s", applet, strerror(errno));
|
eerrorx("%s: %s", applet, strerror(errno));
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
case 'S':
|
case 'S':
|
||||||
bootlevel = rc_sys();
|
if (rc_conf_value("rc_sys")) {
|
||||||
if (bootlevel)
|
bootlevel = rc_sys_v2();
|
||||||
printf("%s\n", bootlevel);
|
if (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
|
||||||
@@ -915,9 +969,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 = rc_proc_getent("rc_runlevel");
|
p = proc_getent("rc_runlevel");
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
p = rc_proc_getent("softlevel");
|
p = proc_getent("softlevel");
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
set_krunlevel(p);
|
set_krunlevel(p);
|
||||||
free(p);
|
free(p);
|
||||||
@@ -1069,7 +1123,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
/* mark any services skipped as started */
|
/* mark any services skipped as started */
|
||||||
proc = p = rc_proc_getent("noinit");
|
proc = p = 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);
|
||||||
@@ -1090,7 +1144,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
/* mark any services skipped as stopped */
|
/* mark any services skipped as stopped */
|
||||||
proc = p = rc_proc_getent("noinit");
|
proc = p = 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);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user