blob: a80b096f9692cf9dc0702c922452f20af9991bc6 (
plain)
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
125
126
127
128
|
#!/bin/sh
# Copyright (c) 2016 - 2020 DisplayLink (UK) Ltd.
# File autogenerated by udev-installer.sh script
get_displaylink_dev_count()
{
cat /sys/bus/usb/devices/*/idVendor | grep 17e9 | wc -l
}
get_displaylink_symlink_count()
{
root=$1
if [ ! -d "$root/displaylink/by-id" ]; then
echo "0"
return
fi
for f in $(find $root/displaylink/by-id -type l -exec realpath {} \; 2> /dev/null); do
test -c $f && echo $f;
done | wc -l
}
start_displaylink()
{
if [ "$(get_displaylink_dev_count)" != "0" ]; then
start_service
fi
}
stop_displaylink()
{
root=$1
if [ "$(get_displaylink_symlink_count $root)" = "0" ]; then
stop_service
fi
}
remove_dldir_if_empty()
{
root=$1
(cd $root; rmdir -p --ignore-fail-on-non-empty displaylink/by-id)
}
create_displaylink_symlink()
{
root=$1
device_id=$2
devnode=$3
mkdir -p $root/displaylink/by-id
ln -sf $devnode $root/displaylink/by-id/$device_id
}
unlink_displaylink_symlink()
{
root=$1
devname=$2
for f in $root/displaylink/by-id/*; do
if [ ! -e "$f" ] || ([ -L "$f" ] && [ "$f" -ef "$devname" ]); then
unlink "$f"
fi
done
(cd $root; rmdir -p --ignore-fail-on-non-empty displaylink/by-id)
}
prune_broken_links()
{
root=$1
dir="$root/displaylink/by-id"
find -L "$dir" -name "$dir" -o type d -prune -o -type -l -exec rm {} +
remove_dldir_if_empty $root
}
disable_u1_u2()
{
echo 0 > "/sys$1/../port/usb3_lpm_permit"
}
main()
{
action=$1
root=$2
devpath=$3
devnode=$5
if [ "$action" = "add" ]; then
device_id=$4
create_displaylink_symlink $root $device_id $devnode
start_displaylink
disable_u1_u2 "$devpath"
elif [ "$action" = "remove" ]; then
devname=$3
unlink_displaylink_symlink "$root" "$devname"
stop_displaylink "$root"
elif [ "$action" = "START" ]; then
start_displaylink
fi
}
start_service()
{
systemctl start --no-block displaylink
}
stop_service()
{
systemctl stop displaylink
}
if [ "$ACTION" = "add" ] && [ "$#" -ge 3 ]; then
main $ACTION $1 $2 $3 $4
return 0
fi
if [ "$ACTION" = "remove" ]; then
if [ "$#" -ge 2 ]; then
main $ACTION $1 $2 $3
return 0
else
prune_broken_links $root
return 0
fi
fi
|