Compare commits

..

1 Commits

Author SHA1 Message Date
William Hubbs
8591a0ea73 Make netmount look up services for file systems 2015-08-06 16:07:02 -05:00
19 changed files with 981 additions and 547 deletions

1236
ChangeLog

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,3 @@
NAME= openrc NAME= openrc
VERSION= 0.18.4 VERSION= 0.18
PKG= ${NAME}-${VERSION} PKG= ${NAME}-${VERSION}

34
NEWS.md
View File

@@ -3,40 +3,6 @@
This file will contain a list of notable changes for each release. Note This file will contain a list of notable changes for each release. Note
the information in this file is in reverse order. the information in this file is in reverse order.
## OpenRC-0.18.3
Modern Linux systems expect /etc/mtab to be a symbolic link to
/proc/self/mounts. Reasons for this change include support for mount
namespaces, which will not work if /etc/mtab is a file.
By default, the mtab service enforces this on each reboot.
If you find that this breaks your system in some way, please do the
following:
- Set mtab_is_file=yes in /etc/conf.d/mtab.
- Restart mtab. This will recreate the /etc/mtab file.
- Check for an issue on https://github.com/openrc/openrc/issues
explaining why you need /etc/mtab to be a file. If there isn't one,
please open one and explain in detail why you need this to be a file.
If there is one, please add your comments to it. Please give concrete
examples of why it is important that /etc/mtab be a file instead of a
symbolic link. Those comments will be taken into consideration for how
long to keep supporting mtab as a file or when the support can be
removed.
## OpenRC-0.18
The behaviour of localmount and netmount in this version is changing. In
the past, these services always started successfully. In this version,
they will be able to fail if file systems they mount fail to mount. If
you have file systems listed in fstab which should not be mounted at
boot time, make sure to add noauto to the mount options. If you have
file systems that you want to attempt to mount at boot time but failure
should be allowed, add nofail to the mount options for these file
systems in fstab.
## OpenRC-0.14 ## OpenRC-0.14
The binfmt service, which registers misc binary formats with the Linux The binfmt service, which registers misc binary formats with the Linux

View File

@@ -15,7 +15,7 @@ include ${MK}/os.mk
CONF-FreeBSD= ipfw moused powerd rarpd savecore syscons CONF-FreeBSD= ipfw moused powerd rarpd savecore syscons
CONF-Linux= consolefont devfs dmesg hwclock keymaps killprocs modules mtab CONF-Linux= consolefont devfs dmesg hwclock keymaps killprocs modules
CONF-NetBSD= moused rarpd savecore CONF-NetBSD= moused rarpd savecore

View File

@@ -1,5 +0,0 @@
# This setting controls whether /etc/mtab is a file or symbolic link.
# Most of the time, you shouldn't touch this. However, if the default
# breaks your system in some way, please see the NEWS.md file that comes
# with OpenRC for the actions to take.
# mtab_is_file=no

View File

@@ -62,21 +62,12 @@ rc_tty_number=12
# Set the devices controller settings for this service. # Set the devices controller settings for this service.
#rc_cgroup_devices="" #rc_cgroup_devices=""
# Set the hugetlb controller settings for this service.
#rc_cgroup_hugetlb=""
# Set the memory controller settings for this service. # Set the memory controller settings for this service.
#rc_cgroup_memory="" #rc_cgroup_memory=""
# Set the net_cls controller settings for this service.
#rc_cgroup_net_cls=""
# Set the net_prio controller settings for this service. # Set the net_prio controller settings for this service.
#rc_cgroup_net_prio="" #rc_cgroup_net_prio=""
# Set the pids controller settings for this service.
#rc_cgroup_pids=""
# Set this to YES if yu want all of the processes in a service's cgroup # Set this to YES if yu want all of the processes in a service's cgroup
# killed when the service is stopped or restarted. # killed when the service is stopped or restarted.
# This should not be set globally because it kills all of the service's # This should not be set globally because it kills all of the service's

View File

@@ -16,5 +16,5 @@ start()
ebegin "Loading custom binary format handlers" ebegin "Loading custom binary format handlers"
"$RC_LIBEXECDIR"/sh/binfmt.sh "$RC_LIBEXECDIR"/sh/binfmt.sh
eend $? eend $?
return 0 return 0
} }

View File

@@ -121,11 +121,11 @@ clean_run()
local dir local dir
# If / is still read-only due to a problem, this will fail! # If / is still read-only due to a problem, this will fail!
if ! checkpath -W /; then if ! checkpath -W /; then
ewarn "/ is not writable; unable to clean up underlying /run" eerror "/ is not writable; unable to clean up underlying /run"
return 1 return 1
fi fi
if ! checkpath -W /tmp; then if ! checkpath -W /tmp; then
ewarn "/tmp is not writable; unable to clean up underlying /run" eerror "/tmp is not writable; unable to clean up underlying /run"
return 1 return 1
fi fi
# Now we know that we can modify /tmp and / # Now we know that we can modify /tmp and /
@@ -136,12 +136,13 @@ clean_run()
dir=$(mktemp -d) dir=$(mktemp -d)
if [ -n "$dir" -a -d $dir -a -w $dir ]; then if [ -n "$dir" -a -d $dir -a -w $dir ]; then
mount --bind / $dir && rm -rf $dir/run/* || rc=1 mount --bind / $dir && rm -rf $dir/run/* || rc=1
umount $dir && rmdir $dir umount $dir
rm -rf $dir
else else
rc=1 rc=1
fi fi
if [ $rc -ne 0 ]; then if [ $rc -ne 0 ]; then
ewarn "Could not clean up underlying /run on /" eerror "Could not clean up underlying /run on /"
return 1 return 1
fi fi
} }

View File

@@ -7,7 +7,7 @@ description="Sets a font for the consoles."
depend() depend()
{ {
need localmount termencoding need localmount termencoding
after hotplug bootmisc modules after hotplug bootmisc
keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc
} }

View File

@@ -15,7 +15,7 @@ depend()
start() start()
{ {
# Mount local filesystems in /etc/fstab. # Mount local filesystems in /etc/fstab.
local types="noproc" x= no_netdev= rc= local types="noproc" x= no_netdev=
for x in $net_fs_list $extra_net_fs_list; do for x in $net_fs_list $extra_net_fs_list; do
types="${types},no${x}" types="${types},no${x}"
done done
@@ -29,11 +29,9 @@ start()
ebegin "Mounting local filesystems" ebegin "Mounting local filesystems"
mount -at "$types" $no_netdev mount -at "$types" $no_netdev
eend $? "Some local filesystem failed to mount" eend $? "Some local filesystem failed to mount"
rc=$?
if [ "$RC_UNAME" != Linux ]; then # Always return 0 - some local mounts may not be critical for boot
rc=0 return 0
fi
return $rc
} }
stop() stop()
@@ -72,19 +70,17 @@ stop()
sync sync
fi fi
local aufs_branch aufs_mount_point aufs_si_id aufs_br_id branches local aufs_branch aufs_mount_dir aufs_mount_point aufs_si_dir aufs_si_id
for aufs_si_dir in /sys/fs/aufs/si*; do for aufs_si_dir in /sys/fs/aufs/*; do
[ -d "${aufs_si_dir}" ] || continue aufs_mount_dir=${aufs_si_dir#/sys/fs/aufs/}
aufs_si_id="si=${aufs_si_dir#/sys/fs/aufs/si_}" aufs_si_id="$(printf "%s" $aufs_mount_dir | sed 's/_/=/g')"
aufs_mount_point="$(mountinfo -o ${aufs_si_id})" aufs_mount_point="$(mountinfo -o ${aufs_si_id})"
branches="$aufs_si_dir/br[0-9] $aufs_si_dir/br[0-9][0-9] $aufs_si_dir/br[0-9][0-9][0-9]" for x in $aufs_si_dir/br[0-9][0-9][0-9]; do
for x in $branches; do
[ -e "${x}" ] || continue
aufs_branch=$(sed 's/=.*//g' $x) aufs_branch=$(sed 's/=.*//g' $x)
eindent eindent
if ! mount -o "remount,del:$aufs_branch" "$aufs_mount_point" > /dev/null 2>&1; then if ! mount -o "remount,del:$aufs_branch" "$aufs_mount_point" > /dev/null 2>&1; then
ewarn "Failed to remove branch $aufs_branch from aufs \ ewarn "Failed to remove branch $aufs_branch from aufs \
$aufs_mount_point" $aufs_mount_point"
fi fi
eoutdent eoutdent
sync sync

View File

@@ -12,19 +12,21 @@ depend()
start() start()
{ {
[ -L /etc/mtab ] && return 0
local rc=0 local rc=0
ebegin "Updating /etc/mtab" ebegin "Updating /etc/mtab"
if ! checkpath -W /etc; then if ! checkpath -W /etc; then
rc=1 rc=1
elif ! yesno ${mtab_is_file:-no}; then elif [ ! -e /etc/mtab ]; then
[ ! -L /etc/mtab ] && [ -f /etc/mtab ] &&
ewarn "Removing /etc/mtab file"
einfo "Creating mtab symbolic link"
ln -snf /proc/self/mounts /etc/mtab ln -snf /proc/self/mounts /etc/mtab
else else
[ -L /etc/mtab ] && ewarn "Removing /etc/mtab symbolic link" ewarn "The support for updating /etc/mtab as a file is"
rm -f /etc/mtab ewarn "deprecated and will be removed in the future."
einfo "Creating mtab file" ewarn "Please run the following command as root on your system."
ewarn
ewarn "ln -snf /proc/self/mounts /etc/mtab"
ewarn
# With / as tmpfs we cannot umount -at tmpfs in localmount as that # With / as tmpfs we cannot umount -at tmpfs in localmount as that
# makes / readonly and dismounts all tmpfs even if in use which is # makes / readonly and dismounts all tmpfs even if in use which is
# not good. Luckily, umount uses /etc/mtab instead of /proc/mounts # not good. Luckily, umount uses /etc/mtab instead of /proc/mounts

View File

@@ -4,11 +4,24 @@
description="Mounts network shares according to /etc/fstab." description="Mounts network shares according to /etc/fstab."
get_fs_services()
{
local fsclient fstype list=$(ls $RC_LIBEXECDIR/netfs/*) services
local x
for x in $list; do
fstype=${x##*/}
fstabinfo -q -t ${fstype} && services="${services} $(cat x)"
done
printf "%s\n" $services
}
depend() depend()
{ {
config /etc/fstab config /etc/fstab
use afc-client amd nfsclient autofs openvpn use afc-client amd nfsclient autofs openvpn
use dns use dns
local fs_services ="$(get_fs_services)"
[ -n "$fs_services" ] && use $fs_services
keyword -jail -prefix -systemd-nspawn -vserver -lxc keyword -jail -prefix -systemd-nspawn -vserver -lxc
} }
@@ -27,10 +40,7 @@ start()
rc=$? rc=$?
fi fi
ewend $rc "Could not mount all network filesystems" ewend $rc "Could not mount all network filesystems"
if [ "$RC_UNAME" != Linux ]; then return 0
rc=0
fi
return $rc
} }
stop() stop()

View File

@@ -7,53 +7,43 @@ description="Saves the caches OpenRC uses to non volatile storage"
start() start()
{ {
if [ -e "$RC_SVCDIR"/clock-skewed ]; then if [ -e "$RC_SVCDIR"/clock-skewed ]; then
ewarn "Clock skew detected!" ewarn "WARNING: clock skew detected!"
if ! yesno "${RC_GOINGDOWN}"; then if ! yesno "${RC_GOINGDOWN}"; then
eerror "Not saving deptree cache" eerror "Not saving deptree cache"
return 1 return 1
fi fi
fi fi
if [ ! -d "$RC_LIBEXECDIR"/cache ]; then if ! checkpath -W "$RC_LIBEXECDIR"; then
if ! checkpath -W "$RC_LIBEXECDIR"; then ewarn "WARNING: ${RC_LIBEXECDIR} is not writable!"
eerror "${RC_LIBEXECDIR} is not writable!" if ! yesno "${RC_GOINGDOWN}"; then
eerror "Unable to save dependency cache" ewarn "Unable to save deptree cache"
if yesno "${RC_GOINGDOWN}"; then
return 0
fi
return 1 return 1
fi fi
rm -rf "$RC_LIBEXECDIR"/cache return 0
if ! mkdir -p "$RC_LIBEXECDIR"/cache; then
eerror "Unable to create $RC_LIBEXECDIR/cache"
eerror "Unable to save dependency cache"
if yesno "${RC_GOINGDOWN}"; then
return 0
fi
return 1
fi
fi
if ! checkpath -W "$RC_LIBEXECDIR"/cache; then
eerror "${RC_LIBEXECDIR}/cache is not writable!"
eerror "Unable to save dependency cache"
if yesno "${RC_GOINGDOWN}"; then
return 0
fi
return 1
fi fi
ebegin "Saving dependency cache" ebegin "Saving dependency cache"
local rc=0 save= local rc=
if [ ! -d "$RC_LIBEXECDIR"/cache ]; then
rm -rf "$RC_LIBEXECDIR"/cache
if ! mkdir -p "$RC_LIBEXECDIR"/cache; then
rc=$?
if yesno "${RC_GOINGDOWN}"; then
rc=0
fi
eend $rc "Unable to create $RC_LIBEXECDIR/cache"
return $rc
fi
fi
local save=
for x in deptree depconfig shutdowntime softlevel nettree rc.log; do for x in deptree depconfig shutdowntime softlevel nettree rc.log; do
[ -e "$RC_SVCDIR/$x" ] && save="$save $RC_SVCDIR/$x" [ -e "$RC_SVCDIR/$x" ] && save="$save $RC_SVCDIR/$x"
done done
if [ -n "$save" ]; then if [ -n "$save" ]; then
cp -p $save "$RC_LIBEXECDIR"/cache cp -p $save "$RC_LIBEXECDIR"/cache 2>/dev/null
rc=$?
fi fi
rc=$?
if yesno "${RC_GOINGDOWN}"; then if yesno "${RC_GOINGDOWN}"; then
if [ $rc -ne 0 ]; then rc=0
eerror "Unable to save dependency cache"
fi
eend 0
fi fi
eend $rc "Unable to save dependency cache" eend $rc
} }

View File

@@ -116,7 +116,7 @@ mount_cgroups()
mount -n -t cgroup \ mount -n -t cgroup \
-o none,${sysfs_opts},name=openrc,release_agent="$agent" \ -o none,${sysfs_opts},name=openrc,release_agent="$agent" \
openrc /sys/fs/cgroup/openrc openrc /sys/fs/cgroup/openrc
printf 1 > /sys/fs/cgroup/openrc/notify_on_release echo 1 > /sys/fs/cgroup/openrc/notify_on_release
fi fi
yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0 yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0

View File

@@ -221,22 +221,20 @@ done
# Load our script # Load our script
sourcex "$RC_SERVICE" sourcex "$RC_SERVICE"
eval "printf '%s\n' $required_dirs" | while read _d; do for _d in $required_dirs; do
if [ -n "$_d" ] && [ ! -d "$_d" ]; then if [ ! -d $_d ]; then
eerror "$RC_SVCNAME: \`$_d' is not a directory" eerror "$RC_SVCNAME: \`$_d' is not a directory"
exit 1 exit 1
fi fi
done done
[ $? -ne 0 ] && exit 1
unset _d unset _d
eval "printf '%s\n' $required_files" | while read _f; do for _f in $required_files; do
if [ -n "$_f" ] && [ ! -r "$_f" ]; then if [ ! -r $_f ]; then
eerror "$RC_SVCNAME: \`$_f' is not readable" eerror "$RC_SVCNAME: \`$_f' is not readable"
exit 1 exit 1
fi fi
done done
[ $? -ne 0 ] && exit 1
unset _f unset _f
if [ -n "$opts" ]; then if [ -n "$opts" ]; then

View File

@@ -54,9 +54,7 @@ cgroup_set_values()
val= val=
;; ;;
*) *)
[ -n "$val" ] && val="$val $1"
val="$val $1" ||
val="$1"
;; ;;
esac esac
shift shift
@@ -109,21 +107,12 @@ cgroup_set_limits()
local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}" local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}"
[ -n "$devices" ] && cgroup_set_values devices "$devices" [ -n "$devices" ] && cgroup_set_values devices "$devices"
local hugetlb="${rc_cgroup_hugetlb:-$RC_CGROUP_HUGETLB}"
[ -n "$hugetlb" ] && cgroup_set_values hugetlb "$hugetlb"
local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}" local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}"
[ -n "$memory" ] && cgroup_set_values memory "$memory" [ -n "$memory" ] && cgroup_set_values memory "$memory"
local net_cls="${rc_cgroup_net_cls:-$RC_CGROUP_NET_CLS}"
[ -n "$net_cls" ] && cgroup_set_values net_cls "$net_cls"
local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}" local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}"
[ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio" [ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio"
local pids="${rc_cgroup_pids:-$RC_CGROUP_PIDS}"
[ -n "$pids" ] && cgroup_set_values pids "$pids"
return 0 return 0
} }

View File

@@ -4,13 +4,7 @@
ssd_start() ssd_start()
{ {
if [ -z "$command" ]; then [ -n "$command" ] || return 0
ewarn "The command variable is undefined."
ewarn "There is nothing for ${name:-$RC_SVCNAME} to start."
ewarn "If this is what you intend, please write a start function."
ewarn "This will become a failure in a future release."
return 0
fi
local _background= local _background=
ebegin "Starting ${name:-$RC_SVCNAME}" ebegin "Starting ${name:-$RC_SVCNAME}"

View File

@@ -298,7 +298,7 @@ find_mounts(struct args *args)
int netdev; int netdev;
RC_STRINGLIST *list; RC_STRINGLIST *list;
if ((fp = fopen("/proc/self/mounts", "r")) == NULL) if ((fp = fopen("/proc/mounts", "r")) == NULL)
eerrorx("getmntinfo: %s", strerror(errno)); eerrorx("getmntinfo: %s", strerror(errno));
list = rc_stringlist_new(); list = rc_stringlist_new();
@@ -315,8 +315,6 @@ find_mounts(struct args *args)
if ((ent = getmntfile(to))) { if ((ent = getmntfile(to))) {
if (strstr(ent->mnt_opts, "_netdev")) if (strstr(ent->mnt_opts, "_netdev"))
netdev = 0; netdev = 0;
else
netdev = 1;
} }
process_mount(list, args, from, to, fst, opts, netdev); process_mount(list, args, from, to, fst, opts, netdev);

View File

@@ -85,12 +85,8 @@ static bool sighup, in_background, deps, dry_run;
static pid_t service_pid; static pid_t service_pid;
static int signal_pipe[2] = { -1, -1 }; static int signal_pipe[2] = { -1, -1 };
static RC_STRINGLIST *deptypes_b; static RC_STRINGLIST *types_b, *types_n, *types_nu, *types_nua, *types_m;
static RC_STRINGLIST *deptypes_n; static RC_STRINGLIST *types_mua = NULL;
static RC_STRINGLIST *deptypes_nu;
static RC_STRINGLIST *deptypes_nua;
static RC_STRINGLIST *deptypes_m;
static RC_STRINGLIST *deptypes_mua;
static void static void
handle_signal(int sig) handle_signal(int sig)
@@ -235,12 +231,12 @@ cleanup(void)
rc_plugin_unload(); rc_plugin_unload();
#ifdef DEBUG_MEMORY #ifdef DEBUG_MEMORY
rc_stringlist_free(deptypes_b); rc_stringlist_free(types_b);
rc_stringlist_free(deptypes_n); rc_stringlist_free(types_n);
rc_stringlist_free(deptypes_nu); rc_stringlist_free(types_nu);
rc_stringlist_free(deptypes_nua); rc_stringlist_free(types_nua);
rc_stringlist_free(deptypes_m); rc_stringlist_free(types_m);
rc_stringlist_free(deptypes_mua); rc_stringlist_free(types_mua);
rc_deptree_free(deptree); rc_deptree_free(deptree);
rc_stringlist_free(restart_services); rc_stringlist_free(restart_services);
rc_stringlist_free(need_services); rc_stringlist_free(need_services);
@@ -522,30 +518,30 @@ get_started_services(void)
} }
static void static void
setup_deptypes(void) setup_types(void)
{ {
deptypes_b = rc_stringlist_new(); types_b = rc_stringlist_new();
rc_stringlist_add(deptypes_b, "broken"); rc_stringlist_add(types_b, "broken");
deptypes_n = rc_stringlist_new(); types_n = rc_stringlist_new();
rc_stringlist_add(deptypes_n, "ineed"); rc_stringlist_add(types_n, "ineed");
deptypes_nu = rc_stringlist_new(); types_nu = rc_stringlist_new();
rc_stringlist_add(deptypes_nu, "ineed"); rc_stringlist_add(types_nu, "ineed");
rc_stringlist_add(deptypes_nu, "iuse"); rc_stringlist_add(types_nu, "iuse");
deptypes_nua = rc_stringlist_new(); types_nua = rc_stringlist_new();
rc_stringlist_add(deptypes_nua, "ineed"); rc_stringlist_add(types_nua, "ineed");
rc_stringlist_add(deptypes_nua, "iuse"); rc_stringlist_add(types_nua, "iuse");
rc_stringlist_add(deptypes_nua, "iafter"); rc_stringlist_add(types_nua, "iafter");
deptypes_m = rc_stringlist_new(); types_m = rc_stringlist_new();
rc_stringlist_add(deptypes_m, "needsme"); rc_stringlist_add(types_m, "needsme");
deptypes_mua = rc_stringlist_new(); types_mua = rc_stringlist_new();
rc_stringlist_add(deptypes_mua, "needsme"); rc_stringlist_add(types_mua, "needsme");
rc_stringlist_add(deptypes_mua, "usesme"); rc_stringlist_add(types_mua, "usesme");
rc_stringlist_add(deptypes_mua, "beforeme"); rc_stringlist_add(types_mua, "beforeme");
} }
static void static void
@@ -608,10 +604,10 @@ svc_start_deps(void)
if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL)) if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL))
eerrorx("failed to load deptree"); eerrorx("failed to load deptree");
if (!deptypes_b) if (!types_b)
setup_deptypes(); setup_types();
services = rc_deptree_depends(deptree, deptypes_b, applet_list, services = rc_deptree_depends(deptree, types_b, applet_list,
runlevel, 0); runlevel, 0);
if (TAILQ_FIRST(services)) { if (TAILQ_FIRST(services)) {
eerrorn("ERROR: %s needs service(s) ", applet); eerrorn("ERROR: %s needs service(s) ", applet);
@@ -629,9 +625,9 @@ svc_start_deps(void)
rc_stringlist_free(services); rc_stringlist_free(services);
services = NULL; services = NULL;
need_services = rc_deptree_depends(deptree, deptypes_n, need_services = rc_deptree_depends(deptree, types_n,
applet_list, runlevel, depoptions); applet_list, runlevel, depoptions);
use_services = rc_deptree_depends(deptree, deptypes_nu, use_services = rc_deptree_depends(deptree, types_nu,
applet_list, runlevel, depoptions); applet_list, runlevel, depoptions);
if (!rc_runlevel_starting()) { if (!rc_runlevel_starting()) {
@@ -659,7 +655,7 @@ svc_start_deps(void)
return; return;
/* Now wait for them to start */ /* Now wait for them to start */
services = rc_deptree_depends(deptree, deptypes_nua, applet_list, services = rc_deptree_depends(deptree, types_nua, applet_list,
runlevel, depoptions); runlevel, depoptions);
/* We use tmplist to hold our scheduled by list */ /* We use tmplist to hold our scheduled by list */
tmplist = rc_stringlist_new(); tmplist = rc_stringlist_new();
@@ -864,10 +860,10 @@ svc_stop_deps(RC_SERVICE state)
if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL)) if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL))
eerrorx("failed to load deptree"); eerrorx("failed to load deptree");
if (!deptypes_m) if (!types_m)
setup_deptypes(); setup_types();
services = rc_deptree_depends(deptree, deptypes_m, applet_list, services = rc_deptree_depends(deptree, types_m, applet_list,
runlevel, depoptions); runlevel, depoptions);
tmplist = rc_stringlist_new(); tmplist = rc_stringlist_new();
TAILQ_FOREACH_REVERSE(svc, services, rc_stringlist, entries) { TAILQ_FOREACH_REVERSE(svc, services, rc_stringlist, entries) {
@@ -927,7 +923,7 @@ svc_stop_deps(RC_SERVICE state)
/* We now wait for other services that may use us and are /* We now wait for other services that may use us and are
* stopping. This is important when a runlevel stops */ * stopping. This is important when a runlevel stops */
services = rc_deptree_depends(deptree, deptypes_mua, applet_list, services = rc_deptree_depends(deptree, types_mua, applet_list,
runlevel, depoptions); runlevel, depoptions);
TAILQ_FOREACH(svc, services, entries) { TAILQ_FOREACH(svc, services, entries) {
if (rc_service_state(svc->value) & RC_SERVICE_STOPPED) if (rc_service_state(svc->value) & RC_SERVICE_STOPPED)