Compare commits

..

4 Commits

Author SHA1 Message Date
Robin H. Johnson
e4ce98b3b4 Bugfix release, tracker bug #401555. 2012-01-30 19:54:55 +00:00
Robin H. Johnson
04e6696782 Bump minor version. 2012-01-25 10:46:58 -08:00
Robin H. Johnson
85193674da net/bonding: Fix which interface IPs get added to.
The previous bonding change of ensuring interfaces were down to add
slave interfaces, but it clobbered the IFACE variable, because it was
being passed to a bash function rather than a command.

Cherry-picked from master/c92f0ab702.

X-Gentoo-Bug: 400613
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=400613
Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
2012-01-25 10:46:25 -08:00
Robin H. Johnson
a73c26a70b net/ethtool: Fix program call.
I missed removing a call to the old ethtool function wrapper that was
made unneeded by commit d02d3af02.

Cherry-picked from master/fdc8849e.

X-Gentoo-Bug: 399037
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=399037
Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
2012-01-25 10:38:09 -08:00
108 changed files with 840 additions and 2006 deletions

View File

@@ -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

View File

@@ -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
View File

@@ -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

View File

@@ -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
View File

@@ -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.

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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=""

View File

@@ -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`

View File

@@ -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.

View File

@@ -1,3 +0,0 @@
# Extra options for tmpfiles.sh
#tmpfiles_opts="--verbose"
tmpfiles_opts=""

View File

@@ -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

View File

@@ -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} $^ > $@

View File

@@ -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@"

View File

@@ -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"

View File

@@ -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@"

View File

@@ -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
View File

@@ -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

View File

@@ -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 \

View File

@@ -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

View File

@@ -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
: :

View File

@@ -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
} }

View File

@@ -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()

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)$"

View File

@@ -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
} }

View File

@@ -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
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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

View File

@@ -6,8 +6,7 @@ description="Saves a kernel dump."
depend() depend()
{ {
need dumpon localmount need localmount
before encswap
keyword -jail -prefix keyword -jail -prefix
} }

View File

@@ -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"
} }

View File

@@ -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

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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()

View File

@@ -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 $$?; \

View File

@@ -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 .

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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})"; \

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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()

View File

@@ -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
}

View File

@@ -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"
} }

View File

@@ -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
;; ;;

View File

@@ -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}"

View File

@@ -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
View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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() {

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 $?

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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 "";

View File

@@ -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;

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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)

View File

@@ -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.

View File

@@ -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;

View File

@@ -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);

View File

@@ -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++;
} }

View File

@@ -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:

View File

@@ -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) {

View File

@@ -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);
} }

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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