Compare commits
	
		
			88 Commits
		
	
	
		
			openrc-0.6
			...
			openrc-0.8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | b875abd1a5 | ||
|   | c020454c84 | ||
|   | 60d8d4f5bb | ||
|   | c9912942f0 | ||
|   | 9f5eb03e5e | ||
|   | d7e48fe643 | ||
|   | 87302487d2 | ||
|   | 0f3d6a01c7 | ||
|   | 3fca6bd027 | ||
|   | 202fa20cbc | ||
|   | dfd42d1393 | ||
|   | 22918ccf51 | ||
|   | 20480048ca | ||
|   | 683a21b0a0 | ||
|   | b512d0db98 | ||
|   | 73d1a8698e | ||
|   | bae0a693a9 | ||
|   | 35d38c3561 | ||
|   | c0aa27ef32 | ||
|   | 11fcb0217e | ||
|   | c8b5078660 | ||
|   | 7bc920ab56 | ||
|   | ebd79394a3 | ||
|   | 04379b2de9 | ||
|   | 43678fd2c4 | ||
|   | db6d680765 | ||
|   | a2e9cde737 | ||
|   | aaaea44d22 | ||
|   | 19037cbd83 | ||
|   | 21c5a022af | ||
|   | cca7e9f7e1 | ||
|   | c2529c1ed6 | ||
|   | fa1fefb2bc | ||
|   | 10ce67886d | ||
|   | eebb2d1b9c | ||
|   | e39178de28 | ||
|   | 9c5aa8a3f7 | ||
|   | 80853f5dbc | ||
|   | 9ce957c3e7 | ||
|   | c825a74dd1 | ||
|   | 69abe1b2e8 | ||
|   | 164b8e4e04 | ||
|   | de8b4855d3 | ||
|   | f3f55f1f6d | ||
|   | 2b7c2b8cf1 | ||
|   | 6e876bca13 | ||
|   | faa2df1159 | ||
|   | 711713d664 | ||
|   | 8b5e391afb | ||
|   | 1e73fd4b1e | ||
|   | f796269a1d | ||
|   | b2d0656814 | ||
|   | c0a3e25d48 | ||
|   | 0c93f4df32 | ||
|   | b1fcf4ce9c | ||
|   | 6804edfc85 | ||
|   | bfb87f2d51 | ||
|   | e6fc30da61 | ||
|   | 49339525a9 | ||
|   | 1f578cdbad | ||
|   | b00ad439a6 | ||
|   | 0e90ae266a | ||
|   | b113ad49e9 | ||
|   | a534b623b9 | ||
|   | 882a4b7d69 | ||
|   | ac8b4be7c2 | ||
|   | 66abbefd6c | ||
|   | 84eda608c8 | ||
|   | e3905ed7bb | ||
|   | 92b6262ac7 | ||
|   | 647df8cfe7 | ||
|   | 6a0812645a | ||
|   | 3d4d1ab14b | ||
|   | 09f990a7c8 | ||
|   | 6df531d33d | ||
|   | b2e9b91852 | ||
|   | f84d997d4c | ||
|   | 346148ceb8 | ||
|   | 12a91636f4 | ||
|   | 7f7baa6c3c | ||
|   | 400b45d590 | ||
|   | e431599d08 | ||
|   | e07f0ef417 | ||
|   | dbb5af2023 | ||
|   | 900d54b0fc | ||
|   | 84750f5722 | ||
|   | f8f03bdbbf | ||
|   | 80d5f7d27b | 
							
								
								
									
										70
									
								
								FEATURE-REMOVAL-SCHEDULE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								FEATURE-REMOVAL-SCHEDULE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| The following is a list of files and features that are going to be removed in | ||||
| the source tree.  Every entry should contain what exactly is going away, why it | ||||
| is happening, and who is going to be doing the work.  When the feature is | ||||
| removed, it should also be removed from this file. | ||||
|  | ||||
| --------------------------- | ||||
|  | ||||
| What: rc_sys automatic detection code | ||||
|       - Functions for removal: rc_sys_v1, rc_sys_v2 | ||||
|  | ||||
| When: 2011/03/01 | ||||
|  | ||||
| Why: The original automatic sub-system detection is flawed in that it cannot | ||||
| 	 safely detect some variables (Using cgroups confused it to think you were | ||||
| 	 using LXC, and Prefix cannot be detect by definition). Also, almost all of | ||||
| 	 the detection requires that /proc is available and readable. During early | ||||
| 	 boot, /proc may not be mounted yet, leading to mis-detection. The readable | ||||
| 	 condition can also fail under some hardened kernels when running as an | ||||
| 	 unprivileged user. | ||||
|  | ||||
| 	 The new rc_sys_v2 function uses the rc_sys variable from rc.conf. After | ||||
| 	 the removal, the contents of the rc_sys_v2 function will move into the | ||||
| 	 rc_sys function. | ||||
|  | ||||
| Who:  Robin H. Johnson <robbat2@gentoo.org> | ||||
|  | ||||
| --------------------------- | ||||
|  | ||||
| What: oldnet ADSL rp-pppoe mode | ||||
|  | ||||
| When: undecided | ||||
|  | ||||
| Why: Replaced by the oldnet PPP module | ||||
|  | ||||
| Who:  Robin H. Johnson <robbat2@gentoo.org> | ||||
|  | ||||
| --------------------------- | ||||
|  | ||||
| What: oldnet /etc/conf.d/wireless | ||||
|  | ||||
| When: undecided | ||||
|  | ||||
| Why: All configuration moved to /etc/conf.d/net | ||||
|  | ||||
| Who:  Robin H. Johnson <robbat2@gentoo.org> | ||||
|  | ||||
| --------------------------- | ||||
|  | ||||
| What: Service pause action | ||||
|  | ||||
| When: Removed already, compatbility warning in place. | ||||
|  | ||||
| Why: ... | ||||
|  | ||||
| Who: | ||||
|  | ||||
| --------------------------- | ||||
|  | ||||
| What: Service --startas, --chuid , --oknodo | ||||
|  | ||||
| When: undecided | ||||
|  | ||||
| Why: Obsolete or replaced by other options. | ||||
| 	 --startas => use --name or --exec | ||||
| 	 --chuid => use --user | ||||
| 	 --oknodo => ignore return code instead | ||||
|  | ||||
| Who: | ||||
|  | ||||
| --------------------------- | ||||
							
								
								
									
										21
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								Makefile
									
									
									
									
									
								
							| @@ -4,23 +4,18 @@ | ||||
|  | ||||
| include Makefile.inc | ||||
|  | ||||
| SUBDIR=		conf.d etc init.d man scripts sh src | ||||
| SUBDIR=		conf.d etc init.d local.d man scripts sh src | ||||
|  | ||||
| # Build our old net foo or not | ||||
| _OLDNET_SH=	case "${MKOLDNET}" in \ | ||||
| 		[Yy][Ee][Ss]) echo "net doc";; \ | ||||
| 		*) echo "";; \ | ||||
| 		esac | ||||
| _OLDNET!=	${_OLDNET_SH} | ||||
| SUBDIR+=	${_OLDNET}$(shell ${_OLDNET_SH}) | ||||
| ifeq (${MKOLDNET},yes) | ||||
| SUBDIR+=	net doc | ||||
| endif | ||||
|  | ||||
| # Build pkgconfig or not | ||||
| _PKGCONFIG_SH=	case "${MKPKGCONFIG}" in \ | ||||
| 		[Yy][Ee][Ss]|"") echo "pkgconfig";; \ | ||||
| 		*) echo "";; \ | ||||
| 		esac | ||||
| _PKGCONFIG!=	${_PKGCONFIG_SH} | ||||
| SUBDIR+=	${_PKGCONFIG}$(shell ${_PKGCONFIG_SH}) | ||||
| MKPKGCONFIG?=	yes | ||||
| ifeq (${MKPKGCONFIG},yes) | ||||
| SUBDIR+=	pkgconfig | ||||
| endif | ||||
|  | ||||
| # We need to ensure that runlevels is done last | ||||
| SUBDIR+=	runlevels | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| NAME=		openrc | ||||
| VERSION=	0.6.7 | ||||
| VERSION=	0.8.0 | ||||
| PKG=		${NAME}-${VERSION} | ||||
|   | ||||
							
								
								
									
										29
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								README
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ OpenRC README | ||||
| Installation | ||||
| ------------ | ||||
| make install | ||||
| Yup, that simple. Works with GNU make and BSD make. | ||||
| Yup, that simple. Works with GNU make. | ||||
|  | ||||
| You may wish to tweak the installation with the below arguments | ||||
| PROGLDFLAGS=-static | ||||
| @@ -12,6 +12,8 @@ LIBNAME=lib64 | ||||
| DESTDIR=/tmp/openrc-image | ||||
| MKPAM=pam | ||||
| MKPKGCONFIG=no | ||||
| MKRCSYS=prefix | ||||
| MKSELINUX=yes | ||||
| MKTERMCAP=ncurses | ||||
| MKTERMCAP=termcap | ||||
| MKOLDNET=yes | ||||
| @@ -32,6 +34,20 @@ LOCAL_PREFIX should be set when to where user maintained packages are. | ||||
| Only set LOCAL_PREFIX if different from PKG_PREFIX. | ||||
| 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 | ||||
| /etc/devd.conf | ||||
| /etc/rc | ||||
| @@ -53,13 +69,10 @@ of the system. | ||||
|  | ||||
|  | ||||
| Reporting Bugs | ||||
| ------------- | ||||
| If you installed OpenRC from your chosen distribution, you should report | ||||
| bugs directly to them. For example, if you use Gentoo and emerged OpenRC | ||||
| then you should reports bugs to http://bugs.gentoo.org. | ||||
|  | ||||
| Otherwise, you can report them directly to me at | ||||
| http://roy.marples.name/projects/openrc | ||||
| -------------- | ||||
| Bugs should go to the Gentoo Bugzilla: | ||||
| 	http://bugs.gentoo.org/ | ||||
| You'll want the "Gentoo Linux" product and the "baselayout" component. | ||||
|  | ||||
|  | ||||
| History - by Roy Marples | ||||
|   | ||||
| @@ -1,3 +1,7 @@ | ||||
| The following applies only to the newnet stack, which is not presently | ||||
| maintained in OpenRC. The oldnet stack is maintained instead. | ||||
| - Robin H. Johnson <robbat2@gentoo.org>, 2011/02/21 | ||||
| 
 | ||||
| OpenRC Network Ideals | ||||
| --------------------- | ||||
| 
 | ||||
							
								
								
									
										34
									
								
								STYLE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								STYLE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| This is the openrc style manual.  It governs the coding style of all code | ||||
| in this repository.  Follow it.  Contact openrc@gentoo.org for any questions | ||||
| or fixes you might notice. | ||||
|  | ||||
| ########## | ||||
| # C CODE # | ||||
| ########## | ||||
|  | ||||
| The BSD Kernel Normal Form (KNF) style is used: | ||||
| 	http://en.wikipedia.org/wiki/Indent_style#BSD_KNF_style | ||||
| Basically, it's like K&R/LKML, but wrapped lines that are indented use 4 spaces. | ||||
|  | ||||
| Highlights: | ||||
| 	- no trailing whitespace | ||||
| 	- indented code use tabs (not line wrapped) | ||||
| 	- cuddle the braces (except for functions) | ||||
| 	- space after native statements and before paren (for/if/while/...) | ||||
| 	- no space between function and paren | ||||
| 	- pointer asterisk cuddles the variable, not the type | ||||
|  | ||||
| void foo(int c) | ||||
| { | ||||
| 	int ret = 0; | ||||
|  | ||||
| 	if (c > 1000) | ||||
| 		return; | ||||
|  | ||||
| 	while (c--) { | ||||
| 		bar(c); | ||||
| 		ret++; | ||||
| 	} | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
							
								
								
									
										4
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								TODO
									
									
									
									
									
								
							| @@ -1,3 +1,7 @@ | ||||
| - ensure all forks block, restore and unblock signals. needs review  | ||||
|  | ||||
| - add support somehow for optional translations | ||||
|  | ||||
| - oldnet[bridging]: Review setting of bridge configuration on dynamic interface add | ||||
|  | ||||
| - Document rc-depend binary. | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| DIR=	${CONFDIR} | ||||
| CONF=	bootmisc fsck hostname local localmount network staticroute urandom | ||||
| CONF=	bootmisc fsck hostname localmount network staticroute urandom | ||||
|  | ||||
| TARGETS+=	network staticroute | ||||
| CLEANFILES+=	network staticroute | ||||
|   | ||||
| @@ -9,6 +9,14 @@ clock="UTC" | ||||
| # You normally don't need to do this if you run a ntp daemon. | ||||
| clock_systohc="NO" | ||||
|  | ||||
| # 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, | ||||
| # you may do so here. Alpha users may wish to use --arc or --srm here. | ||||
| clock_args="" | ||||
|   | ||||
| @@ -4,6 +4,8 @@ keymap="us" | ||||
|  | ||||
| # Should we first load the 'windowkeys' console keymap?  Most x86 users will | ||||
| # say "yes" here.  Note that non-x86 users should leave it as "no". | ||||
| # Loading this keymap will enable VT switching (like ALT+Left/Right) | ||||
| # using the special windows keys on the linux console. | ||||
| windowkeys="NO" | ||||
|  | ||||
| # The maps to load for extended keyboards.  Most users will leave this as is. | ||||
|   | ||||
							
								
								
									
										18
									
								
								conf.d/local
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								conf.d/local
									
									
									
									
									
								
							| @@ -1,18 +0,0 @@ | ||||
| # Here is where you can put anything you need to start | ||||
| # that there is not an init script for. | ||||
|  | ||||
| local_start() { | ||||
| 	# This is a good place to load any misc programs | ||||
| 	# on startup (use &>/dev/null to hide output) | ||||
|  | ||||
| 	# We should always return 0 | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| local_stop() { | ||||
| 	# This is a good place to unload any misc. | ||||
| 	# programs you started above. | ||||
| 	 | ||||
| 	# We should always return 0 | ||||
| 	return 0 | ||||
| } | ||||
| @@ -527,7 +527,8 @@ | ||||
|  | ||||
| #----------------------------------------------------------------------------- | ||||
| # VLAN (802.1q support) | ||||
| # For VLAN support, emerge net-misc/vconfig | ||||
| # For VLAN support, emerge sys-apps/iproute2 | ||||
| # The old vconfig based VLAN support is no longer available. | ||||
|  | ||||
| # Specify the VLAN numbers for the interface like so | ||||
| # Please ensure your VLAN IDs are NOT zero-padded | ||||
| @@ -537,10 +538,17 @@ | ||||
| # need it up. | ||||
| #config_eth0="null" | ||||
|  | ||||
| # You can also configure the VLAN - see for vconfig man page for more details | ||||
| #vconfig_eth0="set_name_type VLAN_PLUS_VID_NO_PAD" | ||||
| #vconfig_vlan1="set_flag 1 | ||||
| #set_egress_map 2 6" | ||||
| # You can also configure the VLAN - see for ip man page for more details | ||||
| # To change the vlan interface name. If not set, the standard "iface.vlanid" | ||||
| # will be used | ||||
| #vlan1_name="vlan1" | ||||
| #vlan2_name="eth0.2" | ||||
| # Set the vlan flags | ||||
| #vlan1_flags="reorder_hdr off gvrp on loose_binding on" | ||||
| # Configure in/egress maps | ||||
| #vlan1_ingress="2:6 3:5" | ||||
| #vlan1_egress="1:2" | ||||
|  | ||||
| #config_vlan1="172.16.3.1/23" | ||||
| #config_vlan2="172.16.2.1/23" | ||||
|  | ||||
| @@ -553,8 +561,7 @@ | ||||
| # This means you do not need to create init scripts in /etc/init.d for each | ||||
| # vlan, you must need to create one for the physical interface. | ||||
| # If you wish to control the configuration of each vlan through a separate | ||||
| # script, or wish to rename the vlan interface to something that vconfig | ||||
| # cannot then you need to do this. | ||||
| # script then you need to do this. | ||||
| #vlan_start_eth0="no" | ||||
|  | ||||
| # If you do the above then you may want to depend on eth0 like so | ||||
| @@ -787,11 +794,18 @@ | ||||
| #bridge_add_eth0="br0" | ||||
| #bridge_add_eth1="br0" | ||||
|  | ||||
| # NOTE: If you want to manually start an empty bridge, and then dynamically add | ||||
| # ports to it you must set at least one of the following variables based on the | ||||
| # interface name, so that we can pick it up from your configuration. Even an | ||||
| # empty value variable is fine, but at least one of them must be set: | ||||
| # brctl_IFVAR | ||||
|  | ||||
| # You need to configure the ports to null values so dhcp does not get started | ||||
| #config_eth0="null" | ||||
| #config_eth1="null" | ||||
|  | ||||
| # Finally give the bridge an address - dhcp or a static IP | ||||
| # Finally give the bridge an address - dhcp or a static IP, this is assigned to | ||||
| # the bridge when the bridge is explicitly started. | ||||
| #config_br0="dhcp" # may not work when adding ports dynamically | ||||
| #config_br0="192.168.0.1/24" | ||||
|  | ||||
| @@ -805,6 +819,13 @@ | ||||
| #sethello 0 | ||||
| #stp off" | ||||
|  | ||||
| # You can also configure the bridge or bridge members via sysfs on 2.6 kernels | ||||
| # or newer. See the kernel bridge documentation for a description of these | ||||
| # options. | ||||
| #stp_state_br0="0" | ||||
| #forward_delay_br0="10" | ||||
| #hairpin_mode_eth0="1" | ||||
|  | ||||
| #----------------------------------------------------------------------------- | ||||
| # RFC 2684 Bridge Support | ||||
| # For RFC 2684 bridge support emerge net-misc/br2684ctl | ||||
| @@ -852,6 +873,52 @@ | ||||
| #relay_6to4="192.168.3.2" | ||||
| #suffix_6to4=":ff" | ||||
|  | ||||
| #----------------------------------------------------------------------------- | ||||
| # Advanced Routing | ||||
| # WARNING: For advanced routing you MUST be using sys-apps/iproute2 | ||||
| # | ||||
| # This provides a means to do multi-homing and more using the Routing Policy | ||||
| # Database (RPDB). | ||||
| # | ||||
| # See the following links for background and more information. | ||||
| # http://linux-ip.net/html/ch-routing.html | ||||
| # http://linux-ip.net/html/ch-advanced-routing.html | ||||
|  | ||||
| # The rules listed will be added with 'ip rule add LINE' when the interface is | ||||
| # being brought up. They will also be removed with 'ip rule delete LINE'. | ||||
| # The rules added are also stored for later removal, so if you alter your rules | ||||
| # directly before stopping, you should review your rules again after stopping. | ||||
|  | ||||
| # Note in earlier versions of openrc, this was provided as an example in | ||||
| # postup/postdown, however that implementation suffered some bugs in corner | ||||
| # cases, which are now fixed with this merger. If you used the previous | ||||
| # example, you should only need to drop the relevent portions of your | ||||
| # postup/postdown functions, and review the quoting in your rules_IFACE | ||||
| # variables. | ||||
|  | ||||
| # Below is a trivial example for a dual-homed connection where there is an OOB | ||||
| # management network. Only packets explicitly with an address from or to the | ||||
| # OOB are sent via eth0. All others go via eth1 as the eth1 rules have a lower | ||||
| # priority. | ||||
|  | ||||
| # If you want to use names for your tables, you should put lines into | ||||
| # /etc/iproute2/rt_tables, an example follows: | ||||
| # 2 oob | ||||
| # 3 external | ||||
|  | ||||
| #rules_eth0=" | ||||
| #from ZZZ.ZZZ.200.128/27 table oob priority 500 | ||||
| #to ZZZ.ZZZ.200.128/27 table oob priority 550" | ||||
| #rules_eth1=" | ||||
| #from XXX.XXX.112.0/24 table external priority 400 | ||||
| #to XXX.XXX.112.0/24 table external priority 450" | ||||
| #routes_eth0=" | ||||
| #ZZZ.ZZZ.200.128/27 dev eth0 table oob scope link | ||||
| #default via ZZZ.ZZZ.200.129 table oob" | ||||
| #routes_eth1=" | ||||
| #XXX.XXX.112.0/24 dev eth1 table external scope link | ||||
| #default via XXX.XXX.112.1 dev eth1" | ||||
|  | ||||
|  | ||||
| #----------------------------------------------------------------------------- | ||||
| # System | ||||
| @@ -913,6 +980,72 @@ | ||||
| #ifplugd_eth0="--api-mode=wlan" | ||||
| # man ifplugd for more options | ||||
|  | ||||
| #----------------------------------------------------------------------------- | ||||
| # Interface hardware tuning & configuration via ethtool | ||||
| # If you need to change explicit hardware settings on your network card prior | ||||
| # to bringing the interface up, the following is available. | ||||
| # | ||||
| # For a full listing of settings, please consulting ethtool(8) and the output | ||||
| # of "ethtool --help". | ||||
| # | ||||
| # Multiple entries (seperated by newlines) are supported in all of the | ||||
| # variables as some settings cannot be changed at the same time. | ||||
| # | ||||
| # Valid variable name fragments: change pause coalesce ring offload | ||||
| # change_eeprom identify nfc flash rxfh_indir ntuple | ||||
|  | ||||
| # Set Wake-On-Lan to listen for SecureOn MagicPacket(tm), the message level to | ||||
| # notify us of WOL changes, and the SecureOn password to 'DE:AD:BE:EF:CA:FE'. | ||||
| #ethtool_change_eth0="wol gs | ||||
| #msglvl wol on | ||||
| #sopass DE:AD:BE:EF:CA:FE" | ||||
|  | ||||
| # Disable pause auto-negotiation and explicitly enable RX and TX pause. | ||||
| #ethtool_pause_eth0="autoneg off | ||||
| #rx on tx on" | ||||
|  | ||||
| # Enasble adaptive RX and TX coalescing | ||||
| #ethtool_coalesce_eth0="adaptive-rx on adaptive-tx on" | ||||
|  | ||||
| # Change ring buffer settings | ||||
| #ethtool_ring_eth0="" | ||||
|  | ||||
| # Enable all offload settings | ||||
| #ethtool_offload_eth0="rx on tx on sg on tso on ufo on gso on gro on lro on" | ||||
|  | ||||
| # Change specific bytes in the EEPROM | ||||
| #ethtool_change_eeprom_eth0="" | ||||
|  | ||||
| # Run the identify sequence on the interface for 1 second (does not return until completion) | ||||
| #ethtool_identify_eth0="1" | ||||
|  | ||||
| # Configure receive network flow classification | ||||
| #ethtool_nfc_eth0=" | ||||
| #rx-flow-hash tcp4 f | ||||
| #rx-flow-hash udp4 s" | ||||
|  | ||||
| # Flash firmware to all regions | ||||
| #ethtool_flash_eth0="/some/path/firmware1 0" | ||||
|  | ||||
| # Flash firmware to region 1 | ||||
| #ethtool_flash_eth0="/some/path/firmware2 1" | ||||
|  | ||||
| # Set receive flow hash indirection table for even balancing between N receive queues | ||||
| #ethtool_rxfh_indir_eth0="equal 4" | ||||
|  | ||||
| # Configure Rx ntuple filters and actions | ||||
| #ethtool_ntuple_eth0="" | ||||
|  | ||||
| # Additionally, there is a special control variable, if you need to change the | ||||
| # order of option processing. The default order is: | ||||
| # flash change-eeprom change pause coalesce ring offload identify nfc rxfh-indir ntuple | ||||
|  | ||||
| # Set global order to default | ||||
| #ethtool_order="flash change-eeprom change pause coalesce ring offload identify nfc rxfh-indir ntuple" | ||||
|  | ||||
| # Hypothetical network card that requires a change-eeprom toggle to enable flashing | ||||
| #ethtool_order_eth0="change-eeprom flash change pause coalesce ring offload nfc rxfh-indir ntuple" | ||||
|  | ||||
| ############################################################################## | ||||
| # ADVANCED CONFIGURATION | ||||
| # | ||||
| @@ -980,33 +1113,6 @@ | ||||
| #	# This function could be used, for example, to register with a | ||||
| #	# dynamic DNS service.  Another possibility would be to | ||||
| #	# send/receive mail once the interface is brought up. | ||||
|  | ||||
| #	# Here is an example that allows the use of iproute rules | ||||
| #	# which have been configured using the rules_eth0 variable. | ||||
| #	#rules_eth0=" \ | ||||
| #	#	'from 24.80.102.112/32 to 192.168.1.0/24 table localnet priority 100' \ | ||||
| #	#	'from 216.113.223.51/32 to 192.168.1.0/24 table localnet priority 100' \ | ||||
| #	#" | ||||
| #	eval set -- \$rules_${IFVAR} | ||||
| #	if [ $# != 0 ]; then | ||||
| #		einfo "Adding IP policy routing rules" | ||||
| #		eindent | ||||
| #		# Ensure that the kernel supports policy routing | ||||
| #		if ! ip rule list | grep -q "^"; then | ||||
| #			eerror "You need to enable IP Policy Routing (CONFIG_IP_MULTIPLE_TABLES)" | ||||
| #			eerror "in your kernel to use ip rules" | ||||
| #		else | ||||
| #			for x; do | ||||
| #				ebegin "${x}" | ||||
| #				ip rule add ${x} | ||||
| #				eend $? | ||||
| #			done | ||||
| #		fi | ||||
| #		eoutdent | ||||
| #		# Flush the cache | ||||
| #		ip route flush cache dev "${IFACE}" | ||||
| #	fi | ||||
|  | ||||
| #} | ||||
|  | ||||
| #postdown() { | ||||
| @@ -1014,21 +1120,6 @@ | ||||
| #	# Probably a good idea to set ifdown="no" in /etc/conf.d/net | ||||
| #	# as well ;) | ||||
| #	[ "${IFACE}" != "lo" ] && ethtool -s "${IFACE}" wol g | ||||
|  | ||||
| #	Automatically erase any ip rules created in the example postup above | ||||
| #	if interface_exists "${IFACE}"; then | ||||
| #		# Remove any rules for this interface | ||||
| #		local rule | ||||
| #		ip rule list | grep " iif ${IFACE}[ ]*" | { | ||||
| #			while read rule; do | ||||
| #				rule="${rule#*:}"	 | ||||
| #				ip rule del ${rule} | ||||
| #			done | ||||
| #		} | ||||
| #		# Flush the route cache | ||||
| #		ip route flush cache dev "${IFACE}" | ||||
| #	fi | ||||
|  | ||||
| #	# Return 0 always | ||||
| #	return 0 | ||||
| #} | ||||
|   | ||||
							
								
								
									
										12
									
								
								etc/Makefile
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								etc/Makefile
									
									
									
									
									
								
							| @@ -7,3 +7,15 @@ MK=	../mk | ||||
| include ${MK}/os.mk | ||||
| include Makefile.${OS} | ||||
| 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} | ||||
| 	${SED} ${SED_REPLACE} ${SED_EXTRA} $^ > $@ | ||||
|   | ||||
| @@ -1,6 +1,2 @@ | ||||
| SED_EXTRA=	-e 's:@TERM@:wsvt25:g' | ||||
| SRCS+=		rc.in rc.shutdown.in | ||||
|  | ||||
| rc.conf: | ||||
| 	cp rc.conf.in rc.conf | ||||
| 	cat rc.conf.Linux >> rc.conf | ||||
| SRCS+=		rc.conf.in rc.in rc.shutdown.in | ||||
|   | ||||
							
								
								
									
										11
									
								
								etc/rc.conf.FreeBSD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								etc/rc.conf.FreeBSD
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| # This is the subsystem type. Valid options on FreeBSD: | ||||
| # ""        - nothing special | ||||
| # "jail"    - FreeBSD jails | ||||
| # "prefix"  - Prefix | ||||
| # 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 | ||||
| # PRESENTLY in, not the virtualization the environment is capable of. | ||||
| rc_sys="@RC_SYS_DEFAULT@" | ||||
|  | ||||
| @@ -1,3 +1,19 @@ | ||||
| # This is the subsystem type. Valid options on Linux: | ||||
| # ""        - nothing special | ||||
| # "lxc"     - Linux Containers | ||||
| # "openvz"  - Linux OpenVZ | ||||
| # "prefix"  - Prefix | ||||
| # "uml"     - Usermode Linux | ||||
| # "vserver" - Linux vserver | ||||
| # "xen0"    - Xen0 Domain | ||||
| # "xenU"    - XenU Domain | ||||
| # If this is commented out, automatic detection will be attempted. | ||||
| # 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 | ||||
| # PRESENTLY in, not the virtualization the environment is capable of. | ||||
| rc_sys="@RC_SYS_DEFAULT@" | ||||
|  | ||||
| ############################################################################## | ||||
| # LINUX SPECIFIC OPTIONS | ||||
|   | ||||
							
								
								
									
										12
									
								
								etc/rc.conf.NetBSD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								etc/rc.conf.NetBSD
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| # This is the subsystem type. Valid options on NetBSD: | ||||
| # ""        - nothing special | ||||
| # "prefix"  - Prefix | ||||
| # "xen0"    - Xen0 Domain | ||||
| # "xenU"    - XenU Domain | ||||
| # 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 | ||||
| # PRESENTLY in, not the virtualization the environment is capable of. | ||||
| rc_sys="@RC_SYS_DEFAULT@" | ||||
|  | ||||
| @@ -21,7 +21,7 @@ | ||||
| # Linux users could specify /sbin/sulogin | ||||
| #rc_shell=/bin/sh | ||||
|  | ||||
| # Do we allow any started service in the runlevel to satisfy the depedency | ||||
| # Do we allow any started service in the runlevel to satisfy the dependency | ||||
| # or do we want all of them regardless of state? For example, if net.eth0 | ||||
| # and net.eth1 are in the default runlevel then with rc_depend_strict="NO" | ||||
| # both will be started, but services that depend on 'net' will work if either | ||||
| @@ -115,3 +115,4 @@ | ||||
| # You can also remove dependencies. | ||||
| # This is mainly used for saying which servies do NOT provide net. | ||||
| #rc_net_tap0_provide="!net" | ||||
|  | ||||
|   | ||||
| @@ -5,12 +5,10 @@ SRCS=	bootmisc.in fsck.in hostname.in local.in localmount.in netmount.in \ | ||||
| BIN=	${OBJS} | ||||
|  | ||||
| # Build our old net foo or not | ||||
| _OLDNET_SH=	case "${MKOLDNET}" in \ | ||||
| 		[Yy][Ee][Ss]) echo "net.lo";; \ | ||||
| 		*) echo "";; \ | ||||
| 		esac | ||||
| _OLDNET!=	${_OLDNET_SH} | ||||
| _NET_LO=	${_OLDNET}$(shell ${_OLDNET_SH}) | ||||
| ifeq (${MKOLDNET},yes) | ||||
| _OLDNET=	net.lo | ||||
| endif | ||||
| _NET_LO=	${_OLDNET} | ||||
|  | ||||
| INSTALLAFTER=	_installafter_${_NET_LO} | ||||
| CLEANFILES+=	${_NET_LO} | ||||
|   | ||||
| @@ -25,7 +25,7 @@ cleanup_tmp_dir() | ||||
| 		mkdir -p "$dir" || return $? | ||||
| 	fi | ||||
| 	dir_writeable "$dir" || return 1 | ||||
| 	chmod a+rwt "$dir" | ||||
| 	chmod a+rwt "$dir" 2> /dev/null | ||||
| 	cd "$dir" | ||||
| 	if yesno $wipe_tmp; then | ||||
| 		ebegin "Wiping $dir directory" | ||||
| @@ -77,7 +77,7 @@ mkutmp() | ||||
| start() | ||||
| { | ||||
| 	# Remove any added console dirs | ||||
| 	rm -rf "$RC_LIBEXECDIR"/console | ||||
| 	rm -rf "$RC_LIBEXECDIR"/console/* | ||||
|  | ||||
| 	local logw=false runw=false extra= | ||||
| 	# Ensure that our basic dirs exist | ||||
|   | ||||
| @@ -61,12 +61,6 @@ start() | ||||
| 		done | ||||
| 		cp "$font" "$RC_LIBEXECDIR"/console | ||||
| 		echo "${font##*/}" >"$RC_LIBEXECDIR"/console/font | ||||
| 		if yesno ${unicode:-${UNICODE}}; then | ||||
| 			echo "" > "$RC_LIBEXECDIR"/console/unicode | ||||
| 		else | ||||
| 			rm -f "$RC_LIBEXECDIR"/console/unicode | ||||
| 		fi | ||||
|  | ||||
| 	fi | ||||
|  | ||||
| 	return $retval | ||||
|   | ||||
| @@ -91,10 +91,14 @@ start() | ||||
| 	# If setting UTC, don't bother to run hwclock when first booting | ||||
| 	# as that's the default | ||||
| 	if [ "$PREVLEVEL" != N -o \ | ||||
| 		"$utc_cmd}" != --utc -o \ | ||||
| 		"$utc_cmd" != --utc -o \ | ||||
| 		-n "$clock_args" ]; | ||||
| 	then | ||||
| 		if yesno $clock_hctosys; then | ||||
| 			_hwclock --hctosys $utc_cmd $clock_args | ||||
| 		else | ||||
| 			_hwclock --systz $utc_cmd $clock_args | ||||
| 		fi | ||||
| 		retval=$(($retval + $?)) | ||||
| 	fi | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| # Copyright (c) 2007-2008 Roy Marples <roy@marples.name> | ||||
| # All rights reserved. Released under the 2-clause BSD license. | ||||
|  | ||||
| description="Executes user commands in /etc/conf.d/local" | ||||
| description="Executes user programs in @SYSCONFDIR@/local.d" | ||||
|  | ||||
| depend() | ||||
| { | ||||
| @@ -12,22 +12,40 @@ depend() | ||||
|  | ||||
| start() | ||||
| { | ||||
| 	ebegin "Starting local" | ||||
| 	einfo "Starting local" | ||||
|  | ||||
| 	local file | ||||
| 	for file in @SYSCONFDIR@/local.d/*.start ; do | ||||
| 		[ -x "$file" ] && "$file" | ||||
| 	done | ||||
|  | ||||
| 	if type local_start >/dev/null 2>&1; then | ||||
| 		ewarn "@SYSCONFDIR@/conf.d/local should be removed." | ||||
| 		ewarn "Please move the code from the local_start function" | ||||
| 		ewarn "to scripts with an .start extension" | ||||
| 		ewarn "in @SYSCONFDIR@/local.d" | ||||
| 		local_start | ||||
| 	fi | ||||
|  | ||||
| 	eend $? "Failed to start local" | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| stop() | ||||
| { | ||||
| 	ebegin "Stopping local" | ||||
| 	einfo "Stopping local" | ||||
|  | ||||
| 	local file | ||||
| 	for file in @SYSCONFDIR@/local.d/*.stop; do | ||||
| 		[ -x "$file" ] && "$file" | ||||
| 	done | ||||
|  | ||||
| 	if type local_start >/dev/null 2>&1; then | ||||
| 		ewarn "@SYSCONFDIR@/conf.d/local should be removed." | ||||
| 		ewarn "Please move the code from the local_stop function" | ||||
| 		ewarn "to scripts with an .stop extension" | ||||
| 		ewarn "in @SYSCONFDIR@/local.d" | ||||
| 		local_stop | ||||
| 	fi | ||||
|  | ||||
| 	eend $? "Failed to stop local" | ||||
| 	return 0 | ||||
| } | ||||
|   | ||||
| @@ -8,6 +8,7 @@ depend() | ||||
| { | ||||
| 	need fsck | ||||
| 	use lvm modules mtab | ||||
| 	after lvm modules | ||||
| 	keyword -jail -openvz -prefix -vserver -lxc | ||||
| } | ||||
|  | ||||
| @@ -57,8 +58,8 @@ stop() | ||||
|  | ||||
| 	. "$RC_LIBEXECDIR"/sh/rc-mount.sh | ||||
|  | ||||
| 	# Umount loopback devices | ||||
| 	einfo "Unmounting loopback devices" | ||||
| 	# Umount loop devices | ||||
| 	einfo "Unmounting loop devices" | ||||
| 	eindent | ||||
| 	do_unmount "umount -d" --skip-point-regex "$no_umounts_r" \ | ||||
| 		--node-regex "^/dev/loop" | ||||
|   | ||||
| @@ -402,7 +402,7 @@ _load_config() | ||||
| 		set -- ${config} | ||||
| 		# Of course, we may have a single address added old style. | ||||
| 		case "$2" in | ||||
| 			netmask|broadcast|brd|brd+) | ||||
| 			netmask|broadcast|brd|brd+|peer|pointopoint) | ||||
| 				local IFS="$__IFS" | ||||
| 				set -- ${config} | ||||
| 				;; | ||||
| @@ -684,8 +684,12 @@ stop() | ||||
|  | ||||
| 	# Only delete addresses for interfaces that exist | ||||
| 	if _exists; then | ||||
| 		# PPP can manage it's own addresses when IN_BACKGROUND | ||||
| 		# Important in case "demand" set on the ppp link | ||||
| 		if ! (yesno ${IN_BACKGROUND} && is_ppp) ; then | ||||
| 			_delete_addresses "${IFACE}" | ||||
| 		fi | ||||
| 	fi | ||||
|  | ||||
| 	for module in ${MODULES}; do | ||||
| 		if [ "$(command -v "${module}_post_stop")" = "${module}_post_stop" ]; then | ||||
|   | ||||
| @@ -43,7 +43,7 @@ start() | ||||
| 	local myneed= myuse= pmap="portmap" nfsmounts= | ||||
| 	[ -x @SYSCONFDIR@/init.d/rpcbind ] && pmap="rpcbind" | ||||
|  | ||||
| 	local x= fs= | ||||
| 	local x= fs= rc= | ||||
| 	for x in $net_fs_list; do | ||||
| 		case "$x" in | ||||
| 			nfs|nfs4) | ||||
| @@ -65,7 +65,12 @@ start() | ||||
|  | ||||
| 	ebegin "Mounting network filesystems" | ||||
| 	mount -at $fs | ||||
| 	ewend $? "Could not mount all network filesystems" | ||||
| 	rc=$? | ||||
| 	if [ "$RC_UNAME" = Linux ]; then | ||||
| 		mount -a -O _netdev | ||||
| 		rc=$? | ||||
| 	fi | ||||
| 	ewend $rc "Could not mount all network filesystems" | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| @@ -93,5 +98,9 @@ stop() | ||||
| 	retval=$? | ||||
|  | ||||
| 	eoutdent | ||||
| 	if [ "$RC_UNAME" = Linux ]; then | ||||
| 		umount -a -O _netdev | ||||
| 		retval=$? | ||||
| 	fi | ||||
| 	eend $retval "Failed to unmount network filesystems" | ||||
| } | ||||
|   | ||||
| @@ -8,17 +8,22 @@ start() | ||||
| { | ||||
| 	if [ -e "$RC_SVCDIR"/clock-skewed ]; then | ||||
| 		ewarn "WARNING: clock skew detected!" | ||||
| 		if ! yesno "savecache_skewed"; then | ||||
| 		if ! yesno "${RC_GOINGDOWN}"; then | ||||
| 			eerror "Not saving deptree cache" | ||||
| 			return 1 | ||||
| 		fi | ||||
| 	fi | ||||
| 	ebegin "Saving dependency cache" | ||||
| 	local rc= | ||||
| 	if [ ! -d "$RC_LIBEXECDIR"/cache ]; then | ||||
| 		rm -rf "$RC_LIBEXECDIR"/cache | ||||
| 		if ! mkdir "$RC_LIBEXECDIR"/cache; then | ||||
| 			eend $? | ||||
| 			return $? | ||||
| 			rc=$? | ||||
| 			if yesno "${RC_GOINGDOWN}"; then | ||||
| 				rc=0 | ||||
| 			fi | ||||
| 			eend $rc | ||||
| 			return $rc | ||||
| 		fi | ||||
| 	fi | ||||
| 	local save= | ||||
| @@ -28,5 +33,9 @@ start() | ||||
| 	if [ -n "$save" ]; then | ||||
| 		cp -p $save "$RC_LIBEXECDIR"/cache 2>/dev/null | ||||
| 	fi | ||||
| 	eend $? | ||||
| 	rc=$? | ||||
| 	if yesno "${RC_GOINGDOWN}"; then | ||||
| 		rc=0 | ||||
| 	fi | ||||
| 	eend $rc | ||||
| } | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| depend() | ||||
| { | ||||
| 	before bootmisc logger | ||||
| 	keyword -openvz -prefix -vserver | ||||
| 	keyword -prefix -vserver | ||||
| } | ||||
|  | ||||
| start() | ||||
|   | ||||
| @@ -31,5 +31,16 @@ start() | ||||
| 		printf "\033%s" "$termencoding" >$ttydev$n | ||||
| 		n=$(($n + 1)) | ||||
| 	done | ||||
|  | ||||
| 	# Save the encoding for use immediately at boot | ||||
| 	if [ -w "$RC_LIBEXECDIR" ]; then | ||||
| 		mkdir -p "$RC_LIBEXECDIR"/console | ||||
| 		if yesno ${unicode:-${UNICODE}}; then | ||||
| 			echo "" > "$RC_LIBEXECDIR"/console/unicode | ||||
| 		else | ||||
| 			rm -f "$RC_LIBEXECDIR"/console/unicode | ||||
| 		fi | ||||
| 	fi | ||||
|  | ||||
| 	eend 0 | ||||
| } | ||||
|   | ||||
							
								
								
									
										6
									
								
								local.d/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								local.d/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| DIR=	${LOCALDIR} | ||||
| CONF=	README | ||||
|  | ||||
| MK=		../mk | ||||
| include ${MK}/os.mk | ||||
| include ${MK}/scripts.mk | ||||
							
								
								
									
										9
									
								
								local.d/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								local.d/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| This directory should contain programs or scripts which are to be run | ||||
| when the local service is started or stopped. | ||||
|  | ||||
| If a file in this directory is executable and it has a .start extension, | ||||
| it will be run when the local service is started. If a file is | ||||
| executable and it has a .stop extension, it will be run when the local | ||||
| service is stopped. | ||||
|  | ||||
| All files are processed in lexical order. | ||||
| @@ -62,6 +62,10 @@ Show information only for the named | ||||
| .Sh EXIT STATUS | ||||
| .Nm | ||||
| exits 0, except when checking for crashed services and it doesn't find any. | ||||
| .Sh IMPLEMENTATION NOTES | ||||
| .Nm | ||||
| tries to list services within each runlevel in the presently resolved | ||||
| dependency order if the dependency tree is available. | ||||
| .Sh SEE ALSO | ||||
| .Xr rc 8 , | ||||
| .Xr rc-update 8 | ||||
|   | ||||
| @@ -138,13 +138,6 @@ We should recalculate our dependencies if the listed files have changed. | ||||
| .It Ic keyword | ||||
| Tags a service with a keyword. Here's the keywords we currently understand:- | ||||
| .Bl -tag -width indent | ||||
| .It Dv -jail | ||||
| When in a jail, exclude this service from any dependencies. The service can | ||||
| still be run directly. | ||||
| .It Dv -openvz | ||||
| Same as -jail, but for OpenVZ systems. | ||||
| .It Dv -lxc | ||||
| Same as -jail, but for Linux Resource Containers (LXC). | ||||
| .It Dv -shutdown | ||||
| Don't stop this service when shutting the system down. | ||||
| This normally quite safe as remaining daemons will be sent a SIGTERM just | ||||
| @@ -156,6 +149,18 @@ Don't stop this service when changing runlevels, even if not present. | ||||
| This includes shutting the system down. | ||||
| .It Dv -timeout | ||||
| Do not time out waiting for that service. | ||||
| .It Dv -jail | ||||
| When in a jail, exclude this service from any dependencies. The service can | ||||
| still be run directly. Set via  | ||||
| .Ic rc_sys  | ||||
| in  | ||||
| .Pa /etc/rc.conf | ||||
| .It Dv -lxc | ||||
| Same as -jail, but for Linux Resource Containers (LXC). | ||||
| .It Dv -openvz | ||||
| Same as -jail, but for OpenVZ systems. | ||||
| .It Dv -prefix | ||||
| Same as -jail, but for Prefix systems. | ||||
| .It Dv -uml | ||||
| Same as -jail, but for UML systems. | ||||
| .It Dv -vserver | ||||
|   | ||||
							
								
								
									
										10
									
								
								mk/cc.mk
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								mk/cc.mk
									
									
									
									
									
								
							| @@ -5,9 +5,9 @@ CFLAGS?=	-O2 | ||||
|  | ||||
| # Default to using the C99 standard | ||||
| CSTD?=		c99 | ||||
| _CSTD_SH=	if test -n "${CSTD}"; then echo "-std=${CSTD}"; else echo ""; fi | ||||
| _CSTD!=		${_CSTD_SH} | ||||
| CFLAGS+=	${_CSTD}$(shell ${_CSTD_SH}) | ||||
| ifneq (${CSTD},) | ||||
| CFLAGS+=	-std=${CSTD} | ||||
| endif | ||||
|  | ||||
| # Try and use some good cc flags if we're building from git | ||||
| # We don't use -pedantic as it will warn about our perfectly valid | ||||
| @@ -29,5 +29,5 @@ _CC_FLAGS_SH=	for f in ${_CCFLAGS}; do \ | ||||
| 		${CC} $$f -S -xc -o /dev/null - ; \ | ||||
| 		then printf "%s" "$$f "; fi \ | ||||
| 		done; | ||||
| _CC_FLAGS!=	${_CC_FLAGS_SH} | ||||
| CFLAGS+=	${_CC_FLAGS}$(shell ${_CC_FLAGS_SH}) | ||||
| _CC_FLAGS:=	$(shell ${_CC_FLAGS_SH}) | ||||
| CFLAGS+=	${_CC_FLAGS} | ||||
|   | ||||
							
								
								
									
										12
									
								
								mk/debug.mk
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								mk/debug.mk
									
									
									
									
									
								
							| @@ -3,14 +3,14 @@ | ||||
| # All rights reserved. Released under the 2-clause BSD license. | ||||
|  | ||||
| _RC_DEBUG_SH=	case "${DEBUG}" in "") echo "";; *) echo "-DRC_DEBUG";; esac | ||||
| _RC_DEBUG!=	${_RC_DEBUG_SH} | ||||
| CPPFLAGS+=	${_RC_DEBUG}$(shell ${_RC_DEBUG_SH}) | ||||
| _RC_DEBUG:=	$(shell ${_RC_DEBUG_SH}) | ||||
| CPPFLAGS+=	${_RC_DEBUG} | ||||
|  | ||||
| # Should we enable this with a different flag? | ||||
| _LD_DEBUG_SH=	case "${DEBUG}" in "") echo "";; *) echo "-Wl,--rpath=../librc -Wl,--rpath=../libeinfo";; esac | ||||
| _LD_DEBUG!=	${_LD_DEBUG_SH} | ||||
| LDFLAGS+=	${_LD_DEBUG}$(shell ${_LD_DEBUG_SH}) | ||||
| _LD_DEBUG:=	$(shell ${_LD_DEBUG_SH}) | ||||
| LDFLAGS+=	${_LD_DEBUG} | ||||
|  | ||||
| _GGDB_SH=	case "${DEBUG}" in "") echo "";; *) echo "-ggdb";; esac | ||||
| _GGDB!=		${_GGDB_SH} | ||||
| CFLAGS+=	${_GGDB}$(shell ${_GGDB_SH}) | ||||
| _GGDB:=		$(shell ${_GGDB_SH}) | ||||
| CFLAGS+=	${_GGDB} | ||||
|   | ||||
| @@ -1,2 +0,0 @@ | ||||
| # This space left intentionally blank because gmake does not load .depend | ||||
| # by default | ||||
| @@ -1,3 +0,0 @@ | ||||
| # Tell gmake to include the optional dependency file. | ||||
| # This sucks, but I don't know any other way of portably making this work. | ||||
| -include .depend | ||||
| @@ -10,9 +10,4 @@ IGNOREFILES+=	.depend | ||||
|  | ||||
| depend: .depend extra_depend | ||||
|  | ||||
| # Nasty hack. depend-.mk is a blank file, depend-gmake.mk has a gmake specific | ||||
| # command to optionally include .depend. | ||||
| # Someone should patch gmake to optionally include .depend if it exists. | ||||
| _INC_DEP=	$(shell if ${MAKE} --version | grep -q "^GNU "; then \ | ||||
| 		echo "gmake"; else echo ""; fi) | ||||
| include ${MK}/depend-${_INC_DEP}.mk | ||||
| -include .depend | ||||
|   | ||||
							
								
								
									
										11
									
								
								mk/dist.mk
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								mk/dist.mk
									
									
									
									
									
								
							| @@ -9,14 +9,21 @@ DISTFILE?=	${DISTPREFIX}.tar.bz2 | ||||
| CLEANFILES+=	${NAME}-*.tar.bz2 | ||||
|  | ||||
| _SNAP_SH=	date -u +%Y%m%d%H%M | ||||
| _SNAP!=		${_SNAP_SH} | ||||
| SNAP=		${_SNAP}$(shell ${_SNAP_SH}) | ||||
| _SNAP:=		$(shell ${_SNAP_SH}) | ||||
| SNAP=		${_SNAP} | ||||
| SNAPDIR=	${DISTPREFIX}-${SNAP} | ||||
| SNAPFILE=	${SNAPDIR}.tar.bz2 | ||||
|  | ||||
| dist: | ||||
| 	git archive --prefix=${DISTPREFIX}/ ${GITREF} | bzip2 > ${DISTFILE} | ||||
|  | ||||
| distcheck: dist | ||||
| 	rm -rf ${DISTPREFIX} | ||||
| 	tar xf ${DISTFILE} | ||||
| 	MAKEFLAGS= $(MAKE) -C ${DISTPREFIX} | ||||
| 	MAKEFLAGS= $(MAKE) -C ${DISTPREFIX} check | ||||
| 	rm -rf ${DISTPREFIX} | ||||
|  | ||||
| snapshot: | ||||
| 	rm -rf /tmp/${SNAPDIR} | ||||
| 	mkdir /tmp/${SNAPDIR} | ||||
|   | ||||
| @@ -4,5 +4,5 @@ _GITVER_SH=	if git rev-parse --short HEAD >/dev/null 2>&1; then \ | ||||
| 		else \ | ||||
| 			echo ""; \ | ||||
| 		fi | ||||
| _GITVER!=	${_GITVER_SH} | ||||
| GITVER=		${_GITVER}$(shell ${_GITVER_SH}) | ||||
| _GITVER:=	$(shell ${_GITVER_SH}) | ||||
| GITVER=		${_GITVER} | ||||
|   | ||||
| @@ -38,7 +38,7 @@ ${SHLIB_NAME}:	${SOBJS} | ||||
| 	@${ECHO} building shared library $@ | ||||
| 	@rm -f $@ ${SHLIB_LINK} | ||||
| 	@ln -fs $@ ${SHLIB_LINK} | ||||
| 	${CC} ${LDFLAGS} -shared -Wl,-x \ | ||||
| 	${CC} ${CFLAGS} ${LDFLAGS} -shared -Wl,-x \ | ||||
| 	-o $@ -Wl,-soname,${SONAME} \ | ||||
| 	${SOBJS} ${LDADD} | ||||
|  | ||||
|   | ||||
| @@ -1,3 +0,0 @@ | ||||
| LIBTERMCAP?=	-lncurses | ||||
| CPPFLAGS+=	-DHAVE_TERMCAP | ||||
| LDADD+=		${LIBTERMCAP} | ||||
							
								
								
									
										4
									
								
								mk/os.mk
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								mk/os.mk
									
									
									
									
									
								
							| @@ -4,8 +4,8 @@ | ||||
| # Generic definitions | ||||
|  | ||||
| _OS_SH=		uname -s | ||||
| _OS!= 		${_OS_SH} | ||||
| OS?= 		${_OS}$(shell ${_OS_SH}) | ||||
| _OS:= 		$(shell ${_OS_SH}) | ||||
| OS?= 		${_OS} | ||||
| include ${MK}/os-${OS}.mk | ||||
|  | ||||
| RC_LIB=		/$(LIBNAME)/rc | ||||
|   | ||||
| @@ -1,6 +1,10 @@ | ||||
| ifeq (${MKPAM},pam) | ||||
| LIBPAM?=	-lpam | ||||
| CPPFLAGS+=	-DHAVE_PAM | ||||
| LDADD+=		${LIBPAM} | ||||
|  | ||||
| PAMDIR?=	/etc/pam.d | ||||
| PAMMODE?=	0644 | ||||
| else ifneq (${MKPAM},) | ||||
| $(error if MKPAM is defined, it must be "pam") | ||||
| endif | ||||
|   | ||||
| @@ -15,8 +15,8 @@ _DYNLINK_SH=		if test "${PREFIX}" = "" && test -e /libexec/ld.elf_so; then \ | ||||
| 			else \ | ||||
| 				echo ""; \ | ||||
| 			fi | ||||
| _DYNLINK!=		${_DYNLINK_SH} | ||||
| LDFLAGS+=		${_DYNLINK}$(shell ${_DYNLINK_SH}) | ||||
| _DYNLINK:=		$(shell ${_DYNLINK_SH}) | ||||
| LDFLAGS+=		${_DYNLINK} | ||||
| LDFLAGS+=		-Wl,-rpath=${PREFIX}/${LIBNAME} | ||||
| LDFLAGS+=		${PROGLDFLAGS} | ||||
|  | ||||
| @@ -28,7 +28,7 @@ all: depend ${PROG} | ||||
| 	${CC} ${CFLAGS} ${CPPFLAGS} -c $< -o $@ | ||||
|  | ||||
| ${PROG}: ${SCRIPTS} ${OBJS} | ||||
| 	${CC} ${LDFLAGS} -o $@ ${OBJS} ${LDADD} | ||||
| 	${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS} ${LDADD} | ||||
|  | ||||
| clean: | ||||
| 	rm -f ${CLEANFILES} | ||||
|   | ||||
| @@ -8,11 +8,11 @@ include ${MK}/os.mk | ||||
| OBJS+=	${SRCS:.in=} | ||||
|  | ||||
| _PKG_SED_SH=		if test "${PREFIX}" = "${PKG_PREFIX}"; then echo "-e 's:@PKG_PREFIX@::g'"; else echo "-e 's:@PKG_PREFIX@:${PKG_PREFIX}:g'"; fi | ||||
| _PKG_SED!=		${_PKG_SED_SH} | ||||
| _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!=		${_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' ${_PKG_SED}$(shell ${_PKG_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} | ||||
|  | ||||
| # Tweak our shell scripts | ||||
| .SUFFIXES:	.sh.in .in | ||||
|   | ||||
| @@ -12,8 +12,8 @@ SH=			/bin/sh | ||||
|  | ||||
| PREFIX?=	 | ||||
| _UPREFIX_SH=		case "${PREFIX}" in "") echo /usr;; *) echo "${PREFIX}";; esac | ||||
| _UPREFIX!=		${_UPREFIX_SH} | ||||
| UPREFIX=		${_UPREFIX}$(shell ${_UPREFIX_SH}) | ||||
| _UPREFIX:=		$(shell ${_UPREFIX_SH}) | ||||
| UPREFIX=		${_UPREFIX} | ||||
| LOCAL_PREFIX=		/usr/local | ||||
|  | ||||
| PICFLAG?=		-fPIC | ||||
| @@ -21,6 +21,7 @@ PICFLAG?=		-fPIC | ||||
| SYSCONFDIR?=		${PREFIX}/etc | ||||
| INITDIR?=		${SYSCONFDIR}/init.d | ||||
| CONFDIR?=		${SYSCONFDIR}/conf.d | ||||
| LOCALDIR?=		${SYSCONFDIR}/local.d | ||||
|  | ||||
| BINDIR?=		${PREFIX}/sbin | ||||
| BINMODE?=		0755 | ||||
| @@ -29,8 +30,8 @@ INCDIR?=		${UPREFIX}/include | ||||
| INCMODE?=		0444 | ||||
|  | ||||
| _LIBNAME_SH=		case `readlink /lib` in /lib64|lib64) echo "lib64";; *) echo "lib";; esac | ||||
| _LIBNAME!=		${_LIBNAME_SH} | ||||
| LIBNAME?=		${_LIBNAME}$(shell ${_LIBNAME_SH}) | ||||
| _LIBNAME:=		$(shell ${_LIBNAME_SH}) | ||||
| LIBNAME?=		${_LIBNAME} | ||||
| LIBDIR?=		${UPREFIX}/${LIBNAME} | ||||
| LIBMODE?=		0444 | ||||
| SHLIBDIR?=		${PREFIX}/${LIBNAME} | ||||
|   | ||||
| @@ -1,3 +1,11 @@ | ||||
| ifeq (${MKTERMCAP},ncurses) | ||||
| LIBTERMCAP?=	-lncurses | ||||
| CPPFLAGS+=	-DHAVE_TERMCAP | ||||
| LDADD+=		${LIBTERMCAP} | ||||
| else ifeq (${MKTERMCAP},termcap) | ||||
| LIBTERMCAP?=	-ltermcap | ||||
| CPPFLAGS+=	-DHAVE_TERMCAP | ||||
| LDADD+=		${LIBTERMCAP} | ||||
| else ifneq (${MKTERMCAP},) | ||||
| $(error If MKTERMCAP is defined, it must be ncurses or termcap) | ||||
| endif | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| SRCS+=		iwconfig.sh.in | ||||
| INC+=		adsl.sh apipa.sh arping.sh bonding.sh br2684ctl.sh bridge.sh \ | ||||
| 		ccwgroup.sh clip.sh iproute2.sh ifplugd.sh ip6to4.sh ipppd.sh \ | ||||
| 		iwconfig.sh netplugd.sh pppd.sh pump.sh tuntap.sh udhcpc.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 \ | ||||
| 		vlan.sh | ||||
|  | ||||
| .SUFFIXES:	.sh.Linux.in | ||||
|   | ||||
| @@ -100,9 +100,9 @@ bonding_pre_start() | ||||
| 		if [ -n "${primary}" ]; then | ||||
| 			echo "+${primary}" >/sys/class/net/"${IFACE}"/bonding/slaves | ||||
| 			echo "${primary}" >/sys/class/net/"${IFACE}"/bonding/primary | ||||
| 			slaves="${slaves/${primary}/}" | ||||
| 		fi | ||||
| 		for s in ${slaves}; do | ||||
| 			[ "${s}" = "${primary}" ] && continue | ||||
| 			echo "+${s}" >/sys/class/net/"${IFACE}"/bonding/slaves | ||||
| 		done | ||||
| 	else | ||||
|   | ||||
							
								
								
									
										114
									
								
								net/bridge.sh
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								net/bridge.sh
									
									
									
									
									
								
							| @@ -11,34 +11,64 @@ _config_vars="$_config_vars bridge bridge_add brctl" | ||||
|  | ||||
| _is_bridge() | ||||
| { | ||||
| 	# Ignore header line so as to allow for bridges named 'bridge' | ||||
| 	brctl show 2>/dev/null | sed '1,1d' | grep -q "^${IFACE}[[:space:]]" | ||||
| 	[ -d /sys/class/net/"${1:-${IFACE}}"/bridge ] | ||||
| 	return $? | ||||
| } | ||||
|  | ||||
| _is_bridge_port() | ||||
| { | ||||
| 	[ -d /sys/class/net/"${1:-${IFACE}}"/brport ] | ||||
| 	return $? | ||||
| } | ||||
|  | ||||
| _bridge_ports() | ||||
| { | ||||
| 	for x in /sys/class/net/"${1:-${IFACE}}"/brif/*; do | ||||
| 		n=${x##*/} | ||||
| 		echo $n | ||||
| 	done | ||||
| } | ||||
|  | ||||
| bridge_pre_start() | ||||
| { | ||||
| 	local brif= iface="${IFACE}" e= x= | ||||
| 	local brif= oiface="${IFACE}" e= x= | ||||
| 	# ports is for static add | ||||
| 	local ports="$(_get_array "bridge_${IFVAR}")" | ||||
| 	# old config options | ||||
| 	local opts="$(_get_array "brctl_${IFVAR}")" | ||||
| 	 | ||||
| 	# brif is used for dynamic add | ||||
| 	eval brif=\$bridge_add_${IFVAR} | ||||
| 	eval x=\${bridge_${IFVAR}-y\} | ||||
| 	if [ -z "${brif}" -a -z "${opts}" ]; then | ||||
| 		[ -n "${ports}" -o "${x}" != "y" ] || return 0 | ||||
|  | ||||
| 	# we need a way to if the bridge exists in a variable name, not just the | ||||
| 	# contents of a variable. Eg if somebody has only bridge_add_eth0='br0', | ||||
| 	# with no other lines mentioning br0. | ||||
| 	eval bridge_unset=\${bridge_${IFVAR}-y\} | ||||
| 	eval brctl_unset=\${brctl_${IFVAR}-y\} | ||||
|  | ||||
| 	if [ -z "${brif}" -a "${brctl_unset}" = 'y' ]; then | ||||
| 		if [ -z "${ports}" -a "${bridge_unset}" = "y" ]; then | ||||
| 			#eerror "Misconfigured static bridge detected (see net.example)" | ||||
| 			return 0 | ||||
| 		fi | ||||
| 	fi | ||||
|  | ||||
| 	[ -n "${ports}" ] && bridge_post_stop | ||||
| 	# If the bridge was already up, we should clear it | ||||
| 	[ "${bridge_unset}" != "y" ] && bridge_post_stop | ||||
|  | ||||
| 	( | ||||
| 	# Normalize order of variables | ||||
| 	if [ -z "${ports}" -a -n "${brif}" ]; then | ||||
| 		# Dynamic mode detected | ||||
| 		ports="${IFACE}" | ||||
| 		IFACE="${brif}" | ||||
| 		IFVAR=$(shell_var "${IFACE}") | ||||
| 	else | ||||
| 		# Static mode detected | ||||
| 		ports="${ports}" | ||||
| 		metric=1000 | ||||
| 	fi | ||||
|  | ||||
| 	if ! _is_bridge; then | ||||
| 	if ! _is_bridge ; then | ||||
| 		ebegin "Creating bridge ${IFACE}" | ||||
| 		if ! brctl addbr "${IFACE}"; then | ||||
| 			eend 1 | ||||
| @@ -46,6 +76,12 @@ bridge_pre_start() | ||||
| 		fi | ||||
| 	fi | ||||
|  | ||||
| 	# TODO: does this reset the bridge every time we add a interface to the | ||||
| 	# bridge? We should probably NOT do that. | ||||
|  | ||||
| 	# Old configuration set mechanism | ||||
| 	# Only a very limited subset of the options are available in the old | ||||
| 	# configuration method. The sysfs interface is in the next block instead. | ||||
| 	local IFS="$__IFS" | ||||
| 	for x in ${opts}; do | ||||
| 		unset IFS | ||||
| @@ -57,21 +93,50 @@ bridge_pre_start() | ||||
| 	done | ||||
| 	unset IFS | ||||
|  | ||||
| 	# New configuration set mechanism, matches bonding | ||||
| 	for x in /sys/class/net/"${IFACE}"/bridge/*; do | ||||
| 		[ -f "${x}" ] || continue | ||||
| 		n=${x##*/} | ||||
| 		eval s=\$${n}_${IFVAR} | ||||
| 		if [ -n "${s}" ]; then | ||||
| 			einfo "Setting ${n}: ${s}" | ||||
| 			echo "${s}" >"${x}" || \ | ||||
| 			eerror "Failed to configure $n (${n}_${IFVAR})" | ||||
| 		fi | ||||
| 	done | ||||
|  | ||||
| 	if [ -n "${ports}" ]; then | ||||
| 		einfo "Adding ports to ${IFACE}" | ||||
| 		eindent | ||||
|  | ||||
| 		local OIFACE="${IFACE}" | ||||
| 		local BR_IFACE="${IFACE}" | ||||
| 		for x in ${ports}; do | ||||
| 			ebegin "${x}" | ||||
| 			local IFACE="${x}" | ||||
| 			local IFVAR=$(shell_var "${IFACE}") | ||||
| 			if ! _exists "${IFACE}" ; then | ||||
| 				eerror "Cannot add non-existent interface ${IFACE} to ${BR_IFACE}" | ||||
| 				return 1 | ||||
| 			fi | ||||
| 			# The interface is known to exist now | ||||
| 			_set_flag promisc | ||||
| 			_up | ||||
| 			if ! brctl addif "${OIFACE}" "${x}"; then | ||||
| 			if ! brctl addif "${BR_IFACE}" "${x}"; then | ||||
| 				_set_flag -promisc | ||||
| 				eend 1 | ||||
| 				return 1 | ||||
| 			fi | ||||
| 			# Per-interface bridge settings | ||||
| 			for x in /sys/class/net/"${IFACE}"/brport/*; do | ||||
| 				[ -f "${x}" ] || continue | ||||
| 				n=${x##*/} | ||||
| 				eval s=\$${n}_${IFVAR} | ||||
| 				if [ -n "${s}" ]; then | ||||
| 					einfo "Setting ${n}@${IFACE}: ${s}" | ||||
| 					echo "${s}" >"${x}" || \ | ||||
| 					eerror "Failed to configure $n (${n}_${IFVAR})" | ||||
| 				fi | ||||
| 			done | ||||
| 			eend 0 | ||||
| 		done | ||||
| 		eoutdent | ||||
| @@ -86,27 +151,24 @@ bridge_post_stop() | ||||
| { | ||||
| 	local port= ports= delete=false extra= | ||||
|  | ||||
| 	if _is_bridge; then | ||||
| 	if _is_bridge "${IFACE}"; then | ||||
| 		ebegin "Destroying bridge ${IFACE}" | ||||
| 		_down | ||||
| 		# Ignore header line so as to allow for bridges named 'bridge' | ||||
| 		ports="$(brctl show 2>/dev/null | \ | ||||
| 			sed -n -e '1,1d' -e '/^'"${IFACE}"'[[:space:]]/,/^\S/ { /^\('"${IFACE}"'[[:space:]]\|\t\)/s/^.*\t//p }')" | ||||
| 		for x in /sys/class/net/"${IFACE}"/brif/*; do | ||||
| 			[ -s $x ] || continue | ||||
| 			n=${x##*/} | ||||
| 			ports="${ports} ${n}" | ||||
| 		done | ||||
| 		delete=true | ||||
| 		iface=${IFACE} | ||||
| 		eindent | ||||
| 	else | ||||
| 		# Work out if we're added to a bridge for removal or not | ||||
| 		# Ignore header line so as to allow for bridges named 'bridge' | ||||
| 		eval set -- $(brctl show 2>/dev/null | sed -e '1,1d' -e "s/'/'\\\\''/g" -e "s/$/'/g" -e "s/^/'/g") | ||||
| 		local line= | ||||
| 		for line; do | ||||
| 			set -- ${line} | ||||
| 			if [ "$3" = "${IFACE}" ]; then | ||||
| 				iface=$1 | ||||
| 				break | ||||
| 			fi | ||||
| 		done | ||||
| 		# We are taking down an interface that is part of a bridge maybe | ||||
| 		ports="${IFACE}" | ||||
| 		local brport_dir="/sys/class/net/${IFACE}/brport" | ||||
| 		[ -d ${brport_dir} ] || return 0 | ||||
| 		iface=$(readlink ${brport_dir}/bridge) | ||||
| 		iface=${iface##*/} | ||||
| 		[ -z "${iface}" ] && return 0 | ||||
| 		extra=" from ${iface}" | ||||
| 	fi | ||||
|   | ||||
							
								
								
									
										54
									
								
								net/ethtool.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								net/ethtool.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| # Copyright (c) 2011 by Gentoo Foundation | ||||
| # All rights reserved. Released under the 2-clause BSD license. | ||||
|  | ||||
| _ethtool() { | ||||
| 	echo /usr/sbin/ethtool | ||||
| } | ||||
|  | ||||
| ethtool_depend() | ||||
| { | ||||
| 	program $(_ethtool) | ||||
| 	before interface | ||||
| } | ||||
|  | ||||
| # This is just to trim whitespace, do not add any quoting! | ||||
| _trim() { | ||||
| 	echo $* | ||||
| } | ||||
|  | ||||
| ethtool_pre_start() { | ||||
| 	local order opt OFS="${OIFS}" | ||||
| 	eval order=\$ethtool_order_${IFVAR} | ||||
| 	[ -z "${order}" ] && eval order=\$ethtool_order | ||||
| 	[ -z "${order}" ] && order="flash change-eeprom change pause coalesce ring offload identify nfc rxfh-indir ntuple" | ||||
| 	# ethtool options not used: --driver, --register-dump, --eeprom-dump, --negotiate, --test, --statistics | ||||
| 	eindent | ||||
| 	for opt in ${order} ; do | ||||
| 		local args | ||||
| 		eval args=\$ethtool_${opt//-/_}_${IFVAR} | ||||
|  | ||||
| 		# Skip everything if no arguments | ||||
| 		[ -z "${args}" ] && continue | ||||
| 		 | ||||
| 		# Split on \n | ||||
| 		local IFS="$__IFS" | ||||
|  | ||||
| 		for p in ${args} ; do | ||||
| 			IFS="${OIFS}" | ||||
| 			local args_pretty="$(_trim "${p}")" | ||||
| 			# Do nothing if empty | ||||
| 			[ -z "${args_prety}" ] && continue | ||||
| 			args_pretty="--${opt} $IFACE ${args_pretty}" | ||||
| 			args="--${opt} $IFACE ${args}" | ||||
| 			ebegin "ethtool ${args_pretty}" | ||||
| 			$(_ethtool) ${args} | ||||
| 			rc=$? | ||||
| 			eend $rc "ethtool exit code $rc" | ||||
| 			# TODO: ethtool has MANY different exit codes, with no | ||||
| 			# documentation as to which ones are fatal or not. For now we | ||||
| 			# simply print the exit code and don't stop the start sequence. | ||||
| 		done | ||||
| 		IFS="${OIFS}" | ||||
| 	done | ||||
| 	eoutdent | ||||
| } | ||||
| @@ -172,7 +172,7 @@ _add_address() | ||||
| 					cmd="${cmd} broadcast" | ||||
| 				fi | ||||
| 				;; | ||||
| 			peer) cmd="${cmd} pointtopoint";; | ||||
| 			peer) cmd="${cmd} pointopoint";; | ||||
| 			*) cmd="${cmd} $1";; | ||||
| 		esac | ||||
| 		shift | ||||
|   | ||||
| @@ -118,7 +118,12 @@ _add_address() | ||||
| 		set -- "${one}/$(_netmask2cidr "${three}")" "$@" | ||||
| 	fi | ||||
|  | ||||
| 	#config=( "${config[@]//pointopoint/peer}" ) | ||||
| 	# tunnel keyword is 'peer' in iproute2, but 'pointopoint' in ifconfig. | ||||
| 	if [ "$2" = "pointopoint" ]; then | ||||
| 		local one="$1" | ||||
| 		shift; shift | ||||
| 		set -- "${one}" "peer" "$@" | ||||
| 	fi | ||||
|  | ||||
| 	# Always scope lo addresses as host unless specified otherwise | ||||
| 	if [ "${IFACE}" = "lo" ]; then | ||||
| @@ -136,6 +141,7 @@ _add_address() | ||||
| 			;; | ||||
| 	esac | ||||
|  | ||||
| 	veinfo ip addr add "$@" dev "${IFACE}" | ||||
| 	ip addr add "$@" dev "${IFACE}" | ||||
| } | ||||
|  | ||||
| @@ -175,6 +181,7 @@ _add_route() | ||||
| 		cmd="${cmd} metric ${metric}" | ||||
| 	fi | ||||
|  | ||||
| 	veinfo ip ${family} route append ${cmd} dev "${IFACE}" | ||||
| 	ip ${family} route append ${cmd} dev "${IFACE}" | ||||
| 	eend $? | ||||
| } | ||||
| @@ -199,6 +206,32 @@ _tunnel() | ||||
| 	ip tunnel "$@" | ||||
| } | ||||
|  | ||||
| # This is just to trim whitespace, do not add any quoting! | ||||
| _trim() { | ||||
| 	echo $* | ||||
| } | ||||
|  | ||||
| # This is our interface to Routing Policy Database RPDB | ||||
| # This allows for advanced routing tricks | ||||
| _ip_rule_runner() { | ||||
| 	local cmd rules OIFS="${IFS}" | ||||
| 	cmd="$1" | ||||
| 	rules="$2" | ||||
| 	veindent | ||||
| 	local IFS="$__IFS" | ||||
| 	for ru in $rules ; do | ||||
| 		unset IFS | ||||
| 		ruN="$(_trim "${ru}")" | ||||
| 		[ -z "${ruN}" ] && continue | ||||
| 		vebegin "${cmd} ${ruN}" | ||||
| 		ip rule ${cmd} ${ru} | ||||
| 		veend $? | ||||
| 		local IFS="$__IFS" | ||||
| 	done | ||||
| 	IFS="${OIFS}" | ||||
| 	veoutdent | ||||
| } | ||||
|  | ||||
| iproute2_pre_start() | ||||
| { | ||||
| 	local tunnel= | ||||
| @@ -206,9 +239,14 @@ iproute2_pre_start() | ||||
| 	if [ -n "${tunnel}" ]; then | ||||
| 		# Set our base metric to 1000 | ||||
| 		metric=1000 | ||||
| 		# Bug#347657: If the mode is 'ipip6' or 'ip6ip6', the -6 must be passed | ||||
| 		# to iproute2 during tunnel creation. | ||||
| 		local ipproto='' | ||||
| 		[ "${tunnel##mode ipip6}" != "${tunnel}" ] && ipproto='-6' | ||||
| 		[ "${tunnel##mode ip6ip6}" != "${tunnel}" ] && ipproto='-6' | ||||
|  | ||||
| 		ebegin "Creating tunnel ${IFVAR}" | ||||
| 		ip tunnel add ${tunnel} name "${IFACE}" | ||||
| 		ip ${ipproto} tunnel add ${tunnel} name "${IFACE}" | ||||
| 		eend $? || return 1 | ||||
| 		_up | ||||
| 	fi | ||||
| @@ -240,6 +278,16 @@ iproute2_post_start() | ||||
|  | ||||
| 	# Kernel may not have IP built in | ||||
| 	if [ -e /proc/net/route ]; then | ||||
| 		local rules="$(_get_array "rules_${IFVAR}")" | ||||
| 		if [ -n "${rules}" ]; then | ||||
| 			if ! ip rule list | grep -q "^"; then | ||||
| 				eerror "IP Policy Routing (CONFIG_IP_MULTIPLE_TABLES) needed for ip rule" | ||||
| 			else | ||||
| 				service_set_value "ip_rule" "${rules}" | ||||
| 				einfo "Adding RPDB rules" | ||||
| 				_ip_rule_runner add "${rules}" | ||||
| 			fi | ||||
| 		fi | ||||
| 		ip route flush table cache dev "${IFACE}" | ||||
| 	fi | ||||
|  | ||||
| @@ -259,6 +307,16 @@ iproute2_post_start() | ||||
|  | ||||
| iproute2_post_stop() | ||||
| { | ||||
| 	# Kernel may not have IP built in | ||||
| 	if [ -e /proc/net/route ]; then | ||||
| 		local rules="$(service_get_value "ip_rule")" | ||||
| 		if [ -n "${rules}" ]; then | ||||
| 			einfo "Removing RPDB rules" | ||||
| 			_ip_rule_runner del "${rules}" | ||||
| 		fi | ||||
| 		ip route flush table cache dev "${IFACE}" | ||||
| 	fi | ||||
|  | ||||
| 	# Don't delete sit0 as it's a special tunnel | ||||
| 	if [ "${IFACE}" != "sit0" ]; then | ||||
| 		if [ -n "$(ip tunnel show "${IFACE}" 2>/dev/null)" ]; then | ||||
|   | ||||
							
								
								
									
										58
									
								
								net/vlan.sh
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								net/vlan.sh
									
									
									
									
									
								
							| @@ -1,9 +1,18 @@ | ||||
| # Copyright (c) 2007-2008 Roy Marples <roy@marples.name> | ||||
| # All rights reserved. Released under the 2-clause BSD license. | ||||
|  | ||||
| _ip() | ||||
| { | ||||
| 	if [ -x /bin/ip ]; then | ||||
| 		echo /bin/ip | ||||
| 	else | ||||
| 		echo /sbin/ip | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| vlan_depend() | ||||
| { | ||||
| 	program /sbin/vconfig | ||||
| 	program $(_ip) | ||||
| 	after interface | ||||
| 	before dhcp | ||||
| } | ||||
| @@ -36,31 +45,12 @@ _check_vlan() | ||||
|  | ||||
| vlan_pre_start() | ||||
| { | ||||
| 	local vc="$(_get_array "vconfig_${IFVAR}")" | ||||
| 	[ -z "${vc}" ] && return 0 | ||||
|  | ||||
| 	_check_vlan || return 1 | ||||
| 	_exists || return 1 | ||||
|  | ||||
| 	local v= x= e= | ||||
| 	local IFS="$__IFS" | ||||
| 	for v in ${vc}; do | ||||
| 		unset IFS | ||||
| 		case "${v}" in | ||||
| 			set_name_type" "*) x=${v};; | ||||
| 			*) | ||||
| 				set -- ${v} | ||||
| 				x="$1 ${IFACE}" | ||||
| 				shift | ||||
| 				x="${x} $@" | ||||
| 				;; | ||||
| 		esac | ||||
|  | ||||
| 		e="$(vconfig ${x} 2>&1 1>/dev/null)" | ||||
| 		[ -z "${e}" ] && continue | ||||
| 		eerror "${e}" | ||||
| 	local vconfig | ||||
| 	eval vconfig=\$vconfig_${IFVAR} | ||||
| 	if [ -n "${vconfig}" ]; then | ||||
| 		eerror "You must convert your vconfig_ VLAN entries to vlan${N} entries." | ||||
| 		return 1 | ||||
| 	done | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| vlan_post_start() | ||||
| @@ -72,10 +62,22 @@ vlan_post_start() | ||||
| 	_check_vlan || return 1 | ||||
| 	_exists || return 1 | ||||
|  | ||||
| 	local vlan= e= s= | ||||
| 	local vlan= e= s= vname= vflags= vingress= vegress= | ||||
| 	for vlan in ${vlans}; do | ||||
| 		einfo "Adding VLAN ${vlan} to ${IFACE}" | ||||
| 		e="$(vconfig add "${IFACE}" "${vlan}" 2>&1 1>/dev/null)" | ||||
| 		# We need to gather all interface configuration options | ||||
| 		# 1) naming. Default to the standard "${IFACE}.${vlan}" but it can be anything | ||||
| 		eval vname=\$vlan${vlan}_name | ||||
| 		[ -z "${vname}" ] && vname="${IFACE}.${vlan}" | ||||
| 		# 2) flags | ||||
| 		eval vflags=\$vlan${vlan}_flags | ||||
| 		# 3) ingress/egress map | ||||
| 		eval vingress=\$vlan${vlan}_ingress | ||||
| 		[ -z "${vingress}" ] || vingress="ingress-qos-map ${vingress}" | ||||
| 		eval vegress=\$vlan${vlan}_egress | ||||
| 		[ -z "${vegress}" ] || vegress="egress-qos-map ${vegress}" | ||||
|  | ||||
| 		e="$(ip link add link "${IFACE}" name "${vname}" type vlan id "${vlan}" ${vflags} ${vingress} ${vegress} 2>&1 1>/dev/null)" | ||||
| 		if [ -n "${e}" ]; then | ||||
| 			eend 1 "${e}" | ||||
| 			continue | ||||
| @@ -110,7 +112,7 @@ vlan_post_stop() | ||||
| 			stop | ||||
| 		) && { | ||||
| 			mark_service_stopped "net.${vlan}" | ||||
| 			vconfig rem "${vlan}" >/dev/null | ||||
| 			ip link delete "${vlan}" type vlan >/dev/null | ||||
| 		} | ||||
| 	done | ||||
|  | ||||
|   | ||||
| @@ -3,10 +3,14 @@ | ||||
|  | ||||
| wpa_supplicant_depend() | ||||
| { | ||||
| 	if [ -x /usr/sbin/wpa_supplicant ]; then | ||||
| 		program start /usr/sbin/wpa_supplicant | ||||
| 	else | ||||
| 		program start /sbin/wpa_supplicant | ||||
| 	wpas=/usr/sbin/wpa_supplicant | ||||
| 	[ -x ${wpas} ] || wpas=/sbin/wpa_supplicant | ||||
| 	if [ -x ${wpas} ]; then | ||||
| 		program start ${wpas} | ||||
| 		# bug 345281: if wpa_supplicant is built w/ USE=dbus, we need to start | ||||
| 		# dbus before we can start wpa_supplicant. | ||||
| 		${wpas} -h |grep DBus -sq | ||||
| 		[ $? -eq 0 ] && need dbus | ||||
| 	fi | ||||
| 	after macnet plug | ||||
| 	before interface | ||||
|   | ||||
| @@ -6,6 +6,17 @@ | ||||
| # 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 | ||||
| @@ -16,8 +27,12 @@ mount_svcdir() | ||||
|  | ||||
| 	# Some buggy kernels report tmpfs even when not present :( | ||||
| 	if grep -Eq "[[:space:]]+tmpfs$" /proc/filesystems; then | ||||
| 		mount -n -t tmpfs $fsopts,mode=755,size=${svcsize}k \ | ||||
| 			rc-svcdir "$RC_SVCDIR" && return 0 | ||||
| 		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 | ||||
| @@ -38,6 +53,10 @@ mount_svcdir() | ||||
| 	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 | ||||
| @@ -46,19 +65,27 @@ mount_svcdir() | ||||
| # By default VServer already has /proc mounted, but OpenVZ does not! | ||||
| # However, some of our users have an old proc image in /proc | ||||
| # NFC how they managed that, but the end result means we have to test if | ||||
| # /proc actually works or not. We to this by comparing uptime to one a second | ||||
| # ago | ||||
| # /proc actually works or not. We to this by comparing two reads of | ||||
| # /proc/self/stat. They will not match, because at least the minor fault count | ||||
| # field (field 10) should have changed. | ||||
| # | ||||
| # We can use any file here that fills the following requirements: | ||||
| # - changes between sequential reads | ||||
| # - is world-readable (not blocked in hardened kernel) | ||||
| # - Is only a single line (ergo entire check is doable with no forks) | ||||
| mountproc=true | ||||
| if [ -e /proc/uptime ]; then | ||||
| 	up="$(cat /proc/uptime)" | ||||
| 	sleep 1 | ||||
| 	if [ "$up" = "$(cat /proc/uptime)" ]; then | ||||
| f=/proc/self/stat | ||||
| if [ -e $f ]; then | ||||
| 	exec 9<$f ; read a <&9 ; exec 9<&- | ||||
| 	exec 9<$f ; read b <&9 ; exec 9<&- | ||||
| 	if [ "$a" = "$b" ]; then | ||||
| 		eerror "You have cruft in /proc that should be deleted" | ||||
| 	else | ||||
| 		einfo "/proc is already mounted, skipping" | ||||
| 		mountproc=false | ||||
| 	fi | ||||
| fi | ||||
| unset a b f | ||||
|  | ||||
| if $mountproc; then | ||||
| 	procfs="proc" | ||||
|   | ||||
| @@ -4,12 +4,24 @@ | ||||
| # Copyright (c) 2007-2009 Roy Marples <roy@marples.name> | ||||
| # All rights reserved. Released under the 2-clause BSD license. | ||||
|  | ||||
| . @SYSCONFDIR@/init.d/functions.sh | ||||
| . @LIBEXECDIR@/sh/rc-functions.sh | ||||
| sourcex() | ||||
| { | ||||
| 	if [ "$1" = "-e" ]; then | ||||
| 		shift | ||||
| 		[ -e "$1" ] || return 1 | ||||
| 	fi | ||||
| 	if ! . "$1"; then | ||||
| 		eerror "$RC_SVCNAME: error loading $1" | ||||
| 		exit 1 | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| sourcex "@SYSCONFDIR@/init.d/functions.sh" | ||||
| sourcex "@LIBEXECDIR@/sh/rc-functions.sh" | ||||
|  | ||||
| # Support LiveCD foo | ||||
| if [ -r /sbin/livecd-functions.sh ]; then | ||||
| 	. /sbin/livecd-functions.sh | ||||
| 	sourcex "/sbin/livecd-functions.sh" | ||||
| 	livecd_read_commandline | ||||
| fi | ||||
|  | ||||
| @@ -89,7 +101,7 @@ _status() | ||||
| 		return 0 | ||||
| 	else | ||||
| 		einfo "status: stopped" | ||||
| 		return 1 | ||||
| 		return 3 | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| @@ -145,30 +157,26 @@ _conf_d=${RC_SERVICE%/*}/../conf.d | ||||
| # If we're net.eth0 or openvpn.work then load net or openvpn config | ||||
| _c=${RC_SVCNAME%%.*} | ||||
| if [ -n "$_c" -a "$_c" != "$RC_SVCNAME" ]; then | ||||
| 	if [ -e "$_conf_d/$_c.$RC_RUNLEVEL" ]; then | ||||
| 		. "$_conf_d/$_c.$RC_RUNLEVEL" | ||||
| 	elif [ -e "$_conf_d/$_c" ]; then | ||||
| 		. "$_conf_d/$_c" | ||||
| 	if ! sourcex -e "$_conf_d/$_c.$RC_RUNLEVEL"; then | ||||
| 		sourcex -e "$_conf_d/$_c" | ||||
| 	fi | ||||
| fi | ||||
| unset _c | ||||
|  | ||||
| # Overlay with our specific config | ||||
| if [ -e "$_conf_d/$RC_SVCNAME.$RC_RUNLEVEL" ]; then | ||||
| 	. "$_conf_d/$RC_SVCNAME.$RC_RUNLEVEL" | ||||
| elif [ -e "$_conf_d/$RC_SVCNAME" ]; then | ||||
| 	. "$_conf_d/$RC_SVCNAME" | ||||
| if ! sourcex -e "$_conf_d/$RC_SVCNAME.$RC_RUNLEVEL"; then | ||||
| 	sourcex -e "$_conf_d/$RC_SVCNAME" | ||||
| fi | ||||
| unset _conf_d | ||||
|  | ||||
| # Load any system overrides | ||||
| [ -e @SYSCONFDIR@/rc.conf ] && . @SYSCONFDIR@/rc.conf | ||||
| sourcex -e "@SYSCONFDIR@/rc.conf" | ||||
|  | ||||
| # Apply any ulimit defined | ||||
| [ -n "${rc_ulimit:-$RC_ULIMIT}" ] && ulimit ${rc_ulimit:-$RC_ULIMIT} | ||||
|  | ||||
| # Load our script | ||||
| . "$RC_SERVICE" | ||||
| sourcex "$RC_SERVICE" | ||||
|  | ||||
| for _d in $required_dirs; do | ||||
| 	if [ ! -d $_d ]; then | ||||
|   | ||||
| @@ -10,4 +10,4 @@ MK=			../../mk | ||||
| include ${MK}/lib.mk | ||||
| include ${MK}/cc.mk | ||||
| include ${MK}/debug.mk | ||||
| include ${MK}/${MKTERMCAP}.mk | ||||
| include ${MK}/termcap.mk | ||||
|   | ||||
| @@ -19,21 +19,26 @@ SED_CMD=	-e 's:@PREFIX@:${PREFIX}:g' | ||||
| SED_CMD+=	-e 's:@LIB@:${LIBNAME}:g' | ||||
| SED_CMD+=	-e 's:@SYSCONFDIR@:${SYSCONFDIR}:g' | ||||
| SED_CMD+=	-e 's:@LIBEXECDIR@:${LIBEXECDIR}:g' | ||||
| _PKG_PREFIX_SH=	if test -n "${PKG_PREFIX}" && test "${PKG_PREFIX}" != "/" && test "${PKG_PREFIX}" != "${PREFIX}"; then \ | ||||
| 		echo "-e 's:@PKG_PREFIX@:${PKG_PREFIX}:g'"; \ | ||||
| 		else \ | ||||
| 		echo "-e 's:.*@PKG_PREFIX@.*:\#undef RC_PKG_PREFIX:g'"; \ | ||||
| 		fi | ||||
| _PKG_PREFIX!=	${_PKG_PREFIX_SH} | ||||
| SED_CMD+=	${_PKG_PREFIX}$(shell ${_PKG_PREFIX_SH}) | ||||
|  | ||||
| _LCL_PREFIX_SH=	if test -n "${LOCAL_PREFIX}" && test "${LOCAL_PREFIX}" != "/" && test "${LOCAL_PREFIX}" != "${PREFIX}"; then \ | ||||
| 		echo "-e 's:@LOCAL_PREFIX@:${LOCAL_PREFIX}:g'"; \ | ||||
| 		else \ | ||||
| 		echo "-e 's:@LOCAL_PREFIX@::g'"; \ | ||||
| 		fi | ||||
| _LCL_PREFIX!=	${_LCL_PREFIX_SH} | ||||
| SED_CMD+=	${_LCL_PREFIX}$(shell ${_LCL_PREFIX_SH}) | ||||
| _PKG_PREFIX=	-e 's:.*@PKG_PREFIX@.*:\#undef RC_PKG_PREFIX:g' | ||||
| ifneq (${PKG_PREFIX},) | ||||
| ifneq (${PKG_PREFIX},/) | ||||
| ifneq (${PKG_PREFIX},${PREFIX}) | ||||
| _PKG_PREFIX=	-e 's:@PKG_PREFIX@:${PKG_PREFIX}:g' | ||||
| endif | ||||
| endif | ||||
| endif | ||||
| SED_CMD+=	${_PKG_PREFIX} | ||||
|  | ||||
| _LCL_PREFIX=	-e 's:@LOCAL_PREFIX@::g' | ||||
| ifneq (${LOCAL_PREFIX},) | ||||
| ifneq (${LOCAL_PREFIX},/) | ||||
| ifneq (${LOCAL_PREFIX},${PREFIX}) | ||||
| _LCL_PREFIX=	-e 's:@LOCAL_PREFIX@:${LOCAL_PREFIX}:g' | ||||
| endif | ||||
| endif | ||||
| endif | ||||
| SED_CMD+=	${_LCL_PREFIX} | ||||
|  | ||||
| .SUFFIXES:	.h.in .h | ||||
| .h.in.h: | ||||
|   | ||||
| @@ -283,7 +283,7 @@ _match_daemon(const char *path, const char *file, RC_STRINGLIST *match) | ||||
| } | ||||
|  | ||||
| static RC_STRINGLIST * | ||||
| _match_list(const char *exec, const char* const* argv, const char *pidfile) | ||||
| _match_list(const char *exec, const char *const *argv, const char *pidfile) | ||||
| { | ||||
| 	RC_STRINGLIST *match = rc_stringlist_new(); | ||||
| 	int i = 0; | ||||
|   | ||||
| @@ -114,7 +114,13 @@ get_deptype(const RC_DEPINFO *depinfo, const char *type) | ||||
| } | ||||
|  | ||||
| RC_DEPTREE * | ||||
| rc_deptree_load(void) | ||||
| rc_deptree_load(void) { | ||||
| 	return rc_deptree_load_file(RC_DEPTREE_CACHE); | ||||
| } | ||||
| librc_hidden_def(rc_deptree_load) | ||||
|  | ||||
| RC_DEPTREE * | ||||
| rc_deptree_load_file(const char *deptree_file) | ||||
| { | ||||
| 	FILE *fp; | ||||
| 	RC_DEPTREE *deptree; | ||||
| @@ -127,7 +133,7 @@ rc_deptree_load(void) | ||||
| 	char *e; | ||||
| 	int i; | ||||
|  | ||||
| 	if (!(fp = fopen(RC_DEPTREE_CACHE, "r"))) | ||||
| 	if (!(fp = fopen(deptree_file, "r"))) | ||||
| 		return NULL; | ||||
|  | ||||
| 	deptree = xmalloc(sizeof(*deptree)); | ||||
| @@ -175,7 +181,7 @@ rc_deptree_load(void) | ||||
|  | ||||
| 	return deptree; | ||||
| } | ||||
| librc_hidden_def(rc_deptree_load) | ||||
| librc_hidden_def(rc_deptree_load_file) | ||||
|  | ||||
| static bool | ||||
| valid_service(const char *runlevel, const char *service, const char *type) | ||||
|   | ||||
| @@ -61,7 +61,7 @@ rc_getline(char **line, size_t *len, FILE *fp) | ||||
| 	char *p; | ||||
| 	size_t last = 0; | ||||
|  | ||||
| 	while(!feof(fp)) { | ||||
| 	while (!feof(fp)) { | ||||
| 		if (*line == NULL || last != 0) { | ||||
| 			*len += BUFSIZ; | ||||
| 			*line = xrealloc(*line, *len); | ||||
| @@ -218,3 +218,52 @@ rc_config_value(RC_STRINGLIST *list, const char *entry) | ||||
| 	return NULL; | ||||
| } | ||||
| librc_hidden_def(rc_config_value) | ||||
|  | ||||
| /* Global for caching the strings loaded from rc.conf to avoid reparsing for | ||||
|  * each rc_conf_value call */ | ||||
| static RC_STRINGLIST *rc_conf = NULL; | ||||
|  | ||||
| char * | ||||
| rc_conf_value(const char *setting) | ||||
| { | ||||
| 	RC_STRINGLIST *old; | ||||
| 	RC_STRING *s; | ||||
| 	char *p; | ||||
|  | ||||
| 	if (! rc_conf) { | ||||
| 		rc_conf = rc_config_load(RC_CONF); | ||||
| #ifdef DEBUG_MEMORY | ||||
| 		atexit(_free_rc_conf); | ||||
| #endif | ||||
|  | ||||
| 		/* Support old configs */ | ||||
| 		if (exists(RC_CONF_OLD)) { | ||||
| 			old = rc_config_load(RC_CONF_OLD); | ||||
| 			TAILQ_CONCAT(rc_conf, old, entries); | ||||
| #ifdef DEBUG_MEMORY | ||||
| 			free(old); | ||||
| #endif | ||||
| 		} | ||||
|  | ||||
| 		/* Convert old uppercase to lowercase */ | ||||
| 		TAILQ_FOREACH(s, rc_conf, entries) { | ||||
| 			p = s->value; | ||||
| 			while (p && *p && *p != '=') { | ||||
| 				if (isupper((unsigned char)*p)) | ||||
| 					*p = tolower((unsigned char)*p); | ||||
| 				p++; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return rc_config_value(rc_conf, setting); | ||||
| } | ||||
| librc_hidden_def(rc_conf_value) | ||||
|  | ||||
| #ifdef DEBUG_MEMORY | ||||
| static void | ||||
| _free_rc_conf(void) | ||||
| { | ||||
| 	rc_stringlist_free(rc_conf); | ||||
| } | ||||
| #endif | ||||
|   | ||||
| @@ -198,8 +198,54 @@ file_regex(const char *file, const char *regex) | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /* New sys identification code | ||||
|  * Not to be used for any binaries outside of openrc. */ | ||||
| const char * | ||||
| rc_sys(void) | ||||
| rc_sys_v2(void) | ||||
| { | ||||
| #define __STRING_SWITCH(x) { char *__string_switch = x; if (false) {} | ||||
| #define __STRING_CASE(y) else if (strcmp(__string_switch,y) == 0) | ||||
| #define __STRING_SWITCH_END() } | ||||
| 	char *systype = rc_conf_value("rc_sys"); | ||||
| 	if (systype) { | ||||
| 		char *s = systype; | ||||
| 		/* Convert to uppercase */ | ||||
| 		while (s && *s) { | ||||
| 			if (islower((unsigned char) *s)) | ||||
| 				*s = toupper((unsigned char) *s); | ||||
| 			s++; | ||||
| 		} | ||||
| 		/* Now do detection */ | ||||
| 		__STRING_SWITCH(systype) | ||||
| 		__STRING_CASE(RC_SYS_PREFIX)	{ return RC_SYS_PREFIX; } | ||||
| #ifdef __FreeBSD__ | ||||
| 		__STRING_CASE(RC_SYS_JAIL) { return RC_SYS_JAIL; } | ||||
| #endif /* __FreeBSD__ */ | ||||
| #ifdef __NetBSD__ | ||||
| 		__STRING_CASE(RC_SYS_XEN0) { return RC_SYS_XEN0; } | ||||
| 		__STRING_CASE(RC_SYS_XENU) { return RC_SYS_XENU; } | ||||
| #endif /* __NetBSD__ */ | ||||
| #ifdef __linux__ | ||||
| 		__STRING_CASE(RC_SYS_XEN0) { return RC_SYS_XEN0; } | ||||
| 		__STRING_CASE(RC_SYS_XENU) { return RC_SYS_XENU; } | ||||
| 		__STRING_CASE(RC_SYS_UML) { return RC_SYS_UML; } | ||||
| 		__STRING_CASE(RC_SYS_VSERVER) { return RC_SYS_VSERVER; } | ||||
| 		__STRING_CASE(RC_SYS_OPENVZ) { return RC_SYS_OPENVZ; } | ||||
| 		__STRING_CASE(RC_SYS_LXC) { return RC_SYS_LXC; } | ||||
| #endif /* __linux__ */ | ||||
| 		__STRING_SWITCH_END() | ||||
| 	} | ||||
| #undef __STRING_SWITCH | ||||
| #undef __STRING_CASE | ||||
| #undef __STRING_SWITCH_END | ||||
| 	return NULL; | ||||
| } | ||||
| librc_hidden_def(rc_sys_v2) | ||||
|  | ||||
| /* Old sys identification code. | ||||
|  * Not to be used for any binaries outside of openrc. */ | ||||
| const char * | ||||
| rc_sys_v1(void) | ||||
| { | ||||
| #ifdef PREFIX | ||||
| 	return RC_SYS_PREFIX; | ||||
| @@ -233,8 +279,6 @@ rc_sys(void) | ||||
| 		return RC_SYS_VSERVER; | ||||
| 	else if (exists("/proc/vz/veinfo") && !exists("/proc/vz/version")) | ||||
| 		return RC_SYS_OPENVZ; | ||||
| 	else if (file_regex("/proc/self/cgroup", ":/.+$")) | ||||
| 		return RC_SYS_LXC; | ||||
| 	else if (file_regex("/proc/self/status", | ||||
| 		"envID:[[:space:]]*[1-9]")) | ||||
| 		return RC_SYS_OPENVZ; /* old test */ | ||||
| @@ -243,6 +287,17 @@ rc_sys(void) | ||||
| 	return NULL; | ||||
| #endif /* PREFIX */ | ||||
| } | ||||
| librc_hidden_def(rc_sys_v1) | ||||
|  | ||||
| const char * | ||||
| rc_sys(void) | ||||
| { | ||||
| 	if (rc_conf_value("rc_sys")) { | ||||
| 		return rc_sys_v2(); | ||||
| 	} else { | ||||
| 		return rc_sys_v1(); | ||||
| 	} | ||||
| } | ||||
| librc_hidden_def(rc_sys) | ||||
|  | ||||
| static const char * | ||||
|   | ||||
| @@ -72,6 +72,7 @@ | ||||
| #define librc_hidden_proto(x) hidden_proto(x) | ||||
| #define librc_hidden_def(x) hidden_def(x) | ||||
|  | ||||
| librc_hidden_proto(rc_conf_value) | ||||
| librc_hidden_proto(rc_config_list) | ||||
| librc_hidden_proto(rc_config_load) | ||||
| librc_hidden_proto(rc_config_value) | ||||
| @@ -79,6 +80,7 @@ librc_hidden_proto(rc_deptree_depend) | ||||
| librc_hidden_proto(rc_deptree_depends) | ||||
| librc_hidden_proto(rc_deptree_free) | ||||
| librc_hidden_proto(rc_deptree_load) | ||||
| librc_hidden_proto(rc_deptree_load_file) | ||||
| librc_hidden_proto(rc_deptree_order) | ||||
| librc_hidden_proto(rc_deptree_update) | ||||
| librc_hidden_proto(rc_deptree_update_needed) | ||||
| @@ -125,6 +127,8 @@ librc_hidden_proto(rc_stringlist_new) | ||||
| librc_hidden_proto(rc_stringlist_split) | ||||
| librc_hidden_proto(rc_stringlist_sort) | ||||
| librc_hidden_proto(rc_sys) | ||||
| librc_hidden_proto(rc_sys_v1) | ||||
| librc_hidden_proto(rc_sys_v2) | ||||
| librc_hidden_proto(rc_yesno) | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -43,6 +43,14 @@ __BEGIN_DECLS | ||||
| #define RC_CONFDIR              RC_SYSCONFDIR "/conf.d" | ||||
| #define RC_PLUGINDIR            RC_LIBDIR "/plugins" | ||||
|  | ||||
| #define RC_PROFILE_ENV     RC_SYSCONFDIR "/profile.env" | ||||
| #define RC_SYS_WHITELIST   RC_LIBEXECDIR "/conf.d/env_whitelist" | ||||
| #define RC_USR_WHITELIST   RC_SYSCONFDIR "/conf.d/env_whitelist" | ||||
| #define RC_CONF         RC_SYSCONFDIR "/rc.conf" | ||||
| #define RC_CONF_OLD     RC_SYSCONFDIR "/conf.d/rc" | ||||
|  | ||||
| #define RC_PATH_PREFIX     RC_LIBEXECDIR "/bin:/bin:/sbin:/usr/bin:/usr/sbin" | ||||
|  | ||||
| /* PKG_PREFIX is where packages are installed if different from the base OS | ||||
|  * On Gentoo this is normally unset, on FreeBSD /usr/local and on NetBSD | ||||
|  * /usr/pkg. */ | ||||
| @@ -274,8 +282,19 @@ bool rc_service_daemons_crashed(const char *); | ||||
| #define RC_SYS_VSERVER "VSERVER" | ||||
| #define RC_SYS_XEN0    "XEN0" | ||||
| #define RC_SYS_XENU    "XENU" | ||||
|  | ||||
| /*! Returns the type of subsystem | ||||
|  * @return string from RC_SYS_* types or NULL if none detected */ | ||||
| const char *rc_sys(void); | ||||
|  | ||||
| /*! Returns the type of subsystem using old automatic code | ||||
|  * @return string from RC_SYS_* types or NULL if none detected */ | ||||
| const char *rc_sys_v1(void); | ||||
|  | ||||
| /*! Returns the type of subsystem using new rc.conf rc_sys value | ||||
|  * @return string from RC_SYS_* types or NULL if none detected */ | ||||
| const char *rc_sys_v2(void); | ||||
|  | ||||
| /*! @name Dependency options | ||||
|  * These options can change the services found by the rc_get_depinfo and | ||||
|  * rc_get_depends functions. */ | ||||
| @@ -364,6 +383,11 @@ bool rc_deptree_update_needed(time_t *, char *); | ||||
|  * @return pointer to the dependency tree */ | ||||
| RC_DEPTREE *rc_deptree_load(void); | ||||
|  | ||||
| /*! Load a cached dependency tree from the specified file and return a pointer | ||||
|  * to it.  This pointer should be freed with rc_deptree_free when done. | ||||
|  * @return pointer to the dependency tree */ | ||||
| RC_DEPTREE *rc_deptree_load_file(const char *); | ||||
|  | ||||
| /*! List the depend for the type of service | ||||
|  * @param deptree to search | ||||
|  * @param type to use (keywords, etc) | ||||
| @@ -446,6 +470,9 @@ RC_STRINGLIST *rc_config_load(const char *); | ||||
| /*! Return the value of the entry from a key=value list. */ | ||||
| char *rc_config_value(RC_STRINGLIST *, const char *); | ||||
|  | ||||
| /*! Return the value of the entry from rc.conf. */ | ||||
| char *rc_conf_value(const char *); | ||||
|  | ||||
| /*! Check if a variable is a boolean and return its value. | ||||
|  * If variable is not a boolean then we set errno to be ENOENT when it does | ||||
|  * not exist or EINVAL if it's not a boolean. | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| RC_1.0 { | ||||
| global: | ||||
| 	rc_conf_value; | ||||
| 	rc_config_list; | ||||
| 	rc_config_load; | ||||
| 	rc_config_value; | ||||
| @@ -7,6 +8,7 @@ global: | ||||
| 	rc_deptree_depends; | ||||
| 	rc_deptree_free; | ||||
| 	rc_deptree_load; | ||||
| 	rc_deptree_load_file; | ||||
| 	rc_deptree_order; | ||||
| 	rc_deptree_update; | ||||
| 	rc_deptree_update_needed; | ||||
| @@ -55,6 +57,8 @@ global: | ||||
| 	rc_stringlist_sort; | ||||
| 	rc_stringlist_free; | ||||
| 	rc_sys; | ||||
| 	rc_sys_v1; | ||||
| 	rc_sys_v2; | ||||
| 	rc_yesno; | ||||
|  | ||||
| local: | ||||
|   | ||||
| @@ -41,9 +41,25 @@ include ${MK}/prog.mk | ||||
| include ${MK}/git.mk | ||||
| include ${MK}/cc.mk | ||||
|  | ||||
| include ${MK}/${MKTERMCAP}.mk | ||||
| include ${MK}/termcap.mk | ||||
| LDADD+=		${LIBDL} ${LIBKVM} | ||||
| include ${MK}/${MKPAM}.mk | ||||
| include ${MK}/pam.mk | ||||
|  | ||||
| # create symlinks to rc if not an SELINUX system, otherwise create a wrapper | ||||
| # script to call rc with the proper name of the applet to execute. | ||||
| # $1 is a list of the links | ||||
| # $2 is the path+name of the target to link to (usually 'rc' or '/sbin/rc') | ||||
| # $3 is the path where the links are created | ||||
| define make-links | ||||
| 	for x in $(1); do \ | ||||
| 		if test -n "${MKSELINUX}"; then \ | ||||
| 			printf '#!/bin/sh\nexec ${2} --applet %s "$$@"\n' $$x >${3}/$$x; \ | ||||
| 			chmod ${BINMODE} ${3}/$$x; \ | ||||
| 		else \ | ||||
| 			ln -sf ${2} ${3}/$$x; \ | ||||
| 		fi; \ | ||||
| 	done; | ||||
| endef | ||||
|  | ||||
| ${SRCS}: version.h | ||||
|  | ||||
| @@ -61,13 +77,13 @@ install: all | ||||
| 	${INSTALL} -d ${DESTDIR}${SBINDIR} | ||||
| 	${INSTALL} -m ${BINMODE} ${PROG} ${DESTDIR}${SBINDIR} | ||||
| 	${INSTALL} -d ${DESTDIR}${BINDIR} | ||||
| 	for x in ${BINLINKS}; do ln -fs ${SBINDIR}/${PROG} ${DESTDIR}${BINDIR}/$$x; done | ||||
| 	$(call make-links,${BINLINKS},${SBINDIR}/${PROG},${DESTDIR}${BINDIR}) | ||||
| 	${INSTALL} -d ${DESTDIR}${SBINDIR} | ||||
| 	for x in ${SBINLINKS}; do ln -fs ${PROG} ${DESTDIR}${SBINDIR}/$$x; done | ||||
| 	$(call make-links,${SBINLINKS},${SBINDIR}/${PROG},${DESTDIR}${SBINDIR}) | ||||
| 	${INSTALL} -d ${DESTDIR}${LINKDIR}/bin | ||||
| 	for x in $(RC_BINLINKS); do ln -fs ${SBINDIR}/${PROG} ${DESTDIR}${LINKDIR}/bin/$$x; done | ||||
| 	$(call make-links,${RC_BINLINKS},${SBINDIR}/${PROG},${DESTDIR}${LINKDIR}/bin) | ||||
| 	${INSTALL} -d ${DESTDIR}${LINKDIR}/sbin | ||||
| 	for x in ${RC_SBINLINKS}; do ln -fs ${SBINDIR}/${PROG} ${DESTDIR}${LINKDIR}/sbin/$$x; done | ||||
| 	$(call make-links, ${RC_SBINLINKS},${SBINDIR}/${PROG},${DESTDIR}${LINKDIR}/sbin) | ||||
| 	if test "${MKPAM}" = pam; then \ | ||||
| 		${INSTALL} -d ${DESTDIR}${PAMDIR}; \ | ||||
| 		${INSTALL} -m ${PAMMODE} start-stop-daemon.pam ${DESTDIR}${PAMDIR}/start-stop-daemon; \ | ||||
| @@ -76,4 +92,4 @@ install: all | ||||
| check test:: | ||||
|  | ||||
| links: rc | ||||
| 	for l in ${ALL_LINKS}; do ln -sf rc $$l || exit $$? ; done | ||||
| 	$(call make-links,${ALL_LINKS},rc,.) | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| /* | ||||
|  * Copyright (c) 2007-2008 Roy Marples <roy@marples.name> | ||||
|  * All rights reserved | ||||
|  | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
| @@ -24,6 +24,8 @@ | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #include "version.h" | ||||
|  | ||||
| #if lint | ||||
| #  define _noreturn | ||||
| #endif | ||||
| @@ -33,6 +35,22 @@ | ||||
| #  define _noreturn | ||||
| #endif | ||||
|  | ||||
| _noreturn static void | ||||
| show_version(void) | ||||
| { | ||||
| 	const char *bootlevel = NULL; | ||||
|  | ||||
| 	printf("%s (OpenRC", applet); | ||||
| 	if ((bootlevel = rc_sys())) | ||||
| 		printf(" [%s]", bootlevel); | ||||
| 	printf(") %s", VERSION); | ||||
| #ifdef BRANDING | ||||
| 	printf(" (%s)", BRANDING); | ||||
| #endif | ||||
| 	printf("\n"); | ||||
| 	exit(EXIT_SUCCESS); | ||||
| } | ||||
|  | ||||
| _noreturn static void | ||||
| usage(int exit_status) | ||||
| { | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| /* | ||||
|  * Copyright (c) 2007-2008 Roy Marples <roy@marples.name> | ||||
|  * All rights reserved | ||||
|  | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
| @@ -24,11 +24,12 @@ | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #define getoptstring_COMMON "Chqv" | ||||
| #define getoptstring_COMMON "ChqVv" | ||||
|  | ||||
| #define longopts_COMMON							      \ | ||||
| 	{ "help",           0, NULL, 'h'},				      \ | ||||
| 	{ "nocolor",        0, NULL, 'C'},				      \ | ||||
| 	{ "version",        0, NULL, 'V'},				      \ | ||||
| 	{ "verbose",        0, NULL, 'v'},				      \ | ||||
| 	{ "quiet",          0, NULL, 'q'},				      \ | ||||
| 	{ NULL,             0, NULL,  0 } | ||||
| @@ -36,11 +37,13 @@ | ||||
| #define longopts_help_COMMON						      \ | ||||
| 	"Display this help output",					      \ | ||||
| 	"Disable color output",						      \ | ||||
| 	"Display software version",			              \ | ||||
| 	"Run verbosely",						      \ | ||||
| 	"Run quietly" | ||||
|  | ||||
| #define case_RC_COMMON_getopt_case_C  setenv ("EINFO_COLOR", "NO", 1); | ||||
| #define case_RC_COMMON_getopt_case_h  usage (EXIT_SUCCESS); | ||||
| #define case_RC_COMMON_getopt_case_V  if (argc == 2) show_version(); | ||||
| #define case_RC_COMMON_getopt_case_v  setenv ("EINFO_VERBOSE", "YES", 1); | ||||
| #define case_RC_COMMON_getopt_case_q  setenv ("EINFO_QUIET", "YES", 1); | ||||
| #define case_RC_COMMON_getopt_default usage (EXIT_FAILURE); | ||||
| @@ -48,6 +51,7 @@ | ||||
| #define case_RC_COMMON_GETOPT						      \ | ||||
| 	case 'C': case_RC_COMMON_getopt_case_C; break;			      \ | ||||
| 	case 'h': case_RC_COMMON_getopt_case_h; break;			      \ | ||||
| 	case 'V': case_RC_COMMON_getopt_case_V; break;			      \ | ||||
| 	case 'v': case_RC_COMMON_getopt_case_v; break;			      \ | ||||
| 	case 'q': case_RC_COMMON_getopt_case_q; break;			      \ | ||||
| 	default:  case_RC_COMMON_getopt_default; break; | ||||
|   | ||||
| @@ -152,7 +152,7 @@ do_e(int argc, char **argv) | ||||
| 		ts.tv_nsec = WAIT_INTERVAL; | ||||
| 		for (i = 0; i < argc; i++) { | ||||
| 			ebeginv("Waiting for %s", argv[i]); | ||||
| 			for (;;){ | ||||
| 			for (;;) { | ||||
| 				if (exists(argv[i])) | ||||
| 					break; | ||||
| 				if (nanosleep(&ts, NULL) == -1) | ||||
| @@ -429,6 +429,17 @@ run_applets(int argc, char **argv) | ||||
| 	char *p; | ||||
| 	pid_t pid = 0; | ||||
|  | ||||
| 	/* Bug 351712: We need an extra way to explicitly select an applet OTHER | ||||
| 	 * than trusting argv[0], as argv[0] is not going to be the applet value if | ||||
| 	 * we are doing SELinux context switching. For this, we allow calls such as | ||||
| 	 * 'rc --applet APPLET', and shift ALL of argv down by two array items. */ | ||||
| 	if (strcmp(applet, "rc") == 0 && argc >= 3 && | ||||
| 		    (strcmp(argv[1],"--applet") == 0 || strcmp(argv[1], "-a") == 0)) { | ||||
| 		applet = argv[2]; | ||||
| 		argv += 2; | ||||
| 		argc -= 2; | ||||
| 	} | ||||
|  | ||||
| 	/* These are designed to be applications in their own right */ | ||||
| 	if (strcmp(applet, "fstabinfo") == 0) | ||||
| 		exit(fstabinfo(argc, argv)); | ||||
|   | ||||
| @@ -106,7 +106,7 @@ _rc_deptree_load(int force, int *regen) { | ||||
| } | ||||
|  | ||||
| #include "_usage.h" | ||||
| #define getoptstring "aot:suT" getoptstring_COMMON | ||||
| #define getoptstring "aot:suTF:" getoptstring_COMMON | ||||
| static const struct option longopts[] = { | ||||
| 	{ "starting", 0, NULL, 'a'}, | ||||
| 	{ "stopping", 0, NULL, 'o'}, | ||||
| @@ -114,6 +114,7 @@ static const struct option longopts[] = { | ||||
| 	{ "notrace",  0, NULL, 'T'}, | ||||
| 	{ "strict",   0, NULL, 's'}, | ||||
| 	{ "update",   0, NULL, 'u'}, | ||||
| 	{ "deptree-file", 1, NULL, 'F'}, | ||||
| 	longopts_COMMON | ||||
| }; | ||||
| static const char * const longopts_help[] = { | ||||
| @@ -123,6 +124,7 @@ static const char * const longopts_help[] = { | ||||
| 	"Don't trace service dependencies", | ||||
| 	"Only use what is in the runlevels", | ||||
| 	"Force an update of the dependency tree", | ||||
| 	"File to load cached deptree from", | ||||
| 	longopts_help_COMMON | ||||
| }; | ||||
| #include "_usage.c" | ||||
| @@ -141,6 +143,7 @@ rc_depend(int argc, char **argv) | ||||
| 	char *runlevel = xstrdup(getenv("RC_RUNLEVEL")); | ||||
| 	int opt; | ||||
| 	char *token; | ||||
| 	char *deptree_file = NULL; | ||||
|  | ||||
| 	types = rc_stringlist_new(); | ||||
| 	while ((opt = getopt_long(argc, argv, getoptstring, | ||||
| @@ -166,13 +169,21 @@ rc_depend(int argc, char **argv) | ||||
| 		case 'T': | ||||
| 			options &= RC_DEP_TRACE; | ||||
| 			break; | ||||
| 		case 'F': | ||||
| 			deptree_file = xstrdup(optarg); | ||||
| 			break; | ||||
|  | ||||
| 		case_RC_COMMON_GETOPT | ||||
| 			    } | ||||
| 	} | ||||
|  | ||||
| 	if (deptree_file) { | ||||
| 		if (!(deptree = rc_deptree_load_file(deptree_file))) | ||||
| 			eerrorx("failed to load deptree"); | ||||
| 	} else { | ||||
| 		if (!(deptree = _rc_deptree_load(update, NULL))) | ||||
| 			eerrorx("failed to load deptree"); | ||||
| 	} | ||||
|  | ||||
| 	if (!runlevel) | ||||
| 		runlevel = rc_runlevel_get(); | ||||
|   | ||||
| @@ -52,61 +52,7 @@ | ||||
| #include "rc-misc.h" | ||||
| #include "version.h" | ||||
|  | ||||
| #define PROFILE_ENV     RC_SYSCONFDIR "/profile.env" | ||||
| #define SYS_WHITELIST   RC_LIBEXECDIR "/conf.d/env_whitelist" | ||||
| #define USR_WHITELIST   RC_SYSCONFDIR "/conf.d/env_whitelist" | ||||
| #define RC_CONF         RC_SYSCONFDIR "/rc.conf" | ||||
| #define RC_CONF_OLD     RC_SYSCONFDIR "/conf.d/rc" | ||||
|  | ||||
| #define PATH_PREFIX     RC_LIBEXECDIR "/bin:/bin:/sbin:/usr/bin:/usr/sbin" | ||||
|  | ||||
| static RC_STRINGLIST *rc_conf = NULL; | ||||
|  | ||||
| extern char** environ; | ||||
|  | ||||
| #ifdef DEBUG_MEMORY | ||||
| static void | ||||
| _free_rc_conf(void) | ||||
| { | ||||
| 	rc_stringlist_free(rc_conf); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| char * | ||||
| rc_conf_value(const char *setting) | ||||
| { | ||||
| 	RC_STRINGLIST *old; | ||||
| 	RC_STRING *s; | ||||
| 	char *p; | ||||
|  | ||||
| 	if (! rc_conf) { | ||||
| 		rc_conf = rc_config_load(RC_CONF); | ||||
| #ifdef DEBUG_MEMORY | ||||
| 		atexit(_free_rc_conf); | ||||
| #endif | ||||
|  | ||||
| 		/* Support old configs */ | ||||
| 		if (exists(RC_CONF_OLD)) { | ||||
| 			old = rc_config_load(RC_CONF_OLD); | ||||
| 			TAILQ_CONCAT(rc_conf, old, entries); | ||||
| #ifdef DEBUG_MEMORY | ||||
| 			free(old); | ||||
| #endif | ||||
| 		} | ||||
|  | ||||
| 		/* Convert old uppercase to lowercase */ | ||||
| 		TAILQ_FOREACH(s, rc_conf, entries) { | ||||
| 			p = s->value; | ||||
| 			while (p && *p && *p != '=') { | ||||
| 				if (isupper((unsigned char)*p)) | ||||
| 					*p = tolower((unsigned char)*p); | ||||
| 				p++; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return rc_config_value(rc_conf, setting); | ||||
| } | ||||
| extern char **environ; | ||||
|  | ||||
| bool | ||||
| rc_conf_yesno(const char *setting) | ||||
| @@ -135,7 +81,7 @@ env_filter(void) | ||||
|  | ||||
| 	/* Add the user defined list of vars */ | ||||
| 	env_allow = rc_stringlist_split(rc_conf_value("rc_env_allow"), " "); | ||||
| 	profile = rc_config_load(PROFILE_ENV); | ||||
| 	profile = rc_config_load(RC_PROFILE_ENV); | ||||
|  | ||||
| 	/* Copy the env and work from this so we can manipulate it safely */ | ||||
| 	env_list = rc_stringlist_new(); | ||||
| @@ -181,7 +127,7 @@ env_filter(void) | ||||
| void | ||||
| env_config(void) | ||||
| { | ||||
| 	size_t pplen = strlen(PATH_PREFIX); | ||||
| 	size_t pplen = strlen(RC_PATH_PREFIX); | ||||
| 	char *path; | ||||
| 	char *p; | ||||
| 	char *e; | ||||
| @@ -199,16 +145,16 @@ env_config(void) | ||||
| 	   for a little extra security */ | ||||
| 	path = getenv("PATH"); | ||||
| 	if (! path) | ||||
| 		setenv("PATH", PATH_PREFIX, 1); | ||||
| 	else if (strncmp (PATH_PREFIX, path, pplen) != 0) { | ||||
| 		setenv("PATH", RC_PATH_PREFIX, 1); | ||||
| 	else if (strncmp (RC_PATH_PREFIX, path, pplen) != 0) { | ||||
| 		l = strlen(path) + pplen + 3; | ||||
| 		e = p = xmalloc(sizeof(char) * l); | ||||
| 		p += snprintf(p, l, "%s", PATH_PREFIX); | ||||
| 		p += snprintf(p, l, "%s", RC_PATH_PREFIX); | ||||
|  | ||||
| 		/* Now go through the env var and only add bits not in our | ||||
| 		 * PREFIX */ | ||||
| 		while ((token = strsep(&path, ":"))) { | ||||
| 			np = npp = xstrdup(PATH_PREFIX); | ||||
| 			np = npp = xstrdup(RC_PATH_PREFIX); | ||||
| 			while ((tok = strsep(&npp, ":"))) | ||||
| 				if (strcmp(tok, token) == 0) | ||||
| 					break; | ||||
|   | ||||
| @@ -105,7 +105,7 @@ rc_plugin_load(void) | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		fptr = (int (*)(RC_HOOK, const char*)) | ||||
| 		fptr = (int (*)(RC_HOOK, const char *)) | ||||
| 		    dlfunc(h, RC_PLUGIN_HOOK); | ||||
| 		if (fptr == NULL) { | ||||
| 			eerror("%s: cannot find symbol `%s'", | ||||
|   | ||||
							
								
								
									
										30
									
								
								src/rc/rc.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								src/rc/rc.c
									
									
									
									
									
								
							| @@ -773,14 +773,16 @@ handle_bad_signal(int sig) | ||||
| #endif | ||||
|  | ||||
| #include "_usage.h" | ||||
| #define getoptstring "o:s:S" getoptstring_COMMON | ||||
| #define getoptstring "a:o:s:S" getoptstring_COMMON | ||||
| static const struct option longopts[] = { | ||||
| 	{ "applet",   1, NULL, 'a' }, | ||||
| 	{ "override", 1, NULL, 'o' }, | ||||
| 	{ "service",  1, NULL, 's' }, | ||||
| 	{ "sys",      0, NULL, 'S' }, | ||||
| 	longopts_COMMON | ||||
| }; | ||||
| static const char * const longopts_help[] = { | ||||
| 	"runs the applet specified by the next argument", | ||||
| 	"override the next runlevel to change into\n" | ||||
| 	"when leaving single user or boot runlevels", | ||||
| 	"runs the service specified with the rest\nof the arguments", | ||||
| @@ -804,6 +806,7 @@ main(int argc, char **argv) | ||||
| 	int opt; | ||||
| 	bool parallel; | ||||
| 	int regen = 0; | ||||
| 	int i; | ||||
| #ifdef __linux__ | ||||
| 	char *proc; | ||||
| 	char *p; | ||||
| @@ -822,18 +825,6 @@ main(int argc, char **argv) | ||||
| 	if (!applet) | ||||
| 		eerrorx("arguments required"); | ||||
|  | ||||
| 	if (argc > 1 && (strcmp(argv[1], "--version") == 0)) { | ||||
| 		printf("%s (OpenRC", applet); | ||||
| 		if ((bootlevel = rc_sys())) | ||||
| 			printf(" [%s]", bootlevel); | ||||
| 		printf(") " VERSION | ||||
| #ifdef BRANDING | ||||
| 		    " (" BRANDING ")" | ||||
| #endif | ||||
| 		    "\n"); | ||||
| 		exit(EXIT_SUCCESS); | ||||
| 	} | ||||
|  | ||||
| 	/* Run our built in applets. If we ran one, we don't return. */ | ||||
| 	run_applets(argc, argv); | ||||
|  | ||||
| @@ -855,6 +846,10 @@ main(int argc, char **argv) | ||||
| 		    longopts, (int *) 0)) != -1) | ||||
| 	{ | ||||
| 		switch (opt) { | ||||
| 		case 'a': | ||||
| 			/* Do nothing, actual logic in run_applets, this | ||||
| 			 * is a placeholder */ | ||||
| 			break; | ||||
| 		case 'o': | ||||
| 			if (*optarg == '\0') | ||||
| 				optarg = NULL; | ||||
| @@ -878,9 +873,16 @@ main(int argc, char **argv) | ||||
| 			eerrorx("%s: %s", applet, strerror(errno)); | ||||
| 			/* NOTREACHED */ | ||||
| 		case 'S': | ||||
| 			bootlevel = rc_sys(); | ||||
| 			if (rc_conf_value("rc_sys")) { | ||||
| 				bootlevel = rc_sys_v2(); | ||||
| 				if (bootlevel) | ||||
| 					printf("%s\n", bootlevel); | ||||
| 			} else { | ||||
| 				ewarn("WARNING: rc_sys not defined in rc.conf. Falling back to automatic detection"); | ||||
| 				bootlevel = rc_sys_v1(); | ||||
| 				if (bootlevel) | ||||
| 					printf("%s\n", bootlevel); | ||||
| 			} | ||||
| 			exit(EXIT_SUCCESS); | ||||
| 			/* NOTREACHED */ | ||||
| 		case_RC_COMMON_GETOPT | ||||
|   | ||||
| @@ -596,8 +596,10 @@ svc_start_check(void) | ||||
| 	fcntl(exclusive_fd, F_SETFD, | ||||
| 	    fcntl(exclusive_fd, F_GETFD, 0) | FD_CLOEXEC); | ||||
|  | ||||
| 	if (state & RC_SERVICE_STARTED) | ||||
| 		ewarnx("WARNING: %s has already been started", applet); | ||||
| 	if (state & RC_SERVICE_STARTED) { | ||||
| 		ewarn("WARNING: %s has already been started", applet); | ||||
| 		exit(EXIT_SUCCESS); | ||||
| 	} | ||||
| 	else if (state & RC_SERVICE_INACTIVE && !in_background) | ||||
| 		ewarnx("WARNING: %s has already started, but is inactive", | ||||
| 		    applet); | ||||
| @@ -845,8 +847,10 @@ svc_stop_check(RC_SERVICE *state) | ||||
| 	fcntl(exclusive_fd, F_SETFD, | ||||
| 	    fcntl(exclusive_fd, F_GETFD, 0) | FD_CLOEXEC); | ||||
|  | ||||
| 	if (*state & RC_SERVICE_STOPPED) | ||||
| 		ewarnx("WARNING: %s is already stopped", applet); | ||||
| 	if (*state & RC_SERVICE_STOPPED) { | ||||
| 		ewarn("WARNING: %s is already stopped", applet); | ||||
| 		exit(EXIT_SUCCESS); | ||||
| 	} | ||||
|  | ||||
| 	rc_service_mark(service, RC_SERVICE_STOPPING); | ||||
| 	hook_out = RC_HOOK_SERVICE_STOP_OUT; | ||||
|   | ||||
| @@ -43,7 +43,7 @@ | ||||
| #include <sys/ioctl.h> | ||||
| #include <sys/resource.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/termios.h> | ||||
| #include <termios.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/wait.h> | ||||
|  | ||||
| @@ -1210,7 +1210,7 @@ start_stop_daemon(int argc, char **argv) | ||||
| 		/* Clean the environment of any RC_ variables */ | ||||
| 		env_list = rc_stringlist_new(); | ||||
| 		i = 0; | ||||
| 		while(environ[i]) | ||||
| 		while (environ[i]) | ||||
| 			rc_stringlist_add(env_list, environ[i++]); | ||||
|  | ||||
| #ifdef HAVE_PAM | ||||
|   | ||||
							
								
								
									
										1
									
								
								src/test/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								src/test/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,6 @@ | ||||
| einfo.data.out | ||||
| einfo.funcs.out | ||||
| librc.funcs.hidden.out | ||||
| librc.funcs.hidden.list | ||||
| rc.data.out | ||||
| rc.funcs.out | ||||
| @@ -1,54 +0,0 @@ | ||||
| rc_config_list | ||||
| rc_config_load | ||||
| rc_config_value | ||||
| rc_deptree_depend | ||||
| rc_deptree_depends | ||||
| rc_deptree_free | ||||
| rc_deptree_load | ||||
| rc_deptree_order | ||||
| rc_deptree_update | ||||
| rc_deptree_update_needed | ||||
| rc_find_pids | ||||
| rc_getline | ||||
| rc_newer_than | ||||
| rc_older_than | ||||
| rc_runlevel_exists | ||||
| rc_runlevel_get | ||||
| rc_runlevel_list | ||||
| rc_runlevel_set | ||||
| rc_runlevel_stack | ||||
| rc_runlevel_stacks | ||||
| rc_runlevel_starting | ||||
| rc_runlevel_stopping | ||||
| rc_runlevel_unstack | ||||
| rc_service_add | ||||
| rc_service_daemon_set | ||||
| rc_service_daemons_crashed | ||||
| rc_service_delete | ||||
| rc_service_description | ||||
| rc_service_exists | ||||
| rc_service_extra_commands | ||||
| rc_service_in_runlevel | ||||
| rc_service_mark | ||||
| rc_service_resolve | ||||
| rc_service_schedule_clear | ||||
| rc_service_schedule_start | ||||
| rc_service_started_daemon | ||||
| rc_service_state | ||||
| rc_service_value_get | ||||
| rc_service_value_set | ||||
| rc_services_in_runlevel | ||||
| rc_services_in_runlevel_stacked | ||||
| rc_services_in_state | ||||
| rc_services_scheduled | ||||
| rc_services_scheduled_by | ||||
| rc_stringlist_add | ||||
| rc_stringlist_addu | ||||
| rc_stringlist_delete | ||||
| rc_stringlist_find | ||||
| rc_stringlist_free | ||||
| rc_stringlist_new | ||||
| rc_stringlist_sort | ||||
| rc_stringlist_split | ||||
| rc_sys | ||||
| rc_yesno | ||||
| @@ -1,3 +1,5 @@ | ||||
| rc_conf_value | ||||
| rc_conf_value@@RC_1.0 | ||||
| rc_config_list | ||||
| rc_config_list@@RC_1.0 | ||||
| rc_config_load | ||||
| @@ -12,6 +14,8 @@ rc_deptree_free | ||||
| rc_deptree_free@@RC_1.0 | ||||
| rc_deptree_load | ||||
| rc_deptree_load@@RC_1.0 | ||||
| rc_deptree_load_file | ||||
| rc_deptree_load_file@@RC_1.0 | ||||
| rc_deptree_order | ||||
| rc_deptree_order@@RC_1.0 | ||||
| rc_deptree_update | ||||
| @@ -104,5 +108,9 @@ rc_stringlist_split | ||||
| rc_stringlist_split@@RC_1.0 | ||||
| rc_sys | ||||
| rc_sys@@RC_1.0 | ||||
| rc_sys_v1 | ||||
| rc_sys_v1@@RC_1.0 | ||||
| rc_sys_v2 | ||||
| rc_sys_v2@@RC_1.0 | ||||
| rc_yesno | ||||
| rc_yesno@@RC_1.0 | ||||
|   | ||||
| @@ -57,6 +57,7 @@ sed -n '/^librc_hidden_proto/s:.*(\(.*\))$:\1:p' ${librc_srcdir}/librc.h \ | ||||
| 	| LC_ALL=C sort -u \ | ||||
| 	> librc.funcs.hidden.list | ||||
| readelf -Wr $(grep -l '#include[[:space:]]"librc\.h"' ${librc_srcdir}/*.c | sed 's:\.c$:.o:') \ | ||||
| 	| egrep -v -e 'R_PARISC_(DP|SEG)REL' \ | ||||
| 	| awk '$5 ~ /^rc_/ {print $5}' \ | ||||
| 	| LC_ALL=C sort -u \ | ||||
| 	| egrep -v '^rc_environ_fd$' \ | ||||
| @@ -66,6 +67,50 @@ syms=$(diff -u librc.funcs.hidden.list librc.funcs.hidden.out | sed -n '/^+[^+]/ | ||||
| eend $? "Missing hidden defs:"$'\n'"${syms}" | ||||
| ret=$(($ret + $?)) | ||||
|  | ||||
| ebegin "Checking trailing whitespace in code" | ||||
| # XXX: Should we check man pages too ? | ||||
| out=$(cd ${top_srcdir}; find */ \ | ||||
| 	'(' -name '*.[ch]' -o -name '*.in' -o -name '*.sh' ')' \ | ||||
| 	-exec grep -n -E '[[:space:]]+$' {} +) | ||||
| [ -z "${out}" ] | ||||
| eend $? "Trailing whitespace needs to be deleted:"$'\n'"${out}" | ||||
|  | ||||
| ebegin "Checking trailing newlines in code" | ||||
| out=$(cd ${top_srcdir}; | ||||
| 	for f in `find */ -name '*.[ch]'` ; do | ||||
| 		sed -n -e :a -e '/^\n*$/{$q1;N;ba' -e '}' $f || echo $f | ||||
| 	done) | ||||
| [ -z "${out}" ] | ||||
| eend $? "Trailing newlines need to be deleted:"$'\n'"${out}" | ||||
|  | ||||
| ebegin "Checking for obsolete functions" | ||||
| out=$(cd ${top_srcdir}; find src -name '*.[ch]' \ | ||||
| 	-exec grep -n -E '\<(malloc|memory|sys/(errno|fcntl|signal|stropts|termios|unistd))\.h\>' {} +) | ||||
| [ -z "${out}" ] | ||||
| eend $? "Avoid these obsolete functions:"$'\n'"${out}" | ||||
|  | ||||
| ebegin "Checking for x* func usage" | ||||
| out=$(cd ${top_srcdir}; find src -name '*.[ch]' \ | ||||
| 	-exec grep -n -E '\<(malloc|strdup)[[:space:]]*\(' {} + \ | ||||
| 	| grep -v \ | ||||
| 		-e src/includes/rc-misc.h \ | ||||
| 		-e src/libeinfo/libeinfo.c) | ||||
| [ -z "${out}" ] | ||||
| eend $? "These need to be using the x* variant:"$'\n'"${out}" | ||||
|  | ||||
| ebegin "Checking spacing style" | ||||
| out=$(cd ${top_srcdir}; find src -name '*.[ch]' \ | ||||
| 	-exec grep -n -E \ | ||||
| 		-e '\<(for|if|switch|while)\(' \ | ||||
| 		-e '\<(for|if|switch|while) \( ' \ | ||||
| 		-e ' ;' \ | ||||
| 		-e '[[:space:]]$' \ | ||||
| 		-e '\){' \ | ||||
| 		-e '(^|[^:])//' \ | ||||
| 	{} +) | ||||
| [ -z "${out}" ] | ||||
| eend $? "These lines violate style rules:"$'\n'"${out}" | ||||
|  | ||||
| einfo "Running unit tests" | ||||
| eindent | ||||
| for u in units/*; do | ||||
|   | ||||
| @@ -9,14 +9,18 @@ srcdir=${srcdir:-.} | ||||
| top_builddir=${top_builddir:-${top_srcdir}} | ||||
| builddir=${builddir:-${srcdir}} | ||||
|  | ||||
| if ! . ${top_srcdir}/sh/functions.sh; then | ||||
| export LD_LIBRARY_PATH=${top_builddir}/src/libeinfo:${top_builddir}/src/librc:${LD_LIBRARY_PATH} | ||||
| export PATH=${top_builddir}/src/rc:${PATH} | ||||
|  | ||||
|  | ||||
| if [ ! -f ${top_srcdir}/sh/functions.sh ] ; then | ||||
| 	echo "functions.sh not yet created !?" 1>&2 | ||||
| 	exit 1 | ||||
| elif ! . ${top_srcdir}/sh/functions.sh; then | ||||
| 	echo "Sourcing functions.sh failed !?" 1>&2 | ||||
| 	exit 1 | ||||
| fi | ||||
|  | ||||
| export LD_LIBRARY_PATH=${top_builddir}/src/libeinfo:${top_builddir}/src/librc:${LD_LIBRARY_PATH} | ||||
| export PATH=${top_builddir}/src/rc:${PATH} | ||||
|  | ||||
| cd ${top_srcdir}/src/rc | ||||
| ${MAKE:-make} links >/dev/null | ||||
| cd - | ||||
|   | ||||
		Reference in New Issue
	
	Block a user