#!/bin/sh
set -eu
-[ "${1:-}" = -q ] && exec >/dev/null
-
VAR=$HOME/.var/offlineimap
-LOCKFILE="$VAR/.cron.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
- echo "E: offlineimap is already running." >&2
+
+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
+
+info() { [ -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
-trap trapfn 0
-
if ! test -t 0; then
- echo Renicing because we are not run interactively…
+ say "I: Renicing because we are not run interactively…"
renice 20 -p $$ >/dev/null
ionice -c3 -p $$
fi
-ret=0
-strace -tfo /tmp/offlineimap.strace /usr/bin/offlineimap "$@" || ret=$?
+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
+}
-trapfn
-exit $ret
+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