Compare commits
	
		
			15 Commits
		
	
	
		
			funtoo-ope
			...
			openrc-0.1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 0853c110e5 | ||
|   | 1a43ce11d0 | ||
|   | 46e504b403 | ||
|   | fc1f3d14f4 | ||
|   | b8a016aaba | ||
|   | 63f5256b59 | ||
|   | c420f56856 | ||
|   | 5b0f323da9 | ||
|   | d86853538a | ||
|   | f2c0e700c6 | ||
|   | b1de9d7324 | ||
|   | 5b4886d23e | ||
|   | 2a53efbc07 | ||
|   | a530722f65 | ||
|   | 661e9cf002 | 
| @@ -1,3 +1,3 @@ | ||||
| NAME=		openrc | ||||
| VERSION=	0.13 | ||||
| VERSION=	0.12.4 | ||||
| PKG=		${NAME}-${VERSION} | ||||
|   | ||||
| @@ -1,2 +1,2 @@ | ||||
| # Set to the fully-qualified hostname of this machine | ||||
| # Set to the hostname of this machine | ||||
| hostname="localhost" | ||||
|   | ||||
							
								
								
									
										11
									
								
								etc/rc.conf.GNU-kFreeBSD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								etc/rc.conf.GNU-kFreeBSD
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| ############################################################################## | ||||
| # GNU/kFreeBSD SPECIFIC OPTIONS | ||||
|  | ||||
| # This is the subsystem type. Valid options on GNU/kFreeBSD: | ||||
| # ""        - nothing special | ||||
| # "jail"    - FreeBSD jails (not yet implemented) | ||||
| # If this is commented out, automatic detection will be used. | ||||
| # | ||||
| # This should be set to the value representing the environment this file is | ||||
| # PRESENTLY in, not the virtualization the environment is capable of. | ||||
| #rc_sys="" | ||||
							
								
								
									
										4
									
								
								init.d/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								init.d/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -3,8 +3,9 @@ fsck | ||||
| hostname | ||||
| local | ||||
| localmount | ||||
| loopback | ||||
| moused | ||||
| net.lo | ||||
| net.lo0 | ||||
| netmount | ||||
| network | ||||
| root | ||||
| @@ -40,5 +41,4 @@ syslogd | ||||
| termencoding | ||||
| ttys | ||||
| wscons | ||||
| tmpfiles.dev | ||||
| tmpfiles.setup | ||||
|   | ||||
| @@ -117,6 +117,7 @@ migrate_to_run() | ||||
|  | ||||
| clean_run() | ||||
| { | ||||
| 	[ "$RC_SYS" = VSERVER ] && return 0 | ||||
| 	local dir | ||||
| 	dir=$(mktemp -d) | ||||
| 	mount --bind / $dir | ||||
|   | ||||
| @@ -9,7 +9,7 @@ _IFS=" | ||||
| depend() | ||||
| { | ||||
| 	use dev clock modules | ||||
| 	keyword -jail -openvz -prefix -timeout -vserver -lxc | ||||
| 	keyword -jail -openvz -prefix -timeout -vserver -lxc -uml | ||||
| } | ||||
|  | ||||
| _abort() { | ||||
|   | ||||
| @@ -1,42 +1,18 @@ | ||||
| #!@PREFIX@/sbin/runscript | ||||
| #!@SBINDIR@/runscript | ||||
| # Copyright (c) 2007-2009 Roy Marples <roy@marples.name> | ||||
| # Released under the 2-clause BSD license. | ||||
|  | ||||
| description="Sets the hostname of the machine." | ||||
|  | ||||
| depend() { | ||||
| 	need root | ||||
| 	keyword -prefix -lxc | ||||
| } | ||||
|  | ||||
| start() | ||||
| { | ||||
| 	hostname=${hostname-${HOSTNAME-localhost}} | ||||
| 	out=$hostname | ||||
| 	short=${hostname%%.*} | ||||
| 	if [ "$short" != "$hostname" ]; then | ||||
| 		out="$out $short" | ||||
| 	fi | ||||
| 	if [ "$nisdomainname" != "" ]; then | ||||
| 		ebegin "Setting NIS domain name to $nisdomainname" | ||||
| 		nisdomainname $nisdomainname | ||||
| 		eend $? "Failed to set the NIS domain name" | ||||
| 	fi | ||||
| 	if [ "$short" != "localhost" ]; then | ||||
| 		out="$out localhost" | ||||
| 	fi | ||||
| 	if [ "$hostname" != "localhost.localdomain" ]; then | ||||
| 		out="$out localhost.localdomain" | ||||
| 	fi | ||||
| 	[ -n "$aliases" ] && out="$out $aliases" | ||||
| 	ebegin "Configuring /etc/hosts" | ||||
| 	[ -e /etc/hosts ] && sed -i -e '/[[:space:]]*127.0.0.1[[:space:]]/d' -e '/[[:space:]]*::1[[:space:]]/d' /etc/hosts | ||||
| 	cat <<END >> /etc/hosts | ||||
| 127.0.0.1	$out | ||||
| ::1		$out | ||||
| END | ||||
| 	chmod 0644 /etc/hosts | ||||
| 	eend $? | ||||
| 	[ "$RC_SYS" = "LXC" ] && return 0 | ||||
| 	# HOSTNAME variable used to be defined in caps in conf.d/hostname. | ||||
| 	# It is also a magic variable in bash. | ||||
| 	hostname=${hostname-${HOSTNAME-localhost}} # checkbashisms: false positive | ||||
| 	ebegin "Setting hostname to $hostname" | ||||
| 	hostname "$hostname" | ||||
| 	eend $? "Failed to set the hostname" | ||||
|   | ||||
| @@ -6,7 +6,7 @@ description="Configures the loopback interface." | ||||
|  | ||||
| depend() | ||||
| { | ||||
| 	return 0 | ||||
| 	keyword -jail -prefix -vserver | ||||
| } | ||||
|  | ||||
| start() | ||||
|   | ||||
| @@ -12,7 +12,7 @@ depend() | ||||
| 	config /etc/fstab | ||||
| 	use afc-client amd autofs openvpn | ||||
| 	use dns | ||||
| 	keyword -jail -prefix -vserver | ||||
| 	keyword -jail -prefix -vserver -lxc | ||||
| } | ||||
|  | ||||
| start() | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| #!@PREFIX@/sbin/runscript | ||||
| #!@SBINDIR@/runscript | ||||
| # Copyright (c) 2007-2008 Roy Marples <roy@marples.name> | ||||
| # Released under the 2-clause BSD license. | ||||
|  | ||||
| depend() | ||||
| { | ||||
| 	before bootmisc logger | ||||
| 	keyword -lxc -vserver | ||||
| 	keyword -lxc -prefix -vserver | ||||
| } | ||||
|  | ||||
| start() | ||||
| @@ -15,14 +15,6 @@ start() | ||||
| 	ebegin "Configuring kernel parameters" | ||||
| 	eindent | ||||
|  | ||||
| 	# default sysctl System V max shared memory to 1/4 of RAM: | ||||
| 	mem_bytes=`awk '/MemTotal:/ { printf "%0.f",$2 * 1024}' /proc/meminfo` | ||||
| 	mem_max=`expr $mem_bytes / 4`  | ||||
| 	page_size=`getconf PAGE_SIZE` | ||||
| 	shmall=`expr $mem_bytes / $page_size` | ||||
| 	sysctl kernel.shmmax=$mem_max > /dev/null | ||||
| 	sysctl kernel.shmall=$shmall > /dev/null | ||||
|  | ||||
| 	for conf in @SYSCONFDIR@/sysctl.conf @SYSCONFDIR@/sysctl.d/*.conf; do | ||||
| 		if [ -r "$conf" ]; then | ||||
| 			vebegin "applying $conf" | ||||
|   | ||||
| @@ -105,8 +105,7 @@ and | ||||
| respectively, but only work when | ||||
| .Va EINFO_VERBOSE | ||||
| is true. You can also make the | ||||
| .Fn einfo , | ||||
| .Fn ewarn , | ||||
| .Fn einfo | ||||
| and | ||||
| .Fn ebegin | ||||
| functions silent by setting | ||||
| @@ -185,12 +184,6 @@ when set to true makes the | ||||
| and | ||||
| .Fn einfon | ||||
| 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 | ||||
| .Va EINFO_VERBOSE | ||||
| 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, | ||||
| otherwise call the supplied stop function if it exists. | ||||
| .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 | ||||
| method to make your service behave differently when restart is being | ||||
| executed. | ||||
| .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. | ||||
| .It Ar zap | ||||
| 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 | ||||
| Turns on any extra informational output the service generates. | ||||
| .It Fl Z , -dry-run | ||||
| Shows which services would be stopped and/or started without actually stopping | ||||
| or starting them. | ||||
| Shows what services would be stopped and/or started without actually starting | ||||
| or stopping them. | ||||
| .El | ||||
| .Pp | ||||
| The following variables affect the service script: | ||||
| @@ -471,7 +471,7 @@ start_pre() | ||||
| 		# stop_post. | ||||
| 	fi | ||||
|     # 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 | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										9
									
								
								mk/os-GNU-kFreeBSD.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								mk/os-GNU-kFreeBSD.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| # Copyright (c) 2008 Roy Marples <roy@marples.name> | ||||
| # Released under the 2-clause BSD license. | ||||
|  | ||||
| # Generic definitions | ||||
|  | ||||
| CPPFLAGS+=	-D_BSD_SOURCE -D_XOPEN_SOURCE=700 | ||||
| LIBDL=		-Wl,-Bdynamic -ldl | ||||
| LIBKVM?= | ||||
| include ${MK}/os-BSD.mk | ||||
							
								
								
									
										2
									
								
								mk/os.mk
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								mk/os.mk
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ | ||||
|  | ||||
| # Generic definitions | ||||
|  | ||||
| _OS_SH=		uname -s | ||||
| _OS_SH=		uname -s | tr '/' '-' | ||||
| _OS:= 		$(shell ${_OS_SH}) | ||||
| OS?= 		${_OS} | ||||
| include ${MK}/os-${OS}.mk | ||||
|   | ||||
| @@ -116,7 +116,7 @@ cgroup_set_limits() | ||||
|  | ||||
| cgroup_cleanup() | ||||
| { | ||||
| 	yesno "${rc_cgroup_cleanup:-no}" && cgroup_running || return 0 | ||||
| 	cgroup_running || return 0 | ||||
| 	ebegin "starting cgroups cleanup" | ||||
| 	for sig in TERM QUIT INT; do | ||||
| 		cgroup_get_pids || { eend 0 "finished" ; return 0 ; } | ||||
|   | ||||
| @@ -308,6 +308,7 @@ while [ -n "$1" ]; do | ||||
| 				fi | ||||
| 				[ "$(command -v cgroup_cleanup)" = "cgroup_cleanup" -a \ | ||||
| 				"$1" = "stop" ] && \ | ||||
| 				yesno "${rc_cgroup_cleanup}" && \ | ||||
| 					cgroup_cleanup | ||||
| 				shift | ||||
| 				continue 2 | ||||
|   | ||||
| @@ -273,12 +273,6 @@ is_quiet(void) | ||||
| 	return yesno(getenv("EINFO_QUIET")); | ||||
| } | ||||
|  | ||||
| static bool | ||||
| is_really_quiet(void) | ||||
| { | ||||
| 	return yesno(getenv("EERROR_QUIET")); | ||||
| } | ||||
|  | ||||
| static bool | ||||
| is_verbose(void) | ||||
| { | ||||
| @@ -680,8 +674,6 @@ eerrorn(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
|  | ||||
| 	if (!fmt || is_really_quiet()) | ||||
| 		return 0; | ||||
| 	va_start(ap, fmt); | ||||
| 	retval = _eerrorvn(fmt, ap); | ||||
| 	va_end(ap); | ||||
| @@ -713,7 +705,7 @@ ewarn(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
|  | ||||
| 	if (!fmt || is_quiet()) | ||||
| 	if (!fmt) | ||||
| 		return 0; | ||||
| 	va_start(ap, fmt); | ||||
| 	elogv(LOG_WARNING, fmt, ap); | ||||
| @@ -748,7 +740,7 @@ eerror(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
|  | ||||
| 	if (!fmt || is_really_quiet()) | ||||
| 	if (!fmt) | ||||
| 		return 0; | ||||
| 	va_start(ap, fmt); | ||||
| 	elogv(LOG_ERR, fmt, ap); | ||||
| @@ -765,7 +757,7 @@ eerrorx(const char *EINFO_RESTRICT fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
|  | ||||
| 	if (fmt && !is_really_quiet()) { | ||||
| 	if (fmt) { | ||||
| 		va_start(ap, fmt); | ||||
| 		elogv(LOG_ERR, fmt, ap); | ||||
| 		_eerrorvn(fmt, ap); | ||||
|   | ||||
| @@ -30,7 +30,7 @@ | ||||
|  | ||||
| #include "librc.h" | ||||
|  | ||||
| #if defined(__linux__) | ||||
| #if defined(__linux__) || defined (__GLIBC__) | ||||
| static bool | ||||
| pid_is_exec(pid_t pid, const char *exec) | ||||
| { | ||||
|   | ||||
| @@ -856,7 +856,7 @@ rc_deptree_update(void) | ||||
| 	 * work for them. This doesn't stop them from being run directly. */ | ||||
| 	if (sys) { | ||||
| 		len = strlen(sys); | ||||
| 		nosys = xmalloc(len + 1); | ||||
| 		nosys = xmalloc(len + 2); | ||||
| 		nosys[0] = '-'; | ||||
| 		for (i = 0; i < len; 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; | ||||
| 			/* len is the size of allocated buffer and we don't | ||||
| 			   want call regexec BUFSIZE times. find next str */ | ||||
| 			while (*str == '\0' && str < line + len) | ||||
| 			while (str < line + len && *str == '\0') | ||||
| 				str++; | ||||
| 		} while (str < line + len); | ||||
| 	} | ||||
| @@ -323,42 +323,6 @@ rc_parse_service_state(RC_SERVICE state) | ||||
| 	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 | ||||
| rc_runlevel_starting(void) | ||||
| { | ||||
| @@ -460,10 +424,22 @@ librc_hidden_def(rc_runlevel_unstack) | ||||
| RC_STRINGLIST * | ||||
| rc_runlevel_stacks(const char *runlevel) | ||||
| { | ||||
| 	RC_STRINGLIST *stack; | ||||
| 	stack = rc_stringlist_new(); | ||||
| 	get_runlevel_chain(runlevel, stack); | ||||
| 	return stack; | ||||
| 	char path[PATH_MAX]; | ||||
| 	RC_STRINGLIST *dirs; | ||||
| 	RC_STRING *d, *dn; | ||||
|  | ||||
| 	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) | ||||
|  | ||||
| @@ -927,13 +903,17 @@ rc_services_in_runlevel_stacked(const char *runlevel) | ||||
| 	stacks = rc_runlevel_stacks(runlevel); | ||||
| 	TAILQ_FOREACH(stack, stacks, entries) { | ||||
| 		sl = rc_services_in_runlevel(stack->value); | ||||
| 		TAILQ_CONCAT(list, sl, entries); | ||||
| 		free(sl); | ||||
| 		if (list != NULL) { | ||||
| 			TAILQ_CONCAT(list, sl, entries); | ||||
| 			free(sl); | ||||
| 		} else | ||||
| 			list = sl; | ||||
| 	} | ||||
| 	return list; | ||||
| } | ||||
| librc_hidden_def(rc_services_in_runlevel_stacked) | ||||
|  | ||||
|  | ||||
| RC_STRINGLIST * | ||||
| 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-update | ||||
| runscript | ||||
| service | ||||
| start-stop-daemon | ||||
| einfon | ||||
| einfo | ||||
|   | ||||
| @@ -35,21 +35,6 @@ | ||||
| #  define _noreturn | ||||
| #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 | ||||
| show_version(void) | ||||
| { | ||||
|   | ||||
| @@ -38,13 +38,13 @@ | ||||
| 	"Disable color output",						      \ | ||||
| 	"Display software version",			              \ | ||||
| 	"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_h  usage (EXIT_SUCCESS); | ||||
| #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_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						      \ | ||||
|   | ||||
| @@ -39,7 +39,7 @@ | ||||
| #  include <sys/statvfs.h> | ||||
| #  define statfs statvfs | ||||
| #  define F_FLAGS f_flag | ||||
| #elif defined (__linux__) | ||||
| #elif defined (__linux__) || defined (__GLIBC__) | ||||
| #  include <mntent.h> | ||||
| #endif | ||||
|  | ||||
| @@ -265,7 +265,7 @@ find_mounts(struct args *args) | ||||
| 	return list; | ||||
| } | ||||
|  | ||||
| #elif defined (__linux__) | ||||
| #elif defined (__linux__) || defined (__GLIBC__) | ||||
| static struct mntent * | ||||
| getmntfile(const char *file) | ||||
| { | ||||
|   | ||||
| @@ -44,7 +44,7 @@ | ||||
| #include <time.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #ifdef __linux__ | ||||
| #if defined(__linux__) || defined(__GLIBC__) | ||||
| #  include <pty.h> | ||||
| #elif defined(__NetBSD__) || defined(__OpenBSD__) | ||||
| #  include <util.h> | ||||
|   | ||||
| @@ -171,26 +171,6 @@ print_services(const char *runlevel, RC_STRINGLIST *svcs) | ||||
| 	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" | ||||
| #define usagestring ""						\ | ||||
| 	"Usage: rc-status [options] <runlevel>...\n"		\ | ||||
| @@ -219,8 +199,7 @@ static const char * const longopts_help[] = { | ||||
| int | ||||
| rc_status(int argc, char **argv) | ||||
| { | ||||
|     RC_STRING *s, *l, *t, *level; | ||||
|  | ||||
| 	RC_STRING *s, *l, *t; | ||||
| 	char *p, *runlevel = NULL; | ||||
| 	int opt, aflag = 0, retval = 0; | ||||
|  | ||||
| @@ -301,7 +280,16 @@ rc_status(int argc, char **argv) | ||||
| 		print_level(NULL, l->value); | ||||
| 		services = rc_services_in_runlevel(l->value); | ||||
| 		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); | ||||
| 		nservices = NULL; | ||||
| 		rc_stringlist_free(services); | ||||
| @@ -329,14 +317,16 @@ rc_status(int argc, char **argv) | ||||
| 		services = rc_services_in_runlevel(NULL); | ||||
| 		sservices = rc_stringlist_new(); | ||||
| 		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); | ||||
| 			free(nservices); | ||||
| 		} | ||||
| 		TAILQ_FOREACH_SAFE(s, services, entries, t) { | ||||
| 			if ((rc_stringlist_find(sservices, s->value) || | ||||
| 			    (rc_service_state(s->value) & ( RC_SERVICE_STOPPED | RC_SERVICE_HOTPLUGGED)))) { | ||||
| 				TAILQ_REMOVE(services, s, entries); | ||||
| 			if (rc_stringlist_find(sservices, s->value) || | ||||
| 			    rc_service_state(s->value) & | ||||
| 			    (RC_SERVICE_STOPPED | RC_SERVICE_HOTPLUGGED)) | ||||
| 		{ | ||||
| 			TAILQ_REMOVE(services, s, entries); | ||||
| 				free(s->value); | ||||
| 				free(s); | ||||
| 			} | ||||
| @@ -347,23 +337,22 @@ rc_status(int argc, char **argv) | ||||
| 		alist = rc_stringlist_new(); | ||||
| 		l = rc_stringlist_add(alist, ""); | ||||
| 		p = l->value; | ||||
| 		TAILQ_FOREACH(level, levels, entries) { | ||||
| 			TAILQ_FOREACH_SAFE(s, services, entries, t) { | ||||
| 				l->value = s->value; | ||||
| 				setenv("RC_SVCNAME", l->value, 1); | ||||
| 				tmp = rc_deptree_depends(deptree, needsme, alist, level->value, RC_DEP_TRACE); | ||||
| 				if (TAILQ_FIRST(tmp)) { | ||||
| 					TAILQ_REMOVE(services, s, entries); | ||||
| 					TAILQ_INSERT_TAIL(nservices, s, entries); | ||||
| 				} | ||||
| 				rc_stringlist_free(tmp); | ||||
| 		if (!runlevel) | ||||
| 			runlevel = rc_runlevel_get(); | ||||
| 		TAILQ_FOREACH_SAFE(s, services, entries, t) { | ||||
| 			l->value = s->value; | ||||
| 			unsetenv("RC_SVCNAME"); | ||||
| 			setenv("RC_SVCNAME", l->value, 1); | ||||
| 			tmp = rc_deptree_depends(deptree, needsme, alist, runlevel, RC_DEP_TRACE); | ||||
| 			if (TAILQ_FIRST(tmp)) { | ||||
| 				TAILQ_REMOVE(services, s, entries); | ||||
| 				TAILQ_INSERT_TAIL(nservices, s, entries); | ||||
| 			} | ||||
| 			rc_stringlist_free(tmp); | ||||
| 		} | ||||
| 		l->value = p; | ||||
| 		/* | ||||
| 		 * we are unsetting RC_SVCNAME because last loaded service will not | ||||
| 		 * be added to the list | ||||
| 		 */ | ||||
| 		/* we are unsetting RC_SVCNAME because last loaded service  | ||||
| 		   wount be added to list */ | ||||
| 		unsetenv("RC_SVCNAME"); | ||||
| 		print_level("Dynamic", "needed"); | ||||
| 		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; | ||||
| 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; | ||||
|  | ||||
| struct termios *termios_orig = NULL; | ||||
| @@ -518,9 +524,7 @@ runlevel_config(const char *service, const char *level) | ||||
| } | ||||
|  | ||||
| static void | ||||
| do_stop_services(const RC_STRINGLIST *types_n, const RC_STRINGLIST *start_services, | ||||
| 				 const RC_STRINGLIST *stop_services, const RC_DEPTREE *deptree, | ||||
| 				 const char *newlevel, bool parallel, bool going_down) | ||||
| do_stop_services(const char *newlevel, bool parallel, bool going_down) | ||||
| { | ||||
| 	pid_t pid; | ||||
| 	RC_STRING *service, *svc1, *svc2; | ||||
| @@ -623,7 +627,7 @@ stop: | ||||
| } | ||||
|  | ||||
| static void | ||||
| do_start_services(const RC_STRINGLIST *start_services, bool parallel) | ||||
| do_start_services(bool parallel) | ||||
| { | ||||
| 	RC_STRING *service; | ||||
| 	pid_t pid; | ||||
| @@ -750,12 +754,6 @@ main(int argc, char **argv) | ||||
| { | ||||
| 	const char *bootlevel = 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 *tmplist; | ||||
| 	RC_STRING *service; | ||||
| @@ -870,11 +868,7 @@ main(int argc, char **argv) | ||||
| 	snprintf(pidstr, sizeof(pidstr), "%d", getpid()); | ||||
| 	setenv("RC_PID", pidstr, 1); | ||||
|  | ||||
| 	/* Create a list of all services which should be started for the new or | ||||
| 	* 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. | ||||
| 	*/ | ||||
| 	/* Load current runlevel */ | ||||
| 	bootlevel = getenv("RC_BOOTLEVEL"); | ||||
| 	runlevel = rc_runlevel_get(); | ||||
|  | ||||
| @@ -978,13 +972,8 @@ main(int argc, char **argv) | ||||
| 		    applet, RC_STOPPING, strerror(errno)); | ||||
| 	} | ||||
|  | ||||
| 	/* Create a list of all services which we could stop (assuming | ||||
| 	* they won't be active in the new or current runlevel) including | ||||
| 	* 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. | ||||
| 	*/ | ||||
| 	/* Build a list of all services to stop and then work out the | ||||
| 	 * correct order for stopping them */ | ||||
| 	stop_services = rc_services_in_state(RC_SERVICE_STARTED); | ||||
| 	tmplist = rc_services_in_state(RC_SERVICE_INACTIVE); | ||||
| 	TAILQ_CONCAT(stop_services, tmplist, entries); | ||||
| @@ -1007,11 +996,7 @@ main(int argc, char **argv) | ||||
| 		stop_services = tmplist; | ||||
| 	} | ||||
|  | ||||
| 	/* Create a list of all services which should be started for the new or | ||||
| 	 * 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. | ||||
| 	 */ | ||||
| 	/* Load our list of start services */ | ||||
| 	hotplugged_services = rc_services_in_state(RC_SERVICE_HOTPLUGGED); | ||||
| 	start_services = rc_services_in_runlevel_stacked(newlevel ? | ||||
| 	    newlevel : runlevel); | ||||
| @@ -1021,11 +1006,9 @@ main(int argc, char **argv) | ||||
| 		tmplist = rc_services_in_runlevel(RC_LEVEL_SYSINIT); | ||||
| 		TAILQ_CONCAT(start_services, tmplist, entries); | ||||
| 		free(tmplist); | ||||
| 		/* If we are NOT headed for the single-user runlevel... */ | ||||
| 		if (strcmp(newlevel ? newlevel : runlevel, | ||||
| 			RC_LEVEL_SINGLE) != 0) | ||||
| 		{ | ||||
| 			/* If we are NOT headed for the boot runlevel... */ | ||||
| 			if (strcmp(newlevel ? newlevel : runlevel, | ||||
| 				bootlevel) != 0) | ||||
| 			{ | ||||
| @@ -1046,7 +1029,7 @@ main(int argc, char **argv) | ||||
|  | ||||
| 	/* Now stop the services that shouldn't be running */ | ||||
| 	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_services(); | ||||
| @@ -1082,10 +1065,18 @@ main(int argc, char **argv) | ||||
| 		TAILQ_FOREACH(service, hotplugged_services, entries) | ||||
| 		    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__ | ||||
| 	/* If the "noinit" parameter was passed on the kernel command line then | ||||
| 	 * mark the specified services as started so they will not be started | ||||
| 	 * by us. */ | ||||
| 	/* mark any services skipped as started */ | ||||
| 	proc = p = rc_proc_getent("noinit"); | ||||
| 	if (proc) { | ||||
| 		while ((token = strsep(&p, ","))) | ||||
| @@ -1094,38 +1085,19 @@ main(int argc, char **argv) | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	/* If we have a list of services to start then... */ | ||||
| 	if (start_services) { | ||||
| 		/* Get a list of the chained runlevels which compose the target runlevel */ | ||||
| 		RC_STRINGLIST *runlevel_chain = rc_runlevel_stacks(runlevel); | ||||
| 		do_start_services(parallel); | ||||
| 		/* 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. */ | ||||
| 		RC_STRING *rlevel; | ||||
| 		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); | ||||
| 		/* Wait for our services to finish */ | ||||
| 		wait_for_services(); | ||||
| 	} | ||||
|  | ||||
| #ifdef __linux__ | ||||
| 	/* If the "noinit" parameter was passed on the kernel command line then | ||||
| 	 * mark the specified services as stopped so that our records reflect | ||||
| 	 * reality.	 */ | ||||
| 	/* mark any services skipped as stopped */ | ||||
| 	proc = p = rc_proc_getent("noinit"); | ||||
| 	if (proc) { | ||||
| 		while ((token = strsep(&p, ","))) | ||||
|   | ||||
| @@ -52,7 +52,7 @@ | ||||
| #include <time.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #ifdef __linux__ | ||||
| #if defined(__linux__) || defined(__GLIBC__) | ||||
| #  include <pty.h> | ||||
| #elif defined(__NetBSD__) || defined(__OpenBSD__) | ||||
| #  include <util.h> | ||||
|   | ||||
| @@ -307,7 +307,7 @@ parse_schedule(const char *string, int timeout) | ||||
| } | ||||
|  | ||||
| static pid_t | ||||
| get_pid(const char *pidfile) | ||||
| get_pid(const char *pidfile, bool quiet) | ||||
| { | ||||
| 	FILE *fp; | ||||
| 	pid_t pid; | ||||
| @@ -316,12 +316,12 @@ get_pid(const char *pidfile) | ||||
| 		return -1; | ||||
|  | ||||
| 	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; | ||||
| 	} | ||||
|  | ||||
| 	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); | ||||
| 		return -1; | ||||
| 	} | ||||
| @@ -334,7 +334,8 @@ get_pid(const char *pidfile) | ||||
| /* return number of processed killed, -1 on error */ | ||||
| static int | ||||
| 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_PID *pi; | ||||
| @@ -352,16 +353,20 @@ do_stop(const char *exec, const char *const *argv, | ||||
|  | ||||
| 	LIST_FOREACH_SAFE(pi, pids, entries, np) { | ||||
| 		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++; | ||||
| 		} 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; | ||||
| 			killed = (kill(pi->pid, sig) == 0 || | ||||
| 			    errno == ESRCH ? true : false); | ||||
| 			eendv(killed ? 0 : 1, | ||||
| 				"%s: failed to send signal %d to PID %d: %s", | ||||
| 				applet, sig, pi->pid, strerror(errno)); | ||||
| 			if (verbose) | ||||
| 				eend(killed ? 0 : 1, | ||||
| 				    "%s: failed to send signal %d to PID %d: %s", | ||||
| 				    applet, sig, pi->pid, strerror(errno)); | ||||
| 			if (!killed) { | ||||
| 				nkilled = -1; | ||||
| 			} else { | ||||
| @@ -379,7 +384,7 @@ do_stop(const char *exec, const char *const *argv, | ||||
| static int | ||||
| run_stop_schedule(const char *exec, const char *const *argv, | ||||
|     const char *pidfile, uid_t uid, | ||||
|     bool test, bool progress) | ||||
|     bool quiet, bool verbose, bool test, bool progress) | ||||
| { | ||||
| 	SCHEDULEITEM *item = TAILQ_FIRST(&schedule); | ||||
| 	int nkilled = 0; | ||||
| @@ -391,15 +396,15 @@ run_stop_schedule(const char *exec, const char *const *argv, | ||||
| 	const char *const *p; | ||||
| 	bool progressed = false; | ||||
|  | ||||
| 	if (exec) | ||||
| 		einfov("Will stop %s", exec); | ||||
| 	if (pidfile) | ||||
| 		einfov("Will stop PID in pidfile `%s'", pidfile); | ||||
| 	if (uid) | ||||
| 		einfov("Will stop processes owned by UID %d", uid); | ||||
| 	if (argv && *argv) { | ||||
| 		einfovn("Will stop processes of `"); | ||||
| 		if (rc_yesno(getenv("EINFO_VERBOSE"))) { | ||||
| 	if (verbose) { | ||||
| 		if (exec) | ||||
| 			einfo ("Will stop %s", exec); | ||||
| 		if (pidfile) | ||||
| 			einfo("Will stop PID in pidfile `%s'", pidfile); | ||||
| 		if (uid) | ||||
| 			einfo("Will stop processes owned by UID %d", uid); | ||||
| 		if (argv && *argv) { | ||||
| 			einfon("Will stop processes of `"); | ||||
| 			for (p = argv; p && *p; p++) { | ||||
| 				if (p != argv) | ||||
| 					printf(" "); | ||||
| @@ -410,7 +415,7 @@ run_stop_schedule(const char *exec, const char *const *argv, | ||||
| 	} | ||||
|  | ||||
| 	if (pidfile) { | ||||
| 		pid = get_pid(pidfile); | ||||
| 		pid = get_pid(pidfile, false); | ||||
| 		if (pid == -1) | ||||
| 			return 0; | ||||
| 	} | ||||
| @@ -423,7 +428,8 @@ run_stop_schedule(const char *exec, const char *const *argv, | ||||
|  | ||||
| 		case SC_SIGNAL: | ||||
| 			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 (tkilled == 0) { | ||||
| 					if (progressed) | ||||
| @@ -452,7 +458,8 @@ run_stop_schedule(const char *exec, const char *const *argv, | ||||
| 				     nloops++) | ||||
| 				{ | ||||
| 					if ((nrunning = do_stop(exec, argv, | ||||
| 						    pid, uid, 0, true)) == 0) | ||||
| 						    pid, uid, 0, true, false, | ||||
| 	test)) == 0) | ||||
| 						return 0; | ||||
|  | ||||
|  | ||||
| @@ -669,6 +676,8 @@ start_stop_daemon(int argc, char **argv) | ||||
| 	bool stop = false; | ||||
| 	bool oknodo = false; | ||||
| 	bool test = false; | ||||
| 	bool quiet; | ||||
| 	bool verbose = false; | ||||
| 	char *exec = NULL; | ||||
| 	char *startas = NULL; | ||||
| 	char *name = NULL; | ||||
| @@ -905,6 +914,8 @@ start_stop_daemon(int argc, char **argv) | ||||
| 	endpwent(); | ||||
| 	argc -= 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 | ||||
| 	 * instead of forcing --stop --oknodo as well */ | ||||
| @@ -1048,7 +1059,7 @@ start_stop_daemon(int argc, char **argv) | ||||
| 		else | ||||
| 			parse_schedule(NULL, sig); | ||||
| 		i = run_stop_schedule(exec, (const char *const *)margv, | ||||
| 		    pidfile, uid, test, progress); | ||||
| 		    pidfile, uid, quiet, verbose, test, progress); | ||||
|  | ||||
| 		if (i < 0) | ||||
| 			/* We failed to stop something */ | ||||
| @@ -1070,16 +1081,16 @@ start_stop_daemon(int argc, char **argv) | ||||
| 	} | ||||
|  | ||||
| 	if (pidfile) | ||||
| 		pid = get_pid(pidfile); | ||||
| 		pid = get_pid(pidfile, true); | ||||
| 	else | ||||
| 		pid = 0; | ||||
|  | ||||
| 	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); | ||||
|  | ||||
| 	if (test) { | ||||
| 		if (rc_yesno(getenv("EINFO_QUIET"))) | ||||
| 		if (quiet) | ||||
| 			exit (EXIT_SUCCESS); | ||||
|  | ||||
| 		einfon("Would start"); | ||||
| @@ -1103,8 +1114,10 @@ start_stop_daemon(int argc, char **argv) | ||||
| 		exit(EXIT_SUCCESS); | ||||
| 	} | ||||
|  | ||||
| 	ebeginv("Detaching to start `%s'", exec); | ||||
| 	eindentv(); | ||||
| 	if (verbose) { | ||||
| 		ebegin("Detaching to start `%s'", exec); | ||||
| 		eindent(); | ||||
| 	} | ||||
|  | ||||
| 	/* Remove existing 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 */ | ||||
| 		if (background || redirect_stdout || rc_yesno(getenv("EINFO_QUIET"))) | ||||
| 		if (background || quiet || redirect_stdout) | ||||
| 			dup2(stdout_fd, STDOUT_FILENO); | ||||
| 		if (background || redirect_stderr || rc_yesno(getenv("EINFO_QUIET"))) | ||||
| 		if (background || redirect_stderr) | ||||
| 			dup2(stderr_fd, STDERR_FILENO); | ||||
|  | ||||
| 		for (i = getdtablesize() - 1; i >= 3; --i) | ||||
| @@ -1305,10 +1318,9 @@ start_stop_daemon(int argc, char **argv) | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} while (!WIFEXITED(i) && !WIFSIGNALED(i)); | ||||
| 		if (!WIFEXITED(i) || WEXITSTATUS(i) != 0) { | ||||
| 			eerror("%s: failed to start `%s'", applet, exec); | ||||
| 			exit(EXIT_FAILURE); | ||||
| 		} | ||||
| 		if (!WIFEXITED(i) || WEXITSTATUS(i) != 0) | ||||
| 			eerrorx("%s: failed to start `%s'", applet, exec); | ||||
|  | ||||
| 		pid = spid; | ||||
| 	} | ||||
|  | ||||
| @@ -1342,7 +1354,7 @@ start_stop_daemon(int argc, char **argv) | ||||
| 				alive = true; | ||||
| 		} else { | ||||
| 			if (pidfile) { | ||||
| 				pid = get_pid(pidfile); | ||||
| 				pid = get_pid(pidfile, false); | ||||
| 				if (pid == -1) { | ||||
| 					eerrorx("%s: did not " | ||||
| 					    "create a valid" | ||||
| @@ -1352,7 +1364,7 @@ start_stop_daemon(int argc, char **argv) | ||||
| 			} else | ||||
| 				pid = 0; | ||||
| 			if (do_stop(exec, (const char *const *)margv, | ||||
| 				pid, uid, 0, true) > 0) | ||||
| 				pid, uid, 0, true, false, test) > 0) | ||||
| 				alive = true; | ||||
| 		} | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user