Compare commits
	
		
			30 Commits
		
	
	
		
			funtoo-ope
			...
			funtoo-ope
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | edb7e73b34 | ||
|   | a1ab17889d | ||
|   | 4b37d3b16f | ||
|   | 82378bd92d | ||
|   | e6df76a377 | ||
|   | 03c67bcc27 | ||
|   | 681a37e7bd | ||
|   | 56d592866c | ||
|   | 67b2255ebb | ||
|   | 993e7d7044 | ||
|   | de88aff0a8 | ||
|   | 6eace7dc5a | ||
|   | 11e1f4d30d | ||
|   | c30a8d2c3c | ||
|   | 419af8f0aa | ||
|   | 9e989227ab | ||
|   | d6436bed09 | ||
|   | 4480f1f395 | ||
|   | 0ba14ae720 | ||
|   | 7716bf31de | ||
|   | 445b297360 | ||
|   | 2590bf7a2b | ||
|   | 4ce3cb90a0 | ||
|   | a78b18e291 | ||
|   | 72b58b9e6b | ||
|   | 5c3e5d801b | ||
|   | bb8a9c087d | ||
|   | d1b183a2f9 | ||
|   | 7296379f3f | ||
|   | 1f5d447eda | 
| @@ -1,3 +1,3 @@ | ||||
| NAME=		openrc | ||||
| VERSION=	0.12.4 | ||||
| VERSION=	0.12.1 | ||||
| PKG=		${NAME}-${VERSION} | ||||
|   | ||||
| @@ -1,15 +1,2 @@ | ||||
| # Set to the fully qualified domain name (e.g. "mybox.example.com") of | ||||
| # this machine, if it has one, otherwise set to the machine name | ||||
| # (e.g. "mybox"). | ||||
| # Set to the fully-qualified hostname of this machine | ||||
| hostname="localhost" | ||||
|  | ||||
| # Set to the NIS domain name of this machine, if it has one, otherwise | ||||
| # leave commented out. | ||||
| #nisdomainname="localdomain.com" | ||||
|  | ||||
| # Set other alias-to-address mappings, if needed, otherwise leave | ||||
| # commented out. | ||||
| #aliases="127.0.0.1	mybox | ||||
| #10.0.0.1	mylaptop | ||||
| #172.16.0.1	myserver | ||||
| #192.168.0.1	myworkstation" | ||||
|   | ||||
| @@ -1,11 +0,0 @@ | ||||
| ############################################################################## | ||||
| # 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="" | ||||
							
								
								
									
										3
									
								
								init.d/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								init.d/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -4,8 +4,6 @@ hostname | ||||
| local | ||||
| localmount | ||||
| moused | ||||
| net.lo | ||||
| net.lo0 | ||||
| netmount | ||||
| network | ||||
| root | ||||
| @@ -41,4 +39,5 @@ syslogd | ||||
| termencoding | ||||
| ttys | ||||
| wscons | ||||
| tmpfiles.dev | ||||
| tmpfiles.setup | ||||
|   | ||||
| @@ -117,7 +117,6 @@ 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 -uml | ||||
| 	keyword -jail -openvz -prefix -timeout -vserver -lxc | ||||
| } | ||||
|  | ||||
| _abort() { | ||||
|   | ||||
| @@ -27,27 +27,12 @@ start() | ||||
| 	if [ "$hostname" != "localhost.localdomain" ]; then | ||||
| 		out="$out localhost.localdomain" | ||||
| 	fi | ||||
| 	[ -n "$aliases" ] && out2="$aliases" | ||||
| 	[ -n "$aliases" ] && out="$out $aliases" | ||||
| 	ebegin "Configuring /etc/hosts" | ||||
| 	cat << END > /etc/hosts | ||||
| # Local Host Database | ||||
| # | ||||
| # This AUTOMATICALLY-GENERATED file describes a number of aliases-to-address | ||||
| # mappings for the local hosts that share this file. | ||||
| # | ||||
| # In the presence of the domain name service or NIS, this file may not be | ||||
| # consulted at all; see /etc/host.conf for the resolution order. | ||||
| # | ||||
| # DO NOT EDIT THIS FILE BY HAND; YOUR CHANGES WILL BE OVERWRITTEN | ||||
| # | ||||
| # Define alias-to-address mappings in /etc/conf.d/hostname | ||||
|  | ||||
| # IPv4 and IPv6 localhost aliases | ||||
| 	[ -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 | ||||
|  | ||||
| # Other aliases | ||||
| $out2 | ||||
| END | ||||
| 	chmod 0644 /etc/hosts | ||||
| 	eend $? | ||||
|   | ||||
| @@ -14,7 +14,8 @@ depend() | ||||
| start() | ||||
| { | ||||
| 	ebegin "setting up tmpfiles.d entries for /dev" | ||||
| 	@LIBEXECDIR@/sh/tmpfiles.sh --prefix=/dev --create ${tmpfiles_opts} | ||||
| 	@LIBEXECDIR@/sh/tmpfiles.sh --prefix=/dev --create --remove \ | ||||
| 		${tmpfiles_opts} | ||||
| 	eend $? | ||||
| 	return 0 | ||||
| } | ||||
|   | ||||
| @@ -12,7 +12,7 @@ depend() | ||||
| start() | ||||
| { | ||||
| 	ebegin "setting up tmpfiles.d entries" | ||||
| 	@LIBEXECDIR@/sh/tmpfiles.sh --exclude-prefix=/dev --create --remove --boot \ | ||||
| 	@LIBEXECDIR@/sh/tmpfiles.sh --exclude-prefix=/dev --create --remove \ | ||||
| 		${tmpfiles_opts} | ||||
| 	eend $? | ||||
| 	return 0 | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| MAN3=		einfo.3 \ | ||||
| MAN3=		\ | ||||
| 		rc_config.3 rc_deptree.3 rc_find_pids.3 rc_plugin_hook.3 \ | ||||
| 		rc_runlevel.3 rc_service.3 rc_stringlist.3 | ||||
| MAN8=		rc-service.8 rc-status.8 rc-update.8 rc.8 runscript.8 \ | ||||
|   | ||||
							
								
								
									
										203
									
								
								man/einfo.3
									
									
									
									
									
								
							
							
						
						
									
										203
									
								
								man/einfo.3
									
									
									
									
									
								
							| @@ -1,203 +0,0 @@ | ||||
| .\" Copyright (c) 2007-2008 Roy Marples | ||||
| .\" | ||||
| .\" Redistribution and use in source and binary forms, with or without | ||||
| .\" modification, are permitted provided that the following conditions | ||||
| .\" are met: | ||||
| .\" 1. Redistributions of source code must retain the above copyright | ||||
| .\"    notice, this list of conditions and the following disclaimer. | ||||
| .\" 2. Redistributions in binary form must reproduce the above copyright | ||||
| .\"    notice, this list of conditions and the following disclaimer in the | ||||
| .\"    documentation and/or other materials provided with the distribution. | ||||
| .\" | ||||
| .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||
| .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||||
| .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
| .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
| .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
| .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
| .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
| .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
| .\" SUCH DAMAGE. | ||||
| .\" | ||||
| .Dd Mar 16, 2008 | ||||
| .Dt EINFO 3 SMM | ||||
| .Os OpenRC | ||||
| .Sh NAME | ||||
| .Nm einfo , ewarn , eerror , ebegin , | ||||
| .Nm einfon , ewarnn , eerrorn , ebeginn , | ||||
| .Nm einfov , ewarnv , ebeginv , | ||||
| .Nm einfovn , ewarnvn , ebeginvn , | ||||
| .Nm ewarnx , eerrorx , | ||||
| .Nm eend , ewend , | ||||
| .Nm eendv , ewendv , | ||||
| .Nm ebracket , | ||||
| .Nm eindent , eoutdent , | ||||
| .Nm eindentv , eoutdentv , | ||||
| .Nm eprefix | ||||
| .Nd colorful informational output | ||||
| .Sh LIBRARY | ||||
| Enhanced Information output library (libeinfo, -leinfo) | ||||
| .Sh SYNOPSIS | ||||
| .In einfo.h | ||||
| .Ft int Fn einfo "const char * restrict format" ... | ||||
| .Ft int Fn ewarn "const char * restrict format" ... | ||||
| .Ft int Fn eerror "const char * restrict format" ... | ||||
| .Ft int Fn ebegin "const char * restrict format" ... | ||||
| .Ft int Fn einfon "const char * restrict format" ... | ||||
| .Ft int Fn ewarnn "const char * restrict format" ... | ||||
| .Ft int Fn eerrorn "const char * restrict format" ... | ||||
| .Ft int Fn ebeginn "const char * restrict format" ... | ||||
| .Ft int Fn einfov "const char * restrict format" ... | ||||
| .Ft int Fn ewarnv "const char * restrict format" ... | ||||
| .Ft int Fn ebeginv "const char * restrict format" ... | ||||
| .Ft int Fn einfovn "const char * restrict format" ... | ||||
| .Ft int Fn ewarnvn "const char * restrict format" ... | ||||
| .Ft int Fn ebeginvn "const char * restrict format" ... | ||||
| .Ft int Fn ewarnx "const char * restrict format" ... | ||||
| .Ft int Fn eerrorx "const char * restrict format" ... | ||||
| .Ft int Fn eend "int retval" "const char * restrict format" ... | ||||
| .Ft int Fn ewend "int retval" "const char * restrict format" ... | ||||
| .Ft int Fn eendv "int retval" "const char * restrict format" ... | ||||
| .Ft int Fn ewendv "int retval" "const char * restrict format" ... | ||||
| .Ft void Fn ebracket "int col" "ECOLOR color" "const char * restrict msg" | ||||
| .Ft void Fn eindent void | ||||
| .Ft void Fn eoutdent void | ||||
| .Ft void Fn eindentv void | ||||
| .Ft void Fn eoutdentv void | ||||
| .Ft void Fn eprefix "const char * prefix" | ||||
| .Sh DESCRIPTION | ||||
| The | ||||
| .Fn einfo | ||||
| family of functions provide a simple informational output that is colorised. | ||||
| Basically | ||||
| .Fn einfo , | ||||
| .Fn ewarn | ||||
| and | ||||
| .Fn eerror | ||||
| behave exactly like | ||||
| .Fn printf | ||||
| but prefix the output with a colored *. The function called denotes the color | ||||
| used with | ||||
| .Fn einfo | ||||
| being green, | ||||
| .Fn ewarn | ||||
| being yellow and | ||||
| .Fn eerror | ||||
| being red. | ||||
| einfo goes to stdout and the others go to stderr. | ||||
| The number of real characters printed is returned. | ||||
| .Fn ebegin | ||||
| is identical to | ||||
| .Fn einfo | ||||
| except that 3 dots are appended to the output. | ||||
| .Pp | ||||
| .Fn einfov , | ||||
| .Fn ewarnv | ||||
| and | ||||
| .Fn ebeginv | ||||
| work the same way to | ||||
| .Fn einfo , | ||||
| .Fn ewarn , | ||||
| and | ||||
| .Fn ebegin | ||||
| respectively, but only work when | ||||
| .Va EINFO_VERBOSE | ||||
| is true. You can also make the | ||||
| .Fn einfo | ||||
| and | ||||
| .Fn ebegin | ||||
| functions silent by setting | ||||
| .Va EINFO_QUIET | ||||
| to true. | ||||
| .Pp | ||||
| These functions are designed to output a whole line, so they also | ||||
| append a newline to the string. To stop this behaviour, you can use the | ||||
| functions | ||||
| .Fn einfon , | ||||
| .Fn ewarnn , | ||||
| .Fn eerrorn , | ||||
| .Fn einfovn , | ||||
| .Fn ewarnvn , | ||||
| and | ||||
| .Fn ebeginvn . | ||||
| .Pp | ||||
| .Fn eend , | ||||
| .Fn ewend , | ||||
| .Fn eendv | ||||
| and | ||||
| .Fn ewendv | ||||
| are the counterparts to the above functions. If | ||||
| .Fa retval | ||||
| is zero then ok in green is printed in a bracket at the end of the prior | ||||
| line. Otherwise we print the formatted string using | ||||
| .Fn error | ||||
| (or | ||||
| .Fn ewarn | ||||
| if | ||||
| .Fn ewend | ||||
| is called) !! in red (or yellow if | ||||
| .Fn ewend | ||||
| is called) is printed in a bracket at the end of the line. | ||||
| The value of | ||||
| .Fa retval | ||||
| is returned. | ||||
| .Pp | ||||
| .Fn ebracket | ||||
| does the same as | ||||
| .Fn eend | ||||
| but prints | ||||
| .Fa msg | ||||
| instead of ok or !! in the color | ||||
| .Fa color | ||||
| at the column | ||||
| .Fa col . | ||||
| .Pp | ||||
| .Fn eindent | ||||
| indents subsequent calls to the above functions by 3 characters. | ||||
| .Fn eoutdent | ||||
| removes an | ||||
| .Fn eindent . | ||||
| .Fn eindentv | ||||
| and | ||||
| .Fn eoutdentv | ||||
| only work when | ||||
| .Va EINFO_VERBOSE | ||||
| is true. | ||||
| .Pp | ||||
| .Fn eprefix | ||||
| prefixes the string | ||||
| .Fa prefix | ||||
| to the above functions. | ||||
| .Sh IMPLEMENTATION NOTES | ||||
| einfo can optionally be linked against the | ||||
| .Lb libtermcap | ||||
| so that we can correctly query the connected console for our color and | ||||
| cursor escape codes. | ||||
| If not, then we have a hard coded list of terminals we know about that support | ||||
| the commonly used codes for color and cursor position. | ||||
| .Sh ENVIRONMENT | ||||
| .Va EINFO_QUIET | ||||
| when set to true makes the | ||||
| .Fn einfo | ||||
| and | ||||
| .Fn einfon | ||||
| family of functions quiet, so nothing is printed. | ||||
| .Pp | ||||
| .Va EINFO_VERBOSE | ||||
| when set to true makes the | ||||
| .Fn einfov | ||||
| and | ||||
| .Fn einfovn | ||||
| family of functions work, so they do print. | ||||
| .Sh FILES | ||||
| .Pa /etc/init.d/functions.sh | ||||
| is provided by OpenRC, which allows shell scripts to use the above functions. | ||||
| For historical reasons our verbose functions are prefixed with v instead of | ||||
| suffixed. So einfov becomes veinfo, einfovn becomes veinfon. | ||||
| Rinse and repeat for the other verbose functions. | ||||
| .Sh SEE ALSO | ||||
| .Xr printf 3 , | ||||
| .Sh AUTHORS | ||||
| .An Roy Marples <roy@marples.name> | ||||
| @@ -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 | ||||
| Stop and start the service, including dependencies. This cannot be | ||||
| Stops and starts 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 | ||||
| Show the status of the service. The return code matches the status, with the | ||||
| Shows 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 what services would be stopped and/or started without actually starting | ||||
| or stopping them. | ||||
| Shows which services would be stopped and/or started without actually stopping | ||||
| or starting 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 --dir --owner foo:foo --mode 0664 \\ | ||||
|     checkpath --directory --owner foo:foo --mode 0775 \\ | ||||
| 	/var/run/foo /var/cache/foo | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,9 +0,0 @@ | ||||
| # 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 | tr '/' '-' | ||||
| _OS_SH=		uname -s | ||||
| _OS:= 		$(shell ${_OS_SH}) | ||||
| OS?= 		${_OS} | ||||
| include ${MK}/os-${OS}.mk | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| DIR=	${LIBDIR}/pkgconfig | ||||
| SRCS=	einfo.pc.in openrc.pc.in | ||||
| INC=	einfo.pc openrc.pc | ||||
| SRCS=	openrc.pc.in | ||||
| INC=	openrc.pc | ||||
|  | ||||
| .DEFAULT: | ||||
| 	${SED} -n -e 's/^VERSION=[[:space:]]*\([^[:space:]]*\).*/#define VERSION "\1${GITVER}\"/p' ../../Makefile > version.h | ||||
|   | ||||
| @@ -1,9 +0,0 @@ | ||||
| prefix=@PREFIX@ | ||||
| exec_prefix=${prefix} | ||||
| libdir=${prefix}/@LIB@ | ||||
| includedir=/usr/include | ||||
|  | ||||
| Name: einfo | ||||
| Description: Pretty console informational display | ||||
| Version: @VERSION@ | ||||
| Libs: -L${libdir} -leinfo | ||||
| @@ -3,11 +3,10 @@ | ||||
| # Control creation, deletion, and cleaning of volatile and temporary files | ||||
| # | ||||
| # Copyright (c) 2012 Gentoo Foundation | ||||
| # Released under the 2-clause BSD license. | ||||
| # | ||||
| # This instance is a pure-POSIX sh version, written by Robin H Johnson | ||||
| # <robbat2@gentoo.org>, based on the Arch Linux version as of 2012/01/01: | ||||
| # This instance based on the Arch Linux version: | ||||
| # http://projects.archlinux.org/initscripts.git/tree/arch-tmpfiles | ||||
| # As of 2012/01/01 | ||||
| # | ||||
| # See the tmpfiles.d manpage as well: | ||||
| # http://0pointer.de/public/systemd-man/tmpfiles.d.html | ||||
| @@ -15,7 +14,6 @@ | ||||
| # | ||||
|  | ||||
| DRYRUN=0 | ||||
| CHECKPATH="@LIBEXECDIR@/bin/checkpath" | ||||
|  | ||||
| checkprefix() { | ||||
| 	n=$1 | ||||
| @@ -45,27 +43,19 @@ relabel() { | ||||
|  | ||||
| 	for path in ${paths}; do | ||||
| 		if [ -e "$path" ]; then | ||||
| 			[ -x /sbin/restorecon ] && dryrun_or_real restorecon $CHOPTS "$path" | ||||
| 			[ $uid != '-' ] && dryrun_or_real chown $CHOPTS "$uid" "$path" | ||||
| 			[ $gid != '-' ] && dryrun_or_real chgrp $CHOPTS "$gid" "$path" | ||||
| 			[ $mode != '-' ] && dryrun_or_real chmod $CHOPTS "$mode" "$path" | ||||
| 			[ -x /sbin/restorecon ] && dryrun_or_real restorecon $CHOPTS "$path" | ||||
| 		fi | ||||
| 	done | ||||
| } | ||||
|  | ||||
| _restorecon() { | ||||
|     local path=$1 | ||||
|     if [ -x /sbin/restorecon ]; then | ||||
|         dryrun_or_real restorecon -F "$path" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| _b() { | ||||
| 	# Create a block device node if it doesn't exist yet | ||||
| 	local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 | ||||
| 	if [ ! -e "$path" ]; then | ||||
| 		dryrun_or_real mknod -m $mode $path b ${arg%:*} ${arg#*:} | ||||
| 		_restorecon "$path" | ||||
| 		dryrun_or_real chown $uid:$gid $path | ||||
| 	fi | ||||
| } | ||||
| @@ -75,22 +65,10 @@ _c() { | ||||
| 	local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 | ||||
| 	if [ ! -e "$path" ]; then | ||||
| 		dryrun_or_real mknod -m $mode $path c ${arg%:*} ${arg#*:} | ||||
| 		_restorecon "$path" | ||||
| 		dryrun_or_real chown $uid:$gid $path | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| _C() { | ||||
| 	# recursively copy a file or directory | ||||
| 	local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 | ||||
| 	if [ ! -e "$path" ]; then | ||||
| 		dryrun_or_real cp -r "$arg" "$path" | ||||
| 		_restorecon "$path" | ||||
| 		[ $uid != '-' ] && dryrun_or_real chown "$uid" "$path" | ||||
| 		[ $gid != '-' ] && dryrun_or_real chgrp "$gid" "$path" | ||||
| 		[ $mode != '-' ] && dryrun_or_real chmod "$mode" "$path" | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| _f() { | ||||
| 	# Create a file if it doesn't exist yet | ||||
| @@ -99,7 +77,7 @@ _f() { | ||||
| 	[ $CREATE -gt 0 ] || return 0 | ||||
|  | ||||
| 	if [ ! -e "$path" ]; then | ||||
| 		dryrun_or_real $CHECKPATH -fq -m "$mode" -o "$uid:$gid" "$path" | ||||
| 		dryrun_or_real install -m"$mode" -o"$uid" -g"$gid" /dev/null "$path" | ||||
| 		[ -z "$arg" ] || _w "$@" | ||||
| 	fi | ||||
| } | ||||
| @@ -110,7 +88,7 @@ _F() { | ||||
|  | ||||
| 	[ $CREATE -gt 0 ] || return 0 | ||||
|  | ||||
| 	dryrun_or_real $CHECKPATH -Fq -m "$mode" -o "$uid:$gid" "$path" | ||||
| 	dryrun_or_real install -m"$mode" -o"$uid" -g"$gid" /dev/null "$path" | ||||
| 	[ -z "$arg" ] || _w "$@" | ||||
| } | ||||
|  | ||||
| @@ -121,8 +99,7 @@ _d() { | ||||
| 	[ $CREATE -gt 0 ] || return 0 | ||||
|  | ||||
| 	if [ ! -d "$path" ]; then | ||||
| 		dryrun_or_real mkdir -p "$path" 2>/dev/null | ||||
| 		dryrun_or_real $CHECKPATH -dq -m "$mode" -o "$uid:$gid" "$path" | ||||
| 		dryrun_or_real install -d -m"$mode" -o"$uid" -g"$gid" "$path" | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| @@ -132,12 +109,10 @@ _D() { | ||||
|  | ||||
| 	if [ -d "$path" ] && [ $REMOVE -gt 0 ]; then | ||||
| 		dryrun_or_real find "$path" -mindepth 1 -maxdepth 1 -xdev -exec rm -rf {} + | ||||
| 		_restorecon "$path" | ||||
| 	fi | ||||
|  | ||||
| 	if [ $CREATE -gt 0 ]; then | ||||
| 		dryrun_or_real mkdir -p "$path" 2>/dev/null | ||||
| 		dryrun_or_real $CHECKPATH -Dq -m "$mode" -o "$uid:$gid" "$path" | ||||
| 		dryrun_or_real install -d -m"$mode" -o"$uid" -g"$gid" "$path" | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| @@ -145,7 +120,6 @@ _L() { | ||||
| 	# Create a symlink if it doesn't exist yet | ||||
| 	local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 | ||||
| 	[ ! -e "$path" ] && dryrun_or_real ln -s "$arg" "$path" | ||||
| 	_restorecon "$path" | ||||
| } | ||||
|  | ||||
| _p() { | ||||
| @@ -155,7 +129,8 @@ _p() { | ||||
| 	[ $CREATE -gt 0 ] || return 0 | ||||
|  | ||||
| 	if [ ! -p "$path" ]; then | ||||
| 		dryrun_or_real $CHECKPATH -pq -m $mode -o "$uid:$gid" "$path" | ||||
| 		dryrun_or_real mkfifo -m$mode "$path" | ||||
| 		dryrun_or_real chown "$uid:$gid" "$path" | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| @@ -239,7 +214,7 @@ _Z() { | ||||
| 	CHOPTS=-R relabel "$@" | ||||
| } | ||||
|  | ||||
| BOOT=0 CREATE=0 REMOVE=0 CLEAN=0 VERBOSE=0 DRYRUN=0 error=0 LINENO=0 | ||||
| CREATE=0 REMOVE=0 CLEAN=0 VERBOSE=0 DRYRUN=0 error=0 LINENO=0 | ||||
| EXCLUDE= | ||||
| PREFIX= | ||||
| FILE= | ||||
| @@ -255,13 +230,11 @@ tmpfiles_d='' | ||||
| # `/run/tmpfiles/foo.conf' will always be read after `/etc/tmpfiles.d/bar.conf' | ||||
| for d in ${tmpfiles_dirs} ; do | ||||
| 	[ -d $d ] && for f in ${d}/*.conf ; do | ||||
| 		case "${f##*/}" in | ||||
| 			systemd.conf|systemd-*.conf) continue;; | ||||
| 		esac | ||||
| 		[ "$f" = "$d/systemd.conf" ] && continue | ||||
| 		[ -f $f ] && tmpfiles_basenames="${tmpfiles_basenames}\n${f##*/}" | ||||
| 	done # for f in ${d} | ||||
| done # for d in ${tmpfiles_dirs} | ||||
| tmpfiles_basenames="$(printf "${tmpfiles_basenames}\n" | sort -u )" | ||||
| tmpfiles_basenames="`printf "${tmpfiles_basenames}\n" | sort | uniq`" | ||||
|  | ||||
| for b in $tmpfiles_basenames ; do | ||||
| 	real_f='' | ||||
| @@ -274,7 +247,6 @@ done | ||||
|  | ||||
| while [ $# -gt 0 ]; do | ||||
| 	case $1 in | ||||
| 		--boot) BOOT=1 ;; | ||||
| 		--create) CREATE=1 ;; | ||||
| 		--remove) REMOVE=1 ;; | ||||
| 		--clean) CLEAN=1 ;; # TODO: Not implemented | ||||
| @@ -292,7 +264,7 @@ if [ $(( CLEAN )) -eq 1 ] ; then | ||||
| fi | ||||
|  | ||||
| if [ "$CREATE$REMOVE" = '00' ]; then | ||||
| 	printf 'usage: %s [--exclude-prefix=path] [--prefix=path] [--boot] [--create] [--remove] [--clean] [--verbose] [--dry-run]\n' "${0##*/}" | ||||
| 	printf 'usage: %s [--exclude-prefix=path] [--prefix=path] [--create] [--remove] [--clean] [--verbose] [--dry-run]\n' "${0##*/}" | ||||
| 	exit 1 | ||||
| fi | ||||
|  | ||||
| @@ -309,34 +281,21 @@ for FILE in $tmpfiles_d ; do | ||||
| 	# Cmd  Path           Mode UID  GID  Age Argument | ||||
| 	# d    /run/user      0755 root root 10d - | ||||
| 	# Mode, UID, GID, Age, Argument may be omitted! | ||||
| 	# If Cmd ends with !, the line is only processed if --boot is passed | ||||
|  | ||||
| 	# XXX: Upstream says whitespace is NOT permitted in the Path argument. | ||||
| 	# But IS allowed when globs are expanded for the x/r/R/z/Z types. | ||||
| 	while read cmd path mode uid gid age arg; do | ||||
| 		LINENUM=$(( LINENUM+1 )) | ||||
| 		FORCE=0 | ||||
|  | ||||
| 		# Unless we have both command and path, skip this line. | ||||
| 		if [ -z "$cmd" -o -z "$path" ]; then | ||||
| 			continue | ||||
| 		fi | ||||
|  | ||||
| 		case $cmd in | ||||
| 			\#*) continue ;; | ||||
| 		esac | ||||
|  | ||||
| 		while [ ${#cmd} -gt 1 ]; do | ||||
| 			case $cmd in | ||||
| 				*!) cmd=${cmd%!}; [ "$BOOT" -eq "1" ] || continue 2 ;; | ||||
| 				*+) cmd=${cmd%+}; FORCE=1; ;; | ||||
| 				*) warninvalid ; continue 2 ;; | ||||
| 			esac | ||||
| 		done | ||||
|  | ||||
| 		# whine about invalid entries | ||||
| 		case $cmd in | ||||
| 			f|F|w|d|D|p|L|c|C|b|x|X|r|R|z|Z) ;; | ||||
| 			f|F|w|d|D|p|L|c|b|x|X|r|R|z|Z) ;; | ||||
| 			\#) continue ;; | ||||
| 			*) warninvalid ; continue ;; | ||||
| 		esac | ||||
|  | ||||
| @@ -345,7 +304,7 @@ for FILE in $tmpfiles_d ; do | ||||
| 			case "$cmd" in | ||||
| 				p|f|F) mode=0644 ;; | ||||
| 				d|D) mode=0755 ;; | ||||
| 				C|z|Z|x|r|R|L) ;; | ||||
| 				z|Z|x|r|R|L) ;; | ||||
| 			esac | ||||
| 		fi | ||||
|  | ||||
| @@ -357,13 +316,6 @@ for FILE in $tmpfiles_d ; do | ||||
|  | ||||
| 		[ -n "$EXCLUDE" ] && checkprefix $path $EXCLUDE && continue | ||||
| 		[ -n "$PREFIX" ] && ! checkprefix $path $PREFIX && continue | ||||
|  | ||||
| 		if [ $FORCE -gt 0 ]; then | ||||
| 			case $cmd in | ||||
| 				p|L|c|b) [ -f "$path" ] && dryrun_or_real rm -f "$path" | ||||
| 			esac | ||||
| 		fi | ||||
|  | ||||
| 		[ "$VERBOSE" -eq "1" ] && echo _$cmd "$@" | ||||
| 		_$cmd "$@" | ||||
| 		rc=$? | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| # Copyright (c) 2007-2008 Roy Marples <roy@marples.name> | ||||
| # Released under the 2-clause BSD license. | ||||
|  | ||||
| SUBDIR=		test libeinfo librc rc | ||||
| SUBDIR=		test librc rc | ||||
|  | ||||
| ifeq (${MKTOOLS},yes) | ||||
| SUBDIR+= tools | ||||
|   | ||||
							
								
								
									
										1
									
								
								src/libeinfo/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								src/libeinfo/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1 +0,0 @@ | ||||
| libeinfo.so.1 | ||||
| @@ -1,12 +0,0 @@ | ||||
| LIB=			einfo | ||||
| SHLIB_MAJOR=		1 | ||||
| SRCS=			libeinfo.c | ||||
| INCS=			einfo.h | ||||
| VERSION_MAP=		einfo.map | ||||
|  | ||||
| CPPFLAGS+=		-I../includes | ||||
|  | ||||
| MK=			../../mk | ||||
| include ${MK}/lib.mk | ||||
| include ${MK}/cc.mk | ||||
| include ${MK}/termcap.mk | ||||
| @@ -1,35 +0,0 @@ | ||||
| EINFO_1.0 { | ||||
| global: | ||||
| 	ecolor; | ||||
| 	elog; | ||||
| 	einfon; | ||||
| 	ewarnn; | ||||
| 	eerrorn; | ||||
| 	einfo; | ||||
| 	ewarn; | ||||
| 	ewarnx; | ||||
| 	eerror; | ||||
| 	eerrorx; | ||||
| 	einfovn; | ||||
| 	ewarnvn; | ||||
| 	ebeginvn; | ||||
| 	eendvn; | ||||
| 	ewendvn; | ||||
| 	einfov; | ||||
| 	ewarnv; | ||||
| 	ebeginv; | ||||
| 	ebegin; | ||||
| 	eend; | ||||
| 	ewend; | ||||
| 	ebracket; | ||||
| 	eendv; | ||||
| 	ewendv; | ||||
| 	eindent; | ||||
| 	eoutdent; | ||||
| 	eindentv; | ||||
| 	eoutdentv; | ||||
| 	eprefix; | ||||
|  | ||||
| local: | ||||
| 	*; | ||||
| }; | ||||
| @@ -30,7 +30,7 @@ | ||||
|  | ||||
| #include "librc.h" | ||||
|  | ||||
| #if defined(__linux__) || defined (__GLIBC__) | ||||
| #if defined(__linux__) | ||||
| static bool | ||||
| pid_is_exec(pid_t pid, const char *exec) | ||||
| { | ||||
|   | ||||
| @@ -323,6 +323,42 @@ 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) | ||||
| { | ||||
| @@ -424,22 +460,10 @@ librc_hidden_def(rc_runlevel_unstack) | ||||
| RC_STRINGLIST * | ||||
| rc_runlevel_stacks(const char *runlevel) | ||||
| { | ||||
| 	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; | ||||
| 	RC_STRINGLIST *stack; | ||||
| 	stack = rc_stringlist_new(); | ||||
| 	get_runlevel_chain(runlevel, stack); | ||||
| 	return stack; | ||||
| } | ||||
| librc_hidden_def(rc_runlevel_stacks) | ||||
|  | ||||
| @@ -903,17 +927,13 @@ 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); | ||||
| 		if (list != NULL) { | ||||
| 			TAILQ_CONCAT(list, sl, entries); | ||||
| 			free(sl); | ||||
| 		} else | ||||
| 			list = sl; | ||||
| 		TAILQ_CONCAT(list, sl, entries); | ||||
| 		free(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,6 +3,7 @@ rc-status | ||||
| rc-service | ||||
| rc-update | ||||
| runscript | ||||
| service | ||||
| start-stop-daemon | ||||
| einfon | ||||
| einfo | ||||
|   | ||||
| @@ -1,8 +1,21 @@ | ||||
| PROG=		rc | ||||
| SRCS=		checkpath.c fstabinfo.c mountinfo.c start-stop-daemon.c \ | ||||
| 		rc-applets.c rc-depend.c rc-logger.c \ | ||||
| 		rc-misc.c rc-plugin.c rc-service.c rc-status.c rc-update.c \ | ||||
| 		runscript.c rc.c swclock.c | ||||
| SRCS=	\ | ||||
| 	checkpath.c \ | ||||
| 	einfo.c \ | ||||
| 	fstabinfo.c \ | ||||
| 	mountinfo.c \ | ||||
| 	rc-applets.c \ | ||||
| 	rc-depend.c \ | ||||
| 	rc-logger.c \ | ||||
| 	rc-misc.c \ | ||||
| 	rc-plugin.c \ | ||||
| 	rc-service.c \ | ||||
| 	rc-status.c \ | ||||
| 	rc-update.c \ | ||||
| 	rc.c \ | ||||
| 	runscript.c \ | ||||
| 	start-stop-daemon.c \ | ||||
| 	swclock.c | ||||
|  | ||||
| CLEANFILES=	version.h | ||||
|  | ||||
| @@ -30,9 +43,9 @@ RC_SBINLINKS=	mark_service_starting mark_service_started \ | ||||
| ALL_LINKS=	${BINLINKS} ${SBINLINKS} ${RC_BINLINKS} ${RC_SBINLINKS} | ||||
| CLEANFILES+=	${ALL_LINKS} | ||||
|  | ||||
| CPPFLAGS+=	-I../includes -I../librc -I../libeinfo | ||||
| LDFLAGS+=	-L../librc -L../libeinfo | ||||
| LDADD+=		-lutil -lrc -leinfo | ||||
| CPPFLAGS+=	-I../includes -I../librc | ||||
| LDFLAGS+=	-L../librc | ||||
| LDADD+=		-lutil -lrc | ||||
|  | ||||
| include ../../Makefile.inc | ||||
| MK=		../../mk | ||||
|   | ||||
| @@ -35,6 +35,21 @@ | ||||
| #  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 (Does not affect errors)" | ||||
| 	"Run quietly (repeat to suppress 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  setenv ("EINFO_QUIET", "YES", 1); | ||||
| #define case_RC_COMMON_getopt_case_q  set_quiet_options(); | ||||
| #define case_RC_COMMON_getopt_default usage (EXIT_FAILURE); | ||||
|  | ||||
| #define case_RC_COMMON_GETOPT						      \ | ||||
|   | ||||
| @@ -52,34 +52,6 @@ const char libeinfo_copyright[] = "Copyright (c) 2007-2008 Roy Marples"; | ||||
| 
 | ||||
| #include "einfo.h" | ||||
| #include "helpers.h" | ||||
| #include "hidden-visibility.h" | ||||
| 
 | ||||
| hidden_proto(ecolor) | ||||
| hidden_proto(ebegin) | ||||
| hidden_proto(ebeginv) | ||||
| hidden_proto(ebracket) | ||||
| hidden_proto(eend) | ||||
| hidden_proto(eendv) | ||||
| hidden_proto(eerror) | ||||
| hidden_proto(eerrorn) | ||||
| hidden_proto(eerrorx) | ||||
| hidden_proto(eindent) | ||||
| hidden_proto(eindentv) | ||||
| hidden_proto(einfo) | ||||
| hidden_proto(einfon) | ||||
| hidden_proto(einfov) | ||||
| hidden_proto(einfovn) | ||||
| hidden_proto(elog) | ||||
| hidden_proto(eoutdent) | ||||
| hidden_proto(eoutdentv) | ||||
| hidden_proto(eprefix) | ||||
| hidden_proto(ewarn) | ||||
| hidden_proto(ewarnn) | ||||
| hidden_proto(ewarnv) | ||||
| hidden_proto(ewarnvn) | ||||
| hidden_proto(ewarnx) | ||||
| hidden_proto(ewend) | ||||
| hidden_proto(ewendv) | ||||
| 
 | ||||
| /* Incase we cannot work out how many columns from ioctl, supply a default */ | ||||
| #define DEFAULT_COLS		 80 | ||||
| @@ -273,6 +245,12 @@ is_quiet(void) | ||||
| 	return yesno(getenv("EINFO_QUIET")); | ||||
| } | ||||
| 
 | ||||
| static bool | ||||
| is_really_quiet(void) | ||||
| { | ||||
| 	return yesno(getenv("EERROR_QUIET")); | ||||
| } | ||||
| 
 | ||||
| static bool | ||||
| is_verbose(void) | ||||
| { | ||||
| @@ -346,7 +324,7 @@ tgoto(const char *cap, int col, int line) | ||||
| #endif | ||||
| 
 | ||||
| static bool | ||||
| colour_terminal(FILE * EINFO_RESTRICT f) | ||||
| colour_terminal(FILE *f) | ||||
| { | ||||
| 	static int in_colour = -1; | ||||
| 	char *e, *ee, *end, *d, *p; | ||||
| @@ -493,7 +471,7 @@ colour_terminal(FILE * EINFO_RESTRICT f) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| get_term_columns(FILE * EINFO_RESTRICT stream) | ||||
| get_term_columns(FILE *stream) | ||||
| { | ||||
| 	struct winsize ws; | ||||
| 	char *env = getenv("COLUMNS"); | ||||
| @@ -513,14 +491,13 @@ get_term_columns(FILE * EINFO_RESTRICT stream) | ||||
| } | ||||
| 
 | ||||
| void | ||||
| eprefix(const char *EINFO_RESTRICT prefix) | ||||
| eprefix(const char *prefix) | ||||
| { | ||||
| 	_eprefix = prefix; | ||||
| } | ||||
| hidden_def(eprefix) | ||||
| 
 | ||||
| static void EINFO_PRINTF(2, 0) | ||||
| elogv(int level, const char *EINFO_RESTRICT fmt, va_list ap) | ||||
| elogv(int level, const char *fmt, va_list ap) | ||||
| { | ||||
| 	char *e = getenv("EINFO_LOG"); | ||||
| 	va_list apc; | ||||
| @@ -536,7 +513,7 @@ elogv(int level, const char *EINFO_RESTRICT fmt, va_list ap) | ||||
| } | ||||
| 
 | ||||
| void | ||||
| elog(int level, const char *EINFO_RESTRICT fmt, ...) | ||||
| elog(int level, const char *fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 
 | ||||
| @@ -544,10 +521,9 @@ elog(int level, const char *EINFO_RESTRICT fmt, ...) | ||||
| 	elogv(level, fmt, ap); | ||||
| 	va_end(ap); | ||||
| } | ||||
| hidden_def(elog) | ||||
| 
 | ||||
| static int | ||||
| _eindent(FILE * EINFO_RESTRICT stream) | ||||
| _eindent(FILE *stream) | ||||
| { | ||||
| 	char *env = getenv("EINFO_INDENT"); | ||||
| 	int amount = 0; | ||||
| @@ -571,7 +547,7 @@ _eindent(FILE * EINFO_RESTRICT stream) | ||||
| } | ||||
| 
 | ||||
| static const char * | ||||
| _ecolor(FILE * EINFO_RESTRICT f, ECOLOR color) | ||||
| _ecolor(FILE *f, ECOLOR color) | ||||
| { | ||||
| 	unsigned int i; | ||||
| 
 | ||||
| @@ -583,7 +559,6 @@ _ecolor(FILE * EINFO_RESTRICT f, ECOLOR color) | ||||
| 			return ecolors_str[i]; | ||||
| 	return ""; | ||||
| } | ||||
| hidden_def(ecolor) | ||||
| 
 | ||||
| const char * | ||||
| ecolor(ECOLOR color) | ||||
| @@ -609,7 +584,7 @@ ecolor(ECOLOR color) | ||||
| 	} | ||||
| 
 | ||||
| static int EINFO_PRINTF(3, 0) | ||||
| 	_einfo(FILE *f, ECOLOR color, const char *EINFO_RESTRICT fmt, va_list va) | ||||
| 	_einfo(FILE *f, ECOLOR color, const char *fmt, va_list va) | ||||
| { | ||||
| 	int retval = 0; | ||||
| 	char *last = getenv("EINFO_LASTCMD"); | ||||
| @@ -637,7 +612,7 @@ static int EINFO_PRINTF(3, 0) | ||||
| #define _eerrorvn(fmt, ap) _einfo(stderr, ECOLOR_BAD, fmt, ap) | ||||
| 
 | ||||
| int | ||||
| einfon(const char *EINFO_RESTRICT fmt, ...) | ||||
| einfon(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| @@ -650,10 +625,9 @@ einfon(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("einfon"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(einfon) | ||||
| 
 | ||||
| int | ||||
| ewarnn(const char *EINFO_RESTRICT fmt, ...) | ||||
| ewarnn(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| @@ -666,24 +640,24 @@ ewarnn(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("ewarnn"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(ewarnn) | ||||
| 
 | ||||
| int | ||||
| eerrorn(const char *EINFO_RESTRICT fmt, ...) | ||||
| eerrorn(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| 
 | ||||
| 	if (!fmt || is_really_quiet()) | ||||
| 		return 0; | ||||
| 	va_start(ap, fmt); | ||||
| 	retval = _eerrorvn(fmt, ap); | ||||
| 	va_end(ap); | ||||
| 	LASTCMD("errorn"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(eerrorn) | ||||
| 
 | ||||
| int | ||||
| einfo(const char *EINFO_RESTRICT fmt, ...) | ||||
| einfo(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| @@ -697,15 +671,14 @@ einfo(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("einfo"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(einfo) | ||||
| 
 | ||||
| int | ||||
| ewarn(const char *EINFO_RESTRICT fmt, ...) | ||||
| ewarn(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| 
 | ||||
| 	if (!fmt) | ||||
| 	if (!fmt || is_quiet()) | ||||
| 		return 0; | ||||
| 	va_start(ap, fmt); | ||||
| 	elogv(LOG_WARNING, fmt, ap); | ||||
| @@ -715,10 +688,9 @@ ewarn(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("ewarn"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(ewarn) | ||||
| 
 | ||||
| void | ||||
| ewarnx(const char *EINFO_RESTRICT fmt, ...) | ||||
| ewarnx(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| @@ -732,15 +704,14 @@ ewarnx(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	} | ||||
| 	exit(EXIT_FAILURE); | ||||
| } | ||||
| hidden_def(ewarnx) | ||||
| 
 | ||||
| int | ||||
| eerror(const char *EINFO_RESTRICT fmt, ...) | ||||
| eerror(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| 
 | ||||
| 	if (!fmt) | ||||
| 	if (!fmt || is_really_quiet()) | ||||
| 		return 0; | ||||
| 	va_start(ap, fmt); | ||||
| 	elogv(LOG_ERR, fmt, ap); | ||||
| @@ -750,14 +721,13 @@ eerror(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("eerror"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(eerror) | ||||
| 
 | ||||
| void | ||||
| eerrorx(const char *EINFO_RESTRICT fmt, ...) | ||||
| eerrorx(const char *fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 
 | ||||
| 	if (fmt) { | ||||
| 	if (fmt && !is_really_quiet()) { | ||||
| 		va_start(ap, fmt); | ||||
| 		elogv(LOG_ERR, fmt, ap); | ||||
| 		_eerrorvn(fmt, ap); | ||||
| @@ -766,10 +736,9 @@ eerrorx(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	} | ||||
| 	exit(EXIT_FAILURE); | ||||
| } | ||||
| hidden_def(eerrorx) | ||||
| 
 | ||||
| int | ||||
| ebegin(const char *EINFO_RESTRICT fmt, ...) | ||||
| ebegin(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| @@ -785,10 +754,9 @@ ebegin(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("ebegin"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(ebegin) | ||||
| 
 | ||||
| static void | ||||
| _eend(FILE * EINFO_RESTRICT fp, int col, ECOLOR color, const char *msg) | ||||
| _eend(FILE *fp, int col, ECOLOR color, const char *msg) | ||||
| { | ||||
| 	int i; | ||||
| 	int cols; | ||||
| @@ -824,7 +792,7 @@ _eend(FILE * EINFO_RESTRICT fp, int col, ECOLOR color, const char *msg) | ||||
| 
 | ||||
| static int EINFO_PRINTF(3, 0) | ||||
| _do_eend(const char *cmd, int retval, | ||||
|     const char *EINFO_RESTRICT fmt, va_list ap) | ||||
|     const char *fmt, va_list ap) | ||||
| { | ||||
| 	int col = 0; | ||||
| 	FILE *fp = stdout; | ||||
| @@ -847,7 +815,7 @@ _do_eend(const char *cmd, int retval, | ||||
| } | ||||
| 
 | ||||
| int | ||||
| eend(int retval, const char *EINFO_RESTRICT fmt, ...) | ||||
| eend(int retval, const char *fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 
 | ||||
| @@ -859,10 +827,9 @@ eend(int retval, const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("eend"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(eend) | ||||
| 
 | ||||
| int | ||||
| ewend(int retval, const char *EINFO_RESTRICT fmt, ...) | ||||
| ewend(int retval, const char *fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 
 | ||||
| @@ -874,14 +841,12 @@ ewend(int retval, const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("ewend"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(ewend) | ||||
| 
 | ||||
| void | ||||
| ebracket(int col, ECOLOR color, const char *msg) | ||||
| { | ||||
| 	_eend(stdout, col, color, msg); | ||||
| } | ||||
| hidden_def(ebracket) | ||||
| 
 | ||||
| void | ||||
| eindent(void) | ||||
| @@ -902,7 +867,6 @@ eindent(void) | ||||
| 	snprintf(num, 10, "%08d", amount); | ||||
| 	setenv("EINFO_INDENT", num, 1); | ||||
| } | ||||
| hidden_def(eindent) | ||||
| 
 | ||||
| void eoutdent(void) | ||||
| { | ||||
| @@ -927,10 +891,9 @@ void eoutdent(void) | ||||
| 	} | ||||
| 	errno = serrno; | ||||
| } | ||||
| hidden_def(eoutdent) | ||||
| 
 | ||||
| int | ||||
| einfovn(const char *EINFO_RESTRICT fmt, ...) | ||||
| einfovn(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| @@ -943,10 +906,9 @@ einfovn(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("einfovn"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(einfovn) | ||||
| 
 | ||||
| int | ||||
| ewarnvn(const char *EINFO_RESTRICT fmt, ...) | ||||
| ewarnvn(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| @@ -959,10 +921,9 @@ ewarnvn(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("ewarnvn"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(ewarnvn) | ||||
| 
 | ||||
| int | ||||
| einfov(const char *EINFO_RESTRICT fmt, ...) | ||||
| einfov(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| @@ -976,10 +937,9 @@ einfov(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("einfov"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(einfov) | ||||
| 
 | ||||
| int | ||||
| ewarnv(const char *EINFO_RESTRICT fmt, ...) | ||||
| ewarnv(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| @@ -993,10 +953,9 @@ ewarnv(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("ewarnv"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(ewarnv) | ||||
| 
 | ||||
| int | ||||
| ebeginv(const char *EINFO_RESTRICT fmt, ...) | ||||
| ebeginv(const char *fmt, ...) | ||||
| { | ||||
| 	int retval; | ||||
| 	va_list ap; | ||||
| @@ -1013,10 +972,9 @@ ebeginv(const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("ebeginv"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(ebeginv) | ||||
| 
 | ||||
| int | ||||
| eendv(int retval, const char *EINFO_RESTRICT fmt, ...) | ||||
| eendv(int retval, const char *fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 
 | ||||
| @@ -1028,10 +986,9 @@ eendv(int retval, const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("eendv"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(eendv) | ||||
| 
 | ||||
| int | ||||
| ewendv(int retval, const char *EINFO_RESTRICT fmt, ...) | ||||
| ewendv(int retval, const char *fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 
 | ||||
| @@ -1043,7 +1000,6 @@ ewendv(int retval, const char *EINFO_RESTRICT fmt, ...) | ||||
| 	LASTCMD("ewendv"); | ||||
| 	return retval; | ||||
| } | ||||
| hidden_def(ewendv) | ||||
| 
 | ||||
| void | ||||
| eindentv(void) | ||||
| @@ -1051,7 +1007,6 @@ eindentv(void) | ||||
| 	if (is_verbose()) | ||||
| 		eindent(); | ||||
| } | ||||
| hidden_def(eindentv) | ||||
| 
 | ||||
| void | ||||
| eoutdentv(void) | ||||
| @@ -1059,4 +1014,3 @@ eoutdentv(void) | ||||
| 	if (is_verbose()) | ||||
| 		eoutdent(); | ||||
| } | ||||
| hidden_def(eoutdentv) | ||||
| @@ -37,19 +37,6 @@ | ||||
| #include <sys/types.h> | ||||
| #include <stdbool.h> | ||||
| 
 | ||||
| /* Although OpenRC requires C99, linking to us should not. */ | ||||
| #ifdef restrict | ||||
| # define EINFO_RESTRICT restrict | ||||
| #else | ||||
| # ifdef __restrict | ||||
| #  define EINFO_RESTRICT __restrict | ||||
| # else | ||||
| #  define EINFO_RESTRICT | ||||
| # endif | ||||
| #endif | ||||
| 
 | ||||
| __BEGIN_DECLS | ||||
| 
 | ||||
| /*! @brief Color types to use */ | ||||
| typedef enum | ||||
| { | ||||
| @@ -65,14 +52,14 @@ typedef enum | ||||
| const char *ecolor(ECOLOR); | ||||
| 
 | ||||
| /*! @brief Writes to syslog. */ | ||||
| void elog(int, const char * EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); | ||||
| void elog(int, const char *, ...) EINFO_PRINTF(2, 3); | ||||
| 
 | ||||
| /*!
 | ||||
|  * @brief Display informational messages. | ||||
|  * | ||||
|  * The einfo family of functions display messages in a consistent manner | ||||
|  * across applications. Basically they prefix the message with | ||||
|  * " * ". If the terminal can handle color then we color the * based on | ||||
|  * Basically they prefix the message with " * ". | ||||
|  * If the terminal can handle color then we color the * based on | ||||
|  * the command used. Otherwise we are identical to the printf function. | ||||
|  * | ||||
|  * - einfo  - green | ||||
| @@ -83,22 +70,22 @@ void elog(int, const char * EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); | ||||
|  * The v suffix means only print if EINFO_VERBOSE is yes. | ||||
|  */ | ||||
| /*@{*/ | ||||
| int einfon(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| int ewarnn(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| int eerrorn(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| int einfo(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| int ewarn(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| void ewarnx(const char * __EINFO_RESTRICT, ...) EINFO_XPRINTF(1, 2); | ||||
| int eerror(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| void eerrorx(const char * __EINFO_RESTRICT, ...) EINFO_XPRINTF(1, 2); | ||||
| int einfon(const char *, ...) EINFO_PRINTF(1, 2); | ||||
| int ewarnn(const char *, ...) EINFO_PRINTF(1, 2); | ||||
| int eerrorn(const char *, ...) EINFO_PRINTF(1, 2); | ||||
| int einfo(const char *, ...) EINFO_PRINTF(1, 2); | ||||
| int ewarn(const char *, ...) EINFO_PRINTF(1, 2); | ||||
| void ewarnx(const char *, ...) EINFO_XPRINTF(1, 2); | ||||
| int eerror(const char *, ...) EINFO_PRINTF(1, 2); | ||||
| void eerrorx(const char *, ...) EINFO_XPRINTF(1, 2); | ||||
| 
 | ||||
| int einfovn(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| int ewarnvn(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| int ebeginvn(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| int eendvn(int, const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); | ||||
| int ewendvn(int, const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); | ||||
| int einfov(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| int ewarnv(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| int einfovn(const char *, ...) EINFO_PRINTF(1, 2); | ||||
| int ewarnvn(const char * , ...) EINFO_PRINTF(1, 2); | ||||
| int ebeginvn(const char *, ...) EINFO_PRINTF(1, 2); | ||||
| int eendvn(int, const char *, ...) EINFO_PRINTF(2, 3); | ||||
| int ewendvn(int, const char *, ...) EINFO_PRINTF(2, 3); | ||||
| int einfov(const char *, ...) EINFO_PRINTF(1, 2); | ||||
| int ewarnv(const char *, ...) EINFO_PRINTF(1, 2); | ||||
| /*@}*/ | ||||
| 
 | ||||
| /*! @ingroup ebegin
 | ||||
| @@ -106,8 +93,8 @@ int ewarnv(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
|  * | ||||
|  * Similar to einfo, but we add ... to the end of the message */ | ||||
| /*@{*/ | ||||
| int ebeginv(const char * EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| int ebegin(const char * EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
| int ebeginv(const char *, ...) EINFO_PRINTF(1, 2); | ||||
| int ebegin(const char *, ...) EINFO_PRINTF(1, 2); | ||||
| /*@}*/ | ||||
| 
 | ||||
| /*! @ingroup eend
 | ||||
| @@ -119,12 +106,12 @@ int ebegin(const char * EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); | ||||
|  * | ||||
|  * ebracket allows you to specifiy the position, color and message */ | ||||
| /*@{*/ | ||||
| int eend(int, const char * EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); | ||||
| int ewend(int, const char * EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); | ||||
| void ebracket(int, ECOLOR, const char * EINFO_RESTRICT); | ||||
| int eend(int, const char *, ...) EINFO_PRINTF(2, 3); | ||||
| int ewend(int, const char *, ...) EINFO_PRINTF(2, 3); | ||||
| void ebracket(int, ECOLOR, const char *); | ||||
| 
 | ||||
| int eendv(int, const char * EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); | ||||
| int ewendv(int, const char * EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); | ||||
| int eendv(int, const char *, ...) EINFO_PRINTF(2, 3); | ||||
| int ewendv(int, const char *, ...) EINFO_PRINTF(2, 3); | ||||
| /*@}*/ | ||||
| 
 | ||||
| /*! @ingroup eindent
 | ||||
| @@ -138,7 +125,6 @@ void eindentv(void); | ||||
| void eoutdentv(void); | ||||
| 
 | ||||
| /*! @brief Prefix each einfo line with something */ | ||||
| void eprefix(const char * EINFO_RESTRICT); | ||||
| void eprefix(const char *); | ||||
| 
 | ||||
| __END_DECLS | ||||
| #endif | ||||
| @@ -39,7 +39,7 @@ | ||||
| #  include <sys/statvfs.h> | ||||
| #  define statfs statvfs | ||||
| #  define F_FLAGS f_flag | ||||
| #elif defined (__linux__) || defined (__GLIBC__) | ||||
| #elif defined (__linux__) | ||||
| #  include <mntent.h> | ||||
| #endif | ||||
|  | ||||
| @@ -265,7 +265,7 @@ find_mounts(struct args *args) | ||||
| 	return list; | ||||
| } | ||||
|  | ||||
| #elif defined (__linux__) || defined (__GLIBC__) | ||||
| #elif defined (__linux__) | ||||
| static struct mntent * | ||||
| getmntfile(const char *file) | ||||
| { | ||||
|   | ||||
| @@ -44,7 +44,7 @@ | ||||
| #include <time.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #if defined(__linux__) || defined(__GLIBC__) | ||||
| #ifdef __linux__ | ||||
| #  include <pty.h> | ||||
| #elif defined(__NetBSD__) || defined(__OpenBSD__) | ||||
| #  include <util.h> | ||||
|   | ||||
| @@ -171,6 +171,26 @@ 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"		\ | ||||
| @@ -199,7 +219,8 @@ static const char * const longopts_help[] = { | ||||
| int | ||||
| rc_status(int argc, char **argv) | ||||
| { | ||||
| 	RC_STRING *s, *l, *t; | ||||
|     RC_STRING *s, *l, *t, *level; | ||||
|  | ||||
| 	char *p, *runlevel = NULL; | ||||
| 	int opt, aflag = 0, retval = 0; | ||||
|  | ||||
| @@ -280,16 +301,7 @@ rc_status(int argc, char **argv) | ||||
| 		print_level(NULL, l->value); | ||||
| 		services = rc_services_in_runlevel(l->value); | ||||
| 		print_services(l->value, services); | ||||
| 		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; | ||||
| 		print_stacked_services(l->value); | ||||
| 		rc_stringlist_free(nservices); | ||||
| 		nservices = NULL; | ||||
| 		rc_stringlist_free(services); | ||||
| @@ -317,16 +329,14 @@ 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(l->value); | ||||
| 			nservices = rc_services_in_runlevel_stacked(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); | ||||
| 			} | ||||
| @@ -337,22 +347,23 @@ rc_status(int argc, char **argv) | ||||
| 		alist = rc_stringlist_new(); | ||||
| 		l = rc_stringlist_add(alist, ""); | ||||
| 		p = l->value; | ||||
| 		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); | ||||
| 		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); | ||||
| 			} | ||||
| 			rc_stringlist_free(tmp); | ||||
| 		} | ||||
| 		l->value = p; | ||||
| 		/* we are unsetting RC_SVCNAME because last loaded service  | ||||
| 		   wount be added to list */ | ||||
| 		/* | ||||
| 		 * we are unsetting RC_SVCNAME because last loaded service will not | ||||
| 		 * be added to the list | ||||
| 		 */ | ||||
| 		unsetenv("RC_SVCNAME"); | ||||
| 		print_level("Dynamic", "needed"); | ||||
| 		print_services(NULL, nservices); | ||||
|   | ||||
							
								
								
									
										92
									
								
								src/rc/rc.c
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								src/rc/rc.c
									
									
									
									
									
								
							| @@ -79,12 +79,6 @@ 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; | ||||
| @@ -524,7 +518,9 @@ runlevel_config(const char *service, const char *level) | ||||
| } | ||||
|  | ||||
| static void | ||||
| do_stop_services(const char *newlevel, bool parallel, bool going_down) | ||||
| 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) | ||||
| { | ||||
| 	pid_t pid; | ||||
| 	RC_STRING *service, *svc1, *svc2; | ||||
| @@ -627,7 +623,7 @@ stop: | ||||
| } | ||||
|  | ||||
| static void | ||||
| do_start_services(bool parallel) | ||||
| do_start_services(const RC_STRINGLIST *start_services, bool parallel) | ||||
| { | ||||
| 	RC_STRING *service; | ||||
| 	pid_t pid; | ||||
| @@ -754,6 +750,12 @@ 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; | ||||
| @@ -868,7 +870,11 @@ main(int argc, char **argv) | ||||
| 	snprintf(pidstr, sizeof(pidstr), "%d", getpid()); | ||||
| 	setenv("RC_PID", pidstr, 1); | ||||
|  | ||||
| 	/* Load current runlevel */ | ||||
| 	/* 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. | ||||
| 	*/ | ||||
| 	bootlevel = getenv("RC_BOOTLEVEL"); | ||||
| 	runlevel = rc_runlevel_get(); | ||||
|  | ||||
| @@ -972,8 +978,13 @@ main(int argc, char **argv) | ||||
| 		    applet, RC_STOPPING, strerror(errno)); | ||||
| 	} | ||||
|  | ||||
| 	/* Build a list of all services to stop and then work out the | ||||
| 	 * correct order for stopping them */ | ||||
| 	/* 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. | ||||
| 	*/ | ||||
| 	stop_services = rc_services_in_state(RC_SERVICE_STARTED); | ||||
| 	tmplist = rc_services_in_state(RC_SERVICE_INACTIVE); | ||||
| 	TAILQ_CONCAT(stop_services, tmplist, entries); | ||||
| @@ -996,7 +1007,11 @@ main(int argc, char **argv) | ||||
| 		stop_services = tmplist; | ||||
| 	} | ||||
|  | ||||
| 	/* Load our list of start services */ | ||||
| 	/* 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. | ||||
| 	 */ | ||||
| 	hotplugged_services = rc_services_in_state(RC_SERVICE_HOTPLUGGED); | ||||
| 	start_services = rc_services_in_runlevel_stacked(newlevel ? | ||||
| 	    newlevel : runlevel); | ||||
| @@ -1006,9 +1021,11 @@ 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) | ||||
| 			{ | ||||
| @@ -1029,7 +1046,7 @@ main(int argc, char **argv) | ||||
|  | ||||
| 	/* Now stop the services that shouldn't be running */ | ||||
| 	if (stop_services && !nostop) | ||||
| 		do_stop_services(newlevel, parallel, going_down); | ||||
| 		do_stop_services(types_n, start_services, stop_services, deptree, newlevel, parallel, going_down); | ||||
|  | ||||
| 	/* Wait for our services to finish */ | ||||
| 	wait_for_services(); | ||||
| @@ -1065,18 +1082,10 @@ 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__ | ||||
| 	/* mark any services skipped as started */ | ||||
| 	/* 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. */ | ||||
| 	proc = p = rc_proc_getent("noinit"); | ||||
| 	if (proc) { | ||||
| 		while ((token = strsep(&p, ","))) | ||||
| @@ -1085,19 +1094,38 @@ main(int argc, char **argv) | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	/* If we have a list of services to start then... */ | ||||
| 	if (start_services) { | ||||
| 		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. */ | ||||
| 		/* Get a list of the chained runlevels which compose the target runlevel */ | ||||
| 		RC_STRINGLIST *runlevel_chain = rc_runlevel_stacks(runlevel); | ||||
|  | ||||
| 		/* Wait for our services to finish */ | ||||
| 		wait_for_services(); | ||||
| 		/* 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); | ||||
| 	} | ||||
|  | ||||
| #ifdef __linux__ | ||||
| 	/* mark any services skipped as stopped */ | ||||
| 	/* If the "noinit" parameter was passed on the kernel command line then | ||||
| 	 * mark the specified services as stopped so that our records reflect | ||||
| 	 * reality.	 */ | ||||
| 	proc = p = rc_proc_getent("noinit"); | ||||
| 	if (proc) { | ||||
| 		while ((token = strsep(&p, ","))) | ||||
|   | ||||
| @@ -52,7 +52,7 @@ | ||||
| #include <time.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #if defined(__linux__) || defined(__GLIBC__) | ||||
| #ifdef __linux__ | ||||
| #  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, bool quiet) | ||||
| get_pid(const char *pidfile) | ||||
| { | ||||
| 	FILE *fp; | ||||
| 	pid_t pid; | ||||
| @@ -334,8 +334,7 @@ get_pid(const char *pidfile, bool quiet) | ||||
| /* 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 quiet, bool verbose, bool test) | ||||
|     pid_t pid, uid_t uid,int sig, bool test) | ||||
| { | ||||
| 	RC_PIDLIST *pids; | ||||
| 	RC_PID *pi; | ||||
| @@ -353,20 +352,16 @@ do_stop(const char *exec, const char *const *argv, | ||||
|  | ||||
| 	LIST_FOREACH_SAFE(pi, pids, entries, np) { | ||||
| 		if (test) { | ||||
| 			if (!quiet) | ||||
| 				einfo("Would send signal %d to PID %d", sig, pi->pid); | ||||
| 			einfo("Would send signal %d to PID %d", sig, pi->pid); | ||||
| 			nkilled++; | ||||
| 		} else { | ||||
| 			if (verbose) | ||||
| 				ebegin("Sending signal %d to PID %d", | ||||
| 				    sig, pi->pid); | ||||
| 			ebeginv("Sending signal %d to PID %d", sig, pi->pid); | ||||
| 			errno = 0; | ||||
| 			killed = (kill(pi->pid, sig) == 0 || | ||||
| 			    errno == ESRCH ? true : false); | ||||
| 			if (verbose) | ||||
| 				eend(killed ? 0 : 1, | ||||
| 				    "%s: failed to send signal %d to PID %d: %s", | ||||
| 				    applet, sig, pi->pid, strerror(errno)); | ||||
| 			eendv(killed ? 0 : 1, | ||||
| 				"%s: failed to send signal %d to PID %d: %s", | ||||
| 				applet, sig, pi->pid, strerror(errno)); | ||||
| 			if (!killed) { | ||||
| 				nkilled = -1; | ||||
| 			} else { | ||||
| @@ -384,7 +379,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 quiet, bool verbose, bool test, bool progress) | ||||
|     bool test, bool progress) | ||||
| { | ||||
| 	SCHEDULEITEM *item = TAILQ_FIRST(&schedule); | ||||
| 	int nkilled = 0; | ||||
| @@ -396,15 +391,15 @@ run_stop_schedule(const char *exec, const char *const *argv, | ||||
| 	const char *const *p; | ||||
| 	bool progressed = false; | ||||
|  | ||||
| 	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 `"); | ||||
| 	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"))) { | ||||
| 			for (p = argv; p && *p; p++) { | ||||
| 				if (p != argv) | ||||
| 					printf(" "); | ||||
| @@ -415,7 +410,7 @@ run_stop_schedule(const char *exec, const char *const *argv, | ||||
| 	} | ||||
|  | ||||
| 	if (pidfile) { | ||||
| 		pid = get_pid(pidfile, false); | ||||
| 		pid = get_pid(pidfile); | ||||
| 		if (pid == -1) | ||||
| 			return 0; | ||||
| 	} | ||||
| @@ -428,8 +423,7 @@ run_stop_schedule(const char *exec, const char *const *argv, | ||||
|  | ||||
| 		case SC_SIGNAL: | ||||
| 			nrunning = 0; | ||||
| 			nkilled = do_stop(exec, argv, pid, uid, item->value, | ||||
| 			    quiet, verbose, test); | ||||
| 			nkilled = do_stop(exec, argv, pid, uid, item->value, test); | ||||
| 			if (nkilled == 0) { | ||||
| 				if (tkilled == 0) { | ||||
| 					if (progressed) | ||||
| @@ -458,8 +452,7 @@ run_stop_schedule(const char *exec, const char *const *argv, | ||||
| 				     nloops++) | ||||
| 				{ | ||||
| 					if ((nrunning = do_stop(exec, argv, | ||||
| 						    pid, uid, 0, true, false, | ||||
| 	test)) == 0) | ||||
| 						    pid, uid, 0, test)) == 0) | ||||
| 						return 0; | ||||
|  | ||||
|  | ||||
| @@ -676,8 +669,6 @@ 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; | ||||
| @@ -914,8 +905,6 @@ 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 */ | ||||
| @@ -1059,7 +1048,7 @@ start_stop_daemon(int argc, char **argv) | ||||
| 		else | ||||
| 			parse_schedule(NULL, sig); | ||||
| 		i = run_stop_schedule(exec, (const char *const *)margv, | ||||
| 		    pidfile, uid, quiet, verbose, test, progress); | ||||
| 		    pidfile, uid, test, progress); | ||||
|  | ||||
| 		if (i < 0) | ||||
| 			/* We failed to stop something */ | ||||
| @@ -1081,16 +1070,16 @@ start_stop_daemon(int argc, char **argv) | ||||
| 	} | ||||
|  | ||||
| 	if (pidfile) | ||||
| 		pid = get_pid(pidfile, true); | ||||
| 		pid = get_pid(pidfile); | ||||
| 	else | ||||
| 		pid = 0; | ||||
|  | ||||
| 	if (do_stop(exec, (const char * const *)margv, pid, uid, | ||||
| 		0, true, false, test) > 0) | ||||
| 		0, test) > 0) | ||||
| 		eerrorx("%s: %s is already running", applet, exec); | ||||
|  | ||||
| 	if (test) { | ||||
| 		if (quiet) | ||||
| 		if (rc_yesno(getenv("EINFO_QUIET"))) | ||||
| 			exit (EXIT_SUCCESS); | ||||
|  | ||||
| 		einfon("Would start"); | ||||
| @@ -1114,10 +1103,8 @@ start_stop_daemon(int argc, char **argv) | ||||
| 		exit(EXIT_SUCCESS); | ||||
| 	} | ||||
|  | ||||
| 	if (verbose) { | ||||
| 		ebegin("Detaching to start `%s'", exec); | ||||
| 		eindent(); | ||||
| 	} | ||||
| 	ebeginv("Detaching to start `%s'", exec); | ||||
| 	eindentv(); | ||||
|  | ||||
| 	/* Remove existing pidfile */ | ||||
| 	if (pidfile) | ||||
| @@ -1285,9 +1272,9 @@ start_stop_daemon(int argc, char **argv) | ||||
| 		} | ||||
|  | ||||
| 		/* We don't redirect stdin as some daemons may need it */ | ||||
| 		if (background || quiet || redirect_stdout) | ||||
| 		if (background || redirect_stdout || rc_yesno(getenv("EINFO_QUIET"))) | ||||
| 			dup2(stdout_fd, STDOUT_FILENO); | ||||
| 		if (background || redirect_stderr) | ||||
| 		if (background || redirect_stderr || rc_yesno(getenv("EINFO_QUIET"))) | ||||
| 			dup2(stderr_fd, STDERR_FILENO); | ||||
|  | ||||
| 		for (i = getdtablesize() - 1; i >= 3; --i) | ||||
| @@ -1318,9 +1305,10 @@ start_stop_daemon(int argc, char **argv) | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} while (!WIFEXITED(i) && !WIFSIGNALED(i)); | ||||
| 		if (!WIFEXITED(i) || WEXITSTATUS(i) != 0) | ||||
| 			eerrorx("%s: failed to start `%s'", applet, exec); | ||||
|  | ||||
| 		if (!WIFEXITED(i) || WEXITSTATUS(i) != 0) { | ||||
| 			eerror("%s: failed to start `%s'", applet, exec); | ||||
| 			exit(EXIT_FAILURE); | ||||
| 		} | ||||
| 		pid = spid; | ||||
| 	} | ||||
|  | ||||
| @@ -1354,7 +1342,7 @@ start_stop_daemon(int argc, char **argv) | ||||
| 				alive = true; | ||||
| 		} else { | ||||
| 			if (pidfile) { | ||||
| 				pid = get_pid(pidfile, false); | ||||
| 				pid = get_pid(pidfile); | ||||
| 				if (pid == -1) { | ||||
| 					eerrorx("%s: did not " | ||||
| 					    "create a valid" | ||||
| @@ -1364,7 +1352,7 @@ start_stop_daemon(int argc, char **argv) | ||||
| 			} else | ||||
| 				pid = 0; | ||||
| 			if (do_stop(exec, (const char *const *)margv, | ||||
| 				pid, uid, 0, true, false, test) > 0) | ||||
| 				pid, uid, 0, test) > 0) | ||||
| 				alive = true; | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -1 +0,0 @@ | ||||
| EINFO_1.0 | ||||
| @@ -1,52 +0,0 @@ | ||||
| ebegin | ||||
| ebegin@@EINFO_1.0 | ||||
| ebeginv | ||||
| ebeginv@@EINFO_1.0 | ||||
| ebracket | ||||
| ebracket@@EINFO_1.0 | ||||
| ecolor | ||||
| ecolor@@EINFO_1.0 | ||||
| eend | ||||
| eend@@EINFO_1.0 | ||||
| eendv | ||||
| eendv@@EINFO_1.0 | ||||
| eerror | ||||
| eerror@@EINFO_1.0 | ||||
| eerrorn | ||||
| eerrorn@@EINFO_1.0 | ||||
| eerrorx | ||||
| eerrorx@@EINFO_1.0 | ||||
| eindent | ||||
| eindent@@EINFO_1.0 | ||||
| eindentv | ||||
| eindentv@@EINFO_1.0 | ||||
| einfo | ||||
| einfo@@EINFO_1.0 | ||||
| einfon | ||||
| einfon@@EINFO_1.0 | ||||
| einfov | ||||
| einfov@@EINFO_1.0 | ||||
| einfovn | ||||
| einfovn@@EINFO_1.0 | ||||
| elog | ||||
| elog@@EINFO_1.0 | ||||
| eoutdent | ||||
| eoutdent@@EINFO_1.0 | ||||
| eoutdentv | ||||
| eoutdentv@@EINFO_1.0 | ||||
| eprefix | ||||
| eprefix@@EINFO_1.0 | ||||
| ewarn | ||||
| ewarn@@EINFO_1.0 | ||||
| ewarnn | ||||
| ewarnn@@EINFO_1.0 | ||||
| ewarnv | ||||
| ewarnv@@EINFO_1.0 | ||||
| ewarnvn | ||||
| ewarnvn@@EINFO_1.0 | ||||
| ewarnx | ||||
| ewarnx@@EINFO_1.0 | ||||
| ewend | ||||
| ewend@@EINFO_1.0 | ||||
| ewendv | ||||
| ewendv@@EINFO_1.0 | ||||
| @@ -3,8 +3,6 @@ | ||||
| top_srcdir=${top_srcdir:-../..} | ||||
| . ${top_srcdir}/test/setup_env.sh | ||||
|  | ||||
| libeinfo_srcdir="${srcdir}/../libeinfo" | ||||
| libeinfo_builddir="${builddir}/../libeinfo" | ||||
| librc_srcdir="${srcdir}/../librc" | ||||
| librc_builddir="${builddir}/../librc" | ||||
| rc_srcdir="${srcdir}/../rc" | ||||
| @@ -20,22 +18,6 @@ checkit() { | ||||
|  | ||||
| ret=0 | ||||
|  | ||||
| ebegin "Checking exported symbols in libeinfo.so (data)" | ||||
| checkit einfo.data $( | ||||
| readelf -Ws ${libeinfo_builddir}/libeinfo.so \ | ||||
| 	| awk '$4 == "OBJECT" && $5 == "GLOBAL" && $7 != "UND" {print $NF}' \ | ||||
| 	| LC_ALL=C sort -u | ||||
| ) | ||||
|  | ||||
| ebegin "Checking exported symbols in libeinfo.so (functions)" | ||||
| checkit einfo.funcs $( | ||||
| readelf -Ws ${libeinfo_builddir}/libeinfo.so \ | ||||
| 	| awk '$4 == "FUNC" && $5 == "GLOBAL" && $7 != "UND" {print $NF}' \ | ||||
| 	| LC_ALL=C sort -u \ | ||||
| 	| egrep -v \ | ||||
| 		-e '^_(init|fini)$' | ||||
| ) | ||||
|  | ||||
| ebegin "Checking exported symbols in librc.so (data)" | ||||
| checkit rc.data $( | ||||
| readelf -Ws ${librc_builddir}/librc.so \ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user