aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dan@ioncontrol.co>2025-03-29 22:18:46 +0000
committerDan Williams <dan@ioncontrol.co>2025-03-29 22:18:46 +0000
commitab8c9b341856c7a1aae563d682683f6fcca1f3ba (patch)
tree024361f7c1e48899db82ce76b70469f1b90bff56
parentf9e63c7940f72e23b2ec618d9873d0fa3b959b1a (diff)
parent54bbad9fcc86c4b0c7a06b14544d90a4aced864d (diff)
Merge request !1313 from 'fcc-unlock-14c3-sh'
fcc-unlock: Transition the 14c3 FCC unlock script to use sh https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/merge_requests/1313
-rw-r--r--[-rwxr-xr-x]data/dispatcher-fcc-unlock/14c363
1 files changed, 30 insertions, 33 deletions
diff --git a/data/dispatcher-fcc-unlock/14c3 b/data/dispatcher-fcc-unlock/14c3
index f4d2f0b4..78f09861 100755..100644
--- a/data/dispatcher-fcc-unlock/14c3
+++ b/data/dispatcher-fcc-unlock/14c3
@@ -1,15 +1,16 @@
-#!/bin/bash
+#!/bin/sh
# SPDX-License-Identifier: CC0-1.0
# 2023 Thilo-Alexander Ginkel <thilo@ginkel.com>
+# 2025 Jongmin Kim <jmkim@debian.org>
#
# Lenovo-shipped Fibocom FM350-GL (14c3:4d75) FCC unlock
-if [[ "$FCC_UNLOCK_DEBUG_LOG" == '1' ]]; then
+[ "$FCC_UNLOCK_DEBUG_LOG" = '1' ] && {
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
- exec 1>>/var/log/mm-fm350-fcc.log 2>&1
-fi
+ exec 1>>'/var/log/mm-fm350-fcc.log' 2>&1
+}
# require program name and at least 2 arguments
[ $# -lt 2 ] && exit 1
@@ -34,12 +35,12 @@ done
DEVICE="/dev/$AT_PORT"
at_command() {
- exec 99<>"$DEVICE"
- echo -e "$1\r" >&99
- read answer <&99
- read answer <&99
+ exec 9<>"$DEVICE"
+ printf "%s\r" "$1" >&9
+ read answer <&9
+ read answer <&9
echo "$answer"
- exec 99>&-
+ exec 9>&-
}
log() {
@@ -50,40 +51,36 @@ error() {
echo "$1" >&2
}
-VENDOR_ID_HASH="3df8c719"
+VENDOR_ID_HASH='3df8c719'
-for i in {1..9}; do
- log "Requesting challenge from WWAN modem (attempt #${i})"
- RAW_CHALLENGE=$(at_command "at+gtfcclockgen")
- CHALLENGE=$(echo "$RAW_CHALLENGE" | grep -o '0x[0-9a-fA-F]\+' | awk '{print $1}')
+i=1
+while [ "$i" -le 9 ]; do
+ log "Requesting challenge from WWAN modem (attempt #$i)"
+ RAW_CHALLENGE="$(at_command 'at+gtfcclockgen')"
+ CHALLENGE="$(echo "$RAW_CHALLENGE" | grep -o '0x[0-9a-fA-F]\+' | awk '{print $1}')"
- if [ -n "$CHALLENGE" ]; then
+ [ -n "$CHALLENGE" ] && {
log "Got challenge from modem: $CHALLENGE"
- HEX_CHALLENGE=$(printf "%08x" "$CHALLENGE")
- COMBINED_CHALLENGE="${HEX_CHALLENGE}$(printf "%.8s" "${VENDOR_ID_HASH}")"
- RESPONSE_HASH=$(echo "$COMBINED_CHALLENGE" | xxd -r -p | sha256sum | cut -d ' ' -f 1)
- TRUNCATED_RESPONSE=$(printf "%.8s" "$RESPONSE_HASH")
- RESPONSE=$(printf "%d" "0x$TRUNCATED_RESPONSE")
+ HEX_CHALLENGE="$(printf '%08x' "$CHALLENGE")"
+ COMBINED_CHALLENGE="$HEX_CHALLENGE$(printf '%.8s' "$VENDOR_ID_HASH")"
+ RESPONSE_HASH="$(echo "$COMBINED_CHALLENGE" | xxd -r -p | sha256sum | cut -d ' ' -f 1)"
+ TRUNCATED_RESPONSE="$(printf '%.8s' "$RESPONSE_HASH")"
+ RESPONSE="$(printf '%d' "0x$TRUNCATED_RESPONSE")"
log "Sending response to WWAN modem: $RESPONSE"
- UNLOCK_RESPONSE=$(at_command "at+gtfcclockver=$RESPONSE")
+ UNLOCK_RESPONSE="$(at_command "at+gtfcclockver=$RESPONSE")"
- if [[ "$UNLOCK_RESPONSE" == "+GTFCCLOCKVER:"* ]]; then
- UNLOCK_RESULT=$(echo "$UNLOCK_RESPONSE" | grep -o '[0-9]\+')
- if [[ "$UNLOCK_RESULT" == "1" ]]; then
+ echo "$UNLOCK_RESPONSE" | grep -q '^+GTFCCLOCKVER:' && {
+ UNLOCK_RESULT="$(echo "$UNLOCK_RESPONSE" | grep -o '[0-9]*')"
+ [ "$UNLOCK_RESULT" = '1' ] && {
log "FCC unlock succeeded"
exit 0
- else
- error "FCC unlock failed. Got result: $UNLOCK_RESULT"
- fi
- else
- error "Unlock failed. Got response: $UNLOCK_RESPONSE"
- fi
- else
- error "Failed to obtain FCC challenge. Got: ${RAW_CHALLENGE}"
- fi
+ } || error "FCC unlock failed. Got result: $UNLOCK_RESULT"
+ } || error "Unlock failed. Got response: $UNLOCK_RESPONSE"
+ } || error "Failed to obtain FCC challenge. Got: $RAW_CHALLENGE"
sleep 0.5
+ i="$((i + 1))"
done
exit 2