Introduction
Introduction Statistics Contact Development Disclaimer Help
dreadlock-ng.sh - dreadlock-ng - Remote locking daemon with a funny name.
git clone git://bitreich.org/dreadlock-ng git://enlrupgkhuxnvlhsf6lc3fziv5h2hhf…
Log
Files
Refs
Tags
README
LICENSE
---
dreadlock-ng.sh (2176B)
---
1 #!/bin/bash
2 #
3 # Copy me, if you can.
4 # by 20h
5 #
6
7 #set -x
8
9 lockbasepath="/tmp/dreadlock-ng"
10 if [ $# -gt 0 ];
11 then
12 lockbasepath="$1"
13 fi
14
15 mkdir -p "${lockbasepath}"
16
17 declare -A locks=()
18
19 function unlock_on_disconnect() {
20 for lockfd in ${locks[@]};
21 do
22 flock -u "${lockfd}" 2>/dev/null
23 done
24 for lockname in ${!locks[@]};
25 do
26 [ -e "${lockbasepath}/${lockname}" ] && rm -f "${lockbas…
27 done
28 }
29
30 trap unlock_on_disconnect EXIT
31 trap unlock_on_disconnect 1
32 trap unlock_on_disconnect 2
33 trap unlock_on_disconnect 3
34 trap unlock_on_disconnect 6
35 trap unlock_on_disconnect 9
36 trap unlock_on_disconnect 15
37
38 while read -r line;
39 do
40 case "${line}" in
41 "lock "*)
42 lockname="$(printf "%s\n" "${line}" | tr -d $'\r' | cut …
43 if [ -z "${lockname}" ];
44 then
45 printf "e no lock name specified\r\n"
46 exit 1;
47 fi
48 if [[ "${lockname}" =~ [^a-zA-Z0-9] ]];
49 then
50 printf "e lock name must be alphanumeric\r\n"
51 exit 1
52 fi
53 timeoutms="$(printf "%s\n" "${line}" | tr -d $'\r' | cut…
54 if [ -z "${timeoutms}" ];
55 then
56 printf "e no timeout specified\r\n"
57 exit 1;
58 fi
59 if [[ "${timeoutms}" =~ [^0-9] ]];
60 then
61 printf "e timeout must be numeric\r\n"
62 exit 1
63 fi
64 timeouts="$(units -t "${timeoutms}ms" "s" 2>/dev/null)"
65 case "${timeouts}" in
66 0*)
67 # flock(1) needs at least one second.
68 timeouts=1
69 ;;
70 esac
71
72 lockpath="${lockbasepath}/${lockname}"
73 touch "${lockpath}"
74 exec {fd}<>"${lockpath}"
75 flock -x -w "${timeouts}" "${fd}"
76 if [ $? -gt 0 ];
77 then
78 printf "t timeout\r\n"
79 exit 1
80 fi
81 locks[${lockname}]+="${fd}"
82 printf "l locked\r\n"
83 ;;
84 "unlock "*)
85 lockname="$(printf "%s\n" "${line}" | tr -d $'\r' | cut …
86 if [ -z "${lockname}" ];
87 then
88 printf "e no lock name specified\r\n"
89 exit 1;
90 fi
91 if [[ "${lockname}" =~ [^a-zA-Z0-9] ]];
92 then
93 printf "e lock name must be alphanumeric\r\n"
94 exit 1
95 fi
96
97 lockfd=${locks[${lockname}]}
98 if [ -z "${lockfd}" ];
99 then
100 printf "e unknown lock\r\n"
101 exit 1
102 fi
103
104 flock -u "${lockfd}"
105 if [ $? -gt 1 ];
106 then
107 printf "e unlock error\r\n"
108 exit 1
109 fi
110 printf "u unlocked\r\n"
111 ;;
112 *)
113 exit 1;
114 esac
115 done
116
117 exit 0
118
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.