@@ -1137,32 +1137,73 @@ video_block_upstream_strict() {
11371137# udev refresh + prune stale /dev/video* and /dev/media* nodes
11381138# -----------------------------------------------------------------------------
11391139video_clean_and_refresh_v4l () {
1140+ # Refresh udev-managed nodes (best-effort). Do NOT prune/delete anything.
11401141 if video_exist_cmd udevadm; then
11411142 log_info " udev trigger: video4linux/media"
11421143 udevadm trigger --subsystem-match=video4linux --action=change 2> /dev/null || true
11431144 udevadm trigger --subsystem-match=media --action=change 2> /dev/null || true
11441145 udevadm settle 2> /dev/null || true
11451146 fi
1146-
1147- for n in /dev/video* ; do
1148- [ -e " $n " ] || continue
1149- bn=$( basename " $n " )
1150- if [ ! -e " /sys/class/video4linux/$bn " ]; then
1151- log_info " Pruning stale node: $n "
1152- rm -f " $n " 2> /dev/null || true
1153- fi
1154- done
1155-
1156- for n in /dev/media* ; do
1157- [ -e " $n " ] || continue
1158- bn=$( basename " $n " )
1159- if [ ! -e " /sys/class/media/$bn " ]; then
1160- log_info " Pruning stale node: $n "
1161- rm -f " $n " 2> /dev/null || true
1162- fi
1147+
1148+ # Recreate missing /dev nodes using /sys/dev/char mapping.
1149+ # Additive-only: never modify existing nodes (no chmod/chgrp on existing).
1150+ for sysdev in /sys/dev/char/* ; do
1151+ [ -e " $sysdev " ] || continue
1152+
1153+ majmin=$( basename " $sysdev " )
1154+ case " $majmin " in
1155+ * :* )
1156+ major=${majmin%:* }
1157+ minor=${majmin#*: }
1158+ ;;
1159+ * )
1160+ continue
1161+ ;;
1162+ esac
1163+
1164+ case " $major " in ' ' |* [!0-9]* ) continue ;; esac
1165+ case " $minor " in ' ' |* [!0-9]* ) continue ;; esac
1166+
1167+ tgt=$( readlink -f " $sysdev " 2> /dev/null || true)
1168+ [ -n " $tgt " ] || continue
1169+
1170+ # Media controller nodes
1171+ case " $tgt " in
1172+ * /media[0-9]* )
1173+ bn=$( basename " $tgt " ) # e.g. media0
1174+ devnode=" /dev/$bn "
1175+
1176+ # Never touch if it already exists
1177+ if [ -e " $devnode " ]; then
1178+ continue
1179+ fi
1180+
1181+ log_info " Recreating missing node: $devnode (c $major $minor )"
1182+ mknod " $devnode " c " $major " " $minor " 2> /dev/null || true
1183+ chgrp video " $devnode " 2> /dev/null || true
1184+ chmod 660 " $devnode " 2> /dev/null || true
1185+ ;;
1186+ esac
1187+
1188+ # V4L2 video nodes
1189+ case " $tgt " in
1190+ * /video4linux/video[0-9]* )
1191+ bn=$( basename " $tgt " ) # e.g. video0
1192+ devnode=" /dev/$bn "
1193+
1194+ # Never touch if it already exists
1195+ if [ -e " $devnode " ]; then
1196+ continue
1197+ fi
1198+
1199+ log_info " Recreating missing node: $devnode (c $major $minor )"
1200+ mknod " $devnode " c " $major " " $minor " 2> /dev/null || true
1201+ chgrp video " $devnode " 2> /dev/null || true
1202+ chmod 660 " $devnode " 2> /dev/null || true
1203+ ;;
1204+ esac
11631205 done
11641206}
1165-
11661207# -----------------------------------------------------------------------------
11671208# DMESG triage
11681209# -----------------------------------------------------------------------------
0 commit comments