aboutsummaryrefslogtreecommitdiffstats
path: root/main/openrc/sysfsconf.initd
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2016-08-10 16:57:23 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2016-08-10 16:58:01 +0200
commit4c9c24b11fa49edd270288882fbb81380c5dd3ac (patch)
treef8709573d29a4c5f1caf7196804b646db72c4d8f /main/openrc/sysfsconf.initd
parent763aae0d1827616dae68317ab10bc6dd73001773 (diff)
downloadaports-4c9c24b11fa49edd270288882fbb81380c5dd3ac.tar.bz2
aports-4c9c24b11fa49edd270288882fbb81380c5dd3ac.tar.xz
main/openrc: add sysfsconf script
so we can edit sysfs variables during boot
Diffstat (limited to 'main/openrc/sysfsconf.initd')
-rw-r--r--main/openrc/sysfsconf.initd66
1 files changed, 66 insertions, 0 deletions
diff --git a/main/openrc/sysfsconf.initd b/main/openrc/sysfsconf.initd
new file mode 100644
index 0000000000..cefc3595dd
--- /dev/null
+++ b/main/openrc/sysfsconf.initd
@@ -0,0 +1,66 @@
+#!/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 :-(
+ echo -n "$value" > "$attrib" 2>/dev/null \
+ || echo "$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 $conffile $confdir/*.conf; do
+ [ -r "$file" ] || continue
+ load_conffile "$file" || return 1
+ done
+ eend 0
+
+}
+