#!/bin/sh
set -eu

VAR=$HOME/.var/offlineimap

opts=
accounts=
quiet=
for opt in "$@"; do
  case "$opt" in
    --quiet)
      opts="${opts:+$opts }-uQuiet -l/dev/null"
      quiet=1
      ;;
    -a) continue;;
    -*) opts="${opts:+$opts }$opt";;
    *) accounts="${accounts:+$accounts }$opt";;
  esac
done

say() { [ -n "$quiet" ] || echo >&2 "$@"; }
err() { echo >&2 "$@"; }

if [ -z "$accounts" ]; then
  err "E: no account(s) specified…"
  exit 1
else
  accounts=$(echo "$accounts" | sed -e 's/,/ /g')
fi

if ! test -t 0; then
  say "I: Renicing because we are not run interactively…"
  renice 20 -p $$ >/dev/null
  ionice -c3 -p $$
fi

getlock()
{
  lockfile="$VAR/.$1.lock"
  trapfn() { rm -f "$lockfile"; trap - 0 1 2 3 4 5 6 7 8 10 11 12 13 14 15; }
  trap trapfn 1 2 3 4 5 6 7 8 10 11 12 13 14 15
  if [ -d "$VAR" ] && ! lockfile -0 -r0 -l 3600 "$lockfile" 2>/dev/null; then
    return 1
  fi
  trap trapfn 0
}

failures=0
for account in $accounts; do
  getlock "$account" || {
    err "E: unable to acquire lock for account $account, already running?"
    failures=$(($failures + 1))
    continue
  }

  eval /usr/bin/offlineimap -a $account -k metadata=$VAR/$account $opts || \
    failures=$(($failures + 1))

  trapfn
done

if [ $failures -gt 0 ]; then
  exit 1
else
  exit 0
fi