Bash version of trsync
diff --git a/functions/common.sh b/functions/common.sh
new file mode 100644
index 0000000..9d0d956
--- /dev/null
+++ b/functions/common.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+cleanup_and_exit()
+{
+    trap EXIT
+    exit ${1:-0}
+}
+
+fail_exit()
+{
+    echo "$@"
+    cleanup_and_exit 1
+}
+
+job_lock() {
+    [ -z "$1" ] && fail_exit "Lock file is not specified"
+    local LOCKFILE=$1
+    shift
+    local fd=1000
+    eval "exec $fd>>$LOCKFILE"
+    case $1 in
+        "set")
+            flock -x -n $fd \
+                || fail_exit "Process already running. Lockfile: $LOCKFILE"
+            ;;
+        "unset")
+            flock -u $fd
+            rm -f $LOCKFILE
+            ;;
+        "wait")
+            local TIMEOUT=${2:-3600}
+            [ "${VERBOSE}" == "true" ] \
+                && echo "Waiting of concurrent process (lockfile: $LOCKFILE, timeout = $TIMEOUT seconds) ..."
+            flock -x -w $TIMEOUT $fd \
+                || fail_exit "Timeout error (lockfile: $LOCKFILE)"
+            ;;
+    esac
+}
+
+trap fail_exit EXIT