Compare commits

..

6 Commits

Author SHA1 Message Date
Robin H. Johnson
aac509837e Bump version. 2012-03-11 13:04:51 -07:00
Robin H. Johnson
2a84a8081e Merge branch 'master' into openrc-0.9.9.x 2012-03-11 12:56:13 -07:00
William Hubbs
ba457f1fed Release openrc-0.9.9.2 2012-02-25 20:50:36 -06:00
William Hubbs
722871c0ae librc: make rc_proc_getent available for all operating systems
This looks up an option on the kernel command line. For now, it works on
linux and returns NULL on the bsds, but we are definitely open to
patches for that side.
2012-02-25 15:41:31 -06:00
William Hubbs
d670dbddf7 Release openrc-0.9.9.1 2012-02-24 11:13:27 -06:00
William Hubbs
f1a19aed78 Skip pam if running as root
Reported-by: Piotr Karbowski <piotr.karbowski@gmail.com>
X-Gentoo-Bug: 386623
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=386623
2012-02-24 09:06:51 -06:00
100 changed files with 587 additions and 1322 deletions

View File

@@ -4,12 +4,7 @@
include Makefile.inc
SUBDIR= conf.d etc init.d local.d man scripts sh src sysctl.d
# Build our old net foo or not
ifeq (${MKNET},oldnet)
SUBDIR+= net doc
endif
SUBDIR= conf.d doc etc init.d local.d sysctl.d man net scripts sh src
# Build pkgconfig or not
MKPKGCONFIG?= yes
@@ -30,10 +25,6 @@ include ${MK}/dist.mk
include ${MK}/git.mk
_installafter:
ifeq (${MKPREFIX},yes)
${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/init.d
else ifneq (${OS},Linux)
${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/init.d
endif
${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/tmp
${ECHO} "${VERSION}${GITVER}" > ${DESTDIR}/${LIBEXECDIR}/version

View File

@@ -1,3 +1,3 @@
NAME= openrc
VERSION= 0.11.1
VERSION= 0.9.9.3
PKG= ${NAME}-${VERSION}

4
README
View File

@@ -10,9 +10,7 @@ You may wish to tweak the installation with the below arguments
PROGLDFLAGS=-static
LIBNAME=lib64
DESTDIR=/tmp/openrc-image
MKNET=oldnet
MKPAM=pam
MKPREFIX=yes
MKPKGCONFIG=no
MKSELINUX=yes
MKSTATICLIBS=no
@@ -26,8 +24,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.
If you debug memory under valgrind, add -DDEBUG_MEMORY to your CPPFLAGS
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
BRANDING=\"Gentoo/$(uname -s)\"

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.

View File

@@ -1,11 +1,9 @@
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
CLEANFILES+= network staticroute
endif
MK= ../mk
include ${MK}/os.mk

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
# 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.
# 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"
# 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
# console. See dmesg(1) for more info.
# console. See dmesg(8) for more info.
dmesg_level="1"

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...
# Prefer ifconfig over iproute2
#modules="!iproute2"
#modules="ifconfig"
# You can also specify other modules for an interface
# 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
# To prefer ifconfig over iproute2
#modules="!iproute2"
#modules="ifconfig"
# For a static configuration, use something like this
# (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
# 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'
# functionality. If you previously relied on the DEV_PLUS_VID or
# 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
# functionality.
#vlan1_name="vlan1"
#eth0_vlan2_name="eth0.2"
#eth1_vlan2_name="eth1.2"
#vlan2_name="eth0.2"
# The following shows the old set_name_type setting and what new option to set:
# Using eth9 & VLAN VID 26 as an example.
# VLAN_PLUS_VID vlan26_name="vlan0026"
# VLAN_PLUS_VID_NO_PAD vlan26_name="vlan26"
# DEV_PLUS_VID eth9_vlan26_name="eth9.0026"
# DEV_PLUS_VID_NO_PAD eth9_vlan26_name="eth9.26"
# DEV_PLUS_VID vlan26_name="eth9.0026"
# DEV_PLUS_VID_NO_PAD vlan26_name="eth9.26"
# Set the vlan flags
#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
#vlan1_ingress="2:6 3:5"
#eth0_vlan1_egress="1:2"
#vlan1_egress="1:2"
#config_vlan1="172.16.2.1/24"
#config_vlan2="172.16.3.1/24"
#config_eth0_1="172.16.4.1/24"
#config_eth1_1="172.16.5.1/24"
#config_vlan1="172.16.3.1/23"
#config_vlan2="172.16.2.1/23"
# NOTE: Vlans can be configured with a . in their interface names
# When configuring vlans with this name type, you need to replace . with a _
@@ -624,39 +616,15 @@
#slaves_bond0="eth0 eth1 eth2"
#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
# a bond interface yourself. If you do so, the kernel and your network switches
# may not work quite right. It is permissible to set the MAC addresses of bond
# slaves BEFORE the bond comes up, but not after the bond is up (it will change
# MAC addresses of the slaves on it's own).
# You can also configure the parameters of the bond here, which must be done
# via sysfs on 2.6 kernels or newer. The description of all the options can be
# found in the kernel: /usr/src/linux-*/Documentation/networking/bonding.txt
# You will probably want the 'mode' option at the least.
# Some possible parameters: mode fail_over_mac arp_validate arp_interval
# arp_ip_target downdelay updelay lacp_rate ad_select xmit_hash_policy
# num_grat_arp num_unsol_na miimon primary primary_reselect use_carrier
# active_slave queue_id all_slaves_active resend_igmp min_links
#mode_bond0="round-robin"
#miimon_bond0="100"
# You can also configure the bond here, which must be done via sysfs on 2.6
# kernels or newer. See the kernel bonding documentation for a description of
# these options.
#arp_ip_target_bond0="+26.0.0.0"
# If any of the slaves require extra configuration - for example wireless or
# ppp devices - we need to depend function on the bonded interfaces
#rc_net_bond0_need="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
@@ -812,8 +780,6 @@
#-----------------------------------------------------------------------------
# MAC changer
# Warning: Do NOT use this on bonding interfaces! Bonding changes MACs itself.
#
# To set a specific MAC address
#mac_eth0="00:11:22:33:44:55"

View File

@@ -4,7 +4,6 @@
# This is the subsystem type. Valid options on FreeBSD:
# "" - nothing special
# "jail" - FreeBSD jails
# "prefix" - Prefix
# If this is commented out, automatic detection will be used.
#
# This should be set to the value representing the environment this file is

View File

@@ -5,7 +5,6 @@
# "" - nothing special
# "lxc" - Linux Containers
# "openvz" - Linux OpenVZ
# "prefix" - Prefix
# "uml" - Usermode Linux
# "vserver" - Linux vserver
# "xen0" - Xen0 Domain
@@ -19,11 +18,3 @@
# This is the number of tty's used in most of the rc-scripts (like
# consolefont, numlock, etc ...)
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

@@ -3,7 +3,6 @@
# This is the subsystem type. Valid options on NetBSD:
# "" - nothing special
# "prefix" - Prefix
# "xen0" - Xen0 Domain
# "xenU" - XenU Domain
# If this is commented out, automatic detection will be used.

2
init.d/.gitignore vendored
View File

@@ -41,5 +41,3 @@ syslogd
termencoding
ttys
wscons
tmpfilesd.boot
tmpfilesd.sysinit

View File

@@ -1,19 +1,12 @@
DIR= ${INITDIR}
SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in netmount.in \
root.in savecache.in swap.in swapfiles.in \
tmpfilesd.boot.in tmpfilesd.sysinit.in \
network.in root.in savecache.in staticroute.in swap.in swapfiles.in \
swclock.in sysctl.in urandom.in ${SRCS-${OS}}
BIN= ${OBJS}
# Build our old net foo or not
ifeq (${MKNET},)
SRCS+= network.in staticroute.in
endif
ifeq (${MKNET},oldnet)
INSTALLAFTER= _installafter_net.lo
SRCS+= net.lo.in
endif
CLEANFILES+= net.lo
TARGETS+= net.lo
MK= ../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 \
rpcbind.in savecore.in syslogd.in
# These are FreeBSD specific
SRCS-FreeBSD+= adjkerntz.in devd.in dumpon.in encswap.in ipfw.in \
mixer.in nscd.in powerd.in syscons.in
SRCS-FreeBSD+= adjkerntz.in devd.in dumpon.in ipfw.in mixer.in nscd.in \
powerd.in syscons.in
NET_LO-Linux= net.lo
SRCS-Linux= devfs.in dmesg.in hwclock.in consolefont.in keymaps.in \

View File

@@ -22,7 +22,7 @@ depend()
[ "$clock" != "UTC" -a ! -e /etc/wall_cmos_clock ]; then
need root
fi
keyword -jail -prefix
keyword -jail
}
start()

View File

@@ -7,7 +7,7 @@ depend()
need localmount
before logger
after clock sysctl
keyword -prefix -timeout
keyword -timeout
}
: ${wipe_tmp:=${WIPE_TMP:-yes}}
@@ -112,7 +112,7 @@ start()
fi
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/run /run
fi
@@ -196,5 +196,3 @@ stop()
return 0
}
# vim: ft=sh

View File

@@ -8,7 +8,7 @@ depend()
{
need localmount termencoding
after hotplug bootmisc
keyword -openvz -prefix -uml -vserver -xenu -lxc
keyword -openvz -uml -vserver -xenu -lxc
}
start()

View File

@@ -10,7 +10,7 @@ depend() {
need localmount
after bootmisc
before net.lo0
keyword -jail -prefix
keyword -jail
}
start_pre() {

View File

@@ -5,9 +5,8 @@
description="Mount system critical filesystems in /dev."
depend() {
use dev-mount
before dev
keyword -prefix -vserver
use dev
keyword -vserver
}
start() {

View File

@@ -7,7 +7,7 @@ description="Set the dmesg level for a cleaner boot"
depend()
{
before dev modules
keyword -lxc -prefix -vserver
keyword -vserver
}
start()

View File

@@ -6,7 +6,7 @@ description="Configures a specific kernel dump device."
depend() {
need swap
keyword -jail -prefix
keyword -jail
}
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

@@ -9,7 +9,7 @@ _IFS="
depend()
{
use dev clock modules
keyword -jail -openvz -prefix -timeout -vserver -lxc
keyword -jail -openvz -timeout -vserver -lxc
}
_abort() {
@@ -71,12 +71,7 @@ start()
done
if [ "$RC_UNAME" = Linux ]; then
local skiptypes x
for x in $net_fs_list $extra_net_fs_list; do
skiptypes="${skiptypes}no${x},"
done
skiptypes="${skiptypes}noopts=_netdev"
fsck_opts="$fsck_opts -C0 -T -t $skiptypes"
fsck_opts="$fsck_opts -C0 -T"
if [ -z "$fsck_passno" -a -z "$fsck_mnt" ]; then
fsck_args=${fsck_args--A -p}
if echo 2>/dev/null >/.test.$$; then

View File

@@ -9,7 +9,7 @@ depend()
{
use root
before devd net
keyword -jail -prefix
keyword -jail
}
_set()

View File

@@ -5,7 +5,7 @@
description="Sets the hostname of the machine."
depend() {
keyword -prefix -lxc
keyword -lxc
}
start()

View File

@@ -28,7 +28,7 @@ depend()
else
before *
fi
keyword -openvz -prefix -uml -vserver -xenu -lxc
keyword -openvz -uml -vserver -xenu -lxc
}
setupopts()

View File

@@ -8,7 +8,7 @@ depend()
{
need localmount termencoding
after bootmisc
keyword -openvz -prefix -uml -vserver -xenu -lxc
keyword -openvz -uml -vserver -xenu -lxc
}
start()

View File

@@ -4,11 +4,6 @@
description="Kill all processes so we can unmount disks cleanly."
depend()
{
keyword -prefix
}
start()
{
ebegin "Terminating remaining processes"

View File

@@ -9,7 +9,7 @@ depend()
need fsck
use lvm modules mtab
after lvm modules
keyword -jail -openvz -prefix -vserver -lxc
keyword -jail -openvz -vserver -lxc
}
start()
@@ -33,7 +33,6 @@ start()
stop()
{
yesno $RC_GOINGDOWN || return 0
# We never unmount / or /dev or $RC_SVCDIR
# Bug 381783
@@ -48,7 +47,7 @@ stop()
done
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
no_umounts_r="^($no_umounts_r)$"

View File

@@ -7,7 +7,7 @@ extra_commands="restore"
depend()
{
need localmount
keyword -jail -prefix
keyword -jail
}
restore()

View File

@@ -7,7 +7,7 @@ description="Loads a user defined list of kernel modules."
depend()
{
use isapnp
keyword -openvz -prefix -vserver -lxc
keyword -openvz -vserver -lxc
}
start()

View File

@@ -7,13 +7,11 @@ description="Re-mount filesytems read-only for a clean reboot."
depend()
{
need killprocs savecache
keyword -openvz -prefix -vserver -lxc
keyword -openvz -vserver -lxc
}
start()
{
local ret=0
# Flush all pending disk writes now
sync; sync
@@ -25,7 +23,7 @@ start()
# Bug 381783
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"
# RC_NO_UMOUNTS is an env var that can be set by plugins
local IFS="$IFS:"
@@ -41,9 +39,6 @@ start()
do_unmount "umount -r" \
--skip-point-regex "$m" \
"${fs:+--skip-fstype-regex}" $fs --nonetdev
ret=$?
eoutdent
eend $ret
eend $?
}

View File

@@ -16,7 +16,7 @@ depend()
{
need localmount
after bootmisc
keyword -jail -prefix
keyword -jail
}
start()

View File

@@ -7,7 +7,6 @@ description="Update /etc/mtab to match what the kernel knows about"
depend()
{
need root
keyword -prefix
}
start()

View File

@@ -19,14 +19,11 @@ depend()
local IFVAR=$(shell_var "${IFACE}")
need localmount
if [ "$RC_UNAME" = Linux -a "$IFACE" != lo ]; then
need sysfs
fi
after bootmisc
keyword -jail -prefix -vserver
keyword -jail -vserver
case "${IFACE}" in
lo|lo0) ;;
lo|lo0) provide lo;;
*)
after net.lo net.lo0 dbus
provide net

View File

@@ -2,27 +2,62 @@
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
description="Mounts network shares, other than NFS, 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.
# It is best to allow nfs-utils to handle all nfs shares.
description="Mounts network shares according to /etc/fstab."
need_portmap()
{
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()
{
# 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
need net
need net $pmap
use afc-client amd autofs openvpn
use dns
keyword -jail -prefix -vserver
use dns nfs nfsmount portmap rpcbind rpc.statd rpc.lockd
keyword -jail -vserver
}
start()
{
local myneed= myuse= pmap="portmap" nfsmounts=
[ -x @SYSCONFDIR@/init.d/rpcbind ] && pmap="rpcbind"
local x= fs= rc=
for x in $net_fs_list $extra_net_fs_list; do
case "$x" in
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
fs="$fs${fs:+,}$x"
@@ -47,14 +82,7 @@ stop()
. "$RC_LIBEXECDIR"/sh/rc-mount.sh
for x in $net_fs_list $extra_net_fs_list; do
case "$x" in
nfs|nfs4)
continue
;;
*)
fs="$fs${fs:+,}$x"
;;
esac
fs="$fs${fs:+,}$x"
done
if [ -n "$fs" ]; then
umount -at $fs || eerror "Failed to simply unmount filesystems"
@@ -63,14 +91,7 @@ stop()
eindent
fs=
for x in $net_fs_list $extra_net_fs_list; do
case "$x" in
nfs|nfs4)
continue
;;
*)
fs="$fs${fs:+|}$x"
;;
esac
fs="$fs${fs:+|}$x"
done
[ -n "$fs" ] && fs="^($fs)$"
do_unmount umount ${fs:+--fstype-regex} $fs --netdev

View File

@@ -12,10 +12,8 @@ depend()
{
need localmount
after bootmisc
if [ -n "$(interfaces)" ]; then
provide net
fi
keyword -jail -prefix -vserver
provide net
keyword -jail -vserver
}
uniqify()
@@ -221,6 +219,12 @@ start()
eend $?
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"
routeflush
if [ "$RC_UNAME" = "Linux" ]; then

View File

@@ -7,7 +7,6 @@ required_files="/etc/newsyslog.conf"
depend()
{
need localmount
keyword -prefix
}
start()

View File

@@ -9,7 +9,7 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
depend()
{
need localmount
keyword -openvz -prefix -vserver -lxc
keyword -openvz -vserver -lxc
}
_setleds()

View File

@@ -11,7 +11,7 @@ extra_started_commands="reload"
depend() {
need localmount
keyword -jail -prefix
keyword -jail
}
start()

View File

@@ -12,7 +12,7 @@ depend()
need localmount
use logger
after bootmisc
keyword -jail -prefix
keyword -jail
}
start_pre()

View File

@@ -8,7 +8,7 @@ depend()
{
use modules devfs
need localmount
keyword -openvz -prefix -vserver -lxc
keyword -openvz -vserver -lxc
}
start()
@@ -41,7 +41,7 @@ start()
fi
fi
[ "$RC_SYS" = "OPENVZ" ] && return 0
[ "$RC_SYS" == "OPENVZ" ] && return 0
# Check what USB fs the kernel support. Currently
# 2.5+ kernels, and later 2.4 kernels have 'usbfs',

View File

@@ -7,7 +7,6 @@ depend()
need localmount net
after *
before local
keyword -prefix
}
start()

View File

@@ -7,7 +7,7 @@ description="Mount the root fs read/write"
depend()
{
need fsck
keyword -jail -openvz -prefix -vserver -lxc
keyword -jail -openvz -vserver -lxc
}
start()

View File

@@ -13,14 +13,6 @@ start()
return 1
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"
local rc=
if [ ! -d "$RC_LIBEXECDIR"/cache ]; then

View File

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

View File

@@ -12,7 +12,7 @@ depend()
{
provide net
use network
keyword -jail -prefix -vserver
keyword -jail -vserver
}
pre_flight_checks()
@@ -93,6 +93,11 @@ do_routes()
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"
}

View File

@@ -5,7 +5,7 @@
depend()
{
before fsck
keyword -jail -prefix
keyword -jail
}
start()

View File

@@ -5,7 +5,7 @@
depend()
{
before localmount
keyword -jail -openvz -prefix -vserver -lxc
keyword -jail -openvz -vserver -lxc
}
start()

View File

@@ -31,16 +31,14 @@ stop()
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
while read filename type rest; do
case "$type" in
file) swapoff $filename >/dev/null;;
esac
case "$filename" in
/dev/loop*) swapoff $filename >/dev/null;;
esac
done < /proc/swaps
;;
esac
eend 0

View File

@@ -8,7 +8,7 @@ depend()
{
before *
provide clock
keyword -openvz -prefix -uml -vserver -xenu -lxc
keyword -openvz -uml -vserver -xenu -lxc
}
# swclock is an OpenRC built in

View File

@@ -4,7 +4,7 @@
depend() {
need localmount
keyword -jail -prefix
keyword -jail
}
start() {

View File

@@ -5,7 +5,6 @@
depend()
{
before bootmisc logger
keyword -prefix
}
start()
@@ -14,7 +13,7 @@ start()
local retval=0 var= comments= conf=
ebegin "Configuring kernel parameters"
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
vebegin "applying $conf"
while read var comments; do

View File

@@ -5,7 +5,7 @@
depend()
{
before bootmisc logger
keyword -lxc -prefix -vserver
keyword -vserver
}
start()
@@ -15,12 +15,12 @@ start()
ebegin "Configuring kernel parameters"
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
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}"
sysctl -e -p "${conf}" >/dev/null
sysctl -q -e -p "${conf}"
fi
veend $? || retval=1
fi

View File

@@ -6,7 +6,7 @@ description="Mount the sys filesystem."
depend()
{
keyword -lxc -prefix -vserver
keyword -vserver
}
mount_sys()
@@ -74,6 +74,7 @@ mount_misc()
mount_cgroups()
{
yesno ${rc_cgroups:-YES} && [ -e /proc/cgroups ] && \
mountinfo -q /sys/fs/cgroup || return 0
local agent="@LIBEXECDIR@/sh/cgroup-release-agent.sh"
@@ -82,8 +83,6 @@ mount_cgroups()
-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
case "${enabled}" in
1) mkdir /sys/fs/cgroup/${name}

View File

@@ -16,5 +16,4 @@ depend()
use net newsyslog
need localmount
after bootmisc
keyword -prefix
}

View File

@@ -9,7 +9,7 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
depend()
{
keyword -lxc -openvz -prefix -uml -vserver -xenu
keyword -openvz -uml -vserver -xenu
use root
after bootmisc
}

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

@@ -5,7 +5,6 @@
depend()
{
after fsck
keyword -prefix
}
start()

View File

@@ -8,7 +8,7 @@ description="Initializes the random number generator."
depend()
{
need localmount
keyword -jail -lxc -openvz -prefix
keyword -jail -openvz
}
save_seed()

View File

@@ -5,7 +5,6 @@
depend()
{
need localmount
keyword -prefix
}
start()

View File

@@ -37,7 +37,7 @@
.Op Ar command ...
.Sh DESCRIPTION
.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.
When a service runs a command it first loads its multiplexed configuration
file, then its master configuration file, then
@@ -124,10 +124,6 @@ Display name used for the above defined command.
.It Ar retry
Retry schedule to use when stopping the daemon. It can either be a
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
.Sh DEPENDENCIES
You should define a
@@ -156,7 +152,7 @@ We provide this virtual service. For example, named provides dns.
.It Ic config
We should recalculate our dependencies if the listed files have changed.
.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
.It Dv -shutdown
Don't stop this service when shutting the system down.
@@ -180,8 +176,6 @@ in
Same as -jail, but for Linux Resource Containers (LXC).
.It Dv -openvz
Same as -jail, but for OpenVZ systems.
.It Dv -prefix
Same as -jail, but for Prefix systems.
.It Dv -uml
Same as -jail, but for UML systems.
.It Dv -vserver
@@ -352,14 +346,8 @@ Default runlevel chosen. Default is default.
.It Va RC_SYS
A special variable to describe the system more.
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
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
.Sh FILES
.Pp
@@ -396,9 +384,8 @@ rc_provide_tap1="!net"
# To put in in /etc/rc.conf you would do it like this
rc_net_tap1_provide="!net"
# It's also possible to negate keywords. This is mainly useful for prefix
# users testing OpenRC.
rc_keyword="!-prefix"
# It's also possible to negate keywords.
rc_keyword="-keyword"
.Ed
.Sh EXAMPLES
.Pp
@@ -447,22 +434,8 @@ depend()
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()
{
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
checkpath --dir --owner foo:foo --mode 0664 \\
/var/run/foo /var/cache/foo

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?= ${_OS}
include ${MK}/os-${OS}.mk
include ${MK}/os-prefix.mk
RC_LIB= /$(LIBNAME)/rc

View File

@@ -11,14 +11,9 @@ SED?= sed
SH= /bin/sh
PREFIX?=
ifeq (${PREFIX},)
UPREFIX= /usr
else
UPREFIX= ${PREFIX}
ifeq (${MKPREFIX},yes)
UPREFIX= ${PREFIX}/usr
endif
endif
_UPREFIX_SH= case "${PREFIX}" in "") echo /usr;; *) echo "${PREFIX}";; esac
_UPREFIX:= $(shell ${_UPREFIX_SH})
UPREFIX= ${_UPREFIX}
LOCAL_PREFIX= /usr/local
PICFLAG?= -fPIC

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 \
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 \
vlan.sh macvlan.sh ip6rd.sh
vlan.sh macvlan.sh
SRCS-NetBSD=
INC-NetBSD= ifwatchd.sh

View File

@@ -4,12 +4,6 @@
bonding_depend()
{
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"
@@ -29,9 +23,6 @@ bonding_pre_start()
eval primary="\$primary_${IFVAR}"
unset primary_${IFVAR}
eval subsume="\$subsume_${IFVAR}"
unset subsume_${IFVAR}
[ -z "${slaves}" ] && return 0
@@ -43,10 +34,6 @@ bonding_pre_start()
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
# requires sysfs
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
# All other options
[ -d /sys/class/net ] && 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
for x in /sys/class/net/"${IFACE}"/bonding/mode; do
[ -f "${x}" ] || continue
n=${x##*/}
eval s=\$${n}_${IFVAR}
@@ -86,11 +62,11 @@ bonding_pre_start()
fi
done
# 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
n=${x##*/}
eval s=\$${n}_${IFVAR}
[ "${n}" != "mode" -o "${n}" != "miimon" ] || continue
[ "${n}" != "mode" ] || continue
if [ -n "${s}" ]; then
einfo "Setting ${n}: ${s}"
echo "${s}" >"${x}" || \
@@ -108,44 +84,15 @@ bonding_pre_start()
_exists true || return 1
done
# Unless we are subsuming an existing interface (NFS root), we down
# slave interfaces to work around bugs supposedly in some chipsets
# that cause failure to enslave from other states.
if [ -z "${subsume}" ]; then
for IFACE in ${slaves}; do
_delete_addresses
_down
done
fi
# Must force the slaves to a particular state before adding them
for IFACE in ${slaves}; do
_delete_addresses
_down
done
)
# Now force the master to up
# - First test for interface subsume request (required for NFS root)
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
# now force the master to up
_up
# finally add in slaves
# things needed in the process, and if they are done by ifenslave, openrc, and/or the kernel.
@@ -174,7 +121,7 @@ bonding_pre_start()
fi
done
else
ifenslave "${IFACE}" ${slaves} >/dev/null
/sbin/ifenslave "${IFACE}" ${slaves} >/dev/null
fi
eend $?
@@ -185,11 +132,6 @@ bonding_stop()
{
_is_bond || return 0
# Wipe subsumed interface
if [ -n "${subsume}" ]; then
ifconfig ${subsume} 0.0.0.0
fi
local slaves= s=
slaves=$( \
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
done
else
ifenslave -d "${IFACE}" ${slaves}
/sbin/ifenslave -d "${IFACE}" ${slaves}
fi
# reset all slaves

View File

@@ -119,8 +119,10 @@ bridge_pre_start()
return 1
fi
# The interface is known to exist now
_set_flag promisc
_up
if ! brctl addif "${BR_IFACE}" "${x}"; then
_set_flag -promisc
eend 1
return 1
fi
@@ -142,7 +144,6 @@ bridge_pre_start()
) || return 1
# Bring up the bridge
_set_flag promisc
_up
}

View File

@@ -24,19 +24,19 @@ _exists()
_ifindex()
{
local index=-1
local f v
if [ -e /sys/class/net/"${IFACE}"/ifindex ]; then
index=$(cat /sys/class/net/"${IFACE}"/ifindex)
else
for f in /sys/class/net/*/ifindex ; do
v=$(cat $f)
[ $v -gt $index ] && index=$v
done
: $(( index += 1 ))
fi
echo "${index}"
return 0
local line= i=-2
while read line; do
: $(( i += 1 ))
[ ${i} -lt 1 ] && continue
case "${line}" in
"${IFACE}:"*) echo "${i}"; return 0;;
esac
done < /proc/net/dev
# Return the next available index
: $(( i += 1 ))
echo "${i}"
return 1
}
_is_wireless()

View File

@@ -10,12 +10,12 @@ iproute2_depend()
_up()
{
ip link set dev "${IFACE}" up
ip link set "${IFACE}" up
}
_down()
{
ip link set dev "${IFACE}" down
ip link set "${IFACE}" down
}
_exists()
@@ -25,19 +25,19 @@ _exists()
_ifindex()
{
local index=-1
local f v
if [ -e /sys/class/net/"${IFACE}"/ifindex ]; then
index=$(cat /sys/class/net/"${IFACE}"/ifindex)
else
for f in /sys/class/net/*/ifindex ; do
v=$(cat $f)
[ $v -gt $index ] && index=$v
done
: $(( index += 1 ))
fi
echo "${index}"
return 0
local line= i=-2
while read line; do
: $(( i += 1 ))
[ ${i} -lt 1 ] && continue
case "${line}" in
"${IFACE}:"*) echo "${i}"; return 0;;
esac
done < /proc/net/dev
# Return the next available index
: $(( i += 1 ))
echo "${i}"
return 1
}
_is_wireless()
@@ -57,7 +57,7 @@ _set_flag()
flag=${flag#-}
opt="off"
fi
ip link set dev "${IFACE}" "${flag}" "${opt}"
ip link set "${IFACE}" "${flag}" "${opt}"
}
_get_mac_address()
@@ -79,7 +79,7 @@ _get_mac_address()
_set_mac_address()
{
ip link set dev "${IFACE}" address "$1"
ip link set "${IFACE}" address "$1"
}
_get_inet_addresses()
@@ -212,7 +212,7 @@ _delete_addresses()
_has_carrier()
{
LC_ALL=C ip link show dev "${IFACE}" | grep -q "LOWER_UP"
return 0
}
_tunnel()
@@ -274,12 +274,12 @@ iproute2_pre_start()
# MTU support
local mtu=
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
local len=
eval len=\$txqueuelen_${IFVAR}
[ -n "${len}" ] && ip link set dev "${IFACE}" txqueuelen "${len}"
[ -n "${len}" ] && ip link set "${IFACE}" txqueuelen "${len}"
return 0
}
@@ -287,7 +287,7 @@ iproute2_pre_start()
_iproute2_ipv6_tentative()
{
# 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}" | \
grep -q "^[[:space:]]*inet6 .* tentative"
}

View File

@@ -61,12 +61,12 @@ udhcpc_start()
esac
case " ${args} " in
*" --hostname="*|*" -h "*|*" -H "*);;
*" --hosname="*|*" -h "*|*" -H "*);;
*)
if ${sendhost}; then
local hname="$(hostname)"
if [ "${hname}" != "(none)" ] && [ "${hname}" != "localhost" ]; then
args="${args} -x hostname:'${hname}'"
args="${args} --hostname='${hname}'"
fi
fi
;;

View File

@@ -66,41 +66,26 @@ vlan_post_start()
einfo "Adding VLAN ${vlan} to ${IFACE}"
# We need to gather all interface configuration options
# 1) naming. Default to the standard "${IFACE}.${vlan}" but it can be anything
eval vname=\$${IFACE}_vlan${vlan}_name
[ -z "${vname}" ] && eval vname=\$vlan${vlan}_name
eval vname=\$vlan${vlan}_name
[ -z "${vname}" ] && vname="${IFACE}.${vlan}"
# 2) flags
eval vflags=\$${IFACE}_vlan${vlan}_flags
[ -z "${vname}" ] && eval vflags=\$vlan${vlan}_flags
eval vflags=\$vlan${vlan}_flags
# 3) ingress/egress map
eval vingress=\$${IFACE}_vlan${vlan}_ingress
[ -z "${vingress}" ] && eval vingress=\$vlan${vlan}_ingress
eval vingress=\$vlan${vlan}_ingress
[ -z "${vingress}" ] || vingress="ingress-qos-map ${vingress}"
eval vegress=\$${IFACE}_vlan${vlan}_egress
[ -z "${vegress}" ] && eval vegress=\$vlan${vlan}_egress
eval vegress=\$vlan${vlan}_egress
[ -z "${vegress}" ] || vegress="egress-qos-map ${vegress}"
# txqueue
local txqueuelen=
eval txqueuelen=\$txqueuelen_${IFACE}_vlan${vlan}
[ -z "${txqueuelen}" ] && eval txqueuelen=\$txqueuelen_vlan${vlan}
# mac
eval txqueuelen=\$txqueuelen_vlan${vlan}
local mac=
eval mac=\$mac_${IFACE}_vlan${vlan}
[ -z "${mac}" ] && eval mac=\$mac_vlan${vlan}
# broadcast
eval mac=\$mac_vlan${vlan}
local broadcast=
eval broadcast=\$broadcast_${IFACE}_vlan${vlan}
[ -z "${broadcast}" ] && eval broadcast=\$broadcast_vlan${vlan}
# mtu
eval broadcast=\$broadcast_vlan${vlan}
local mtu=
eval mtu=\$mtu_${IFACE}_vlan${vlan}
[ -z "${mtu}" ] && eval mtu=\$mtu_vlan${vlan}
# combine it all
eval mtu=\$mtu_vlan${vlan}
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)"
if [ -n "${e}" ]; then
eend 1 "${e}"

View File

@@ -10,12 +10,6 @@ BOOTDIR= ${LEVELDIR}/boot
DEFAULTDIR= ${LEVELDIR}/default
SHUTDOWNDIR= ${LEVELDIR}/shutdown
ifeq (${MKNET},)
BOOT+= network staticroute
endif
INITFILES= ../init.d
MK= ../mk
include ${MK}/sys.mk
include ${MK}/os.mk
@@ -25,25 +19,19 @@ BOOT-${OS}=
SHUTDOWN-${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
# Generic BSD stuff
BOOT-FreeBSD+= hostid newsyslog savecore syslogd
BOOT-FreeBSD= hostid net.lo0 newsyslog savecore syslogd
# FreeBSD specific stuff
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
SYSINIT-Linux= devfs dmesg sysfs tmpfilesd.sysinit
SYSINIT-Linux= devfs dmesg
# Generic BSD stuff
BOOT-NetBSD+= hostid newsyslog savecore syslogd
BOOT-NetBSD= hostid net.lo0 newsyslog savecore syslogd
# NetBSD specific stuff
BOOT-NetBSD+= devdb swap-blk ttys wscons
@@ -53,35 +41,25 @@ install:
if ! test -d "${SYSINITDIR}"; then \
${INSTALL} -d ${SYSINITDIR} || exit $$?; \
for x in ${SYSINIT}; do \
if test -n "${PREFIX}"; then \
grep -q "keyword .*-prefix" ${INITFILES}/"$$x" && continue; \
fi; \
ln -snf ${INITDIR}/"$$x" ${SYSINITDIR}/"$$x" || exit $$?; done \
ln -snf ${PREFIX}/etc/init.d/"$$x" ${SYSINITDIR}/"$$x" || exit $$?; \
done \
fi
if ! test -d "${BOOTDIR}"; then \
${INSTALL} -d ${BOOTDIR} || exit $$?; \
for x in ${BOOT}; do \
if test -n "${PREFIX}"; then \
grep -q "keyword .*-prefix" ${INITFILES}/"$$x" && continue; \
fi; \
ln -snf ${INITDIR}/"$$x" ${BOOTDIR}/"$$x" || exit $$?; \
ln -snf ${PREFIX}/etc/init.d/"$$x" ${BOOTDIR}/"$$x" || exit $$?; \
done \
fi
if ! test -d "${DEFAULTDIR}"; then \
${INSTALL} -d ${DEFAULTDIR} || exit $$?; \
for x in ${DEFAULT}; do \
if test -n "${PREFIX}"; then \
grep -q "keyword .*-prefix" ${INITFILES}/"$$x" && continue; \
fi; \
ln -snf ${INITDIR}/"$$x" ${DEFAULTDIR}/"$$x" || exit $$?; done \
ln -snf ${PREFIX}/etc/init.d/"$$x" ${DEFAULTDIR}/"$$x" || exit $$?; \
done \
fi
if ! test -d "${SHUTDOWNDIR}"; then \
${INSTALL} -d ${SHUTDOWNDIR} || exit $$?; \
for x in ${SHUTDOWN}; do \
if test -n "${PREFIX}"; then \
grep -q "keyword .*-prefix" ${INITFILES}/"$$x" && continue; \
fi; \
ln -snf ${INITDIR}/"$$x" ${SHUTDOWNDIR}/"$$x" || exit $$?; done \
ln -snf ${PREFIX}/etc/init.d/"$$x" ${SHUTDOWNDIR}/"$$x" || exit $$?; done \
fi
check test::

2
sh/.gitignore vendored
View File

@@ -9,5 +9,3 @@ init-early.sh
ifwatchd-carrier.sh
ifwatchd-nocarrier.sh
udhcpc-hook.sh
tmpfiles.sh
migrate-to-run.sh

View File

@@ -1,8 +1,8 @@
DIR= ${LIBEXECDIR}/sh
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
BIN= gendepends.sh init.sh runscript.sh tmpfiles.sh ${BIN-${OS}}
BIN= gendepends.sh init.sh runscript.sh ${BIN-${OS}}
INSTALLAFTER= _installafter
@@ -12,10 +12,8 @@ include ${MK}/os.mk
SRCS-FreeBSD=
BIN-FreeBSD=
SRCS-Linux= cgroup-release-agent.sh.in init-early.sh.in migrate-to-run.sh.in \
udhcpc-hook.sh.in
BIN-Linux= cgroup-release-agent.sh init-early.sh migrate-to-run.sh \
udhcpc-hook.sh
SRCS-Linux= cgroup-release-agent.sh.in init-early.sh.in udhcpc-hook.sh.in
BIN-Linux= cgroup-release-agent.sh init-early.sh udhcpc-hook.sh
SRCS-NetBSD= ifwatchd-carrier.sh.in ifwatchd-nocarrier.sh.in
BIN-NetBSD= ifwatchd-carrier.sh ifwatchd-nocarrier.sh

View File

@@ -105,7 +105,7 @@ else
# the last ecmd
for _e in ebegin eend error errorn einfo einfon ewarn ewarnn ewend \
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; }"
done
unset _e

View File

@@ -4,7 +4,7 @@
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
. @LIBEXECDIR@/sh/functions.sh
. @SYSCONFDIR@/init.d/functions.sh
. @LIBEXECDIR@/sh/rc-functions.sh
config() {

View File

@@ -3,6 +3,62 @@
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# 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
[ -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
eerror "You have cruft in /proc that should be deleted"
else
einfo "/proc is already mounted"
einfo "/proc is already mounted, skipping"
mountproc=false
fi
fi
@@ -35,41 +91,24 @@ if $mountproc; then
eend $?
fi
# Mount tmpfs on /run when directory exists.
# /run is a new directory for storing volatile runtime data.
# Read more about /run at https://lwn.net/Articles/436012
sys="$(rc --sys)"
if [ ! -d /run ]; then
if [ "$sys" = VSERVER ]; then
if [ -e /run ]; then
rm -rf /run
fi
mkdir /run
if [ -d /run ]; then
if mountinfo -q /run; then
einfo "/run is already mounted, skipping"
else
eerror "The /run directory does not exist. Unable to continue."
return 1
ebegin "Mounting /run"
if ! fstabinfo --mount /run; then
mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /run
fi
eend $?
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
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
# 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
@@ -80,9 +119,4 @@ if grep -Eq "[[:space:]]+xenfs$" /proc/filesystems; then
eend $?
fi
if [ -e "$RC_LIBEXECDIR"/cache/deptree ]; then
cp -p "$RC_LIBEXECDIR"/cache/* "$RC_SVCDIR" 2>/dev/null
fi
echo sysinit >"$RC_SVCDIR"/softlevel
exit 0
. "$RC_LIBEXECDIR"/sh/init-common-post.sh

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

@@ -32,7 +32,7 @@ sourcex()
fi
}
sourcex "@LIBEXECDIR@/sh/functions.sh"
sourcex "@SYSCONFDIR@/init.d/functions.sh"
sourcex "@LIBEXECDIR@/sh/rc-functions.sh"
# Support LiveCD foo
@@ -233,12 +233,7 @@ while [ -n "$1" ]; do
# Special case depend
if [ "$1" = depend ]; then
shift
# Enter the dir of the init script to fix the globbing
# bug 412677
cd ${RC_SERVICE%/*}
_depend
cd /
continue
fi
# See if we have the required function and run it

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

@@ -38,8 +38,6 @@
#include <string.h>
#include <unistd.h>
#include "helpers.h"
#define RC_LEVEL_BOOT "boot"
#define RC_LEVEL_DEFAULT "default"
@@ -54,6 +52,98 @@
#define RC_SVCDIR_STARTED RC_SVCDIR "/started"
#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)
{
struct stat buf;
@@ -86,5 +176,16 @@ int is_writable(const char *);
#define service_start(service) exec_service(service, "start");
#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 *);
#endif

View File

@@ -51,7 +51,6 @@ const char libeinfo_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
#include <unistd.h>
#include "einfo.h"
#include "helpers.h"
#include "hidden-visibility.h"
hidden_proto(ecolor)
@@ -135,7 +134,7 @@ static const struct ecolor ecolors[] = {
{ ECOLOR_BRACKET, BRACKET, "bracket" },
{ 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 *up = NULL;
@@ -226,6 +225,27 @@ strlcat(char *dst, const char *src, size_t size)
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
@@ -442,7 +462,7 @@ colour_terminal(FILE * EINFO_RESTRICT f)
/* Now setup our colours */
p = ebuffer;
for (i = 0; i < ARRAY_SIZE(ecolors); ++i) {
for (i = 0; i < sizeof(ecolors) / sizeof(ecolors[0]); i++) {
tmp[0] = '\0';
if (ecolors[i].name) {
bold = _md;
@@ -578,7 +598,7 @@ _ecolor(FILE * EINFO_RESTRICT f, ECOLOR color)
if (!colour_terminal(f))
return "";
for (i = 0; i < ARRAY_SIZE(ecolors); ++i)
for (i = 0; i < sizeof(ecolors) / sizeof(ecolors[0]); i++)
if (ecolors[i].color == color)
return ecolors_str[i];
return "";

View File

@@ -28,8 +28,6 @@
* SUCH DAMAGE.
*/
#include <sys/utsname.h>
#include "librc.h"
#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))
return true;
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))
return true;
newer = true;
#ifdef RC_PKG_INITDIR
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_PKG_INITDIR, newest, file))
return true;
newer = true;
#endif
#ifdef RC_PKG_CONFDIR
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_PKG_CONFDIR, newest, file))
return true;
newer = true;
#endif
#ifdef RC_LOCAL_INITDIR
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_LOCAL_INITDIR, newest, file))
return true;
newer = true;
#endif
#ifdef RC_LOCAL_CONFDIR
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_LOCAL_CONFDIR, newest, file))
return true;
newer = true;
#endif
if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONF, newest, file))
return true;
newer = true;
/* Some init scripts dependencies change depending on config files
* 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) {
if (!rc_newer_than(RC_DEPTREE_CACHE, s->value, newest, file)) {
newer = true;
break;
if (newest == NULL)
break;
}
}
rc_stringlist_free(config);
@@ -749,15 +748,12 @@ rc_deptree_update(void)
size_t i, k, l;
bool retval = true;
const char *sys = rc_sys();
struct utsname uts;
/* Some init scripts need RC_LIBEXECDIR to source stuff
Ideally we should be setting our full env instead */
if (!getenv("RC_LIBEXECDIR"))
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 */
if (!(fp = popen(GENDEP, "r")))
return false;

View File

@@ -29,6 +29,7 @@
*/
#include "librc.h"
#include "einfo.h"
bool
rc_yesno(const char *value)
@@ -138,13 +139,15 @@ rc_proc_getent(const char *ent)
if (!exists("/proc/cmdline"))
return NULL;
if (!(fp = fopen("/proc/cmdline", "r")))
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)
return NULL;
eerror("rc_getline: %s", strerror(errno));
if (proc != NULL) {
len = strlen(ent);
@@ -391,10 +394,13 @@ rc_conf_value(const char *setting)
atexit(_free_rc_conf);
#endif
/* Support old configs. */
/* Support old configs, but complain about it. */
if (exists(RC_CONF_OLD)) {
old = rc_config_load(RC_CONF_OLD);
TAILQ_CONCAT(rc_conf, old, entries);
ewarn("Your system still has %s", RC_CONF_OLD);
ewarn("Please migrate to the appropriate settings in %s", RC_CONF);
ewarn("and delete %s.", RC_CONF_OLD);
#ifdef DEBUG_MEMORY
free(old);
#endif

View File

@@ -216,7 +216,6 @@ rc_sys_v2(void)
}
/* Now do detection */
__STRING_SWITCH(systype)
__STRING_CASE(RC_SYS_PREFIX) { return RC_SYS_PREFIX; }
#ifdef __FreeBSD__
__STRING_CASE(RC_SYS_JAIL) { return RC_SYS_JAIL; }
#endif /* __FreeBSD__ */
@@ -246,10 +245,6 @@ librc_hidden_def(rc_sys_v2)
const char *
rc_sys_v1(void)
{
#ifdef PREFIX
return RC_SYS_PREFIX;
#else
#ifdef __FreeBSD__
int jailed = 0;
size_t len = sizeof(jailed);
@@ -286,7 +281,6 @@ rc_sys_v1(void)
#endif
return NULL;
#endif /* PREFIX */
}
librc_hidden_def(rc_sys_v1)

View File

@@ -33,17 +33,10 @@
__BEGIN_DECLS
#define RC_PREFIX "@PREFIX@"
#define RC_SYSCONFDIR "@SYSCONFDIR@"
#define RC_LIBDIR "@PREFIX@/@LIB@/rc"
#define RC_LIBEXECDIR "@LIBEXECDIR@"
#if defined(PREFIX)
#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_INITDIR RC_SYSCONFDIR "/init.d"
#define RC_CONFDIR RC_SYSCONFDIR "/conf.d"
@@ -283,7 +276,6 @@ bool rc_service_daemons_crashed(const char *);
#define RC_SYS_JAIL "JAIL"
#define RC_SYS_OPENVZ "OPENVZ"
#define RC_SYS_LXC "LXC"
#define RC_SYS_PREFIX "PREFIX"
#define RC_SYS_UML "UML"
#define RC_SYS_VSERVER "VSERVER"
#define RC_SYS_XEN0 "XEN0"

View File

@@ -38,7 +38,7 @@
"Disable color output", \
"Display software version", \
"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_h usage (EXIT_SUCCESS);

View File

@@ -60,8 +60,7 @@ extern const char *applet;
* See systemd's src/label.c:label_mkdir
*/
static int
do_check(char *path, uid_t uid, gid_t gid, mode_t mode, inode_t type,
bool trunc, bool chowner)
do_check(char *path, uid_t uid, gid_t gid, mode_t mode, inode_t type, bool trunc)
{
struct stat st;
int fd, flags;
@@ -140,7 +139,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)
einfo("%s: correcting owner", path);
if (chown(path, uid, gid)) {
@@ -223,20 +222,19 @@ checkpath(int argc, char **argv)
struct group *gr = NULL;
inode_t type = inode_unknown;
int retval = EXIT_SUCCESS;
bool trunc = false;
bool chowner = false;
bool trunc = 0;
while ((opt = getopt_long(argc, argv, getoptstring,
longopts, (int *) 0)) != -1)
{
switch (opt) {
case 'D':
trunc = true;
trunc = 1;
case 'd':
type = inode_dir;
break;
case 'F':
trunc = true;
trunc = 1;
case 'f':
type = inode_file;
break;
@@ -249,7 +247,6 @@ checkpath(int argc, char **argv)
applet, optarg);
break;
case 'o':
chowner = true;
if (parse_owner(&pw, &gr, optarg) != 0)
eerrorx("%s: owner `%s' not found",
applet, optarg);
@@ -275,7 +272,7 @@ checkpath(int argc, char **argv)
gid = gr->gr_gid;
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;
optind++;
}

View File

@@ -282,7 +282,7 @@ fstabinfo(int argc, char **argv)
END_ENT;
if (!TAILQ_FIRST(files))
eerrorx("%s: empty fstab", argv[0]);
eerrorx("%s: emtpy fstab", argv[0]);
}
if (!TAILQ_FIRST(files)) {

View File

@@ -393,7 +393,8 @@ mountinfo(int argc, char **argv)
bool quiet;
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) \
if (_var) free(_var); \
@@ -474,6 +475,7 @@ mountinfo(int argc, char **argv)
REG_FREE(args.skip_options_regex);
result = EXIT_FAILURE;
quiet = rc_yesno(getenv("EINFO_QUIET"));
/* We should report the mounts in reverse order to ease unmounting */
TAILQ_FOREACH_REVERSE(s, nodes, rc_stringlist, entries) {

View File

@@ -253,38 +253,13 @@ do_e(int argc, char **argv)
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
do_service(int argc, char **argv)
{
bool ok = false;
char *service;
char *exec;
int idx;
RC_SERVICE state, bit;
int idx = 0;
if (argc > 1)
service = argv[1];
@@ -294,11 +269,21 @@ do_service(int argc, char **argv)
if (service == NULL || *service == '\0')
eerrorx("%s: no service specified", applet);
state = rc_service_state(service);
bit = lookup_service_state(applet);
if (bit) {
ok = (state & bit);
} else if (strcmp(applet, "service_started_daemon") == 0) {
if (strcmp(applet, "service_started") == 0)
ok = (rc_service_state(service) & RC_SERVICE_STARTED);
else if (strcmp(applet, "service_stopped") == 0)
ok = (rc_service_state(service) & RC_SERVICE_STOPPED);
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");
exec = argv[1];
if (argc > 3) {
@@ -330,34 +315,37 @@ do_mark_service(int argc, char **argv)
char *svcname = getenv("RC_SVCNAME");
char *service = NULL;
char *runscript_pid;
/* char *mtime; */
char *mtime;
pid_t pid;
RC_SERVICE bit;
/* size_t l; */
size_t l;
if (argc > 1)
service = argv[1];
else
service = svcname;
service = getenv("RC_SVCNAME");
if (service == NULL || *service == '\0')
eerrorx("%s: no service specified", applet);
if (!strncmp(applet, "mark_", 5) &&
(bit = lookup_service_state(applet + 5)))
ok = rc_service_mark(service, bit);
if (strcmp(applet, "mark_service_started") == 0)
ok = rc_service_mark(service, RC_SERVICE_STARTED);
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
eerrorx("%s: unknown applet", applet);
/* 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 */
/*
* 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) {
runscript_pid = getenv("RC_RUNSCRIPT_PID");
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
in control as well */
/*
l = strlen(RC_SVCDIR "/exclusive") + strlen(svcname) +
strlen(runscript_pid) + 4;
mtime = xmalloc(l);
@@ -376,7 +363,6 @@ do_mark_service(int argc, char **argv)
if (exists(mtime) && unlink(mtime) != 0)
eerror("%s: unlink: %s", applet, strerror(errno));
free(mtime);
*/
}
return ok ? EXIT_SUCCESS : EXIT_FAILURE;
@@ -414,7 +400,7 @@ do_value(int argc, char **argv)
}
static int
shell_var(int argc, char **argv)
do_shell_var(int argc, char **argv)
{
int i;
char *p;
@@ -435,127 +421,106 @@ shell_var(int argc, char **argv)
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
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
* 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
* 'rc --applet APPLET', and shift ALL of argv down by two array items. */
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];
argv += 2;
argc -= 2;
}
for (i = 0; i < ARRAY_SIZE(applets); ++i)
if (!strcmp(applet, applets[i].name))
exit(applets[i].applet(argc, argv));
/* These are designed to be applications in their own right */
if (strcmp(applet, "fstabinfo") == 0)
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'))
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)
exit(do_service(argc, argv));
if (strncmp(applet, "mark_service_", strlen("mark_service_")) == 0)
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)
eerrorx("%s: unknown applet", applet);
}

View File

@@ -191,10 +191,6 @@ env_config(void)
if (sys)
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
Linux/FreeBSD, etc
To save on calling uname, we store it in an environment variable */

View File

@@ -793,13 +793,6 @@ main(int argc, char **argv)
env_filter();
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++;
argv--;
while ((opt = getopt_long(argc, argv, getoptstring,

View File

@@ -192,7 +192,7 @@ parse_signal(const char *sig)
else
s = NULL;
for (i = 0; i < ARRAY_SIZE(signallist); ++i)
for (i = 0; i < sizeof(signallist) / sizeof(signallist[0]); i++)
if (strcmp(sig, signallist[i].name) == 0 ||
(s && strcmp(s, signallist[i].name) == 0))
return signallist[i].signal;
@@ -315,7 +315,8 @@ get_pid(const char *pidfile, bool quiet)
if ((fp = fopen(pidfile, "r")) == NULL) {
if (!quiet)
eerror("%s: fopen `%s': %s", applet, pidfile, strerror(errno));
eerror("%s: fopen `%s': %s",
applet, pidfile, strerror(errno));
return -1;
}
@@ -354,7 +355,8 @@ do_stop(const char *exec, const char *const *argv,
LIST_FOREACH_SAFE(pi, pids, entries, np) {
if (test) {
if (!quiet)
einfo("Would send signal %d to PID %d", sig, pi->pid);
einfo("Would send signal %d to PID %d",
sig, pi->pid);
nkilled++;
} else {
if (verbose)
@@ -415,7 +417,7 @@ run_stop_schedule(const char *exec, const char *const *argv,
}
if (pidfile) {
pid = get_pid(pidfile, false);
pid = get_pid(pidfile, quiet);
if (pid == -1)
return 0;
}
@@ -434,7 +436,9 @@ run_stop_schedule(const char *exec, const char *const *argv,
if (tkilled == 0) {
if (progressed)
printf("\n");
eerror("%s: no matching processes found", applet);
if (! quiet)
eerror("%s: no matching "
"processes found", applet);
}
return tkilled;
}
@@ -504,10 +508,14 @@ run_stop_schedule(const char *exec, const char *const *argv,
if (progressed)
printf("\n");
if (nrunning == 1)
eerror("%s: %d process refused to stop", applet, nrunning);
else
eerror("%s: %d process(es) refused to stop", applet, nrunning);
if (! quiet) {
if (nrunning == 1)
eerror("%s: %d process refused to stop",
applet, nrunning);
else
eerror("%s: %d process(es) refused to stop",
applet, nrunning);
}
return -nrunning;
}
@@ -1287,7 +1295,7 @@ start_stop_daemon(int argc, char **argv)
/* We don't redirect stdin as some daemons may need it */
if (background || quiet || redirect_stdout)
dup2(stdout_fd, STDOUT_FILENO);
if (background || redirect_stderr)
if (background || quiet || redirect_stderr)
dup2(stderr_fd, STDERR_FILENO);
for (i = getdtablesize() - 1; i >= 3; --i)
@@ -1318,9 +1326,12 @@ start_stop_daemon(int argc, char **argv)
return -1;
}
} while (!WIFEXITED(i) && !WIFSIGNALED(i));
if (!WIFEXITED(i) || WEXITSTATUS(i) != 0)
eerrorx("%s: failed to start `%s'", applet, exec);
if (!WIFEXITED(i) || WEXITSTATUS(i) != 0) {
if (!quiet)
eerrorx("%s: failed to start `%s'",
applet, exec);
exit(EXIT_FAILURE);
}
pid = spid;
}
@@ -1354,7 +1365,7 @@ start_stop_daemon(int argc, char **argv)
alive = true;
} else {
if (pidfile) {
pid = get_pid(pidfile, false);
pid = get_pid(pidfile, true);
if (pid == -1) {
eerrorx("%s: did not "
"create a valid"

View File

@@ -93,7 +93,7 @@ ebegin "Checking for x* func usage"
out=$(cd ${top_srcdir}; find src -name '*.[ch]' \
-exec grep -n -E '\<(malloc|strdup)[[:space:]]*\(' {} + \
| grep -v \
-e src/includes/helpers.h \
-e src/includes/rc-misc.h \
-e src/libeinfo/libeinfo.c)
[ -z "${out}" ]
eend $? "These need to be using the x* variant:"$'\n'"${out}"

View File

@@ -18,7 +18,7 @@ l3:3:wait:/sbin/rc default
l4:4:wait:/sbin/rc default
l5:5:wait:/sbin/rc default
l6:6:wait:/sbin/rc reboot
l6r:6:wait:/sbin/reboot -d
l6r:6:wait:/sbin/reboot -dk
#z6:6:respawn:/sbin/sulogin
# new-style single-user

View File

@@ -9,6 +9,10 @@ srcdir=${srcdir:-.}
top_builddir=${top_builddir:-${top_srcdir}}
builddir=${builddir:-${srcdir}}
export LD_LIBRARY_PATH=${top_builddir}/src/libeinfo:${top_builddir}/src/librc:${LD_LIBRARY_PATH}
export PATH=${top_builddir}/src/rc:${PATH}
if [ ! -f ${top_srcdir}/sh/functions.sh ] ; then
echo "functions.sh not yet created !?" 1>&2
exit 1
@@ -17,9 +21,6 @@ elif ! . ${top_srcdir}/sh/functions.sh; then
exit 1
fi
export LD_LIBRARY_PATH=${top_builddir}/src/libeinfo:${top_builddir}/src/librc:${LD_LIBRARY_PATH}
export PATH=${top_builddir}/src/rc:${PATH}
cd ${top_srcdir}/src/rc
${MAKE:-make} links >/dev/null
cd -