]> git.plutz.net Git - shellwiki/blob - session_lock.sh
Merge commit '6bc502434737d7f08379e79b94fc6fda424ef779'
[shellwiki] / session_lock.sh
1 #!/bin/sh
2
3 [ "$include_sessionlock" ] && return 0
4 include_sessionlock="$0"
5
6 # Copyright 2022 Paul Hänsch
7
8 # Permission to use, copy, modify, and/or distribute this software for any
9 # purpose with or without fee is hereby granted, provided that the above
10 # copyright notice and this permission notice appear in all copies.
11
12 # THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
15 # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
18 # IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
20 . "$_EXEC/cgilite/storage.sh"
21 . "$_EXEC/cgilite/session.sh"
22
23 LOCK_TIMEOUT="${LOCK_TIMEOUT:-1200}"
24
25 S_LOCK(){
26   local file="$1" timeout="${2:-$LOCK_TIMEOUT}"
27   local date sid
28
29   printf "%i %s\n" "$_DATE" "$SESSION_ID" >>"${file}.lock"
30
31   if ! read date sid <"${file}.lock"; then
32     debug "Unable to access lock: ${file}.lock"
33
34   elif [ $((date + timeout)) -lt $_DATE ]; then
35     # Override stale lock
36     if LOCK "${file}.lock" 1; then
37       debug "Overriding stale lock: ${file}.lock"
38       printf "%i %s\n" "$_DATE" "$SESSION_ID" >"${file}.lock"
39       RELEASE "${file}.lock"
40       return 0
41     else
42       return 1
43     fi
44
45   elif [ "$sid" = "$SESSION_ID" -a "$date" -ne "$_DATE" ]; then
46     # Refresh aged lock
47     printf "%i %s\n" "$_DATE" "$SESSION_ID" >"${file}.lock"
48     return 0
49
50   elif [ "$sid" = "$SESSION_ID" ]; then
51     # Simple success
52     return 0
53
54   else
55     return 1
56   fi
57 }
58
59 S_RELEASE(){
60   local file="$1" timeout="${2:-$LOCK_TIMEOUT}"
61   local date sid
62
63   if ! read date sid <"${file}.lock"; then
64     # File was not locked
65     return 0
66
67   elif [ "$sid" = "$SESSION_ID" -a  $((date + timeout)) -lt $_DATE ]; then
68     # if lock is stale, protect against stale override before release
69     if LOCK "${file}.lock" 1; then
70       rm -- "${file}.lock"
71       RELEASE "${file}.lock"
72       return 0
73     else
74       return 1
75     fi
76
77   elif [ "$sid" = "$SESSION_ID" ]; then
78     # Simple success
79     rm -- "${file}.lock"
80     return 0
81
82   else
83     return 1
84   fi
85 }