X-Git-Url: http://git.plutz.net/?p=cgilite;a=blobdiff_plain;f=storage.sh;h=0d09b262b4d700dac399dbc165ff5250570d16fa;hp=d4fbca36714a0cfe08db9ea9d465d43b3ef83b9c;hb=4feaa19ab266bca60388152b6c1f550d09b1184b;hpb=aa4821bae04b2022828cbbb725874db96ca249fd diff --git a/storage.sh b/storage.sh index d4fbca3..0d09b26 100755 --- a/storage.sh +++ b/storage.sh @@ -17,7 +17,11 @@ # You should have received a copy of the GNU Affero General Public License # along with CGIlite. If not, see . +[ -n "$include_storage" ] && return 0 +include_storage="$0" + LOCK(){ + local lock timeout block lock="${1}.lock" timeout="${2-20}" if [ \! -w "${lock%/*}" ] || [ -e "$lock" -a \! -d "$lock" ]; then @@ -25,7 +29,7 @@ LOCK(){ return 1 fi - while ! mkdir "$lock"; do + while ! mkdir "$lock" 2>&-; do block="$(cat "$lock/pid" || printf 1)" if ! { ps -eo pid |grep -qwF "$block"; }; then printf 'Overriding stale lock: %s\n' "$lock" >&2 @@ -39,10 +43,11 @@ LOCK(){ sleep 1 done printf '%i\n' $$ >"${lock}/pid" - return 1 + return 0 } RELEASE(){ + local lock lock="${1}.lock" if [ "$(cat "$lock/pid")" = "$$" ]; then rm "$lock/pid" @@ -51,29 +56,38 @@ RELEASE(){ printf '%i\n' $$ >"${lock}/pid" return 1 fi + return 0 else printf 'Refusing to release foreign lock: %s\n' "$lock" >&2 return 1 fi } +STRING=' + s;\\;\\\\;g; + s;\n;\\n;g; + s;\t;\\t;g; + s;\r;\\r;g; + s;\+;\\+;g; + s; ;+;g; +' + STRING(){ - printf %s "$*" |sed -r ' - :X; $!{N;bX;} - s;\\;\\\\;g; - s;\n;\\n;g; - s;\t;\\t;g; - s;\r;\\r;g; - ' + { [ $# -eq 0 ] && cat || printf %s "$*"; } \ + | sed -r ':X; $!{N;bX;}'"$STRING" } +UNSTRING=' + :UNSTRING_X + s;((^|[^\\])(\\\\)*)\\n;\1\n;g; + s;((^|[^\\])(\\\\)*)\\t;\1\t;g; + s;((^|[^\\])(\\\\)*)\\r;\1\r;g; + s;((^|[^\\])(\\\\)*)\+;\1 ;g; + tUNSTRING_X; + s;((^|[^\\])(\\\\)*)\\\+;\1+;g; + s;\\\\;\\;g; +' UNSTRING(){ - printf %s "$*" |sed -r ' - :X - s;((^|[^\\])(\\\\)*)\\n;\1\n;g; - s;((^|[^\\])(\\\\)*)\\t;\1\t;g; - s;((^|[^\\])(\\\\)*)\\r;\1\r;g; - tX; - s;\\\\;\\;g; - ' + { [ $# -eq 0 ] && cat || printf %s "$*"; } \ + | sed -r "$UNSTRING" }