Compare commits
	
		
			119 Commits
		
	
	
		
			openrc-0.9
			...
			funtoo-ope
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 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 | 
							
								
								
									
										4
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | |||||||
|  |  | ||||||
| include Makefile.inc | include Makefile.inc | ||||||
|  |  | ||||||
| SUBDIR=		conf.d doc etc init.d local.d man net scripts sh src | SUBDIR=		conf.d doc etc init.d local.d sysctl.d man net scripts sh src | ||||||
|  |  | ||||||
| # Build pkgconfig or not | # Build pkgconfig or not | ||||||
| MKPKGCONFIG?=	yes | MKPKGCONFIG?=	yes | ||||||
| @@ -25,6 +25,8 @@ include ${MK}/dist.mk | |||||||
| include ${MK}/git.mk | include ${MK}/git.mk | ||||||
|  |  | ||||||
| _installafter: | _installafter: | ||||||
|  | ifneq ($(OS),Linux) | ||||||
| 	${INSTALL} -d ${DESTDIR}/${LIBEXECDIR}/init.d | 	${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.8.4 | VERSION=	0.10 | ||||||
| PKG=		${NAME}-${VERSION} | PKG=		${NAME}-${VERSION} | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								README
									
									
									
									
									
								
							| @@ -12,7 +12,6 @@ LIBNAME=lib64 | |||||||
| DESTDIR=/tmp/openrc-image | DESTDIR=/tmp/openrc-image | ||||||
| MKPAM=pam | MKPAM=pam | ||||||
| MKPKGCONFIG=no | MKPKGCONFIG=no | ||||||
| MKRCSYS=prefix |  | ||||||
| MKSELINUX=yes | MKSELINUX=yes | ||||||
| MKSTATICLIBS=no | MKSTATICLIBS=no | ||||||
| MKTERMCAP=ncurses | MKTERMCAP=ncurses | ||||||
| @@ -34,20 +33,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 | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								TODO
									
									
									
									
									
								
							| @@ -1,7 +1,21 @@ | |||||||
| - ensure all forks block, restore and unblock signals. needs review  | - ensure all forks block, restore and unblock signals. needs review | ||||||
|  |  | ||||||
| - add support somehow for optional translations | - add support somehow for optional translations | ||||||
|  |  | ||||||
| - 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,10 +1,10 @@ | |||||||
| # Set CLOCK to "UTC" if your system clock is set to UTC (also known as | # Set CLOCK to "UTC" if your system clock is set to UTC (also known as | ||||||
| # Greenwich Mean Time).  If your clock is set to the local time, then  | # Greenwich Mean Time).  If your clock is set to the local time, then | ||||||
| # set CLOCK to "local".  Note that if you dual boot with Windows, then  | # set CLOCK to "local".  Note that if you dual boot with Windows, then | ||||||
| # 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 to set the Hardware Clock to the current System Time | ||||||
| # during shutdown, then say "YES" here. | # during shutdown, then say "YES" here. | ||||||
| # You normally don't need to do this if you run a ntp daemon. | # You normally don't need to do this if you run a ntp daemon. | ||||||
| clock_systohc="NO" | clock_systohc="NO" | ||||||
|   | |||||||
| @@ -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,22 +1,20 @@ | |||||||
| # Set CLOCK to "UTC" if your Hardware Clock is set to UTC (also known as | # Set CLOCK to "UTC" if your Hardware Clock is set to UTC (also known as | ||||||
| # Greenwich Mean Time).  If that clock is set to the local time, then  | # Greenwich Mean Time).  If that clock is set to the local time, then | ||||||
| # set CLOCK to "local".  Note that if you dual boot with Windows, then  | # set CLOCK to "local".  Note that if you dual boot with Windows, then | ||||||
| # 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 do not want to set the hardware clock to the current system | ||||||
|  | # time (software clock) during shutdown, set this to no. | ||||||
|  | #clock_systohc="YES" | ||||||
|  |  | ||||||
| # If you want to set the system time to the current hardware clock |  | ||||||
| # during bootup, then say "YES" here. You do not need this if you are |  | ||||||
| # running a modern kernel with CONFIG_RTC_HCTOSYS set to y. |  | ||||||
| # 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. | ||||||
| clock_args="" | clock_args="" | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ windowkeys="NO" | |||||||
| extended_keymaps="" | extended_keymaps="" | ||||||
| #extended_keymaps="backspace keypad euro2" | #extended_keymaps="backspace keypad euro2" | ||||||
|  |  | ||||||
| # Tell dumpkeys(1) to interpret character action codes to be  | # Tell dumpkeys(1) to interpret character action codes to be | ||||||
| # from the specified character set. | # from the specified character set. | ||||||
| # This only matters if you set unicode="yes" in /etc/rc.conf. | # This only matters if you set unicode="yes" in /etc/rc.conf. | ||||||
| # For a list of valid sets, run `dumpkeys --help` | # For a list of valid sets, run `dumpkeys --help` | ||||||
|   | |||||||
| @@ -11,6 +11,6 @@ | |||||||
|  |  | ||||||
| # You can also multiplex the init script for each device like so | # You can also multiplex the init script for each device like so | ||||||
| #   ln -s moused /etc/init.d/moused.ums0 | #   ln -s moused /etc/init.d/moused.ums0 | ||||||
| # This enables you to have a config file per mouse (forces moused_device  | # This enables you to have a config file per mouse (forces moused_device | ||||||
| # to ums0 in this case) and control each mouse. | # to ums0 in this case) and control each mouse. | ||||||
| # devd can also start and stop these mice, which laptop users will find handy. | # devd can also start and stop these mice, which laptop users will find handy. | ||||||
|   | |||||||
| @@ -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) | ||||||
| @@ -586,10 +586,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' | ||||||
| @@ -611,14 +616,27 @@ | |||||||
| #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" | ||||||
|  |  | ||||||
|  |  | ||||||
| #----------------------------------------------------------------------------- | #----------------------------------------------------------------------------- | ||||||
| @@ -735,7 +753,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 | ||||||
| @@ -775,6 +793,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" | ||||||
|  |  | ||||||
| @@ -847,7 +867,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 | ||||||
| @@ -898,7 +918,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 | ||||||
|   | |||||||
| @@ -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} $^ > $@ | ||||||
|   | |||||||
| @@ -4,11 +4,9 @@ | |||||||
| # This is the subsystem type. Valid options on FreeBSD: | # This is the subsystem type. Valid options on FreeBSD: | ||||||
| # ""        - nothing special | # ""        - nothing special | ||||||
| # "jail"    - FreeBSD jails | # "jail"    - FreeBSD jails | ||||||
| # "prefix"  - Prefix | # If this is commented out, automatic detection will be used. | ||||||
| # If this is commented out, automatic detection will be attempted. |  | ||||||
| # 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="" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,18 +5,15 @@ | |||||||
| # ""        - nothing special | # ""        - nothing special | ||||||
| # "lxc"     - Linux Containers | # "lxc"     - Linux Containers | ||||||
| # "openvz"  - Linux OpenVZ | # "openvz"  - Linux OpenVZ | ||||||
| # "prefix"  - Prefix |  | ||||||
| # "uml"     - Usermode Linux | # "uml"     - Usermode Linux | ||||||
| # "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 ...) | ||||||
|   | |||||||
| @@ -3,13 +3,11 @@ | |||||||
|  |  | ||||||
| # This is the subsystem type. Valid options on NetBSD: | # This is the subsystem type. Valid options on NetBSD: | ||||||
| # ""        - nothing special | # ""        - nothing special | ||||||
| # "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="" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,8 +1,18 @@ | |||||||
| # Global OpenRC configuration settings | # Global OpenRC configuration settings | ||||||
|  |  | ||||||
|  | # Set to "YES" if you want the rc system to try and start services | ||||||
|  | # in parallel for a slight speed improvement. When running in parallel we | ||||||
|  | # prefix the service output with its name as the output will get | ||||||
|  | # jumbled up. | ||||||
|  | # WARNING: whilst we have improved parallel, it can still potentially lock | ||||||
|  | # the boot process. Don't file bugs about this unless you can supply | ||||||
|  | # patches that fix it without breaking other things! | ||||||
|  | #rc_parallel="NO" | ||||||
|  |  | ||||||
| # Set rc_interactive to "YES" and you'll be able to press the I key during | # Set rc_interactive to "YES" and you'll be able to press the I key during | ||||||
| # boot so you can choose to start specific services. Set to "NO" to disable | # boot so you can choose to start specific services. Set to "NO" to disable | ||||||
| # this feature. | # this feature. This feature is automatically disabled if rc_parallel is | ||||||
|  | # set to YES. | ||||||
| #rc_interactive="YES" | #rc_interactive="YES" | ||||||
|  |  | ||||||
| # If we need to drop to a shell, you can specify it here. | # If we need to drop to a shell, you can specify it here. | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								init.d/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								init.d/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -11,6 +11,7 @@ network | |||||||
| root | root | ||||||
| savecache | savecache | ||||||
| swap | swap | ||||||
|  | swapfiles | ||||||
| sysctl | sysctl | ||||||
| urandom | urandom | ||||||
| devfs | devfs | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 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 \ | 	network.in root.in savecache.in staticroute.in swap.in swapfiles.in \ | ||||||
| 	sysctl.in urandom.in ${SRCS-${OS}} | 	swclock.in sysctl.in urandom.in ${SRCS-${OS}} | ||||||
| BIN=	${OBJS} | BIN=	${OBJS} | ||||||
|  |  | ||||||
| INSTALLAFTER=	_installafter_net.lo | INSTALLAFTER=	_installafter_net.lo | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ depend() | |||||||
| 	   [ "$clock" != "UTC" -a ! -e /etc/wall_cmos_clock ]; then | 	   [ "$clock" != "UTC" -a ! -e /etc/wall_cmos_clock ]; then | ||||||
| 		need root | 		need root | ||||||
| 	fi | 	fi | ||||||
| 	keyword -jail -prefix | 	keyword -jail | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -7,12 +7,7 @@ depend() | |||||||
| 	need localmount | 	need localmount | ||||||
| 	before logger | 	before logger | ||||||
| 	after clock sysctl | 	after clock sysctl | ||||||
| 	keyword -prefix -timeout | 	keyword -timeout | ||||||
| } |  | ||||||
|  |  | ||||||
| dir_writable() |  | ||||||
| { |  | ||||||
| 	mkdir "$1"/.test.$$ 2>/dev/null && rmdir "$1"/.test.$$ |  | ||||||
| } | } | ||||||
|  |  | ||||||
| : ${wipe_tmp:=${WIPE_TMP:-yes}} | : ${wipe_tmp:=${WIPE_TMP:-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 | ||||||
| @@ -122,7 +117,7 @@ start() | |||||||
| 		migrate_to_run	/var/run /run | 		migrate_to_run	/var/run /run | ||||||
| 	fi | 	fi | ||||||
|  |  | ||||||
| 	if dir_writable /var/run; then | 	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 | ||||||
| @@ -164,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 | ||||||
| @@ -177,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 | ||||||
| @@ -186,7 +181,6 @@ start() | |||||||
| 		fi | 		fi | ||||||
| 	fi | 	fi | ||||||
|  |  | ||||||
| 	[ -w /etc/nologin ] && rm -f /etc/nologin |  | ||||||
| 	return 0 | 	return 0 | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ depend() | |||||||
| { | { | ||||||
| 	need localmount termencoding | 	need localmount termencoding | ||||||
| 	after hotplug bootmisc | 	after hotplug bootmisc | ||||||
| 	keyword -openvz -prefix -uml -vserver -xenu -lxc | 	keyword -openvz -uml -vserver -xenu -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
| @@ -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 | ||||||
| 			: | 			: | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ depend() { | |||||||
| 	need localmount | 	need localmount | ||||||
| 	after bootmisc | 	after bootmisc | ||||||
| 	before net.lo0 | 	before net.lo0 | ||||||
| 	keyword -jail -prefix | 	keyword -jail | ||||||
| } | } | ||||||
|  |  | ||||||
| start_pre() { | start_pre() { | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ description="Mount system critical filesystems in /dev." | |||||||
|  |  | ||||||
| depend() { | depend() { | ||||||
| 	use dev | 	use dev | ||||||
| 	keyword -prefix -vserver | 	keyword -vserver | ||||||
| } | } | ||||||
|  |  | ||||||
| start() { | start() { | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ description="Configures a specific kernel dump device." | |||||||
|  |  | ||||||
| depend() { | depend() { | ||||||
| 	need swap | 	need swap | ||||||
| 	keyword -jail -prefix | 	keyword -jail | ||||||
| } | } | ||||||
|  |  | ||||||
| start() { | start() { | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ _IFS=" | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	use dev clock modules | 	use dev clock modules | ||||||
| 	keyword -jail -openvz -prefix -timeout -vserver -lxc | 	keyword -jail -openvz -timeout -vserver -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| _abort() { | _abort() { | ||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ depend() | |||||||
| { | { | ||||||
| 	use root | 	use root | ||||||
| 	before devd net | 	before devd net | ||||||
| 	keyword -jail -prefix | 	keyword -jail | ||||||
| } | } | ||||||
|  |  | ||||||
| _set() | _set() | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| description="Sets the hostname of the machine." | description="Sets the hostname of the machine." | ||||||
|  |  | ||||||
| depend() { | depend() { | ||||||
| 	keyword -prefix -lxc | 	keyword -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ depend() | |||||||
| 	else | 	else | ||||||
| 		before * | 		before * | ||||||
| 	fi | 	fi | ||||||
| 	keyword -openvz -prefix -uml -vserver -xenu -lxc | 	keyword -openvz -uml -vserver -xenu -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| setupopts() | setupopts() | ||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ depend() | |||||||
| { | { | ||||||
| 	need localmount termencoding | 	need localmount termencoding | ||||||
| 	after bootmisc | 	after bootmisc | ||||||
| 	keyword -openvz -prefix -uml -vserver -xenu -lxc | 	keyword -openvz -uml -vserver -xenu -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -4,11 +4,6 @@ | |||||||
|  |  | ||||||
| description="Kill all processes so we can unmount disks cleanly." | description="Kill all processes so we can unmount disks cleanly." | ||||||
|  |  | ||||||
| depend() |  | ||||||
| { |  | ||||||
| 	keyword -prefix |  | ||||||
| } |  | ||||||
|  |  | ||||||
| start() | start() | ||||||
| { | { | ||||||
| 	ebegin "Terminating remaining processes" | 	ebegin "Terminating remaining processes" | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ depend() | |||||||
| 	need fsck | 	need fsck | ||||||
| 	use lvm modules mtab | 	use lvm modules mtab | ||||||
| 	after lvm modules | 	after lvm modules | ||||||
| 	keyword -jail -openvz -prefix -vserver -lxc | 	keyword -jail -openvz -vserver -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
| @@ -33,6 +33,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 | ||||||
| @@ -47,7 +48,7 @@ stop() | |||||||
| 	done | 	done | ||||||
|  |  | ||||||
| 	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/.*|/usr" | ||||||
| 	fi | 	fi | ||||||
| 	no_umounts_r="^($no_umounts_r)$" | 	no_umounts_r="^($no_umounts_r)$" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ extra_commands="restore" | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	need localmount | 	need localmount | ||||||
| 	keyword -jail -prefix | 	keyword -jail | ||||||
| } | } | ||||||
|  |  | ||||||
| restore() | restore() | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ description="Loads a user defined list of kernel modules." | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	use isapnp | 	use isapnp | ||||||
| 	keyword -openvz -prefix -vserver -lxc | 	keyword -openvz -vserver -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ 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 -vserver -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
| @@ -23,7 +23,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:" | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ depend() | |||||||
| { | { | ||||||
| 	need localmount | 	need localmount | ||||||
| 	after bootmisc | 	after bootmisc | ||||||
| 	keyword -jail -prefix | 	keyword -jail | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -7,7 +7,6 @@ description="Update /etc/mtab to match what the kernel knows about" | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	need root | 	need root | ||||||
| 	keyword -prefix |  | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -19,13 +19,18 @@ depend() | |||||||
| 	local IFVAR=$(shell_var "${IFACE}") | 	local IFVAR=$(shell_var "${IFACE}") | ||||||
|  |  | ||||||
| 	need localmount | 	need localmount | ||||||
|  | 	if [ "$RC_UNAME" = Linux ]; then | ||||||
|  | 		need sysfs | ||||||
|  | 	fi | ||||||
| 	after bootmisc | 	after bootmisc | ||||||
| 	provide net | 	keyword -jail -vserver | ||||||
| 	keyword -jail -prefix -vserver |  | ||||||
|  |  | ||||||
| 	case "${IFACE}" in | 	case "${IFACE}" in | ||||||
| 		lo|lo0);; | 		lo|lo0) provide lo;; | ||||||
| 		*) after net.lo net.lo0 dbus;; | 		*) | ||||||
|  | 			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 | ||||||
| } | } | ||||||
|   | |||||||
| @@ -35,7 +35,7 @@ depend() | |||||||
| 	need net $pmap | 	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 nfs nfsmount portmap rpcbind rpc.statd rpc.lockd | ||||||
| 	keyword -jail -prefix -vserver | 	keyword -jail -vserver | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ depend() | |||||||
| 	need localmount | 	need localmount | ||||||
| 	after bootmisc | 	after bootmisc | ||||||
| 	provide net | 	provide net | ||||||
| 	keyword -jail -prefix -vserver | 	keyword -jail -vserver | ||||||
| } | } | ||||||
|  |  | ||||||
| uniqify() | uniqify() | ||||||
|   | |||||||
| @@ -7,7 +7,6 @@ required_files="/etc/newsyslog.conf" | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	need localmount | 	need localmount | ||||||
| 	keyword -prefix |  | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}} | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	need localmount | 	need localmount | ||||||
| 	keyword -openvz -prefix -vserver -lxc | 	keyword -openvz -vserver -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| _setleds() | _setleds() | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ extra_started_commands="reload" | |||||||
|  |  | ||||||
| depend() { | depend() { | ||||||
| 	need localmount | 	need localmount | ||||||
| 	keyword -jail -prefix | 	keyword -jail | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ depend() | |||||||
| 	need localmount | 	need localmount | ||||||
| 	use logger | 	use logger | ||||||
| 	after bootmisc | 	after bootmisc | ||||||
| 	keyword -jail -prefix | 	keyword -jail | ||||||
| } | } | ||||||
|  |  | ||||||
| start_pre() | start_pre() | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ depend() | |||||||
| { | { | ||||||
| 	use modules devfs | 	use modules devfs | ||||||
| 	need localmount | 	need localmount | ||||||
| 	keyword -openvz -prefix -vserver -lxc | 	keyword -openvz -vserver -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -7,7 +7,6 @@ depend() | |||||||
| 	need localmount net | 	need localmount net | ||||||
| 	after * | 	after * | ||||||
| 	before local | 	before local | ||||||
| 	keyword -prefix |  | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -7,26 +7,47 @@ description="Mount the root fs read/write" | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	need fsck | 	need fsck | ||||||
| 	keyword -jail -openvz -prefix -vserver -lxc | 	keyword -jail -openvz -vserver -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
| { | { | ||||||
| 	case ",$(fstabinfo -o /)," in | 	case ",$(fstabinfo -o /)," in | ||||||
| 	*,ro,*) return 0;; | 		*,ro,*) | ||||||
|  | 		;; | ||||||
|  | 		*) | ||||||
|  | 			# Check if the rootfs isn't already writable. | ||||||
|  | 			if checkpath -W /; then | ||||||
|  | 				rm -f /fastboot /forcefsck | ||||||
|  | 			else | ||||||
|  | 				ebegin "Remounting root filesystem read/write" | ||||||
|  | 				case "$RC_UNAME" in | ||||||
|  | 					Linux) | ||||||
|  | 						mount -n -o remount,rw / | ||||||
|  | 					;; | ||||||
|  | 					*) | ||||||
|  | 						mount -u -o rw / | ||||||
|  | 					;; | ||||||
|  | 				esac | ||||||
|  | 				eend $? "Root filesystem could not be mounted read/write" | ||||||
|  | 				if [ $?  -eq 0 ]; then | ||||||
|  | 					rm -f /fastboot /forcefsck | ||||||
|  | 				fi | ||||||
|  | 			fi | ||||||
|  | 		;; | ||||||
| 	esac | 	esac | ||||||
|  |  | ||||||
| 	if echo 2>/dev/null >/.test.$$; then | 	ebegin "Remounting filesystems" | ||||||
| 		rm -f /.test.$$ /fastboot /forcefsck | 	local mountpoint | ||||||
| 		return 0 | 	for mountpoint in $(fstabinfo); do | ||||||
| 	fi | 		case "${mountpoint}" in | ||||||
|  | 			/) | ||||||
| 	ebegin "Remounting root filesystem read/write" | 			;; | ||||||
| 	case "$RC_UNAME" in | 			/*) | ||||||
| 		Linux)	mount -n -o remount,rw /;; | 				mountinfo -q "${mountpoint}" && \ | ||||||
| 		*)	mount -u -o rw /;; | 					fstabinfo --remount "${mountpoint}" | ||||||
| 	esac | 			;; | ||||||
| 	if eend $? "Root filesystem could not be mounted read/write"; then | 		esac | ||||||
| 		rm -f /fastboot /forcefsck | 	done | ||||||
| 	fi | 	eend 0 | ||||||
| } | } | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ description="Saves a kernel dump." | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	need localmount | 	need localmount | ||||||
| 	keyword -jail -prefix | 	keyword -jail | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ depend() | |||||||
| { | { | ||||||
| 	provide net | 	provide net | ||||||
| 	use network | 	use network | ||||||
| 	keyword -jail -prefix -vserver | 	keyword -jail -vserver | ||||||
| } | } | ||||||
|  |  | ||||||
| pre_flight_checks() | pre_flight_checks() | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	before fsck | 	before fsck | ||||||
| 	keyword -jail -prefix | 	keyword -jail | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -4,14 +4,15 @@ | |||||||
|  |  | ||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	need localmount | 	before localmount | ||||||
| 	keyword -jail -openvz -prefix -vserver -lxc | 	keyword -jail -openvz -vserver -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | 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 | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										45
									
								
								init.d/swapfiles.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								init.d/swapfiles.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | #!@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) | ||||||
|  | 			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 | ||||||
|  | 			;; | ||||||
|  | 	esac | ||||||
|  | 	eend 0 | ||||||
|  | } | ||||||
| @@ -8,7 +8,7 @@ depend() | |||||||
| { | { | ||||||
| 	before * | 	before * | ||||||
| 	provide clock | 	provide clock | ||||||
| 	keyword -openvz -prefix -uml -vserver -xenu -lxc | 	keyword -openvz -uml -vserver -xenu -lxc | ||||||
| } | } | ||||||
|  |  | ||||||
| # swclock is an OpenRC built in | # swclock is an OpenRC built in | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
|  |  | ||||||
| depend() { | depend() { | ||||||
| 	need localmount | 	need localmount | ||||||
| 	keyword -jail -prefix | 	keyword -jail | ||||||
| } | } | ||||||
|  |  | ||||||
| start() { | start() { | ||||||
|   | |||||||
| @@ -5,7 +5,6 @@ | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	before bootmisc logger | 	before bootmisc logger | ||||||
| 	keyword -prefix |  | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
| @@ -14,7 +13,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 -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 -vserver | ||||||
| } | } | ||||||
|  |  | ||||||
| mount_sys() | mount_sys() | ||||||
| @@ -77,6 +77,12 @@ mount_cgroups() | |||||||
| 	yesno ${rc_cgroups:-YES} && [ -e /proc/cgroups ] && \ | 	yesno ${rc_cgroups:-YES} && [ -e /proc/cgroups ] && \ | ||||||
| 		mountinfo -q /sys/fs/cgroup || return 0 | 		mountinfo -q /sys/fs/cgroup || return 0 | ||||||
|  |  | ||||||
|  | 	local agent="@LIBEXECDIR@/sh/cgroup-release-agent.sh" | ||||||
|  | 	mkdir /sys/fs/cgroup/openrc | ||||||
|  | 	mount -n -t cgroup \ | ||||||
|  | 		-o none,nodev,noexec,nosuid,name=openrc,release_agent="$agent" \ | ||||||
|  | 		openrc /sys/fs/cgroup/openrc | ||||||
|  | 	echo 1 > /sys/fs/cgroup/openrc/notify_on_release | ||||||
| 	while read name hier groups enabled rest; do | 	while read name hier groups enabled rest; do | ||||||
| 		case "${enabled}" in | 		case "${enabled}" in | ||||||
| 			1)	mkdir /sys/fs/cgroup/${name} | 			1)	mkdir /sys/fs/cgroup/${name} | ||||||
|   | |||||||
| @@ -16,5 +16,4 @@ depend() | |||||||
| 	use net newsyslog | 	use net newsyslog | ||||||
| 	need localmount | 	need localmount | ||||||
| 	after bootmisc | 	after bootmisc | ||||||
| 	keyword -prefix |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -9,8 +9,8 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}} | |||||||
|  |  | ||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	keyword -openvz -prefix -uml -vserver -xenu | 	keyword -lxc -openvz -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 | ||||||
|   | |||||||
| @@ -5,7 +5,6 @@ | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	after fsck | 	after fsck | ||||||
| 	keyword -prefix |  | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ description="Initializes the random number generator." | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	need localmount | 	need localmount | ||||||
| 	keyword -jail -openvz -prefix | 	keyword -jail -openvz | ||||||
| } | } | ||||||
|  |  | ||||||
| save_seed() | save_seed() | ||||||
|   | |||||||
| @@ -5,7 +5,6 @@ | |||||||
| depend() | depend() | ||||||
| { | { | ||||||
| 	need localmount | 	need localmount | ||||||
| 	keyword -prefix |  | ||||||
| } | } | ||||||
|  |  | ||||||
| start() | start() | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ install: | |||||||
| 	for man in ${MAN3}; do \ | 	for man in ${MAN3}; do \ | ||||||
| 		${INSTALL} -m ${MANMODE} "$$man" ${DESTDIR}/${MANDIR}/man3 || exit $$?; \ | 		${INSTALL} -m ${MANMODE} "$$man" ${DESTDIR}/${MANDIR}/man3 || exit $$?; \ | ||||||
| 		${MAKE_LINKS} \ | 		${MAKE_LINKS} \ | ||||||
| 	done	 | 	done | ||||||
| 	${INSTALL} -d ${DESTDIR}/${MANDIR}/man8 | 	${INSTALL} -d ${DESTDIR}/${MANDIR}/man8 | ||||||
| 	for man in ${MAN8}; do \ | 	for man in ${MAN8}; do \ | ||||||
| 		${INSTALL} -m ${MANMODE} "$$man" ${DESTDIR}/${MANDIR}/man8 || exit $$?; \ | 		${INSTALL} -m ${MANMODE} "$$man" ${DESTDIR}/${MANDIR}/man8 || exit $$?; \ | ||||||
|   | |||||||
| @@ -115,7 +115,7 @@ to true. | |||||||
| These functions are designed to output a whole line, so they also | These functions are designed to output a whole line, so they also | ||||||
| append a newline to the string. To stop this behaviour, you can use the | append a newline to the string. To stop this behaviour, you can use the | ||||||
| functions | functions | ||||||
| .Fn einfon ,  | .Fn einfon , | ||||||
| .Fn ewarnn , | .Fn ewarnn , | ||||||
| .Fn eerrorn , | .Fn eerrorn , | ||||||
| .Fn einfovn , | .Fn einfovn , | ||||||
| @@ -149,7 +149,7 @@ does the same as | |||||||
| .Fn eend | .Fn eend | ||||||
| but prints | but prints | ||||||
| .Fa msg | .Fa msg | ||||||
| instead of ok or !! in the color  | instead of ok or !! in the color | ||||||
| .Fa color | .Fa color | ||||||
| at the column | at the column | ||||||
| .Fa col . | .Fa col . | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ | |||||||
| .Os OpenRC | .Os OpenRC | ||||||
| .Sh NAME | .Sh NAME | ||||||
| .Nm rc-service | .Nm rc-service | ||||||
| .Nd locate and run an OpenRC service with the given arguments  | .Nd locate and run an OpenRC service with the given arguments | ||||||
| .Sh SYNOPSIS | .Sh SYNOPSIS | ||||||
| .Nm | .Nm | ||||||
| .Op Fl i , -ifexists | .Op Fl i , -ifexists | ||||||
| @@ -41,7 +41,7 @@ | |||||||
| .Fl r , -resolve | .Fl r , -resolve | ||||||
| .Ar service | .Ar service | ||||||
| .Sh DESCRIPTION | .Sh DESCRIPTION | ||||||
| Service scripts could be in different places on different systems.  | Service scripts could be in different places on different systems. | ||||||
| .Nm | .Nm | ||||||
| locates the specified service and runs it with the given arguments. | locates the specified service and runs it with the given arguments. | ||||||
| If | If | ||||||
|   | |||||||
| @@ -33,8 +33,8 @@ | |||||||
| .Op Ar runlevel | .Op Ar runlevel | ||||||
| .Sh DESCRIPTION | .Sh DESCRIPTION | ||||||
| .Nm | .Nm | ||||||
| gathers and displays information about the status of services  | gathers and displays information about the status of services | ||||||
| in different runlevels.  The default behavior is to show information  | in different runlevels.  The default behavior is to show information | ||||||
| about the current runlevel and any unassigned services that are not stopped, | about the current runlevel and any unassigned services that are not stopped, | ||||||
| but any runlevel can be quickly examined. | but any runlevel can be quickly examined. | ||||||
| .Pp | .Pp | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ | |||||||
| .Os OpenRC | .Os OpenRC | ||||||
| .Sh NAME | .Sh NAME | ||||||
| .Nm rc-update | .Nm rc-update | ||||||
| .Nd add and remove services to and from a runlevel  | .Nd add and remove services to and from a runlevel | ||||||
| .Sh SYNOPSIS | .Sh SYNOPSIS | ||||||
| .Nm | .Nm | ||||||
| .Op Fl s , -stack | .Op Fl s , -stack | ||||||
| @@ -44,7 +44,7 @@ | |||||||
| .Ar show | .Ar show | ||||||
| .Op Ar runlevel ... | .Op Ar runlevel ... | ||||||
| .Sh DESCRIPTION | .Sh DESCRIPTION | ||||||
| OpenRC uses named runlevels.  Rather than editing some obscure  | OpenRC uses named runlevels.  Rather than editing some obscure | ||||||
| file or managing a directory of symlinks, | file or managing a directory of symlinks, | ||||||
| .Nm | .Nm | ||||||
| exists to quickly add or delete services to and from from different runlevels. | exists to quickly add or delete services to and from from different runlevels. | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ | |||||||
| .Sh LIBRARY | .Sh LIBRARY | ||||||
| Run Command library (librc, -lrc) | Run Command library (librc, -lrc) | ||||||
| .Sh SYNOPSIS | .Sh SYNOPSIS | ||||||
| .In rc.h  | .In rc.h | ||||||
| .Ft bool Fn rc_deptree_update void | .Ft bool Fn rc_deptree_update void | ||||||
| .Ft bool Fn rc_deptree_update_needed void | .Ft bool Fn rc_deptree_update_needed void | ||||||
| .Ft RC_DEPTREE Fn rc_deptree_load void | .Ft RC_DEPTREE Fn rc_deptree_load void | ||||||
| @@ -77,7 +77,7 @@ loads the deptree and returns a pointer to it which needs to be freed by | |||||||
| when done. | when done. | ||||||
| .Pp | .Pp | ||||||
| .Fn rc_deptree_depend , | .Fn rc_deptree_depend , | ||||||
| .Fn rc_deptree_depends  | .Fn rc_deptree_depends | ||||||
| and | and | ||||||
| .Fn rc_deptree_order | .Fn rc_deptree_order | ||||||
| return a list of services from the | return a list of services from the | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ | |||||||
| .Sh LIBRARY | .Sh LIBRARY | ||||||
| Run Command library (librc, -lrc) | Run Command library (librc, -lrc) | ||||||
| .Sh SYNOPSIS | .Sh SYNOPSIS | ||||||
| .In rc.h  | .In rc.h | ||||||
| .Ft "char *" Fn rc_runlevel_get void | .Ft "char *" Fn rc_runlevel_get void | ||||||
| .Ft bool Fn rc_runlevel_exists | .Ft bool Fn rc_runlevel_exists | ||||||
| .Ft "RC_STRINGLIST *" Fn rc_runlevel_list void | .Ft "RC_STRINGLIST *" Fn rc_runlevel_list void | ||||||
|   | |||||||
| @@ -37,7 +37,7 @@ | |||||||
| .Sh LIBRARY | .Sh LIBRARY | ||||||
| Run Command library (librc, -lrc) | Run Command library (librc, -lrc) | ||||||
| .Sh SYNOPSIS | .Sh SYNOPSIS | ||||||
| .In rc.h  | .In rc.h | ||||||
| .Ft bool Fn rc_service_add "const char *runlevel" "const char *service" | .Ft bool Fn rc_service_add "const char *runlevel" "const char *service" | ||||||
| .Ft bool Fn rc_service_delete "const char *runlevel" "const char *service" | .Ft bool Fn rc_service_delete "const char *runlevel" "const char *service" | ||||||
| .Ft bool Fo rc_service_daemon_set | .Ft bool Fo rc_service_daemon_set | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ | |||||||
| Run Command library (librc, -lrc) | Run Command library (librc, -lrc) | ||||||
| .Sh SYNOPSIS | .Sh SYNOPSIS | ||||||
| .In rc.h | .In rc.h | ||||||
| .Ft "RC_STRINGLIST *" Fn rc_stringlist_new void  | .Ft "RC_STRINGLIST *" Fn rc_stringlist_new void | ||||||
| .Ft "RC_STRING *" Fn rc_stringlist_add "RC_STRINGLIST *list" "const char *item" | .Ft "RC_STRING *" Fn rc_stringlist_add "RC_STRINGLIST *list" "const char *item" | ||||||
| .Ft "RC_STRING *" Fn rc_stringlist_addu "RC_STRINGLIST *list" "const char *item" | .Ft "RC_STRING *" Fn rc_stringlist_addu "RC_STRINGLIST *list" "const char *item" | ||||||
| .Ft bool Fn rc_stringlist_delete RC_STRINGLIST "const char *item" | .Ft bool Fn rc_stringlist_delete RC_STRINGLIST "const char *item" | ||||||
|   | |||||||
| @@ -25,13 +25,14 @@ | |||||||
| .Dt RUNSCRIPT 8 SMM | .Dt RUNSCRIPT 8 SMM | ||||||
| .Os OpenRC | .Os OpenRC | ||||||
| .Sh NAME | .Sh NAME | ||||||
| .Nm runscript  | .Nm runscript | ||||||
| .Nd a means of hooking shell commands into a service | .Nd a means of hooking shell commands into a service | ||||||
| .Sh SYNOPSIS | .Sh SYNOPSIS | ||||||
| .Nm | .Nm | ||||||
| .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 | ||||||
| @@ -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. | ||||||
| @@ -108,6 +112,11 @@ Daemon to start or stop via | |||||||
| 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 | ||||||
| @@ -115,6 +124,10 @@ Display name used for the above defined command. | |||||||
| .It Ar retry | .It Ar retry | ||||||
| Retry schedule to use when stopping the daemon. It can either be a | Retry schedule to use when stopping the daemon. It can either be a | ||||||
| timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5). | 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 | ||||||
| @@ -127,7 +140,7 @@ Here is a list of the functions you can use in a | |||||||
| .Ic depend | .Ic depend | ||||||
| function. You simply pass the names of the services to it to add to that | function. You simply pass the names of the services to it to add to that | ||||||
| dependency type, or prefix it with ! to remove it. | dependency type, or prefix it with ! to remove it. | ||||||
| .Bl -tag -width "RC_DEFAULTLEVEL"  | .Bl -tag -width "RC_DEFAULTLEVEL" | ||||||
| .It Ic need | .It Ic need | ||||||
| The service will refuse to start until needed services have started and it | The service will refuse to start until needed services have started and it | ||||||
| will refuse to stop until any services that need it have stopped. | will refuse to stop until any services that need it have stopped. | ||||||
| @@ -159,16 +172,14 @@ Other services should wait indefinitely for this service to start. Use | |||||||
| this keyword if your service may take longer than 60 seconds to start. | this keyword if your service may take longer than 60 seconds to start. | ||||||
| .It Dv -jail | .It Dv -jail | ||||||
| When in a jail, exclude this service from any dependencies. The service can | When in a jail, exclude this service from any dependencies. The service can | ||||||
| still be run directly. Set via  | still be run directly. Set via | ||||||
| .Ic rc_sys  | .Ic rc_sys | ||||||
| in  | in | ||||||
| .Pa /etc/rc.conf | .Pa /etc/rc.conf | ||||||
| .It Dv -lxc | .It Dv -lxc | ||||||
| Same as -jail, but for Linux Resource Containers (LXC). | Same as -jail, but for Linux Resource Containers (LXC). | ||||||
| .It Dv -openvz | .It Dv -openvz | ||||||
| Same as -jail, but for OpenVZ systems. | Same as -jail, but for OpenVZ systems. | ||||||
| .It Dv -prefix |  | ||||||
| Same as -jail, but for Prefix systems. |  | ||||||
| .It Dv -uml | .It Dv -uml | ||||||
| Same as -jail, but for UML systems. | Same as -jail, but for UML systems. | ||||||
| .It Dv -vserver | .It Dv -vserver | ||||||
| @@ -307,6 +318,11 @@ Mark the service as inactive. | |||||||
| .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 | ||||||
| @@ -315,11 +331,18 @@ matches YES, TRUE, ON or 1 regardless of case then we return 0, otherwise 1. | |||||||
| .Sh ENVIRONMENT | .Sh ENVIRONMENT | ||||||
| .Nm | .Nm | ||||||
| sets the following environment variables for use in the service scripts: | sets the following environment variables for use in the service scripts: | ||||||
| .Bl -tag -width "RC_DEFAULTLEVEL"  | .Bl -tag -width "RC_DEFAULTLEVEL" | ||||||
| .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 | ||||||
| @@ -365,9 +388,8 @@ rc_provide_tap1="!net" | |||||||
| # To put in in /etc/rc.conf you would do it like this | # To put in in /etc/rc.conf you would do it like this | ||||||
| rc_net_tap1_provide="!net" | 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. | ||||||
| # users testing OpenRC. | rc_keyword="-keyword" | ||||||
| rc_keyword="!noprefix" |  | ||||||
| .Ed | .Ed | ||||||
| .Sh EXAMPLES | .Sh EXAMPLES | ||||||
| .Pp | .Pp | ||||||
| @@ -410,7 +432,7 @@ depend() | |||||||
| 	_need=`service_get_value need` | 	_need=`service_get_value need` | ||||||
|     else |     else | ||||||
| 	if _need_dbus; then | 	if _need_dbus; then | ||||||
| 	   _need="${_need} dbus"  | 	   _need="${_need} dbus" | ||||||
| 	fi | 	fi | ||||||
|     fi |     fi | ||||||
|     need ${_need} |     need ${_need} | ||||||
|   | |||||||
| @@ -58,7 +58,7 @@ is used in an OpenRC service, then OpenRC can in turn check to see if the | |||||||
| daemon is still running. If not, then the service is marked as crashed. | daemon is still running. If not, then the service is marked as crashed. | ||||||
| .Pp | .Pp | ||||||
| Here are the options to specify the daemon and how it should start or stop: | Here are the options to specify the daemon and how it should start or stop: | ||||||
| .Bl -tag -width indent  | .Bl -tag -width indent | ||||||
| .It Fl x , -exec Ar daemon | .It Fl x , -exec Ar daemon | ||||||
| The | The | ||||||
| .Ar daemon | .Ar daemon | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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 | ||||||
| @@ -53,6 +53,6 @@ check test:: | |||||||
| # so we ensure that it has a bogus argument | # so we ensure that it has a bogus argument | ||||||
| CLEANFILES+=	${OBJS} | CLEANFILES+=	${OBJS} | ||||||
| clean: | clean: | ||||||
| 	@if test -n "${CLEANFILES}"; then echo "rm -f ${CLEANFILES}"; rm -f ${CLEANFILES}; fi  | 	@if test -n "${CLEANFILES}"; then echo "rm -f ${CLEANFILES}"; rm -f ${CLEANFILES}; fi | ||||||
|  |  | ||||||
| include ${MK}/gitignore.mk | include ${MK}/gitignore.mk | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
| # Released under the 2-clause BSD license. | # Released under the 2-clause BSD license. | ||||||
|  |  | ||||||
| _+_ ?= + | _+_ ?= + | ||||||
| ECHODIR ?= echo  | ECHODIR ?= echo | ||||||
| _SUBDIR = @${_+_}for x in ${SUBDIR}; do \ | _SUBDIR = @${_+_}for x in ${SUBDIR}; do \ | ||||||
| 	if test -d $$x; then \ | 	if test -d $$x; then \ | ||||||
| 	${ECHODIR} "===> ${DIRPRFX}$$x (${@:realinstall=install})"; \ | 	${ECHODIR} "===> ${DIRPRFX}$$x (${@:realinstall=install})"; \ | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ RANLIB?=		ranlib | |||||||
| SED?=			sed | SED?=			sed | ||||||
| SH=			/bin/sh | SH=			/bin/sh | ||||||
|  |  | ||||||
| PREFIX?=	 | PREFIX?= | ||||||
| _UPREFIX_SH=		case "${PREFIX}" in "") echo /usr;; *) echo "${PREFIX}";; esac | _UPREFIX_SH=		case "${PREFIX}" in "") echo /usr;; *) echo "${PREFIX}";; esac | ||||||
| _UPREFIX:=		$(shell ${_UPREFIX_SH}) | _UPREFIX:=		$(shell ${_UPREFIX_SH}) | ||||||
| UPREFIX=		${_UPREFIX} | UPREFIX=		${_UPREFIX} | ||||||
| @@ -22,6 +22,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 | ||||||
| @@ -43,6 +44,6 @@ MANDIR?=		${MANPREFIX}/man | |||||||
| MANMODE?=		0444 | MANMODE?=		0444 | ||||||
|  |  | ||||||
| DOCDIR?=		${UPREFIX}/share/doc | DOCDIR?=		${UPREFIX}/share/doc | ||||||
| DOCMODE?=		0644	 | DOCMODE?=		0644 | ||||||
|  |  | ||||||
| CONFMODE?=		0644 | CONFMODE?=		0644 | ||||||
|   | |||||||
| @@ -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 | ||||||
|  |  | ||||||
| SRCS-NetBSD= | SRCS-NetBSD= | ||||||
| INC-NetBSD=	ifwatchd.sh | INC-NetBSD=	ifwatchd.sh | ||||||
|   | |||||||
| @@ -105,7 +105,7 @@ bonding_pre_start() | |||||||
| 		local oiface | 		local oiface | ||||||
| 		oiface=$IFACE | 		oiface=$IFACE | ||||||
| 		if [ -n "${primary}" ]; then | 		if [ -n "${primary}" ]; then | ||||||
| 			IFACE=$primary  | 			IFACE=$primary | ||||||
| 			_down | 			_down | ||||||
| 			IFACE=$oiface | 			IFACE=$oiface | ||||||
| 			echo "+${primary}" >$sys_bonding_path/slaves | 			echo "+${primary}" >$sys_bonding_path/slaves | ||||||
| @@ -114,7 +114,7 @@ bonding_pre_start() | |||||||
| 		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  | 				IFACE=$s | ||||||
| 				_down | 				_down | ||||||
| 				IFACE=$oiface | 				IFACE=$oiface | ||||||
| 				echo "+${s}" >$sys_bonding_path/slaves | 				echo "+${s}" >$sys_bonding_path/slaves | ||||||
|   | |||||||
| @@ -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() | ||||||
|   | |||||||
							
								
								
									
										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 | ||||||
|  | } | ||||||
| @@ -20,24 +20,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() | ||||||
|   | |||||||
| @@ -66,7 +66,7 @@ udhcpc_start() | |||||||
| 			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 | ||||||
| 			;; | 			;; | ||||||
|   | |||||||
| @@ -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}} | ||||||
| @@ -41,34 +41,24 @@ install: | |||||||
| 	if ! test -d "${SYSINITDIR}"; then \ | 	if ! test -d "${SYSINITDIR}"; then \ | ||||||
| 		${INSTALL} -d ${SYSINITDIR} || exit $$?; \ | 		${INSTALL} -d ${SYSINITDIR} || exit $$?; \ | ||||||
| 		for x in ${SYSINIT}; do \ | 		for x in ${SYSINIT}; do \ | ||||||
| 			if test -n "${PREFIX}"; then \ | 			ln -snf ${PREFIX}/etc/init.d/"$$x" ${SYSINITDIR}/"$$x" || exit $$?; \ | ||||||
| 				grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \ | 		done \ | ||||||
| 			fi; \ |  | ||||||
| 			ln -snf ${PREFIX}/etc/init.d/"$$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 \ |  | ||||||
| 				grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \ |  | ||||||
| 			fi; \ |  | ||||||
| 			ln -snf ${PREFIX}/etc/init.d/"$$x" ${BOOTDIR}/"$$x" || exit $$?; \ | 			ln -snf ${PREFIX}/etc/init.d/"$$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 \ | 			ln -snf ${PREFIX}/etc/init.d/"$$x" ${DEFAULTDIR}/"$$x" || exit $$?; \ | ||||||
| 				grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \ | 		done \ | ||||||
| 			fi; \ |  | ||||||
| 			ln -snf ${PREFIX}/etc/init.d/"$$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 \ |  | ||||||
| 				grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \ |  | ||||||
| 			fi; \ |  | ||||||
| 			ln -snf ${PREFIX}/etc/init.d/"$$x" ${SHUTDOWNDIR}/"$$x" || exit $$?; done \ | 			ln -snf ${PREFIX}/etc/init.d/"$$x" ${SHUTDOWNDIR}/"$$x" || exit $$?; done \ | ||||||
| 	fi | 	fi | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										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 | ||||||
|   | |||||||
| @@ -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,32 @@ 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 | if [ ! -d /run ]; then | ||||||
| 	if mountinfo -q /run; then | 	eerror "The /run directory does not exist. Unable to continue." | ||||||
| 		einfo "/run is already mounted, skipping" | 	return 1 | ||||||
| 	else |  | ||||||
| 		ebegin "Mounting /run" |  | ||||||
| 		if ! fstabinfo --mount /run; then |  | ||||||
| 			mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /run |  | ||||||
| 		fi |  | ||||||
| 		eend $? |  | ||||||
| 	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 | ||||||
|  |  | ||||||
|  | if mountinfo -q /run; then | ||||||
|  | 	einfo "/run is already mounted, skipping" | ||||||
|  | else | ||||||
|  | 	ebegin "Mounting /run" | ||||||
|  | 	rc=0 | ||||||
|  | 	if ! fstabinfo --mount /run; then | ||||||
|  | 		mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /run | ||||||
|  | 		rc=$? | ||||||
|  | 	fi | ||||||
|  | 	if [ $rc != 0 ]; then | ||||||
|  | 		eerror "Unable to mount tmpfs on /run." | ||||||
|  | 		eerror "Can't continue." | ||||||
|  | 		exit 1 | ||||||
|  | 	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 +71,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 | ||||||
|   | |||||||
							
								
								
									
										49
									
								
								sh/migrate-to-run.sh.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								sh/migrate-to-run.sh.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | |||||||
|  | #!@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 "@PREFIX@/run" ]; then | ||||||
|  | 	eerror "'@PREFIX@/run' is not a directory." | ||||||
|  | 	eerror "This means the OpenRC dependency data cannot be migrated." | ||||||
|  | 	eerror "Please create the '@PREFIX@/run' directory and reboot the system." | ||||||
|  | 	exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | if ! mountinfo -q -f tmpfs "@PREFIX@/run"; then | ||||||
|  | 	for x in "@PREFIX@/run/."* "@PREFIX@/run/"*; do | ||||||
|  | 		case "$x" in | ||||||
|  | 			"@PREFIX@/run/."|"@PREFIX@/run/..") | ||||||
|  | 				continue | ||||||
|  | 				;; | ||||||
|  | 		esac | ||||||
|  | 		if [ -e "$x" ]; then | ||||||
|  | 				eerror "Your '@PREFIX@/run' directory contains files." | ||||||
|  | 				eerror "Please reboot the system." | ||||||
|  | 				exit 1 | ||||||
|  | 		fi | ||||||
|  | 	done | ||||||
|  |  | ||||||
|  | 	mount -t tmpfs -o mode=0755,nosuid,nodev \ | ||||||
|  | 		tmpfs "@PREFIX@/run" 2> /dev/null | ||||||
|  | 	if [ $? != 0 ]; then | ||||||
|  | 		eerror "Unable to mount a tmpfs on '@PREFIX@/run'." | ||||||
|  | 		eerror "This means the OpenRC dependency data cannot be migrated." | ||||||
|  | 		eerror "Please create the '@PREFIX@/run' directory and reboot the system." | ||||||
|  | 		exit 1 | ||||||
|  | 	fi | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | rm -rf "@PREFIX@/run/openrc" | ||||||
|  | cp -a "@LIBEXECDIR@/init.d" "@PREFIX@/run/openrc" | ||||||
|  | rc-update -u | ||||||
|  | rm -rf "@LIBEXECDIR@/init.d" | ||||||
|  | umount "@LIBEXECDIR@/init.d" | ||||||
|  | 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,7 +32,7 @@ sourcex() | |||||||
| 	fi | 	fi | ||||||
| } | } | ||||||
|  |  | ||||||
| sourcex "@SYSCONFDIR@/init.d/functions.sh" | sourcex "@LIBEXECDIR@/sh/functions.sh" | ||||||
| sourcex "@LIBEXECDIR@/sh/rc-functions.sh" | sourcex "@LIBEXECDIR@/sh/rc-functions.sh" | ||||||
|  |  | ||||||
| # Support LiveCD foo | # Support LiveCD foo | ||||||
| @@ -24,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 | ||||||
| @@ -124,7 +128,11 @@ 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 | ||||||
| @@ -185,6 +193,14 @@ 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} | ||||||
|  |  | ||||||
| @@ -217,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 | ||||||
| @@ -244,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 | ||||||
| @@ -254,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 $? | ||||||
|   | |||||||
							
								
								
									
										288
									
								
								sh/tmpfiles.sh.in
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										288
									
								
								sh/tmpfiles.sh.in
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,288 @@ | |||||||
|  | #!/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 | ||||||
|  | # | ||||||
|  |  | ||||||
|  | warninvalid() { | ||||||
|  | 	printf "tmpfiles: ignoring invalid entry on line %d of \`%s'\n" "$LINENUM" "$FILE" | ||||||
|  | 	error=$(( error+1 )) | ||||||
|  | } >&2 | ||||||
|  |  | ||||||
|  | relabel() { | ||||||
|  | 	local path | ||||||
|  | 	local paths=$1 mode=$2 uid=$3 gid=$4 | ||||||
|  |  | ||||||
|  | 	for path in ${paths}; do | ||||||
|  | 		if [ -e "$path" ]; then | ||||||
|  | 			[ $uid != '-' ] && chown $CHOPTS "$uid" "$path" | ||||||
|  | 			[ $gid != '-' ] && chgrp $CHOPTS "$gid" "$path" | ||||||
|  | 			[ $mode != '-' ] && chmod $CHOPTS "$mode" "$path" | ||||||
|  | 			[ -x /sbin/restorecon ] && 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" ] && 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" ] && 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 | ||||||
|  | 		install -m"$mode" -o"$uid" -g"$gid" /dev/null "$path" | ||||||
|  | 		[ -n "$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 | ||||||
|  |  | ||||||
|  | 	install -m"$mode" -o"$uid" -g"$gid" /dev/null "$path" | ||||||
|  | 	[ -n "$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 | ||||||
|  | 		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 | ||||||
|  | 		find "$path" -mindepth 1 -maxdepth 1 -xdev -exec rm -rf {} + | ||||||
|  | 	fi | ||||||
|  |  | ||||||
|  | 	if [ $CREATE -gt 0 ]; then | ||||||
|  | 		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" ] && 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 | ||||||
|  | 		mkfifo -m$mode "$path" | ||||||
|  | 		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 | ||||||
|  | 			rm -f "$path" | ||||||
|  | 		elif [ -d "$path" ]; then | ||||||
|  | 			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" ] && 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 | ||||||
|  | 	[ -f "$path" ] && echo "$arg" >>"$path" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | _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 $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 [ $(( CREATE + REMOVE )) -ne 1 ] ; 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 line; do | ||||||
|  | 		LINENUM=$(( LINENUM+1 )) | ||||||
|  |  | ||||||
|  | 		# This will skip over comments and empty lines | ||||||
|  | 		set -- $line | ||||||
|  |  | ||||||
|  | 		# Unless we have both command and path, skip this line. | ||||||
|  | 		if [ -z "$1" -o -z "$2" ]; then | ||||||
|  | 			continue | ||||||
|  | 		fi | ||||||
|  |  | ||||||
|  | 		# whine about invalid entries | ||||||
|  | 		case $1 in | ||||||
|  | 			f|F|w|d|D|p|L|c|b|x|r|R|z|Z) ;; | ||||||
|  | 			*) warninvalid ; continue ;; | ||||||
|  | 		esac | ||||||
|  |  | ||||||
|  | 		cmd=$1 | ||||||
|  | 		path=$2 | ||||||
|  |  | ||||||
|  | 		# fall back on defaults when parameters are passed as '-' | ||||||
|  | 		if [ "$3" = '-' -o "$3" = '' ]; then | ||||||
|  | 			case ${1} in | ||||||
|  | 				p|f|F) mode=0644 ;; | ||||||
|  | 				d|D) mode=0755 ;; | ||||||
|  | 				z|Z|x|r|R|L) ;; | ||||||
|  | 			esac | ||||||
|  | 		else | ||||||
|  | 			mode=$3 | ||||||
|  | 		fi | ||||||
|  | 		uid=$4 | ||||||
|  | 		gid=$5 | ||||||
|  | 		age=$6 | ||||||
|  | 		arg=$7 | ||||||
|  |  | ||||||
|  | 		[ ${4} = '-' ] && uid=0 | ||||||
|  | 		[ ${5} = '-' ] && gid=0 | ||||||
|  | 		[ ${6} = '-' ] && age=0 | ||||||
|  | 		[ ${7} = '-' ] && arg='' | ||||||
|  | 		set -- "$path" "$mode" "$uid" "$gid" "$age" "$arg" | ||||||
|  |  | ||||||
|  | 		[ "$VERBOSE" -eq "1" ] && echo _$cmd "$@" | ||||||
|  | 		if [ "${DRYRUN}" -eq "0" ]; then | ||||||
|  | 			_$cmd "$@" | ||||||
|  | 			rc=$? | ||||||
|  | 			[ $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 ""; | ||||||
|   | |||||||
| @@ -687,27 +687,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,8 +715,7 @@ 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; |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	rc_stringlist_free(config); | 	rc_stringlist_free(config); | ||||||
|   | |||||||
| @@ -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); | ||||||
|   | |||||||
| @@ -216,7 +216,6 @@ rc_sys_v2(void) | |||||||
| 		} | 		} | ||||||
| 		/* Now do detection */ | 		/* Now do detection */ | ||||||
| 		__STRING_SWITCH(systype) | 		__STRING_SWITCH(systype) | ||||||
| 		__STRING_CASE(RC_SYS_PREFIX)	{ return RC_SYS_PREFIX; } |  | ||||||
| #ifdef __FreeBSD__ | #ifdef __FreeBSD__ | ||||||
| 		__STRING_CASE(RC_SYS_JAIL) { return RC_SYS_JAIL; } | 		__STRING_CASE(RC_SYS_JAIL) { return RC_SYS_JAIL; } | ||||||
| #endif /* __FreeBSD__ */ | #endif /* __FreeBSD__ */ | ||||||
| @@ -246,10 +245,6 @@ librc_hidden_def(rc_sys_v2) | |||||||
| const char * | const char * | ||||||
| rc_sys_v1(void) | rc_sys_v1(void) | ||||||
| { | { | ||||||
| #ifdef PREFIX |  | ||||||
| 	return RC_SYS_PREFIX; |  | ||||||
| #else |  | ||||||
|  |  | ||||||
| #ifdef __FreeBSD__ | #ifdef __FreeBSD__ | ||||||
| 	int jailed = 0; | 	int jailed = 0; | ||||||
| 	size_t len = sizeof(jailed); | 	size_t len = sizeof(jailed); | ||||||
| @@ -286,7 +281,6 @@ rc_sys_v1(void) | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	return NULL; | 	return NULL; | ||||||
| #endif /* PREFIX */ |  | ||||||
| } | } | ||||||
| librc_hidden_def(rc_sys_v1) | librc_hidden_def(rc_sys_v1) | ||||||
|  |  | ||||||
| @@ -492,7 +486,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) | ||||||
|   | |||||||
| @@ -36,7 +36,11 @@ __BEGIN_DECLS | |||||||
| #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@" | ||||||
|  | #ifdef __linux__ | ||||||
|  | #define RC_SVCDIR               "@PREFIX@/run/openrc" | ||||||
|  | #else | ||||||
| #define RC_SVCDIR               RC_LIBEXECDIR "/init.d" | #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" | ||||||
| @@ -276,7 +280,6 @@ bool rc_service_daemons_crashed(const char *); | |||||||
| #define RC_SYS_JAIL    "JAIL" | #define RC_SYS_JAIL    "JAIL" | ||||||
| #define RC_SYS_OPENVZ  "OPENVZ" | #define RC_SYS_OPENVZ  "OPENVZ" | ||||||
| #define RC_SYS_LXC     "LXC" | #define RC_SYS_LXC     "LXC" | ||||||
| #define RC_SYS_PREFIX  "PREFIX" |  | ||||||
| #define RC_SYS_UML     "UML" | #define RC_SYS_UML     "UML" | ||||||
| #define RC_SYS_VSERVER "VSERVER" | #define RC_SYS_VSERVER "VSERVER" | ||||||
| #define RC_SYS_XEN0    "XEN0" | #define RC_SYS_XEN0    "XEN0" | ||||||
| @@ -361,6 +364,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; | ||||||
|   | |||||||
| @@ -32,7 +32,6 @@ | |||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #include <sys/stat.h> | #include <sys/stat.h> | ||||||
|  |  | ||||||
| #include <features.h> |  | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| #include <getopt.h> | #include <getopt.h> | ||||||
| @@ -56,24 +55,36 @@ typedef enum { | |||||||
|  |  | ||||||
| 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, inode_t type, bool trunc) | do_check(char *path, uid_t uid, gid_t gid, mode_t mode, inode_t type, bool trunc) | ||||||
| { | { | ||||||
| 	struct stat st; | 	struct stat st; | ||||||
| 	int fd, flags; | 	int fd, flags; | ||||||
|  | 	int r; | ||||||
|  | 	int u; | ||||||
|  |  | ||||||
| 	if (stat(path, &st)) { | 	if (stat(path, &st) || trunc) { | ||||||
| 		if (type == inode_file) { | 		if (type == inode_file) { | ||||||
| 			einfo("%s: creating file", path); | 			einfo("%s: creating file", path); | ||||||
| 			if (!mode) /* 664 */ | 			if (!mode) /* 664 */ | ||||||
| 				mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH; | 				mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH; | ||||||
| 			flags = O_CREAT|O_NDELAY|O_WRONLY|O_NOCTTY; | 			flags = O_CREAT|O_NDELAY|O_WRONLY|O_NOCTTY; | ||||||
| #ifdef __USE_XOPEN2K8 | #ifdef O_CLOEXEC | ||||||
| 			flags |= O_CLOEXEC|O_NOFOLLOW; | 			flags |= O_CLOEXEC; | ||||||
|  | #endif | ||||||
|  | #ifdef O_NOFOLLOW | ||||||
|  | 			flags |= O_NOFOLLOW; | ||||||
| #endif | #endif | ||||||
| 			if (trunc) | 			if (trunc) | ||||||
| 				flags |= O_TRUNC; | 				flags |= O_TRUNC; | ||||||
| 			if ((fd = open(path, flags, mode)) == -1) { | 			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; | ||||||
| 			} | 			} | ||||||
| @@ -82,7 +93,11 @@ do_check(char *path, uid_t uid, gid_t gid, mode_t mode, inode_t type, bool trunc | |||||||
| 			einfo("%s: creating directory", path); | 			einfo("%s: creating directory", path); | ||||||
| 			if (!mode) /* 775 */ | 			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) == -1) { | 			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; | ||||||
| @@ -92,7 +107,10 @@ do_check(char *path, uid_t uid, gid_t gid, mode_t mode, inode_t type, bool trunc | |||||||
| 			einfo("%s: creating fifo", path); | 			einfo("%s: creating fifo", path); | ||||||
| 			if (!mode) /* 600 */ | 			if (!mode) /* 600 */ | ||||||
| 				mode = S_IRUSR | S_IWUSR; | 				mode = S_IRUSR | S_IWUSR; | ||||||
| 			if (mkfifo(path, mode) == -1) { | 			u = umask(0); | ||||||
|  | 			r = mkfifo(path, mode); | ||||||
|  | 			umask(u); | ||||||
|  | 			if (r == -1 && errno != EEXIST) { | ||||||
| 				eerror("%s: mkfifo: %s", applet, | 				eerror("%s: mkfifo: %s", applet, | ||||||
| 				    strerror (errno)); | 				    strerror (errno)); | ||||||
| 				return -1; | 				return -1; | ||||||
| @@ -167,8 +185,8 @@ 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 "dDfFpm: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'}, | 	{ "directory-truncate", 0, NULL, 'D'}, | ||||||
| @@ -177,6 +195,7 @@ static const struct option longopts[] = { | |||||||
| 	{ "pipe",               0, NULL, 'p'}, | 	{ "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[] = { | ||||||
| @@ -187,6 +206,7 @@ static const char * const longopts_help[] = { | |||||||
| 	"Create a named pipe (FIFO) if not exists", | 	"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" | ||||||
| @@ -231,6 +251,11 @@ checkpath(int argc, char **argv) | |||||||
| 				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 | ||||||
| 		} | 		} | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user