Fix bash trap variable scope bug in QR camera scanner
The cleanup_camera trap handler couldn't access local variables (ffmpeg_pid, tmpdir) when triggered, causing "unbound variable" errors with set -u. Fixed by using global paths with $$ suffix that the trap can reference directly. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
25
setup
25
setup
@@ -216,15 +216,18 @@ scan_qr_camera() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local tmpdir="/tmp/usync_qr_$$"
|
# Use fixed paths (with PID) that cleanup can access without local vars
|
||||||
local result_file="$tmpdir/result"
|
USYNC_QR_TMPDIR="/tmp/usync_qr_$$"
|
||||||
local ffmpeg_pid=""
|
USYNC_QR_PIDFILE="/tmp/usync_qr_pid_$$"
|
||||||
|
|
||||||
mkdir -p "$tmpdir"
|
mkdir -p "$USYNC_QR_TMPDIR"
|
||||||
|
|
||||||
cleanup_camera() {
|
cleanup_camera() {
|
||||||
[[ -n "$ffmpeg_pid" ]] && kill "$ffmpeg_pid" 2>/dev/null || true
|
if [[ -f "/tmp/usync_qr_pid_$$" ]]; then
|
||||||
rm -rf "$tmpdir"
|
kill "$(cat "/tmp/usync_qr_pid_$$")" 2>/dev/null || true
|
||||||
|
rm -f "/tmp/usync_qr_pid_$$"
|
||||||
|
fi
|
||||||
|
rm -rf "/tmp/usync_qr_$$"
|
||||||
}
|
}
|
||||||
trap cleanup_camera RETURN EXIT
|
trap cleanup_camera RETURN EXIT
|
||||||
|
|
||||||
@@ -237,9 +240,9 @@ scan_qr_camera() {
|
|||||||
ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 \
|
ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 \
|
||||||
-vf "drawbox=x=iw/2-100:y=ih/2-100:w=200:h=200:color=green:t=3" \
|
-vf "drawbox=x=iw/2-100:y=ih/2-100:w=200:h=200:color=green:t=3" \
|
||||||
-f sdl2 -window_title "Scan QR Code" - \
|
-f sdl2 -window_title "Scan QR Code" - \
|
||||||
-vf "fps=2" -update 1 -q:v 2 "$tmpdir/frame.jpg" \
|
-vf "fps=2" -update 1 -q:v 2 "$USYNC_QR_TMPDIR/frame.jpg" \
|
||||||
-loglevel quiet 2>/dev/null &
|
-loglevel quiet 2>/dev/null &
|
||||||
ffmpeg_pid=$!
|
echo $! > "$USYNC_QR_PIDFILE"
|
||||||
|
|
||||||
sleep 1 # Let camera warm up
|
sleep 1 # Let camera warm up
|
||||||
|
|
||||||
@@ -248,13 +251,13 @@ scan_qr_camera() {
|
|||||||
sleep 0.5
|
sleep 0.5
|
||||||
|
|
||||||
# Check if ffmpeg died
|
# Check if ffmpeg died
|
||||||
if ! kill -0 "$ffmpeg_pid" 2>/dev/null; then
|
if [[ ! -f "$USYNC_QR_PIDFILE" ]] || ! kill -0 "$(cat "$USYNC_QR_PIDFILE")" 2>/dev/null; then
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -f "$tmpdir/frame.jpg" ]]; then
|
if [[ -f "$USYNC_QR_TMPDIR/frame.jpg" ]]; then
|
||||||
local result
|
local result
|
||||||
result=$(zbarimg --raw -q "$tmpdir/frame.jpg" 2>/dev/null || true)
|
result=$(zbarimg --raw -q "$USYNC_QR_TMPDIR/frame.jpg" 2>/dev/null || true)
|
||||||
|
|
||||||
if [[ -n "$result" ]]; then
|
if [[ -n "$result" ]]; then
|
||||||
result=$(echo "$result" | tr -d ' \n\r' | tr '[:lower:]' '[:upper:]')
|
result=$(echo "$result" | tr -d ' \n\r' | tr '[:lower:]' '[:upper:]')
|
||||||
|
|||||||
Reference in New Issue
Block a user