diff options
Diffstat (limited to 'src/rfkill')
-rw-r--r-- | src/rfkill | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/rfkill b/src/rfkill new file mode 100644 index 0000000..d61703d --- /dev/null +++ b/src/rfkill @@ -0,0 +1,75 @@ +set_rf_state() { + local INTERFACE="$1" state="$2" RFKILL_NAME="$3" + + if [[ "$RFKILL" == "hard" ]]; then + report_fail "Cannot set state on hardware rfkill switch" + return 1 + fi + local path=$(get_rf_path "$INTERFACE" "$RFKILL_NAME") || return 1 + case "$state" in + enabled) + echo 1 > "$path/state" + ;; + disabled) + echo 0 > "$path/state" + ;; + esac +} + +get_rf_path() { + local INTERFACE="$1" RFKILL_NAME="$2" path + + if [[ -n "$RFKILL_NAME" ]]; then + for path in /sys/class/rfkill/*; do + if [[ "$(cat "$path/name")" == "$RFKILL_NAME" ]]; then + echo "$path" + return 0 + fi + done + report_fail "no rfkill switch with name $RFKILL_NAME" + else + path="/sys/class/net/$INTERFACE/rfkill" + if [[ -d "$path" ]]; then + echo "$path" + return 0 + fi + report_fail "no rfkill switch available on interface $INTERFACE" + fi + return 1 +} + +get_rf_state() { + local INTERFACE="$1" PROFILE="$2" path state + + path=$(get_rf_path "$INTERFACE" "$RFKILL_NAME") || return 1 + state=$(cat "$path/state") + + case "$state" in + 0|2) + echo "disabled";; + 1) + echo "enabled";; + *) + echo "$state";; + esac +} + +enable_rf() { + local INTERFACE="$1" RFKILL="$2" RFKILL_NAME="$3" + # Enable rfkill if necessary, or fail if it is hardware + if [[ -n "$RFKILL" ]]; then + local state=$(get_rf_state "$INTERFACE") || return 1 + if [[ "$state" != "enabled" ]]; then + if [[ "$RFKILL" == "soft" ]]; then + set_rf_state "$INTERFACE" enabled $RFKILL_NAME + sleep 1 + else + report_fail "radio is disabled on $INTERFACE" + return 1 + fi + fi + fi +} + +# vim: ft=sh ts=4 et sw=4: + |