+# this is a wrapper for doing lock functions.
+#
+# it lets us depend on either lockfile-progs (preferred) or procmail's
+# lockfile, and should
+lock() {
+ local use_lockfileprogs=true
+ local action="$1"
+ local file="$2"
+
+ if ! ( which lockfile-create >/dev/null 2>/dev/null ) ; then
+ if ! ( which lockfile >/dev/null ); then
+ failure "Neither lockfile-create nor lockfile are in the path!"
+ fi
+ use_lockfileprogs=
+ fi
+
+ case "$action" in
+ create)
+ if [ -n "$use_lockfileprogs" ] ; then
+ lockfile-create "$file" || failure "unable to lock '$file'"
+ else
+ lockfile -r 20 "${file}.lock" || failure "unable to lock '$file'"
+ fi
+ ;;
+ touch)
+ if [ -n "$use_lockfileprogs" ] ; then
+ lockfile-touch --oneshot "$file"
+ else
+ : Nothing to do here
+ fi
+ ;;
+ remove)
+ if [ -n "$use_lockfileprogs" ] ; then
+ lockfile-remove "$file"
+ else
+ rm -f "${file}.lock"
+ fi
+ ;;
+ *)
+ failure "bad argument for lock subfunction '$action'"
+ esac
+}
+
+
+# for portability, between gnu date and BSD date.
+# arguments should be: number longunits format
+
+# e.g. advance_date 20 seconds +%F
+advance_date() {
+ local gnutry
+ local number="$1"
+ local longunits="$2"
+ local format="$3"
+ local shortunits
+
+ # try things the GNU way first
+ if date -d "$number $longunits" "$format" >/dev/null 2>&1; then
+ date -d "$number $longunits" "$format"
+ else
+ # otherwise, convert to (a limited version of) BSD date syntax:
+ case "$longunits" in
+ years)
+ shortunits=y
+ ;;
+ months)
+ shortunits=m
+ ;;
+ weeks)
+ shortunits=w
+ ;;
+ days)
+ shortunits=d
+ ;;
+ hours)
+ shortunits=H
+ ;;
+ minutes)
+ shortunits=M
+ ;;
+ seconds)
+ shortunits=S
+ ;;
+ *)
+ # this is a longshot, and will likely fail; oh well.
+ shortunits="$longunits"
+ esac
+ date "-v+${number}${shortunits}" "$format"
+ fi
+}
+
+