#!/bin/bash ############################################################################### # # # IPFire.org - A linux based firewall # # Copyright (C) 2012 Michael Tremer & Christian Schmidt # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # # # ############################################################################### lock() { local lock="${1}" shift # Move locks with name only into lock directory if [ "${lock:0:1}" != "/" ]; then lock="${LOCK_DIR}/${lock}" fi local timeout="60" local ret=0 # Make partent directory make_parent_directory "${lock}" ( log DEBUG "Trying to acquire lock ${lock}" # Try to acquire lock on fd 9 if ! flock -w "${timeout}" 9; then log ERROR "Failed to acquire lock ${lock} after ${timeout} seconds" exit ${EXIT_ERROR} fi log DEBUG "Acquired lock ${lock}" # Remember return code ret=${EXIT_OK} # Run command "$@" || ret=$? log DEBUG "Released lock ${lock}" exit ${ret} ) 9>${lock} || ret=$? # Cleanup log file file_delete "${lock}" return ${ret} }