summaryrefslogblamecommitdiff
path: root/system/openrc/sysfsconf.initd
blob: 5d4f9aeab1818960741afbeac2a12131d38470c0 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14













                                                                              

                                                      




                           
                                        











































                                                               
#!/sbin/openrc-run

description="Set sysfs variables from /etc/sysfs.conf and /etc/sysfs.d/*.conf"
conffile=/etc/sysfs.conf
confdir=/etc/sysfs.d

depend() {
	need sysfs
}

setval() {
	local value="$1" attrib="$2"
	# Some fields need a terminating newline, others
	# need the terminating newline to be absent :-(
	printf '%s' "$value" > "$attrib" 2>/dev/null \
		|| printf '%s\n' "$value" > "$attrib"
}

load_conffile() {
	local file="$1"
	while read line; do
		local line="${line%%#*}"
		local cmd= attrib= value=
		set -- $line
		if [ $# -eq 0 ]; then
			continue
		fi
		case "$1$3" in
			mode=)	cmd=chmod
				attrib="$2"
				value="$4"
				;;
			owner=) cmd=chown
				attrib="$2"
				value="$4"
				;;
			*)	if [ "$2" = "=" ]; then
					cmd=setval
					attrib="$1"
					value="$3"
				fi
				;; 
		esac
		if ! [ -e "/sys/$attrib" ]; then
			eerror "$attrib: unknown attribute"
			continue
		fi
		if [ -z "$attrib" ] || [ -z "$value" ]; then
			eerror "syntax error in $file: '$line'"
			continue
		fi
		$cmd "$value" "/sys/$attrib"
	done < "$file"
}

start() {
	[ -r "$conffile" -o -d "$confdir" ] || return 0
	ebegin "Setting sysfs variables"
	for file in $confdir/*.conf $conffile; do
		[ -r "$file" ] || continue
		load_conffile "$file" || return 1
	done
	eend 0

}