-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathueventd
executable file
·124 lines (107 loc) · 2.72 KB
/
ueventd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/bin/bash
BROADCAST=0
CONFFILE=/etc/ueventd.conf
PIDFILE=/run/ueventd.pid
RESTART=0
SYSFS=${SYSFS:-/sys}
TRIGGER=0
usage() {
cat >&2 <<EOF
Usage: ${0##*/} [OPTIONS]
Options:
-b GROUPS rebroadcast to the specified netlink group mask
-f CONFFILE set the configuration file, /etc/ueventd.conf by default
-p PIDFILE set the pidfile location, /run/ueventd.pid by default
-t retrigger a uevent for each pre-existing device
EOF
exit 64
}
while getopts :b:f:p:t OPTION; do
case $OPTION in
b)
BROADCAST=$((OPTARG & ~1))
;;
f)
CONFFILE=$OPTARG
;;
p)
PIDFILE=$OPTARG
;;
t)
TRIGGER=1
;;
*)
usage
;;
esac
done
(( OPTIND <= $# )) && usage
add() { :; }
change() { :; }
event() { :; }
move() { :; }
offline() { :; }
online() { :; }
overflow() { :; }
remove() { :; }
if [[ ! -f $CONFFILE ]]; then
exit 0
elif ! source "$CONFFILE"; then
exit 1
fi
if ! { exec 3>>"$PIDFILE" && flock -n 3; } 2>/dev/null; then
echo "Failed to lock $PIDFILE; is ${0##*/} already running?" >&2
exit 1
fi
if read -a STAT </proc/self/stat && (( $$ != STAT[5] )); then
exec daemon -- "$0" "$@"
rm -f "$PIDFILE"
exit 1
fi
echo $$ >"$PIDFILE"
trap 'trap "" TERM && kill -TERM 0 && rm -f "$PIDFILE"' EXIT
trap 'exec -- "$0" "$@"' HUP
if [[ ! -p /dev/stdin ]]; then
exec < <(uevent -l 1 </dev/null 3>&-)
read -r READY
fi
if (( BROADCAST )) && [[ ! -p /dev/stdout ]]; then
exec > >(uevent -b $BROADCAST >/dev/null 3>&-)
fi
if (( TRIGGER )); then
find $SYSFS/{module,bus,devices} -name uevent -type f \
| while read UEVENT; do echo change >"$UEVENT"; done
for (( INDEX = 1; INDEX <= $#; INDEX++ )); do
[[ ${!INDEX} == "-t" ]] && set -- "${@:1:INDEX - 1}" "${@:INDEX + 1}"
done
fi
declare -A ENV=()
while read -r KEY VALUE; do
if [[ -n $KEY ]]; then
ENV[$KEY]=$VALUE
continue
fi
unset ACTION DEVNAME DEVPATH DRIVER INTERFACE KEY SUBSYSTEM SYSPATH VALUE
[[ -v ENV[ACTION] ]] && ACTION=${ENV[ACTION]}
[[ -v ENV[DEVNAME] ]] && DEVNAME=${ENV[DEVNAME]}
[[ -v ENV[DEVPATH] ]] && DEVPATH=${ENV[DEVPATH]}
[[ -v ENV[DRIVER] ]] && DRIVER=${ENV[DRIVER]}
[[ -v ENV[INTERFACE] ]] && DRIVER=${ENV[INTERFACE]}
[[ -v ENV[SUBSYSTEM] ]] && SUBSYSTEM=${ENV[SUBSYSTEM]}
[[ -v ENV[DEVPATH] ]] && SYSPATH=$SYSFS${ENV[DEVPATH]}
case "$ACTION" in
add | change | move | offline | online | overflow | remove)
event "$ACTION" "$DEVPATH" && "$ACTION" "$DEVPATH" || unset ENV
;;
*)
event "$ACTION" "$DEVPATH" || unset ENV
;;
esac </dev/null >/dev/null 3>&-
if (( BROADCAST && ${#ENV[@]} )); then
for KEY in "${!ENV[@]}"; do
printf '%s %s\n' "$KEY" "${ENV[$KEY]}"
done
printf '\n'
fi
declare -A ENV=()
done