Compare commits
	
		
			289 Commits
		
	
	
		
			openrc-0.9
			...
			openrc-0.1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					0884271bdd | ||
| 
						 | 
					f837107ca5 | ||
| 
						 | 
					9c4582fbd7 | ||
| 
						 | 
					ccb068c484 | ||
| 
						 | 
					603a308c6a | ||
| 
						 | 
					fba6bbb4b6 | ||
| 
						 | 
					ded282f163 | ||
| 
						 | 
					38ae822077 | ||
| 
						 | 
					611ed42044 | ||
| 
						 | 
					3f719bbb8b | ||
| 
						 | 
					e37b84a37d | ||
| 
						 | 
					9fdee75936 | ||
| 
						 | 
					dd261a2a54 | ||
| 
						 | 
					b36ef234be | ||
| 
						 | 
					a2c3660b87 | ||
| 
						 | 
					e473ab968c | ||
| 
						 | 
					b8a5a1a309 | ||
| 
						 | 
					8046427d7f | ||
| 
						 | 
					c73173ae53 | ||
| 
						 | 
					2964fc47f1 | ||
| 
						 | 
					0396f0ea7c | ||
| 
						 | 
					78a25883f3 | ||
| 
						 | 
					18dc0efa52 | ||
| 
						 | 
					f53645b7c7 | ||
| 
						 | 
					a75a9940b0 | ||
| 
						 | 
					e27f0acc60 | ||
| 
						 | 
					5c8ba80ea7 | ||
| 
						 | 
					e8ad6d2423 | ||
| 
						 | 
					aa34435cc8 | ||
| 
						 | 
					68f8e8aac2 | ||
| 
						 | 
					ee54bfef05 | ||
| 
						 | 
					7279b469ec | ||
| 
						 | 
					8482008559 | ||
| 
						 | 
					463d4ef00a | ||
| 
						 | 
					b5629d4ea0 | ||
| 
						 | 
					4385d31d9d | ||
| 
						 | 
					20af890ac2 | ||
| 
						 | 
					21abe9821c | ||
| 
						 | 
					f886372749 | ||
| 
						 | 
					f671e0a28f | ||
| 
						 | 
					6d84a4aed8 | ||
| 
						 | 
					76f76eb19a | ||
| 
						 | 
					a3ff6cce97 | ||
| 
						 | 
					1e7c696ea4 | ||
| 
						 | 
					8d9db8d02c | ||
| 
						 | 
					c5bb6829d0 | ||
| 
						 | 
					a9f1ac2dfd | ||
| 
						 | 
					27984c0d2d | ||
| 
						 | 
					9a9c2acd8d | ||
| 
						 | 
					b68d4b3580 | ||
| 
						 | 
					6f345abe91 | ||
| 
						 | 
					da842085ce | ||
| 
						 | 
					18bdbb6870 | ||
| 
						 | 
					361f5ce2b8 | ||
| 
						 | 
					ae9acfaed8 | ||
| 
						 | 
					6770a6b1ce | ||
| 
						 | 
					4ff71bd741 | ||
| 
						 | 
					5c736ad63e | ||
| 
						 | 
					33c63ede78 | ||
| 
						 | 
					ac47b6abfa | ||
| 
						 | 
					7d8dca7b78 | ||
| 
						 | 
					c08b1a6a32 | ||
| 
						 | 
					5615fa78d6 | ||
| 
						 | 
					f007988fba | ||
| 
						 | 
					20ef3439ea | ||
| 
						 | 
					0406c6085b | ||
| 
						 | 
					0a132cdca5 | ||
| 
						 | 
					a0fe1c5a60 | ||
| 
						 | 
					6b1e806c8b | ||
| 
						 | 
					3cd293c515 | ||
| 
						 | 
					a06072b395 | ||
| 
						 | 
					3863c11be5 | ||
| 
						 | 
					5092595835 | ||
| 
						 | 
					918d261658 | ||
| 
						 | 
					a0877449f3 | ||
| 
						 | 
					444bdfbfc4 | ||
| 
						 | 
					8e4169e29e | ||
| 
						 | 
					ea696b47c8 | ||
| 
						 | 
					9e88d73aaa | ||
| 
						 | 
					1f01157354 | ||
| 
						 | 
					8f675d14e8 | ||
| 
						 | 
					9afdf50667 | ||
| 
						 | 
					8dc06e3259 | ||
| 
						 | 
					aa7e2cd1fe | ||
| 
						 | 
					07e848638c | ||
| 
						 | 
					c8703354e3 | ||
| 
						 | 
					e641b43849 | ||
| 
						 | 
					a6db2374fe | ||
| 
						 | 
					2e3715bb69 | ||
| 
						 | 
					883ea31f80 | ||
| 
						 | 
					39abbed7cb | ||
| 
						 | 
					0730ac61e8 | ||
| 
						 | 
					006fbdce83 | ||
| 
						 | 
					60d6847de5 | ||
| 
						 | 
					ecb4d7c3f2 | ||
| 
						 | 
					84ad14b2e4 | ||
| 
						 | 
					a1bf102591 | ||
| 
						 | 
					add965706a | ||
| 
						 | 
					5d8b1b689b | ||
| 
						 | 
					3e2018f5e9 | ||
| 
						 | 
					dceeef9fe5 | ||
| 
						 | 
					3df0bd64cb | ||
| 
						 | 
					a5b4fab732 | ||
| 
						 | 
					de36b26d5e | ||
| 
						 | 
					ae7cbd910a | ||
| 
						 | 
					92b274a7de | ||
| 
						 | 
					b3d47d5861 | ||
| 
						 | 
					f5ba232fb4 | ||
| 
						 | 
					7e9861da0e | ||
| 
						 | 
					6241f17e95 | ||
| 
						 | 
					6cecc7b4a6 | ||
| 
						 | 
					82d3918d7a | ||
| 
						 | 
					ee1a698451 | ||
| 
						 | 
					2486eb4989 | ||
| 
						 | 
					0813a80223 | ||
| 
						 | 
					3969cb2a85 | ||
| 
						 | 
					b5917a817c | ||
| 
						 | 
					9e196a71ad | ||
| 
						 | 
					ca7d67021e | ||
| 
						 | 
					8c82637e76 | ||
| 
						 | 
					8d63719418 | ||
| 
						 | 
					3967077da3 | ||
| 
						 | 
					f971c4c0b5 | ||
| 
						 | 
					9d0dce35c3 | ||
| 
						 | 
					441272ff97 | ||
| 
						 | 
					fd6bbfbe07 | ||
| 
						 | 
					a6549a2b0f | ||
| 
						 | 
					1f5072421e | ||
| 
						 | 
					4943ddcb1c | ||
| 
						 | 
					be5de328e9 | ||
| 
						 | 
					37af1693b4 | ||
| 
						 | 
					9127684553 | ||
| 
						 | 
					0571a7e05b | ||
| 
						 | 
					300c03203d | ||
| 
						 | 
					f9162438bc | ||
| 
						 | 
					533813dda0 | ||
| 
						 | 
					6ac182c9ca | ||
| 
						 | 
					09327f429f | ||
| 
						 | 
					8104618d10 | ||
| 
						 | 
					eb11953dd2 | ||
| 
						 | 
					b264931034 | ||
| 
						 | 
					76d3fceb58 | ||
| 
						 | 
					65be94a34a | ||
| 
						 | 
					c75352af3d | ||
| 
						 | 
					b27a9003bb | ||
| 
						 | 
					9fa54a8e80 | ||
| 
						 | 
					7a1e4ef606 | ||
| 
						 | 
					0dc9431bdb | ||
| 
						 | 
					0fa164dff2 | ||
| 
						 | 
					582c8e9868 | ||
| 
						 | 
					de6323ba51 | ||
| 
						 | 
					3272261479 | ||
| 
						 | 
					3247184d86 | ||
| 
						 | 
					32c506a4c8 | ||
| 
						 | 
					04db6c3d39 | ||
| 
						 | 
					3c602e7422 | ||
| 
						 | 
					e4146c0945 | ||
| 
						 | 
					9e3fc7f3f5 | ||
| 
						 | 
					06d6701785 | ||
| 
						 | 
					297720787f | ||
| 
						 | 
					47c3b28459 | ||
| 
						 | 
					f18763bcd8 | ||
| 
						 | 
					dd2b4a067a | ||
| 
						 | 
					44e4c21f05 | ||
| 
						 | 
					bc581530e5 | ||
| 
						 | 
					04afaa3c03 | ||
| 
						 | 
					a21a2c3e32 | ||
| 
						 | 
					a5509d6819 | ||
| 
						 | 
					0c866e1a31 | ||
| 
						 | 
					1c7d3165e4 | ||
| 
						 | 
					8199dee8d6 | ||
| 
						 | 
					a5ad5ba971 | ||
| 
						 | 
					79d6f10926 | ||
| 
						 | 
					5396bf1851 | ||
| 
						 | 
					6913f1deb6 | ||
| 
						 | 
					09c8c8ed9f | ||
| 
						 | 
					d9dc5dc423 | ||
| 
						 | 
					8c55f1e50d | ||
| 
						 | 
					94661b1d22 | ||
| 
						 | 
					b9cc589882 | ||
| 
						 | 
					0baa57a880 | ||
| 
						 | 
					f5e7e76852 | ||
| 
						 | 
					5021c119c7 | ||
| 
						 | 
					29a1ad3d18 | ||
| 
						 | 
					659f7c2bc8 | ||
| 
						 | 
					497ff7ee41 | ||
| 
						 | 
					0fcc6251fc | ||
| 
						 | 
					7da8394a8e | ||
| 
						 | 
					0ff23f20e8 | ||
| 
						 | 
					cea71369e9 | ||
| 
						 | 
					fb4aa20d05 | ||
| 
						 | 
					5a8344a3d1 | ||
| 
						 | 
					2d2751c433 | ||
| 
						 | 
					6be8a0679b | ||
| 
						 | 
					58e04035ed | ||
| 
						 | 
					ab9cf25197 | ||
| 
						 | 
					7ea5c614d9 | ||
| 
						 | 
					5d441dd376 | ||
| 
						 | 
					44019f6542 | ||
| 
						 | 
					de5cee2c21 | ||
| 
						 | 
					3ad501218d | ||
| 
						 | 
					43a155a313 | ||
| 
						 | 
					fb00b10669 | ||
| 
						 | 
					8b4fc05ff2 | ||
| 
						 | 
					ced60319e3 | ||
| 
						 | 
					cacea4e7f3 | ||
| 
						 | 
					ce4c9b5397 | ||
| 
						 | 
					426b94bd69 | ||
| 
						 | 
					06b8084b2c | ||
| 
						 | 
					e3d0fe06bd | ||
| 
						 | 
					319f5003c6 | ||
| 
						 | 
					30a565f80d | ||
| 
						 | 
					6e2fbf6a0f | ||
| 
						 | 
					2990e5a2e3 | ||
| 
						 | 
					85c90f9a1d | ||
| 
						 | 
					c529a57650 | ||
| 
						 | 
					9c0edc5c52 | ||
| 
						 | 
					d729f9d0f2 | ||
| 
						 | 
					fdc8849e56 | ||
| 
						 | 
					30a56cdb46 | ||
| 
						 | 
					14625346c0 | ||
| 
						 | 
					c3be42006b | ||
| 
						 | 
					6fcc55cef8 | ||
| 
						 | 
					380752f4e0 | ||
| 
						 | 
					e7649f117a | ||
| 
						 | 
					66f4305e1c | ||
| 
						 | 
					4255ba175b | ||
| 
						 | 
					d02d3af02e | ||
| 
						 | 
					61e05331d1 | ||
| 
						 | 
					f2e404ab66 | ||
| 
						 | 
					adde73141f | ||
| 
						 | 
					84aa4ba818 | ||
| 
						 | 
					982ac38f35 | ||
| 
						 | 
					cd52fecc4e | ||
| 
						 | 
					dbfcf23273 | ||
| 
						 | 
					f583030e3c | ||
| 
						 | 
					1771a83b92 | ||
| 
						 | 
					e873ef2ba7 | ||
| 
						 | 
					26edfe369c | ||
| 
						 | 
					34b7632d1d | ||
| 
						 | 
					fb8db18d79 | ||
| 
						 | 
					6d5a2d5f9e | ||
| 
						 | 
					810f2e55fb | ||
| 
						 | 
					372745844b | ||
| 
						 | 
					191ea10f86 | ||
| 
						 | 
					0d6ae379f4 | ||
| 
						 | 
					2471d741f7 | ||
| 
						 | 
					759f4ca4f2 | ||
| 
						 | 
					6c8e8e2a96 | ||
| 
						 | 
					29da0c8bf0 | ||
| 
						 | 
					49e99a7393 | ||
| 
						 | 
					8dcb7554ee | ||
| 
						 | 
					b754a27f62 | ||
| 
						 | 
					ec65f181ea | ||
| 
						 | 
					b12cb2f507 | ||
| 
						 | 
					1875db4ff6 | ||
| 
						 | 
					26ceddae5e | ||
| 
						 | 
					20f612080c | ||
| 
						 | 
					5615325a84 | ||
| 
						 | 
					537171eac2 | ||
| 
						 | 
					415f480410 | ||
| 
						 | 
					acf77b73af | ||
| 
						 | 
					9a01f68515 | ||
| 
						 | 
					7b1c1e1623 | ||
| 
						 | 
					8bb4b759eb | ||
| 
						 | 
					e5eb062f05 | ||
| 
						 | 
					f6dc3d5ae9 | ||
| 
						 | 
					3e2001f6a2 | ||
| 
						 | 
					ed4605bf9f | ||
| 
						 | 
					461c69acdb | ||
| 
						 | 
					879e1acd5d | ||
| 
						 | 
					06f6ce408c | ||
| 
						 | 
					ac2391e0cb | ||
| 
						 | 
					ce9994f7ca | ||
| 
						 | 
					a38a5071f3 | ||
| 
						 | 
					2569eb644e | ||
| 
						 | 
					dd45506a40 | ||
| 
						 | 
					46b96eb80d | ||
| 
						 | 
					e574b5d441 | ||
| 
						 | 
					5e01051c4e | ||
| 
						 | 
					8ea1190486 | ||
| 
						 | 
					a1c655949f | ||
| 
						 | 
					325a7bf206 | ||
| 
						 | 
					5adb3930c7 | ||
| 
						 | 
					b628481701 | ||
| 
						 | 
					ab01a74405 | ||
| 
						 | 
					695f3886fb | ||
| 
						 | 
					d8e739e19a | ||
| 
						 | 
					3baca9a35c | 
							
								
								
									
										11
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								Makefile
									
									
									
									
									
								
							@@ -4,7 +4,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
include Makefile.inc
 | 
					include Makefile.inc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SUBDIR=		conf.d doc etc init.d local.d man net scripts sh src
 | 
					SUBDIR=		conf.d etc init.d local.d man scripts sh src sysctl.d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Build our old net foo or not
 | 
				
			||||||
 | 
					ifeq (${MKNET},oldnet)
 | 
				
			||||||
 | 
					SUBDIR+=	net doc
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Build pkgconfig or not
 | 
					# Build pkgconfig or not
 | 
				
			||||||
MKPKGCONFIG?=	yes
 | 
					MKPKGCONFIG?=	yes
 | 
				
			||||||
@@ -25,6 +30,10 @@ include ${MK}/dist.mk
 | 
				
			|||||||
include ${MK}/git.mk
 | 
					include ${MK}/git.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_installafter:
 | 
					_installafter:
 | 
				
			||||||
 | 
					ifeq (${MKPREFIX},yes)
 | 
				
			||||||
	${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/init.d
 | 
						${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/init.d
 | 
				
			||||||
 | 
					else ifneq (${OS},Linux)
 | 
				
			||||||
 | 
						${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/init.d
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
	${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/tmp
 | 
						${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/tmp
 | 
				
			||||||
	${ECHO} "${VERSION}${GITVER}" > ${DESTDIR}/${LIBEXECDIR}/version
 | 
						${ECHO} "${VERSION}${GITVER}" > ${DESTDIR}/${LIBEXECDIR}/version
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,3 @@
 | 
				
			|||||||
NAME=		openrc
 | 
					NAME=		openrc
 | 
				
			||||||
VERSION=	0.9.6
 | 
					VERSION=	0.11.8
 | 
				
			||||||
PKG=		${NAME}-${VERSION}
 | 
					PKG=		${NAME}-${VERSION}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								README
									
									
									
									
									
								
							@@ -10,9 +10,10 @@ You may wish to tweak the installation with the below arguments
 | 
				
			|||||||
PROGLDFLAGS=-static
 | 
					PROGLDFLAGS=-static
 | 
				
			||||||
LIBNAME=lib64
 | 
					LIBNAME=lib64
 | 
				
			||||||
DESTDIR=/tmp/openrc-image
 | 
					DESTDIR=/tmp/openrc-image
 | 
				
			||||||
 | 
					MKNET=oldnet
 | 
				
			||||||
MKPAM=pam
 | 
					MKPAM=pam
 | 
				
			||||||
 | 
					MKPREFIX=yes
 | 
				
			||||||
MKPKGCONFIG=no
 | 
					MKPKGCONFIG=no
 | 
				
			||||||
MKRCSYS=prefix
 | 
					 | 
				
			||||||
MKSELINUX=yes
 | 
					MKSELINUX=yes
 | 
				
			||||||
MKSTATICLIBS=no
 | 
					MKSTATICLIBS=no
 | 
				
			||||||
MKTERMCAP=ncurses
 | 
					MKTERMCAP=ncurses
 | 
				
			||||||
@@ -25,6 +26,8 @@ We don't support building a static OpenRC with PAM.
 | 
				
			|||||||
You may need to use PROGLDFLAGS=-Wl,-Bstatic on glibc instead of just -static.
 | 
					You may need to use PROGLDFLAGS=-Wl,-Bstatic on glibc instead of just -static.
 | 
				
			||||||
If you debug memory under valgrind, add -DDEBUG_MEMORY to your CPPFLAGS
 | 
					If you debug memory under valgrind, add -DDEBUG_MEMORY to your CPPFLAGS
 | 
				
			||||||
so that all malloc memory should be freed at exit.
 | 
					so that all malloc memory should be freed at exit.
 | 
				
			||||||
 | 
					If you are building OpenRC for a Gentoo Prefix installation, add
 | 
				
			||||||
 | 
					MKPREFIX=yes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You can also brand OpenRC if you so wish like so
 | 
					You can also brand OpenRC if you so wish like so
 | 
				
			||||||
BRANDING=\"Gentoo/$(uname -s)\"
 | 
					BRANDING=\"Gentoo/$(uname -s)\"
 | 
				
			||||||
@@ -34,20 +37,6 @@ LOCAL_PREFIX should be set when to where user maintained packages are.
 | 
				
			|||||||
Only set LOCAL_PREFIX if different from PKG_PREFIX.
 | 
					Only set LOCAL_PREFIX if different from PKG_PREFIX.
 | 
				
			||||||
PREFIX should be set when OpenRC is not installed to /.
 | 
					PREFIX should be set when OpenRC is not installed to /.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MKRCSYS should be set only if you need to specify a default system
 | 
					 | 
				
			||||||
subtype. The subtype should be set to match the type of environment the
 | 
					 | 
				
			||||||
file is installed into, not the virtualization the environment is
 | 
					 | 
				
			||||||
capable of handling. Here is a list of subtypes and their meanings.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
jail	FreeBSD jail
 | 
					 | 
				
			||||||
lxc	Linux container
 | 
					 | 
				
			||||||
openvz	Linux OpenVZ
 | 
					 | 
				
			||||||
prefix	Linux and *BSD prefix system
 | 
					 | 
				
			||||||
uml	UsermodeLinux
 | 
					 | 
				
			||||||
vserver	Linux vserver
 | 
					 | 
				
			||||||
xen0 Linux and NetBSD xen0 Domain
 | 
					 | 
				
			||||||
xenU Linux and NetBSD xenU Domain
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
If any of the following files exist then we do not overwrite them
 | 
					If any of the following files exist then we do not overwrite them
 | 
				
			||||||
/etc/devd.conf
 | 
					/etc/devd.conf
 | 
				
			||||||
/etc/rc
 | 
					/etc/rc
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										40
									
								
								README.newnet
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								README.newnet
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					The following applies only to the newnet stack, which is not presently
 | 
				
			||||||
 | 
					maintained in OpenRC. The oldnet stack is maintained instead.
 | 
				
			||||||
 | 
					- Robin H. Johnson <robbat2@gentoo.org>, 2011/02/21
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OpenRC Network Ideals
 | 
				
			||||||
 | 
					---------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The new style networking for OpenRC is very simplistic - provide a basic means
 | 
				
			||||||
 | 
					of configuring static interface address and routes whilst allowing the
 | 
				
			||||||
 | 
					possibility to run any command at any point.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In a nutshell, init.d/network is a wrapper around ifconfig(8) and
 | 
				
			||||||
 | 
					init.d/staticroute is wrapper around route(8).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In the Perfect World (TM) ifconfig should be able to configure everything
 | 
				
			||||||
 | 
					about the interface easily * . The BSD family almost get this right and Linux
 | 
				
			||||||
 | 
					epically fails.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Only static configuration, including link setup.
 | 
				
			||||||
 | 
					For dynamic, static, IPv4LL, arping and per ssid IPv4 setup dhcpcd-5.x
 | 
				
			||||||
 | 
					provides your needs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It fails because there are many tools to do the same job and often have
 | 
				
			||||||
 | 
					vastly different syntax where they could be similar. In other words, there
 | 
				
			||||||
 | 
					is no coherence.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OpenRC-0.4.x and older (inc Gentoo baselayout-1) had a collection of scripts
 | 
				
			||||||
 | 
					for each tool and allowed a script per interface. Over the years, this design
 | 
				
			||||||
 | 
					has proven very hard to maintain as each user has their own idea of how
 | 
				
			||||||
 | 
					things should work. Also, there were (and still are) race conditions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So where do we go from here?
 | 
				
			||||||
 | 
					Well, it's possible to use the new network scripts using the tools
 | 
				
			||||||
 | 
					currently available. It's just harder as you have to know them and their
 | 
				
			||||||
 | 
					documentation can be lacking at times.
 | 
				
			||||||
 | 
					The correct end goal is a BSD style ifconfig tool.
 | 
				
			||||||
 | 
					I've started work on it, but the project has stalled somewhat.
 | 
				
			||||||
 | 
					It's display only right now and the source is not yet publicly available.
 | 
				
			||||||
 | 
					If you have the skills and share the vision then contact me privately and
 | 
				
			||||||
 | 
					we'll take it from there.
 | 
				
			||||||
							
								
								
									
										14
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								TODO
									
									
									
									
									
								
							@@ -5,3 +5,17 @@
 | 
				
			|||||||
- oldnet[bridging]: Review setting of bridge configuration on dynamic interface add
 | 
					- oldnet[bridging]: Review setting of bridge configuration on dynamic interface add
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Document rc-depend binary.
 | 
					- Document rc-depend binary.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- _ifindex is not a reliable means of calculating metrics:
 | 
				
			||||||
 | 
						_ifindex is used for calculating metrics for new devices but has a major
 | 
				
			||||||
 | 
						problem: Since it's only the nth entry in /proc/net/dev
 | 
				
			||||||
 | 
						And devices may be removed from that file, and reordered, you won't always
 | 
				
			||||||
 | 
						get the same result.
 | 
				
			||||||
 | 
						If you do:
 | 
				
			||||||
 | 
						- add eth0 - _ifindex (eth0=0)
 | 
				
			||||||
 | 
						- add vlan1 - _ifindex (eth0=0,vlan1=1)
 | 
				
			||||||
 | 
						- add vlan2 - _ifindex (eth0=0,vlan1=1,vlan2=2)
 | 
				
			||||||
 | 
						- rem vlan1 - _ifindex (eth0=0,vlan2=1)
 | 
				
			||||||
 | 
						- add vlan3 - _ifindex (eth0=0,vlan2=1,vlan3=2)
 | 
				
			||||||
 | 
						Now your routing table has entries for both vlan2 and vlan3 with a metric of 2.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,12 @@
 | 
				
			|||||||
DIR=	${CONFDIR}
 | 
					DIR=	${CONFDIR}
 | 
				
			||||||
CONF=	bootmisc fsck hostname localmount network staticroute urandom \
 | 
					CONF=	bootmisc fsck hostname localmount netmount urandom tmpfiles \
 | 
				
			||||||
		${CONF-${OS}}
 | 
							${CONF-${OS}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq (${MKNET},)
 | 
				
			||||||
 | 
					CONF+= network staticroute
 | 
				
			||||||
TARGETS+=	network staticroute
 | 
					TARGETS+=	network staticroute
 | 
				
			||||||
CLEANFILES+=	network staticroute
 | 
					CLEANFILES+=	network staticroute
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MK=	../mk
 | 
					MK=	../mk
 | 
				
			||||||
include ${MK}/os.mk
 | 
					include ${MK}/os.mk
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,10 @@
 | 
				
			|||||||
 | 
					# The consolefont service is not activated by default. If you need to
 | 
				
			||||||
 | 
					# use it, you should run "rc-update add consolefont boot" as root.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
# consolefont specifies the default font that you'd like Linux to use on the
 | 
					# consolefont specifies the default font that you'd like Linux to use on the
 | 
				
			||||||
# console.  You can find a good selection of fonts in /usr/share/consolefonts;
 | 
					# console.  You can find a good selection of fonts in /usr/share/consolefonts;
 | 
				
			||||||
# you shouldn't specify the trailing ".psf.gz", just the font name below.
 | 
					# you shouldn't specify the trailing ".psf.gz", just the font name below.
 | 
				
			||||||
# To use the default console font, comment out the CONSOLEFONT setting below.
 | 
					# To use the default console font, comment out the CONSOLEFONT setting below.
 | 
				
			||||||
# This setting is used by the /etc/init.d/consolefont script (NOTE: if you do
 | 
					 | 
				
			||||||
# not want to use it, run "rc-update del consolefont boot" as root).
 | 
					 | 
				
			||||||
consolefont="default8x16"
 | 
					consolefont="default8x16"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# consoletranslation is the charset map file to use.  Leave commented to use
 | 
					# consoletranslation is the charset map file to use.  Leave commented to use
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,3 @@
 | 
				
			|||||||
# Sets the level at which logging of messages is done to the
 | 
					# Sets the level at which logging of messages is done to the
 | 
				
			||||||
# console.  See dmesg(8) for more info.
 | 
					# console.  See dmesg(1) for more info.
 | 
				
			||||||
dmesg_level="1"
 | 
					dmesg_level="1"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,18 +4,16 @@
 | 
				
			|||||||
# you should set it to "local".
 | 
					# you should set it to "local".
 | 
				
			||||||
clock="UTC"
 | 
					clock="UTC"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# If you want to set the Hardware Clock to the current System Time 
 | 
					# If you want the hwclock script to set the system time (software clock)
 | 
				
			||||||
# (software clock) during shutdown, then say "YES" here.
 | 
					# to match the current hardware clock during bootup, leave this
 | 
				
			||||||
# You normally don't need to do this if you run a ntp daemon.
 | 
					# commented out.
 | 
				
			||||||
clock_systohc="NO"
 | 
					# However, you can set this to "NO" ifyou are running a modern kernel
 | 
				
			||||||
 | 
					# with CONFIG_RTC_HCTOSYS set to y and your hardware clock set to UTC.
 | 
				
			||||||
 | 
					#clock_hctosys="YES"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# If you want to set the system time to the current hardware clock
 | 
					# If you do not want to set the hardware clock to the current system
 | 
				
			||||||
# during bootup, then say "YES" here. You do not need this if you are
 | 
					# time (software clock) during shutdown, set this to no.
 | 
				
			||||||
# running a modern kernel with CONFIG_RTC_HCTOSYS set to y.
 | 
					#clock_systohc="YES"
 | 
				
			||||||
# Also, be aware that if you set this to "NO", the system time will
 | 
					 | 
				
			||||||
# never be saved to the hardware clock unless you set
 | 
					 | 
				
			||||||
# clock_systohc="YES" above.
 | 
					 | 
				
			||||||
clock_hctosys="YES"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# If you wish to pass any other arguments to hwclock during bootup,
 | 
					# If you wish to pass any other arguments to hwclock during bootup,
 | 
				
			||||||
# you may do so here. Alpha users may wish to use --arc or --srm here.
 | 
					# you may do so here. Alpha users may wish to use --arc or --srm here.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										40
									
								
								conf.d/netmount
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								conf.d/netmount
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					# You will need to set the dependencies in the netmount script to match
 | 
				
			||||||
 | 
					# the network configuration tools you are using. This should be done in
 | 
				
			||||||
 | 
					# this file by following the examples below, and not by changing the
 | 
				
			||||||
 | 
					# service script itself.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Each of these examples is meant to be used separately. So, for
 | 
				
			||||||
 | 
					# example, do not set rc_need to something like "net.eth0 dhcpcd".
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# If you are using newnet and configuring your interfaces with static
 | 
				
			||||||
 | 
					# addresses with the network script, you  should use this setting.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#rc_need="network"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# If you are using oldnet, you must list the specific net.* services you
 | 
				
			||||||
 | 
					# need.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This example assumes all of your netmounts can be reached on
 | 
				
			||||||
 | 
					# eth0.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#rc_need="net.eth0"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This example assumes some of your netmounts are on eth1 and some
 | 
				
			||||||
 | 
					# are on eth2.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#rc_need="net.eth1 net.eth2"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# If you are using a dynamic network management tool like
 | 
				
			||||||
 | 
					# networkmanager, dhcpcd in standalone mode, wicd, badvpn-ncd, etc, to
 | 
				
			||||||
 | 
					# manage the network interfaces with the routes to your netmounts, you
 | 
				
			||||||
 | 
					# should list that tool.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#rc_need="networkmanager"
 | 
				
			||||||
 | 
					#rc_need="dhcpcd"
 | 
				
			||||||
 | 
					#rc_need="wicd"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# The default setting is designed to be backward compatible with our
 | 
				
			||||||
 | 
					# current setup, but you are highly discouraged from using this. In
 | 
				
			||||||
 | 
					# other words, please change it to be more suited to your system.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					rc_need="net"
 | 
				
			||||||
							
								
								
									
										3
									
								
								conf.d/tmpfiles
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								conf.d/tmpfiles
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					# Extra options for tmpfiles.sh
 | 
				
			||||||
 | 
					#tmpfiles_opts="--verbose"
 | 
				
			||||||
 | 
					tmpfiles_opts=""
 | 
				
			||||||
@@ -2,4 +2,4 @@
 | 
				
			|||||||
# (say for crypt swap), so you will need to customize this
 | 
					# (say for crypt swap), so you will need to customize this
 | 
				
			||||||
# behavior.  If you have /var on a separate partition, then
 | 
					# behavior.  If you have /var on a separate partition, then
 | 
				
			||||||
# make sure this path lives on your root device somewhere.
 | 
					# make sure this path lives on your root device somewhere.
 | 
				
			||||||
urandom_seed="/var/run/random-seed"
 | 
					urandom_seed="/var/lib/misc/random-seed"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -80,9 +80,9 @@
 | 
				
			|||||||
# Most drivers that report carrier status function correctly, but some do not
 | 
					# Most drivers that report carrier status function correctly, but some do not
 | 
				
			||||||
# One of these faulty drivers is for the Intel e1000 network card, but only
 | 
					# One of these faulty drivers is for the Intel e1000 network card, but only
 | 
				
			||||||
# at boot time. To get around this you may alter the carrier_timeout value for
 | 
					# at boot time. To get around this you may alter the carrier_timeout value for
 | 
				
			||||||
# the interface. -1 is disable, 0 is infinite and any other number of seconds
 | 
					# the interface. 0 is disable and any other number of seconds is how
 | 
				
			||||||
# is how long we wait for carrier. The current default is 3 seconds
 | 
					# long we wait for carrier. The current default is disabled.
 | 
				
			||||||
#carrier_timeout_eth0=-1
 | 
					#carrier_timeout_eth0=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# You may wish to disable the interface being brought down when stopping.
 | 
					# You may wish to disable the interface being brought down when stopping.
 | 
				
			||||||
# This is only of use for WakeOnLan.
 | 
					# This is only of use for WakeOnLan.
 | 
				
			||||||
@@ -388,6 +388,17 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# ${IFACE} is set to the interface being brought up/down
 | 
					# ${IFACE} is set to the interface being brought up/down
 | 
				
			||||||
# ${IFVAR} is ${IFACE} converted to variable name bash allows
 | 
					# ${IFVAR} is ${IFACE} converted to variable name bash allows
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# For historical and compatibility reasons, preup is actually normally called
 | 
				
			||||||
 | 
					# in the following sequence: up ; preup ; up.
 | 
				
			||||||
 | 
					# The first up causes the kernel to initialize the device, so
 | 
				
			||||||
 | 
					# that it is available for use in the preup function.  However, for some
 | 
				
			||||||
 | 
					# hardware, e.g. CAN devices, some configuration is needed before trying to up
 | 
				
			||||||
 | 
					# the interface will actually work. For such hardware, the
 | 
				
			||||||
 | 
					# up_before_preup variables will allow skipping the first up call if set
 | 
				
			||||||
 | 
					# to yes.
 | 
				
			||||||
 | 
					#up_before_preup_IFVAR="NO"
 | 
				
			||||||
 | 
					#up_before_preup="NO"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#preup() {
 | 
					#preup() {
 | 
				
			||||||
#	# Remember to return 0 on success
 | 
					#	# Remember to return 0 on success
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,7 +34,7 @@
 | 
				
			|||||||
# In other words, you probably should DO NOTHING HERE...
 | 
					# In other words, you probably should DO NOTHING HERE...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Prefer ifconfig over iproute2
 | 
					# Prefer ifconfig over iproute2
 | 
				
			||||||
#modules="ifconfig"
 | 
					#modules="!iproute2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# You can also specify other modules for an interface
 | 
					# You can also specify other modules for an interface
 | 
				
			||||||
# In this case we prefer udhcpc over dhcpcd
 | 
					# In this case we prefer udhcpc over dhcpcd
 | 
				
			||||||
@@ -57,7 +57,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# If you don't specify an interface then we prefer iproute2 if it's installed
 | 
					# If you don't specify an interface then we prefer iproute2 if it's installed
 | 
				
			||||||
# To prefer ifconfig over iproute2
 | 
					# To prefer ifconfig over iproute2
 | 
				
			||||||
#modules="ifconfig"
 | 
					#modules="!iproute2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# For a static configuration, use something like this
 | 
					# For a static configuration, use something like this
 | 
				
			||||||
# (They all do exactly the same thing btw)
 | 
					# (They all do exactly the same thing btw)
 | 
				
			||||||
@@ -68,6 +68,7 @@
 | 
				
			|||||||
# NOTE: ifconfig creates an aliased device for each extra IPv4 address
 | 
					# NOTE: ifconfig creates an aliased device for each extra IPv4 address
 | 
				
			||||||
#       (eth0:1, eth0:2, etc)
 | 
					#       (eth0:1, eth0:2, etc)
 | 
				
			||||||
#       iproute2 does not do this as there is no need to
 | 
					#       iproute2 does not do this as there is no need to
 | 
				
			||||||
 | 
					# WARNING: You cannot mix multiple addresses on a line with other parameters!
 | 
				
			||||||
#config_eth0="192.168.0.2/24 192.168.0.3/24 192.168.0.4/24"
 | 
					#config_eth0="192.168.0.2/24 192.168.0.3/24 192.168.0.4/24"
 | 
				
			||||||
# However, that only works with CIDR addresses, so you can't use netmask.
 | 
					# However, that only works with CIDR addresses, so you can't use netmask.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -85,6 +86,14 @@
 | 
				
			|||||||
# If you don't want ANY address (only useful when calling for advanced stuff)
 | 
					# If you don't want ANY address (only useful when calling for advanced stuff)
 | 
				
			||||||
#config_eth0="null"
 | 
					#config_eth0="null"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# If you need to pass parameters to go with an address, you can do so on the
 | 
				
			||||||
 | 
					# same line as the address. You should split multiple addresses with newlines.
 | 
				
			||||||
 | 
					# WARNING: You cannot mix multiple addresses on a line with other parameters!
 | 
				
			||||||
 | 
					#config_eth0="192.168.0.2/24 scope host"
 | 
				
			||||||
 | 
					#config_eth0="4321:0:1:2:3:4:567:89ab/64 nodad home preferred_lft 0"
 | 
				
			||||||
 | 
					#config_eth0="192.168.0.2/24 scope host
 | 
				
			||||||
 | 
					#4321:0:1:2:3:4:567:89ab/64 nodad home preferred_lft 0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Here's how to do routing if you need it
 | 
					# Here's how to do routing if you need it
 | 
				
			||||||
# We add an IPv4 default route, IPv4 subnet route and an IPv6 unicast route
 | 
					# We add an IPv4 default route, IPv4 subnet route and an IPv6 unicast route
 | 
				
			||||||
#routes_eth0="default via 192.168.0.1
 | 
					#routes_eth0="default via 192.168.0.1
 | 
				
			||||||
@@ -117,6 +126,13 @@
 | 
				
			|||||||
# tables you may have to set a global metric as the due to a simple read of
 | 
					# tables you may have to set a global metric as the due to a simple read of
 | 
				
			||||||
# the routing table taking over a minute at a time.
 | 
					# the routing table taking over a minute at a time.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Most drivers that report carrier status function correctly, but some do not
 | 
				
			||||||
 | 
					# One of these faulty drivers is for the Intel e1000 network card, but only
 | 
				
			||||||
 | 
					# at boot time. To get around this you may alter the carrier_timeout value for
 | 
				
			||||||
 | 
					# the interface. 0 is disable and any other number of seconds is how
 | 
				
			||||||
 | 
					# long we wait for carrier. The current default is disabled.
 | 
				
			||||||
 | 
					#carrier_timeout_eth0=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# You may wish to disable the interface being brought down when stopping.
 | 
					# You may wish to disable the interface being brought down when stopping.
 | 
				
			||||||
# This is only of use for WakeOnLan.
 | 
					# This is only of use for WakeOnLan.
 | 
				
			||||||
#ifdown_eth0="NO"
 | 
					#ifdown_eth0="NO"
 | 
				
			||||||
@@ -543,26 +559,34 @@
 | 
				
			|||||||
# You can also configure the VLAN - see for ip man page for more details
 | 
					# You can also configure the VLAN - see for ip man page for more details
 | 
				
			||||||
# To change the vlan interface name. If not set, the standard "iface.vlanid"
 | 
					# To change the vlan interface name. If not set, the standard "iface.vlanid"
 | 
				
			||||||
# will be used. This is the replacement for the old 'vconfig set_name_type'
 | 
					# will be used. This is the replacement for the old 'vconfig set_name_type'
 | 
				
			||||||
# functionality.
 | 
					# functionality. If you previously relied on the DEV_PLUS_VID or
 | 
				
			||||||
 | 
					# DEV_PLUS_VID_NO_PAD options to have different VLANs with same ID value, on
 | 
				
			||||||
 | 
					# different interfaces, please note that you need to use both the interface and
 | 
				
			||||||
 | 
					# vlan number in the numbering. This applies for all of the options: name,
 | 
				
			||||||
 | 
					# txqueuelen, mac, broadcast, mtu, ingress, egress, flags
 | 
				
			||||||
#vlan1_name="vlan1"
 | 
					#vlan1_name="vlan1"
 | 
				
			||||||
#vlan2_name="eth0.2"
 | 
					#eth0_vlan2_name="eth0.2"
 | 
				
			||||||
 | 
					#eth1_vlan2_name="eth1.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# The following shows the old set_name_type setting and what new option to set:
 | 
					# The following shows the old set_name_type setting and what new option to set:
 | 
				
			||||||
# Using eth9 & VLAN VID 26 as an example.
 | 
					# Using eth9 & VLAN VID 26 as an example.
 | 
				
			||||||
# VLAN_PLUS_VID         vlan26_name="vlan0026"
 | 
					# VLAN_PLUS_VID         vlan26_name="vlan0026"
 | 
				
			||||||
# VLAN_PLUS_VID_NO_PAD  vlan26_name="vlan26"
 | 
					# VLAN_PLUS_VID_NO_PAD  vlan26_name="vlan26"
 | 
				
			||||||
# DEV_PLUS_VID          vlan26_name="eth9.0026"
 | 
					# DEV_PLUS_VID          eth9_vlan26_name="eth9.0026"
 | 
				
			||||||
# DEV_PLUS_VID_NO_PAD   vlan26_name="eth9.26"
 | 
					# DEV_PLUS_VID_NO_PAD   eth9_vlan26_name="eth9.26"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Set the vlan flags
 | 
					# Set the vlan flags
 | 
				
			||||||
#vlan1_flags="reorder_hdr off gvrp on loose_binding on"
 | 
					#vlan1_flags="reorder_hdr off gvrp on loose_binding on"
 | 
				
			||||||
 | 
					#eth0_vlan1_flags="reorder_hdr off gvrp on loose_binding on"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Configure in/egress maps
 | 
					# Configure in/egress maps
 | 
				
			||||||
#vlan1_ingress="2:6 3:5"
 | 
					#vlan1_ingress="2:6 3:5"
 | 
				
			||||||
#vlan1_egress="1:2"
 | 
					#eth0_vlan1_egress="1:2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#config_vlan1="172.16.3.1/23"
 | 
					#config_vlan1="172.16.2.1/24"
 | 
				
			||||||
#config_vlan2="172.16.2.1/23"
 | 
					#config_vlan2="172.16.3.1/24"
 | 
				
			||||||
 | 
					#config_eth0_1="172.16.4.1/24"
 | 
				
			||||||
 | 
					#config_eth1_1="172.16.5.1/24"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# NOTE: Vlans can be configured with a . in their interface names
 | 
					# NOTE: Vlans can be configured with a . in their interface names
 | 
				
			||||||
# When configuring vlans with this name type, you need to replace . with a _
 | 
					# When configuring vlans with this name type, you need to replace . with a _
 | 
				
			||||||
@@ -577,10 +601,15 @@
 | 
				
			|||||||
#vlan_start_eth0="no"
 | 
					#vlan_start_eth0="no"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# If you do the above then you may want to depend on eth0 like so
 | 
					# If you do the above then you may want to depend on eth0 like so
 | 
				
			||||||
# rc_need_vlan1="net.eth0"
 | 
					# rc_net_vlan1_need="net.eth0"
 | 
				
			||||||
# NOTE: depend functions only work in /etc/conf.d/net
 | 
					# NOTE: depend functions only work in /etc/conf.d/net
 | 
				
			||||||
# and not in profile configs such as /etc/conf.d/net.foo
 | 
					# and not in profile configs such as /etc/conf.d/net.foo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Also, you might want to make eth0 not provide net in this case so that
 | 
				
			||||||
 | 
					# dependent services will start when the vlan is active instead of the
 | 
				
			||||||
 | 
					# physical interface.
 | 
				
			||||||
 | 
					# rc_net_eth0_provide="!net"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# MAC-VLAN support
 | 
					# MAC-VLAN support
 | 
				
			||||||
# The following configuration can be used to create a new interface 'macvlan0'
 | 
					# The following configuration can be used to create a new interface 'macvlan0'
 | 
				
			||||||
# linked to 'eth0'
 | 
					# linked to 'eth0'
 | 
				
			||||||
@@ -602,15 +631,39 @@
 | 
				
			|||||||
#slaves_bond0="eth0 eth1 eth2"
 | 
					#slaves_bond0="eth0 eth1 eth2"
 | 
				
			||||||
#config_bond0="null" # You may not want to assign an IP the the bond
 | 
					#config_bond0="null" # You may not want to assign an IP the the bond
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# You can also configure the bond here, which must be done via sysfs on 2.6
 | 
					# Please note, that you should generally NOT try to change the MAC addresses of
 | 
				
			||||||
# kernels or newer. See the kernel bonding documentation for a description of
 | 
					# a bond interface yourself. If you do so, the kernel and your network switches
 | 
				
			||||||
# these options.
 | 
					# may not work quite right. It is permissible to set the MAC addresses of bond
 | 
				
			||||||
 | 
					# slaves BEFORE the bond comes up, but not after the bond is up (it will change
 | 
				
			||||||
 | 
					# MAC addresses of the slaves on it's own).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# You can also configure the parameters of the bond here, which must be done
 | 
				
			||||||
 | 
					# via sysfs on 2.6 kernels or newer. The description of all the options can be
 | 
				
			||||||
 | 
					# found in the kernel: /usr/src/linux-*/Documentation/networking/bonding.txt
 | 
				
			||||||
 | 
					# You will probably want the 'mode' option at the least.
 | 
				
			||||||
 | 
					# Some possible parameters: mode fail_over_mac arp_validate arp_interval
 | 
				
			||||||
 | 
					# arp_ip_target downdelay updelay lacp_rate ad_select xmit_hash_policy
 | 
				
			||||||
 | 
					# num_grat_arp num_unsol_na miimon primary primary_reselect use_carrier
 | 
				
			||||||
 | 
					# active_slave queue_id all_slaves_active resend_igmp min_links
 | 
				
			||||||
 | 
					#mode_bond0="round-robin"
 | 
				
			||||||
 | 
					#miimon_bond0="100"
 | 
				
			||||||
#arp_ip_target_bond0="+26.0.0.0"
 | 
					#arp_ip_target_bond0="+26.0.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# If any of the slaves require extra configuration - for example wireless or
 | 
					# If any of the slaves require extra configuration - for example wireless or
 | 
				
			||||||
# ppp devices - we need to depend function on the bonded interfaces
 | 
					# ppp devices - we need to depend function on the bonded interfaces
 | 
				
			||||||
#rc_need_bond0="net.eth0 net.eth1"
 | 
					#rc_net_bond0_need="net.eth0 net.eth1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Bonding subsume support (prevents crashes for root-on-NFS)
 | 
				
			||||||
 | 
					#  - Only tested in the default bonding mode ('active-backup') with
 | 
				
			||||||
 | 
					# IPv4
 | 
				
			||||||
 | 
					#  - Only subsumes basic interface characteristics (IP, netmask) and
 | 
				
			||||||
 | 
					#    excludes additional routes, interface properties such as MTU,
 | 
				
			||||||
 | 
					#    interface-associated netfilter rules, etc.
 | 
				
			||||||
 | 
					# In the example below, the (usually kernel-autoconfigured)
 | 
				
			||||||
 | 
					# 'eth0' interface is a member of bond0, which subsumes the
 | 
				
			||||||
 | 
					# existing interface configuration without upsetting NFS.
 | 
				
			||||||
 | 
					#slaves_bond0="eth0 eth1"
 | 
				
			||||||
 | 
					#subsume_bond0="eth0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#-----------------------------------------------------------------------------
 | 
					#-----------------------------------------------------------------------------
 | 
				
			||||||
# Classical IP over ATM
 | 
					# Classical IP over ATM
 | 
				
			||||||
@@ -726,7 +779,7 @@
 | 
				
			|||||||
# If the link require extra configuration - for example wireless or
 | 
					# If the link require extra configuration - for example wireless or
 | 
				
			||||||
# RFC 268 bridge - we need to depend on the bridge so they get
 | 
					# RFC 268 bridge - we need to depend on the bridge so they get
 | 
				
			||||||
# configured correctly.
 | 
					# configured correctly.
 | 
				
			||||||
#rc_need_ppp0="net.nas0"
 | 
					#rc_net_ppp0_need="net.nas0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#WARNING: if MTU of the PPP interface is less than 1500 and you use this
 | 
					#WARNING: if MTU of the PPP interface is less than 1500 and you use this
 | 
				
			||||||
#machine as a router, you should add the following rule to your firewall
 | 
					#machine as a router, you should add the following rule to your firewall
 | 
				
			||||||
@@ -766,6 +819,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#-----------------------------------------------------------------------------
 | 
					#-----------------------------------------------------------------------------
 | 
				
			||||||
# MAC changer
 | 
					# MAC changer
 | 
				
			||||||
 | 
					# Warning: Do NOT use this on bonding interfaces! Bonding changes MACs itself.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
# To set a specific MAC address
 | 
					# To set a specific MAC address
 | 
				
			||||||
#mac_eth0="00:11:22:33:44:55"
 | 
					#mac_eth0="00:11:22:33:44:55"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -790,7 +845,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#-----------------------------------------------------------------------------
 | 
					#-----------------------------------------------------------------------------
 | 
				
			||||||
# TUN/TAP
 | 
					# TUN/TAP
 | 
				
			||||||
# For TUN/TAP support emerge net-misc/openvpn or sys-apps/usermode-utilities
 | 
					# For TUN/TAP support install iproute2, openvpn or usermode-utilities
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# You must specify if we're a tun or tap device. Then you can give it any
 | 
					# You must specify if we're a tun or tap device. Then you can give it any
 | 
				
			||||||
# name you like - such as vpn
 | 
					# name you like - such as vpn
 | 
				
			||||||
@@ -801,6 +856,9 @@
 | 
				
			|||||||
#tuntap_tap0="tap"
 | 
					#tuntap_tap0="tap"
 | 
				
			||||||
#config_tap0="192.168.0.1/24"
 | 
					#config_tap0="192.168.0.1/24"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Use something like this to pass custom options to iproute2 during
 | 
				
			||||||
 | 
					# tunnel creation. This sets the user and group ownership of the node.
 | 
				
			||||||
 | 
					#iproute2_tun1="user foo group bar"
 | 
				
			||||||
# For passing custom options to tunctl use something like the following.  This
 | 
					# For passing custom options to tunctl use something like the following.  This
 | 
				
			||||||
# example sets the owner to adm
 | 
					# example sets the owner to adm
 | 
				
			||||||
#tunctl_tun1="-u adm"
 | 
					#tunctl_tun1="-u adm"
 | 
				
			||||||
@@ -835,7 +893,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# If any of the ports require extra configuration - for example wireless or
 | 
					# If any of the ports require extra configuration - for example wireless or
 | 
				
			||||||
# ppp devices - we need to depend on them like so.
 | 
					# ppp devices - we need to depend on them like so.
 | 
				
			||||||
#rc_need_br0="net.eth0 net.eth1"
 | 
					#rc_net_br0_need="net.eth0 net.eth1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Below is an example of configuring the bridge
 | 
					# Below is an example of configuring the bridge
 | 
				
			||||||
# Consult "man brctl" for more details
 | 
					# Consult "man brctl" for more details
 | 
				
			||||||
@@ -886,7 +944,7 @@
 | 
				
			|||||||
# link_6to4="eth0"		# Interface to base its addresses on
 | 
					# link_6to4="eth0"		# Interface to base its addresses on
 | 
				
			||||||
# config_6to4="ip6to4"
 | 
					# config_6to4="ip6to4"
 | 
				
			||||||
# You may want to depend on eth0 like so
 | 
					# You may want to depend on eth0 like so
 | 
				
			||||||
#rc_need_6to4="net.eth0"
 | 
					#rc_net_6to4_need="net.eth0"
 | 
				
			||||||
# To ensure that eth0 is configured before 6to4. Of course, the tunnel could be
 | 
					# To ensure that eth0 is configured before 6to4. Of course, the tunnel could be
 | 
				
			||||||
# any name and this also works for any configured interface.
 | 
					# any name and this also works for any configured interface.
 | 
				
			||||||
# NOTE: If you're not using iproute2 then your 6to4 tunnel has to be called
 | 
					# NOTE: If you're not using iproute2 then your 6to4 tunnel has to be called
 | 
				
			||||||
@@ -929,6 +987,8 @@
 | 
				
			|||||||
# /etc/iproute2/rt_tables, an example follows:
 | 
					# /etc/iproute2/rt_tables, an example follows:
 | 
				
			||||||
# 2 oob
 | 
					# 2 oob
 | 
				
			||||||
# 3 external
 | 
					# 3 external
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# IPv6 RPDB entries are to be found in the rules6_IFVAR variables:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#rules_eth0="
 | 
					#rules_eth0="
 | 
				
			||||||
#from ZZZ.ZZZ.200.128/27 table oob priority 500
 | 
					#from ZZZ.ZZZ.200.128/27 table oob priority 500
 | 
				
			||||||
@@ -943,6 +1003,11 @@
 | 
				
			|||||||
#XXX.XXX.112.0/24 dev eth1 table external scope link
 | 
					#XXX.XXX.112.0/24 dev eth1 table external scope link
 | 
				
			||||||
#default via XXX.XXX.112.1 dev eth1"
 | 
					#default via XXX.XXX.112.1 dev eth1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# IPv6 example:
 | 
				
			||||||
 | 
					#rules6_eth0="
 | 
				
			||||||
 | 
					#from 2001:0DB8:AAAA:BBBB::/64 table vpn priority 100
 | 
				
			||||||
 | 
					#to 2001:0DB8:AAAA:BBBB::/64 table vpn priority 150"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#-----------------------------------------------------------------------------
 | 
					#-----------------------------------------------------------------------------
 | 
				
			||||||
# System
 | 
					# System
 | 
				
			||||||
@@ -1072,6 +1137,13 @@
 | 
				
			|||||||
# Hypothetical network card that requires a change-eeprom toggle to enable flashing
 | 
					# Hypothetical network card that requires a change-eeprom toggle to enable flashing
 | 
				
			||||||
#ethtool_order_eth0="change-eeprom flash change pause coalesce ring offload nfc rxfh-indir ntuple"
 | 
					#ethtool_order_eth0="change-eeprom flash change pause coalesce ring offload nfc rxfh-indir ntuple"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Firewalld support
 | 
				
			||||||
 | 
					# If you are using the firewalld daemon to configure your firewall
 | 
				
			||||||
 | 
					# settings and you have specific zones you want to apply to your
 | 
				
			||||||
 | 
					# interfaces, you can do this here.
 | 
				
			||||||
 | 
					#firewalld_zone_eth0="myzone"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##############################################################################
 | 
					##############################################################################
 | 
				
			||||||
# ADVANCED CONFIGURATION
 | 
					# ADVANCED CONFIGURATION
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
@@ -1092,6 +1164,17 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# ${IFACE} is set to the interface being brought up/down
 | 
					# ${IFACE} is set to the interface being brought up/down
 | 
				
			||||||
# ${IFVAR} is ${IFACE} converted to variable name bash allows
 | 
					# ${IFVAR} is ${IFACE} converted to variable name bash allows
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# For historical and compatibility reasons, preup is actually normally called
 | 
				
			||||||
 | 
					# in the following sequence: up ; preup ; up.
 | 
				
			||||||
 | 
					# The first up causes the kernel to initialize the device, so
 | 
				
			||||||
 | 
					# that it is available for use in the preup function.  However, for some
 | 
				
			||||||
 | 
					# hardware, e.g. CAN devices, some configuration is needed before trying to up
 | 
				
			||||||
 | 
					# the interface will actually work. For such hardware, the
 | 
				
			||||||
 | 
					# up_before_preup variables will allow skipping the first up call if set
 | 
				
			||||||
 | 
					# to yes.
 | 
				
			||||||
 | 
					#up_before_preup_IFVAR="NO"
 | 
				
			||||||
 | 
					#up_before_preup="NO"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#preup() {
 | 
					#preup() {
 | 
				
			||||||
#	# Test for link on the interface prior to bringing it up.  This
 | 
					#	# Test for link on the interface prior to bringing it up.  This
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,14 +24,5 @@ SED_EXTRA=	${SED_EXTRA-${OS}}
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
include ${MK}/scripts.mk
 | 
					include ${MK}/scripts.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# We can't use "ifndef" here because that treats set-but-empty
 | 
					 | 
				
			||||||
# as not-set which is not what we want
 | 
					 | 
				
			||||||
MKRCSYS ?= automagicplease
 | 
					 | 
				
			||||||
ifeq (${MKRCSYS},automagicplease)
 | 
					 | 
				
			||||||
# If the user isn't picking a default, then have the
 | 
					 | 
				
			||||||
# config go with runtime automagic detection #357247
 | 
					 | 
				
			||||||
rc.conf: SED_EXTRA += -e '/^rc_sys=""/s:^:\#:'
 | 
					 | 
				
			||||||
MKRCSYS =
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
rc.conf: rc.conf.in rc.conf.${OS}
 | 
					rc.conf: rc.conf.in rc.conf.${OS}
 | 
				
			||||||
	${SED} ${SED_REPLACE} ${SED_EXTRA} $^ > $@
 | 
						${SED} ${SED_REPLACE} ${SED_EXTRA} $^ > $@
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,10 +5,9 @@
 | 
				
			|||||||
# ""        - nothing special
 | 
					# ""        - nothing special
 | 
				
			||||||
# "jail"    - FreeBSD jails
 | 
					# "jail"    - FreeBSD jails
 | 
				
			||||||
# "prefix"  - Prefix
 | 
					# "prefix"  - Prefix
 | 
				
			||||||
# If this is commented out, automatic detection will be attempted.
 | 
					# If this is commented out, automatic detection will be used.
 | 
				
			||||||
# Note that automatic detection does not work in a prefix environment.
 | 
					 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This should be set to the value representing the environment this file is
 | 
					# This should be set to the value representing the environment this file is
 | 
				
			||||||
# PRESENTLY in, not the virtualization the environment is capable of.
 | 
					# PRESENTLY in, not the virtualization the environment is capable of.
 | 
				
			||||||
rc_sys="@RC_SYS_DEFAULT@"
 | 
					#rc_sys=""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,15 +10,20 @@
 | 
				
			|||||||
# "vserver" - Linux vserver
 | 
					# "vserver" - Linux vserver
 | 
				
			||||||
# "xen0"    - Xen0 Domain
 | 
					# "xen0"    - Xen0 Domain
 | 
				
			||||||
# "xenU"    - XenU Domain
 | 
					# "xenU"    - XenU Domain
 | 
				
			||||||
# If this is commented out, automatic detection will be attempted.
 | 
					# If this is commented out, automatic detection will be used.
 | 
				
			||||||
# Note that autodetection will not work in a prefix environment or in a
 | 
					 | 
				
			||||||
# linux container.
 | 
					 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This should be set to the value representing the environment this file is
 | 
					# This should be set to the value representing the environment this file is
 | 
				
			||||||
# PRESENTLY in, not the virtualization the environment is capable of.
 | 
					# PRESENTLY in, not the virtualization the environment is capable of.
 | 
				
			||||||
rc_sys="@RC_SYS_DEFAULT@"
 | 
					#rc_sys=""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# This is the number of tty's used in most of the rc-scripts (like
 | 
					# This is the number of tty's used in most of the rc-scripts (like
 | 
				
			||||||
# consolefont, numlock, etc ...)
 | 
					# consolefont, numlock, etc ...)
 | 
				
			||||||
rc_tty_number=12
 | 
					rc_tty_number=12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# If you have cgroups turned on in your kernel, this switch controls
 | 
				
			||||||
 | 
					# whether or not a group for each controller is mounted under
 | 
				
			||||||
 | 
					# /sys/fs/cgroup.
 | 
				
			||||||
 | 
					# Support for process management by cgroups is planned in the future,
 | 
				
			||||||
 | 
					# so if you turn this off, be aware that you may not be able to use that
 | 
				
			||||||
 | 
					# feature.
 | 
				
			||||||
 | 
					#rc_controller_cgroups="YES"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,10 +6,9 @@
 | 
				
			|||||||
# "prefix"  - Prefix
 | 
					# "prefix"  - Prefix
 | 
				
			||||||
# "xen0"    - Xen0 Domain
 | 
					# "xen0"    - Xen0 Domain
 | 
				
			||||||
# "xenU"    - XenU Domain
 | 
					# "xenU"    - XenU Domain
 | 
				
			||||||
# If this is commented out, automatic detection will be attempted.
 | 
					# If this is commented out, automatic detection will be used.
 | 
				
			||||||
# Note that automatic detection does not work in a prefix environment.
 | 
					 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This should be set to the value representing the environment this file is
 | 
					# This should be set to the value representing the environment this file is
 | 
				
			||||||
# PRESENTLY in, not the virtualization the environment is capable of.
 | 
					# PRESENTLY in, not the virtualization the environment is capable of.
 | 
				
			||||||
rc_sys="@RC_SYS_DEFAULT@"
 | 
					#rc_sys=""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -94,6 +94,10 @@
 | 
				
			|||||||
# These variables are documented here, but should be configured in
 | 
					# These variables are documented here, but should be configured in
 | 
				
			||||||
# /etc/conf.d/foo for service foo and NOT enabled here unless you
 | 
					# /etc/conf.d/foo for service foo and NOT enabled here unless you
 | 
				
			||||||
# really want them to work on a global basis.
 | 
					# really want them to work on a global basis.
 | 
				
			||||||
 | 
					# If your service has characters in its name which are not legal in
 | 
				
			||||||
 | 
					# shell variable names and you configure the variables for it in this
 | 
				
			||||||
 | 
					# file, those characters should be replaced with underscores in the
 | 
				
			||||||
 | 
					# variable names as shown below.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Some daemons are started and stopped via start-stop-daemon.
 | 
					# Some daemons are started and stopped via start-stop-daemon.
 | 
				
			||||||
# We can set some things on a per service basis, like the nicelevel.
 | 
					# We can set some things on a per service basis, like the nicelevel.
 | 
				
			||||||
@@ -116,6 +120,13 @@
 | 
				
			|||||||
#rc_foo_need="openvpn"
 | 
					#rc_foo_need="openvpn"
 | 
				
			||||||
#rc_foo_after="clock"
 | 
					#rc_foo_after="clock"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Below is an example for service foo-bar. Note that the '-' is illegal
 | 
				
			||||||
 | 
					# in a shell variable name, so we convert it to an underscore.
 | 
				
			||||||
 | 
					# example for service foo-bar.
 | 
				
			||||||
 | 
					#rc_foo_bar_config="/etc/foo-bar"
 | 
				
			||||||
 | 
					#rc_foo_bar_need="openvpn"
 | 
				
			||||||
 | 
					#rc_foo_bar_after="clock"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# You can also remove dependencies.
 | 
					# You can also remove dependencies.
 | 
				
			||||||
# This is mainly used for saying which servies do NOT provide net.
 | 
					# This is mainly used for saying which servies do NOT provide net.
 | 
				
			||||||
#rc_net_tap0_provide="!net"
 | 
					#rc_net_tap0_provide="!net"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								init.d/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								init.d/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -11,6 +11,7 @@ network
 | 
				
			|||||||
root
 | 
					root
 | 
				
			||||||
savecache
 | 
					savecache
 | 
				
			||||||
swap
 | 
					swap
 | 
				
			||||||
 | 
					swapfiles
 | 
				
			||||||
sysctl
 | 
					sysctl
 | 
				
			||||||
urandom
 | 
					urandom
 | 
				
			||||||
devfs
 | 
					devfs
 | 
				
			||||||
@@ -40,3 +41,4 @@ syslogd
 | 
				
			|||||||
termencoding
 | 
					termencoding
 | 
				
			||||||
ttys
 | 
					ttys
 | 
				
			||||||
wscons
 | 
					wscons
 | 
				
			||||||
 | 
					tmpfiles.setup
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,18 @@
 | 
				
			|||||||
DIR=	${INITDIR}
 | 
					DIR=	${INITDIR}
 | 
				
			||||||
SRCS=	bootmisc.in fsck.in hostname.in local.in localmount.in netmount.in \
 | 
					SRCS=	bootmisc.in fsck.in hostname.in local.in localmount.in netmount.in \
 | 
				
			||||||
	network.in root.in savecache.in staticroute.in swap.in swclock.in \
 | 
						root.in savecache.in swap.in swapfiles.in \
 | 
				
			||||||
	sysctl.in urandom.in ${SRCS-${OS}}
 | 
						tmpfiles.setup.in swclock.in sysctl.in urandom.in ${SRCS-${OS}}
 | 
				
			||||||
BIN=	${OBJS}
 | 
					BIN=	${OBJS}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Build our old net foo or not
 | 
				
			||||||
 | 
					ifeq (${MKNET},)
 | 
				
			||||||
 | 
					SRCS+= network.in staticroute.in
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq (${MKNET},oldnet)
 | 
				
			||||||
INSTALLAFTER=	_installafter_net.lo
 | 
					INSTALLAFTER=	_installafter_net.lo
 | 
				
			||||||
CLEANFILES+=	net.lo
 | 
					SRCS+= net.lo.in
 | 
				
			||||||
TARGETS+=	net.lo
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MK=	../mk
 | 
					MK=	../mk
 | 
				
			||||||
include ${MK}/os.mk
 | 
					include ${MK}/os.mk
 | 
				
			||||||
@@ -16,13 +22,13 @@ NET_LO-FreeBSD=	net.lo0
 | 
				
			|||||||
SRCS-FreeBSD=	hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \
 | 
					SRCS-FreeBSD=	hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \
 | 
				
			||||||
		rpcbind.in savecore.in syslogd.in
 | 
							rpcbind.in savecore.in syslogd.in
 | 
				
			||||||
# These are FreeBSD specific
 | 
					# These are FreeBSD specific
 | 
				
			||||||
SRCS-FreeBSD+=	adjkerntz.in devd.in dumpon.in ipfw.in mixer.in nscd.in \
 | 
					SRCS-FreeBSD+=	adjkerntz.in devd.in dumpon.in encswap.in ipfw.in \
 | 
				
			||||||
		powerd.in syscons.in
 | 
							mixer.in nscd.in powerd.in syscons.in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
NET_LO-Linux=	net.lo
 | 
					NET_LO-Linux=	net.lo
 | 
				
			||||||
SRCS-Linux=	devfs.in dmesg.in hwclock.in consolefont.in keymaps.in \
 | 
					SRCS-Linux=	devfs.in dmesg.in hwclock.in consolefont.in keymaps.in \
 | 
				
			||||||
		killprocs.in modules.in mount-ro.in mtab.in numlock.in \
 | 
							killprocs.in modules.in mount-ro.in mtab.in numlock.in \
 | 
				
			||||||
		procfs.in sysfs.in termencoding.in migrate-run.in
 | 
							procfs.in sysfs.in termencoding.in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
NET_LO-NetBSD=	net.lo0
 | 
					NET_LO-NetBSD=	net.lo0
 | 
				
			||||||
# Generic BSD scripts
 | 
					# Generic BSD scripts
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,11 +10,6 @@ depend()
 | 
				
			|||||||
	keyword -prefix -timeout
 | 
						keyword -prefix -timeout
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dir_writable()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	mkdir "$1"/.test.$$ 2>/dev/null && rmdir "$1"/.test.$$
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
: ${wipe_tmp:=${WIPE_TMP:-yes}}
 | 
					: ${wipe_tmp:=${WIPE_TMP:-yes}}
 | 
				
			||||||
: ${log_dmesg:=${LOG_DMESG:-yes}}
 | 
					: ${log_dmesg:=${LOG_DMESG:-yes}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,7 +20,7 @@ cleanup_tmp_dir()
 | 
				
			|||||||
	if ! [ -d "$dir" ]; then
 | 
						if ! [ -d "$dir" ]; then
 | 
				
			||||||
		mkdir -p "$dir" || return $?
 | 
							mkdir -p "$dir" || return $?
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	dir_writable "$dir" || return 1
 | 
						checkpath -W "$dir" || return 1
 | 
				
			||||||
	chmod a+rwt "$dir" 2> /dev/null
 | 
						chmod a+rwt "$dir" 2> /dev/null
 | 
				
			||||||
	cd "$dir" || return 1
 | 
						cd "$dir" || return 1
 | 
				
			||||||
	if yesno $wipe_tmp; then
 | 
						if yesno $wipe_tmp; then
 | 
				
			||||||
@@ -72,6 +67,26 @@ mkutmp()
 | 
				
			|||||||
	chmod 0664 "$1"
 | 
						chmod 0664 "$1"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					migrate_to_run()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						src="$1"
 | 
				
			||||||
 | 
						dst="$2"
 | 
				
			||||||
 | 
					 	if [ -L $src -a "$(readlink -f $src)" != $dst ]; then
 | 
				
			||||||
 | 
					 		ewarn "$src does not point to $dst."
 | 
				
			||||||
 | 
					 		ewarn "Setting $src to point to $dst."
 | 
				
			||||||
 | 
					 		rm $src
 | 
				
			||||||
 | 
					 	elif [ ! -L $src -a -d $src ]; then
 | 
				
			||||||
 | 
					 		ebegin "Migrating $src to $dst"
 | 
				
			||||||
 | 
					 		cp -a $src/* $dst/
 | 
				
			||||||
 | 
					 		rm -rf $src
 | 
				
			||||||
 | 
					 		eend $?
 | 
				
			||||||
 | 
					 	fi
 | 
				
			||||||
 | 
					 	# If $src doesn't exist at all, just run this
 | 
				
			||||||
 | 
					 	if [ ! -e $src ]; then
 | 
				
			||||||
 | 
					 		ln -s $dst $src
 | 
				
			||||||
 | 
					 	fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start()
 | 
					start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	# Remove any added console dirs
 | 
						# Remove any added console dirs
 | 
				
			||||||
@@ -79,8 +94,16 @@ start()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	local logw=false runw=false extra=
 | 
						local logw=false runw=false extra=
 | 
				
			||||||
	# Ensure that our basic dirs exist
 | 
						# Ensure that our basic dirs exist
 | 
				
			||||||
	[ "$RC_UNAME" = Linux ] && extra=/var/lib/misc # Satisfy Linux FHS
 | 
						if [ "$RC_UNAME" = Linux ]; then
 | 
				
			||||||
	for x in /var/log /var/run /tmp $extra; do
 | 
							# Satisfy Linux FHS
 | 
				
			||||||
 | 
							extra=/var/lib/misc
 | 
				
			||||||
 | 
							if [ ! -d /run ]; then
 | 
				
			||||||
 | 
								extra="/var/run $extra"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							extra=/var/run
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						for x in /var/log /tmp $extra; do
 | 
				
			||||||
		if ! [ -d $x ]; then
 | 
							if ! [ -d $x ]; then
 | 
				
			||||||
			if ! mkdir -p $x; then
 | 
								if ! mkdir -p $x; then
 | 
				
			||||||
				eend 1 "failed to create needed directory $x"
 | 
									eend 1 "failed to create needed directory $x"
 | 
				
			||||||
@@ -89,7 +112,12 @@ start()
 | 
				
			|||||||
		fi
 | 
							fi
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if dir_writable /var/run; then
 | 
						if [ "$RC_UNAME" = Linux -a -d /run ]; then
 | 
				
			||||||
 | 
							migrate_to_run	/var/lock /run/lock
 | 
				
			||||||
 | 
							migrate_to_run	/var/run /run
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if checkpath -W /var/run; then
 | 
				
			||||||
		ebegin "Creating user login records"
 | 
							ebegin "Creating user login records"
 | 
				
			||||||
		local xtra=
 | 
							local xtra=
 | 
				
			||||||
		[ "$RC_UNAME" = NetBSD ] && xtra=x
 | 
							[ "$RC_UNAME" = NetBSD ] && xtra=x
 | 
				
			||||||
@@ -131,7 +159,7 @@ start()
 | 
				
			|||||||
		cleanup_tmp_dir "$tmp"
 | 
							cleanup_tmp_dir "$tmp"
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if dir_writable /tmp; then
 | 
						if checkpath -W /tmp; then
 | 
				
			||||||
		# Make sure our X11 stuff have the correct permissions
 | 
							# Make sure our X11 stuff have the correct permissions
 | 
				
			||||||
		# Omit the chown as bootmisc is run before network is up
 | 
							# Omit the chown as bootmisc is run before network is up
 | 
				
			||||||
		# and users may be using lame LDAP auth #139411
 | 
							# and users may be using lame LDAP auth #139411
 | 
				
			||||||
@@ -144,7 +172,7 @@ start()
 | 
				
			|||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if yesno $log_dmesg; then
 | 
						if yesno $log_dmesg; then
 | 
				
			||||||
		if $logw || dir_writable /var/log; then
 | 
							if $logw || checkpath -W /var/log; then
 | 
				
			||||||
			# Create an 'after-boot' dmesg log
 | 
								# Create an 'after-boot' dmesg log
 | 
				
			||||||
			if [ "$RC_SYS" != VSERVER -a "$RC_SYS" != OPENVZ ]; then
 | 
								if [ "$RC_SYS" != VSERVER -a "$RC_SYS" != OPENVZ ]; then
 | 
				
			||||||
				dmesg > /var/log/dmesg
 | 
									dmesg > /var/log/dmesg
 | 
				
			||||||
@@ -153,7 +181,6 @@ start()
 | 
				
			|||||||
		fi
 | 
							fi
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[ -w /etc/nologin ] && rm -f /etc/nologin
 | 
					 | 
				
			||||||
	return 0
 | 
						return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -169,3 +196,5 @@ stop()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return 0
 | 
						return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# vim: ft=sh
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -54,7 +54,7 @@ start()
 | 
				
			|||||||
	eend $retval
 | 
						eend $retval
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Store the last font so we can use it ASAP on boot
 | 
						# Store the last font so we can use it ASAP on boot
 | 
				
			||||||
	if [ $retval -eq 0 -a -w "$RC_LIBEXECDIR" ]; then
 | 
						if [ $retval -eq 0 ] && checkpath -W "$RC_LIBEXECDIR"; then
 | 
				
			||||||
		mkdir -p "$RC_LIBEXECDIR"/console
 | 
							mkdir -p "$RC_LIBEXECDIR"/console
 | 
				
			||||||
		for font in /usr/share/consolefonts/"$consolefont".*; do
 | 
							for font in /usr/share/consolefonts/"$consolefont".*; do
 | 
				
			||||||
			:
 | 
								:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,8 @@
 | 
				
			|||||||
description="Mount system critical filesystems in /dev."
 | 
					description="Mount system critical filesystems in /dev."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
depend() {
 | 
					depend() {
 | 
				
			||||||
	use dev
 | 
						use dev-mount
 | 
				
			||||||
 | 
						before dev
 | 
				
			||||||
	keyword -prefix -vserver
 | 
						keyword -prefix -vserver
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ description="Set the dmesg level for a cleaner boot"
 | 
				
			|||||||
depend()
 | 
					depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	before dev modules
 | 
						before dev modules
 | 
				
			||||||
	keyword -vserver
 | 
						keyword -lxc -prefix -vserver
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start()
 | 
					start()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										43
									
								
								init.d/encswap.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								init.d/encswap.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
				
			|||||||
 | 
					#!@PREFIX@/sbin/runscript
 | 
				
			||||||
 | 
					# Copyright 1992-2012 FreeBSD Project
 | 
				
			||||||
 | 
					# Released under the 2-clause BSD license
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					depend() {
 | 
				
			||||||
 | 
						before swap
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start() {
 | 
				
			||||||
 | 
						while read device mountpoint type options rest ; do
 | 
				
			||||||
 | 
							case ":${device}:${type}:${options}" in
 | 
				
			||||||
 | 
							:#*)
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
							*.bde:swap:sw)
 | 
				
			||||||
 | 
								passphrase=$(dd if=/dev/random count=1 2>/dev/null | md5 -q)
 | 
				
			||||||
 | 
								device="${device%.bde}"
 | 
				
			||||||
 | 
								gbde init "${device}" -P "${passphrase}" || return 1
 | 
				
			||||||
 | 
								gbde attach "${device}" -p "${passphrase}" || return 1
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
							*.eli:swap:sw)
 | 
				
			||||||
 | 
								device="${device%.eli}"
 | 
				
			||||||
 | 
								geli onetime ${geli_swap_flags} "${device}" || return 1
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
							esac
 | 
				
			||||||
 | 
						done < /etc/fstab
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stop() {
 | 
				
			||||||
 | 
						while read device mountpoint type options rest ; do
 | 
				
			||||||
 | 
							case ":${device}:${type}:${options}" in
 | 
				
			||||||
 | 
							:#*)
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
							*.bde:swap:sw)
 | 
				
			||||||
 | 
								device="${device%.bde}"
 | 
				
			||||||
 | 
								gbde detach "${device}"
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
							*.eli:swap:sw)
 | 
				
			||||||
 | 
								# Nothing here, because geli swap devices should be
 | 
				
			||||||
 | 
								# created with the auto-detach-on-last-close option.
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
							esac
 | 
				
			||||||
 | 
						done < /etc/fstab
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -48,7 +48,7 @@ start()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if [ -n "$fsck_passno" ]; then
 | 
						if [ -n "$fsck_passno" ]; then
 | 
				
			||||||
		check_extra="[passno $fsck_passno] $check_extra"
 | 
							check_extra="[passno $fsck_passno] $check_extra"
 | 
				
			||||||
		if -n "$fsck_mnt" ]; then
 | 
							if [ -n "$fsck_mnt" ]; then
 | 
				
			||||||
			eerror "Only 1 of fsck_passno and fsck_mnt must be set!"
 | 
								eerror "Only 1 of fsck_passno and fsck_mnt must be set!"
 | 
				
			||||||
			return 1
 | 
								return 1
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
@@ -71,7 +71,12 @@ start()
 | 
				
			|||||||
	done
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if [ "$RC_UNAME" = Linux ]; then
 | 
						if [ "$RC_UNAME" = Linux ]; then
 | 
				
			||||||
		fsck_opts="$fsck_opts -C0 -T"
 | 
							local skiptypes x
 | 
				
			||||||
 | 
							for x in $net_fs_list $extra_net_fs_list; do
 | 
				
			||||||
 | 
								skiptypes="${skiptypes}no${x},"
 | 
				
			||||||
 | 
							done
 | 
				
			||||||
 | 
							skiptypes="${skiptypes}noopts=_netdev"
 | 
				
			||||||
 | 
							fsck_opts="$fsck_opts -C0 -T -t $skiptypes"
 | 
				
			||||||
		if [ -z "$fsck_passno" -a -z "$fsck_mnt" ]; then
 | 
							if [ -z "$fsck_passno" -a -z "$fsck_mnt" ]; then
 | 
				
			||||||
			fsck_args=${fsck_args--A -p}
 | 
								fsck_args=${fsck_args--A -p}
 | 
				
			||||||
			if echo 2>/dev/null >/.test.$$; then
 | 
								if echo 2>/dev/null >/.test.$$; then
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -94,7 +94,7 @@ start()
 | 
				
			|||||||
		"$utc_cmd" != --utc -o \
 | 
							"$utc_cmd" != --utc -o \
 | 
				
			||||||
		-n "$clock_args" ];
 | 
							-n "$clock_args" ];
 | 
				
			||||||
	then
 | 
						then
 | 
				
			||||||
		if yesno $clock_hctosys; then
 | 
							if yesno ${clock_hctosys:-YES}; then
 | 
				
			||||||
			_hwclock --hctosys $utc_cmd $clock_args
 | 
								_hwclock --hctosys $utc_cmd $clock_args
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			_hwclock --systz $utc_cmd $clock_args
 | 
								_hwclock --systz $utc_cmd $clock_args
 | 
				
			||||||
@@ -111,7 +111,7 @@ stop()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	# Don't tweak the hardware clock on LiveCD halt.
 | 
						# Don't tweak the hardware clock on LiveCD halt.
 | 
				
			||||||
	[ -n "$CDBOOT" ] && return 0
 | 
						[ -n "$CDBOOT" ] && return 0
 | 
				
			||||||
	yesno $clock_systohc || return 0
 | 
						yesno ${clock_systohc:-YES} || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local retval=0 errstr=""
 | 
						local retval=0 errstr=""
 | 
				
			||||||
	setupopts
 | 
						setupopts
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -63,7 +63,7 @@ start()
 | 
				
			|||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Save the keymapping for use immediately at boot
 | 
						# Save the keymapping for use immediately at boot
 | 
				
			||||||
	if [ -w "$RC_LIBEXECDIR" ]; then
 | 
						if checkpath -W "$RC_LIBEXECDIR"; then
 | 
				
			||||||
		mkdir -p "$RC_LIBEXECDIR"/console
 | 
							mkdir -p "$RC_LIBEXECDIR"/console
 | 
				
			||||||
		dumpkeys >"$RC_LIBEXECDIR"/console/keymap
 | 
							dumpkeys >"$RC_LIBEXECDIR"/console/keymap
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,6 +22,9 @@ start()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if [ "$RC_UNAME" = Linux ]; then
 | 
						if [ "$RC_UNAME" = Linux ]; then
 | 
				
			||||||
		no_netdev="-O no_netdev"
 | 
							no_netdev="-O no_netdev"
 | 
				
			||||||
 | 
							if mountinfo -q /usr; then
 | 
				
			||||||
 | 
								touch $RC_SVCDIR/usr_premounted
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	ebegin "Mounting local filesystems"
 | 
						ebegin "Mounting local filesystems"
 | 
				
			||||||
	mount -at "$types" $no_netdev
 | 
						mount -at "$types" $no_netdev
 | 
				
			||||||
@@ -33,6 +36,7 @@ start()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
stop()
 | 
					stop()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						yesno $RC_GOINGDOWN || return 0
 | 
				
			||||||
	# We never unmount / or /dev or $RC_SVCDIR
 | 
						# We never unmount / or /dev or $RC_SVCDIR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Bug 381783
 | 
						# Bug 381783
 | 
				
			||||||
@@ -48,6 +52,9 @@ stop()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if [ "$RC_UNAME" = Linux ]; then
 | 
						if [ "$RC_UNAME" = Linux ]; then
 | 
				
			||||||
		no_umounts_r="$no_umounts_r|/proc|/proc/.*|/run|/sys|/sys/.*"
 | 
							no_umounts_r="$no_umounts_r|/proc|/proc/.*|/run|/sys|/sys/.*"
 | 
				
			||||||
 | 
							if [ -e $rc_svcdir/usr_premounted ]; then
 | 
				
			||||||
 | 
								no_umounts_r="$no_umounts_r|/usr"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	no_umounts_r="^($no_umounts_r)$"
 | 
						no_umounts_r="^($no_umounts_r)$"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,28 +0,0 @@
 | 
				
			|||||||
#!@PREFIX@/sbin/runscript
 | 
					 | 
				
			||||||
# Copyright 1999-2011 Gentoo Foundation
 | 
					 | 
				
			||||||
# Released under the 2-clause BSD license.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
description="Migrate /var/run and /var/lock to /run"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
depend()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	before *
 | 
					 | 
				
			||||||
	after localmount
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
start()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return 0
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
stop()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if [ -d /run -a ! -L /var/lock -a ! -L /var/run ]; then
 | 
					 | 
				
			||||||
		ebegin "Migrating /var/lock and /var/run to /run"
 | 
					 | 
				
			||||||
		rm -rf /var/lock /var/run
 | 
					 | 
				
			||||||
		ln -s /var/lock /run/lock
 | 
					 | 
				
			||||||
		ln -s /var/run /run
 | 
					 | 
				
			||||||
		eend 0
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
	return 0
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -7,11 +7,13 @@ description="Re-mount filesytems read-only for a clean reboot."
 | 
				
			|||||||
depend()
 | 
					depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	need killprocs savecache
 | 
						need killprocs savecache
 | 
				
			||||||
	keyword -prefix -openvz -vserver -lxc
 | 
						keyword -openvz -prefix -vserver -lxc
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start()
 | 
					start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						local ret=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Flush all pending disk writes now
 | 
						# Flush all pending disk writes now
 | 
				
			||||||
	sync; sync
 | 
						sync; sync
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,7 +25,7 @@ start()
 | 
				
			|||||||
	# Bug 381783
 | 
						# Bug 381783
 | 
				
			||||||
	local rc_svcdir=$(echo $RC_SVCDIR | sed 's:/lib\(32\|64\)\?/:/lib(32|64)?/:g')
 | 
						local rc_svcdir=$(echo $RC_SVCDIR | sed 's:/lib\(32\|64\)\?/:/lib(32|64)?/:g')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local m="/dev|/dev/.*|/proc|/proc.*|/sys|/sys/.*|${rc_svcdir}" x= fs=
 | 
						local m="/dev|/dev/.*|/proc|/proc.*|/sys|/sys/.*|/run|${rc_svcdir}" x= fs=
 | 
				
			||||||
	m="$m|/bin|/sbin|/lib(32|64)?|/libexec"
 | 
						m="$m|/bin|/sbin|/lib(32|64)?|/libexec"
 | 
				
			||||||
	# RC_NO_UMOUNTS is an env var that can be set by plugins
 | 
						# RC_NO_UMOUNTS is an env var that can be set by plugins
 | 
				
			||||||
	local IFS="$IFS:"
 | 
						local IFS="$IFS:"
 | 
				
			||||||
@@ -39,6 +41,9 @@ start()
 | 
				
			|||||||
	do_unmount "umount -r" \
 | 
						do_unmount "umount -r" \
 | 
				
			||||||
		--skip-point-regex "$m" \
 | 
							--skip-point-regex "$m" \
 | 
				
			||||||
		"${fs:+--skip-fstype-regex}" $fs --nonetdev
 | 
							"${fs:+--skip-fstype-regex}" $fs --nonetdev
 | 
				
			||||||
 | 
						ret=$?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	eoutdent
 | 
						eoutdent
 | 
				
			||||||
	eend $?
 | 
					
 | 
				
			||||||
 | 
						eend $ret
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,13 +19,18 @@ depend()
 | 
				
			|||||||
	local IFVAR=$(shell_var "${IFACE}")
 | 
						local IFVAR=$(shell_var "${IFACE}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	need localmount
 | 
						need localmount
 | 
				
			||||||
 | 
						if [ "$RC_UNAME" = Linux -a "$IFACE" != lo ]; then
 | 
				
			||||||
 | 
							need sysfs
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
	after bootmisc
 | 
						after bootmisc
 | 
				
			||||||
	provide net
 | 
					 | 
				
			||||||
	keyword -jail -prefix -vserver
 | 
						keyword -jail -prefix -vserver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case "${IFACE}" in
 | 
						case "${IFACE}" in
 | 
				
			||||||
		lo|lo0);;
 | 
							lo|lo0) ;;
 | 
				
			||||||
		*) after net.lo net.lo0;;
 | 
							*)
 | 
				
			||||||
 | 
								after net.lo net.lo0 dbus
 | 
				
			||||||
 | 
								provide net
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
	esac
 | 
						esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if [ "$(command -v "depend_${IFVAR}")" = "depend_${IFVAR}" ]; then
 | 
						if [ "$(command -v "depend_${IFVAR}")" = "depend_${IFVAR}" ]; then
 | 
				
			||||||
@@ -37,6 +42,8 @@ depend()
 | 
				
			|||||||
		eval prov=\$rc_${dep}_${IFVAR}
 | 
							eval prov=\$rc_${dep}_${IFVAR}
 | 
				
			||||||
		if [ -n "${prov}" ]; then
 | 
							if [ -n "${prov}" ]; then
 | 
				
			||||||
			${dep} ${prov}
 | 
								${dep} ${prov}
 | 
				
			||||||
 | 
								ewarn "rc_${dep}_${IFVAR} is deprecated."
 | 
				
			||||||
 | 
								ewarn "Please use rc_net_${IFVAR}_${dep} instead."
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -101,7 +108,7 @@ _wait_for_carrier()
 | 
				
			|||||||
	_has_carrier  && return 0
 | 
						_has_carrier  && return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	eval timeout=\$carrier_timeout_${IFVAR}
 | 
						eval timeout=\$carrier_timeout_${IFVAR}
 | 
				
			||||||
	timeout=${timeout:-${carrier_timeout:-5}}
 | 
						timeout=${timeout:-${carrier_timeout:-0}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Incase users don't want this nice feature ...
 | 
						# Incase users don't want this nice feature ...
 | 
				
			||||||
	[ ${timeout} -le 0 ] && return 0
 | 
						[ ${timeout} -le 0 ] && return 0
 | 
				
			||||||
@@ -169,6 +176,36 @@ _configure_variables()
 | 
				
			|||||||
	done
 | 
						done
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_which()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local i OIFS
 | 
				
			||||||
 | 
						# Empty
 | 
				
			||||||
 | 
						[ -z "$1" ] && return
 | 
				
			||||||
 | 
						# check paths
 | 
				
			||||||
 | 
						OIFS="$IFS"
 | 
				
			||||||
 | 
						IFS=:
 | 
				
			||||||
 | 
						for i in $PATH ; do
 | 
				
			||||||
 | 
							[ -x $i/$1 ] && echo $i/$1 && break
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
						IFS=$OIFS
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Like _which, but also consider shell builtins, and multiple alternatives
 | 
				
			||||||
 | 
					_program_available()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						[ -z "$1" ] && return 0
 | 
				
			||||||
 | 
						local x=
 | 
				
			||||||
 | 
						for x; do
 | 
				
			||||||
 | 
							case "${x}" in
 | 
				
			||||||
 | 
								/*) [ -x "${x}" ] && break;;
 | 
				
			||||||
 | 
								*) type "${x}" >/dev/null 2>&1 && break;;
 | 
				
			||||||
 | 
							esac
 | 
				
			||||||
 | 
							unset x
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
						[ -n "${x}" ] && echo $x && return 0
 | 
				
			||||||
 | 
						return 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_show_address()
 | 
					_show_address()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	einfo "received address $(_get_inet_address "${IFACE}")"
 | 
						einfo "received address $(_get_inet_address "${IFACE}")"
 | 
				
			||||||
@@ -311,11 +348,10 @@ _load_modules()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		eval set -- \$module_${i}_program
 | 
							eval set -- \$module_${i}_program
 | 
				
			||||||
		if [ -n "$1" ]; then
 | 
							if [ -n "$1" ]; then
 | 
				
			||||||
			x=
 | 
								if ! _program_available "$@" >/dev/null; then
 | 
				
			||||||
			for x; do
 | 
									vewarn "Skipping module $mod due to missing program: $@"
 | 
				
			||||||
				[ -x "${x}" ] && break
 | 
									continue
 | 
				
			||||||
			done
 | 
								fi
 | 
				
			||||||
			[ -x "${x}" ] || continue
 | 
					 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
		if ${starting}; then
 | 
							if ${starting}; then
 | 
				
			||||||
			eval set -- \$module_${i}_program_start
 | 
								eval set -- \$module_${i}_program_start
 | 
				
			||||||
@@ -323,15 +359,10 @@ _load_modules()
 | 
				
			|||||||
			eval set -- \$module_${i}_program_stop
 | 
								eval set -- \$module_${i}_program_stop
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
		if [ -n "$1" ]; then
 | 
							if [ -n "$1" ]; then
 | 
				
			||||||
			x=
 | 
								if ! _program_available "$@" >/dev/null; then
 | 
				
			||||||
			for x; do
 | 
									vewarn "Skipping module $mod due to missing program: $@"
 | 
				
			||||||
				case "${x}" in
 | 
									continue
 | 
				
			||||||
					/*) [ -x "${x}" ] && break;;
 | 
								fi
 | 
				
			||||||
					*) type "${x}" >/dev/null 2>&1 && break;;
 | 
					 | 
				
			||||||
				esac
 | 
					 | 
				
			||||||
				unset x
 | 
					 | 
				
			||||||
			done
 | 
					 | 
				
			||||||
			[ -n "${x}" ] || continue
 | 
					 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		eval provides=\$module_${i}_provide
 | 
							eval provides=\$module_${i}_provide
 | 
				
			||||||
@@ -407,16 +438,18 @@ _load_config()
 | 
				
			|||||||
	set -- ${config}
 | 
						set -- ${config}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# We should support a space separated array for cidr configs
 | 
						# We should support a space separated array for cidr configs
 | 
				
			||||||
 | 
						# But only as long as they do not contain other parameters for the address
 | 
				
			||||||
	if [ $# = 1 ]; then
 | 
						if [ $# = 1 ]; then
 | 
				
			||||||
		unset IFS
 | 
							unset IFS
 | 
				
			||||||
		set -- ${config}
 | 
							set -- ${config}
 | 
				
			||||||
		# Of course, we may have a single address added old style.
 | 
							# Of course, we may have a single address added old style.
 | 
				
			||||||
		case "$2" in
 | 
							# If the NEXT argument is a v4 or v6 address, it's the next config.
 | 
				
			||||||
			netmask|broadcast|brd|brd+|peer|pointopoint)
 | 
							# Otherwise, it's arguments to the first config...
 | 
				
			||||||
 | 
							if [ "${2#*.*}" = "${2}" -a "${2#*:*}" = "${2}" ]; then
 | 
				
			||||||
 | 
								# Not an IPv4/IPv6
 | 
				
			||||||
			local IFS="$__IFS"
 | 
								local IFS="$__IFS"
 | 
				
			||||||
			set -- ${config}
 | 
								set -- ${config}
 | 
				
			||||||
				;;
 | 
							fi
 | 
				
			||||||
		esac
 | 
					 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Ensure that loopback has the correct address
 | 
						# Ensure that loopback has the correct address
 | 
				
			||||||
@@ -488,7 +521,9 @@ start()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	local IFACE=${RC_SVCNAME#*.} oneworked=false fallback=false module=
 | 
						local IFACE=${RC_SVCNAME#*.} oneworked=false fallback=false module=
 | 
				
			||||||
	local IFVAR=$(shell_var "${IFACE}") cmd= our_metric=
 | 
						local IFVAR=$(shell_var "${IFACE}") cmd= our_metric=
 | 
				
			||||||
	local metric=0
 | 
						local metric=0 _up_before_preup
 | 
				
			||||||
 | 
						eval _up_before_preup="\$up_before_preup_${IFVAR}"
 | 
				
			||||||
 | 
						[ -z "${_up_before_preup}" ] && _up_before_preup=$up_before_preup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	einfo "Bringing up interface ${IFACE}"
 | 
						einfo "Bringing up interface ${IFACE}"
 | 
				
			||||||
	eindent
 | 
						eindent
 | 
				
			||||||
@@ -502,7 +537,7 @@ start()
 | 
				
			|||||||
	# available in preup and afterwards incase the user inadvertently
 | 
						# available in preup and afterwards incase the user inadvertently
 | 
				
			||||||
	# brings it down
 | 
						# brings it down
 | 
				
			||||||
	if [ "$(command -v preup)" = "preup" ]; then
 | 
						if [ "$(command -v preup)" = "preup" ]; then
 | 
				
			||||||
		_up 2>/dev/null
 | 
							yesno "${_up_before_preup:-yes}" && _up 2>/dev/null
 | 
				
			||||||
		ebegin "Running preup"
 | 
							ebegin "Running preup"
 | 
				
			||||||
		eindent
 | 
							eindent
 | 
				
			||||||
		preup || return 1
 | 
							preup || return 1
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,62 +2,26 @@
 | 
				
			|||||||
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
					# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
				
			||||||
# Released under the 2-clause BSD license.
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
description="Mounts network shares according to /etc/fstab."
 | 
					description="Mounts network shares, other than NFS, according to /etc/fstab."
 | 
				
			||||||
 | 
					# We skip all NFS shares in this script because they require extra
 | 
				
			||||||
need_portmap()
 | 
					# daemons to be running on the client in order to work correctly.
 | 
				
			||||||
{
 | 
					# It is best to allow nfs-utils to handle all nfs shares.
 | 
				
			||||||
	local opts=
 | 
					 | 
				
			||||||
	local IFS="
 | 
					 | 
				
			||||||
"
 | 
					 | 
				
			||||||
	set -- $(fstabinfo --options --fstype nfs,nfs4)
 | 
					 | 
				
			||||||
	for opts; do
 | 
					 | 
				
			||||||
		case ,$opts, in
 | 
					 | 
				
			||||||
			*,noauto,*|*,nolock,*);;
 | 
					 | 
				
			||||||
			*) return 0;;
 | 
					 | 
				
			||||||
		esac
 | 
					 | 
				
			||||||
	done
 | 
					 | 
				
			||||||
	return 1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
depend()
 | 
					depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	# Only have portmap as a dependency if there is a nfs mount in fstab
 | 
					 | 
				
			||||||
	# that is set to mount at boot
 | 
					 | 
				
			||||||
	local pmap=
 | 
					 | 
				
			||||||
	if need_portmap; then
 | 
					 | 
				
			||||||
		pmap="rpc.statd"
 | 
					 | 
				
			||||||
		[ -x @SYSCONFDIR@/init.d/rpcbind ] \
 | 
					 | 
				
			||||||
			&& pmap="$pmap rpcbind" \
 | 
					 | 
				
			||||||
			|| pmap="$pmap portmap"
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	config /etc/fstab
 | 
						config /etc/fstab
 | 
				
			||||||
	need net $pmap
 | 
					 | 
				
			||||||
	use afc-client amd autofs openvpn
 | 
						use afc-client amd autofs openvpn
 | 
				
			||||||
	use dns nfs nfsmount portmap rpcbind rpc.statd rpc.lockd
 | 
						use dns
 | 
				
			||||||
	keyword -jail -prefix -vserver
 | 
						keyword -jail -prefix -vserver
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start()
 | 
					start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	local myneed= myuse= pmap="portmap" nfsmounts=
 | 
					 | 
				
			||||||
	[ -x @SYSCONFDIR@/init.d/rpcbind ] && pmap="rpcbind"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local x= fs= rc=
 | 
						local x= fs= rc=
 | 
				
			||||||
	for x in $net_fs_list $extra_net_fs_list; do
 | 
						for x in $net_fs_list $extra_net_fs_list; do
 | 
				
			||||||
		case "$x" in
 | 
							case "$x" in
 | 
				
			||||||
			nfs|nfs4)
 | 
								nfs|nfs4)
 | 
				
			||||||
			# If the nfsmount script took care of the nfs
 | 
					 | 
				
			||||||
			# filesystems, then there's no point in trying
 | 
					 | 
				
			||||||
			# them twice
 | 
					 | 
				
			||||||
			service_started nfsmount && continue
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			# Only try to mount NFS filesystems if portmap was
 | 
					 | 
				
			||||||
			# started. This is to fix "hang" problems for new
 | 
					 | 
				
			||||||
			# users who do not add portmap to the default runlevel.
 | 
					 | 
				
			||||||
			if need_portmap && ! service_started "$pmap"; then
 | 
					 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
			fi
 | 
					 | 
				
			||||||
			;;
 | 
								;;
 | 
				
			||||||
		esac
 | 
							esac
 | 
				
			||||||
		fs="$fs${fs:+,}$x"
 | 
							fs="$fs${fs:+,}$x"
 | 
				
			||||||
@@ -82,7 +46,14 @@ stop()
 | 
				
			|||||||
	. "$RC_LIBEXECDIR"/sh/rc-mount.sh
 | 
						. "$RC_LIBEXECDIR"/sh/rc-mount.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for x in $net_fs_list $extra_net_fs_list; do
 | 
						for x in $net_fs_list $extra_net_fs_list; do
 | 
				
			||||||
 | 
							case "$x" in
 | 
				
			||||||
 | 
								nfs|nfs4)
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
									;;
 | 
				
			||||||
 | 
								*)
 | 
				
			||||||
				fs="$fs${fs:+,}$x"
 | 
									fs="$fs${fs:+,}$x"
 | 
				
			||||||
 | 
									;;
 | 
				
			||||||
 | 
							esac
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
	if [ -n "$fs" ]; then
 | 
						if [ -n "$fs" ]; then
 | 
				
			||||||
		umount -at $fs || eerror "Failed to simply unmount filesystems"
 | 
							umount -at $fs || eerror "Failed to simply unmount filesystems"
 | 
				
			||||||
@@ -91,7 +62,14 @@ stop()
 | 
				
			|||||||
	eindent
 | 
						eindent
 | 
				
			||||||
	fs=
 | 
						fs=
 | 
				
			||||||
	for x in $net_fs_list $extra_net_fs_list; do
 | 
						for x in $net_fs_list $extra_net_fs_list; do
 | 
				
			||||||
 | 
							case "$x" in
 | 
				
			||||||
 | 
								nfs|nfs4)
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
									;;
 | 
				
			||||||
 | 
								*)
 | 
				
			||||||
				fs="$fs${fs:+|}$x"
 | 
									fs="$fs${fs:+|}$x"
 | 
				
			||||||
 | 
									;;
 | 
				
			||||||
 | 
							esac
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
	[ -n "$fs" ] && fs="^($fs)$"
 | 
						[ -n "$fs" ] && fs="^($fs)$"
 | 
				
			||||||
	do_unmount umount ${fs:+--fstype-regex} $fs --netdev
 | 
						do_unmount umount ${fs:+--fstype-regex} $fs --netdev
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,9 @@ depend()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	need localmount
 | 
						need localmount
 | 
				
			||||||
	after bootmisc
 | 
						after bootmisc
 | 
				
			||||||
 | 
						if [ -n "$(interfaces)" ]; then
 | 
				
			||||||
		provide net
 | 
							provide net
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
	keyword -jail -prefix -vserver
 | 
						keyword -jail -prefix -vserver
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -219,12 +221,6 @@ start()
 | 
				
			|||||||
		eend $?
 | 
							eend $?
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ewarn
 | 
					 | 
				
			||||||
	ewarn "The $RC_SVCNAME script is deprecated and will be"
 | 
					 | 
				
			||||||
	ewarn "removed in the future."
 | 
					 | 
				
			||||||
	ewarn "Please use the net.* scripts to manage your network interfaces."
 | 
					 | 
				
			||||||
	ewarn
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	einfo "Starting network"
 | 
						einfo "Starting network"
 | 
				
			||||||
	routeflush
 | 
						routeflush
 | 
				
			||||||
	if [ "$RC_UNAME" = "Linux" ]; then
 | 
						if [ "$RC_UNAME" = "Linux" ]; then
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,6 +20,29 @@ start()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	[ -e /proc/filesystems ] || return 0
 | 
						[ -e /proc/filesystems ] || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Setup Kernel Support for miscellaneous Binary Formats
 | 
				
			||||||
 | 
						if [ -d /proc/sys/fs/binfmt_misc -a ! -e /proc/sys/fs/binfmt_misc/register ]; then
 | 
				
			||||||
 | 
							if grep -qs binfmt_misc /proc/filesystems; then
 | 
				
			||||||
 | 
								ebegin "Mounting misc binary format filesystem"
 | 
				
			||||||
 | 
								mount -t binfmt_misc -o nodev,noexec,nosuid \
 | 
				
			||||||
 | 
									binfmt_misc /proc/sys/fs/binfmt_misc
 | 
				
			||||||
 | 
								if eend $? ; then
 | 
				
			||||||
 | 
									local fmts
 | 
				
			||||||
 | 
									ebegin "Loading custom binary format handlers"
 | 
				
			||||||
 | 
									fmts=$(grep -hsv -e '^[#;]' -e '^[[:space:]]*$' \
 | 
				
			||||||
 | 
										/run/binfmt.d/*.conf \
 | 
				
			||||||
 | 
										@SYSCONFDIR@/binfmt.d/*.conf \
 | 
				
			||||||
 | 
										""/usr/lib/binfmt.d/*.conf)
 | 
				
			||||||
 | 
									if [ -n "${fmts}" ]; then
 | 
				
			||||||
 | 
										echo "${fmts}" > /proc/sys/fs/binfmt_misc/register
 | 
				
			||||||
 | 
									fi
 | 
				
			||||||
 | 
									eend $?
 | 
				
			||||||
 | 
								fi
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ "$RC_SYS" = "OPENVZ" ] && return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Check what USB fs the kernel support.  Currently
 | 
						# Check what USB fs the kernel support.  Currently
 | 
				
			||||||
	# 2.5+ kernels, and later 2.4 kernels have 'usbfs',
 | 
						# 2.5+ kernels, and later 2.4 kernels have 'usbfs',
 | 
				
			||||||
	# while older kernels have 'usbdevfs'.
 | 
						# while older kernels have 'usbdevfs'.
 | 
				
			||||||
@@ -37,27 +60,6 @@ start()
 | 
				
			|||||||
		fi
 | 
							fi
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Setup Kernel Support for miscellaneous Binary Formats
 | 
					 | 
				
			||||||
	if [ -d /proc/sys/fs/binfmt_misc -a ! -e /proc/sys/fs/binfmt_misc/register ]; then
 | 
					 | 
				
			||||||
		if grep -qs binfmt_misc /proc/filesystems; then
 | 
					 | 
				
			||||||
			ebegin "Mounting misc binary format filesystem"
 | 
					 | 
				
			||||||
			mount -t binfmt_misc -o nodev,noexec,nosuid \
 | 
					 | 
				
			||||||
				binfmt_misc /proc/sys/fs/binfmt_misc
 | 
					 | 
				
			||||||
			if eend $? ; then
 | 
					 | 
				
			||||||
				local fmts
 | 
					 | 
				
			||||||
				ebegin "Loading custom binary format handlers"
 | 
					 | 
				
			||||||
				fmts=$(grep -hsv -e '^[#;]' -e '^[[:space:]]*$' \
 | 
					 | 
				
			||||||
					/run/binfmt.d/*.conf \
 | 
					 | 
				
			||||||
					"/etc"/binfmt.d/*.conf \
 | 
					 | 
				
			||||||
					""/usr/lib/binfmt.d/*.conf)
 | 
					 | 
				
			||||||
				if [ -n "${fmts}" ]; then
 | 
					 | 
				
			||||||
					echo "${fmts}" > /proc/sys/fs/binfmt_misc/register
 | 
					 | 
				
			||||||
				fi
 | 
					 | 
				
			||||||
				eend $?
 | 
					 | 
				
			||||||
			fi
 | 
					 | 
				
			||||||
		fi
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# Setup Kernel Support for SELinux
 | 
						# Setup Kernel Support for SELinux
 | 
				
			||||||
	if [ -d /selinux ] && ! mountinfo -q /selinux; then
 | 
						if [ -d /selinux ] && ! mountinfo -q /selinux; then
 | 
				
			||||||
		if grep -qs selinuxfs /proc/filesystems; then
 | 
							if grep -qs selinuxfs /proc/filesystems; then
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,20 +13,41 @@ depend()
 | 
				
			|||||||
start()
 | 
					start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	case ",$(fstabinfo -o /)," in
 | 
						case ",$(fstabinfo -o /)," in
 | 
				
			||||||
	*,ro,*) return 0;;
 | 
							*,ro,*)
 | 
				
			||||||
	esac
 | 
							;;
 | 
				
			||||||
 | 
							*)
 | 
				
			||||||
	if echo 2>/dev/null >/.test.$$; then
 | 
								# Check if the rootfs isn't already writable.
 | 
				
			||||||
		rm -f /.test.$$ /fastboot /forcefsck
 | 
								if checkpath -W /; then
 | 
				
			||||||
		return 0
 | 
									rm -f /fastboot /forcefsck
 | 
				
			||||||
	fi
 | 
								else
 | 
				
			||||||
 | 
					 | 
				
			||||||
				ebegin "Remounting root filesystem read/write"
 | 
									ebegin "Remounting root filesystem read/write"
 | 
				
			||||||
				case "$RC_UNAME" in
 | 
									case "$RC_UNAME" in
 | 
				
			||||||
		Linux)	mount -n -o remount,rw /;;
 | 
										Linux)
 | 
				
			||||||
		*)	mount -u -o rw /;;
 | 
											mount -n -o remount,rw /
 | 
				
			||||||
 | 
										;;
 | 
				
			||||||
 | 
										*)
 | 
				
			||||||
 | 
											mount -u -o rw /
 | 
				
			||||||
 | 
										;;
 | 
				
			||||||
				esac
 | 
									esac
 | 
				
			||||||
	if eend $? "Root filesystem could not be mounted read/write"; then
 | 
									eend $? "Root filesystem could not be mounted read/write"
 | 
				
			||||||
 | 
									if [ $?  -eq 0 ]; then
 | 
				
			||||||
					rm -f /fastboot /forcefsck
 | 
										rm -f /fastboot /forcefsck
 | 
				
			||||||
				fi
 | 
									fi
 | 
				
			||||||
 | 
								fi
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ebegin "Remounting filesystems"
 | 
				
			||||||
 | 
						local mountpoint
 | 
				
			||||||
 | 
						for mountpoint in $(fstabinfo); do
 | 
				
			||||||
 | 
							case "${mountpoint}" in
 | 
				
			||||||
 | 
								/)
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
								/*)
 | 
				
			||||||
 | 
									mountinfo -q "${mountpoint}" && \
 | 
				
			||||||
 | 
										fstabinfo --remount "${mountpoint}"
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
							esac
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
						eend 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,14 @@ start()
 | 
				
			|||||||
			return 1
 | 
								return 1
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
						if ! checkpath -W "$RC_LIBEXECDIR"; then
 | 
				
			||||||
 | 
							ewarn "WARNING: ${RC_LIBEXECDIR} is not writable!"
 | 
				
			||||||
 | 
							if ! yesno "${RC_GOINGDOWN}"; then
 | 
				
			||||||
 | 
								ewarn "Unable to save deptree cache"
 | 
				
			||||||
 | 
								return 1
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							return 0
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
	ebegin "Saving dependency cache"
 | 
						ebegin "Saving dependency cache"
 | 
				
			||||||
	local rc=
 | 
						local rc=
 | 
				
			||||||
	if [ ! -d "$RC_LIBEXECDIR"/cache ]; then
 | 
						if [ ! -d "$RC_LIBEXECDIR"/cache ]; then
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,8 @@ description="Saves a kernel dump."
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
depend()
 | 
					depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	need localmount
 | 
						need dumpon localmount
 | 
				
			||||||
 | 
						before encswap
 | 
				
			||||||
	keyword -jail -prefix
 | 
						keyword -jail -prefix
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -93,11 +93,6 @@ do_routes()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
start()
 | 
					start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ewarn
 | 
					 | 
				
			||||||
	ewarn "The $RC_SVCNAME script is deprecated and will be"
 | 
					 | 
				
			||||||
	ewarn "removed in the future."
 | 
					 | 
				
			||||||
	ewarn "Please use the net.* scripts to manage your network interfaces."
 | 
					 | 
				
			||||||
	ewarn
 | 
					 | 
				
			||||||
	do_routes "Adding" "add"
 | 
						do_routes "Adding" "add"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
depend()
 | 
					depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	need localmount
 | 
						before localmount
 | 
				
			||||||
	keyword -jail -openvz -prefix -vserver -lxc
 | 
						keyword -jail -openvz -prefix -vserver -lxc
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -12,6 +12,7 @@ start()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	ebegin "Activating swap devices"
 | 
						ebegin "Activating swap devices"
 | 
				
			||||||
	case "$RC_UNAME" in
 | 
						case "$RC_UNAME" in
 | 
				
			||||||
 | 
							Linux)		swapon -a -e >/dev/null;;
 | 
				
			||||||
		NetBSD|OpenBSD) swapctl -A -t noblk >/dev/null;;
 | 
							NetBSD|OpenBSD) swapctl -A -t noblk >/dev/null;;
 | 
				
			||||||
		*)		swapon -a >/dev/null;;
 | 
							*)		swapon -a >/dev/null;;
 | 
				
			||||||
	esac
 | 
						esac
 | 
				
			||||||
@@ -23,7 +24,7 @@ stop()
 | 
				
			|||||||
	ebegin "Deactivating swap devices"
 | 
						ebegin "Deactivating swap devices"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Try to unmount all tmpfs filesystems not in use, else a deadlock may
 | 
						# Try to unmount all tmpfs filesystems not in use, else a deadlock may
 | 
				
			||||||
	# occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
 | 
						# occur. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
 | 
				
			||||||
	cd "$RC_SVCDIR"
 | 
						cd "$RC_SVCDIR"
 | 
				
			||||||
	umount -a -t tmpfs 2>/dev/null
 | 
						umount -a -t tmpfs 2>/dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										47
									
								
								init.d/swapfiles.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								init.d/swapfiles.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					#!@PREFIX@/sbin/runscript
 | 
				
			||||||
 | 
					# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
				
			||||||
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					depend()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						need localmount
 | 
				
			||||||
 | 
						keyword -jail -openvz -prefix -vserver -lxc
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ebegin "Activating additional swap space"
 | 
				
			||||||
 | 
						case "$RC_UNAME" in
 | 
				
			||||||
 | 
							NetBSD|OpenBSD) swapctl -A -t noblk >/dev/null;;
 | 
				
			||||||
 | 
							*)		swapon -a >/dev/null;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
 | 
						eend 0 # If swapon has nothing todo it errors, so always return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stop()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ebegin "Deactivating additional swap space"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Try to unmount all tmpfs filesystems not in use, else a deadlock may
 | 
				
			||||||
 | 
						# occur. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
 | 
				
			||||||
 | 
						# fixme: Do we need this here since we are only unmounting swap files
 | 
				
			||||||
 | 
						# and loopback swap?
 | 
				
			||||||
 | 
						cd "$RC_SVCDIR"
 | 
				
			||||||
 | 
						umount -a -t tmpfs 2>/dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case "$RC_UNAME" in
 | 
				
			||||||
 | 
							Linux)
 | 
				
			||||||
 | 
								if [ -e /proc/swaps ]; then
 | 
				
			||||||
 | 
									while read filename type rest; do
 | 
				
			||||||
 | 
										case "$type" in
 | 
				
			||||||
 | 
											file) swapoff $filename >/dev/null;;
 | 
				
			||||||
 | 
										esac
 | 
				
			||||||
 | 
										case "$filename" in
 | 
				
			||||||
 | 
											/dev/loop*) swapoff $filename >/dev/null;;
 | 
				
			||||||
 | 
										esac
 | 
				
			||||||
 | 
									done < /proc/swaps
 | 
				
			||||||
 | 
								fi
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
 | 
						eend 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -14,7 +14,7 @@ start()
 | 
				
			|||||||
	local retval=0 var= comments= conf=
 | 
						local retval=0 var= comments= conf=
 | 
				
			||||||
	ebegin "Configuring kernel parameters"
 | 
						ebegin "Configuring kernel parameters"
 | 
				
			||||||
	eindent
 | 
						eindent
 | 
				
			||||||
	for conf in /etc/sysctl.d/*.conf /etc/sysctl.conf; do
 | 
						for conf in @SYSCONFDIR@/sysctl.conf @SYSCONFDIR@/sysctl.d/*.conf; do
 | 
				
			||||||
		if [ -r "$conf" ]; then
 | 
							if [ -r "$conf" ]; then
 | 
				
			||||||
			vebegin "applying $conf"
 | 
								vebegin "applying $conf"
 | 
				
			||||||
			while read var comments; do
 | 
								while read var comments; do
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
depend()
 | 
					depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	before bootmisc logger
 | 
						before bootmisc logger
 | 
				
			||||||
	keyword -prefix -vserver
 | 
						keyword -lxc -prefix -vserver
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start()
 | 
					start()
 | 
				
			||||||
@@ -15,12 +15,12 @@ start()
 | 
				
			|||||||
	ebegin "Configuring kernel parameters"
 | 
						ebegin "Configuring kernel parameters"
 | 
				
			||||||
	eindent
 | 
						eindent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for conf in /etc/sysctl.d/*.conf /etc/sysctl.conf; do
 | 
						for conf in @SYSCONFDIR@/sysctl.conf @SYSCONFDIR@/sysctl.d/*.conf; do
 | 
				
			||||||
		if [ -r "$conf" ]; then
 | 
							if [ -r "$conf" ]; then
 | 
				
			||||||
			vebegin "applying $conf"
 | 
								vebegin "applying $conf"
 | 
				
			||||||
			if ! err=$(sysctl -q -p "$conf" 2>&1) ; then
 | 
								if ! err=$(sysctl -p "$conf" 2>&1 >/dev/null) ; then
 | 
				
			||||||
				errs="${errs} ${err}"
 | 
									errs="${errs} ${err}"
 | 
				
			||||||
				sysctl -q -e -p "${conf}"
 | 
									sysctl -e -p "${conf}" >/dev/null
 | 
				
			||||||
			fi
 | 
								fi
 | 
				
			||||||
			veend $? || retval=1
 | 
								veend $? || retval=1
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,7 @@ description="Mount the sys filesystem."
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
depend()
 | 
					depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	keyword -prefix -vserver
 | 
						keyword -lxc -prefix -vserver
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mount_sys()
 | 
					mount_sys()
 | 
				
			||||||
@@ -61,26 +61,37 @@ mount_misc()
 | 
				
			|||||||
		fi
 | 
							fi
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Setup Kernel Support for cgroup
 | 
						# set up kernel support for cgroups
 | 
				
			||||||
	if [ -d /sys/fs/cgroup ]; then
 | 
						if [ -d /sys/fs/cgroup ] && ! mountinfo -q /sys/fs/cgroup; then
 | 
				
			||||||
		if grep -qs cgroup /proc/filesystems && \
 | 
							if grep -qs cgroup /proc/filesystems; then
 | 
				
			||||||
			! mountinfo -q /sys/fs/cgroup; then
 | 
					 | 
				
			||||||
			ebegin "Mounting cgroup filesystem"
 | 
								ebegin "Mounting cgroup filesystem"
 | 
				
			||||||
			mount -n -t tmpfs -o  nodev,noexec,nosuid \
 | 
								local opts="nodev,noexec,nosuid,mode=755,size=${rc_cgroupsize:-10m}"
 | 
				
			||||||
				cgroup /sys/fs/cgroup
 | 
								mount -n -t tmpfs -o ${opts} cgroup_root /sys/fs/cgroup
 | 
				
			||||||
			eend $?
 | 
								eend $?
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
		if ! mountinfo -q /sys/fs/cgroup/openrc; then
 | 
						fi
 | 
				
			||||||
			ebegin "creating openrc control group"
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mount_cgroups()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
							mountinfo -q /sys/fs/cgroup || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local agent="@LIBEXECDIR@/sh/cgroup-release-agent.sh"
 | 
				
			||||||
	mkdir /sys/fs/cgroup/openrc
 | 
						mkdir /sys/fs/cgroup/openrc
 | 
				
			||||||
			mount -n -t cgroup -o  nodev,noexec,nosuid \
 | 
						mount -n -t cgroup \
 | 
				
			||||||
 | 
							-o none,nodev,noexec,nosuid,name=openrc,release_agent="$agent" \
 | 
				
			||||||
		openrc /sys/fs/cgroup/openrc
 | 
							openrc /sys/fs/cgroup/openrc
 | 
				
			||||||
	echo 1 > /sys/fs/cgroup/openrc/notify_on_release
 | 
						echo 1 > /sys/fs/cgroup/openrc/notify_on_release
 | 
				
			||||||
			echo @LIBEXECDIR@/sh/cgroup-release-agent.sh \
 | 
					
 | 
				
			||||||
				> /sys/fs/cgroup/openrc/release_agent
 | 
						yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0
 | 
				
			||||||
			eend
 | 
						while read name hier groups enabled rest; do
 | 
				
			||||||
		fi
 | 
							case "${enabled}" in
 | 
				
			||||||
	fi
 | 
								1)	mkdir /sys/fs/cgroup/${name}
 | 
				
			||||||
 | 
									mount -n -t cgroup -o nodev,noexec,nosuid,${name} \
 | 
				
			||||||
 | 
										${name} /sys/fs/cgroup/${name}
 | 
				
			||||||
 | 
									;;
 | 
				
			||||||
 | 
							esac
 | 
				
			||||||
 | 
						done < /proc/cgroups
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start()
 | 
					start()
 | 
				
			||||||
@@ -90,6 +101,11 @@ start()
 | 
				
			|||||||
	retval=$?
 | 
						retval=$?
 | 
				
			||||||
	if [ $retval -eq 0 ]; then
 | 
						if [ $retval -eq 0 ]; then
 | 
				
			||||||
		mount_misc
 | 
							mount_misc
 | 
				
			||||||
 | 
							retval=$?
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						if [ $retval -eq 0 ]; then
 | 
				
			||||||
 | 
							mount_cgroups
 | 
				
			||||||
 | 
							retval=$?
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	return $retval
 | 
						return $retval
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,8 +9,8 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
depend()
 | 
					depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	keyword -openvz -prefix -uml -vserver -xenu
 | 
						keyword -lxc -openvz -prefix -uml -vserver -xenu
 | 
				
			||||||
	need root
 | 
						use root
 | 
				
			||||||
	after bootmisc
 | 
						after bootmisc
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -35,7 +35,7 @@ start()
 | 
				
			|||||||
	done
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Save the encoding for use immediately at boot
 | 
						# Save the encoding for use immediately at boot
 | 
				
			||||||
	if [ -w "$RC_LIBEXECDIR" ]; then
 | 
						if checkpath -W "$RC_LIBEXECDIR"; then
 | 
				
			||||||
		mkdir -p "$RC_LIBEXECDIR"/console
 | 
							mkdir -p "$RC_LIBEXECDIR"/console
 | 
				
			||||||
		if yesno ${unicode:-${UNICODE}}; then
 | 
							if yesno ${unicode:-${UNICODE}}; then
 | 
				
			||||||
			echo "" > "$RC_LIBEXECDIR"/console/unicode
 | 
								echo "" > "$RC_LIBEXECDIR"/console/unicode
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										18
									
								
								init.d/tmpfiles.setup.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								init.d/tmpfiles.setup.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					#!@PREFIX@/sbin/runscript
 | 
				
			||||||
 | 
					# Copyright 1999-2012 Gentoo Foundation
 | 
				
			||||||
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					description="set up tmpfiles.d entries"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					depend()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						need localmount
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ebegin "setting up tmpfiles.d entries"
 | 
				
			||||||
 | 
						@LIBEXECDIR@/sh/tmpfiles.sh --create --remove ${tmpfiles_opts}
 | 
				
			||||||
 | 
						eend $?
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,13 +2,13 @@
 | 
				
			|||||||
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
					# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
				
			||||||
# Released under the 2-clause BSD license.
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: ${urandom_seed:=${URANDOM_SEED:-/var/run/random-seed}}
 | 
					: ${urandom_seed:=${URANDOM_SEED:-/var/lib/misc/random-seed}}
 | 
				
			||||||
description="Initializes the random number generator."
 | 
					description="Initializes the random number generator."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
depend()
 | 
					depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	need localmount
 | 
						need localmount
 | 
				
			||||||
	keyword -jail -openvz -prefix
 | 
						keyword -jail -lxc -openvz -prefix
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
save_seed()
 | 
					save_seed()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,7 +46,7 @@ Show all runlevels and their services.
 | 
				
			|||||||
List all services that have crashed.
 | 
					List all services that have crashed.
 | 
				
			||||||
.It Fl l , -list
 | 
					.It Fl l , -list
 | 
				
			||||||
List all defined runlevels.
 | 
					List all defined runlevels.
 | 
				
			||||||
.It fl r , -runlevel
 | 
					.It Fl r , -runlevel
 | 
				
			||||||
Print the current runlevel name.
 | 
					Print the current runlevel name.
 | 
				
			||||||
.It Fl s , -servicelist
 | 
					.It Fl s , -servicelist
 | 
				
			||||||
Show all services.
 | 
					Show all services.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@
 | 
				
			|||||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
					.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
				
			||||||
.\" SUCH DAMAGE.
 | 
					.\" SUCH DAMAGE.
 | 
				
			||||||
.\"
 | 
					.\"
 | 
				
			||||||
.Dd November 4, 2009
 | 
					.Dd December 31, 2011
 | 
				
			||||||
.Dt RUNSCRIPT 8 SMM
 | 
					.Dt RUNSCRIPT 8 SMM
 | 
				
			||||||
.Os OpenRC
 | 
					.Os OpenRC
 | 
				
			||||||
.Sh NAME
 | 
					.Sh NAME
 | 
				
			||||||
@@ -32,11 +32,12 @@
 | 
				
			|||||||
.Op Fl D , -nodeps
 | 
					.Op Fl D , -nodeps
 | 
				
			||||||
.Op Fl d , -debug
 | 
					.Op Fl d , -debug
 | 
				
			||||||
.Op Fl s , -ifstarted
 | 
					.Op Fl s , -ifstarted
 | 
				
			||||||
 | 
					.Op Fl S , -ifstopped
 | 
				
			||||||
.Op Fl Z , -dry-run
 | 
					.Op Fl Z , -dry-run
 | 
				
			||||||
.Op Ar command ...
 | 
					.Op Ar command ...
 | 
				
			||||||
.Sh DESCRIPTION
 | 
					.Sh DESCRIPTION
 | 
				
			||||||
.Nm
 | 
					.Nm
 | 
				
			||||||
is basically an interpreter for shell scripts which provide an easy interface
 | 
					is basically an interpreter for shell scripts which provides an easy interface
 | 
				
			||||||
to the often complex system commands and daemons.
 | 
					to the often complex system commands and daemons.
 | 
				
			||||||
When a service runs a command it first loads its multiplexed configuration
 | 
					When a service runs a command it first loads its multiplexed configuration
 | 
				
			||||||
file, then its master configuration file, then
 | 
					file, then its master configuration file, then
 | 
				
			||||||
@@ -76,6 +77,8 @@ Set xtrace on in the shell to assist in debugging.
 | 
				
			|||||||
Ignore all dependency information the service supplies.
 | 
					Ignore all dependency information the service supplies.
 | 
				
			||||||
.It Fl s , -ifstarted
 | 
					.It Fl s , -ifstarted
 | 
				
			||||||
Only run the command if the service has been started.
 | 
					Only run the command if the service has been started.
 | 
				
			||||||
 | 
					.It Fl S , -ifstopped
 | 
				
			||||||
 | 
					Only run the command if the service has been stopped.
 | 
				
			||||||
.It Fl q , -quiet
 | 
					.It Fl q , -quiet
 | 
				
			||||||
Turns off all informational output the service generates.
 | 
					Turns off all informational output the service generates.
 | 
				
			||||||
Output from any non OpenRC commands is not affected.
 | 
					Output from any non OpenRC commands is not affected.
 | 
				
			||||||
@@ -89,7 +92,8 @@ or stopping them.
 | 
				
			|||||||
The following variables affect the service script:
 | 
					The following variables affect the service script:
 | 
				
			||||||
.Bl -tag -width "RC_DEFAULTLEVEL"
 | 
					.Bl -tag -width "RC_DEFAULTLEVEL"
 | 
				
			||||||
.It Ar extra_commands
 | 
					.It Ar extra_commands
 | 
				
			||||||
Space separated list of extra commands the service defines.
 | 
					Space separated list of extra commands the service defines. These should
 | 
				
			||||||
 | 
					not depend on the service being stopped or started.
 | 
				
			||||||
.It Ar extra_started_commands
 | 
					.It Ar extra_started_commands
 | 
				
			||||||
Space separated list of extra commands the service defines. These only work if
 | 
					Space separated list of extra commands the service defines. These only work if
 | 
				
			||||||
the service has already been started.
 | 
					the service has already been started.
 | 
				
			||||||
@@ -99,17 +103,31 @@ the service has already been stopped.
 | 
				
			|||||||
.It Ar description
 | 
					.It Ar description
 | 
				
			||||||
String describing the service.
 | 
					String describing the service.
 | 
				
			||||||
.It Ar description_$command
 | 
					.It Ar description_$command
 | 
				
			||||||
String describing the extra command the.
 | 
					String describing the extra command.
 | 
				
			||||||
 | 
					.It Ar start_stop_daemon_args
 | 
				
			||||||
 | 
					List of arguments passed to start-stop-daemon when starting the daemon.
 | 
				
			||||||
.It Ar command
 | 
					.It Ar command
 | 
				
			||||||
Daemon to start or stop via
 | 
					Daemon to start or stop via
 | 
				
			||||||
.Nm start-stop-daemon
 | 
					.Nm start-stop-daemon
 | 
				
			||||||
if no start or stop function is defined by the service.
 | 
					if no start or stop function is defined by the service.
 | 
				
			||||||
.It Ar command_args
 | 
					.It Ar command_args
 | 
				
			||||||
List of arguments to pass to the daemon when starting.
 | 
					List of arguments to pass to the daemon when starting.
 | 
				
			||||||
 | 
					.It Ar command_background
 | 
				
			||||||
 | 
					Set this to "true", "yes" or "1" (case-insensitive) to force the daemon into
 | 
				
			||||||
 | 
					the background. This implies the "--make-pidfile" and "--pidfile" option of
 | 
				
			||||||
 | 
					.Xr start-stop-daemon 8
 | 
				
			||||||
 | 
					so the pidfile variable must be set.
 | 
				
			||||||
.It Ar pidfile
 | 
					.It Ar pidfile
 | 
				
			||||||
Pidfile to use for the above defined command.
 | 
					Pidfile to use for the above defined command.
 | 
				
			||||||
.It Ar name
 | 
					.It Ar name
 | 
				
			||||||
Display name used for the above defined command.
 | 
					Display name used for the above defined command.
 | 
				
			||||||
 | 
					.It Ar retry
 | 
				
			||||||
 | 
					Retry schedule to use when stopping the daemon. It can either be a
 | 
				
			||||||
 | 
					timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5).
 | 
				
			||||||
 | 
					.It Ar required_dirs
 | 
				
			||||||
 | 
					A list of directories which must exist for the service to start.
 | 
				
			||||||
 | 
					.It Ar required_files
 | 
				
			||||||
 | 
					A list of files which must exist for the service to start.
 | 
				
			||||||
.El
 | 
					.El
 | 
				
			||||||
.Sh DEPENDENCIES
 | 
					.Sh DEPENDENCIES
 | 
				
			||||||
You should define a
 | 
					You should define a
 | 
				
			||||||
@@ -138,11 +156,11 @@ We provide this virtual service. For example, named provides dns.
 | 
				
			|||||||
.It Ic config
 | 
					.It Ic config
 | 
				
			||||||
We should recalculate our dependencies if the listed files have changed.
 | 
					We should recalculate our dependencies if the listed files have changed.
 | 
				
			||||||
.It Ic keyword
 | 
					.It Ic keyword
 | 
				
			||||||
Tags a service with a keyword. Here's the keywords we currently understand:-
 | 
					Tags a service with a keyword. These are the keywords we currently understand:
 | 
				
			||||||
.Bl -tag -width indent
 | 
					.Bl -tag -width indent
 | 
				
			||||||
.It Dv -shutdown
 | 
					.It Dv -shutdown
 | 
				
			||||||
Don't stop this service when shutting the system down.
 | 
					Don't stop this service when shutting the system down.
 | 
				
			||||||
This normally quite safe as remaining daemons will be sent a SIGTERM just
 | 
					This is normally quite safe as remaining daemons will be sent a SIGTERM just
 | 
				
			||||||
before final shutdown.
 | 
					before final shutdown.
 | 
				
			||||||
Network related services such as the network and dhcpcd init scripts normally
 | 
					Network related services such as the network and dhcpcd init scripts normally
 | 
				
			||||||
have this keyword.
 | 
					have this keyword.
 | 
				
			||||||
@@ -224,7 +242,7 @@ seconds until all files exist.
 | 
				
			|||||||
Returns 0 if all files exist, otherwise non zero.
 | 
					Returns 0 if all files exist, otherwise non zero.
 | 
				
			||||||
If
 | 
					If
 | 
				
			||||||
.Ar timeout
 | 
					.Ar timeout
 | 
				
			||||||
is less then 1 then we wait indefinitely.
 | 
					is less than 1 then we wait indefinitely.
 | 
				
			||||||
.It Ic is_newer_than Ar file1 Ar file2 ...
 | 
					.It Ic is_newer_than Ar file1 Ar file2 ...
 | 
				
			||||||
If
 | 
					If
 | 
				
			||||||
.Ar file1
 | 
					.Ar file1
 | 
				
			||||||
@@ -291,14 +309,22 @@ Mark the service as coldplugged.
 | 
				
			|||||||
Mark the service as inactive.
 | 
					Mark the service as inactive.
 | 
				
			||||||
.It Xo
 | 
					.It Xo
 | 
				
			||||||
.Ic checkpath
 | 
					.Ic checkpath
 | 
				
			||||||
 | 
					.Op Fl D , -directory-truncate
 | 
				
			||||||
.Op Fl d , -directory
 | 
					.Op Fl d , -directory
 | 
				
			||||||
 | 
					.Op Fl F , -file-truncate
 | 
				
			||||||
.Op Fl f , -file
 | 
					.Op Fl f , -file
 | 
				
			||||||
 | 
					.Op Fl p , -pipe
 | 
				
			||||||
.Op Fl m , -mode Ar mode
 | 
					.Op Fl m , -mode Ar mode
 | 
				
			||||||
.Op Fl o , owner Ar owner
 | 
					.Op Fl o , owner Ar owner
 | 
				
			||||||
.Ar path ...
 | 
					.Ar path ...
 | 
				
			||||||
.Xc
 | 
					.Xc
 | 
				
			||||||
Checks to see if the path exists, is of the right type, owned by the right
 | 
					Checks to see if the path exists, is of the right type, owned by the right
 | 
				
			||||||
people and has the correct access modes. If not, then it corrects the path.
 | 
					people and has the correct access modes. If not, then it corrects the path.
 | 
				
			||||||
 | 
					.It Ic checkpath
 | 
				
			||||||
 | 
					.Op Fl W , -writable
 | 
				
			||||||
 | 
					.Ar path
 | 
				
			||||||
 | 
					.Xc
 | 
				
			||||||
 | 
					checks to see if the path is writable.
 | 
				
			||||||
.It Ic yesno Ar value
 | 
					.It Ic yesno Ar value
 | 
				
			||||||
If
 | 
					If
 | 
				
			||||||
.Ar value
 | 
					.Ar value
 | 
				
			||||||
@@ -311,7 +337,14 @@ sets the following environment variables for use in the service scripts:
 | 
				
			|||||||
.It Va RC_SVCNAME
 | 
					.It Va RC_SVCNAME
 | 
				
			||||||
Name of the service.
 | 
					Name of the service.
 | 
				
			||||||
.It Va RC_RUNLEVEL
 | 
					.It Va RC_RUNLEVEL
 | 
				
			||||||
Current runlevel that rc is in.
 | 
					Current runlevel that rc is in. Note that, in OpenRC, the reboot
 | 
				
			||||||
 | 
					runlevel is mapped to the shutdown runlevel. This was done because most
 | 
				
			||||||
 | 
					services do not need to know if a system is shutting down or rebooting.
 | 
				
			||||||
 | 
					If you are writing a service that does need to know this, see the
 | 
				
			||||||
 | 
					RC_REBOOT variable.
 | 
				
			||||||
 | 
					.It Va RC_REBOOT
 | 
				
			||||||
 | 
					This variable contains YES if the system is rebooting. If your service
 | 
				
			||||||
 | 
					needs to know the system is rebooting, you should test this variable.
 | 
				
			||||||
.It Va RC_BOOTLEVEL
 | 
					.It Va RC_BOOTLEVEL
 | 
				
			||||||
Boot runlevel chosen. Default is boot.
 | 
					Boot runlevel chosen. Default is boot.
 | 
				
			||||||
.It Va RC_DEFAULTLEVEL
 | 
					.It Va RC_DEFAULTLEVEL
 | 
				
			||||||
@@ -319,8 +352,14 @@ Default runlevel chosen. Default is default.
 | 
				
			|||||||
.It Va RC_SYS
 | 
					.It Va RC_SYS
 | 
				
			||||||
A special variable to describe the system more.
 | 
					A special variable to describe the system more.
 | 
				
			||||||
Possible values are OPENVZ, XENU, XEN0, UML and VSERVER.
 | 
					Possible values are OPENVZ, XENU, XEN0, UML and VSERVER.
 | 
				
			||||||
 | 
					.It Va RC_PREFIX
 | 
				
			||||||
 | 
					In a Gentoo Prefix installation, this variable contains the prefix
 | 
				
			||||||
 | 
					offset. Otherwise it is undefined.
 | 
				
			||||||
.It Va RC_UNAME
 | 
					.It Va RC_UNAME
 | 
				
			||||||
The result of `uname -s`.
 | 
					The result of `uname -s`.
 | 
				
			||||||
 | 
					.It Va RC_CMD
 | 
				
			||||||
 | 
					This contains the name of the command the service script is executing, such
 | 
				
			||||||
 | 
					as start, stop, restart etc.
 | 
				
			||||||
.El
 | 
					.El
 | 
				
			||||||
.Sh FILES
 | 
					.Sh FILES
 | 
				
			||||||
.Pp
 | 
					.Pp
 | 
				
			||||||
@@ -359,7 +398,7 @@ rc_net_tap1_provide="!net"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# It's also possible to negate keywords. This is mainly useful for prefix
 | 
					# It's also possible to negate keywords. This is mainly useful for prefix
 | 
				
			||||||
# users testing OpenRC.
 | 
					# users testing OpenRC.
 | 
				
			||||||
rc_keyword="!noprefix"
 | 
					rc_keyword="!-prefix"
 | 
				
			||||||
.Ed
 | 
					.Ed
 | 
				
			||||||
.Sh EXAMPLES
 | 
					.Sh EXAMPLES
 | 
				
			||||||
.Pp
 | 
					.Pp
 | 
				
			||||||
@@ -408,8 +447,22 @@ depend()
 | 
				
			|||||||
    need ${_need}
 | 
					    need ${_need}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This function does any pre-start setup. If it fails, the service will
 | 
				
			||||||
 | 
					# not be started.
 | 
				
			||||||
 | 
					# If you need this function to behave differently for a restart command,
 | 
				
			||||||
 | 
					# you should check the value of RC_CMD for "restart".
 | 
				
			||||||
 | 
					# This also applies to start_post, stop_pre and stop_post.
 | 
				
			||||||
start_pre()
 | 
					start_pre()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						if [ "$RC_CMD" = restart ]; then
 | 
				
			||||||
 | 
							# This block will only execute for a restart command. Use a
 | 
				
			||||||
 | 
							# structure like this if you need special processing for a
 | 
				
			||||||
 | 
							# restart which you do not need for a normal start.
 | 
				
			||||||
 | 
							# The function can also fail from here, which will mean that a
 | 
				
			||||||
 | 
							# restart can fail.
 | 
				
			||||||
 | 
							# This logic can also be used in start_post, stop_pre and
 | 
				
			||||||
 | 
							# stop_post.
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
    # Ensure that our dirs are correct
 | 
					    # Ensure that our dirs are correct
 | 
				
			||||||
    checkpath --dir --owner foo:foo --mode 0664 \\
 | 
					    checkpath --dir --owner foo:foo --mode 0664 \\
 | 
				
			||||||
	/var/run/foo /var/cache/foo
 | 
						/var/run/foo /var/cache/foo
 | 
				
			||||||
@@ -465,6 +518,12 @@ show()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.Ed
 | 
					.Ed
 | 
				
			||||||
.Sh BUGS
 | 
					.Sh BUGS
 | 
				
			||||||
 | 
					Because of the way we load our configuration files and the need to handle
 | 
				
			||||||
 | 
					more than one service directory, you can only use symlinks in service
 | 
				
			||||||
 | 
					directories to other services in the same directory.
 | 
				
			||||||
 | 
					You cannot symlink to a service in a different directory even if it is
 | 
				
			||||||
 | 
					another service directory.
 | 
				
			||||||
 | 
					.Pp
 | 
				
			||||||
is_older_than should return 0 on success.
 | 
					is_older_than should return 0 on success.
 | 
				
			||||||
Instead we return 1 to be compliant with Gentoo baselayout.
 | 
					Instead we return 1 to be compliant with Gentoo baselayout.
 | 
				
			||||||
Users are encouraged to use the is_newer_than function which returns correctly.
 | 
					Users are encouraged to use the is_newer_than function which returns correctly.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -162,9 +162,8 @@ but with the standard error output.
 | 
				
			|||||||
These options are only used for stopping daemons:
 | 
					These options are only used for stopping daemons:
 | 
				
			||||||
.Bl -tag -width indent
 | 
					.Bl -tag -width indent
 | 
				
			||||||
.It Fl R , -retry Ar timeout | Ar signal Ns / Ns Ar timeout
 | 
					.It Fl R , -retry Ar timeout | Ar signal Ns / Ns Ar timeout
 | 
				
			||||||
You can either specify a timeout in seconds or a multiple signal/timeout
 | 
					The retry specification can be either a timeout in seconds or multiple
 | 
				
			||||||
pairs as a stopping schedule.
 | 
					signal/timeout pairs (like SIGTERM/5).
 | 
				
			||||||
If not specified then a default value of SIGTERM/5 is assumed.
 | 
					 | 
				
			||||||
.El
 | 
					.El
 | 
				
			||||||
.Sh ENVIRONMENT
 | 
					.Sh ENVIRONMENT
 | 
				
			||||||
.Va SSD_NICELEVEL
 | 
					.Va SSD_NICELEVEL
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,5 +4,5 @@
 | 
				
			|||||||
SFX=		.Linux.in
 | 
					SFX=		.Linux.in
 | 
				
			||||||
PKG_PREFIX?=	/usr
 | 
					PKG_PREFIX?=	/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CPPFLAGS+=	-D_BSD_SOURCE -D_XOPEN_SOURCE=600
 | 
					CPPFLAGS+=	-D_BSD_SOURCE -D_XOPEN_SOURCE=700
 | 
				
			||||||
LIBDL=		-Wl,-Bdynamic -ldl
 | 
					LIBDL=		-Wl,-Bdynamic -ldl
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								mk/os-prefix.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								mk/os-prefix.mk
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					# Copyright (c) 2012 William Hubbs <w.d.hubbs@gmail.com>
 | 
				
			||||||
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq (${MKPREFIX},yes)
 | 
				
			||||||
 | 
					CPPFLAGS+=	-DPREFIX
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
							
								
								
									
										1
									
								
								mk/os.mk
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								mk/os.mk
									
									
									
									
									
								
							@@ -7,5 +7,6 @@ _OS_SH=		uname -s
 | 
				
			|||||||
_OS:= 		$(shell ${_OS_SH})
 | 
					_OS:= 		$(shell ${_OS_SH})
 | 
				
			||||||
OS?= 		${_OS}
 | 
					OS?= 		${_OS}
 | 
				
			||||||
include ${MK}/os-${OS}.mk
 | 
					include ${MK}/os-${OS}.mk
 | 
				
			||||||
 | 
					include ${MK}/os-prefix.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RC_LIB=		/$(LIBNAME)/rc
 | 
					RC_LIB=		/$(LIBNAME)/rc
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@ _PKG_SED:=		$(shell ${_PKG_SED_SH})
 | 
				
			|||||||
_LCL_SED_SH=		if test "${PREFIX}" = "${LOCAL_PREFIX}"; then echo "-e 's:@LOCAL_PREFIX@::g'"; else echo "-e 's:@LOCAL_PREFIX@:${LOCAL_PREFIX}:g'"; fi
 | 
					_LCL_SED_SH=		if test "${PREFIX}" = "${LOCAL_PREFIX}"; then echo "-e 's:@LOCAL_PREFIX@::g'"; else echo "-e 's:@LOCAL_PREFIX@:${LOCAL_PREFIX}:g'"; fi
 | 
				
			||||||
_LCL_SED:=		$(shell ${_LCL_SED_SH})
 | 
					_LCL_SED:=		$(shell ${_LCL_SED_SH})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SED_REPLACE=		-e 's:@SHELL@:${SH}:g' -e 's:@LIB@:${LIBNAME}:g' -e 's:@SYSCONFDIR@:${SYSCONFDIR}:g' -e 's:@LIBEXECDIR@:${LIBEXECDIR}:g' -e 's:@PREFIX@:${PREFIX}:g' -e 's:@RC_SYS_DEFAULT@:${MKRCSYS}:g' ${_PKG_SED} ${_LCL_SED}
 | 
					SED_REPLACE=		-e 's:@SHELL@:${SH}:g' -e 's:@LIB@:${LIBNAME}:g' -e 's:@SYSCONFDIR@:${SYSCONFDIR}:g' -e 's:@LIBEXECDIR@:${LIBEXECDIR}:g' -e 's:@PREFIX@:${PREFIX}:g' ${_PKG_SED} ${_LCL_SED}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Tweak our shell scripts
 | 
					# Tweak our shell scripts
 | 
				
			||||||
%.sh: %.sh.in
 | 
					%.sh: %.sh.in
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								mk/sys.mk
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								mk/sys.mk
									
									
									
									
									
								
							@@ -11,9 +11,14 @@ SED?=			sed
 | 
				
			|||||||
SH=			/bin/sh
 | 
					SH=			/bin/sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PREFIX?=
 | 
					PREFIX?=
 | 
				
			||||||
_UPREFIX_SH=		case "${PREFIX}" in "") echo /usr;; *) echo "${PREFIX}";; esac
 | 
					ifeq (${PREFIX},)
 | 
				
			||||||
_UPREFIX:=		$(shell ${_UPREFIX_SH})
 | 
					UPREFIX= /usr
 | 
				
			||||||
UPREFIX=		${_UPREFIX}
 | 
					else
 | 
				
			||||||
 | 
					UPREFIX= ${PREFIX}
 | 
				
			||||||
 | 
					ifeq (${MKPREFIX},yes)
 | 
				
			||||||
 | 
					UPREFIX= ${PREFIX}/usr
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
LOCAL_PREFIX=		/usr/local
 | 
					LOCAL_PREFIX=		/usr/local
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PICFLAG?=		-fPIC
 | 
					PICFLAG?=		-fPIC
 | 
				
			||||||
@@ -22,6 +27,7 @@ SYSCONFDIR?=		${PREFIX}/etc
 | 
				
			|||||||
INITDIR?=		${SYSCONFDIR}/init.d
 | 
					INITDIR?=		${SYSCONFDIR}/init.d
 | 
				
			||||||
CONFDIR?=		${SYSCONFDIR}/conf.d
 | 
					CONFDIR?=		${SYSCONFDIR}/conf.d
 | 
				
			||||||
LOCALDIR?=		${SYSCONFDIR}/local.d
 | 
					LOCALDIR?=		${SYSCONFDIR}/local.d
 | 
				
			||||||
 | 
					SYSCTLDIR?=		${SYSCONFDIR}/sysctl.d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BINDIR?=		${PREFIX}/sbin
 | 
					BINDIR?=		${PREFIX}/sbin
 | 
				
			||||||
BINMODE?=		0755
 | 
					BINMODE?=		0755
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,7 @@ SRCS-Linux=	iwconfig.sh.in
 | 
				
			|||||||
INC-Linux=	adsl.sh apipa.sh arping.sh bonding.sh br2684ctl.sh bridge.sh \
 | 
					INC-Linux=	adsl.sh apipa.sh arping.sh bonding.sh br2684ctl.sh bridge.sh \
 | 
				
			||||||
		ccwgroup.sh clip.sh ethtool.sh iproute2.sh ifplugd.sh ip6to4.sh \
 | 
							ccwgroup.sh clip.sh ethtool.sh iproute2.sh ifplugd.sh ip6to4.sh \
 | 
				
			||||||
		ipppd.sh iwconfig.sh netplugd.sh pppd.sh pump.sh tuntap.sh udhcpc.sh \
 | 
							ipppd.sh iwconfig.sh netplugd.sh pppd.sh pump.sh tuntap.sh udhcpc.sh \
 | 
				
			||||||
		vlan.sh macvlan.sh
 | 
							vlan.sh macvlan.sh ip6rd.sh firewalld.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SRCS-NetBSD=
 | 
					SRCS-NetBSD=
 | 
				
			||||||
INC-NetBSD=	ifwatchd.sh
 | 
					INC-NetBSD=	ifwatchd.sh
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,12 @@
 | 
				
			|||||||
bonding_depend()
 | 
					bonding_depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	before interface macchanger
 | 
						before interface macchanger
 | 
				
			||||||
 | 
						program /sbin/ifconfig /bin/ifconfig
 | 
				
			||||||
 | 
						# If you do not have sysfs, you MUST have this binary instead for ioctl
 | 
				
			||||||
 | 
						# Also you will loose some functionality that cannot be done via sysfs:
 | 
				
			||||||
 | 
						if [ ! -d /sys/class/net ]; then
 | 
				
			||||||
 | 
							program /sbin/ifenslave
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_config_vars="$_config_vars slaves"
 | 
					_config_vars="$_config_vars slaves"
 | 
				
			||||||
@@ -23,6 +29,9 @@ bonding_pre_start()
 | 
				
			|||||||
	eval primary="\$primary_${IFVAR}"
 | 
						eval primary="\$primary_${IFVAR}"
 | 
				
			||||||
	unset primary_${IFVAR}
 | 
						unset primary_${IFVAR}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						eval subsume="\$subsume_${IFVAR}"
 | 
				
			||||||
 | 
						unset subsume_${IFVAR}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[ -z "${slaves}" ] && return 0
 | 
						[ -z "${slaves}" ] && return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -34,6 +43,10 @@ bonding_pre_start()
 | 
				
			|||||||
		fi
 | 
							fi
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ ! -d /sys/class/net ]; then
 | 
				
			||||||
 | 
							ewarn "sysfs is not available! You will be unable to create new bonds, or change dynamic parameters!"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# We can create the interface name we like now, but this
 | 
						# We can create the interface name we like now, but this
 | 
				
			||||||
	# requires sysfs
 | 
						# requires sysfs
 | 
				
			||||||
	if ! _exists && [ -d /sys/class/net ]; then
 | 
						if ! _exists && [ -d /sys/class/net ]; then
 | 
				
			||||||
@@ -51,7 +64,18 @@ bonding_pre_start()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	# Configure the bond mode, then we can reloop to ensure we configure
 | 
						# Configure the bond mode, then we can reloop to ensure we configure
 | 
				
			||||||
	# All other options
 | 
						# All other options
 | 
				
			||||||
	for x in /sys/class/net/"${IFACE}"/bonding/mode; do
 | 
						[ -d /sys/class/net ] && for x in /sys/class/net/"${IFACE}"/bonding/mode; do
 | 
				
			||||||
 | 
							[ -f "${x}" ] || continue
 | 
				
			||||||
 | 
							n=${x##*/}
 | 
				
			||||||
 | 
							eval s=\$${n}_${IFVAR}
 | 
				
			||||||
 | 
							if [ -n "${s}" ]; then
 | 
				
			||||||
 | 
								einfo "Setting ${n}: ${s}"
 | 
				
			||||||
 | 
								echo "${s}" >"${x}" || \
 | 
				
			||||||
 | 
								eerror "Failed to configure $n (${n}_${IFVAR})"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
						# Configure link monitoring
 | 
				
			||||||
 | 
						for x in /sys/class/net/"${IFACE}"/bonding/miimon; do
 | 
				
			||||||
		[ -f "${x}" ] || continue
 | 
							[ -f "${x}" ] || continue
 | 
				
			||||||
		n=${x##*/}
 | 
							n=${x##*/}
 | 
				
			||||||
		eval s=\$${n}_${IFVAR}
 | 
							eval s=\$${n}_${IFVAR}
 | 
				
			||||||
@@ -62,11 +86,11 @@ bonding_pre_start()
 | 
				
			|||||||
		fi
 | 
							fi
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
	# Nice and dynamic for remaining options:)
 | 
						# Nice and dynamic for remaining options:)
 | 
				
			||||||
	for x in /sys/class/net/"${IFACE}"/bonding/*; do
 | 
						[ -d /sys/class/net ] && for x in /sys/class/net/"${IFACE}"/bonding/*; do
 | 
				
			||||||
		[ -f "${x}" ] || continue
 | 
							[ -f "${x}" ] || continue
 | 
				
			||||||
		n=${x##*/}
 | 
							n=${x##*/}
 | 
				
			||||||
		eval s=\$${n}_${IFVAR}
 | 
							eval s=\$${n}_${IFVAR}
 | 
				
			||||||
		[ "${n}" != "mode" ] || continue
 | 
							[ "${n}" != "mode" -o "${n}" != "miimon" ] || continue
 | 
				
			||||||
		if [ -n "${s}" ]; then
 | 
							if [ -n "${s}" ]; then
 | 
				
			||||||
			einfo "Setting ${n}: ${s}"
 | 
								einfo "Setting ${n}: ${s}"
 | 
				
			||||||
			echo "${s}" >"${x}" || \
 | 
								echo "${s}" >"${x}" || \
 | 
				
			||||||
@@ -84,32 +108,73 @@ bonding_pre_start()
 | 
				
			|||||||
		_exists true || return 1
 | 
							_exists true || return 1
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Must force the slaves to a particular state before adding them
 | 
						# Unless we are subsuming an existing interface (NFS root), we down
 | 
				
			||||||
 | 
						# slave interfaces to work around bugs supposedly in some chipsets
 | 
				
			||||||
 | 
						# that cause failure to enslave from other states.
 | 
				
			||||||
 | 
						if [ -z "${subsume}" ]; then
 | 
				
			||||||
		for IFACE in ${slaves}; do
 | 
							for IFACE in ${slaves}; do
 | 
				
			||||||
			_delete_addresses
 | 
								_delete_addresses
 | 
				
			||||||
			_down
 | 
								_down
 | 
				
			||||||
		done
 | 
							done
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# now force the master to up
 | 
						# Now force the master to up
 | 
				
			||||||
 | 
						#  - First test for interface subsume request (required for NFS root)
 | 
				
			||||||
 | 
						if [ -n "${subsume}" ]; then
 | 
				
			||||||
 | 
							einfo "Subsuming ${subsume} interface characteristics."
 | 
				
			||||||
 | 
							eindent
 | 
				
			||||||
 | 
							local oiface=${IFACE}
 | 
				
			||||||
 | 
							IFACE=${subsume}
 | 
				
			||||||
 | 
							local addr="$(_get_inet_address)"
 | 
				
			||||||
 | 
							einfo "address: ${addr}"
 | 
				
			||||||
 | 
							IFACE=${oiface}
 | 
				
			||||||
 | 
							unset oiface
 | 
				
			||||||
 | 
							eoutdent
 | 
				
			||||||
 | 
							# subsume (presumably kernel auto-)configured IP
 | 
				
			||||||
 | 
							ifconfig ${IFACE} ${addr} up
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							# warn if root on nfs and no subsume interface supplied
 | 
				
			||||||
 | 
							local root_fs_type=$(mountinfo -s /)
 | 
				
			||||||
 | 
							if [ "${root_fs_type}" == "nfs" ]; then
 | 
				
			||||||
 | 
								warn_nfs=1
 | 
				
			||||||
 | 
								ewarn "NFS root detected!!!"
 | 
				
			||||||
 | 
								ewarn " If your system crashes here, /etc/conf.d/net needs"
 | 
				
			||||||
 | 
								ewarn " subsume_${IFACE}=\"<iface>\" ... where <iface> is the"
 | 
				
			||||||
 | 
								ewarn " existing, (usually kernel auto-)configured interface."
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							# up the interface
 | 
				
			||||||
		_up
 | 
							_up
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# finally add in slaves
 | 
						# finally add in slaves
 | 
				
			||||||
 | 
						# things needed in the process, and if they are done by ifenslave, openrc, and/or the kernel.
 | 
				
			||||||
 | 
						# down new slave interface: ifenslave, openrc
 | 
				
			||||||
 | 
						# set mtu: ifenslave, kernel
 | 
				
			||||||
 | 
						# set slave MAC: ifenslave, kernel
 | 
				
			||||||
	eoutdent
 | 
						eoutdent
 | 
				
			||||||
	if [ -d /sys/class/net ]; then
 | 
						if [ -d /sys/class/net ]; then
 | 
				
			||||||
		sys_bonding_path=/sys/class/net/"${IFACE}"/bonding
 | 
							sys_bonding_path=/sys/class/net/"${IFACE}"/bonding
 | 
				
			||||||
 | 
							local oiface
 | 
				
			||||||
 | 
							oiface=$IFACE
 | 
				
			||||||
		if [ -n "${primary}" ]; then
 | 
							if [ -n "${primary}" ]; then
 | 
				
			||||||
 | 
								IFACE=$primary
 | 
				
			||||||
 | 
								_down
 | 
				
			||||||
 | 
								IFACE=$oiface
 | 
				
			||||||
			echo "+${primary}" >$sys_bonding_path/slaves
 | 
								echo "+${primary}" >$sys_bonding_path/slaves
 | 
				
			||||||
			echo "${primary}" >$sys_bonding_path/primary
 | 
								echo "${primary}" >$sys_bonding_path/primary
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
		for s in ${slaves}; do
 | 
							for s in ${slaves}; do
 | 
				
			||||||
			[ "${s}" = "${primary}" ] && continue
 | 
								[ "${s}" = "${primary}" ] && continue
 | 
				
			||||||
			if ! grep -q ${s} $sys_bonding_path/slaves; then
 | 
								if ! grep -q ${s} $sys_bonding_path/slaves; then
 | 
				
			||||||
 | 
									IFACE=$s
 | 
				
			||||||
 | 
									_down
 | 
				
			||||||
 | 
									IFACE=$oiface
 | 
				
			||||||
				echo "+${s}" >$sys_bonding_path/slaves
 | 
									echo "+${s}" >$sys_bonding_path/slaves
 | 
				
			||||||
			fi
 | 
								fi
 | 
				
			||||||
		done
 | 
							done
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		/sbin/ifenslave "${IFACE}" ${slaves} >/dev/null
 | 
							ifenslave "${IFACE}" ${slaves} >/dev/null
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	eend $?
 | 
						eend $?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -120,6 +185,11 @@ bonding_stop()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	_is_bond || return 0
 | 
						_is_bond || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Wipe subsumed interface
 | 
				
			||||||
 | 
						if [ -n "${subsume}" ]; then
 | 
				
			||||||
 | 
							ifconfig ${subsume} 0.0.0.0
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local slaves= s=
 | 
						local slaves= s=
 | 
				
			||||||
	slaves=$( \
 | 
						slaves=$( \
 | 
				
			||||||
		sed -n -e 's/^Slave Interface: //p' "/proc/net/bonding/${IFACE}" \
 | 
							sed -n -e 's/^Slave Interface: //p' "/proc/net/bonding/${IFACE}" \
 | 
				
			||||||
@@ -137,7 +207,7 @@ bonding_stop()
 | 
				
			|||||||
			echo -"${s}" > /sys/class/net/"${IFACE}"/bonding/slaves
 | 
								echo -"${s}" > /sys/class/net/"${IFACE}"/bonding/slaves
 | 
				
			||||||
		done
 | 
							done
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		/sbin/ifenslave -d "${IFACE}" ${slaves}
 | 
							ifenslave -d "${IFACE}" ${slaves}
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# reset all slaves
 | 
						# reset all slaves
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,19 +1,10 @@
 | 
				
			|||||||
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
 | 
					# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
 | 
				
			||||||
# Released under the 2-clause BSD license.
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_br2684ctl()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if [ -x /usr/sbin/br2684ctl ]; then
 | 
					 | 
				
			||||||
		echo /usr/sbin/br2684ctl
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		echo /sbin/br2684ctl
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
br2684ctl_depend()
 | 
					br2684ctl_depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	before ppp
 | 
						before ppp
 | 
				
			||||||
	program start $(_br2684ctl)
 | 
						program start br2684ctl
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_config_vars="$_config_vars bridge bridge_add brctl"
 | 
					_config_vars="$_config_vars bridge bridge_add brctl"
 | 
				
			||||||
@@ -42,7 +33,7 @@ br2684ctl_pre_start()
 | 
				
			|||||||
	esac
 | 
						esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	einfo "Starting RFC 2684 Bridge control on ${IFACE}"
 | 
						einfo "Starting RFC 2684 Bridge control on ${IFACE}"
 | 
				
			||||||
	start-stop-daemon --start --exec $(_br2684ctl) --background \
 | 
						start-stop-daemon --start --exec $(_which br2684ctl) --background \
 | 
				
			||||||
		--make-pidfile --pidfile "/var/run/br2684ctl-${IFACE}.pid" \
 | 
							--make-pidfile --pidfile "/var/run/br2684ctl-${IFACE}.pid" \
 | 
				
			||||||
		-- -c "${IFACE#nas*}" ${opts}
 | 
							-- -c "${IFACE#nas*}" ${opts}
 | 
				
			||||||
	eend $?
 | 
						eend $?
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@
 | 
				
			|||||||
bridge_depend()
 | 
					bridge_depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	before interface macnet
 | 
						before interface macnet
 | 
				
			||||||
	program /sbin/brctl
 | 
						program brctl
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_config_vars="$_config_vars bridge bridge_add brctl"
 | 
					_config_vars="$_config_vars bridge bridge_add brctl"
 | 
				
			||||||
@@ -119,10 +119,8 @@ bridge_pre_start()
 | 
				
			|||||||
				return 1
 | 
									return 1
 | 
				
			||||||
			fi
 | 
								fi
 | 
				
			||||||
			# The interface is known to exist now
 | 
								# The interface is known to exist now
 | 
				
			||||||
			_set_flag promisc
 | 
					 | 
				
			||||||
			_up
 | 
								_up
 | 
				
			||||||
			if ! brctl addif "${BR_IFACE}" "${x}"; then
 | 
								if ! brctl addif "${BR_IFACE}" "${x}"; then
 | 
				
			||||||
				_set_flag -promisc
 | 
					 | 
				
			||||||
				eend 1
 | 
									eend 1
 | 
				
			||||||
				return 1
 | 
									return 1
 | 
				
			||||||
			fi
 | 
								fi
 | 
				
			||||||
@@ -144,6 +142,7 @@ bridge_pre_start()
 | 
				
			|||||||
	) || return 1
 | 
						) || return 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Bring up the bridge
 | 
						# Bring up the bridge
 | 
				
			||||||
 | 
						_set_flag promisc
 | 
				
			||||||
	_up
 | 
						_up
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,9 @@
 | 
				
			|||||||
# Copyright (c) 2011 by Gentoo Foundation
 | 
					# Copyright (c) 2011 by Gentoo Foundation
 | 
				
			||||||
# Released under the 2-clause BSD license.
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_ethtool() {
 | 
					 | 
				
			||||||
	echo /usr/sbin/ethtool
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ethtool_depend()
 | 
					ethtool_depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	program $(_ethtool)
 | 
						program ethtool
 | 
				
			||||||
	before interface
 | 
						before interface
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -43,7 +39,7 @@ ethtool_pre_start() {
 | 
				
			|||||||
			args_pretty="--${opt} $IFACE ${args_pretty}"
 | 
								args_pretty="--${opt} $IFACE ${args_pretty}"
 | 
				
			||||||
			args="--${opt} $IFACE ${args}"
 | 
								args="--${opt} $IFACE ${args}"
 | 
				
			||||||
			ebegin "ethtool ${args_pretty}"
 | 
								ebegin "ethtool ${args_pretty}"
 | 
				
			||||||
			$(_ethtool) ${args}
 | 
								ethtool ${args}
 | 
				
			||||||
			rc=$?
 | 
								rc=$?
 | 
				
			||||||
			eend $rc "ethtool exit code $rc"
 | 
								eend $rc "ethtool exit code $rc"
 | 
				
			||||||
			# TODO: ethtool has MANY different exit codes, with no
 | 
								# TODO: ethtool has MANY different exit codes, with no
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										38
									
								
								net/firewalld.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								net/firewalld.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					# Copyright (c) 2012 Doug Goldstein <cardoe@cardoe.com>
 | 
				
			||||||
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					firewalld_depend()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						after interface
 | 
				
			||||||
 | 
						before dhcp
 | 
				
			||||||
 | 
						program firewall-cmd
 | 
				
			||||||
 | 
						[ "$IFACE" != "lo" ] && need firewalld
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_config_vars="$_config_vars firewalld_zone"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					firewalld_post_start()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local firewalld_zone=
 | 
				
			||||||
 | 
						eval firewalld_zone=\$firewalld_zone_${IFVAR}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_exists || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ "${IFACE}" != "lo" ]; then
 | 
				
			||||||
 | 
							firewall-cmd --zone="${firewalld_zone}" \
 | 
				
			||||||
 | 
								--change-interface="${IFACE}" > /dev/null 2>&1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					firewalld_pre_stop()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						_exists || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ "${IFACE}" != "lo" ]; then
 | 
				
			||||||
 | 
							firewall-cmd --remove-interface="${IFACE}" > /dev/null 2>&1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -242,3 +242,23 @@ ifconfig_post_start()
 | 
				
			|||||||
		eend 0
 | 
							eend 0
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Is the interface administratively/operationally up?
 | 
				
			||||||
 | 
					# The 'UP' status in ifconfig is the administrative status
 | 
				
			||||||
 | 
					# Operational state does not seem to be available in BSD?
 | 
				
			||||||
 | 
					# 0: up
 | 
				
			||||||
 | 
					# 1: down
 | 
				
			||||||
 | 
					# 2: invalid arguments
 | 
				
			||||||
 | 
					is_admin_up()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local iface="$1"
 | 
				
			||||||
 | 
						[ -z "$iface" ] && iface="$IFACE"
 | 
				
			||||||
 | 
						ifconfig "${iface}" | \
 | 
				
			||||||
 | 
						sed -n '1,1{ /flags=.*[<,]UP[,>]/{ q 0 }}; q 1; '
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					is_oper_up()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						eerror "TODO: is_oper_up not available on BSD"
 | 
				
			||||||
 | 
						return 2
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
ifconfig_depend()
 | 
					ifconfig_depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	program /sbin/ifconfig
 | 
						program /sbin/ifconfig /bin/ifconfig
 | 
				
			||||||
	provide interface
 | 
						provide interface
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -19,24 +19,24 @@ _down()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
_exists()
 | 
					_exists()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/dev
 | 
						[ -e /sys/class/net/"$IFACE" ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_ifindex()
 | 
					_ifindex()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	local line= i=-2
 | 
						local index=-1
 | 
				
			||||||
	while read line; do
 | 
						local f v
 | 
				
			||||||
		: $(( i += 1 ))
 | 
						if [ -e /sys/class/net/"${IFACE}"/ifindex ]; then
 | 
				
			||||||
		[ ${i} -lt 1 ] && continue
 | 
							index=$(cat /sys/class/net/"${IFACE}"/ifindex)
 | 
				
			||||||
		case "${line}" in
 | 
						else
 | 
				
			||||||
			"${IFACE}:"*) echo "${i}"; return 0;;
 | 
							for f in /sys/class/net/*/ifindex ; do
 | 
				
			||||||
		esac
 | 
								v=$(cat $f)
 | 
				
			||||||
	done < /proc/net/dev
 | 
								[ $v -gt $index ] && index=$v
 | 
				
			||||||
 | 
							done
 | 
				
			||||||
	# Return the next available index
 | 
							: $(( index += 1 ))
 | 
				
			||||||
	: $(( i += 1 ))
 | 
						fi
 | 
				
			||||||
	echo "${i}"
 | 
						echo "${index}"
 | 
				
			||||||
	return 1
 | 
						return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_is_wireless()
 | 
					_is_wireless()
 | 
				
			||||||
@@ -188,6 +188,12 @@ _add_route()
 | 
				
			|||||||
	if [ "$1" = "-A" -o "$1" = "-f" -o "$1" = "-family" ]; then
 | 
						if [ "$1" = "-A" -o "$1" = "-f" -o "$1" = "-family" ]; then
 | 
				
			||||||
		family="-A $2"
 | 
							family="-A $2"
 | 
				
			||||||
		shift; shift
 | 
							shift; shift
 | 
				
			||||||
 | 
						elif [ "$1" = "-4" ]; then
 | 
				
			||||||
 | 
						    family="-A inet"
 | 
				
			||||||
 | 
							shift
 | 
				
			||||||
 | 
						elif [ "$1" = "-6" ]; then
 | 
				
			||||||
 | 
						    family="-A inet6"
 | 
				
			||||||
 | 
							shift
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if [ -n "${metric}" ]; then
 | 
						if [ -n "${metric}" ]; then
 | 
				
			||||||
@@ -297,3 +303,26 @@ ifconfig_post_stop()
 | 
				
			|||||||
	iptunnel del "${IFACE}"
 | 
						iptunnel del "${IFACE}"
 | 
				
			||||||
	eend $?
 | 
						eend $?
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Is the interface administratively/operationally up?
 | 
				
			||||||
 | 
					# The 'UP' status in ifconfig/iproute2 is the administrative status
 | 
				
			||||||
 | 
					# Operational state is available in iproute2 output as 'state UP', or the
 | 
				
			||||||
 | 
					# operstate sysfs variable.
 | 
				
			||||||
 | 
					# 0: up
 | 
				
			||||||
 | 
					# 1: down
 | 
				
			||||||
 | 
					# 2: invalid arguments
 | 
				
			||||||
 | 
					is_admin_up()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local iface="$1"
 | 
				
			||||||
 | 
						[ -z "$iface" ] && iface="$IFACE"
 | 
				
			||||||
 | 
						ifconfig "${iface}" | \
 | 
				
			||||||
 | 
						sed -n '1,1{ /flags=.*[<,]UP[,>]/{ q 0 }}; q 1; '
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					is_oper_up()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local iface="$1"
 | 
				
			||||||
 | 
						[ -z "$iface" ] && iface="$IFACE"
 | 
				
			||||||
 | 
						read state </sys/class/net/"${iface}"/operstate
 | 
				
			||||||
 | 
						[ "x$state" = "up" ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										168
									
								
								net/ip6rd.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								net/ip6rd.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,168 @@
 | 
				
			|||||||
 | 
					# Copyright (c) 2011 by Gentoo Foundation
 | 
				
			||||||
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_config_vars="$_config_vars link prefix suffix ipv4mask relay"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ip6rd_depend()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						program ip
 | 
				
			||||||
 | 
						after interface
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ip6rd_pre_start()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						# ALL interfaces run pre_start blocks, not just those with something
 | 
				
			||||||
 | 
						# assigned, so we must check if we need to run on this interface before we
 | 
				
			||||||
 | 
						# do so.
 | 
				
			||||||
 | 
						local config
 | 
				
			||||||
 | 
						eval config=\$config_${IFVAR}
 | 
				
			||||||
 | 
						[ "$config" = "ip6rd" ] || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case "${MODULES}" in
 | 
				
			||||||
 | 
							*" ifconfig "*)
 | 
				
			||||||
 | 
								eerror "ifconfig is not supported for 6rd"
 | 
				
			||||||
 | 
								eerror "Please emerge sys-apps/iproute2"
 | 
				
			||||||
 | 
								return 1
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local host= suffix= relay= addr= iface=${IFACE} config_ip6rd= localip= ipv4mask=
 | 
				
			||||||
 | 
						eval host=\$link_${IFVAR}
 | 
				
			||||||
 | 
						if [ -z "${host}" ]; then
 | 
				
			||||||
 | 
							eerror "link_${IFVAR} not set"
 | 
				
			||||||
 | 
							return 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						eval host=\${link_${IFVAR}}
 | 
				
			||||||
 | 
						eval ipv4mask=\${ipv4mask_${IFVAR}:-0}
 | 
				
			||||||
 | 
						eval suffix=\${suffix_${IFVAR}:-1}
 | 
				
			||||||
 | 
						eval relay=\${relay_${IFVAR}}
 | 
				
			||||||
 | 
						eval prefix=\${prefix_${IFVAR}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						IFACE=${host}
 | 
				
			||||||
 | 
						addrs=$(_get_inet_addresses)
 | 
				
			||||||
 | 
						IFACE=${iface}
 | 
				
			||||||
 | 
						if [ -z "${addrs}" ]; then
 | 
				
			||||||
 | 
							eerror "${host} is not configured with an IPv4 address"
 | 
				
			||||||
 | 
							return 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						# TODO: Get this settings from DHCP (Option 212)
 | 
				
			||||||
 | 
						if [ -z "${prefix}" ]; then
 | 
				
			||||||
 | 
							eerror "prefix_${IFVAR} not set"
 | 
				
			||||||
 | 
							return 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						if [ -z "${relay}" ]; then
 | 
				
			||||||
 | 
							eerror "relay_${IFVAR} not set"
 | 
				
			||||||
 | 
							return 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						for addr in ${addrs}; do
 | 
				
			||||||
 | 
							# Strip the subnet
 | 
				
			||||||
 | 
							local ip="${addr%/*}" subnet="${addr#*/}"
 | 
				
			||||||
 | 
							# We don't work on private IPv4 addresses
 | 
				
			||||||
 | 
							if _ip6rd_inet_is_private_network "${ip}"
 | 
				
			||||||
 | 
							then
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local ip6= ip6_prefix="${prefix%::/*}" ip6_subnet="${prefix#*/}"
 | 
				
			||||||
 | 
							ip6_subnet=$((ip6_subnet + (32-ipv4mask)))
 | 
				
			||||||
 | 
							eval ip6="$(printf "${ip6_prefix}:%s::%s" \
 | 
				
			||||||
 | 
							$(_ip6rd_prefix_shave_bits  ${ip} ${ipv4mask}) ${suffix})"
 | 
				
			||||||
 | 
							veinfo "Derived IPv6 address: ${ip6}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# Now apply our IPv6 address to our config
 | 
				
			||||||
 | 
							config_ip6rd="${config_ip6rd}${config_ip6rd:+ }${ip6}/${ip6_subnet}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if [ -n "${localip}" ]; then
 | 
				
			||||||
 | 
								localip="any"
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								localip="${ip}"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ -z "${config_ip6rd}" ]; then
 | 
				
			||||||
 | 
							eerror "No global IPv4 addresses found on interface ${host}"
 | 
				
			||||||
 | 
							return 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ebegin "Creating 6rd tunnel ${IFACE}"
 | 
				
			||||||
 | 
						if [ "${IFACE}" != "sit0" ]; then
 | 
				
			||||||
 | 
							_tunnel add "${IFACE}" mode sit ttl 255 remote any local "${localip}"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						_tunnel 6rd dev "${IFACE}" 6rd-prefix "${prefix}"
 | 
				
			||||||
 | 
						eend $? || return 1
 | 
				
			||||||
 | 
						_up
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						routes_ip6rd="2003::/3 via ::${relay} metric 2147483647"
 | 
				
			||||||
 | 
						service_set_value "config_ip6rd_$IFVAR" "$config_ip6rd"
 | 
				
			||||||
 | 
						service_set_value "routes_ip6rd_$IFVAR" "$routes_ip6rd"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ip6rd_start()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local config_ip6rd=$(service_get_value "config_ip6rd_$IFVAR")
 | 
				
			||||||
 | 
						local routes_ip6rd=$(service_get_value "routes_ip6rd_$IFVAR")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Now apply our config
 | 
				
			||||||
 | 
						eval config_${config_index}=\'"${config_ip6rd}"\'
 | 
				
			||||||
 | 
						: $(( config_index -= 1 ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Add a route for us, ensuring we don't delete anything else
 | 
				
			||||||
 | 
						local routes="$(_get_array "routes_${IFVAR}")
 | 
				
			||||||
 | 
					$routes_ip6rd"
 | 
				
			||||||
 | 
						eval routes_${IFVAR}=\$routes
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_ip6rd_inet_atoi()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local IFS="${IFS}." ipi=0 j=3
 | 
				
			||||||
 | 
						for i in $1 ; do
 | 
				
			||||||
 | 
						       ipi=$(( ipi | i << 8*j-- ))
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
						echo ${ipi}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_ip6rd_inet_itoa()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local ipi=$1
 | 
				
			||||||
 | 
						for i in 0 1 2 3; do
 | 
				
			||||||
 | 
							if [ $i != 3 ] ; then
 | 
				
			||||||
 | 
								printf "%d." $(( (ipi & ~((1<<24)-1)) >> 24 ))
 | 
				
			||||||
 | 
								ipi=$(( (ipi & ((1<<24)-1)) << 8))
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								printf "%d\n" $(( (ipi & ~((1<<24)-1)) >> 24 ))
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_ip6rd_inet_get_network()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						echo $(_ip6rd_inet_itoa $(( ($(_ip6rd_inet_atoi $1) & ((1<<$2)-1) << (32-$2) ) )) )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_ip6rd_inet_is_private_network()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if [ "$(_ip6rd_inet_get_network $1 16)" = "192.168.0.0" ]\
 | 
				
			||||||
 | 
						  || [ "$(_ip6rd_inet_get_network $1 8)" = "10.0.0.0" ]\
 | 
				
			||||||
 | 
						  || [ "$(_ip6rd_inet_get_network $1 12)" = "172.16.0.0" ]\
 | 
				
			||||||
 | 
						  || [ "$(_ip6rd_inet_get_network $1 16)" = "169.254.0.0" ]
 | 
				
			||||||
 | 
						then
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_ip6rd_prefix_shave_bits()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local ipi=
 | 
				
			||||||
 | 
						ipi=$((  ($(_ip6rd_inet_atoi $1) & (1<<(32-$2))-1) << $2))
 | 
				
			||||||
 | 
						if [ $2 -le 16 ]
 | 
				
			||||||
 | 
						then
 | 
				
			||||||
 | 
							printf "%04x:%0$(( (16-$2>>2)+(($2%4)?1:0) ))x" \
 | 
				
			||||||
 | 
							$((ipi >> 16)) $((ipi & (1<<(16-$2))-1))
 | 
				
			||||||
 | 
						elif [ $2 -lt 32 ]
 | 
				
			||||||
 | 
						then
 | 
				
			||||||
 | 
							printf "%0$(( (32-$2>>2)+(($2%4)?1:0) ))x" \
 | 
				
			||||||
 | 
							$((ipi >> 16))
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -6,10 +6,18 @@ _config_vars="$_config_vars link suffix relay"
 | 
				
			|||||||
ip6to4_depend()
 | 
					ip6to4_depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	after interface
 | 
						after interface
 | 
				
			||||||
 | 
						program ip
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ip6to4_start()
 | 
					ip6to4_pre_start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						# ALL interfaces run pre_start blocks, not just those with something
 | 
				
			||||||
 | 
						# assigned, so we must check if we need to run on this interface before we
 | 
				
			||||||
 | 
						# do so.
 | 
				
			||||||
 | 
						local config
 | 
				
			||||||
 | 
						eval config=\$config_${IFVAR}
 | 
				
			||||||
 | 
						[ "$config" = "ip6to4" ] || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case " ${MODULES} " in
 | 
						case " ${MODULES} " in
 | 
				
			||||||
		*" ifconfig "*)
 | 
							*" ifconfig "*)
 | 
				
			||||||
			if [ "${IFACE}" != "sit0" ]; then
 | 
								if [ "${IFACE}" != "sit0" ]; then
 | 
				
			||||||
@@ -19,7 +27,7 @@ ip6to4_start()
 | 
				
			|||||||
			fi
 | 
								fi
 | 
				
			||||||
	esac
 | 
						esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local host= suffix= relay= addr= iface=${IFACE} new= localip=
 | 
						local host= suffix= relay= addr= iface=${IFACE} config_ip6to4= localip=
 | 
				
			||||||
	eval host=\$link_${IFVAR}
 | 
						eval host=\$link_${IFVAR}
 | 
				
			||||||
	if [ -z "${host}" ]; then
 | 
						if [ -z "${host}" ]; then
 | 
				
			||||||
		eerror "link_${IFVAR} not set"
 | 
							eerror "link_${IFVAR} not set"
 | 
				
			||||||
@@ -67,7 +75,7 @@ ip6to4_start()
 | 
				
			|||||||
		veinfo "Derived IPv6 address: ${ip6}"
 | 
							veinfo "Derived IPv6 address: ${ip6}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# Now apply our IPv6 address to our config
 | 
							# Now apply our IPv6 address to our config
 | 
				
			||||||
		new="${new}${new:+ }${ip6}/16"
 | 
							config_ip6to4="${config_ip6to4}${config_ip6to4:+ }${ip6}/48"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if [ -n "${localip}" ]; then
 | 
							if [ -n "${localip}" ]; then
 | 
				
			||||||
			localip="any"
 | 
								localip="any"
 | 
				
			||||||
@@ -76,7 +84,7 @@ ip6to4_start()
 | 
				
			|||||||
		fi
 | 
							fi
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if [ -z "${new}" ]; then
 | 
						if [ -z "${config_ip6to4}" ]; then
 | 
				
			||||||
		eerror "No global IPv4 addresses found on interface ${host}"
 | 
							eerror "No global IPv4 addresses found on interface ${host}"
 | 
				
			||||||
		return 1
 | 
							return 1
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
@@ -87,13 +95,22 @@ ip6to4_start()
 | 
				
			|||||||
		eend $? || return 1
 | 
							eend $? || return 1
 | 
				
			||||||
		_up
 | 
							_up
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
						routes_ip6to4="2003::/3 via ::${relay} metric 2147483647"
 | 
				
			||||||
 | 
						service_set_value "config_ip6to4_$IFVAR" "$config_ip6to4"
 | 
				
			||||||
 | 
						service_set_value "routes_ip6to4_$IFVAR" "$routes_ip6to4"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ip6to4_start()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local config_ip6to4=$(service_get_value "config_ip6to4_$IFVAR")
 | 
				
			||||||
 | 
						local routes_ip6to4=$(service_get_value "routes_ip6to4_$IFVAR")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Now apply our config
 | 
						# Now apply our config
 | 
				
			||||||
	eval config_${config_index}=\'"${new}"\'
 | 
						eval config_${config_index}=\'"${config_ip6to4}"\'
 | 
				
			||||||
	: $(( config_index -= 1 ))
 | 
						: $(( config_index -= 1 ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Add a route for us, ensuring we don't delete anything else
 | 
						# Add a route for us, ensuring we don't delete anything else
 | 
				
			||||||
	local routes="$(_get_array "routes_${IFVAR}")
 | 
						local routes="$(_get_array "routes_${IFVAR}")
 | 
				
			||||||
2003::/3 via ::${relay} metric 2147483647"
 | 
					$routes_ip6to4"
 | 
				
			||||||
	eval routes_${IFVAR}=\$routes
 | 
						eval routes_${IFVAR}=\$routes
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										188
									
								
								net/iproute2.sh
									
									
									
									
									
								
							
							
						
						
									
										188
									
								
								net/iproute2.sh
									
									
									
									
									
								
							@@ -1,52 +1,43 @@
 | 
				
			|||||||
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
 | 
					# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
 | 
				
			||||||
# Released under the 2-clause BSD license.
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_ip()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if [ -x /bin/ip ]; then
 | 
					 | 
				
			||||||
		echo /bin/ip
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		echo /sbin/ip
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
iproute2_depend()
 | 
					iproute2_depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	program $(_ip)
 | 
						program ip
 | 
				
			||||||
	provide interface
 | 
						provide interface
 | 
				
			||||||
	after ifconfig
 | 
						after ifconfig
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_up()
 | 
					_up()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ip link set "${IFACE}" up
 | 
						ip link set dev "${IFACE}" up
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_down()
 | 
					_down()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ip link set "${IFACE}" down
 | 
						ip link set dev "${IFACE}" down
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_exists()
 | 
					_exists()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/dev
 | 
						[ -e /sys/class/net/"$IFACE" ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_ifindex()
 | 
					_ifindex()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	local line= i=-2
 | 
						local index=-1
 | 
				
			||||||
	while read line; do
 | 
						local f v
 | 
				
			||||||
		: $(( i += 1 ))
 | 
						if [ -e /sys/class/net/"${IFACE}"/ifindex ]; then
 | 
				
			||||||
		[ ${i} -lt 1 ] && continue
 | 
							index=$(cat /sys/class/net/"${IFACE}"/ifindex)
 | 
				
			||||||
		case "${line}" in
 | 
						else
 | 
				
			||||||
			"${IFACE}:"*) echo "${i}"; return 0;;
 | 
							for f in /sys/class/net/*/ifindex ; do
 | 
				
			||||||
		esac
 | 
								v=$(cat $f)
 | 
				
			||||||
	done < /proc/net/dev
 | 
								[ $v -gt $index ] && index=$v
 | 
				
			||||||
 | 
							done
 | 
				
			||||||
	# Return the next available index
 | 
							: $(( index += 1 ))
 | 
				
			||||||
	: $(( i += 1 ))
 | 
						fi
 | 
				
			||||||
	echo "${i}"
 | 
						echo "${index}"
 | 
				
			||||||
	return 1
 | 
						return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_is_wireless()
 | 
					_is_wireless()
 | 
				
			||||||
@@ -66,7 +57,7 @@ _set_flag()
 | 
				
			|||||||
		flag=${flag#-}
 | 
							flag=${flag#-}
 | 
				
			||||||
		opt="off"
 | 
							opt="off"
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	ip link set "${IFACE}" "${flag}" "${opt}"
 | 
						ip link set dev "${IFACE}" "${flag}" "${opt}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_get_mac_address()
 | 
					_get_mac_address()
 | 
				
			||||||
@@ -88,7 +79,7 @@ _get_mac_address()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
_set_mac_address()
 | 
					_set_mac_address()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ip link set "${IFACE}" address "$1"
 | 
						ip link set dev "${IFACE}" address "$1"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_get_inet_addresses()
 | 
					_get_inet_addresses()
 | 
				
			||||||
@@ -110,31 +101,54 @@ _add_address()
 | 
				
			|||||||
		ip addr add "$@" dev "${IFACE}" 2>/dev/null
 | 
							ip addr add "$@" dev "${IFACE}" 2>/dev/null
 | 
				
			||||||
		return 0
 | 
							return 0
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
						local x
 | 
				
			||||||
	local address netmask broadcast peer anycast label scope
 | 
						local address netmask broadcast peer anycast label scope
 | 
				
			||||||
	local valid_lft preferred_lft home nodad
 | 
						local valid_lft preferred_lft home nodad
 | 
				
			||||||
 | 
						local confflaglist
 | 
				
			||||||
	address="$1" ; shift
 | 
						address="$1" ; shift
 | 
				
			||||||
	while [ -n "$*" ]; do
 | 
						while [ -n "$*" ]; do
 | 
				
			||||||
		case "$1" in
 | 
							x=$1 ; shift
 | 
				
			||||||
			netmask)
 | 
							case "$x" in
 | 
				
			||||||
				netmask="/$(_netmask2cidr "$2")" ; shift ; shift ;;
 | 
								netmask|ne*)
 | 
				
			||||||
			broadcast|brd)
 | 
									netmask="/$(_netmask2cidr "$1")" ; shift ;;
 | 
				
			||||||
				broadcast="broadcast $2" ; shift ; shift ;;
 | 
								broadcast|brd|br*)
 | 
				
			||||||
			pointopoint|pointtopoint|peer)
 | 
									broadcast="$1" ; shift ;;
 | 
				
			||||||
				peer="peer $2" ; shift ; shift ;;
 | 
								pointopoint|pointtopoint|peer|po*|pe*)
 | 
				
			||||||
			anycast|label|scope|valid_lft|preferred_lft)
 | 
									peer="$1" ; shift ;;
 | 
				
			||||||
				eval "$1=$2" ; shift ; shift ;;
 | 
								anycast|label|scope|valid_lft|preferred_lft|a*|l*|s*|v*|pr*)
 | 
				
			||||||
			home|nodad)
 | 
									case $x in
 | 
				
			||||||
				eval "$1=$1" ; shift ;;
 | 
										a*) x=anycast ;;
 | 
				
			||||||
 | 
										l*) x=label ;;
 | 
				
			||||||
 | 
										s*) x=scope ;;
 | 
				
			||||||
 | 
										v*) x=valid_lft ;;
 | 
				
			||||||
 | 
										pr*) x=preferred_lft ;;
 | 
				
			||||||
 | 
									esac
 | 
				
			||||||
 | 
									eval "$x=$1" ; shift ;;
 | 
				
			||||||
 | 
								home|nodad|h*|no*)
 | 
				
			||||||
 | 
									case $x in h*) x=home ;; n*) x=nodad ;; esac
 | 
				
			||||||
 | 
									# FIXME: If we need to reorder these, this will take more code
 | 
				
			||||||
 | 
									confflaglist="${confflaglist} $x" ; ;;
 | 
				
			||||||
 | 
								*)
 | 
				
			||||||
 | 
									ewarn "Unknown argument to config_$IFACE: $x"
 | 
				
			||||||
		esac
 | 
							esac
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Always scope lo addresses as host unless specified otherwise
 | 
						# Always scope lo addresses as host unless specified otherwise
 | 
				
			||||||
	if [ "${IFACE}" = "lo" ]; then
 | 
						if [ "${IFACE}" = "lo" ]; then
 | 
				
			||||||
		[ -z "$scope" ] && scope="scope host"
 | 
							[ -z "$scope" ] && scope="host"
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	set -- "${address}${netmask}" $peer $broadcast $anycast $label $scope dev "${IFACE}" $valid_lft $preferred_lft $home $nodad
 | 
						# figure out the broadcast address if it is not specified
 | 
				
			||||||
 | 
						# This must NOT be set for IPv6 addresses
 | 
				
			||||||
 | 
						if [ "${address#*:}" = "${address}" ]; then
 | 
				
			||||||
 | 
							[ -z "$broadcast" ] && broadcast="+"
 | 
				
			||||||
 | 
						elif [ -n "$broadcast" ]; then
 | 
				
			||||||
 | 
							eerror "Broadcast keywords are not valid with IPv6 addresses"
 | 
				
			||||||
 | 
							return 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# This must appear on a single line, continuations cannot be used
 | 
				
			||||||
 | 
						set -- "${address}${netmask}" ${peer:+peer} ${peer} ${broadcast:+broadcast} ${broadcast} ${anycast:+anycast} ${anycast} ${label:+label} ${label} ${scope:+scope} ${scope} dev "${IFACE}" ${valid_lft:+valid_lft} $valid_lft ${preferred_lft:+preferred_lft} $preferred_lft $confflaglist
 | 
				
			||||||
	veinfo ip addr add "$@"
 | 
						veinfo ip addr add "$@"
 | 
				
			||||||
	ip addr add "$@"
 | 
						ip addr add "$@"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -146,6 +160,12 @@ _add_route()
 | 
				
			|||||||
	if [ "$1" = "-A" -o "$1" = "-f" -o "$1" = "-family" ]; then
 | 
						if [ "$1" = "-A" -o "$1" = "-f" -o "$1" = "-family" ]; then
 | 
				
			||||||
		family="-f $2"
 | 
							family="-f $2"
 | 
				
			||||||
		shift; shift
 | 
							shift; shift
 | 
				
			||||||
 | 
						elif [ "$1" = "-4" ]; then
 | 
				
			||||||
 | 
						    family="-f inet"
 | 
				
			||||||
 | 
							shift
 | 
				
			||||||
 | 
						elif [ "$1" = "-6" ]; then
 | 
				
			||||||
 | 
						    family="-f inet6"
 | 
				
			||||||
 | 
							shift
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if [ $# -eq 3 ]; then
 | 
						if [ $# -eq 3 ]; then
 | 
				
			||||||
@@ -192,7 +212,7 @@ _delete_addresses()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
_has_carrier()
 | 
					_has_carrier()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return 0
 | 
						LC_ALL=C ip link show dev "${IFACE}" | grep -q "LOWER_UP"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_tunnel()
 | 
					_tunnel()
 | 
				
			||||||
@@ -208,7 +228,13 @@ _trim() {
 | 
				
			|||||||
# This is our interface to Routing Policy Database RPDB
 | 
					# This is our interface to Routing Policy Database RPDB
 | 
				
			||||||
# This allows for advanced routing tricks
 | 
					# This allows for advanced routing tricks
 | 
				
			||||||
_ip_rule_runner() {
 | 
					_ip_rule_runner() {
 | 
				
			||||||
	local cmd rules OIFS="${IFS}"
 | 
						local cmd rules OIFS="${IFS}" family
 | 
				
			||||||
 | 
						if [ "$1" = "-4" -o "$1" = "-6" ]; then
 | 
				
			||||||
 | 
							family="$1"
 | 
				
			||||||
 | 
							shift
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							family="-4"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
	cmd="$1"
 | 
						cmd="$1"
 | 
				
			||||||
	rules="$2"
 | 
						rules="$2"
 | 
				
			||||||
	veindent
 | 
						veindent
 | 
				
			||||||
@@ -218,7 +244,7 @@ _ip_rule_runner() {
 | 
				
			|||||||
		ruN="$(_trim "${ru}")"
 | 
							ruN="$(_trim "${ru}")"
 | 
				
			||||||
		[ -z "${ruN}" ] && continue
 | 
							[ -z "${ruN}" ] && continue
 | 
				
			||||||
		vebegin "${cmd} ${ruN}"
 | 
							vebegin "${cmd} ${ruN}"
 | 
				
			||||||
		ip rule ${cmd} ${ru}
 | 
							ip $family rule ${cmd} ${ru}
 | 
				
			||||||
		veend $?
 | 
							veend $?
 | 
				
			||||||
		local IFS="$__IFS"
 | 
							local IFS="$__IFS"
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
@@ -248,12 +274,12 @@ iproute2_pre_start()
 | 
				
			|||||||
	# MTU support
 | 
						# MTU support
 | 
				
			||||||
	local mtu=
 | 
						local mtu=
 | 
				
			||||||
	eval mtu=\$mtu_${IFVAR}
 | 
						eval mtu=\$mtu_${IFVAR}
 | 
				
			||||||
	[ -n "${mtu}" ] && ip link set "${IFACE}" mtu "${mtu}"
 | 
						[ -n "${mtu}" ] && ip link set dev "${IFACE}" mtu "${mtu}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# TX Queue Length support
 | 
						# TX Queue Length support
 | 
				
			||||||
	local len=
 | 
						local len=
 | 
				
			||||||
	eval len=\$txqueuelen_${IFVAR}
 | 
						eval len=\$txqueuelen_${IFVAR}
 | 
				
			||||||
	[ -n "${len}" ] && ip link set "${IFACE}" txqueuelen "${len}"
 | 
						[ -n "${len}" ] && ip link set dev "${IFACE}" txqueuelen "${len}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0
 | 
						return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -261,7 +287,7 @@ iproute2_pre_start()
 | 
				
			|||||||
_iproute2_ipv6_tentative()
 | 
					_iproute2_ipv6_tentative()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	# Only check tentative when we have a carrier.
 | 
						# Only check tentative when we have a carrier.
 | 
				
			||||||
	LC_ALL=C ip link show dev "${IFACE}" | grep -q "NO-CARRIER" && return 1
 | 
						_has_carrier || return 1
 | 
				
			||||||
	LC_ALL=C ip addr show dev "${IFACE}" | \
 | 
						LC_ALL=C ip addr show dev "${IFACE}" | \
 | 
				
			||||||
		grep -q "^[[:space:]]*inet6 .* tentative"
 | 
							grep -q "^[[:space:]]*inet6 .* tentative"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -274,15 +300,30 @@ iproute2_post_start()
 | 
				
			|||||||
	if [ -e /proc/net/route ]; then
 | 
						if [ -e /proc/net/route ]; then
 | 
				
			||||||
		local rules="$(_get_array "rules_${IFVAR}")"
 | 
							local rules="$(_get_array "rules_${IFVAR}")"
 | 
				
			||||||
		if [ -n "${rules}" ]; then
 | 
							if [ -n "${rules}" ]; then
 | 
				
			||||||
			if ! ip rule list | grep -q "^"; then
 | 
								if ! ip -4 rule list | grep -q "^"; then
 | 
				
			||||||
				eerror "IP Policy Routing (CONFIG_IP_MULTIPLE_TABLES) needed for ip rule"
 | 
									eerror "IP Policy Routing (CONFIG_IP_MULTIPLE_TABLES) needed for ip rule"
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				service_set_value "ip_rule" "${rules}"
 | 
									service_set_value "ip_rule" "${rules}"
 | 
				
			||||||
				einfo "Adding RPDB rules"
 | 
									einfo "Adding IPv4 RPDB rules"
 | 
				
			||||||
				_ip_rule_runner add "${rules}"
 | 
									_ip_rule_runner -4 add "${rules}"
 | 
				
			||||||
			fi
 | 
								fi
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
		ip route flush table cache dev "${IFACE}"
 | 
							ip -4 route flush table cache dev "${IFACE}"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Kernel may not have IPv6 built in
 | 
				
			||||||
 | 
						if [ -e /proc/net/ipv6_route ]; then
 | 
				
			||||||
 | 
							local rules="$(_get_array "rules6_${IFVAR}")"
 | 
				
			||||||
 | 
							if [ -n "${rules}" ]; then
 | 
				
			||||||
 | 
								if ! ip -6 rule list | grep -q "^"; then
 | 
				
			||||||
 | 
									eerror "IPv6 Policy Routing (CONFIG_IPV6_MULTIPLE_TABLES) needed for ip rule"
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									service_set_value "ip6_rule" "${rules}"
 | 
				
			||||||
 | 
									einfo "Adding IPv6 RPDB rules"
 | 
				
			||||||
 | 
									_ip_rule_runner -6 add "${rules}"
 | 
				
			||||||
 | 
								fi
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							ip -6 route flush table cache dev "${IFACE}"
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if _iproute2_ipv6_tentative; then
 | 
						if _iproute2_ipv6_tentative; then
 | 
				
			||||||
@@ -305,13 +346,27 @@ iproute2_post_stop()
 | 
				
			|||||||
	if [ -e /proc/net/route ]; then
 | 
						if [ -e /proc/net/route ]; then
 | 
				
			||||||
		local rules="$(service_get_value "ip_rule")"
 | 
							local rules="$(service_get_value "ip_rule")"
 | 
				
			||||||
		if [ -n "${rules}" ]; then
 | 
							if [ -n "${rules}" ]; then
 | 
				
			||||||
			einfo "Removing RPDB rules"
 | 
								einfo "Removing IPv4 RPDB rules"
 | 
				
			||||||
			_ip_rule_runner del "${rules}"
 | 
								_ip_rule_runner -4 del "${rules}"
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# Only do something if the interface actually exist
 | 
							# Only do something if the interface actually exist
 | 
				
			||||||
		if _exists; then
 | 
							if _exists; then
 | 
				
			||||||
			ip route flush table cache dev "${IFACE}"
 | 
								ip -4 route flush table cache dev "${IFACE}"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Kernel may not have IPv6 built in
 | 
				
			||||||
 | 
						if [ -e /proc/net/ipv6_route ]; then
 | 
				
			||||||
 | 
							local rules="$(service_get_value "ip6_rule")"
 | 
				
			||||||
 | 
							if [ -n "${rules}" ]; then
 | 
				
			||||||
 | 
								einfo "Removing IPv6 RPDB rules"
 | 
				
			||||||
 | 
								_ip_rule_runner -6 del "${rules}"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# Only do something if the interface actually exist
 | 
				
			||||||
 | 
							if _exists; then
 | 
				
			||||||
 | 
								ip -6 route flush table cache dev "${IFACE}"
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -324,3 +379,26 @@ iproute2_post_stop()
 | 
				
			|||||||
		fi
 | 
							fi
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Is the interface administratively/operationally up?
 | 
				
			||||||
 | 
					# The 'UP' status in ifconfig/iproute2 is the administrative status
 | 
				
			||||||
 | 
					# Operational state is available in iproute2 output as 'state UP', or the
 | 
				
			||||||
 | 
					# operstate sysfs variable.
 | 
				
			||||||
 | 
					# 0: up
 | 
				
			||||||
 | 
					# 1: down
 | 
				
			||||||
 | 
					# 2: invalid arguments
 | 
				
			||||||
 | 
					is_admin_up()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local iface="$1"
 | 
				
			||||||
 | 
						[ -z "$iface" ] && iface="$IFACE"
 | 
				
			||||||
 | 
						ip link show dev $iface | \
 | 
				
			||||||
 | 
						sed -n '1,1{ /[<,]UP[,>]/{ q 0 }}; q 1; '
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					is_oper_up()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local iface="$1"
 | 
				
			||||||
 | 
						[ -z "$iface" ] && iface="$IFACE"
 | 
				
			||||||
 | 
						read state </sys/class/net/"${iface}"/operstate
 | 
				
			||||||
 | 
						[ "x$state" = "up" ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
macchanger_depend()
 | 
					macchanger_depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	before macnet
 | 
						before macnet
 | 
				
			||||||
 | 
						# no program 'macchanger', as we have partial functionality without it
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_config_vars="$_config_vars mac"
 | 
					_config_vars="$_config_vars mac"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,18 +3,9 @@
 | 
				
			|||||||
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
 | 
					# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
 | 
				
			||||||
# All rights reserved. Released under the 2-clause BSD license.
 | 
					# All rights reserved. Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_ip()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if [ -x /bin/ip ]; then
 | 
					 | 
				
			||||||
		echo /bin/ip
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		echo /sbin/ip
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
macvlan_depend()
 | 
					macvlan_depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	program $(_ip)
 | 
						program ip
 | 
				
			||||||
	after interface
 | 
						after interface
 | 
				
			||||||
	before dhcp macchanger
 | 
						before dhcp macchanger
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -24,17 +15,6 @@ _is_macvlan()
 | 
				
			|||||||
	[ -n "$(export RC_SVCNAME="net.${IFACE}"; service_get_value macvlan)" ]
 | 
						[ -n "$(export RC_SVCNAME="net.${IFACE}"; service_get_value macvlan)" ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_check_macvlan()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if [ ! -d /sys/module/macvlan ]; then
 | 
					 | 
				
			||||||
		modprobe macvlan
 | 
					 | 
				
			||||||
		if [ ! -d /sys/module/macvlan ]; then
 | 
					 | 
				
			||||||
			eerror "MAC-VLAN support is not present in this kernel"
 | 
					 | 
				
			||||||
			return 1
 | 
					 | 
				
			||||||
		fi
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
macvlan_pre_start()
 | 
					macvlan_pre_start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	# MAC-VLAN needs an existing interface to link to
 | 
						# MAC-VLAN needs an existing interface to link to
 | 
				
			||||||
@@ -42,7 +22,11 @@ macvlan_pre_start()
 | 
				
			|||||||
	eval macvlan=\$macvlan_${IFVAR}
 | 
						eval macvlan=\$macvlan_${IFVAR}
 | 
				
			||||||
	[ -z "${macvlan}" ] && return 0
 | 
						[ -z "${macvlan}" ] && return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_check_macvlan || return 1
 | 
						case " ${MODULES} " in
 | 
				
			||||||
 | 
							*" ifconfig "*)
 | 
				
			||||||
 | 
									eerror "sys-apps/iproute2 is required to configure MACVLANs"
 | 
				
			||||||
 | 
									return 1 ;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# optional mode, default to "private"
 | 
						# optional mode, default to "private"
 | 
				
			||||||
	local mode=
 | 
						local mode=
 | 
				
			||||||
@@ -54,7 +38,7 @@ macvlan_pre_start()
 | 
				
			|||||||
	if [ -n "${e}" ]; then
 | 
						if [ -n "${e}" ]; then
 | 
				
			||||||
		eend 1 "${e}"
 | 
							eend 1 "${e}"
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		eend 0 && service_set_value macvlan "${macvlan}"
 | 
							eend 0 && _up && service_set_value macvlan "${macvlan}"
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,9 +4,10 @@
 | 
				
			|||||||
tuntap_depend()
 | 
					tuntap_depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	before bridge interface macchanger
 | 
						before bridge interface macchanger
 | 
				
			||||||
 | 
						program ip openvpn tunctl
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_config_vars="$_config_vars tunctl"
 | 
					_config_vars="$_config_vars iproute2 openvpn tunctl"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_is_tuntap()
 | 
					_is_tuntap()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -16,6 +17,7 @@ _is_tuntap()
 | 
				
			|||||||
tuntap_pre_start()
 | 
					tuntap_pre_start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	local tuntap=
 | 
						local tuntap=
 | 
				
			||||||
 | 
						local rc=
 | 
				
			||||||
	eval tuntap=\$tuntap_${IFVAR}
 | 
						eval tuntap=\$tuntap_${IFVAR}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[ -z "${tuntap}" ] && return 0
 | 
						[ -z "${tuntap}" ] && return 0
 | 
				
			||||||
@@ -44,30 +46,42 @@ tuntap_pre_start()
 | 
				
			|||||||
	# Set the base metric to 1000
 | 
						# Set the base metric to 1000
 | 
				
			||||||
	metric=1000
 | 
						metric=1000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local o_opts= t_opts= do_openvpn=false do_tunctl=false
 | 
						local i_opts= o_opts= t_opts=
 | 
				
			||||||
 | 
						local do_iproute2=false do_openvpn=false do_tunctl=false
 | 
				
			||||||
 | 
						eval i_opts=\$iproute2_${IFVAR}
 | 
				
			||||||
	eval o_opts=\$openvpn_${IFVAR}
 | 
						eval o_opts=\$openvpn_${IFVAR}
 | 
				
			||||||
	eval t_opts=\$tunctl_${IFVAR}
 | 
						eval t_opts=\$tunctl_${IFVAR}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if [ -n "${o_opts}" ] && type openvpn >/dev/null 2>&1; then
 | 
						if [ -n "${i_opts}" ] && type ip >/dev/null 2>&1; then
 | 
				
			||||||
 | 
							do_iproute2=true
 | 
				
			||||||
 | 
						elif [ -n "${o_opts}" ] && type openvpn >/dev/null 2>&1; then
 | 
				
			||||||
		do_openvpn=true
 | 
							do_openvpn=true
 | 
				
			||||||
	elif [ -n "${t_opts}" ] && type tunctl >/dev/null 2>&1; then
 | 
						elif [ -n "${t_opts}" ] && type tunctl >/dev/null 2>&1; then
 | 
				
			||||||
		do_tunctl=true
 | 
							do_tunctl=true
 | 
				
			||||||
 | 
						elif type ip >/dev/null 2>&1; then
 | 
				
			||||||
 | 
							do_iproute2=true
 | 
				
			||||||
	elif type openvpn >/dev/null 2>&1; then
 | 
						elif type openvpn >/dev/null 2>&1; then
 | 
				
			||||||
		do_openvpn=true
 | 
							do_openvpn=true
 | 
				
			||||||
	elif type tunctl >/dev/null 2>&1; then
 | 
						elif type tunctl >/dev/null 2>&1; then
 | 
				
			||||||
		do_tunctl=true
 | 
							do_tunctl=true
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ${do_openvpn}; then
 | 
						if ${do_iproute2}; then
 | 
				
			||||||
 | 
							ip tuntap add dev "${IFACE}" mode "${tuntap}" ${i_opts}
 | 
				
			||||||
 | 
							rc=$?
 | 
				
			||||||
 | 
						elif ${do_openvpn}; then
 | 
				
			||||||
		openvpn --mktun --dev-type "${tuntap}" --dev "${IFACE}" \
 | 
							openvpn --mktun --dev-type "${tuntap}" --dev "${IFACE}" \
 | 
				
			||||||
			${o_opts} >/dev/null
 | 
								${o_opts} >/dev/null
 | 
				
			||||||
 | 
							rc=$?
 | 
				
			||||||
	elif ${do_tunctl}; then
 | 
						elif ${do_tunctl}; then
 | 
				
			||||||
		tunctl ${t_opts} -t "${IFACE}" >/dev/null
 | 
							tunctl ${t_opts} -t "${IFACE}" >/dev/null
 | 
				
			||||||
 | 
							rc=$?
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		eerror "Neither openvpn nor tunctl has been found, please install"
 | 
							eerror "Neither iproute2, openvpn nor tunctl has been found, please install"
 | 
				
			||||||
		eerror "either \"openvpn\" or \"usermode-utilities\"."
 | 
							eerror "either \"iproute2\" \"openvpn\" or \"usermode-utilities\"."
 | 
				
			||||||
 | 
							rc=1
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	eend $? && _up && service_set_value tuntap "${tuntap}"
 | 
						eend $rc && _up && service_set_value tuntap "${tuntap}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tuntap_post_stop()
 | 
					tuntap_post_stop()
 | 
				
			||||||
@@ -75,7 +89,9 @@ tuntap_post_stop()
 | 
				
			|||||||
	_is_tuntap || return 0
 | 
						_is_tuntap || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ebegin "Destroying Tun/Tap interface ${IFACE}"
 | 
						ebegin "Destroying Tun/Tap interface ${IFACE}"
 | 
				
			||||||
	if type tunctl >/dev/null 2>&1; then
 | 
						if type ip > /dev/null 2>&1; then
 | 
				
			||||||
 | 
							ip tuntap del dev ${IFACE} mode $(service_get_value tuntap)
 | 
				
			||||||
 | 
						elif type tunctl >/dev/null 2>&1; then
 | 
				
			||||||
		tunctl -d "${IFACE}" >/dev/null
 | 
							tunctl -d "${IFACE}" >/dev/null
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		openvpn --rmtun \
 | 
							openvpn --rmtun \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,12 +61,12 @@ udhcpc_start()
 | 
				
			|||||||
	esac
 | 
						esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case " ${args} " in
 | 
						case " ${args} " in
 | 
				
			||||||
		*" --hosname="*|*" -h "*|*" -H "*);;
 | 
							*" --hostname="*|*" -h "*|*" -H "*);;
 | 
				
			||||||
		*)
 | 
							*)
 | 
				
			||||||
			if ${sendhost}; then
 | 
								if ${sendhost}; then
 | 
				
			||||||
				local hname="$(hostname)"
 | 
									local hname="$(hostname)"
 | 
				
			||||||
				if [ "${hname}" != "(none)" ] && [ "${hname}" != "localhost" ]; then
 | 
									if [ "${hname}" != "(none)" ] && [ "${hname}" != "localhost" ]; then
 | 
				
			||||||
					args="${args} --hostname='${hname}'"
 | 
										args="${args} -x hostname:'${hname}'"
 | 
				
			||||||
				fi
 | 
									fi
 | 
				
			||||||
			fi
 | 
								fi
 | 
				
			||||||
			;;
 | 
								;;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										54
									
								
								net/vlan.sh
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								net/vlan.sh
									
									
									
									
									
								
							@@ -1,18 +1,9 @@
 | 
				
			|||||||
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
 | 
					# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
 | 
				
			||||||
# Released under the 2-clause BSD license.
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_ip()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if [ -x /bin/ip ]; then
 | 
					 | 
				
			||||||
		echo /bin/ip
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		echo /sbin/ip
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
vlan_depend()
 | 
					vlan_depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	program $(_ip)
 | 
						program ip
 | 
				
			||||||
	after interface
 | 
						after interface
 | 
				
			||||||
	before dhcp
 | 
						before dhcp
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -51,6 +42,14 @@ vlan_pre_start()
 | 
				
			|||||||
		eerror "You must convert your vconfig_ VLAN entries to vlan${N} entries."
 | 
							eerror "You must convert your vconfig_ VLAN entries to vlan${N} entries."
 | 
				
			||||||
		return 1
 | 
							return 1
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
						local vlans=
 | 
				
			||||||
 | 
						eval vlans=\$vlans_${IFVAR}
 | 
				
			||||||
 | 
						[ -z "$vlans" ] && return 0
 | 
				
			||||||
 | 
						case " ${MODULES} " in
 | 
				
			||||||
 | 
							*" ifconfig "*)
 | 
				
			||||||
 | 
									eerror "sys-apps/iproute2 is required to configure VLANs"
 | 
				
			||||||
 | 
									return 1 ;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vlan_post_start()
 | 
					vlan_post_start()
 | 
				
			||||||
@@ -67,26 +66,41 @@ vlan_post_start()
 | 
				
			|||||||
		einfo "Adding VLAN ${vlan} to ${IFACE}"
 | 
							einfo "Adding VLAN ${vlan} to ${IFACE}"
 | 
				
			||||||
		# We need to gather all interface configuration options
 | 
							# We need to gather all interface configuration options
 | 
				
			||||||
		# 1) naming. Default to the standard "${IFACE}.${vlan}" but it can be anything
 | 
							# 1) naming. Default to the standard "${IFACE}.${vlan}" but it can be anything
 | 
				
			||||||
		eval vname=\$vlan${vlan}_name
 | 
							eval vname=\$${IFACE}_vlan${vlan}_name
 | 
				
			||||||
 | 
							[ -z "${vname}" ] && eval vname=\$vlan${vlan}_name
 | 
				
			||||||
		[ -z "${vname}" ] && vname="${IFACE}.${vlan}"
 | 
							[ -z "${vname}" ] && vname="${IFACE}.${vlan}"
 | 
				
			||||||
		# 2) flags
 | 
							# 2) flags
 | 
				
			||||||
		eval vflags=\$vlan${vlan}_flags
 | 
							eval vflags=\$${IFACE}_vlan${vlan}_flags
 | 
				
			||||||
 | 
							[ -z "${vname}" ] && eval vflags=\$vlan${vlan}_flags
 | 
				
			||||||
		# 3) ingress/egress map
 | 
							# 3) ingress/egress map
 | 
				
			||||||
		eval vingress=\$vlan${vlan}_ingress
 | 
							eval vingress=\$${IFACE}_vlan${vlan}_ingress
 | 
				
			||||||
 | 
							[ -z "${vingress}" ] && eval vingress=\$vlan${vlan}_ingress
 | 
				
			||||||
		[ -z "${vingress}" ] || vingress="ingress-qos-map ${vingress}"
 | 
							[ -z "${vingress}" ] || vingress="ingress-qos-map ${vingress}"
 | 
				
			||||||
		eval vegress=\$vlan${vlan}_egress
 | 
							eval vegress=\$${IFACE}_vlan${vlan}_egress
 | 
				
			||||||
 | 
							[ -z "${vegress}" ] && eval vegress=\$vlan${vlan}_egress
 | 
				
			||||||
		[ -z "${vegress}" ] || vegress="egress-qos-map ${vegress}"
 | 
							[ -z "${vegress}" ] || vegress="egress-qos-map ${vegress}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# txqueue
 | 
				
			||||||
		local txqueuelen=
 | 
							local txqueuelen=
 | 
				
			||||||
		eval txqueuelen=\$txqueuelen_vlan${vlan}
 | 
							eval txqueuelen=\$txqueuelen_${IFACE}_vlan${vlan}
 | 
				
			||||||
 | 
							[ -z "${txqueuelen}" ] && eval txqueuelen=\$txqueuelen_vlan${vlan}
 | 
				
			||||||
 | 
							# mac
 | 
				
			||||||
		local mac=
 | 
							local mac=
 | 
				
			||||||
		eval mac=\$mac_vlan${vlan}
 | 
							eval mac=\$mac_${IFACE}_vlan${vlan}
 | 
				
			||||||
 | 
							[ -z "${mac}" ] && eval mac=\$mac_vlan${vlan}
 | 
				
			||||||
 | 
							# broadcast
 | 
				
			||||||
		local broadcast=
 | 
							local broadcast=
 | 
				
			||||||
		eval broadcast=\$broadcast_vlan${vlan}
 | 
							eval broadcast=\$broadcast_${IFACE}_vlan${vlan}
 | 
				
			||||||
 | 
							[ -z "${broadcast}" ] && eval broadcast=\$broadcast_vlan${vlan}
 | 
				
			||||||
 | 
							# mtu
 | 
				
			||||||
		local mtu=
 | 
							local mtu=
 | 
				
			||||||
		eval mtu=\$mtu_vlan${vlan}
 | 
							eval mtu=\$mtu_${IFACE}_vlan${vlan}
 | 
				
			||||||
		local opts="${txqueuelen:+txqueuelen} ${txqueuelen} ${mac:+address} ${mac} ${broadcast:+broadcast} ${broadcast} ${mtu+:mtu} ${mtu}"
 | 
							[ -z "${mtu}" ] && eval mtu=\$mtu_vlan${vlan}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# combine it all
 | 
				
			||||||
 | 
							local opts="${txqueuelen:+txqueuelen} ${txqueuelen} ${mac:+address} ${mac} ${broadcast:+broadcast} ${broadcast} ${mtu:+mtu} ${mtu}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							veinfo "ip link add link \"${IFACE}\" name \"${vname}\" ${opts} type vlan id \"${vlan}\" ${vflags} ${vingress} ${vegress}"
 | 
				
			||||||
		e="$(ip link add link "${IFACE}" name "${vname}" ${opts} type vlan id "${vlan}" ${vflags} ${vingress} ${vegress} 2>&1 1>/dev/null)"
 | 
							e="$(ip link add link "${IFACE}" name "${vname}" ${opts} type vlan id "${vlan}" ${vflags} ${vingress} ${vegress} 2>&1 1>/dev/null)"
 | 
				
			||||||
		if [ -n "${e}" ]; then
 | 
							if [ -n "${e}" ]; then
 | 
				
			||||||
			eend 1 "${e}"
 | 
								eend 1 "${e}"
 | 
				
			||||||
@@ -115,7 +129,7 @@ vlan_pre_stop()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	local vlan=
 | 
						local vlan=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_exists || return 1
 | 
						_exists || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for vlan in $(_get_vlans); do
 | 
						for vlan in $(_get_vlans); do
 | 
				
			||||||
		einfo "Removing VLAN ${vlan##*.} from ${IFACE}"
 | 
							einfo "Removing VLAN ${vlan##*.} from ${IFACE}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
BOOT=		bootmisc fsck hostname localmount \
 | 
					BOOT=		bootmisc fsck hostname localmount \
 | 
				
			||||||
		root swap sysctl urandom ${BOOT-${OS}}
 | 
							root swap swapfiles sysctl urandom ${BOOT-${OS}}
 | 
				
			||||||
DEFAULT=	local netmount
 | 
					DEFAULT=	local netmount
 | 
				
			||||||
SHUTDOWN=	savecache ${SHUTDOWN-${OS}}
 | 
					SHUTDOWN=	savecache ${SHUTDOWN-${OS}}
 | 
				
			||||||
SYSINIT=	${SYSINIT-${OS}}
 | 
					SYSINIT=	${SYSINIT-${OS}}
 | 
				
			||||||
@@ -10,6 +10,12 @@ BOOTDIR=	${LEVELDIR}/boot
 | 
				
			|||||||
DEFAULTDIR=	${LEVELDIR}/default
 | 
					DEFAULTDIR=	${LEVELDIR}/default
 | 
				
			||||||
SHUTDOWNDIR=	${LEVELDIR}/shutdown
 | 
					SHUTDOWNDIR=	${LEVELDIR}/shutdown
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq (${MKNET},)
 | 
				
			||||||
 | 
					BOOT+= network staticroute
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INITFILES=	../init.d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MK=		../mk
 | 
					MK=		../mk
 | 
				
			||||||
include ${MK}/sys.mk
 | 
					include ${MK}/sys.mk
 | 
				
			||||||
include ${MK}/os.mk
 | 
					include ${MK}/os.mk
 | 
				
			||||||
@@ -19,19 +25,25 @@ BOOT-${OS}=
 | 
				
			|||||||
SHUTDOWN-${OS}=
 | 
					SHUTDOWN-${OS}=
 | 
				
			||||||
SYSINIT-${OS}=
 | 
					SYSINIT-${OS}=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq (${MKNET},oldnet)
 | 
				
			||||||
 | 
					BOOT-FreeBSD+= net.lo0
 | 
				
			||||||
 | 
					BOOT-Linux+= net.lo
 | 
				
			||||||
 | 
					BOOT-NetBSD+= net.lo0
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOT-BSD=	hostid newsyslog savecore syslogd swap-blk
 | 
					BOOT-BSD=	hostid newsyslog savecore syslogd swap-blk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Generic BSD stuff
 | 
					# Generic BSD stuff
 | 
				
			||||||
BOOT-FreeBSD=	hostid net.lo0 newsyslog savecore syslogd
 | 
					BOOT-FreeBSD+=	hostid newsyslog savecore syslogd
 | 
				
			||||||
# FreeBSD specific stuff
 | 
					# FreeBSD specific stuff
 | 
				
			||||||
BOOT-FreeBSD+=	adjkerntz dumpon syscons
 | 
					BOOT-FreeBSD+=	adjkerntz dumpon syscons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOT-Linux=	hwclock keymaps modules mtab net.lo procfs termencoding migrate-run
 | 
					BOOT-Linux+=	hwclock keymaps modules mtab procfs termencoding tmpfiles.setup
 | 
				
			||||||
SHUTDOWN-Linux=	killprocs mount-ro
 | 
					SHUTDOWN-Linux=	killprocs mount-ro
 | 
				
			||||||
SYSINIT-Linux=	devfs dmesg
 | 
					SYSINIT-Linux=	devfs dmesg sysfs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Generic BSD stuff
 | 
					# Generic BSD stuff
 | 
				
			||||||
BOOT-NetBSD=	hostid net.lo0 newsyslog savecore syslogd
 | 
					BOOT-NetBSD+=	hostid newsyslog savecore syslogd
 | 
				
			||||||
# NetBSD specific stuff
 | 
					# NetBSD specific stuff
 | 
				
			||||||
BOOT-NetBSD+=	devdb swap-blk ttys wscons
 | 
					BOOT-NetBSD+=	devdb swap-blk ttys wscons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -42,34 +54,34 @@ install:
 | 
				
			|||||||
		${INSTALL} -d ${SYSINITDIR} || exit $$?; \
 | 
							${INSTALL} -d ${SYSINITDIR} || exit $$?; \
 | 
				
			||||||
		for x in ${SYSINIT}; do \
 | 
							for x in ${SYSINIT}; do \
 | 
				
			||||||
			if test -n "${PREFIX}"; then \
 | 
								if test -n "${PREFIX}"; then \
 | 
				
			||||||
				grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
 | 
									grep -q "keyword .*-prefix" ${INITFILES}/"$$x" && continue; \
 | 
				
			||||||
			fi; \
 | 
								fi; \
 | 
				
			||||||
			ln -snf ${PREFIX}/etc/init.d/"$$x" ${SYSINITDIR}/"$$x" || exit $$?; done \
 | 
								ln -snf ${INITDIR}/"$$x" ${SYSINITDIR}/"$$x" || exit $$?; done \
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	if ! test -d "${BOOTDIR}"; then \
 | 
						if ! test -d "${BOOTDIR}"; then \
 | 
				
			||||||
		${INSTALL} -d ${BOOTDIR} || exit $$?; \
 | 
							${INSTALL} -d ${BOOTDIR} || exit $$?; \
 | 
				
			||||||
		for x in ${BOOT}; do \
 | 
							for x in ${BOOT}; do \
 | 
				
			||||||
			if test -n "${PREFIX}"; then \
 | 
								if test -n "${PREFIX}"; then \
 | 
				
			||||||
				grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
 | 
									grep -q "keyword .*-prefix" ${INITFILES}/"$$x" && continue; \
 | 
				
			||||||
			fi; \
 | 
								fi; \
 | 
				
			||||||
			ln -snf ${PREFIX}/etc/init.d/"$$x" ${BOOTDIR}/"$$x" || exit $$?; \
 | 
								ln -snf ${INITDIR}/"$$x" ${BOOTDIR}/"$$x" || exit $$?; \
 | 
				
			||||||
		done \
 | 
							done \
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	if ! test -d "${DEFAULTDIR}"; then \
 | 
						if ! test -d "${DEFAULTDIR}"; then \
 | 
				
			||||||
		${INSTALL} -d ${DEFAULTDIR} || exit $$?; \
 | 
							${INSTALL} -d ${DEFAULTDIR} || exit $$?; \
 | 
				
			||||||
		for x in ${DEFAULT}; do \
 | 
							for x in ${DEFAULT}; do \
 | 
				
			||||||
			if test -n "${PREFIX}"; then \
 | 
								if test -n "${PREFIX}"; then \
 | 
				
			||||||
				grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
 | 
									grep -q "keyword .*-prefix" ${INITFILES}/"$$x" && continue; \
 | 
				
			||||||
			fi; \
 | 
								fi; \
 | 
				
			||||||
			ln -snf ${PREFIX}/etc/init.d/"$$x" ${DEFAULTDIR}/"$$x" || exit $$?; done \
 | 
								ln -snf ${INITDIR}/"$$x" ${DEFAULTDIR}/"$$x" || exit $$?; done \
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	if ! test -d "${SHUTDOWNDIR}"; then \
 | 
						if ! test -d "${SHUTDOWNDIR}"; then \
 | 
				
			||||||
		${INSTALL} -d ${SHUTDOWNDIR} || exit $$?; \
 | 
							${INSTALL} -d ${SHUTDOWNDIR} || exit $$?; \
 | 
				
			||||||
		for x in ${SHUTDOWN}; do \
 | 
							for x in ${SHUTDOWN}; do \
 | 
				
			||||||
			if test -n "${PREFIX}"; then \
 | 
								if test -n "${PREFIX}"; then \
 | 
				
			||||||
				grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
 | 
									grep -q "keyword .*-prefix" ${INITFILES}/"$$x" && continue; \
 | 
				
			||||||
			fi; \
 | 
								fi; \
 | 
				
			||||||
			ln -snf ${PREFIX}/etc/init.d/"$$x" ${SHUTDOWNDIR}/"$$x" || exit $$?; done \
 | 
								ln -snf ${INITDIR}/"$$x" ${SHUTDOWNDIR}/"$$x" || exit $$?; done \
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
check test::
 | 
					check test::
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								sh/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								sh/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -3,8 +3,11 @@ gendepends.sh
 | 
				
			|||||||
init-common-post.sh
 | 
					init-common-post.sh
 | 
				
			||||||
rc-functions.sh
 | 
					rc-functions.sh
 | 
				
			||||||
runscript.sh
 | 
					runscript.sh
 | 
				
			||||||
 | 
					cgroup-release-agent.sh
 | 
				
			||||||
init.sh
 | 
					init.sh
 | 
				
			||||||
init-early.sh
 | 
					init-early.sh
 | 
				
			||||||
ifwatchd-carrier.sh
 | 
					ifwatchd-carrier.sh
 | 
				
			||||||
ifwatchd-nocarrier.sh
 | 
					ifwatchd-nocarrier.sh
 | 
				
			||||||
udhcpc-hook.sh
 | 
					udhcpc-hook.sh
 | 
				
			||||||
 | 
					tmpfiles.sh
 | 
				
			||||||
 | 
					migrate-to-run.sh
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								sh/Makefile
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								sh/Makefile
									
									
									
									
									
								
							@@ -1,8 +1,8 @@
 | 
				
			|||||||
DIR=	${LIBEXECDIR}/sh
 | 
					DIR=	${LIBEXECDIR}/sh
 | 
				
			||||||
SRCS=	init.sh.in functions.sh.in gendepends.sh.in init-common-post.sh.in \
 | 
					SRCS=	init.sh.in functions.sh.in gendepends.sh.in init-common-post.sh.in \
 | 
				
			||||||
	rc-functions.sh.in runscript.sh.in ${SRCS-${OS}}
 | 
						rc-functions.sh.in runscript.sh.in tmpfiles.sh.in ${SRCS-${OS}}
 | 
				
			||||||
INC=	init-common-post.sh rc-mount.sh functions.sh rc-functions.sh
 | 
					INC=	init-common-post.sh rc-mount.sh functions.sh rc-functions.sh
 | 
				
			||||||
BIN=	gendepends.sh init.sh runscript.sh ${BIN-${OS}}
 | 
					BIN=	gendepends.sh init.sh runscript.sh tmpfiles.sh ${BIN-${OS}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
INSTALLAFTER=	_installafter
 | 
					INSTALLAFTER=	_installafter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -12,8 +12,10 @@ include ${MK}/os.mk
 | 
				
			|||||||
SRCS-FreeBSD=
 | 
					SRCS-FreeBSD=
 | 
				
			||||||
BIN-FreeBSD=
 | 
					BIN-FreeBSD=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SRCS-Linux=	cgroup-release-agent.sh.in init-early.sh.in udhcpc-hook.sh.in
 | 
					SRCS-Linux=	cgroup-release-agent.sh.in init-early.sh.in migrate-to-run.sh.in \
 | 
				
			||||||
BIN-Linux=	cgroup-release-agent.sh init-early.sh udhcpc-hook.sh
 | 
						udhcpc-hook.sh.in
 | 
				
			||||||
 | 
					BIN-Linux=	cgroup-release-agent.sh init-early.sh migrate-to-run.sh \
 | 
				
			||||||
 | 
						udhcpc-hook.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SRCS-NetBSD=	ifwatchd-carrier.sh.in ifwatchd-nocarrier.sh.in
 | 
					SRCS-NetBSD=	ifwatchd-carrier.sh.in ifwatchd-nocarrier.sh.in
 | 
				
			||||||
BIN-NetBSD=	ifwatchd-carrier.sh ifwatchd-nocarrier.sh
 | 
					BIN-NetBSD=	ifwatchd-carrier.sh ifwatchd-nocarrier.sh
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -105,7 +105,7 @@ else
 | 
				
			|||||||
	# the last ecmd
 | 
						# the last ecmd
 | 
				
			||||||
	for _e in ebegin eend error errorn einfo einfon ewarn ewarnn ewend \
 | 
						for _e in ebegin eend error errorn einfo einfon ewarn ewarnn ewend \
 | 
				
			||||||
		vebegin veend veinfo vewarn vewend; do
 | 
							vebegin veend veinfo vewarn vewend; do
 | 
				
			||||||
		eval "$_e() { local _r; @LIBEXECDIR@/bin/$_e \"\$@\"; _r=\$?; \
 | 
							eval "$_e() { local _r; command $_e \"\$@\"; _r=\$?; \
 | 
				
			||||||
		export EINFO_LASTCMD=$_e; return \$_r; }"
 | 
							export EINFO_LASTCMD=$_e; return \$_r; }"
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
	unset _e
 | 
						unset _e
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@
 | 
				
			|||||||
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
					# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
				
			||||||
# Released under the 2-clause BSD license.
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
. @SYSCONFDIR@/init.d/functions.sh
 | 
					. @LIBEXECDIR@/sh/functions.sh
 | 
				
			||||||
. @LIBEXECDIR@/sh/rc-functions.sh
 | 
					. @LIBEXECDIR@/sh/rc-functions.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config() {
 | 
					config() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,19 @@
 | 
				
			|||||||
: ${CONSOLE:=/dev/console}
 | 
					: ${CONSOLE:=/dev/console}
 | 
				
			||||||
: ${RC_LIBEXECDIR:=@LIBEXECDIR@}
 | 
					: ${RC_LIBEXECDIR:=@LIBEXECDIR@}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					service_present()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local p="/etc/runlevels/$1/$2"
 | 
				
			||||||
 | 
						# fail if the file doesn't exist
 | 
				
			||||||
 | 
						[ ! -e "$p" ] && return 1
 | 
				
			||||||
 | 
						# succeed if $RC_SYS empty, can't check further, assume script will run
 | 
				
			||||||
 | 
						[ -z "$RC_SYS" ] && return 0
 | 
				
			||||||
 | 
						# fail if file contains "-$RC_SYS", because then it won't run
 | 
				
			||||||
 | 
						egrep -qi "^[[:space:]]*keyword[[:space:]].*-$RC_SYS\>" "$p" && return 1
 | 
				
			||||||
 | 
						# succeed otherwise
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ -e "$RC_LIBEXECDIR"/console/unicode ]; then
 | 
					if [ -e "$RC_LIBEXECDIR"/console/unicode ]; then
 | 
				
			||||||
	termencoding="%G"
 | 
						termencoding="%G"
 | 
				
			||||||
	kmode="-u"
 | 
						kmode="-u"
 | 
				
			||||||
@@ -14,8 +27,8 @@ else
 | 
				
			|||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Try and set a font and as early as we can
 | 
					# Try and set a font and as early as we can
 | 
				
			||||||
if [ -e /etc/runlevels/"$RC_DEFAULTLEVEL"/consolefont \
 | 
					if service_present "$RC_DEFAULTLEVEL" consolefont ||
 | 
				
			||||||
	 -o -e /etc/runlevels/"$RC_BOOTLEVEL"/consolefont ]; then
 | 
					   service_present "$RC_BOOTLEVEL" consolefont; then
 | 
				
			||||||
	printf "\033%s" "$termencoding" >"$CONSOLE" 2>/dev/null
 | 
						printf "\033%s" "$termencoding" >"$CONSOLE" 2>/dev/null
 | 
				
			||||||
	if [ -r "$RC_LIBEXECDIR"/console/font -a -x /usr/bin/setfont ]; then
 | 
						if [ -r "$RC_LIBEXECDIR"/console/font -a -x /usr/bin/setfont ]; then
 | 
				
			||||||
		font="$(cat "$RC_LIBEXECDIR"/console/font)"
 | 
							font="$(cat "$RC_LIBEXECDIR"/console/font)"
 | 
				
			||||||
@@ -25,8 +38,8 @@ if [ -e /etc/runlevels/"$RC_DEFAULTLEVEL"/consolefont \
 | 
				
			|||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Try and set a keyboard map as early as possible
 | 
					# Try and set a keyboard map as early as possible
 | 
				
			||||||
if [ -e /etc/runlevels/"$RC_DEFAULTLEVEL"/keymaps \
 | 
					if service_present "$RC_DEFAULTLEVEL" keymaps ||
 | 
				
			||||||
	 -o -e /etc/runlevels/"$RC_BOOTLEVEL"/keymaps ]; then
 | 
					   service_present "$RC_BOOTLEVEL" keymaps; then
 | 
				
			||||||
	kbd_mode $kmode -C "$CONSOLE" 2>/dev/null
 | 
						kbd_mode $kmode -C "$CONSOLE" 2>/dev/null
 | 
				
			||||||
	if [ -r "$RC_LIBEXECDIR"/console/keymap ]; then
 | 
						if [ -r "$RC_LIBEXECDIR"/console/keymap ]; then
 | 
				
			||||||
		loadkeys -q "$RC_LIBEXECDIR"/console/keymap 2>/dev/null
 | 
							loadkeys -q "$RC_LIBEXECDIR"/console/keymap 2>/dev/null
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,62 +3,6 @@
 | 
				
			|||||||
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
					# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
				
			||||||
# Released under the 2-clause BSD license.
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# This basically mounts $RC_SVCDIR as a ramdisk.
 | 
					 | 
				
			||||||
# The tricky part is finding something our kernel supports
 | 
					 | 
				
			||||||
# tmpfs and ramfs are easy, so force one or the other.
 | 
					 | 
				
			||||||
svcdir_restorecon()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	local rc=0
 | 
					 | 
				
			||||||
	if [ -x /usr/sbin/selinuxenabled -a -c /selinux/null ] &&
 | 
					 | 
				
			||||||
	  selinuxenabled; then
 | 
					 | 
				
			||||||
		restorecon $RC_SVCDIR
 | 
					 | 
				
			||||||
		rc=$?
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
	return $rc
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
mount_svcdir()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	# mount from fstab if we can
 | 
					 | 
				
			||||||
	fstabinfo --mount "$RC_SVCDIR" && return 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local fs= fsopts="-o rw,noexec,nodev,nosuid"
 | 
					 | 
				
			||||||
	local svcsize=${rc_svcsize:-1024}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# Some buggy kernels report tmpfs even when not present :(
 | 
					 | 
				
			||||||
	if grep -Eq "[[:space:]]+tmpfs$" /proc/filesystems; then
 | 
					 | 
				
			||||||
		local tmpfsopts="${fsopts},mode=755,size=${svcsize}k"
 | 
					 | 
				
			||||||
		mount -n -t tmpfs $tmpfsopts rc-svcdir "$RC_SVCDIR"
 | 
					 | 
				
			||||||
		if [ $? -eq 0 ]; then
 | 
					 | 
				
			||||||
			svcdir_restorecon
 | 
					 | 
				
			||||||
			[ $? -eq 0 ] && return 0
 | 
					 | 
				
			||||||
		fi
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if grep -Eq "[[:space:]]+ramfs$" /proc/filesystems; then
 | 
					 | 
				
			||||||
		fs="ramfs"
 | 
					 | 
				
			||||||
		# ramfs has no special options
 | 
					 | 
				
			||||||
	elif [ -e /dev/ram0 ] \
 | 
					 | 
				
			||||||
		&& grep -Eq "[[:space:]]+ext2$" /proc/filesystems; then
 | 
					 | 
				
			||||||
		devdir="/dev/ram0"
 | 
					 | 
				
			||||||
		fs="ext2"
 | 
					 | 
				
			||||||
		dd if=/dev/zero of="$devdir" bs=1k count="$svcsize"
 | 
					 | 
				
			||||||
		mkfs -t "$fs" -i 1024 -vm0 "$devdir" "$svcsize"
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		echo
 | 
					 | 
				
			||||||
		eerror "OpenRC requires tmpfs, ramfs or a ramdisk + ext2"
 | 
					 | 
				
			||||||
		eerror "compiled into the kernel"
 | 
					 | 
				
			||||||
		echo
 | 
					 | 
				
			||||||
		return 1
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mount -n -t "$fs" $fsopts rc-svcdir "$RC_SVCDIR"
 | 
					 | 
				
			||||||
	if [ $? -eq 0 ]; then
 | 
					 | 
				
			||||||
		svcdir_restorecon
 | 
					 | 
				
			||||||
		[ $? -eq 0 ] && return 0
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
. "$RC_LIBEXECDIR"/sh/functions.sh
 | 
					. "$RC_LIBEXECDIR"/sh/functions.sh
 | 
				
			||||||
[ -r /etc/rc.conf ] && . /etc/rc.conf
 | 
					[ -r /etc/rc.conf ] && . /etc/rc.conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -75,7 +19,7 @@ if [ -e $f ]; then
 | 
				
			|||||||
	if [ "$(VAR=a cat $f)" = "$(VAR=b cat $f)" ]; then
 | 
						if [ "$(VAR=a cat $f)" = "$(VAR=b cat $f)" ]; then
 | 
				
			||||||
		eerror "You have cruft in /proc that should be deleted"
 | 
							eerror "You have cruft in /proc that should be deleted"
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		einfo "/proc is already mounted, skipping"
 | 
							einfo "/proc is already mounted"
 | 
				
			||||||
		mountproc=false
 | 
							mountproc=false
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
@@ -91,24 +35,45 @@ if $mountproc; then
 | 
				
			|||||||
	eend $?
 | 
						eend $?
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Mount tmpfs on /run when directory exists.
 | 
					 | 
				
			||||||
# /run is a new directory for storing volatile runtime data.
 | 
					# /run is a new directory for storing volatile runtime data.
 | 
				
			||||||
# Read more about /run at https://lwn.net/Articles/436012
 | 
					# Read more about /run at https://lwn.net/Articles/436012
 | 
				
			||||||
if [ -d /run ]; then
 | 
					sys="$(rc --sys)"
 | 
				
			||||||
	if mountinfo -q /run; then
 | 
					
 | 
				
			||||||
		einfo "/run is already mounted, skipping"
 | 
					if [ ! -d /run ]; then
 | 
				
			||||||
 | 
						if [ "$sys" = VSERVER ]; then
 | 
				
			||||||
 | 
							if [ -e /run ]; then
 | 
				
			||||||
 | 
							rm -rf /run
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							mkdir /run
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
 | 
							eerror "The /run directory does not exist. Unable to continue."
 | 
				
			||||||
 | 
							return 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -L /run/openrc ]; then
 | 
				
			||||||
 | 
						rm /run/openrc
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ "$sys" = VSERVER ]; then
 | 
				
			||||||
 | 
						rm -rf /run/*
 | 
				
			||||||
 | 
					elif ! mountinfo -q /run; then
 | 
				
			||||||
	ebegin "Mounting /run"
 | 
						ebegin "Mounting /run"
 | 
				
			||||||
 | 
						rc=0
 | 
				
			||||||
	if ! fstabinfo --mount /run; then
 | 
						if ! fstabinfo --mount /run; then
 | 
				
			||||||
		mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /run
 | 
							mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /run
 | 
				
			||||||
 | 
							rc=$?
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
		eend $?
 | 
						if [ $rc != 0 ]; then
 | 
				
			||||||
 | 
							eerror "Unable to mount tmpfs on /run."
 | 
				
			||||||
 | 
							eerror "Can't continue."
 | 
				
			||||||
 | 
							exit 1
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	checkpath -d -m 0775 -o root:uucp /run/lock
 | 
					 | 
				
			||||||
elif [ -e /run ]; then
 | 
					 | 
				
			||||||
	einfo "Unable to mount /run since it is not a directory"
 | 
					 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					checkpath -d $RC_SVCDIR
 | 
				
			||||||
 | 
					checkpath -d -m 0775 -o root:uucp /run/lock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Try to mount xenfs as early as possible, otherwise rc_sys() will always
 | 
					# Try to mount xenfs as early as possible, otherwise rc_sys() will always
 | 
				
			||||||
# return RC_SYS_XENU and will think that we are in a domU while it's not.
 | 
					# return RC_SYS_XENU and will think that we are in a domU while it's not.
 | 
				
			||||||
if grep -Eq "[[:space:]]+xenfs$" /proc/filesystems; then
 | 
					if grep -Eq "[[:space:]]+xenfs$" /proc/filesystems; then
 | 
				
			||||||
@@ -119,4 +84,9 @@ if grep -Eq "[[:space:]]+xenfs$" /proc/filesystems; then
 | 
				
			|||||||
	eend $?
 | 
						eend $?
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
. "$RC_LIBEXECDIR"/sh/init-common-post.sh
 | 
					if [ -e "$RC_LIBEXECDIR"/cache/deptree ]; then
 | 
				
			||||||
 | 
						cp -p "$RC_LIBEXECDIR"/cache/* "$RC_SVCDIR" 2>/dev/null
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo sysinit >"$RC_SVCDIR"/softlevel
 | 
				
			||||||
 | 
					exit 0
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										29
									
								
								sh/migrate-to-run.sh.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								sh/migrate-to-run.sh.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					#!@SHELL@
 | 
				
			||||||
 | 
					# Copyright (c) 2012 William Hubbs <w.d.hubbs@gmail.com>
 | 
				
			||||||
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					. "@LIBEXECDIR@/sh/functions.sh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if ! mountinfo -q -f tmpfs "@LIBEXECDIR@/init.d"; then
 | 
				
			||||||
 | 
						einfo "The OpenRC dependency data has already been migrated."
 | 
				
			||||||
 | 
						exit 0
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ ! -d /run ]; then
 | 
				
			||||||
 | 
						eerror "/run is not a directory."
 | 
				
			||||||
 | 
						eerror "moving /run to /run.pre-openrc"
 | 
				
			||||||
 | 
						mv /run /run.pre-openrc
 | 
				
			||||||
 | 
						mkdir /run
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rm -rf /run/openrc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if ! mountinfo -q -f tmpfs /run; then
 | 
				
			||||||
 | 
						ln -s "@LIBEXECDIR@"/init.d /run/openrc
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						cp -a "@LIBEXECDIR@/init.d" /run/openrc
 | 
				
			||||||
 | 
						rc-update -u
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					einfo "The OpenRC dependency data was migrated successfully."
 | 
				
			||||||
 | 
					exit 0
 | 
				
			||||||
@@ -4,6 +4,22 @@
 | 
				
			|||||||
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
					# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
				
			||||||
# Released under the 2-clause BSD license.
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					verify_boot()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if [ ! -e ${RC_SVCDIR}/softlevel ]; then
 | 
				
			||||||
 | 
							eerror "You are attempting to run an openrc service on a"
 | 
				
			||||||
 | 
							eerror "system which openrc did not boot."
 | 
				
			||||||
 | 
							eerror "You may be inside a chroot or you may have used"
 | 
				
			||||||
 | 
							eerror "another initialization system to boot this system."
 | 
				
			||||||
 | 
							eerror "In this situation, you will get unpredictable results!"
 | 
				
			||||||
 | 
							eerror
 | 
				
			||||||
 | 
							eerror "If you really want to do this, issue the following command:"
 | 
				
			||||||
 | 
							eerror "touch ${RC_SVCDIR}/softlevel"
 | 
				
			||||||
 | 
							exit 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sourcex()
 | 
					sourcex()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if [ "$1" = "-e" ]; then
 | 
						if [ "$1" = "-e" ]; then
 | 
				
			||||||
@@ -16,24 +32,7 @@ sourcex()
 | 
				
			|||||||
	fi
 | 
						fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
loadconfig()
 | 
					sourcex "@LIBEXECDIR@/sh/functions.sh"
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	# If we're net.eth0 or openvpn.work then load net or openvpn config
 | 
					 | 
				
			||||||
	_c=${RC_SVCNAME%%.*}
 | 
					 | 
				
			||||||
	if [ -n "$_c" -a "$_c" != "$RC_SVCNAME" ]; then
 | 
					 | 
				
			||||||
		if ! sourcex -e "$1/$_c.$RC_RUNLEVEL"; then
 | 
					 | 
				
			||||||
			sourcex -e "$1/$_c"
 | 
					 | 
				
			||||||
		fi
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
	unset _c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# Overlay with our specific config
 | 
					 | 
				
			||||||
	if ! sourcex -e "$1/$RC_SVCNAME.$RC_RUNLEVEL"; then
 | 
					 | 
				
			||||||
		sourcex -e "$1/$RC_SVCNAME"
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sourcex "@SYSCONFDIR@/init.d/functions.sh"
 | 
					 | 
				
			||||||
sourcex "@LIBEXECDIR@/sh/rc-functions.sh"
 | 
					sourcex "@LIBEXECDIR@/sh/rc-functions.sh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Support LiveCD foo
 | 
					# Support LiveCD foo
 | 
				
			||||||
@@ -41,18 +40,6 @@ if sourcex -e "/sbin/livecd-functions.sh"; then
 | 
				
			|||||||
	livecd_read_commandline
 | 
						livecd_read_commandline
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ ! -e ${RC_SVCDIR}/softlevel ]; then
 | 
					 | 
				
			||||||
	eerror "You are attempting to run an openrc service on a"
 | 
					 | 
				
			||||||
	eerror "system which openrc did not boot."
 | 
					 | 
				
			||||||
	eerror "You may be inside a chroot or you may have used"
 | 
					 | 
				
			||||||
	eerror "another initialization system to boot this system."
 | 
					 | 
				
			||||||
	eerror "In this situation, you will get unpredictable results!"
 | 
					 | 
				
			||||||
	eerror
 | 
					 | 
				
			||||||
	eerror "If you really want to do this, issue the following command:"
 | 
					 | 
				
			||||||
	eerror "touch ${RC_SVCDIR}/softlevel"
 | 
					 | 
				
			||||||
	exit 1
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if [ -z "$1" -o -z "$2" ]; then
 | 
					if [ -z "$1" -o -z "$2" ]; then
 | 
				
			||||||
	eerror "$RC_SVCNAME: not enough arguments"
 | 
						eerror "$RC_SVCNAME: not enough arguments"
 | 
				
			||||||
	exit 1
 | 
						exit 1
 | 
				
			||||||
@@ -141,26 +128,17 @@ start()
 | 
				
			|||||||
	local _background=
 | 
						local _background=
 | 
				
			||||||
	ebegin "Starting ${name:-$RC_SVCNAME}"
 | 
						ebegin "Starting ${name:-$RC_SVCNAME}"
 | 
				
			||||||
	if yesno "${command_background}"; then
 | 
						if yesno "${command_background}"; then
 | 
				
			||||||
		_background="--background --pidfile"
 | 
							if [ -z "${pidfile}" ]; then
 | 
				
			||||||
 | 
								eend 1 "command_background option used but no pidfile specified"
 | 
				
			||||||
 | 
								return 1
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							_background="--background --make-pidfile"
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	if yesno "$start_inactive"; then
 | 
						if yesno "$start_inactive"; then
 | 
				
			||||||
		local _inactive=false
 | 
							local _inactive=false
 | 
				
			||||||
		service_inactive && _inactive=true
 | 
							service_inactive && _inactive=true
 | 
				
			||||||
		mark_service_inactive
 | 
							mark_service_inactive
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	if [ "$RC_UNAME" = Linux ]; then
 | 
					 | 
				
			||||||
		local cgroup=/sys/fs/cgroup/openrc
 | 
					 | 
				
			||||||
		local svc_cgroup=${cgroup}/${RC_SVCNAME}
 | 
					 | 
				
			||||||
		if mountinfo -q ${cgroup}; then
 | 
					 | 
				
			||||||
			mkdir ${svc_cgroup}
 | 
					 | 
				
			||||||
			for f in cpuset.cpus cpuset.mems; do
 | 
					 | 
				
			||||||
					if [ -f ${cgroup}/${f} ]; then
 | 
					 | 
				
			||||||
							cp ${cgroup}/${f} ${svc_cgroup}
 | 
					 | 
				
			||||||
						fi
 | 
					 | 
				
			||||||
					done
 | 
					 | 
				
			||||||
			echo $$ > ${svc_cgroup}/tasks
 | 
					 | 
				
			||||||
		fi
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
	eval start-stop-daemon --start \
 | 
						eval start-stop-daemon --start \
 | 
				
			||||||
		--exec $command \
 | 
							--exec $command \
 | 
				
			||||||
		${procname:+--name} $procname \
 | 
							${procname:+--name} $procname \
 | 
				
			||||||
@@ -181,6 +159,7 @@ stop()
 | 
				
			|||||||
	[ -n "$command" -o -n "$procname" -o -n "$pidfile" ] || return 0
 | 
						[ -n "$command" -o -n "$procname" -o -n "$pidfile" ] || return 0
 | 
				
			||||||
	ebegin "Stopping ${name:-$RC_SVCNAME}"
 | 
						ebegin "Stopping ${name:-$RC_SVCNAME}"
 | 
				
			||||||
	start-stop-daemon --stop \
 | 
						start-stop-daemon --stop \
 | 
				
			||||||
 | 
							${retry:+--retry} $retry \
 | 
				
			||||||
		${command:+--exec} $command \
 | 
							${command:+--exec} $command \
 | 
				
			||||||
		${procname:+--name} $procname \
 | 
							${procname:+--name} $procname \
 | 
				
			||||||
		${pidfile:+--pidfile} $pidfile \
 | 
							${pidfile:+--pidfile} $pidfile \
 | 
				
			||||||
@@ -195,13 +174,33 @@ status()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
yesno $RC_DEBUG && set -x
 | 
					yesno $RC_DEBUG && set -x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ! loadconfig "${RC_SERVICE%/*}/../conf.d"; then
 | 
					_conf_d=${RC_SERVICE%/*}/../conf.d
 | 
				
			||||||
		loadconfig "@SYSCONFDIR@/conf.d"
 | 
					# If we're net.eth0 or openvpn.work then load net or openvpn config
 | 
				
			||||||
 | 
					_c=${RC_SVCNAME%%.*}
 | 
				
			||||||
 | 
					if [ -n "$_c" -a "$_c" != "$RC_SVCNAME" ]; then
 | 
				
			||||||
 | 
						if ! sourcex -e "$_conf_d/$_c.$RC_RUNLEVEL"; then
 | 
				
			||||||
 | 
							sourcex -e "$_conf_d/$_c"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					unset _c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Overlay with our specific config
 | 
				
			||||||
 | 
					if ! sourcex -e "$_conf_d/$RC_SVCNAME.$RC_RUNLEVEL"; then
 | 
				
			||||||
 | 
						sourcex -e "$_conf_d/$RC_SVCNAME"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					unset _conf_d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Load any system overrides
 | 
					# Load any system overrides
 | 
				
			||||||
sourcex -e "@SYSCONFDIR@/rc.conf"
 | 
					sourcex -e "@SYSCONFDIR@/rc.conf"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ "$RC_UNAME" = "Linux" -a "$1" = "start" ]; then
 | 
				
			||||||
 | 
						if [ -d /sys/fs/cgroup/openrc ]; then
 | 
				
			||||||
 | 
							mkdir -p /sys/fs/cgroup/openrc/${RC_SVCNAME}
 | 
				
			||||||
 | 
							echo $$ > /sys/fs/cgroup/openrc/${RC_SVCNAME}/tasks
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						#todo: add processes to cgroups based on settings in conf.d
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Apply any ulimit defined
 | 
					# Apply any ulimit defined
 | 
				
			||||||
[ -n "${rc_ulimit:-$RC_ULIMIT}" ] && ulimit ${rc_ulimit:-$RC_ULIMIT}
 | 
					[ -n "${rc_ulimit:-$RC_ULIMIT}" ] && ulimit ${rc_ulimit:-$RC_ULIMIT}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -234,7 +233,12 @@ while [ -n "$1" ]; do
 | 
				
			|||||||
	# Special case depend
 | 
						# Special case depend
 | 
				
			||||||
	if [ "$1" = depend ]; then
 | 
						if [ "$1" = depend ]; then
 | 
				
			||||||
		shift
 | 
							shift
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# Enter the dir of the init script to fix the globbing
 | 
				
			||||||
 | 
							# bug 412677
 | 
				
			||||||
 | 
							cd ${RC_SERVICE%/*}
 | 
				
			||||||
		_depend
 | 
							_depend
 | 
				
			||||||
 | 
							cd /
 | 
				
			||||||
		continue
 | 
							continue
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	# See if we have the required function and run it
 | 
						# See if we have the required function and run it
 | 
				
			||||||
@@ -261,7 +265,7 @@ while [ -n "$1" ]; do
 | 
				
			|||||||
				# we can run this command
 | 
									# we can run this command
 | 
				
			||||||
				for _cmd in $extra_started_commands; do
 | 
									for _cmd in $extra_started_commands; do
 | 
				
			||||||
					if [ "$_cmd" = "$1" ]; then
 | 
										if [ "$_cmd" = "$1" ]; then
 | 
				
			||||||
						if ! service_started; then
 | 
											if verify_boot && ! service_started; then
 | 
				
			||||||
							eerror "$RC_SVCNAME: cannot \`$1' as it has not been started"
 | 
												eerror "$RC_SVCNAME: cannot \`$1' as it has not been started"
 | 
				
			||||||
							exit 1
 | 
												exit 1
 | 
				
			||||||
						fi
 | 
											fi
 | 
				
			||||||
@@ -271,13 +275,16 @@ while [ -n "$1" ]; do
 | 
				
			|||||||
				# we can run this command
 | 
									# we can run this command
 | 
				
			||||||
				for _cmd in $extra_stopped_commands; do
 | 
									for _cmd in $extra_stopped_commands; do
 | 
				
			||||||
					if [ "$_cmd" = "$1" ]; then
 | 
										if [ "$_cmd" = "$1" ]; then
 | 
				
			||||||
						if ! service_stopped; then
 | 
											if verify_boot && ! service_stopped; then
 | 
				
			||||||
							eerror "$RC_SVCNAME: cannot \`$1' as it has not been stopped"
 | 
												eerror "$RC_SVCNAME: cannot \`$1' as it has not been stopped"
 | 
				
			||||||
							exit 1
 | 
												exit 1
 | 
				
			||||||
						fi
 | 
											fi
 | 
				
			||||||
					fi
 | 
										fi
 | 
				
			||||||
				done
 | 
									done
 | 
				
			||||||
				unset _cmd
 | 
									unset _cmd
 | 
				
			||||||
 | 
									case $1 in
 | 
				
			||||||
 | 
											start|stop|status) verify_boot;;
 | 
				
			||||||
 | 
									esac
 | 
				
			||||||
				if [ "$(command -v "$1_pre")" = "$1_pre" ]
 | 
									if [ "$(command -v "$1_pre")" = "$1_pre" ]
 | 
				
			||||||
				then
 | 
									then
 | 
				
			||||||
					"$1"_pre || exit $?
 | 
										"$1"_pre || exit $?
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										297
									
								
								sh/tmpfiles.sh.in
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										297
									
								
								sh/tmpfiles.sh.in
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,297 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					# This is a reimplementation of the systemd tmpfiles.d code
 | 
				
			||||||
 | 
					# Control creation, deletion, and cleaning of volatile and temporary files
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Copyright (c) 2012 Gentoo Foundation
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This instance based on the Arch Linux version:
 | 
				
			||||||
 | 
					# http://projects.archlinux.org/initscripts.git/tree/arch-tmpfiles
 | 
				
			||||||
 | 
					# As of 2012/01/01
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# See the tmpfiles.d manpage as well:
 | 
				
			||||||
 | 
					# http://0pointer.de/public/systemd-man/tmpfiles.d.html
 | 
				
			||||||
 | 
					# This script should match the manpage as of 2012/03/12
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DRYRUN=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					warninvalid() {
 | 
				
			||||||
 | 
						printf "tmpfiles: ignoring invalid entry on line %d of \`%s'\n" "$LINENUM" "$FILE"
 | 
				
			||||||
 | 
						error=$(( error+1 ))
 | 
				
			||||||
 | 
					} >&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dryrun_or_real() {
 | 
				
			||||||
 | 
						local dryrun=
 | 
				
			||||||
 | 
						[ $DRYRUN -eq 1 ] && dryrun=echo
 | 
				
			||||||
 | 
						$dryrun "$@"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					relabel() {
 | 
				
			||||||
 | 
						local path
 | 
				
			||||||
 | 
						local paths=$1 mode=$2 uid=$3 gid=$4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for path in ${paths}; do
 | 
				
			||||||
 | 
							if [ -e "$path" ]; then
 | 
				
			||||||
 | 
								[ $uid != '-' ] && dryrun_or_real chown $CHOPTS "$uid" "$path"
 | 
				
			||||||
 | 
								[ $gid != '-' ] && dryrun_or_real chgrp $CHOPTS "$gid" "$path"
 | 
				
			||||||
 | 
								[ $mode != '-' ] && dryrun_or_real chmod $CHOPTS "$mode" "$path"
 | 
				
			||||||
 | 
								[ -x /sbin/restorecon ] && dryrun_or_real restorecon $CHOPTS "$path"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_b() {
 | 
				
			||||||
 | 
						# Create a block device node if it doesn't exist yet
 | 
				
			||||||
 | 
						local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
 | 
				
			||||||
 | 
						[ ! -e "$path" ] && dryrun_or_real mknod $path b ${arg%:*} ${arg#*:}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_c() {
 | 
				
			||||||
 | 
						# Create a character device node if it doesn't exist yet
 | 
				
			||||||
 | 
						local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
 | 
				
			||||||
 | 
						[ ! -e "$path" ] && dryrun_or_real mknod $path c ${arg%:*} ${arg#*:}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_f() {
 | 
				
			||||||
 | 
						# Create a file if it doesn't exist yet
 | 
				
			||||||
 | 
						local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ $CREATE -gt 0 ] || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ ! -e "$path" ]; then
 | 
				
			||||||
 | 
							dryrun_or_real install -m"$mode" -o"$uid" -g"$gid" /dev/null "$path"
 | 
				
			||||||
 | 
							[ -z "$arg" ] || _w "$@"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_F() {
 | 
				
			||||||
 | 
						# Create or truncate a file
 | 
				
			||||||
 | 
						local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ $CREATE -gt 0 ] || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dryrun_or_real install -m"$mode" -o"$uid" -g"$gid" /dev/null "$path"
 | 
				
			||||||
 | 
						[ -z "$arg" ] || _w "$@"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_d() {
 | 
				
			||||||
 | 
						# Create a directory if it doesn't exist yet
 | 
				
			||||||
 | 
						local path=$1 mode=$2 uid=$3 gid=$4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ $CREATE -gt 0 ] || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ ! -d "$path" ]; then
 | 
				
			||||||
 | 
							dryrun_or_real install -d -m"$mode" -o"$uid" -g"$gid" "$path"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_D() {
 | 
				
			||||||
 | 
						# Create or empty a directory
 | 
				
			||||||
 | 
						local path=$1 mode=$2 uid=$3 gid=$4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ -d "$path" ] && [ $REMOVE -gt 0 ]; then
 | 
				
			||||||
 | 
							dryrun_or_real find "$path" -mindepth 1 -maxdepth 1 -xdev -exec rm -rf {} +
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ $CREATE -gt 0 ]; then
 | 
				
			||||||
 | 
							dryrun_or_real install -d -m"$mode" -o"$uid" -g"$gid" "$path"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_L() {
 | 
				
			||||||
 | 
						# Create a symlink if it doesn't exist yet
 | 
				
			||||||
 | 
						local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
 | 
				
			||||||
 | 
						[ ! -e "$path" ] && dryrun_or_real ln -s "$args" "$path"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_p() {
 | 
				
			||||||
 | 
						# Create a named pipe (FIFO) if it doesn't exist yet
 | 
				
			||||||
 | 
						local path=$1 mode=$2 uid=$3 gid=$4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ $CREATE -gt 0 ] || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ ! -p "$path" ]; then
 | 
				
			||||||
 | 
							dryrun_or_real mkfifo -m$mode "$path"
 | 
				
			||||||
 | 
							dryrun_or_real chown "$uid:$gid" "$path"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_x() {
 | 
				
			||||||
 | 
						# Ignore a path during cleaning. Use this type to exclude paths from clean-up as
 | 
				
			||||||
 | 
						# controlled with the Age parameter. Note that lines of this type do not
 | 
				
			||||||
 | 
						# influence the effect of r or R lines. Lines of this type accept shell-style
 | 
				
			||||||
 | 
						# globs in place of of normal path names.
 | 
				
			||||||
 | 
						:
 | 
				
			||||||
 | 
						# XXX: we don't implement this
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_r() {
 | 
				
			||||||
 | 
						# Remove a file or directory if it exists. This may not be used to remove
 | 
				
			||||||
 | 
						# non-empty directories, use R for that. Lines of this type accept shell-style
 | 
				
			||||||
 | 
						# globs in place of normal path names.
 | 
				
			||||||
 | 
						local path
 | 
				
			||||||
 | 
						local paths=$1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ $REMOVE -gt 0 ] || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for path in ${paths}; do
 | 
				
			||||||
 | 
							if [ -f "$path" ]; then
 | 
				
			||||||
 | 
								dryrun_or_real rm -f "$path"
 | 
				
			||||||
 | 
							elif [ -d "$path" ]; then
 | 
				
			||||||
 | 
								dryrun_or_real rmdir "$path"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_R() {
 | 
				
			||||||
 | 
						# Recursively remove a path and all its subdirectories (if it is a directory).
 | 
				
			||||||
 | 
						# Lines of this type accept shell-style globs in place of normal path names.
 | 
				
			||||||
 | 
						local path
 | 
				
			||||||
 | 
						local paths=$1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ $REMOVE -gt 0 ] || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for path in ${paths}; do
 | 
				
			||||||
 | 
							[ -d "$path" ] && dryrun_or_real rm -rf --one-file-system "$path"
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_w() {
 | 
				
			||||||
 | 
						# Write the argument parameter to a file, if it exists.
 | 
				
			||||||
 | 
						local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
 | 
				
			||||||
 | 
						if [ -f "$path" ]; then
 | 
				
			||||||
 | 
							if [ $DRYRUN -eq 1 ]; then
 | 
				
			||||||
 | 
								echo "echo \"$arg\" >>\"$path\""
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								echo "$arg" >>"$path"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_z() {
 | 
				
			||||||
 | 
						# Set ownership, access mode and relabel security context of a file or
 | 
				
			||||||
 | 
						# directory if it exists. Lines of this type accept shell-style globs in
 | 
				
			||||||
 | 
						# place of normal path names.
 | 
				
			||||||
 | 
						[ $CREATE -gt 0 ] || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						relabel "$@"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_Z() {
 | 
				
			||||||
 | 
						# Recursively set ownership, access mode and relabel security context of a
 | 
				
			||||||
 | 
						# path and all its subdirectories (if it is a directory). Lines of this type
 | 
				
			||||||
 | 
						# accept shell-style globs in place of normal path names.
 | 
				
			||||||
 | 
						[ $CREATE -gt 0 ] || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CHOPTS=-R relabel "$@"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE=0 REMOVE=0 CLEAN=0 VERBOSE=0 DRYRUN=0 error=0 LINENO=0
 | 
				
			||||||
 | 
					FILE=
 | 
				
			||||||
 | 
					fragments=
 | 
				
			||||||
 | 
					# XXX: The harcoding of /usr/lib/ is an explicit choice by upstream
 | 
				
			||||||
 | 
					tmpfiles_dirs='/usr/lib/tmpfiles.d/ /etc/tmpfiles.d/ /run/tmpfiles.d/'
 | 
				
			||||||
 | 
					tmpfiles_basenames=''
 | 
				
			||||||
 | 
					tmpfiles_d=''
 | 
				
			||||||
 | 
					# Build a list of sorted unique basenames
 | 
				
			||||||
 | 
					# directories declared later in the tmpfiles_d array will override earlier
 | 
				
			||||||
 | 
					# directories, on a per file basename basis.
 | 
				
			||||||
 | 
					# `/etc/tmpfiles.d/foo.conf' supersedes `/usr/lib/tmpfiles.d/foo.conf'.
 | 
				
			||||||
 | 
					# `/run/tmpfiles/foo.conf' will always be read after `/etc/tmpfiles.d/bar.conf'
 | 
				
			||||||
 | 
					for d in ${tmpfiles_dirs} ; do
 | 
				
			||||||
 | 
						[ -d $d ] && for f in ${d}/*.conf ; do
 | 
				
			||||||
 | 
							[ "$f" = "$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 | uniq`"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for b in $tmpfiles_basenames ; do
 | 
				
			||||||
 | 
						real_f=''
 | 
				
			||||||
 | 
						for d in $tmpfiles_dirs ; do
 | 
				
			||||||
 | 
							f=${d}/${b}
 | 
				
			||||||
 | 
							[ -f "${f}" ] && real_f=$f
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
						[ -f "${real_f}" ] && tmpfiles_d="${tmpfiles_d} ${real_f}"
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while [ $# -gt 0 ]; do
 | 
				
			||||||
 | 
						case $1 in
 | 
				
			||||||
 | 
							--create) CREATE=1 ;;
 | 
				
			||||||
 | 
							--remove) REMOVE=1 ;;
 | 
				
			||||||
 | 
							--clean) CLEAN=1 ;; # TODO: Not implemented
 | 
				
			||||||
 | 
							--verbose) VERBOSE=1 ;;
 | 
				
			||||||
 | 
							--dryrun|--dry-run) DRYRUN=1 ;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
 | 
						shift
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ $(( CLEAN )) -eq 1 ] ; then
 | 
				
			||||||
 | 
						printf '%s clean mode is not implemented\n' "${0##*/}"
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ "$CREATE$REMOVE" = '00' ]; then
 | 
				
			||||||
 | 
						printf 'usage: %s [--create] [--remove] [--clean] [--verbose] [--dry-run]\n' "${0##*/}"
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					error=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# loop through the gathered fragments, sorted globally by filename.
 | 
				
			||||||
 | 
					# `/run/tmpfiles/foo.conf' will always be read after `/etc/tmpfiles.d/bar.conf'
 | 
				
			||||||
 | 
					for FILE in $tmpfiles_d ; do
 | 
				
			||||||
 | 
						LINENUM=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						### FILE FORMAT ###
 | 
				
			||||||
 | 
						# XXX: We ignore the 'Age' parameter
 | 
				
			||||||
 | 
						# 1    2              3    4    5    6   7
 | 
				
			||||||
 | 
						# Cmd  Path           Mode UID  GID  Age Argument
 | 
				
			||||||
 | 
						# d    /run/user      0755 root root 10d -
 | 
				
			||||||
 | 
						# Mode, UID, GID, Age, Argument may be omitted!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# XXX: Upstream says whitespace is NOT permitted in the Path argument.
 | 
				
			||||||
 | 
						# But IS allowed when globs are expanded for the x/r/R/z/Z types.
 | 
				
			||||||
 | 
						while read cmd path mode uid gid age arg; do
 | 
				
			||||||
 | 
							LINENUM=$(( LINENUM+1 ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# Unless we have both command and path, skip this line.
 | 
				
			||||||
 | 
							if [ -z "$cmd" -o -z "$path" ]; then
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# whine about invalid entries
 | 
				
			||||||
 | 
							case $cmd in
 | 
				
			||||||
 | 
								f|F|w|d|D|p|L|c|b|x|r|R|z|Z) ;;
 | 
				
			||||||
 | 
								\#) continue ;;
 | 
				
			||||||
 | 
								*) warninvalid ; continue ;;
 | 
				
			||||||
 | 
							esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# fall back on defaults when parameters are passed as '-'
 | 
				
			||||||
 | 
							if [ "$mode" = '-' -o "$mode" = '' ]; then
 | 
				
			||||||
 | 
								case "$cmd" in
 | 
				
			||||||
 | 
									p|f|F) mode=0644 ;;
 | 
				
			||||||
 | 
									d|D) mode=0755 ;;
 | 
				
			||||||
 | 
									z|Z|x|r|R|L) ;;
 | 
				
			||||||
 | 
								esac
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[ "$uid" = '-' -o "$uid" = '' ] && uid=0
 | 
				
			||||||
 | 
							[ "$gid" = '-' -o "$gid" = '' ] && gid=0
 | 
				
			||||||
 | 
							[ "$age" = '-' -o "$age" = '' ] && age=0
 | 
				
			||||||
 | 
							[ "$arg" = '-' -o "$arg" = '' ] && arg=''
 | 
				
			||||||
 | 
							set -- "$path" "$mode" "$uid" "$gid" "$age" "$arg"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[ "$VERBOSE" -eq "1" ] && echo _$cmd "$@"
 | 
				
			||||||
 | 
							_$cmd "$@"
 | 
				
			||||||
 | 
							rc=$?
 | 
				
			||||||
 | 
							if [ "${DRYRUN}" -eq "0" ]; then
 | 
				
			||||||
 | 
								[ $rc -ne 0 ] && error=$((error + 1))
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						done <$FILE
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exit $error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# vim: set ts=2 sw=2 sts=2 noet ft=sh:
 | 
				
			||||||
							
								
								
									
										139
									
								
								src/includes/helpers.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								src/includes/helpers.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,139 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					  helpers.h
 | 
				
			||||||
 | 
					  This is private to us and not for user consumption
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 * 1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 * 2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *    documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 | 
				
			||||||
 | 
					 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 | 
				
			||||||
 | 
					 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
				
			||||||
 | 
					 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
				
			||||||
 | 
					 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
				
			||||||
 | 
					 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
				
			||||||
 | 
					 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
				
			||||||
 | 
					 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
				
			||||||
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __HELPERS_H__
 | 
				
			||||||
 | 
					#define __HELPERS_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ERRX fprintf (stderr, "out of memory\n"); exit (1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define UNCONST(a)		((void *)(unsigned long)(const void *)(a))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef lint
 | 
				
			||||||
 | 
					# define _unused
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if __GNUC__ > 2 || defined(__INTEL_COMPILER)
 | 
				
			||||||
 | 
					# define _dead __attribute__((__noreturn__))
 | 
				
			||||||
 | 
					# define _unused __attribute__((__unused__))
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					# define _dead
 | 
				
			||||||
 | 
					# define _unused
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Some libc implemntations don't have these */
 | 
				
			||||||
 | 
					#ifndef TAILQ_CONCAT
 | 
				
			||||||
 | 
					#define TAILQ_CONCAT(head1, head2, field) do {				      \
 | 
				
			||||||
 | 
							if (!TAILQ_EMPTY(head2)) {				      \
 | 
				
			||||||
 | 
								*(head1)->tqh_last = (head2)->tqh_first;	      \
 | 
				
			||||||
 | 
								(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
 | 
				
			||||||
 | 
								(head1)->tqh_last = (head2)->tqh_last;		      \
 | 
				
			||||||
 | 
								TAILQ_INIT((head2));				      \
 | 
				
			||||||
 | 
							}							      \
 | 
				
			||||||
 | 
						} while (0)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef TAILQ_FOREACH_SAFE
 | 
				
			||||||
 | 
					#define	TAILQ_FOREACH_SAFE(var, head, field, tvar)			      \
 | 
				
			||||||
 | 
						for ((var) = TAILQ_FIRST((head));				      \
 | 
				
			||||||
 | 
						     (var) && ((tvar) = TAILQ_NEXT((var), field), 1);		      \
 | 
				
			||||||
 | 
						     (var) = (tvar))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GLIBC__
 | 
				
			||||||
 | 
					#  if ! defined (__UCLIBC__) && ! defined (__dietlibc__)
 | 
				
			||||||
 | 
					#    define strlcpy(dst, src, size) snprintf(dst, size, "%s", src)
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef timespecsub
 | 
				
			||||||
 | 
					#define	timespecsub(tsp, usp, vsp)					      \
 | 
				
			||||||
 | 
						do {								      \
 | 
				
			||||||
 | 
							(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec;		      \
 | 
				
			||||||
 | 
							(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec;	      \
 | 
				
			||||||
 | 
							if ((vsp)->tv_nsec < 0) {				      \
 | 
				
			||||||
 | 
								(vsp)->tv_sec--;				      \
 | 
				
			||||||
 | 
								(vsp)->tv_nsec += 1000000000L;			      \
 | 
				
			||||||
 | 
							}							      \
 | 
				
			||||||
 | 
						} while (/* CONSTCOND */ 0)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_unused static void *xmalloc (size_t size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						void *value = malloc(size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (value)
 | 
				
			||||||
 | 
							return (value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ERRX;
 | 
				
			||||||
 | 
						/* NOTREACHED */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_unused static void *xrealloc(void *ptr, size_t size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						void *value = realloc(ptr, size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (value)
 | 
				
			||||||
 | 
							return (value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ERRX;
 | 
				
			||||||
 | 
						/* NOTREACHED */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_unused static char *xstrdup(const char *str)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char *value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (! str)
 | 
				
			||||||
 | 
							return (NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						value = strdup(str);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (value)
 | 
				
			||||||
 | 
							return (value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ERRX;
 | 
				
			||||||
 | 
						/* NOTREACHED */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef ERRX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* basename_c never modifies the argument. As such, if there is a trailing
 | 
				
			||||||
 | 
					 * slash then an empty string is returned. */
 | 
				
			||||||
 | 
					_unused static const char *basename_c(const char *path)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const char *slash = strrchr(path, '/');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (slash)
 | 
				
			||||||
 | 
							return (++slash);
 | 
				
			||||||
 | 
						return (path);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
@@ -36,6 +36,9 @@
 | 
				
			|||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "helpers.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define RC_LEVEL_BOOT           "boot"
 | 
					#define RC_LEVEL_BOOT           "boot"
 | 
				
			||||||
#define RC_LEVEL_DEFAULT        "default"
 | 
					#define RC_LEVEL_DEFAULT        "default"
 | 
				
			||||||
@@ -51,98 +54,6 @@
 | 
				
			|||||||
#define RC_SVCDIR_STARTED       RC_SVCDIR "/started"
 | 
					#define RC_SVCDIR_STARTED       RC_SVCDIR "/started"
 | 
				
			||||||
#define RC_SVCDIR_COLDPLUGGED	RC_SVCDIR "/coldplugged"
 | 
					#define RC_SVCDIR_COLDPLUGGED	RC_SVCDIR "/coldplugged"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ERRX fprintf (stderr, "out of memory\n"); exit (1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define UNCONST(a)		((void *)(unsigned long)(const void *)(a))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef lint
 | 
					 | 
				
			||||||
# define _unused
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if __GNUC__ > 2 || defined(__INTEL_COMPILER)
 | 
					 | 
				
			||||||
# define _dead __attribute__((__noreturn__))
 | 
					 | 
				
			||||||
# define _unused __attribute__((__unused__))
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
# define _dead
 | 
					 | 
				
			||||||
# define _unused
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Some libc implemntations don't have these */
 | 
					 | 
				
			||||||
#ifndef TAILQ_CONCAT
 | 
					 | 
				
			||||||
#define TAILQ_CONCAT(head1, head2, field) do {				      \
 | 
					 | 
				
			||||||
		if (!TAILQ_EMPTY(head2)) {				      \
 | 
					 | 
				
			||||||
			*(head1)->tqh_last = (head2)->tqh_first;	      \
 | 
					 | 
				
			||||||
			(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
 | 
					 | 
				
			||||||
			(head1)->tqh_last = (head2)->tqh_last;		      \
 | 
					 | 
				
			||||||
			TAILQ_INIT((head2));				      \
 | 
					 | 
				
			||||||
		}							      \
 | 
					 | 
				
			||||||
	} while (0)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef TAILQ_FOREACH_SAFE
 | 
					 | 
				
			||||||
#define	TAILQ_FOREACH_SAFE(var, head, field, tvar)			      \
 | 
					 | 
				
			||||||
	for ((var) = TAILQ_FIRST((head));				      \
 | 
					 | 
				
			||||||
	     (var) && ((tvar) = TAILQ_NEXT((var), field), 1);		      \
 | 
					 | 
				
			||||||
	     (var) = (tvar))
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __GLIBC__
 | 
					 | 
				
			||||||
#  if ! defined (__UCLIBC__) && ! defined (__dietlibc__)
 | 
					 | 
				
			||||||
#    define strlcpy(dst, src, size) snprintf(dst, size, "%s", src)
 | 
					 | 
				
			||||||
#  endif
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef timespecsub
 | 
					 | 
				
			||||||
#define	timespecsub(tsp, usp, vsp)					      \
 | 
					 | 
				
			||||||
	do {								      \
 | 
					 | 
				
			||||||
		(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec;		      \
 | 
					 | 
				
			||||||
		(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec;	      \
 | 
					 | 
				
			||||||
		if ((vsp)->tv_nsec < 0) {				      \
 | 
					 | 
				
			||||||
			(vsp)->tv_sec--;				      \
 | 
					 | 
				
			||||||
			(vsp)->tv_nsec += 1000000000L;			      \
 | 
					 | 
				
			||||||
		}							      \
 | 
					 | 
				
			||||||
	} while (/* CONSTCOND */ 0)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_unused static void *xmalloc (size_t size)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	void *value = malloc(size);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (value)
 | 
					 | 
				
			||||||
		return (value);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ERRX;
 | 
					 | 
				
			||||||
	/* NOTREACHED */
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_unused static void *xrealloc(void *ptr, size_t size)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	void *value = realloc(ptr, size);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (value)
 | 
					 | 
				
			||||||
		return (value);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ERRX;
 | 
					 | 
				
			||||||
	/* NOTREACHED */
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_unused static char *xstrdup(const char *str)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	char *value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (! str)
 | 
					 | 
				
			||||||
		return (NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	value = strdup(str);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (value)
 | 
					 | 
				
			||||||
		return (value);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ERRX;
 | 
					 | 
				
			||||||
	/* NOTREACHED */
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#undef ERRX
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_unused static bool exists(const char *pathname)
 | 
					_unused static bool exists(const char *pathname)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct stat buf;
 | 
						struct stat buf;
 | 
				
			||||||
@@ -166,19 +77,14 @@ int svc_lock(const char *);
 | 
				
			|||||||
int svc_unlock(const char *, int);
 | 
					int svc_unlock(const char *, int);
 | 
				
			||||||
pid_t exec_service(const char *, const char *);
 | 
					pid_t exec_service(const char *, const char *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Check whether path is writable or not,
 | 
				
			||||||
 | 
					 * this also works properly with read-only filesystems
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int is_writable(const char *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define service_start(service) exec_service(service, "start");
 | 
					#define service_start(service) exec_service(service, "start");
 | 
				
			||||||
#define service_stop(service)  exec_service(service, "stop");
 | 
					#define service_stop(service)  exec_service(service, "stop");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* basename_c never modifies the argument. As such, if there is a trailing
 | 
					 | 
				
			||||||
 * slash then an empty string is returned. */
 | 
					 | 
				
			||||||
_unused static const char *basename_c(const char *path)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	const char *slash = strrchr(path, '/');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (slash)
 | 
					 | 
				
			||||||
		return (++slash);
 | 
					 | 
				
			||||||
	return (path);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int parse_mode(mode_t *, char *);
 | 
					int parse_mode(mode_t *, char *);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,6 +51,7 @@ const char libeinfo_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
 | 
				
			|||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "helpers.h"
 | 
				
			||||||
#include "hidden-visibility.h"
 | 
					#include "hidden-visibility.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
hidden_proto(ecolor)
 | 
					hidden_proto(ecolor)
 | 
				
			||||||
@@ -134,7 +135,7 @@ static const struct ecolor ecolors[] = {
 | 
				
			|||||||
	{ ECOLOR_BRACKET, BRACKET, "bracket" },
 | 
						{ ECOLOR_BRACKET, BRACKET, "bracket" },
 | 
				
			||||||
	{ ECOLOR_NORMAL,  0,       NULL      },
 | 
						{ ECOLOR_NORMAL,  0,       NULL      },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
static const char *ecolors_str[sizeof(ecolors)/sizeof(ecolors[0])];
 | 
					static const char *ecolors_str[ARRAY_SIZE(ecolors)];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char *flush = NULL;
 | 
					static char *flush = NULL;
 | 
				
			||||||
static char *up = NULL;
 | 
					static char *up = NULL;
 | 
				
			||||||
@@ -225,27 +226,6 @@ strlcat(char *dst, const char *src, size_t size)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return dst_n + (s - src);
 | 
						return dst_n + (s - src);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
static size_t
 | 
					 | 
				
			||||||
strlcpy(char *dst, const char *src, size_t size)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	const char *s = src;
 | 
					 | 
				
			||||||
	size_t n = size;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (n && --n)
 | 
					 | 
				
			||||||
		do {
 | 
					 | 
				
			||||||
			if (!(*dst++ = *src++))
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
		} while (--n);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!n) {
 | 
					 | 
				
			||||||
		if (size)
 | 
					 | 
				
			||||||
			*dst = '\0';
 | 
					 | 
				
			||||||
		while (*src++);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return src - s - 1;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#  endif
 | 
					#  endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -462,7 +442,7 @@ colour_terminal(FILE * EINFO_RESTRICT f)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/* Now setup our colours */
 | 
						/* Now setup our colours */
 | 
				
			||||||
	p = ebuffer;
 | 
						p = ebuffer;
 | 
				
			||||||
	for (i = 0; i < sizeof(ecolors) / sizeof(ecolors[0]); i++) {
 | 
						for (i = 0; i < ARRAY_SIZE(ecolors); ++i) {
 | 
				
			||||||
		tmp[0] = '\0';
 | 
							tmp[0] = '\0';
 | 
				
			||||||
		if (ecolors[i].name) {
 | 
							if (ecolors[i].name) {
 | 
				
			||||||
			bold = _md;
 | 
								bold = _md;
 | 
				
			||||||
@@ -598,7 +578,7 @@ _ecolor(FILE * EINFO_RESTRICT f, ECOLOR color)
 | 
				
			|||||||
	if (!colour_terminal(f))
 | 
						if (!colour_terminal(f))
 | 
				
			||||||
		return "";
 | 
							return "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < sizeof(ecolors) / sizeof(ecolors[0]); i++)
 | 
						for (i = 0; i < ARRAY_SIZE(ecolors); ++i)
 | 
				
			||||||
		if (ecolors[i].color == color)
 | 
							if (ecolors[i].color == color)
 | 
				
			||||||
			return ecolors_str[i];
 | 
								return ecolors_str[i];
 | 
				
			||||||
	return "";
 | 
						return "";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,8 @@
 | 
				
			|||||||
 * SUCH DAMAGE.
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/utsname.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "librc.h"
 | 
					#include "librc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define GENDEP          RC_LIBEXECDIR "/sh/gendepends.sh"
 | 
					#define GENDEP          RC_LIBEXECDIR "/sh/gendepends.sh"
 | 
				
			||||||
@@ -687,27 +689,27 @@ rc_deptree_update_needed(time_t *newest, char *file)
 | 
				
			|||||||
	if (!existss(RC_DEPTREE_CACHE))
 | 
						if (!existss(RC_DEPTREE_CACHE))
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_INITDIR, newest, file))
 | 
						if (!rc_newer_than(RC_DEPTREE_CACHE, RC_INITDIR, newest, file))
 | 
				
			||||||
		newer = true;
 | 
							return true;
 | 
				
			||||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONFDIR, newest, file))
 | 
						if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONFDIR, newest, file))
 | 
				
			||||||
		newer = true;
 | 
							return true;
 | 
				
			||||||
#ifdef RC_PKG_INITDIR
 | 
					#ifdef RC_PKG_INITDIR
 | 
				
			||||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_PKG_INITDIR, newest, file))
 | 
						if (!rc_newer_than(RC_DEPTREE_CACHE, RC_PKG_INITDIR, newest, file))
 | 
				
			||||||
		newer = true;
 | 
							return true;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef RC_PKG_CONFDIR
 | 
					#ifdef RC_PKG_CONFDIR
 | 
				
			||||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_PKG_CONFDIR, newest, file))
 | 
						if (!rc_newer_than(RC_DEPTREE_CACHE, RC_PKG_CONFDIR, newest, file))
 | 
				
			||||||
		newer = true;
 | 
							return true;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef RC_LOCAL_INITDIR
 | 
					#ifdef RC_LOCAL_INITDIR
 | 
				
			||||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_LOCAL_INITDIR, newest, file))
 | 
						if (!rc_newer_than(RC_DEPTREE_CACHE, RC_LOCAL_INITDIR, newest, file))
 | 
				
			||||||
		newer = true;
 | 
							return true;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef RC_LOCAL_CONFDIR
 | 
					#ifdef RC_LOCAL_CONFDIR
 | 
				
			||||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_LOCAL_CONFDIR, newest, file))
 | 
						if (!rc_newer_than(RC_DEPTREE_CACHE, RC_LOCAL_CONFDIR, newest, file))
 | 
				
			||||||
		newer = true;
 | 
							return true;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONF, newest, file))
 | 
						if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONF, newest, file))
 | 
				
			||||||
		newer = true;
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Some init scripts dependencies change depending on config files
 | 
						/* Some init scripts dependencies change depending on config files
 | 
				
			||||||
	 * outside of baselayout, like syslog-ng, so we check those too. */
 | 
						 * outside of baselayout, like syslog-ng, so we check those too. */
 | 
				
			||||||
@@ -715,7 +717,6 @@ rc_deptree_update_needed(time_t *newest, char *file)
 | 
				
			|||||||
	TAILQ_FOREACH(s, config, entries) {
 | 
						TAILQ_FOREACH(s, config, entries) {
 | 
				
			||||||
		if (!rc_newer_than(RC_DEPTREE_CACHE, s->value, newest, file)) {
 | 
							if (!rc_newer_than(RC_DEPTREE_CACHE, s->value, newest, file)) {
 | 
				
			||||||
			newer = true;
 | 
								newer = true;
 | 
				
			||||||
			if (newest == NULL)
 | 
					 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -748,12 +749,15 @@ rc_deptree_update(void)
 | 
				
			|||||||
	size_t i, k, l;
 | 
						size_t i, k, l;
 | 
				
			||||||
	bool retval = true;
 | 
						bool retval = true;
 | 
				
			||||||
	const char *sys = rc_sys();
 | 
						const char *sys = rc_sys();
 | 
				
			||||||
 | 
						struct utsname uts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Some init scripts need RC_LIBEXECDIR to source stuff
 | 
						/* Some init scripts need RC_LIBEXECDIR to source stuff
 | 
				
			||||||
	   Ideally we should be setting our full env instead */
 | 
						   Ideally we should be setting our full env instead */
 | 
				
			||||||
	if (!getenv("RC_LIBEXECDIR"))
 | 
						if (!getenv("RC_LIBEXECDIR"))
 | 
				
			||||||
		setenv("RC_LIBEXECDIR", RC_LIBEXECDIR, 0);
 | 
							setenv("RC_LIBEXECDIR", RC_LIBEXECDIR, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (uname(&uts) == 0)
 | 
				
			||||||
 | 
							setenv("RC_UNAME", uts.sysname, 1);
 | 
				
			||||||
	/* Phase 1 - source all init scripts and print dependencies */
 | 
						/* Phase 1 - source all init scripts and print dependencies */
 | 
				
			||||||
	if (!(fp = popen(GENDEP, "r")))
 | 
						if (!(fp = popen(GENDEP, "r")))
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -127,6 +127,53 @@ rc_getline(char **line, size_t *len, FILE *fp)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
librc_hidden_def(rc_getline)
 | 
					librc_hidden_def(rc_getline)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char *
 | 
				
			||||||
 | 
					rc_proc_getent(const char *ent)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef __linux__
 | 
				
			||||||
 | 
						FILE *fp;
 | 
				
			||||||
 | 
						char *proc, *p, *value = NULL;
 | 
				
			||||||
 | 
						size_t i, len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!exists("/proc/cmdline"))
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!(fp = fopen("/proc/cmdline", "r")))
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						proc = NULL;
 | 
				
			||||||
 | 
						i = 0;
 | 
				
			||||||
 | 
						if (rc_getline(&proc, &i, fp) == -1 || proc == NULL)
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (proc != NULL) {
 | 
				
			||||||
 | 
							len = strlen(ent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							while ((p = strsep(&proc, " "))) {
 | 
				
			||||||
 | 
								if (strncmp(ent, p, len) == 0 && (p[len] == '\0' || p[len] == ' ' || p[len] == '=')) {
 | 
				
			||||||
 | 
									p += len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (*p == '=')
 | 
				
			||||||
 | 
										p++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									value = xstrdup(p);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!value)
 | 
				
			||||||
 | 
							errno = ENOENT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fclose(fp);
 | 
				
			||||||
 | 
						free(proc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return value;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						return NULL;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					librc_hidden_def(rc_proc_getent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RC_STRINGLIST *
 | 
					RC_STRINGLIST *
 | 
				
			||||||
rc_config_list(const char *file)
 | 
					rc_config_list(const char *file)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -166,6 +213,64 @@ rc_config_list(const char *file)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
librc_hidden_def(rc_config_list)
 | 
					librc_hidden_def(rc_config_list)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Override some specific rc.conf options on the kernel command line
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifdef __linux__
 | 
				
			||||||
 | 
					static RC_STRINGLIST *rc_config_override(RC_STRINGLIST *config)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						RC_STRINGLIST *overrides;
 | 
				
			||||||
 | 
						RC_STRING *cline, *override, *config_np;
 | 
				
			||||||
 | 
						char *tmp = NULL;
 | 
				
			||||||
 | 
						char *value = NULL;
 | 
				
			||||||
 | 
						size_t varlen = 0;
 | 
				
			||||||
 | 
						size_t len = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						overrides = rc_stringlist_new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* A list of variables which may be overridden on the kernel command line */
 | 
				
			||||||
 | 
						rc_stringlist_add(overrides, "rc_parallel");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						TAILQ_FOREACH(override, overrides, entries) {
 | 
				
			||||||
 | 
							varlen = strlen(override->value);
 | 
				
			||||||
 | 
							value = rc_proc_getent(override->value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* No need to continue if there's nothing to override */
 | 
				
			||||||
 | 
							if (!value) {
 | 
				
			||||||
 | 
								free(value);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (value != NULL) {
 | 
				
			||||||
 | 
								len = varlen + strlen(value) + 2;
 | 
				
			||||||
 | 
								tmp = xmalloc(sizeof(char) * len);
 | 
				
			||||||
 | 
								snprintf(tmp, len, "%s=%s", override->value, value);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * Whenever necessary remove the old config entry first to prevent
 | 
				
			||||||
 | 
							 * duplicates
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							TAILQ_FOREACH_SAFE(cline, config, entries, config_np) {
 | 
				
			||||||
 | 
								if (strncmp(override->value, cline->value, varlen) == 0
 | 
				
			||||||
 | 
									&& cline->value[varlen] == '=') {
 | 
				
			||||||
 | 
									rc_stringlist_delete(config, cline->value);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Add the option (var/value) to the current config */
 | 
				
			||||||
 | 
							rc_stringlist_add(config, tmp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							free(tmp);
 | 
				
			||||||
 | 
							free(value);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rc_stringlist_free(overrides);
 | 
				
			||||||
 | 
						return config;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RC_STRINGLIST *
 | 
					RC_STRINGLIST *
 | 
				
			||||||
rc_config_load(const char *file)
 | 
					rc_config_load(const char *file)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -239,6 +344,13 @@ rc_config_load(const char *file)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	rc_stringlist_free(list);
 | 
						rc_stringlist_free(list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __linux__
 | 
				
			||||||
 | 
						/* Only override rc.conf settings */
 | 
				
			||||||
 | 
						if (strcmp(file, RC_CONF) == 0) {
 | 
				
			||||||
 | 
							config = rc_config_override(config);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return config;
 | 
						return config;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
librc_hidden_def(rc_config_load)
 | 
					librc_hidden_def(rc_config_load)
 | 
				
			||||||
@@ -279,7 +391,7 @@ rc_conf_value(const char *setting)
 | 
				
			|||||||
		atexit(_free_rc_conf);
 | 
							atexit(_free_rc_conf);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Support old configs */
 | 
							/* Support old configs. */
 | 
				
			||||||
		if (exists(RC_CONF_OLD)) {
 | 
							if (exists(RC_CONF_OLD)) {
 | 
				
			||||||
			old = rc_config_load(RC_CONF_OLD);
 | 
								old = rc_config_load(RC_CONF_OLD);
 | 
				
			||||||
			TAILQ_CONCAT(rc_conf, old, entries);
 | 
								TAILQ_CONCAT(rc_conf, old, entries);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -492,7 +492,7 @@ rc_service_exists(const char *service)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	char *file;
 | 
						char *file;
 | 
				
			||||||
	bool retval = false;
 | 
						bool retval = false;
 | 
				
			||||||
	int len;
 | 
						size_t len;
 | 
				
			||||||
	struct stat buf;
 | 
						struct stat buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!service) {
 | 
						if (!service) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -87,6 +87,7 @@ librc_hidden_proto(rc_find_pids)
 | 
				
			|||||||
librc_hidden_proto(rc_getfile)
 | 
					librc_hidden_proto(rc_getfile)
 | 
				
			||||||
librc_hidden_proto(rc_getline)
 | 
					librc_hidden_proto(rc_getline)
 | 
				
			||||||
librc_hidden_proto(rc_newer_than)
 | 
					librc_hidden_proto(rc_newer_than)
 | 
				
			||||||
 | 
					librc_hidden_proto(rc_proc_getent)
 | 
				
			||||||
librc_hidden_proto(rc_older_than)
 | 
					librc_hidden_proto(rc_older_than)
 | 
				
			||||||
librc_hidden_proto(rc_runlevel_exists)
 | 
					librc_hidden_proto(rc_runlevel_exists)
 | 
				
			||||||
librc_hidden_proto(rc_runlevel_get)
 | 
					librc_hidden_proto(rc_runlevel_get)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,10 +33,17 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
__BEGIN_DECLS
 | 
					__BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RC_PREFIX "@PREFIX@"
 | 
				
			||||||
#define RC_SYSCONFDIR		"@SYSCONFDIR@"
 | 
					#define RC_SYSCONFDIR		"@SYSCONFDIR@"
 | 
				
			||||||
#define RC_LIBDIR               "@PREFIX@/@LIB@/rc"
 | 
					#define RC_LIBDIR               "@PREFIX@/@LIB@/rc"
 | 
				
			||||||
#define RC_LIBEXECDIR           "@LIBEXECDIR@"
 | 
					#define RC_LIBEXECDIR           "@LIBEXECDIR@"
 | 
				
			||||||
 | 
					#if defined(PREFIX)
 | 
				
			||||||
#define RC_SVCDIR               RC_LIBEXECDIR "/init.d"
 | 
					#define RC_SVCDIR               RC_LIBEXECDIR "/init.d"
 | 
				
			||||||
 | 
					#elif defined(__linux__)
 | 
				
			||||||
 | 
					#define RC_SVCDIR               "/run/openrc"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define RC_SVCDIR               RC_LIBEXECDIR "/init.d"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#define RC_RUNLEVELDIR          RC_SYSCONFDIR "/runlevels"
 | 
					#define RC_RUNLEVELDIR          RC_SYSCONFDIR "/runlevels"
 | 
				
			||||||
#define RC_INITDIR              RC_SYSCONFDIR "/init.d"
 | 
					#define RC_INITDIR              RC_SYSCONFDIR "/init.d"
 | 
				
			||||||
#define RC_CONFDIR              RC_SYSCONFDIR "/conf.d"
 | 
					#define RC_CONFDIR              RC_SYSCONFDIR "/conf.d"
 | 
				
			||||||
@@ -361,6 +368,11 @@ bool rc_newer_than(const char *, const char *, time_t *, char *);
 | 
				
			|||||||
 * @return true if source is older than target, otherwise false */
 | 
					 * @return true if source is older than target, otherwise false */
 | 
				
			||||||
bool rc_older_than(const char *, const char *, time_t *, char *);
 | 
					bool rc_older_than(const char *, const char *, time_t *, char *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*! Read variables/values from /proc/cmdline
 | 
				
			||||||
 | 
					 * @param value
 | 
				
			||||||
 | 
					 * @return pointer to the value, otherwise NULL */
 | 
				
			||||||
 | 
					char *rc_proc_getent(const char *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*! Update the cached dependency tree if it's older than any init script,
 | 
					/*! Update the cached dependency tree if it's older than any init script,
 | 
				
			||||||
 * its configuration file or an external configuration file the init script
 | 
					 * its configuration file or an external configuration file the init script
 | 
				
			||||||
 * has specified.
 | 
					 * has specified.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,7 @@ global:
 | 
				
			|||||||
	rc_getline;
 | 
						rc_getline;
 | 
				
			||||||
	rc_newer_than;
 | 
						rc_newer_than;
 | 
				
			||||||
	rc_older_than;
 | 
						rc_older_than;
 | 
				
			||||||
 | 
						rc_proc_getent;
 | 
				
			||||||
	rc_runlevel_exists;
 | 
						rc_runlevel_exists;
 | 
				
			||||||
	rc_runlevel_get;
 | 
						rc_runlevel_get;
 | 
				
			||||||
	rc_runlevel_list;
 | 
						rc_runlevel_list;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,7 +38,7 @@
 | 
				
			|||||||
	"Disable color output",						      \
 | 
						"Disable color output",						      \
 | 
				
			||||||
	"Display software version",			              \
 | 
						"Display software version",			              \
 | 
				
			||||||
	"Run verbosely",						      \
 | 
						"Run verbosely",						      \
 | 
				
			||||||
	"Run quietly"
 | 
						"Run quietly (Does not affect errors)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define case_RC_COMMON_getopt_case_C  setenv ("EINFO_COLOR", "NO", 1);
 | 
					#define case_RC_COMMON_getopt_case_C  setenv ("EINFO_COLOR", "NO", 1);
 | 
				
			||||||
#define case_RC_COMMON_getopt_case_h  usage (EXIT_SUCCESS);
 | 
					#define case_RC_COMMON_getopt_case_h  usage (EXIT_SUCCESS);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,57 +46,101 @@
 | 
				
			|||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
						inode_unknown = 0,
 | 
				
			||||||
 | 
						inode_file = 1,
 | 
				
			||||||
 | 
						inode_dir = 2,
 | 
				
			||||||
 | 
						inode_fifo = 3,
 | 
				
			||||||
 | 
					} inode_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern const char *applet;
 | 
					extern const char *applet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* TODO: SELinux
 | 
				
			||||||
 | 
					 * This needs a LOT of SELinux loving
 | 
				
			||||||
 | 
					 * See systemd's src/label.c:label_mkdir
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
do_check(char *path, uid_t uid, gid_t gid, mode_t mode, int file)
 | 
					do_check(char *path, uid_t uid, gid_t gid, mode_t mode, inode_t type,
 | 
				
			||||||
 | 
							bool trunc, bool chowner)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct stat st;
 | 
						struct stat st;
 | 
				
			||||||
	int fd;
 | 
						int fd, flags;
 | 
				
			||||||
 | 
						int r;
 | 
				
			||||||
 | 
						int u;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (stat(path, &st)) {
 | 
						if (stat(path, &st) || trunc) {
 | 
				
			||||||
		if (file) {
 | 
							if (type == inode_file) {
 | 
				
			||||||
			einfo("%s: creating file", path);
 | 
								einfo("%s: creating file", path);
 | 
				
			||||||
			if (!mode)
 | 
								if (!mode) /* 664 */
 | 
				
			||||||
				mode = S_IRUSR | S_IWUSR | S_IRGRP |
 | 
									mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
 | 
				
			||||||
				    S_IWGRP | S_IROTH;
 | 
								flags = O_CREAT|O_NDELAY|O_WRONLY|O_NOCTTY;
 | 
				
			||||||
			if ((fd = open(path, O_CREAT, mode)) == -1) {
 | 
					#ifdef O_CLOEXEC
 | 
				
			||||||
 | 
								flags |= O_CLOEXEC;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef O_NOFOLLOW
 | 
				
			||||||
 | 
								flags |= O_NOFOLLOW;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
								if (trunc)
 | 
				
			||||||
 | 
									flags |= O_TRUNC;
 | 
				
			||||||
 | 
								u = umask(0);
 | 
				
			||||||
 | 
								fd = open(path, flags, mode);
 | 
				
			||||||
 | 
								umask(u);
 | 
				
			||||||
 | 
								if (fd == -1) {
 | 
				
			||||||
				eerror("%s: open: %s", applet, strerror(errno));
 | 
									eerror("%s: open: %s", applet, strerror(errno));
 | 
				
			||||||
				return -1;
 | 
									return -1;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			close (fd);
 | 
								close (fd);
 | 
				
			||||||
		} else {
 | 
							} else if (type == inode_dir) {
 | 
				
			||||||
			einfo("%s: creating directory", path);
 | 
								einfo("%s: creating directory", path);
 | 
				
			||||||
			if (!mode)
 | 
								if (!mode) /* 775 */
 | 
				
			||||||
				mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;
 | 
									mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;
 | 
				
			||||||
			if (mkdir(path, mode)) {
 | 
								u = umask(0);
 | 
				
			||||||
 | 
								/* We do not recursively create parents */
 | 
				
			||||||
 | 
								r = mkdir(path, mode);
 | 
				
			||||||
 | 
								umask(u);
 | 
				
			||||||
 | 
								if (r == -1 && errno != EEXIST) {
 | 
				
			||||||
				eerror("%s: mkdir: %s", applet,
 | 
									eerror("%s: mkdir: %s", applet,
 | 
				
			||||||
				    strerror (errno));
 | 
									    strerror (errno));
 | 
				
			||||||
				return -1;
 | 
									return -1;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			mode = 0;
 | 
								mode = 0;
 | 
				
			||||||
 | 
							} else if (type == inode_fifo) {
 | 
				
			||||||
 | 
								einfo("%s: creating fifo", path);
 | 
				
			||||||
 | 
								if (!mode) /* 600 */
 | 
				
			||||||
 | 
									mode = S_IRUSR | S_IWUSR;
 | 
				
			||||||
 | 
								u = umask(0);
 | 
				
			||||||
 | 
								r = mkfifo(path, mode);
 | 
				
			||||||
 | 
								umask(u);
 | 
				
			||||||
 | 
								if (r == -1 && errno != EEXIST) {
 | 
				
			||||||
 | 
									eerror("%s: mkfifo: %s", applet,
 | 
				
			||||||
 | 
									    strerror (errno));
 | 
				
			||||||
 | 
									return -1;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if ((file && S_ISDIR(st.st_mode)) ||
 | 
							if (type != inode_dir && S_ISDIR(st.st_mode)) {
 | 
				
			||||||
		    (!file && !S_ISDIR(st.st_mode)))
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			if (file)
 | 
					 | 
				
			||||||
			eerror("%s: is a directory", path);
 | 
								eerror("%s: is a directory", path);
 | 
				
			||||||
			else
 | 
								return 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (type != inode_file && S_ISREG(st.st_mode)) {
 | 
				
			||||||
			eerror("%s: is a file", path);
 | 
								eerror("%s: is a file", path);
 | 
				
			||||||
 | 
								return 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (type != inode_fifo && S_ISFIFO(st.st_mode)) {
 | 
				
			||||||
 | 
								eerror("%s: is a fifo", path);
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (mode && (st.st_mode & 0777) != mode) {
 | 
						if (mode && (st.st_mode & 0777) != mode) {
 | 
				
			||||||
		einfo("%s: correcting mode", applet);
 | 
							einfo("%s: correcting mode", path);
 | 
				
			||||||
		if (chmod(path, mode)) {
 | 
							if (chmod(path, mode)) {
 | 
				
			||||||
			eerror("%s: chmod: %s", applet, strerror(errno));
 | 
								eerror("%s: chmod: %s", applet, strerror(errno));
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (st.st_uid != uid || st.st_gid != gid) {
 | 
						if (chowner && (st.st_uid != uid || st.st_gid != gid)) {
 | 
				
			||||||
		if (st.st_dev || st.st_ino)
 | 
							if (st.st_dev || st.st_ino)
 | 
				
			||||||
			einfo("%s: correcting owner", path);
 | 
								einfo("%s: correcting owner", path);
 | 
				
			||||||
		if (chown(path, uid, gid)) {
 | 
							if (chown(path, uid, gid)) {
 | 
				
			||||||
@@ -142,20 +186,28 @@ parse_owner(struct passwd **user, struct group **group, const char *owner)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "_usage.h"
 | 
					#include "_usage.h"
 | 
				
			||||||
#define extraopts "path1 path2 ..."
 | 
					#define extraopts "path1 [path2] [...]"
 | 
				
			||||||
#define getoptstring "dfm:o:" getoptstring_COMMON
 | 
					#define getoptstring "dDfFpm:o:W:" getoptstring_COMMON
 | 
				
			||||||
static const struct option longopts[] = {
 | 
					static const struct option longopts[] = {
 | 
				
			||||||
	{ "directory",          0, NULL, 'd'},
 | 
						{ "directory",          0, NULL, 'd'},
 | 
				
			||||||
 | 
						{ "directory-truncate", 0, NULL, 'D'},
 | 
				
			||||||
	{ "file",               0, NULL, 'f'},
 | 
						{ "file",               0, NULL, 'f'},
 | 
				
			||||||
 | 
						{ "file-truncate",      0, NULL, 'F'},
 | 
				
			||||||
 | 
						{ "pipe",               0, NULL, 'p'},
 | 
				
			||||||
	{ "mode",               1, NULL, 'm'},
 | 
						{ "mode",               1, NULL, 'm'},
 | 
				
			||||||
	{ "owner",              1, NULL, 'o'},
 | 
						{ "owner",              1, NULL, 'o'},
 | 
				
			||||||
 | 
						{ "writable",           1, NULL, 'W'},
 | 
				
			||||||
	longopts_COMMON
 | 
						longopts_COMMON
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
static const char * const longopts_help[] = {
 | 
					static const char * const longopts_help[] = {
 | 
				
			||||||
	"Check if a directory",
 | 
						"Create a directory if not exists",
 | 
				
			||||||
	"Check if a file",
 | 
						"Create/empty directory",
 | 
				
			||||||
 | 
						"Create a file if not exists",
 | 
				
			||||||
 | 
						"Truncate file",
 | 
				
			||||||
 | 
						"Create a named pipe (FIFO) if not exists",
 | 
				
			||||||
	"Mode to check",
 | 
						"Mode to check",
 | 
				
			||||||
	"Owner to check (user:group)",
 | 
						"Owner to check (user:group)",
 | 
				
			||||||
 | 
						"Check whether the path is writable or not",
 | 
				
			||||||
	longopts_help_COMMON
 | 
						longopts_help_COMMON
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#include "_usage.c"
 | 
					#include "_usage.c"
 | 
				
			||||||
@@ -169,18 +221,27 @@ checkpath(int argc, char **argv)
 | 
				
			|||||||
	mode_t mode = 0;
 | 
						mode_t mode = 0;
 | 
				
			||||||
	struct passwd *pw = NULL;
 | 
						struct passwd *pw = NULL;
 | 
				
			||||||
	struct group *gr = NULL;
 | 
						struct group *gr = NULL;
 | 
				
			||||||
	bool file = 0;
 | 
						inode_t type = inode_unknown;
 | 
				
			||||||
	int retval = EXIT_SUCCESS;
 | 
						int retval = EXIT_SUCCESS;
 | 
				
			||||||
 | 
						bool trunc = false;
 | 
				
			||||||
 | 
						bool chowner = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while ((opt = getopt_long(argc, argv, getoptstring,
 | 
						while ((opt = getopt_long(argc, argv, getoptstring,
 | 
				
			||||||
		    longopts, (int *) 0)) != -1)
 | 
							    longopts, (int *) 0)) != -1)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		switch (opt) {
 | 
							switch (opt) {
 | 
				
			||||||
 | 
							case 'D':
 | 
				
			||||||
 | 
								trunc = true;
 | 
				
			||||||
		case 'd':
 | 
							case 'd':
 | 
				
			||||||
			file = 0;
 | 
								type = inode_dir;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							case 'F':
 | 
				
			||||||
 | 
								trunc = true;
 | 
				
			||||||
		case 'f':
 | 
							case 'f':
 | 
				
			||||||
			file = 1;
 | 
								type = inode_file;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'p':
 | 
				
			||||||
 | 
								type = inode_fifo;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'm':
 | 
							case 'm':
 | 
				
			||||||
			if (parse_mode(&mode, optarg) != 0)
 | 
								if (parse_mode(&mode, optarg) != 0)
 | 
				
			||||||
@@ -188,10 +249,16 @@ checkpath(int argc, char **argv)
 | 
				
			|||||||
				    applet, optarg);
 | 
									    applet, optarg);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'o':
 | 
							case 'o':
 | 
				
			||||||
 | 
								chowner = true;
 | 
				
			||||||
			if (parse_owner(&pw, &gr, optarg) != 0)
 | 
								if (parse_owner(&pw, &gr, optarg) != 0)
 | 
				
			||||||
				eerrorx("%s: owner `%s' not found",
 | 
									eerrorx("%s: owner `%s' not found",
 | 
				
			||||||
				    applet, optarg);
 | 
									    applet, optarg);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							case 'W':
 | 
				
			||||||
 | 
								if (argv[optind] != NULL)
 | 
				
			||||||
 | 
									ewarn("-W/--writable takes only one path, everything else will be ignored");
 | 
				
			||||||
 | 
								exit(!is_writable(optarg));
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case_RC_COMMON_GETOPT
 | 
							case_RC_COMMON_GETOPT
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -208,7 +275,7 @@ checkpath(int argc, char **argv)
 | 
				
			|||||||
		gid = gr->gr_gid;
 | 
							gid = gr->gr_gid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (optind < argc) {
 | 
						while (optind < argc) {
 | 
				
			||||||
		if (do_check(argv[optind], uid, gid, mode, file))
 | 
							if (do_check(argv[optind], uid, gid, mode, type, trunc, chowner))
 | 
				
			||||||
			retval = EXIT_FAILURE;
 | 
								retval = EXIT_FAILURE;
 | 
				
			||||||
		optind++;
 | 
							optind++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -93,9 +93,9 @@ getmntfile(const char *file)
 | 
				
			|||||||
extern const char *applet;
 | 
					extern const char *applet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
do_mount(struct ENT *ent)
 | 
					do_mount(struct ENT *ent, bool remount)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char *argv[8];
 | 
						char *argv[10];
 | 
				
			||||||
	pid_t pid;
 | 
						pid_t pid;
 | 
				
			||||||
	int status;
 | 
						int status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -104,9 +104,24 @@ do_mount(struct ENT *ent)
 | 
				
			|||||||
	argv[2] = ENT_OPTS(*ent);
 | 
						argv[2] = ENT_OPTS(*ent);
 | 
				
			||||||
	argv[3] = UNCONST("-t");
 | 
						argv[3] = UNCONST("-t");
 | 
				
			||||||
	argv[4] = ENT_TYPE(*ent);
 | 
						argv[4] = ENT_TYPE(*ent);
 | 
				
			||||||
 | 
						if (!remount) {
 | 
				
			||||||
		argv[5] = ENT_BLOCKDEVICE(*ent);
 | 
							argv[5] = ENT_BLOCKDEVICE(*ent);
 | 
				
			||||||
		argv[6] = ENT_FILE(*ent);
 | 
							argv[6] = ENT_FILE(*ent);
 | 
				
			||||||
		argv[7] = NULL;
 | 
							argv[7] = NULL;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
					#ifdef __linux__
 | 
				
			||||||
 | 
							argv[5] = UNCONST("-o");
 | 
				
			||||||
 | 
							argv[6] = UNCONST("remount");
 | 
				
			||||||
 | 
							argv[7] = ENT_BLOCKDEVICE(*ent);
 | 
				
			||||||
 | 
							argv[8] = ENT_FILE(*ent);
 | 
				
			||||||
 | 
							argv[9] = NULL;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
							argv[5] = UNCONST("-u");
 | 
				
			||||||
 | 
							argv[6] = ENT_BLOCKDEVICE(*ent);
 | 
				
			||||||
 | 
							argv[7] = ENT_FILE(*ent);
 | 
				
			||||||
 | 
							argv[8] = NULL;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	switch (pid = vfork()) {
 | 
						switch (pid = vfork()) {
 | 
				
			||||||
	case -1:
 | 
						case -1:
 | 
				
			||||||
		eerrorx("%s: vfork: %s", applet, strerror(errno));
 | 
							eerrorx("%s: vfork: %s", applet, strerror(errno));
 | 
				
			||||||
@@ -127,9 +142,10 @@ do_mount(struct ENT *ent)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "_usage.h"
 | 
					#include "_usage.h"
 | 
				
			||||||
#define getoptstring "Mbmop:t:" getoptstring_COMMON
 | 
					#define getoptstring "MRbmop:t:" getoptstring_COMMON
 | 
				
			||||||
static const struct option longopts[] = {
 | 
					static const struct option longopts[] = {
 | 
				
			||||||
	{ "mount",          0, NULL, 'M' },
 | 
						{ "mount",          0, NULL, 'M' },
 | 
				
			||||||
 | 
						{ "remount",        0, NULL, 'R' },
 | 
				
			||||||
	{ "blockdevice",    0, NULL, 'b' },
 | 
						{ "blockdevice",    0, NULL, 'b' },
 | 
				
			||||||
	{ "mountargs",      0, NULL, 'm' },
 | 
						{ "mountargs",      0, NULL, 'm' },
 | 
				
			||||||
	{ "options",        0, NULL, 'o' },
 | 
						{ "options",        0, NULL, 'o' },
 | 
				
			||||||
@@ -139,6 +155,7 @@ static const struct option longopts[] = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
static const char * const longopts_help[] = {
 | 
					static const char * const longopts_help[] = {
 | 
				
			||||||
	"Mounts the filesytem from the mountpoint",
 | 
						"Mounts the filesytem from the mountpoint",
 | 
				
			||||||
 | 
						"Remounts the filesystem based on the information in fstab",
 | 
				
			||||||
	"Extract the block device",
 | 
						"Extract the block device",
 | 
				
			||||||
	"Show arguments needed to mount the entry",
 | 
						"Show arguments needed to mount the entry",
 | 
				
			||||||
	"Extract the options field",
 | 
						"Extract the options field",
 | 
				
			||||||
@@ -154,6 +171,7 @@ static const char * const longopts_help[] = {
 | 
				
			|||||||
#define OUTPUT_PASSNO    (1 << 4)
 | 
					#define OUTPUT_PASSNO    (1 << 4)
 | 
				
			||||||
#define OUTPUT_BLOCKDEV  (1 << 5)
 | 
					#define OUTPUT_BLOCKDEV  (1 << 5)
 | 
				
			||||||
#define OUTPUT_MOUNT     (1 << 6)
 | 
					#define OUTPUT_MOUNT     (1 << 6)
 | 
				
			||||||
 | 
					#define OUTPUT_REMOUNT   (1 << 7)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
fstabinfo(int argc, char **argv)
 | 
					fstabinfo(int argc, char **argv)
 | 
				
			||||||
@@ -182,6 +200,9 @@ fstabinfo(int argc, char **argv)
 | 
				
			|||||||
		case 'M':
 | 
							case 'M':
 | 
				
			||||||
			output = OUTPUT_MOUNT;
 | 
								output = OUTPUT_MOUNT;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							case 'R':
 | 
				
			||||||
 | 
								output = OUTPUT_REMOUNT;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case 'b':
 | 
							case 'b':
 | 
				
			||||||
			output = OUTPUT_BLOCKDEV;
 | 
								output = OUTPUT_BLOCKDEV;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
@@ -261,7 +282,7 @@ fstabinfo(int argc, char **argv)
 | 
				
			|||||||
		END_ENT;
 | 
							END_ENT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!TAILQ_FIRST(files))
 | 
							if (!TAILQ_FIRST(files))
 | 
				
			||||||
			eerrorx("%s: emtpy fstab", argv[0]);
 | 
								eerrorx("%s: empty fstab", argv[0]);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!TAILQ_FIRST(files)) {
 | 
						if (!TAILQ_FIRST(files)) {
 | 
				
			||||||
@@ -287,7 +308,11 @@ fstabinfo(int argc, char **argv)
 | 
				
			|||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case OUTPUT_MOUNT:
 | 
							case OUTPUT_MOUNT:
 | 
				
			||||||
			result += do_mount(ent);
 | 
								result += do_mount(ent, false);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case OUTPUT_REMOUNT:
 | 
				
			||||||
 | 
								result += do_mount(ent, true);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case OUTPUT_MOUNTARGS:
 | 
							case OUTPUT_MOUNTARGS:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -390,12 +390,8 @@ mountinfo(int argc, char **argv)
 | 
				
			|||||||
	char real_path[PATH_MAX + 1];
 | 
						char real_path[PATH_MAX + 1];
 | 
				
			||||||
	int opt;
 | 
						int opt;
 | 
				
			||||||
	int result;
 | 
						int result;
 | 
				
			||||||
	bool quiet;
 | 
					 | 
				
			||||||
	char *this_path;
 | 
						char *this_path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Ensure that we are only quiet when explicitly told to be */
 | 
					 | 
				
			||||||
	unsetenv("EINFO_QUIET");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DO_REG(_var)							      \
 | 
					#define DO_REG(_var)							      \
 | 
				
			||||||
	if (_var) free(_var);						      \
 | 
						if (_var) free(_var);						      \
 | 
				
			||||||
	_var = get_regex(optarg);
 | 
						_var = get_regex(optarg);
 | 
				
			||||||
@@ -475,7 +471,6 @@ mountinfo(int argc, char **argv)
 | 
				
			|||||||
	REG_FREE(args.skip_options_regex);
 | 
						REG_FREE(args.skip_options_regex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	result = EXIT_FAILURE;
 | 
						result = EXIT_FAILURE;
 | 
				
			||||||
	quiet = rc_yesno(getenv("EINFO_QUIET"));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* We should report the mounts in reverse order to ease unmounting */
 | 
						/* We should report the mounts in reverse order to ease unmounting */
 | 
				
			||||||
	TAILQ_FOREACH_REVERSE(s, nodes, rc_stringlist, entries) {
 | 
						TAILQ_FOREACH_REVERSE(s, nodes, rc_stringlist, entries) {
 | 
				
			||||||
@@ -485,7 +480,7 @@ mountinfo(int argc, char **argv)
 | 
				
			|||||||
		if (skip_point_regex &&
 | 
							if (skip_point_regex &&
 | 
				
			||||||
		    regexec(skip_point_regex, s->value, 0, NULL, 0) == 0)
 | 
							    regexec(skip_point_regex, s->value, 0, NULL, 0) == 0)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		if (! quiet)
 | 
							if (! rc_yesno(getenv("EINFO_QUIET")))
 | 
				
			||||||
			printf("%s\n", s->value);
 | 
								printf("%s\n", s->value);
 | 
				
			||||||
		result = EXIT_SUCCESS;
 | 
							result = EXIT_SUCCESS;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -253,13 +253,38 @@ do_e(int argc, char **argv)
 | 
				
			|||||||
	return retval;
 | 
						return retval;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct {
 | 
				
			||||||
 | 
						const char * const name;
 | 
				
			||||||
 | 
						RC_SERVICE bit;
 | 
				
			||||||
 | 
					} service_bits[] = {
 | 
				
			||||||
 | 
						{ "service_started",     RC_SERVICE_STARTED,     },
 | 
				
			||||||
 | 
						{ "service_stopped",     RC_SERVICE_STOPPED,     },
 | 
				
			||||||
 | 
						{ "service_inactive",    RC_SERVICE_INACTIVE,    },
 | 
				
			||||||
 | 
						{ "service_starting",    RC_SERVICE_STARTING,    },
 | 
				
			||||||
 | 
						{ "service_stopping",    RC_SERVICE_STOPPING,    },
 | 
				
			||||||
 | 
						{ "service_hotplugged",  RC_SERVICE_HOTPLUGGED,  },
 | 
				
			||||||
 | 
						{ "service_wasinactive", RC_SERVICE_WASINACTIVE, },
 | 
				
			||||||
 | 
						{ "service_failed",      RC_SERVICE_FAILED,      },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static RC_SERVICE
 | 
				
			||||||
 | 
					lookup_service_state(const char *service)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						size_t i;
 | 
				
			||||||
 | 
						for (i = 0; i < ARRAY_SIZE(service_bits); ++i)
 | 
				
			||||||
 | 
							if (!strcmp(service, service_bits[i].name))
 | 
				
			||||||
 | 
								return service_bits[i].bit;
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
do_service(int argc, char **argv)
 | 
					do_service(int argc, char **argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	bool ok = false;
 | 
						bool ok = false;
 | 
				
			||||||
	char *service;
 | 
						char *service;
 | 
				
			||||||
	char *exec;
 | 
						char *exec;
 | 
				
			||||||
	int idx = 0;
 | 
						int idx;
 | 
				
			||||||
 | 
						RC_SERVICE state, bit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (argc > 1)
 | 
						if (argc > 1)
 | 
				
			||||||
		service = argv[1];
 | 
							service = argv[1];
 | 
				
			||||||
@@ -269,21 +294,11 @@ do_service(int argc, char **argv)
 | 
				
			|||||||
	if (service == NULL || *service == '\0')
 | 
						if (service == NULL || *service == '\0')
 | 
				
			||||||
		eerrorx("%s: no service specified", applet);
 | 
							eerrorx("%s: no service specified", applet);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (strcmp(applet, "service_started") == 0)
 | 
						state = rc_service_state(service);
 | 
				
			||||||
		ok = (rc_service_state(service) & RC_SERVICE_STARTED);
 | 
						bit = lookup_service_state(applet);
 | 
				
			||||||
	else if (strcmp(applet, "service_stopped") == 0)
 | 
						if (bit) {
 | 
				
			||||||
		ok = (rc_service_state(service) & RC_SERVICE_STOPPED);
 | 
							ok = (state & bit);
 | 
				
			||||||
	else if (strcmp(applet, "service_inactive") == 0)
 | 
						} else if (strcmp(applet, "service_started_daemon") == 0) {
 | 
				
			||||||
		ok = (rc_service_state(service) & RC_SERVICE_INACTIVE);
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "service_starting") == 0)
 | 
					 | 
				
			||||||
		ok = (rc_service_state(service) & RC_SERVICE_STARTING);
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "service_stopping") == 0)
 | 
					 | 
				
			||||||
		ok = (rc_service_state(service) & RC_SERVICE_STOPPING);
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "service_hotplugged") == 0)
 | 
					 | 
				
			||||||
		ok = (rc_service_state(service) & RC_SERVICE_HOTPLUGGED);
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "service_wasinactive") == 0)
 | 
					 | 
				
			||||||
		ok = (rc_service_state(service) & RC_SERVICE_WASINACTIVE);
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "service_started_daemon") == 0) {
 | 
					 | 
				
			||||||
		service = getenv("RC_SVCNAME");
 | 
							service = getenv("RC_SVCNAME");
 | 
				
			||||||
		exec = argv[1];
 | 
							exec = argv[1];
 | 
				
			||||||
		if (argc > 3) {
 | 
							if (argc > 3) {
 | 
				
			||||||
@@ -315,37 +330,34 @@ do_mark_service(int argc, char **argv)
 | 
				
			|||||||
	char *svcname = getenv("RC_SVCNAME");
 | 
						char *svcname = getenv("RC_SVCNAME");
 | 
				
			||||||
	char *service = NULL;
 | 
						char *service = NULL;
 | 
				
			||||||
	char *runscript_pid;
 | 
						char *runscript_pid;
 | 
				
			||||||
	char *mtime;
 | 
						/* char *mtime; */
 | 
				
			||||||
	pid_t pid;
 | 
						pid_t pid;
 | 
				
			||||||
	size_t l;
 | 
						RC_SERVICE bit;
 | 
				
			||||||
 | 
						/* size_t l; */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (argc > 1)
 | 
						if (argc > 1)
 | 
				
			||||||
		service = argv[1];
 | 
							service = argv[1];
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		service = getenv("RC_SVCNAME");
 | 
							service = svcname;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (service == NULL || *service == '\0')
 | 
						if (service == NULL || *service == '\0')
 | 
				
			||||||
		eerrorx("%s: no service specified", applet);
 | 
							eerrorx("%s: no service specified", applet);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (strcmp(applet, "mark_service_started") == 0)
 | 
						if (!strncmp(applet, "mark_", 5) &&
 | 
				
			||||||
		ok = rc_service_mark(service, RC_SERVICE_STARTED);
 | 
						    (bit = lookup_service_state(applet + 5)))
 | 
				
			||||||
	else if (strcmp(applet, "mark_service_stopped") == 0)
 | 
							ok = rc_service_mark(service, bit);
 | 
				
			||||||
		ok = rc_service_mark(service, RC_SERVICE_STOPPED);
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "mark_service_inactive") == 0)
 | 
					 | 
				
			||||||
		ok = rc_service_mark(service, RC_SERVICE_INACTIVE);
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "mark_service_starting") == 0)
 | 
					 | 
				
			||||||
		ok = rc_service_mark(service, RC_SERVICE_STARTING);
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "mark_service_stopping") == 0)
 | 
					 | 
				
			||||||
		ok = rc_service_mark(service, RC_SERVICE_STOPPING);
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "mark_service_hotplugged") == 0)
 | 
					 | 
				
			||||||
		ok = rc_service_mark(service, RC_SERVICE_HOTPLUGGED);
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "mark_service_failed") == 0)
 | 
					 | 
				
			||||||
		ok = rc_service_mark(service, RC_SERVICE_FAILED);
 | 
					 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		eerrorx("%s: unknown applet", applet);
 | 
							eerrorx("%s: unknown applet", applet);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* If we're marking ourselves then we need to inform our parent
 | 
						/* If we're marking ourselves then we need to inform our parent
 | 
				
			||||||
	   runscript process so they do not mark us based on our exit code */
 | 
						   runscript process so they do not mark us based on our exit code */
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * FIXME: svcname and service are almost always equal except called from a
 | 
				
			||||||
 | 
						 * shell with just argv[1] - So that doesn't seem to do what Roy initially
 | 
				
			||||||
 | 
						 * expected.
 | 
				
			||||||
 | 
						 * See 20120424041423.GA23657@odin.qasl.de (Tue, 24 Apr 2012 06:14:23 +0200,
 | 
				
			||||||
 | 
						 * openrc@gentoo.org).
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	if (ok && svcname && strcmp(svcname, service) == 0) {
 | 
						if (ok && svcname && strcmp(svcname, service) == 0) {
 | 
				
			||||||
		runscript_pid = getenv("RC_RUNSCRIPT_PID");
 | 
							runscript_pid = getenv("RC_RUNSCRIPT_PID");
 | 
				
			||||||
		if (runscript_pid && sscanf(runscript_pid, "%d", &pid) == 1)
 | 
							if (runscript_pid && sscanf(runscript_pid, "%d", &pid) == 1)
 | 
				
			||||||
@@ -355,6 +367,7 @@ do_mark_service(int argc, char **argv)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		/* Remove the exclusive time test. This ensures that it's not
 | 
							/* Remove the exclusive time test. This ensures that it's not
 | 
				
			||||||
		   in control as well */
 | 
							   in control as well */
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
		l = strlen(RC_SVCDIR "/exclusive") + strlen(svcname) +
 | 
							l = strlen(RC_SVCDIR "/exclusive") + strlen(svcname) +
 | 
				
			||||||
		    strlen(runscript_pid) + 4;
 | 
							    strlen(runscript_pid) + 4;
 | 
				
			||||||
		mtime = xmalloc(l);
 | 
							mtime = xmalloc(l);
 | 
				
			||||||
@@ -363,6 +376,7 @@ do_mark_service(int argc, char **argv)
 | 
				
			|||||||
		if (exists(mtime) && unlink(mtime) != 0)
 | 
							if (exists(mtime) && unlink(mtime) != 0)
 | 
				
			||||||
			eerror("%s: unlink: %s", applet, strerror(errno));
 | 
								eerror("%s: unlink: %s", applet, strerror(errno));
 | 
				
			||||||
		free(mtime);
 | 
							free(mtime);
 | 
				
			||||||
 | 
							*/
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ok ? EXIT_SUCCESS : EXIT_FAILURE;
 | 
						return ok ? EXIT_SUCCESS : EXIT_FAILURE;
 | 
				
			||||||
@@ -400,7 +414,7 @@ do_value(int argc, char **argv)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
do_shell_var(int argc, char **argv)
 | 
					shell_var(int argc, char **argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
	char *p;
 | 
						char *p;
 | 
				
			||||||
@@ -421,12 +435,102 @@ do_shell_var(int argc, char **argv)
 | 
				
			|||||||
	return EXIT_SUCCESS;
 | 
						return EXIT_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					is_older_than(int argc, char **argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (argc < 3)
 | 
				
			||||||
 | 
							return EXIT_FAILURE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* This test is perverted - historically the baselayout function
 | 
				
			||||||
 | 
						 * returns 0 on *failure*, which is plain wrong */
 | 
				
			||||||
 | 
						for (i = 2; i < argc; ++i)
 | 
				
			||||||
 | 
							if (!rc_newer_than(argv[1], argv[i], NULL, NULL))
 | 
				
			||||||
 | 
								return EXIT_SUCCESS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return EXIT_FAILURE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					is_newer_than(int argc, char **argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (argc < 3)
 | 
				
			||||||
 | 
							return EXIT_FAILURE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* This test is correct as it's not present in baselayout */
 | 
				
			||||||
 | 
						for (i = 2; i < argc; ++i)
 | 
				
			||||||
 | 
							if (!rc_newer_than(argv[1], argv[i], NULL, NULL))
 | 
				
			||||||
 | 
								return EXIT_FAILURE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return EXIT_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					is_runlevel_start(_unused int argc, _unused char **argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return rc_runlevel_starting() ? 0 : 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					is_runlevel_stop(_unused int argc, _unused char **argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return rc_runlevel_stopping() ? 0 : 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					rc_abort(_unused int argc, _unused char **argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const char *p = getenv("RC_PID");
 | 
				
			||||||
 | 
						int pid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (p && sscanf(p, "%d", &pid) == 1) {
 | 
				
			||||||
 | 
							if (kill(pid, SIGUSR1) != 0)
 | 
				
			||||||
 | 
								eerrorx("rc-abort: failed to signal parent %d: %s",
 | 
				
			||||||
 | 
								    pid, strerror(errno));
 | 
				
			||||||
 | 
							return EXIT_SUCCESS;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return EXIT_FAILURE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct {
 | 
				
			||||||
 | 
						const char * const name;
 | 
				
			||||||
 | 
						int (* const applet)(int argc, char **argv);
 | 
				
			||||||
 | 
					} applets[] = {
 | 
				
			||||||
 | 
					#define A(a) { #a, a }
 | 
				
			||||||
 | 
						A(fstabinfo),
 | 
				
			||||||
 | 
						A(mountinfo),
 | 
				
			||||||
 | 
						{ "rc-depend",           rc_depend,         },
 | 
				
			||||||
 | 
						{ "rc-service",          rc_service,        },
 | 
				
			||||||
 | 
						{ "rc-status",           rc_status,         },
 | 
				
			||||||
 | 
						{ "rc-update",           rc_update,         },
 | 
				
			||||||
 | 
						{ "update-rc",           rc_update,         },
 | 
				
			||||||
 | 
						A(runscript),
 | 
				
			||||||
 | 
						{ "start-stop-daemon",   start_stop_daemon, },
 | 
				
			||||||
 | 
						A(checkpath),
 | 
				
			||||||
 | 
						A(swclock),
 | 
				
			||||||
 | 
						A(shell_var),
 | 
				
			||||||
 | 
						A(is_older_than),
 | 
				
			||||||
 | 
						A(is_newer_than),
 | 
				
			||||||
 | 
						A(is_runlevel_start),
 | 
				
			||||||
 | 
						A(is_runlevel_stop),
 | 
				
			||||||
 | 
						{ "rc-abort",            rc_abort,          },
 | 
				
			||||||
 | 
						/* These are purely for init scripts and do not make sense as
 | 
				
			||||||
 | 
						 * anything else */
 | 
				
			||||||
 | 
						{ "service_get_value",   do_value,          },
 | 
				
			||||||
 | 
						{ "service_set_value",   do_value,          },
 | 
				
			||||||
 | 
						{ "get_options",         do_value,          },
 | 
				
			||||||
 | 
						{ "save_options",        do_value,          },
 | 
				
			||||||
 | 
					#undef A
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
run_applets(int argc, char **argv)
 | 
					run_applets(int argc, char **argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i = 2;
 | 
						size_t i;
 | 
				
			||||||
	char *p;
 | 
					 | 
				
			||||||
	pid_t pid = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Bug 351712: We need an extra way to explicitly select an applet OTHER
 | 
						/* Bug 351712: We need an extra way to explicitly select an applet OTHER
 | 
				
			||||||
	 * than trusting argv[0], as argv[0] is not going to be the applet value if
 | 
						 * than trusting argv[0], as argv[0] is not going to be the applet value if
 | 
				
			||||||
@@ -439,88 +543,19 @@ run_applets(int argc, char **argv)
 | 
				
			|||||||
		argc -= 2;
 | 
							argc -= 2;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* These are designed to be applications in their own right */
 | 
						for (i = 0; i < ARRAY_SIZE(applets); ++i)
 | 
				
			||||||
	if (strcmp(applet, "fstabinfo") == 0)
 | 
							if (!strcmp(applet, applets[i].name))
 | 
				
			||||||
		exit(fstabinfo(argc, argv));
 | 
								exit(applets[i].applet(argc, argv));
 | 
				
			||||||
	else if (strcmp(applet, "mountinfo") == 0)
 | 
					 | 
				
			||||||
		exit(mountinfo(argc, argv));
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "rc-depend") == 0)
 | 
					 | 
				
			||||||
		exit(rc_depend(argc, argv));
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "rc-service") == 0)
 | 
					 | 
				
			||||||
		exit(rc_service(argc, argv));
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "rc-status") == 0)
 | 
					 | 
				
			||||||
		exit(rc_status(argc, argv));
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "rc-update") == 0 ||
 | 
					 | 
				
			||||||
	    strcmp(applet, "update-rc") == 0)
 | 
					 | 
				
			||||||
		exit(rc_update(argc, argv));
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "runscript") == 0)
 | 
					 | 
				
			||||||
		exit(runscript(argc, argv));
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "start-stop-daemon") == 0)
 | 
					 | 
				
			||||||
		exit(start_stop_daemon(argc, argv));
 | 
					 | 
				
			||||||
	else if (strcmp (applet, "checkpath") == 0)
 | 
					 | 
				
			||||||
		exit(checkpath(argc, argv));
 | 
					 | 
				
			||||||
	else if (strcmp(applet, "swclock") == 0)
 | 
					 | 
				
			||||||
		exit(swclock(argc, argv));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* These could also be applications in their own right */
 | 
					 | 
				
			||||||
	if (strcmp(applet, "shell_var") == 0)
 | 
					 | 
				
			||||||
		exit(do_shell_var(argc, argv));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* This test is perverted - historically the baselayout function
 | 
					 | 
				
			||||||
	 * returns 0 on *failure*, which is plain wrong */
 | 
					 | 
				
			||||||
	if (strcmp(applet, "is_older_than") == 0) {
 | 
					 | 
				
			||||||
		if (argc < 3)
 | 
					 | 
				
			||||||
			exit (EXIT_FAILURE);
 | 
					 | 
				
			||||||
		while (i < argc) {
 | 
					 | 
				
			||||||
			if (!rc_newer_than(argv[1], argv[i++], NULL, NULL))
 | 
					 | 
				
			||||||
				exit(EXIT_SUCCESS);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		exit(EXIT_FAILURE);
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
	/* This test is correct as it's not present in baselayout */
 | 
					 | 
				
			||||||
	if (strcmp(applet, "is_newer_than") == 0) {
 | 
					 | 
				
			||||||
		if (argc < 3)
 | 
					 | 
				
			||||||
			exit (EXIT_FAILURE);
 | 
					 | 
				
			||||||
		while (i < argc) {
 | 
					 | 
				
			||||||
			if (!rc_newer_than(argv[1], argv[i++], NULL, NULL))
 | 
					 | 
				
			||||||
				exit(EXIT_FAILURE);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		exit(EXIT_SUCCESS);
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (applet[0] == 'e' || (applet[0] == 'v' && applet[1] == 'e'))
 | 
						if (applet[0] == 'e' || (applet[0] == 'v' && applet[1] == 'e'))
 | 
				
			||||||
		exit(do_e(argc, argv));
 | 
							exit(do_e(argc, argv));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* These are purely for init scripts and do not make sense as
 | 
					 | 
				
			||||||
	 * anything else */
 | 
					 | 
				
			||||||
	if (strcmp(applet, "service_get_value") == 0 ||
 | 
					 | 
				
			||||||
	    strcmp(applet, "service_set_value") == 0 ||
 | 
					 | 
				
			||||||
	    strcmp(applet, "get_options") == 0 ||
 | 
					 | 
				
			||||||
	    strcmp(applet, "save_options") == 0)
 | 
					 | 
				
			||||||
		exit(do_value(argc, argv));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (strncmp(applet, "service_", strlen("service_")) == 0)
 | 
						if (strncmp(applet, "service_", strlen("service_")) == 0)
 | 
				
			||||||
		exit(do_service(argc, argv));
 | 
							exit(do_service(argc, argv));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (strncmp(applet, "mark_service_", strlen("mark_service_")) == 0)
 | 
						if (strncmp(applet, "mark_service_", strlen("mark_service_")) == 0)
 | 
				
			||||||
		exit(do_mark_service(argc, argv));
 | 
							exit(do_mark_service(argc, argv));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (strcmp(applet, "is_runlevel_start") == 0)
 | 
					 | 
				
			||||||
		exit(rc_runlevel_starting() ? 0 : 1);
 | 
					 | 
				
			||||||
	else if (strcmp (applet, "is_runlevel_stop") == 0)
 | 
					 | 
				
			||||||
		exit(rc_runlevel_stopping() ? 0 : 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (strcmp(applet, "rc-abort") == 0) {
 | 
					 | 
				
			||||||
		p = getenv("RC_PID");
 | 
					 | 
				
			||||||
		if (p && sscanf(p, "%d", &pid) == 1) {
 | 
					 | 
				
			||||||
			if (kill(pid, SIGUSR1) != 0)
 | 
					 | 
				
			||||||
				eerrorx("rc-abort: failed to signal parent %d: %s",
 | 
					 | 
				
			||||||
				    pid, strerror(errno));
 | 
					 | 
				
			||||||
			exit(EXIT_SUCCESS);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		exit(EXIT_FAILURE);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (strcmp(applet, "rc") != 0)
 | 
						if (strcmp(applet, "rc") != 0)
 | 
				
			||||||
		eerrorx("%s: unknown applet", applet);
 | 
							eerrorx("%s: unknown applet", applet);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -276,12 +276,19 @@ rc_logger_open(const char *level)
 | 
				
			|||||||
			fclose(log);
 | 
								fclose(log);
 | 
				
			||||||
			fclose(plog);
 | 
								fclose(plog);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
 | 
								/*
 | 
				
			||||||
 | 
								 * logfile or its basedir may be read-only during sysinit and
 | 
				
			||||||
 | 
								 * shutdown so skip the error in this case
 | 
				
			||||||
 | 
								 */
 | 
				
			||||||
 | 
								if (errno != EROFS && ((strcmp(level, RC_LEVEL_SHUTDOWN) != 0) && (strcmp(level, RC_LEVEL_SYSINIT) != 0))) {
 | 
				
			||||||
				log_error = 1;
 | 
									log_error = 1;
 | 
				
			||||||
				eerror("Error: fopen(%s) failed: %s", logfile, strerror(errno));
 | 
									eerror("Error: fopen(%s) failed: %s", logfile, strerror(errno));
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Try to keep the temporary log in case of errors */
 | 
							/* Try to keep the temporary log in case of errors */
 | 
				
			||||||
		if (!log_error) {
 | 
							if (!log_error) {
 | 
				
			||||||
 | 
								if (errno != EROFS && ((strcmp(level, RC_LEVEL_SHUTDOWN) != 0) && (strcmp(level, RC_LEVEL_SYSINIT) != 0)))
 | 
				
			||||||
				if (unlink(TMPLOG) == -1)
 | 
									if (unlink(TMPLOG) == -1)
 | 
				
			||||||
					eerror("Error: unlink(%s) failed: %s", TMPLOG, strerror(errno));
 | 
										eerror("Error: unlink(%s) failed: %s", TMPLOG, strerror(errno));
 | 
				
			||||||
		} else if (exists(TMPLOG))
 | 
							} else if (exists(TMPLOG))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -191,6 +191,10 @@ env_config(void)
 | 
				
			|||||||
	if (sys)
 | 
						if (sys)
 | 
				
			||||||
		setenv("RC_SYS", sys, 1);
 | 
							setenv("RC_SYS", sys, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PREFIX
 | 
				
			||||||
 | 
						setenv("RC_PREFIX", RC_PREFIX, 1);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Some scripts may need to take a different code path if
 | 
						/* Some scripts may need to take a different code path if
 | 
				
			||||||
	   Linux/FreeBSD, etc
 | 
						   Linux/FreeBSD, etc
 | 
				
			||||||
	   To save on calling uname, we store it in an environment variable */
 | 
						   To save on calling uname, we store it in an environment variable */
 | 
				
			||||||
@@ -331,3 +335,12 @@ parse_mode(mode_t *mode, char *text)
 | 
				
			|||||||
	errno = EINVAL;
 | 
						errno = EINVAL;
 | 
				
			||||||
	return -1;
 | 
						return -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					is_writable(const char *path)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (access(path, W_OK) == 0)
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										75
									
								
								src/rc/rc.c
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								src/rc/rc.c
									
									
									
									
									
								
							@@ -167,43 +167,6 @@ cleanup(void)
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __linux__
 | 
					 | 
				
			||||||
static char *
 | 
					 | 
				
			||||||
proc_getent(const char *ent)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	FILE *fp;
 | 
					 | 
				
			||||||
	char *proc, *p, *value = NULL;
 | 
					 | 
				
			||||||
	size_t i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!exists("/proc/cmdline"))
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!(fp = fopen("/proc/cmdline", "r"))) {
 | 
					 | 
				
			||||||
		eerror("failed to open `/proc/cmdline': %s", strerror(errno));
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	proc = NULL;
 | 
					 | 
				
			||||||
	i = 0;
 | 
					 | 
				
			||||||
	if (rc_getline(&proc, &i, fp) == -1 || proc == NULL)
 | 
					 | 
				
			||||||
		eerror("rc_getline: %s", strerror(errno));
 | 
					 | 
				
			||||||
	if (*proc && (p = strstr(proc, ent))) {
 | 
					 | 
				
			||||||
		i = p - proc;
 | 
					 | 
				
			||||||
		if (i == '\0' || proc[i - 1] == ' ') {
 | 
					 | 
				
			||||||
			p += strlen(ent);
 | 
					 | 
				
			||||||
			if (*p == '=')
 | 
					 | 
				
			||||||
				p++;
 | 
					 | 
				
			||||||
			value = xstrdup(strsep(&p, " "));
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	} else
 | 
					 | 
				
			||||||
		errno = ENOENT;
 | 
					 | 
				
			||||||
	fclose(fp);
 | 
					 | 
				
			||||||
	free(proc);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return value;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static char
 | 
					static char
 | 
				
			||||||
read_key(bool block)
 | 
					read_key(bool block)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -343,15 +306,6 @@ open_shell(void)
 | 
				
			|||||||
	run_program(shell);
 | 
						run_program(shell);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_dead static void
 | 
					 | 
				
			||||||
single_user(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	rc_logger_close();
 | 
					 | 
				
			||||||
	execl(SHUTDOWN, SHUTDOWN, "now", (char *) NULL);
 | 
					 | 
				
			||||||
	eerrorx("%s: unable to exec `" SHUTDOWN "': %s",
 | 
					 | 
				
			||||||
	    applet, strerror(errno));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static bool
 | 
					static bool
 | 
				
			||||||
set_krunlevel(const char *level)
 | 
					set_krunlevel(const char *level)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -379,11 +333,11 @@ set_krunlevel(const char *level)
 | 
				
			|||||||
	return true;
 | 
						return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static size_t
 | 
				
			||||||
get_krunlevel(char *buffer, int buffer_len)
 | 
					get_krunlevel(char *buffer, int buffer_len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	FILE *fp;
 | 
						FILE *fp;
 | 
				
			||||||
	int i = 0;
 | 
						size_t i = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!exists(RC_KRUNLEVEL))
 | 
						if (!exists(RC_KRUNLEVEL))
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
@@ -704,6 +658,7 @@ do_start_services(bool parallel)
 | 
				
			|||||||
			interactive = want_interactive();
 | 
								interactive = want_interactive();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (interactive) {
 | 
							if (interactive) {
 | 
				
			||||||
 | 
								parallel = false;
 | 
				
			||||||
	interactive_retry:
 | 
						interactive_retry:
 | 
				
			||||||
			printf("\n");
 | 
								printf("\n");
 | 
				
			||||||
			einfo("About to start the service %s",
 | 
								einfo("About to start the service %s",
 | 
				
			||||||
@@ -838,6 +793,13 @@ main(int argc, char **argv)
 | 
				
			|||||||
	env_filter();
 | 
						env_filter();
 | 
				
			||||||
	env_config();
 | 
						env_config();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* complain about old configuration settings if they exist */
 | 
				
			||||||
 | 
						if (exists(RC_CONF_OLD)) {
 | 
				
			||||||
 | 
							ewarn("%s still exists on your system and should be removed.",
 | 
				
			||||||
 | 
									RC_CONF_OLD);
 | 
				
			||||||
 | 
							ewarn("Please migrate to the appropriate settings in %s", RC_CONF);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	argc++;
 | 
						argc++;
 | 
				
			||||||
	argv--;
 | 
						argv--;
 | 
				
			||||||
	while ((opt = getopt_long(argc, argv, getoptstring,
 | 
						while ((opt = getopt_long(argc, argv, getoptstring,
 | 
				
			||||||
@@ -871,16 +833,9 @@ main(int argc, char **argv)
 | 
				
			|||||||
			eerrorx("%s: %s", applet, strerror(errno));
 | 
								eerrorx("%s: %s", applet, strerror(errno));
 | 
				
			||||||
			/* NOTREACHED */
 | 
								/* NOTREACHED */
 | 
				
			||||||
		case 'S':
 | 
							case 'S':
 | 
				
			||||||
			if (rc_conf_value("rc_sys")) {
 | 
								bootlevel = rc_sys();
 | 
				
			||||||
				bootlevel = rc_sys_v2();
 | 
					 | 
				
			||||||
			if (bootlevel)
 | 
								if (bootlevel)
 | 
				
			||||||
				printf("%s\n", bootlevel);
 | 
									printf("%s\n", bootlevel);
 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				ewarn("WARNING: rc_sys not defined in rc.conf. Falling back to automatic detection");
 | 
					 | 
				
			||||||
				bootlevel = rc_sys_v1();
 | 
					 | 
				
			||||||
				if (bootlevel)
 | 
					 | 
				
			||||||
					printf("%s\n", bootlevel);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			exit(EXIT_SUCCESS);
 | 
								exit(EXIT_SUCCESS);
 | 
				
			||||||
			/* NOTREACHED */
 | 
								/* NOTREACHED */
 | 
				
			||||||
		case_RC_COMMON_GETOPT
 | 
							case_RC_COMMON_GETOPT
 | 
				
			||||||
@@ -960,9 +915,9 @@ main(int argc, char **argv)
 | 
				
			|||||||
#ifdef __linux__
 | 
					#ifdef __linux__
 | 
				
			||||||
			if (strcmp(newlevel, RC_LEVEL_SYSINIT) == 0) {
 | 
								if (strcmp(newlevel, RC_LEVEL_SYSINIT) == 0) {
 | 
				
			||||||
				/* If we requested a runlevel, save it now */
 | 
									/* If we requested a runlevel, save it now */
 | 
				
			||||||
				p = proc_getent("rc_runlevel");
 | 
									p = rc_proc_getent("rc_runlevel");
 | 
				
			||||||
				if (p == NULL)
 | 
									if (p == NULL)
 | 
				
			||||||
					p = proc_getent("softlevel");
 | 
										p = rc_proc_getent("softlevel");
 | 
				
			||||||
				if (p != NULL) {
 | 
									if (p != NULL) {
 | 
				
			||||||
					set_krunlevel(p);
 | 
										set_krunlevel(p);
 | 
				
			||||||
					free(p);
 | 
										free(p);
 | 
				
			||||||
@@ -1114,7 +1069,7 @@ main(int argc, char **argv)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifdef __linux__
 | 
					#ifdef __linux__
 | 
				
			||||||
	/* mark any services skipped as started */
 | 
						/* mark any services skipped as started */
 | 
				
			||||||
	proc = p = proc_getent("noinit");
 | 
						proc = p = rc_proc_getent("noinit");
 | 
				
			||||||
	if (proc) {
 | 
						if (proc) {
 | 
				
			||||||
		while ((token = strsep(&p, ",")))
 | 
							while ((token = strsep(&p, ",")))
 | 
				
			||||||
			rc_service_mark(token, RC_SERVICE_STARTED);
 | 
								rc_service_mark(token, RC_SERVICE_STARTED);
 | 
				
			||||||
@@ -1135,7 +1090,7 @@ main(int argc, char **argv)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifdef __linux__
 | 
					#ifdef __linux__
 | 
				
			||||||
	/* mark any services skipped as stopped */
 | 
						/* mark any services skipped as stopped */
 | 
				
			||||||
	proc = p = proc_getent("noinit");
 | 
						proc = p = rc_proc_getent("noinit");
 | 
				
			||||||
	if (proc) {
 | 
						if (proc) {
 | 
				
			||||||
		while ((token = strsep(&p, ",")))
 | 
							while ((token = strsep(&p, ",")))
 | 
				
			||||||
			rc_service_mark(token, RC_SERVICE_STOPPED);
 | 
								rc_service_mark(token, RC_SERVICE_STOPPED);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -75,7 +75,7 @@
 | 
				
			|||||||
#define WARN_TIMEOUT	10		/* warn about this every N seconds */
 | 
					#define WARN_TIMEOUT	10		/* warn about this every N seconds */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const char *applet;
 | 
					static const char *applet;
 | 
				
			||||||
static char *service, *runlevel, *ibsave, *prefix;;
 | 
					static char *service, *runlevel, *ibsave, *prefix;
 | 
				
			||||||
static RC_DEPTREE *deptree;
 | 
					static RC_DEPTREE *deptree;
 | 
				
			||||||
static RC_STRINGLIST *applet_list, *services, *tmplist;
 | 
					static RC_STRINGLIST *applet_list, *services, *tmplist;
 | 
				
			||||||
static RC_STRINGLIST *restart_services, *need_services, *use_services;
 | 
					static RC_STRINGLIST *restart_services, *need_services, *use_services;
 | 
				
			||||||
@@ -288,6 +288,13 @@ cleanup(void)
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Buffer and lock all output messages so that we get readable content */
 | 
				
			||||||
 | 
					/* FIXME: Use a dynamic lock file that contains the tty/pts as well.
 | 
				
			||||||
 | 
					 * For example openrc-pts8.lock or openrc-tty1.lock.
 | 
				
			||||||
 | 
					 * Using a static lock file makes no sense, esp. in multi-user environments.
 | 
				
			||||||
 | 
					 * Why don't we use (f)printf, as it is thread-safe through POSIX already?
 | 
				
			||||||
 | 
					 * Bug: 360013
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
write_prefix(const char *buffer, size_t bytes, bool *prefixed)
 | 
					write_prefix(const char *buffer, size_t bytes, bool *prefixed)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -297,14 +304,20 @@ write_prefix(const char *buffer, size_t bytes, bool *prefixed)
 | 
				
			|||||||
	ssize_t ret = 0;
 | 
						ssize_t ret = 0;
 | 
				
			||||||
	int fd = fileno(stdout), lock_fd = -1;
 | 
						int fd = fileno(stdout), lock_fd = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Spin until we lock the prefix */
 | 
						/*
 | 
				
			||||||
	for (;;) {
 | 
						 * Lock the prefix.
 | 
				
			||||||
 | 
						 * open() may fail here when running as user, as RC_SVCDIR may not be writable.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	lock_fd = open(PREFIX_LOCK, O_WRONLY | O_CREAT, 0664);
 | 
						lock_fd = open(PREFIX_LOCK, O_WRONLY | O_CREAT, 0664);
 | 
				
			||||||
		if (lock_fd != -1)
 | 
					
 | 
				
			||||||
			if (flock(lock_fd, LOCK_EX) == 0)
 | 
						if (lock_fd != -1) {
 | 
				
			||||||
				break;
 | 
							if (flock(lock_fd, LOCK_EX) != 0)
 | 
				
			||||||
		close(lock_fd);
 | 
								eerror("flock() failed: %s", strerror(errno));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					#ifdef RC_DEBUG
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							ewarn("Couldn't open the prefix lock, please make sure you have enough permissions");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < bytes; i++) {
 | 
						for (i = 0; i < bytes; i++) {
 | 
				
			||||||
		/* We don't prefix eend calls (cursor up) */
 | 
							/* We don't prefix eend calls (cursor up) */
 | 
				
			||||||
@@ -332,6 +345,7 @@ write_prefix(const char *buffer, size_t bytes, bool *prefixed)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/* Release the lock */
 | 
						/* Release the lock */
 | 
				
			||||||
	close(lock_fd);
 | 
						close(lock_fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -821,7 +835,7 @@ svc_start(void)
 | 
				
			|||||||
		svc_start_real();
 | 
							svc_start_real();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static int
 | 
				
			||||||
svc_stop_check(RC_SERVICE *state)
 | 
					svc_stop_check(RC_SERVICE *state)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	*state = rc_service_state(service);
 | 
						*state = rc_service_state(service);
 | 
				
			||||||
@@ -848,7 +862,7 @@ svc_stop_check(RC_SERVICE *state)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (*state & RC_SERVICE_STOPPED) {
 | 
						if (*state & RC_SERVICE_STOPPED) {
 | 
				
			||||||
		ewarn("WARNING: %s is already stopped", applet);
 | 
							ewarn("WARNING: %s is already stopped", applet);
 | 
				
			||||||
		exit(EXIT_SUCCESS);
 | 
							return 1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rc_service_mark(service, RC_SERVICE_STOPPING);
 | 
						rc_service_mark(service, RC_SERVICE_STOPPING);
 | 
				
			||||||
@@ -861,6 +875,8 @@ svc_stop_check(RC_SERVICE *state)
 | 
				
			|||||||
		else if (rc_service_in_runlevel(service, RC_LEVEL_BOOT))
 | 
							else if (rc_service_in_runlevel(service, RC_LEVEL_BOOT))
 | 
				
			||||||
			ewarn("WARNING: you are stopping a boot service");
 | 
								ewarn("WARNING: you are stopping a boot service");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@@ -986,7 +1002,7 @@ svc_stop_real(void)
 | 
				
			|||||||
	rc_plugin_run(RC_HOOK_SERVICE_STOP_OUT, applet);
 | 
						rc_plugin_run(RC_HOOK_SERVICE_STOP_OUT, applet);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static int
 | 
				
			||||||
svc_stop(void)
 | 
					svc_stop(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	RC_SERVICE state;
 | 
						RC_SERVICE state;
 | 
				
			||||||
@@ -995,13 +1011,16 @@ svc_stop(void)
 | 
				
			|||||||
	if (dry_run)
 | 
						if (dry_run)
 | 
				
			||||||
		einfon("stop:");
 | 
							einfon("stop:");
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		svc_stop_check(&state);
 | 
							if (svc_stop_check(&state) == 1)
 | 
				
			||||||
 | 
								return 1; /* Service has been stopped already */
 | 
				
			||||||
	if (deps)
 | 
						if (deps)
 | 
				
			||||||
		svc_stop_deps(state);
 | 
							svc_stop_deps(state);
 | 
				
			||||||
	if (dry_run)
 | 
						if (dry_run)
 | 
				
			||||||
		printf(" %s\n", applet);
 | 
							printf(" %s\n", applet);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		svc_stop_real();
 | 
							svc_stop_real();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@@ -1074,12 +1093,13 @@ service_plugable(void)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "_usage.h"
 | 
					#include "_usage.h"
 | 
				
			||||||
#define getoptstring "dDsvl:Z" getoptstring_COMMON
 | 
					#define getoptstring "dDsSvl:Z" getoptstring_COMMON
 | 
				
			||||||
#define extraopts "stop | start | restart | describe | zap"
 | 
					#define extraopts "stop | start | restart | describe | zap"
 | 
				
			||||||
static const struct option longopts[] = {
 | 
					static const struct option longopts[] = {
 | 
				
			||||||
	{ "debug",      0, NULL, 'd'},
 | 
						{ "debug",      0, NULL, 'd'},
 | 
				
			||||||
	{ "dry-run",    0, NULL, 'Z'},
 | 
						{ "dry-run",    0, NULL, 'Z'},
 | 
				
			||||||
	{ "ifstarted",  0, NULL, 's'},
 | 
						{ "ifstarted",  0, NULL, 's'},
 | 
				
			||||||
 | 
						{ "ifstopped",  0, NULL, 'S'},
 | 
				
			||||||
	{ "nodeps",     0, NULL, 'D'},
 | 
						{ "nodeps",     0, NULL, 'D'},
 | 
				
			||||||
	{ "lockfd",     1, NULL, 'l'},
 | 
						{ "lockfd",     1, NULL, 'l'},
 | 
				
			||||||
	longopts_COMMON
 | 
						longopts_COMMON
 | 
				
			||||||
@@ -1088,6 +1108,7 @@ static const char *const longopts_help[] = {
 | 
				
			|||||||
	"set xtrace when running the script",
 | 
						"set xtrace when running the script",
 | 
				
			||||||
	"show what would be done",
 | 
						"show what would be done",
 | 
				
			||||||
	"only run commands when started",
 | 
						"only run commands when started",
 | 
				
			||||||
 | 
						"only run commands when stopped",
 | 
				
			||||||
	"ignore dependencies",
 | 
						"ignore dependencies",
 | 
				
			||||||
	"fd of the exclusive lock from rc",
 | 
						"fd of the exclusive lock from rc",
 | 
				
			||||||
	longopts_help_COMMON
 | 
						longopts_help_COMMON
 | 
				
			||||||
@@ -1100,9 +1121,11 @@ runscript(int argc, char **argv)
 | 
				
			|||||||
	bool doneone = false;
 | 
						bool doneone = false;
 | 
				
			||||||
	int retval, opt, depoptions = RC_DEP_TRACE;
 | 
						int retval, opt, depoptions = RC_DEP_TRACE;
 | 
				
			||||||
	RC_STRING *svc;
 | 
						RC_STRING *svc;
 | 
				
			||||||
	char *save = NULL;
 | 
						char path[PATH_MAX], lnk[PATH_MAX];
 | 
				
			||||||
 | 
						char *dir, *save = NULL, *saveLnk = NULL;
 | 
				
			||||||
	char pidstr[10];
 | 
						char pidstr[10];
 | 
				
			||||||
	size_t l = 0, ll;
 | 
						size_t l = 0, ll;
 | 
				
			||||||
 | 
					 	const char *file;
 | 
				
			||||||
	struct stat stbuf;
 | 
						struct stat stbuf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Show help if insufficient args */
 | 
						/* Show help if insufficient args */
 | 
				
			||||||
@@ -1119,7 +1142,40 @@ runscript(int argc, char **argv)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	atexit(cleanup);
 | 
						atexit(cleanup);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	service = xstrdup(argv[1]);
 | 
						/* We need to work out the real full path to our service.
 | 
				
			||||||
 | 
						 * This works fine, provided that we ONLY allow multiplexed services
 | 
				
			||||||
 | 
						 * to exist in the same directory as the master link.
 | 
				
			||||||
 | 
						 * Also, the master link as to be a real file in the init dir. */
 | 
				
			||||||
 | 
						if (!realpath(argv[1], path)) {
 | 
				
			||||||
 | 
							fprintf(stderr, "realpath: %s\n", strerror(errno));
 | 
				
			||||||
 | 
							exit(EXIT_FAILURE);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						memset(lnk, 0, sizeof(lnk));
 | 
				
			||||||
 | 
						if (readlink(argv[1], lnk, sizeof(lnk)-1)) {
 | 
				
			||||||
 | 
							dir = dirname(path);
 | 
				
			||||||
 | 
							if (strchr(lnk, '/')) {
 | 
				
			||||||
 | 
								save = xstrdup(dir);
 | 
				
			||||||
 | 
								saveLnk = xstrdup(lnk);
 | 
				
			||||||
 | 
								dir = dirname(saveLnk);
 | 
				
			||||||
 | 
								if (strcmp(dir, save) == 0)
 | 
				
			||||||
 | 
									file = basename_c(argv[1]);
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									file = basename_c(lnk);
 | 
				
			||||||
 | 
								dir = save;
 | 
				
			||||||
 | 
							} else
 | 
				
			||||||
 | 
								file = basename_c(argv[1]);
 | 
				
			||||||
 | 
							ll = strlen(dir) + strlen(file) + 2;
 | 
				
			||||||
 | 
							service = xmalloc(ll);
 | 
				
			||||||
 | 
							snprintf(service, ll, "%s/%s", dir, file);
 | 
				
			||||||
 | 
							if (stat(service, &stbuf) != 0) {
 | 
				
			||||||
 | 
								free(service);
 | 
				
			||||||
 | 
								service = xstrdup(lnk);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							free(save);
 | 
				
			||||||
 | 
							free(saveLnk);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (!service)
 | 
				
			||||||
 | 
							service = xstrdup(path);
 | 
				
			||||||
	applet = basename_c(service);
 | 
						applet = basename_c(service);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (argc < 3)
 | 
						if (argc < 3)
 | 
				
			||||||
@@ -1195,6 +1251,10 @@ runscript(int argc, char **argv)
 | 
				
			|||||||
			if (!(rc_service_state(service) & RC_SERVICE_STARTED))
 | 
								if (!(rc_service_state(service) & RC_SERVICE_STARTED))
 | 
				
			||||||
				exit(EXIT_FAILURE);
 | 
									exit(EXIT_FAILURE);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							case 'S':
 | 
				
			||||||
 | 
								if (!(rc_service_state(service) & RC_SERVICE_STOPPED))
 | 
				
			||||||
 | 
									exit(EXIT_FAILURE);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case 'D':
 | 
							case 'D':
 | 
				
			||||||
			deps = false;
 | 
								deps = false;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
@@ -1316,7 +1376,8 @@ runscript(int argc, char **argv)
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
				if (deps && in_background)
 | 
									if (deps && in_background)
 | 
				
			||||||
					get_started_services();
 | 
										get_started_services();
 | 
				
			||||||
				svc_stop();
 | 
									if (svc_stop() == 1)
 | 
				
			||||||
 | 
										continue; /* Service has been stopped already */
 | 
				
			||||||
				if (deps) {
 | 
									if (deps) {
 | 
				
			||||||
					if (!in_background &&
 | 
										if (!in_background &&
 | 
				
			||||||
					    !rc_runlevel_stopping() &&
 | 
										    !rc_runlevel_stopping() &&
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user