]> git.plutz.net Git - shellwiki/blob - session_lock.sh
Merge commit '9acd3b2b516d560f4b8ff1db6e13b4ff519abfce'
[shellwiki] / session_lock.sh
1 #!/bin/sh
2
3 . "$_EXEC/cgilite/storage.sh"
4 . "$_EXEC/cgilite/session.sh"
5
6 LOCK_TIMEOUT="${LOCK_TIMEOUT:-1200}"
7
8 S_LOCK(){
9   local file="$1" timeout="${2:-$LOCK_TIMEOUT}"
10   local date sid
11
12   printf "%i %s\n" "$_DATE" "$SESSION_ID" >>"${file}.lock"
13
14   if ! read date sid <"${file}.lock"; then
15     debug "Unable to access lock: ${file}.lock"
16
17   elif [ $((date + timeout)) -lt $_DATE ]; then
18     # Override stale lock
19     if LOCK "${file}.lock" 1; then
20       debug "Overriding stale lock: ${file}.lock"
21       printf "%i %s\n" "$_DATE" "$SESSION_ID" >"${file}.lock"
22       RELEASE "${file}.lock"
23       return 0
24     else
25       return 1
26     fi
27
28   elif [ "$sid" = "$SESSION_ID" -a "$date" -ne "$_DATE" ]; then
29     # Refresh aged lock
30     printf "%i %s\n" "$_DATE" "$SESSION_ID" >"${file}.lock"
31     return 0
32
33   elif [ "$sid" = "$SESSION_ID" ]; then
34     # Simple success
35     return 0
36
37   else
38     return 1
39   fi
40 }
41
42 S_RELEASE(){
43   local file="$1" timeout="${2:-$LOCK_TIMEOUT}"
44   local date sid
45
46   if ! read date sid <"${file}.lock"; then
47     # File was not locked
48     return 0
49
50   elif [ "$sid" = "$SESSION_ID" -a  $((date + timeout)) -lt $_DATE ]; then
51     # if lock is stale, protect against stale override before release
52     if LOCK "${file}.lock" 1; then
53       rm -- "${file}.lock"
54       RELEASE "${file}.lock"
55       return 0
56     else
57       return 1
58     fi
59
60   elif [ "$sid" = "$SESSION_ID" ]; then
61     # Simple success
62     rm -- "${file}.lock"
63     return 0
64
65   else
66     return 1
67   fi
68 }