Compare commits
15 Commits
funtoo-ope
...
funtoo-ope
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4faf63a8eb | ||
|
|
d229ca4a66 | ||
|
|
7e441c6774 | ||
|
|
701a81ba6b | ||
|
|
b8a016aaba | ||
|
|
63f5256b59 | ||
|
|
c420f56856 | ||
|
|
5b0f323da9 | ||
|
|
d86853538a | ||
|
|
f2c0e700c6 | ||
|
|
b1de9d7324 | ||
|
|
5b4886d23e | ||
|
|
2a53efbc07 | ||
|
|
a530722f65 | ||
|
|
661e9cf002 |
@@ -1,3 +1,3 @@
|
|||||||
NAME= openrc
|
NAME= openrc
|
||||||
VERSION= 0.13
|
VERSION= 0.12.3
|
||||||
PKG= ${NAME}-${VERSION}
|
PKG= ${NAME}-${VERSION}
|
||||||
|
|||||||
4
init.d/.gitignore
vendored
4
init.d/.gitignore
vendored
@@ -3,8 +3,9 @@ fsck
|
|||||||
hostname
|
hostname
|
||||||
local
|
local
|
||||||
localmount
|
localmount
|
||||||
loopback
|
|
||||||
moused
|
moused
|
||||||
|
net.lo
|
||||||
|
net.lo0
|
||||||
netmount
|
netmount
|
||||||
network
|
network
|
||||||
root
|
root
|
||||||
@@ -40,5 +41,4 @@ syslogd
|
|||||||
termencoding
|
termencoding
|
||||||
ttys
|
ttys
|
||||||
wscons
|
wscons
|
||||||
tmpfiles.dev
|
|
||||||
tmpfiles.setup
|
tmpfiles.setup
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
include ../mk/net.mk
|
include ../mk/net.mk
|
||||||
|
|
||||||
DIR= ${INITDIR}
|
DIR= ${INITDIR}
|
||||||
SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in loopback.in \
|
SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in \
|
||||||
netmount.in root.in savecache.in swap.in swapfiles.in \
|
netmount.in root.in savecache.in swap.in swapfiles.in \
|
||||||
tmpfiles.setup.in swclock.in sysctl.in urandom.in ${SRCS-${OS}}
|
tmpfiles.setup.in swclock.in sysctl.in urandom.in ${SRCS-${OS}}
|
||||||
BIN= ${OBJS}
|
BIN= ${OBJS}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ _IFS="
|
|||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
use dev clock modules
|
use dev clock modules
|
||||||
keyword -jail -openvz -prefix -timeout -vserver -lxc
|
keyword -jail -openvz -prefix -timeout -vserver -lxc -uml
|
||||||
}
|
}
|
||||||
|
|
||||||
_abort() {
|
_abort() {
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
#!@SBINDIR@/runscript
|
|
||||||
# Copyright (c) 2013 William Hubbs <w.d.hubbs@gmail.com>
|
|
||||||
# Released under the 2-clause BSD license.
|
|
||||||
|
|
||||||
description="Configures the loopback interface."
|
|
||||||
|
|
||||||
depend()
|
|
||||||
{
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
start()
|
|
||||||
{
|
|
||||||
if [ "$RC_UNAME" = Linux ]; then
|
|
||||||
ebegin "Bringing up network interface lo"
|
|
||||||
if type ip > /dev/null 2>&1; then
|
|
||||||
ip addr add 127.0.0.1/8 dev lo brd + scope host
|
|
||||||
ip route add 127.0.0.0/8 dev lo scope host
|
|
||||||
ip link set lo up
|
|
||||||
else
|
|
||||||
ifconfig lo 127.0.0.1 netmask 255.0.0.0
|
|
||||||
route add -net 127.0.0.0 netmask 255.0.0.0 gw 127.0.0.1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
ebegin "Bringing up network interface lo0"
|
|
||||||
ifconfig lo0 127.0.0.1 netmask 255.0.0.0
|
|
||||||
route -q add -inet 127.0.0.0 -netmask 255.0.0.0 127.0.0.1
|
|
||||||
fi
|
|
||||||
eend $?
|
|
||||||
}
|
|
||||||
|
|
||||||
stop()
|
|
||||||
{
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
@@ -12,7 +12,7 @@ depend()
|
|||||||
config /etc/fstab
|
config /etc/fstab
|
||||||
use afc-client amd autofs openvpn
|
use afc-client amd autofs openvpn
|
||||||
use dns
|
use dns
|
||||||
keyword -jail -prefix -vserver
|
keyword -jail -prefix -vserver -lxc
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
@@ -105,8 +105,7 @@ and
|
|||||||
respectively, but only work when
|
respectively, but only work when
|
||||||
.Va EINFO_VERBOSE
|
.Va EINFO_VERBOSE
|
||||||
is true. You can also make the
|
is true. You can also make the
|
||||||
.Fn einfo ,
|
.Fn einfo
|
||||||
.Fn ewarn ,
|
|
||||||
and
|
and
|
||||||
.Fn ebegin
|
.Fn ebegin
|
||||||
functions silent by setting
|
functions silent by setting
|
||||||
@@ -185,12 +184,6 @@ when set to true makes the
|
|||||||
and
|
and
|
||||||
.Fn einfon
|
.Fn einfon
|
||||||
family of functions quiet, so nothing is printed.
|
family of functions quiet, so nothing is printed.
|
||||||
.Va EERROR_QUIET
|
|
||||||
when set to true makes the
|
|
||||||
.Fn eerror
|
|
||||||
and
|
|
||||||
.Fn eerrorn
|
|
||||||
family of functions quiet, so nothing is printed.
|
|
||||||
.Pp
|
.Pp
|
||||||
.Va EINFO_VERBOSE
|
.Va EINFO_VERBOSE
|
||||||
when set to true makes the
|
when set to true makes the
|
||||||
|
|||||||
@@ -60,12 +60,12 @@ First we ensure that any services that depend on us are stopped. If any
|
|||||||
services that need us fail to stop then we exit with a suitable error,
|
services that need us fail to stop then we exit with a suitable error,
|
||||||
otherwise call the supplied stop function if it exists.
|
otherwise call the supplied stop function if it exists.
|
||||||
.It Ar restart
|
.It Ar restart
|
||||||
Stops and starts the service, including dependencies. This cannot be
|
Stop and start the service, including dependencies. This cannot be
|
||||||
overridden. See the description of the RC_CMD variable below for the
|
overridden. See the description of the RC_CMD variable below for the
|
||||||
method to make your service behave differently when restart is being
|
method to make your service behave differently when restart is being
|
||||||
executed.
|
executed.
|
||||||
.It Ar status
|
.It Ar status
|
||||||
Shows the status of the service. The return code matches the status, with the
|
Show the status of the service. The return code matches the status, with the
|
||||||
exception of "started" returning 0 to match standard command behaviour.
|
exception of "started" returning 0 to match standard command behaviour.
|
||||||
.It Ar zap
|
.It Ar zap
|
||||||
Resets the service state to stopped and removes all saved data about the
|
Resets the service state to stopped and removes all saved data about the
|
||||||
@@ -88,8 +88,8 @@ Output from any non OpenRC commands is not affected.
|
|||||||
.It Fl v , -verbose
|
.It Fl v , -verbose
|
||||||
Turns on any extra informational output the service generates.
|
Turns on any extra informational output the service generates.
|
||||||
.It Fl Z , -dry-run
|
.It Fl Z , -dry-run
|
||||||
Shows which services would be stopped and/or started without actually stopping
|
Shows what services would be stopped and/or started without actually starting
|
||||||
or starting them.
|
or stopping them.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
The following variables affect the service script:
|
The following variables affect the service script:
|
||||||
@@ -471,7 +471,7 @@ start_pre()
|
|||||||
# stop_post.
|
# stop_post.
|
||||||
fi
|
fi
|
||||||
# Ensure that our dirs are correct
|
# Ensure that our dirs are correct
|
||||||
checkpath --directory --owner foo:foo --mode 0775 \\
|
checkpath --dir --owner foo:foo --mode 0664 \\
|
||||||
/var/run/foo /var/cache/foo
|
/var/run/foo /var/cache/foo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
include ../mk/net.mk
|
include ../mk/net.mk
|
||||||
|
|
||||||
BOOT= bootmisc fsck hostname localmount loopback \
|
BOOT= bootmisc fsck hostname localmount \
|
||||||
root swap swapfiles sysctl urandom ${BOOT-${OS}}
|
root swap swapfiles sysctl urandom ${BOOT-${OS}}
|
||||||
DEFAULT= local netmount
|
DEFAULT= local netmount
|
||||||
SHUTDOWN= savecache ${SHUTDOWN-${OS}}
|
SHUTDOWN= savecache ${SHUTDOWN-${OS}}
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ cgroup_set_limits()
|
|||||||
|
|
||||||
cgroup_cleanup()
|
cgroup_cleanup()
|
||||||
{
|
{
|
||||||
yesno "${rc_cgroup_cleanup:-no}" && cgroup_running || return 0
|
cgroup_running || return 0
|
||||||
ebegin "starting cgroups cleanup"
|
ebegin "starting cgroups cleanup"
|
||||||
for sig in TERM QUIT INT; do
|
for sig in TERM QUIT INT; do
|
||||||
cgroup_get_pids || { eend 0 "finished" ; return 0 ; }
|
cgroup_get_pids || { eend 0 "finished" ; return 0 ; }
|
||||||
|
|||||||
@@ -308,6 +308,7 @@ while [ -n "$1" ]; do
|
|||||||
fi
|
fi
|
||||||
[ "$(command -v cgroup_cleanup)" = "cgroup_cleanup" -a \
|
[ "$(command -v cgroup_cleanup)" = "cgroup_cleanup" -a \
|
||||||
"$1" = "stop" ] && \
|
"$1" = "stop" ] && \
|
||||||
|
yesno "${rc_cgroup_cleanup}" && \
|
||||||
cgroup_cleanup
|
cgroup_cleanup
|
||||||
shift
|
shift
|
||||||
continue 2
|
continue 2
|
||||||
|
|||||||
@@ -273,12 +273,6 @@ is_quiet(void)
|
|||||||
return yesno(getenv("EINFO_QUIET"));
|
return yesno(getenv("EINFO_QUIET"));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
is_really_quiet(void)
|
|
||||||
{
|
|
||||||
return yesno(getenv("EERROR_QUIET"));
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
is_verbose(void)
|
is_verbose(void)
|
||||||
{
|
{
|
||||||
@@ -680,8 +674,6 @@ eerrorn(const char *EINFO_RESTRICT fmt, ...)
|
|||||||
int retval;
|
int retval;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
if (!fmt || is_really_quiet())
|
|
||||||
return 0;
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
retval = _eerrorvn(fmt, ap);
|
retval = _eerrorvn(fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
@@ -713,7 +705,7 @@ ewarn(const char *EINFO_RESTRICT fmt, ...)
|
|||||||
int retval;
|
int retval;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
if (!fmt || is_quiet())
|
if (!fmt)
|
||||||
return 0;
|
return 0;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
elogv(LOG_WARNING, fmt, ap);
|
elogv(LOG_WARNING, fmt, ap);
|
||||||
@@ -748,7 +740,7 @@ eerror(const char *EINFO_RESTRICT fmt, ...)
|
|||||||
int retval;
|
int retval;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
if (!fmt || is_really_quiet())
|
if (!fmt)
|
||||||
return 0;
|
return 0;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
elogv(LOG_ERR, fmt, ap);
|
elogv(LOG_ERR, fmt, ap);
|
||||||
@@ -765,7 +757,7 @@ eerrorx(const char *EINFO_RESTRICT fmt, ...)
|
|||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
if (fmt && !is_really_quiet()) {
|
if (fmt) {
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
elogv(LOG_ERR, fmt, ap);
|
elogv(LOG_ERR, fmt, ap);
|
||||||
_eerrorvn(fmt, ap);
|
_eerrorvn(fmt, ap);
|
||||||
|
|||||||
@@ -856,7 +856,7 @@ rc_deptree_update(void)
|
|||||||
* work for them. This doesn't stop them from being run directly. */
|
* work for them. This doesn't stop them from being run directly. */
|
||||||
if (sys) {
|
if (sys) {
|
||||||
len = strlen(sys);
|
len = strlen(sys);
|
||||||
nosys = xmalloc(len + 1);
|
nosys = xmalloc(len + 2);
|
||||||
nosys[0] = '-';
|
nosys[0] = '-';
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
nosys[i + 1] = (char)tolower((unsigned char)sys[i]);
|
nosys[i + 1] = (char)tolower((unsigned char)sys[i]);
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ file_regex(const char *file, const char *regex)
|
|||||||
str += strlen(str) + 1;
|
str += strlen(str) + 1;
|
||||||
/* len is the size of allocated buffer and we don't
|
/* len is the size of allocated buffer and we don't
|
||||||
want call regexec BUFSIZE times. find next str */
|
want call regexec BUFSIZE times. find next str */
|
||||||
while (*str == '\0' && str < line + len)
|
while (str < line + len && *str == '\0')
|
||||||
str++;
|
str++;
|
||||||
} while (str < line + len);
|
} while (str < line + len);
|
||||||
}
|
}
|
||||||
@@ -323,42 +323,6 @@ rc_parse_service_state(RC_SERVICE state)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns a list of all the chained runlevels used by the
|
|
||||||
* specified runlevel in dependency order, including the
|
|
||||||
* specified runlevel. */
|
|
||||||
static void
|
|
||||||
get_runlevel_chain(const char *runlevel, RC_STRINGLIST *level_list)
|
|
||||||
{
|
|
||||||
char path[PATH_MAX];
|
|
||||||
RC_STRINGLIST *dirs;
|
|
||||||
RC_STRING *d, *dn;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we haven't been passed a runlevel or a level list, or
|
|
||||||
* if the passed runlevel doesn't exist then we're done already!
|
|
||||||
*/
|
|
||||||
if (!runlevel || !level_list || !rc_runlevel_exists(runlevel))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We want to add this runlevel to the list but if
|
|
||||||
* it is already in the list it needs to go at the
|
|
||||||
* end again.
|
|
||||||
*/
|
|
||||||
if (rc_stringlist_find(level_list, runlevel))
|
|
||||||
rc_stringlist_delete(level_list, runlevel);
|
|
||||||
rc_stringlist_add(level_list, runlevel);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We can now do exactly the above procedure for our chained
|
|
||||||
* runlevels.
|
|
||||||
*/
|
|
||||||
snprintf(path, sizeof(path), "%s/%s", RC_RUNLEVELDIR, runlevel);
|
|
||||||
dirs = ls_dir(path, LS_DIR);
|
|
||||||
TAILQ_FOREACH_SAFE(d, dirs, entries, dn)
|
|
||||||
get_runlevel_chain(d->value, level_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
rc_runlevel_starting(void)
|
rc_runlevel_starting(void)
|
||||||
{
|
{
|
||||||
@@ -460,10 +424,22 @@ librc_hidden_def(rc_runlevel_unstack)
|
|||||||
RC_STRINGLIST *
|
RC_STRINGLIST *
|
||||||
rc_runlevel_stacks(const char *runlevel)
|
rc_runlevel_stacks(const char *runlevel)
|
||||||
{
|
{
|
||||||
RC_STRINGLIST *stack;
|
char path[PATH_MAX];
|
||||||
stack = rc_stringlist_new();
|
RC_STRINGLIST *dirs;
|
||||||
get_runlevel_chain(runlevel, stack);
|
RC_STRING *d, *dn;
|
||||||
return stack;
|
|
||||||
|
if (!runlevel)
|
||||||
|
return false;
|
||||||
|
snprintf(path, sizeof(path), "%s/%s", RC_RUNLEVELDIR, runlevel);
|
||||||
|
dirs = ls_dir(path, LS_DIR);
|
||||||
|
TAILQ_FOREACH_SAFE(d, dirs, entries, dn) {
|
||||||
|
if (!rc_runlevel_exists(d->value)) {
|
||||||
|
TAILQ_REMOVE(dirs, d, entries);
|
||||||
|
free(d->value);
|
||||||
|
free(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dirs;
|
||||||
}
|
}
|
||||||
librc_hidden_def(rc_runlevel_stacks)
|
librc_hidden_def(rc_runlevel_stacks)
|
||||||
|
|
||||||
@@ -927,13 +903,17 @@ rc_services_in_runlevel_stacked(const char *runlevel)
|
|||||||
stacks = rc_runlevel_stacks(runlevel);
|
stacks = rc_runlevel_stacks(runlevel);
|
||||||
TAILQ_FOREACH(stack, stacks, entries) {
|
TAILQ_FOREACH(stack, stacks, entries) {
|
||||||
sl = rc_services_in_runlevel(stack->value);
|
sl = rc_services_in_runlevel(stack->value);
|
||||||
TAILQ_CONCAT(list, sl, entries);
|
if (list != NULL) {
|
||||||
free(sl);
|
TAILQ_CONCAT(list, sl, entries);
|
||||||
|
free(sl);
|
||||||
|
} else
|
||||||
|
list = sl;
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
librc_hidden_def(rc_services_in_runlevel_stacked)
|
librc_hidden_def(rc_services_in_runlevel_stacked)
|
||||||
|
|
||||||
|
|
||||||
RC_STRINGLIST *
|
RC_STRINGLIST *
|
||||||
rc_services_in_state(RC_SERVICE state)
|
rc_services_in_state(RC_SERVICE state)
|
||||||
{
|
{
|
||||||
|
|||||||
1
src/rc/.gitignore
vendored
1
src/rc/.gitignore
vendored
@@ -3,7 +3,6 @@ rc-status
|
|||||||
rc-service
|
rc-service
|
||||||
rc-update
|
rc-update
|
||||||
runscript
|
runscript
|
||||||
service
|
|
||||||
start-stop-daemon
|
start-stop-daemon
|
||||||
einfon
|
einfon
|
||||||
einfo
|
einfo
|
||||||
|
|||||||
@@ -35,21 +35,6 @@
|
|||||||
# define _noreturn
|
# define _noreturn
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void set_quiet_options(void)
|
|
||||||
{
|
|
||||||
static int qcount = 0;
|
|
||||||
|
|
||||||
qcount ++;
|
|
||||||
switch (qcount) {
|
|
||||||
case 1:
|
|
||||||
setenv ("EINFO_QUIET", "YES", 1);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
setenv ("EERROR_QUIET", "YES", 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_noreturn static void
|
_noreturn static void
|
||||||
show_version(void)
|
show_version(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,13 +38,13 @@
|
|||||||
"Disable color output", \
|
"Disable color output", \
|
||||||
"Display software version", \
|
"Display software version", \
|
||||||
"Run verbosely", \
|
"Run verbosely", \
|
||||||
"Run quietly (repeat to suppress errors)"
|
"Run quietly (Does not affect errors)"
|
||||||
|
|
||||||
#define case_RC_COMMON_getopt_case_C setenv ("EINFO_COLOR", "NO", 1);
|
#define case_RC_COMMON_getopt_case_C setenv ("EINFO_COLOR", "NO", 1);
|
||||||
#define case_RC_COMMON_getopt_case_h usage (EXIT_SUCCESS);
|
#define case_RC_COMMON_getopt_case_h usage (EXIT_SUCCESS);
|
||||||
#define case_RC_COMMON_getopt_case_V if (argc == 2) show_version();
|
#define case_RC_COMMON_getopt_case_V if (argc == 2) show_version();
|
||||||
#define case_RC_COMMON_getopt_case_v setenv ("EINFO_VERBOSE", "YES", 1);
|
#define case_RC_COMMON_getopt_case_v setenv ("EINFO_VERBOSE", "YES", 1);
|
||||||
#define case_RC_COMMON_getopt_case_q set_quiet_options();
|
#define case_RC_COMMON_getopt_case_q setenv ("EINFO_QUIET", "YES", 1);
|
||||||
#define case_RC_COMMON_getopt_default usage (EXIT_FAILURE);
|
#define case_RC_COMMON_getopt_default usage (EXIT_FAILURE);
|
||||||
|
|
||||||
#define case_RC_COMMON_GETOPT \
|
#define case_RC_COMMON_GETOPT \
|
||||||
|
|||||||
@@ -171,26 +171,6 @@ print_services(const char *runlevel, RC_STRINGLIST *svcs)
|
|||||||
rc_stringlist_free(l);
|
rc_stringlist_free(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
print_stacked_services(const char *runlevel)
|
|
||||||
{
|
|
||||||
RC_STRINGLIST *stackedlevels, *servicelist;
|
|
||||||
RC_STRING *stackedlevel;
|
|
||||||
|
|
||||||
stackedlevels = rc_runlevel_stacks(runlevel);
|
|
||||||
TAILQ_FOREACH(stackedlevel, stackedlevels, entries) {
|
|
||||||
if (rc_stringlist_find(levels, stackedlevel->value) != NULL)
|
|
||||||
continue;
|
|
||||||
print_level("Stacked", stackedlevel->value);
|
|
||||||
servicelist = rc_services_in_runlevel(stackedlevel->value);
|
|
||||||
print_services(stackedlevel->value, servicelist);
|
|
||||||
rc_stringlist_free(servicelist);
|
|
||||||
print_stacked_services(stackedlevel->value);
|
|
||||||
}
|
|
||||||
rc_stringlist_free(stackedlevels);
|
|
||||||
stackedlevels = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "_usage.h"
|
#include "_usage.h"
|
||||||
#define usagestring "" \
|
#define usagestring "" \
|
||||||
"Usage: rc-status [options] <runlevel>...\n" \
|
"Usage: rc-status [options] <runlevel>...\n" \
|
||||||
@@ -219,8 +199,7 @@ static const char * const longopts_help[] = {
|
|||||||
int
|
int
|
||||||
rc_status(int argc, char **argv)
|
rc_status(int argc, char **argv)
|
||||||
{
|
{
|
||||||
RC_STRING *s, *l, *t, *level;
|
RC_STRING *s, *l, *t;
|
||||||
|
|
||||||
char *p, *runlevel = NULL;
|
char *p, *runlevel = NULL;
|
||||||
int opt, aflag = 0, retval = 0;
|
int opt, aflag = 0, retval = 0;
|
||||||
|
|
||||||
@@ -301,7 +280,16 @@ rc_status(int argc, char **argv)
|
|||||||
print_level(NULL, l->value);
|
print_level(NULL, l->value);
|
||||||
services = rc_services_in_runlevel(l->value);
|
services = rc_services_in_runlevel(l->value);
|
||||||
print_services(l->value, services);
|
print_services(l->value, services);
|
||||||
print_stacked_services(l->value);
|
nservices = rc_runlevel_stacks(l->value);
|
||||||
|
TAILQ_FOREACH(s, nservices, entries) {
|
||||||
|
if (rc_stringlist_find(levels, s->value) != NULL)
|
||||||
|
continue;
|
||||||
|
print_level("Stacked", s->value);
|
||||||
|
sservices = rc_services_in_runlevel(s->value);
|
||||||
|
print_services(s->value, sservices);
|
||||||
|
rc_stringlist_free(sservices);
|
||||||
|
}
|
||||||
|
sservices = NULL;
|
||||||
rc_stringlist_free(nservices);
|
rc_stringlist_free(nservices);
|
||||||
nservices = NULL;
|
nservices = NULL;
|
||||||
rc_stringlist_free(services);
|
rc_stringlist_free(services);
|
||||||
@@ -329,14 +317,16 @@ rc_status(int argc, char **argv)
|
|||||||
services = rc_services_in_runlevel(NULL);
|
services = rc_services_in_runlevel(NULL);
|
||||||
sservices = rc_stringlist_new();
|
sservices = rc_stringlist_new();
|
||||||
TAILQ_FOREACH(l, levels, entries) {
|
TAILQ_FOREACH(l, levels, entries) {
|
||||||
nservices = rc_services_in_runlevel_stacked(l->value);
|
nservices = rc_services_in_runlevel(l->value);
|
||||||
TAILQ_CONCAT(sservices, nservices, entries);
|
TAILQ_CONCAT(sservices, nservices, entries);
|
||||||
free(nservices);
|
free(nservices);
|
||||||
}
|
}
|
||||||
TAILQ_FOREACH_SAFE(s, services, entries, t) {
|
TAILQ_FOREACH_SAFE(s, services, entries, t) {
|
||||||
if ((rc_stringlist_find(sservices, s->value) ||
|
if (rc_stringlist_find(sservices, s->value) ||
|
||||||
(rc_service_state(s->value) & ( RC_SERVICE_STOPPED | RC_SERVICE_HOTPLUGGED)))) {
|
rc_service_state(s->value) &
|
||||||
TAILQ_REMOVE(services, s, entries);
|
(RC_SERVICE_STOPPED | RC_SERVICE_HOTPLUGGED))
|
||||||
|
{
|
||||||
|
TAILQ_REMOVE(services, s, entries);
|
||||||
free(s->value);
|
free(s->value);
|
||||||
free(s);
|
free(s);
|
||||||
}
|
}
|
||||||
@@ -347,23 +337,22 @@ rc_status(int argc, char **argv)
|
|||||||
alist = rc_stringlist_new();
|
alist = rc_stringlist_new();
|
||||||
l = rc_stringlist_add(alist, "");
|
l = rc_stringlist_add(alist, "");
|
||||||
p = l->value;
|
p = l->value;
|
||||||
TAILQ_FOREACH(level, levels, entries) {
|
if (!runlevel)
|
||||||
TAILQ_FOREACH_SAFE(s, services, entries, t) {
|
runlevel = rc_runlevel_get();
|
||||||
l->value = s->value;
|
TAILQ_FOREACH_SAFE(s, services, entries, t) {
|
||||||
setenv("RC_SVCNAME", l->value, 1);
|
l->value = s->value;
|
||||||
tmp = rc_deptree_depends(deptree, needsme, alist, level->value, RC_DEP_TRACE);
|
unsetenv("RC_SVCNAME");
|
||||||
if (TAILQ_FIRST(tmp)) {
|
setenv("RC_SVCNAME", l->value, 1);
|
||||||
TAILQ_REMOVE(services, s, entries);
|
tmp = rc_deptree_depends(deptree, needsme, alist, runlevel, RC_DEP_TRACE);
|
||||||
TAILQ_INSERT_TAIL(nservices, s, entries);
|
if (TAILQ_FIRST(tmp)) {
|
||||||
}
|
TAILQ_REMOVE(services, s, entries);
|
||||||
rc_stringlist_free(tmp);
|
TAILQ_INSERT_TAIL(nservices, s, entries);
|
||||||
}
|
}
|
||||||
|
rc_stringlist_free(tmp);
|
||||||
}
|
}
|
||||||
l->value = p;
|
l->value = p;
|
||||||
/*
|
/* we are unsetting RC_SVCNAME because last loaded service
|
||||||
* we are unsetting RC_SVCNAME because last loaded service will not
|
wount be added to list */
|
||||||
* be added to the list
|
|
||||||
*/
|
|
||||||
unsetenv("RC_SVCNAME");
|
unsetenv("RC_SVCNAME");
|
||||||
print_level("Dynamic", "needed");
|
print_level("Dynamic", "needed");
|
||||||
print_services(NULL, nservices);
|
print_services(NULL, nservices);
|
||||||
|
|||||||
92
src/rc/rc.c
92
src/rc/rc.c
@@ -79,6 +79,12 @@ const char rc_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
|
|||||||
|
|
||||||
const char *applet = NULL;
|
const char *applet = NULL;
|
||||||
static char *runlevel;
|
static char *runlevel;
|
||||||
|
static RC_STRINGLIST *hotplugged_services;
|
||||||
|
static RC_STRINGLIST *stop_services;
|
||||||
|
static RC_STRINGLIST *start_services;
|
||||||
|
static RC_STRINGLIST *types_n;
|
||||||
|
static RC_STRINGLIST *types_nua;
|
||||||
|
static RC_DEPTREE *deptree;
|
||||||
static RC_HOOK hook_out;
|
static RC_HOOK hook_out;
|
||||||
|
|
||||||
struct termios *termios_orig = NULL;
|
struct termios *termios_orig = NULL;
|
||||||
@@ -518,9 +524,7 @@ runlevel_config(const char *service, const char *level)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_stop_services(const RC_STRINGLIST *types_n, const RC_STRINGLIST *start_services,
|
do_stop_services(const char *newlevel, bool parallel, bool going_down)
|
||||||
const RC_STRINGLIST *stop_services, const RC_DEPTREE *deptree,
|
|
||||||
const char *newlevel, bool parallel, bool going_down)
|
|
||||||
{
|
{
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
RC_STRING *service, *svc1, *svc2;
|
RC_STRING *service, *svc1, *svc2;
|
||||||
@@ -623,7 +627,7 @@ stop:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_start_services(const RC_STRINGLIST *start_services, bool parallel)
|
do_start_services(bool parallel)
|
||||||
{
|
{
|
||||||
RC_STRING *service;
|
RC_STRING *service;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
@@ -750,12 +754,6 @@ main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
const char *bootlevel = NULL;
|
const char *bootlevel = NULL;
|
||||||
char *newlevel = NULL;
|
char *newlevel = NULL;
|
||||||
static RC_STRINGLIST *hotplugged_services;
|
|
||||||
static RC_STRINGLIST *stop_services;
|
|
||||||
static RC_STRINGLIST *start_services;
|
|
||||||
static RC_STRINGLIST *types_n;
|
|
||||||
static RC_STRINGLIST *types_nua;
|
|
||||||
static RC_DEPTREE *deptree;
|
|
||||||
RC_STRINGLIST *deporder = NULL;
|
RC_STRINGLIST *deporder = NULL;
|
||||||
RC_STRINGLIST *tmplist;
|
RC_STRINGLIST *tmplist;
|
||||||
RC_STRING *service;
|
RC_STRING *service;
|
||||||
@@ -870,11 +868,7 @@ main(int argc, char **argv)
|
|||||||
snprintf(pidstr, sizeof(pidstr), "%d", getpid());
|
snprintf(pidstr, sizeof(pidstr), "%d", getpid());
|
||||||
setenv("RC_PID", pidstr, 1);
|
setenv("RC_PID", pidstr, 1);
|
||||||
|
|
||||||
/* Create a list of all services which should be started for the new or
|
/* Load current runlevel */
|
||||||
* current runlevel including those in boot, sysinit and hotplugged
|
|
||||||
* runlevels. Clearly, some of these will already be started so we
|
|
||||||
* won't actually be starting them all.
|
|
||||||
*/
|
|
||||||
bootlevel = getenv("RC_BOOTLEVEL");
|
bootlevel = getenv("RC_BOOTLEVEL");
|
||||||
runlevel = rc_runlevel_get();
|
runlevel = rc_runlevel_get();
|
||||||
|
|
||||||
@@ -978,13 +972,8 @@ main(int argc, char **argv)
|
|||||||
applet, RC_STOPPING, strerror(errno));
|
applet, RC_STOPPING, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create a list of all services which we could stop (assuming
|
/* Build a list of all services to stop and then work out the
|
||||||
* they won't be active in the new or current runlevel) including
|
* correct order for stopping them */
|
||||||
* all those services which have been started, are inactive or
|
|
||||||
* are currently starting. Clearly, some of these will be listed
|
|
||||||
* in the new or current runlevel so we won't actually be stopping
|
|
||||||
* them all.
|
|
||||||
*/
|
|
||||||
stop_services = rc_services_in_state(RC_SERVICE_STARTED);
|
stop_services = rc_services_in_state(RC_SERVICE_STARTED);
|
||||||
tmplist = rc_services_in_state(RC_SERVICE_INACTIVE);
|
tmplist = rc_services_in_state(RC_SERVICE_INACTIVE);
|
||||||
TAILQ_CONCAT(stop_services, tmplist, entries);
|
TAILQ_CONCAT(stop_services, tmplist, entries);
|
||||||
@@ -1007,11 +996,7 @@ main(int argc, char **argv)
|
|||||||
stop_services = tmplist;
|
stop_services = tmplist;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create a list of all services which should be started for the new or
|
/* Load our list of start services */
|
||||||
* current runlevel including those in boot, sysinit and hotplugged
|
|
||||||
* runlevels. Clearly, some of these will already be started so we
|
|
||||||
* won't actually be starting them all.
|
|
||||||
*/
|
|
||||||
hotplugged_services = rc_services_in_state(RC_SERVICE_HOTPLUGGED);
|
hotplugged_services = rc_services_in_state(RC_SERVICE_HOTPLUGGED);
|
||||||
start_services = rc_services_in_runlevel_stacked(newlevel ?
|
start_services = rc_services_in_runlevel_stacked(newlevel ?
|
||||||
newlevel : runlevel);
|
newlevel : runlevel);
|
||||||
@@ -1021,11 +1006,9 @@ main(int argc, char **argv)
|
|||||||
tmplist = rc_services_in_runlevel(RC_LEVEL_SYSINIT);
|
tmplist = rc_services_in_runlevel(RC_LEVEL_SYSINIT);
|
||||||
TAILQ_CONCAT(start_services, tmplist, entries);
|
TAILQ_CONCAT(start_services, tmplist, entries);
|
||||||
free(tmplist);
|
free(tmplist);
|
||||||
/* If we are NOT headed for the single-user runlevel... */
|
|
||||||
if (strcmp(newlevel ? newlevel : runlevel,
|
if (strcmp(newlevel ? newlevel : runlevel,
|
||||||
RC_LEVEL_SINGLE) != 0)
|
RC_LEVEL_SINGLE) != 0)
|
||||||
{
|
{
|
||||||
/* If we are NOT headed for the boot runlevel... */
|
|
||||||
if (strcmp(newlevel ? newlevel : runlevel,
|
if (strcmp(newlevel ? newlevel : runlevel,
|
||||||
bootlevel) != 0)
|
bootlevel) != 0)
|
||||||
{
|
{
|
||||||
@@ -1046,7 +1029,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
/* Now stop the services that shouldn't be running */
|
/* Now stop the services that shouldn't be running */
|
||||||
if (stop_services && !nostop)
|
if (stop_services && !nostop)
|
||||||
do_stop_services(types_n, start_services, stop_services, deptree, newlevel, parallel, going_down);
|
do_stop_services(newlevel, parallel, going_down);
|
||||||
|
|
||||||
/* Wait for our services to finish */
|
/* Wait for our services to finish */
|
||||||
wait_for_services();
|
wait_for_services();
|
||||||
@@ -1082,10 +1065,18 @@ main(int argc, char **argv)
|
|||||||
TAILQ_FOREACH(service, hotplugged_services, entries)
|
TAILQ_FOREACH(service, hotplugged_services, entries)
|
||||||
rc_service_mark(service->value, RC_SERVICE_HOTPLUGGED);
|
rc_service_mark(service->value, RC_SERVICE_HOTPLUGGED);
|
||||||
|
|
||||||
|
/* Order the services to start */
|
||||||
|
if (start_services) {
|
||||||
|
rc_stringlist_sort(&start_services);
|
||||||
|
deporder = rc_deptree_depends(deptree, types_nua,
|
||||||
|
start_services, runlevel,
|
||||||
|
depoptions | RC_DEP_START);
|
||||||
|
rc_stringlist_free(start_services);
|
||||||
|
start_services = deporder;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
/* If the "noinit" parameter was passed on the kernel command line then
|
/* mark any services skipped as started */
|
||||||
* mark the specified services as started so they will not be started
|
|
||||||
* by us. */
|
|
||||||
proc = p = rc_proc_getent("noinit");
|
proc = p = rc_proc_getent("noinit");
|
||||||
if (proc) {
|
if (proc) {
|
||||||
while ((token = strsep(&p, ",")))
|
while ((token = strsep(&p, ",")))
|
||||||
@@ -1094,38 +1085,19 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If we have a list of services to start then... */
|
|
||||||
if (start_services) {
|
if (start_services) {
|
||||||
/* Get a list of the chained runlevels which compose the target runlevel */
|
do_start_services(parallel);
|
||||||
RC_STRINGLIST *runlevel_chain = rc_runlevel_stacks(runlevel);
|
/* FIXME: If we skip the boot runlevel and go straight
|
||||||
|
* to default from sysinit, we should now re-evaluate our
|
||||||
|
* start services + hotplugged services and call
|
||||||
|
* do_start_services a second time. */
|
||||||
|
|
||||||
/* Loop through them in reverse order. */
|
/* Wait for our services to finish */
|
||||||
RC_STRING *rlevel;
|
wait_for_services();
|
||||||
TAILQ_FOREACH_REVERSE(rlevel, runlevel_chain, rc_stringlist, entries)
|
|
||||||
{
|
|
||||||
/* Get a list of all the services in that runlevel */
|
|
||||||
RC_STRINGLIST *run_services = rc_services_in_runlevel(rlevel->value);
|
|
||||||
|
|
||||||
/* Start those services. */
|
|
||||||
rc_stringlist_sort(&run_services);
|
|
||||||
deporder = rc_deptree_depends(deptree, types_nua, run_services, rlevel->value, depoptions | RC_DEP_START);
|
|
||||||
rc_stringlist_free(run_services);
|
|
||||||
run_services = deporder;
|
|
||||||
do_start_services(run_services, parallel);
|
|
||||||
|
|
||||||
/* Wait for our services to finish */
|
|
||||||
wait_for_services();
|
|
||||||
|
|
||||||
/* Free the list of services, we're done with it. */
|
|
||||||
rc_stringlist_free(run_services);
|
|
||||||
}
|
|
||||||
rc_stringlist_free(runlevel_chain);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
/* If the "noinit" parameter was passed on the kernel command line then
|
/* mark any services skipped as stopped */
|
||||||
* mark the specified services as stopped so that our records reflect
|
|
||||||
* reality. */
|
|
||||||
proc = p = rc_proc_getent("noinit");
|
proc = p = rc_proc_getent("noinit");
|
||||||
if (proc) {
|
if (proc) {
|
||||||
while ((token = strsep(&p, ",")))
|
while ((token = strsep(&p, ",")))
|
||||||
|
|||||||
@@ -307,7 +307,7 @@ parse_schedule(const char *string, int timeout)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static pid_t
|
static pid_t
|
||||||
get_pid(const char *pidfile)
|
get_pid(const char *pidfile, bool quiet)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
@@ -316,12 +316,12 @@ get_pid(const char *pidfile)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ((fp = fopen(pidfile, "r")) == NULL) {
|
if ((fp = fopen(pidfile, "r")) == NULL) {
|
||||||
eerror("%s: fopen `%s': %s", applet, pidfile, strerror(errno));
|
ewarnv("%s: fopen `%s': %s", applet, pidfile, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fscanf(fp, "%d", &pid) != 1) {
|
if (fscanf(fp, "%d", &pid) != 1) {
|
||||||
eerror("%s: no pid found in `%s'", applet, pidfile);
|
ewarnv("%s: no pid found in `%s'", applet, pidfile);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -334,7 +334,8 @@ get_pid(const char *pidfile)
|
|||||||
/* return number of processed killed, -1 on error */
|
/* return number of processed killed, -1 on error */
|
||||||
static int
|
static int
|
||||||
do_stop(const char *exec, const char *const *argv,
|
do_stop(const char *exec, const char *const *argv,
|
||||||
pid_t pid, uid_t uid,int sig, bool test)
|
pid_t pid, uid_t uid,int sig,
|
||||||
|
bool quiet, bool verbose, bool test)
|
||||||
{
|
{
|
||||||
RC_PIDLIST *pids;
|
RC_PIDLIST *pids;
|
||||||
RC_PID *pi;
|
RC_PID *pi;
|
||||||
@@ -352,16 +353,20 @@ do_stop(const char *exec, const char *const *argv,
|
|||||||
|
|
||||||
LIST_FOREACH_SAFE(pi, pids, entries, np) {
|
LIST_FOREACH_SAFE(pi, pids, entries, np) {
|
||||||
if (test) {
|
if (test) {
|
||||||
einfo("Would send signal %d to PID %d", sig, pi->pid);
|
if (!quiet)
|
||||||
|
einfo("Would send signal %d to PID %d", sig, pi->pid);
|
||||||
nkilled++;
|
nkilled++;
|
||||||
} else {
|
} else {
|
||||||
ebeginv("Sending signal %d to PID %d", sig, pi->pid);
|
if (verbose)
|
||||||
|
ebegin("Sending signal %d to PID %d",
|
||||||
|
sig, pi->pid);
|
||||||
errno = 0;
|
errno = 0;
|
||||||
killed = (kill(pi->pid, sig) == 0 ||
|
killed = (kill(pi->pid, sig) == 0 ||
|
||||||
errno == ESRCH ? true : false);
|
errno == ESRCH ? true : false);
|
||||||
eendv(killed ? 0 : 1,
|
if (verbose)
|
||||||
"%s: failed to send signal %d to PID %d: %s",
|
eend(killed ? 0 : 1,
|
||||||
applet, sig, pi->pid, strerror(errno));
|
"%s: failed to send signal %d to PID %d: %s",
|
||||||
|
applet, sig, pi->pid, strerror(errno));
|
||||||
if (!killed) {
|
if (!killed) {
|
||||||
nkilled = -1;
|
nkilled = -1;
|
||||||
} else {
|
} else {
|
||||||
@@ -379,7 +384,7 @@ do_stop(const char *exec, const char *const *argv,
|
|||||||
static int
|
static int
|
||||||
run_stop_schedule(const char *exec, const char *const *argv,
|
run_stop_schedule(const char *exec, const char *const *argv,
|
||||||
const char *pidfile, uid_t uid,
|
const char *pidfile, uid_t uid,
|
||||||
bool test, bool progress)
|
bool quiet, bool verbose, bool test, bool progress)
|
||||||
{
|
{
|
||||||
SCHEDULEITEM *item = TAILQ_FIRST(&schedule);
|
SCHEDULEITEM *item = TAILQ_FIRST(&schedule);
|
||||||
int nkilled = 0;
|
int nkilled = 0;
|
||||||
@@ -391,15 +396,15 @@ run_stop_schedule(const char *exec, const char *const *argv,
|
|||||||
const char *const *p;
|
const char *const *p;
|
||||||
bool progressed = false;
|
bool progressed = false;
|
||||||
|
|
||||||
if (exec)
|
if (verbose) {
|
||||||
einfov("Will stop %s", exec);
|
if (exec)
|
||||||
if (pidfile)
|
einfo ("Will stop %s", exec);
|
||||||
einfov("Will stop PID in pidfile `%s'", pidfile);
|
if (pidfile)
|
||||||
if (uid)
|
einfo("Will stop PID in pidfile `%s'", pidfile);
|
||||||
einfov("Will stop processes owned by UID %d", uid);
|
if (uid)
|
||||||
if (argv && *argv) {
|
einfo("Will stop processes owned by UID %d", uid);
|
||||||
einfovn("Will stop processes of `");
|
if (argv && *argv) {
|
||||||
if (rc_yesno(getenv("EINFO_VERBOSE"))) {
|
einfon("Will stop processes of `");
|
||||||
for (p = argv; p && *p; p++) {
|
for (p = argv; p && *p; p++) {
|
||||||
if (p != argv)
|
if (p != argv)
|
||||||
printf(" ");
|
printf(" ");
|
||||||
@@ -410,7 +415,7 @@ run_stop_schedule(const char *exec, const char *const *argv,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (pidfile) {
|
if (pidfile) {
|
||||||
pid = get_pid(pidfile);
|
pid = get_pid(pidfile, false);
|
||||||
if (pid == -1)
|
if (pid == -1)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -423,7 +428,8 @@ run_stop_schedule(const char *exec, const char *const *argv,
|
|||||||
|
|
||||||
case SC_SIGNAL:
|
case SC_SIGNAL:
|
||||||
nrunning = 0;
|
nrunning = 0;
|
||||||
nkilled = do_stop(exec, argv, pid, uid, item->value, test);
|
nkilled = do_stop(exec, argv, pid, uid, item->value,
|
||||||
|
quiet, verbose, test);
|
||||||
if (nkilled == 0) {
|
if (nkilled == 0) {
|
||||||
if (tkilled == 0) {
|
if (tkilled == 0) {
|
||||||
if (progressed)
|
if (progressed)
|
||||||
@@ -452,7 +458,8 @@ run_stop_schedule(const char *exec, const char *const *argv,
|
|||||||
nloops++)
|
nloops++)
|
||||||
{
|
{
|
||||||
if ((nrunning = do_stop(exec, argv,
|
if ((nrunning = do_stop(exec, argv,
|
||||||
pid, uid, 0, true)) == 0)
|
pid, uid, 0, true, false,
|
||||||
|
test)) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
||||||
@@ -669,6 +676,8 @@ start_stop_daemon(int argc, char **argv)
|
|||||||
bool stop = false;
|
bool stop = false;
|
||||||
bool oknodo = false;
|
bool oknodo = false;
|
||||||
bool test = false;
|
bool test = false;
|
||||||
|
bool quiet;
|
||||||
|
bool verbose = false;
|
||||||
char *exec = NULL;
|
char *exec = NULL;
|
||||||
char *startas = NULL;
|
char *startas = NULL;
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
@@ -905,6 +914,8 @@ start_stop_daemon(int argc, char **argv)
|
|||||||
endpwent();
|
endpwent();
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
argv += optind;
|
argv += optind;
|
||||||
|
quiet = rc_yesno(getenv("EINFO_QUIET"));
|
||||||
|
verbose = rc_yesno(getenv("EINFO_VERBOSE"));
|
||||||
|
|
||||||
/* Allow start-stop-daemon --signal HUP --exec /usr/sbin/dnsmasq
|
/* Allow start-stop-daemon --signal HUP --exec /usr/sbin/dnsmasq
|
||||||
* instead of forcing --stop --oknodo as well */
|
* instead of forcing --stop --oknodo as well */
|
||||||
@@ -1048,7 +1059,7 @@ start_stop_daemon(int argc, char **argv)
|
|||||||
else
|
else
|
||||||
parse_schedule(NULL, sig);
|
parse_schedule(NULL, sig);
|
||||||
i = run_stop_schedule(exec, (const char *const *)margv,
|
i = run_stop_schedule(exec, (const char *const *)margv,
|
||||||
pidfile, uid, test, progress);
|
pidfile, uid, quiet, verbose, test, progress);
|
||||||
|
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
/* We failed to stop something */
|
/* We failed to stop something */
|
||||||
@@ -1070,16 +1081,16 @@ start_stop_daemon(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (pidfile)
|
if (pidfile)
|
||||||
pid = get_pid(pidfile);
|
pid = get_pid(pidfile, true);
|
||||||
else
|
else
|
||||||
pid = 0;
|
pid = 0;
|
||||||
|
|
||||||
if (do_stop(exec, (const char * const *)margv, pid, uid,
|
if (do_stop(exec, (const char * const *)margv, pid, uid,
|
||||||
0, true) > 0)
|
0, true, false, test) > 0)
|
||||||
eerrorx("%s: %s is already running", applet, exec);
|
eerrorx("%s: %s is already running", applet, exec);
|
||||||
|
|
||||||
if (test) {
|
if (test) {
|
||||||
if (rc_yesno(getenv("EINFO_QUIET")))
|
if (quiet)
|
||||||
exit (EXIT_SUCCESS);
|
exit (EXIT_SUCCESS);
|
||||||
|
|
||||||
einfon("Would start");
|
einfon("Would start");
|
||||||
@@ -1103,8 +1114,10 @@ start_stop_daemon(int argc, char **argv)
|
|||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
ebeginv("Detaching to start `%s'", exec);
|
if (verbose) {
|
||||||
eindentv();
|
ebegin("Detaching to start `%s'", exec);
|
||||||
|
eindent();
|
||||||
|
}
|
||||||
|
|
||||||
/* Remove existing pidfile */
|
/* Remove existing pidfile */
|
||||||
if (pidfile)
|
if (pidfile)
|
||||||
@@ -1272,9 +1285,9 @@ start_stop_daemon(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* We don't redirect stdin as some daemons may need it */
|
/* We don't redirect stdin as some daemons may need it */
|
||||||
if (background || redirect_stdout || rc_yesno(getenv("EINFO_QUIET")))
|
if (background || quiet || redirect_stdout)
|
||||||
dup2(stdout_fd, STDOUT_FILENO);
|
dup2(stdout_fd, STDOUT_FILENO);
|
||||||
if (background || redirect_stderr || rc_yesno(getenv("EINFO_QUIET")))
|
if (background || redirect_stderr)
|
||||||
dup2(stderr_fd, STDERR_FILENO);
|
dup2(stderr_fd, STDERR_FILENO);
|
||||||
|
|
||||||
for (i = getdtablesize() - 1; i >= 3; --i)
|
for (i = getdtablesize() - 1; i >= 3; --i)
|
||||||
@@ -1305,10 +1318,9 @@ start_stop_daemon(int argc, char **argv)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} while (!WIFEXITED(i) && !WIFSIGNALED(i));
|
} while (!WIFEXITED(i) && !WIFSIGNALED(i));
|
||||||
if (!WIFEXITED(i) || WEXITSTATUS(i) != 0) {
|
if (!WIFEXITED(i) || WEXITSTATUS(i) != 0)
|
||||||
eerror("%s: failed to start `%s'", applet, exec);
|
eerrorx("%s: failed to start `%s'", applet, exec);
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
pid = spid;
|
pid = spid;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1342,7 +1354,7 @@ start_stop_daemon(int argc, char **argv)
|
|||||||
alive = true;
|
alive = true;
|
||||||
} else {
|
} else {
|
||||||
if (pidfile) {
|
if (pidfile) {
|
||||||
pid = get_pid(pidfile);
|
pid = get_pid(pidfile, false);
|
||||||
if (pid == -1) {
|
if (pid == -1) {
|
||||||
eerrorx("%s: did not "
|
eerrorx("%s: did not "
|
||||||
"create a valid"
|
"create a valid"
|
||||||
@@ -1352,7 +1364,7 @@ start_stop_daemon(int argc, char **argv)
|
|||||||
} else
|
} else
|
||||||
pid = 0;
|
pid = 0;
|
||||||
if (do_stop(exec, (const char *const *)margv,
|
if (do_stop(exec, (const char *const *)margv,
|
||||||
pid, uid, 0, true) > 0)
|
pid, uid, 0, true, false, test) > 0)
|
||||||
alive = true;
|
alive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user