set -eu
VAR=$HOME/.var/offlineimap
-LOCKFILE="$VAR/.cron.lock"
-trap "rm -f $LOCKFILE" 0 1 2 3 4 5 6 7 8 10 11 12 13 14 15
-if ! lockfile -0 -r0 -l 3600 "$LOCKFILE" 2>/dev/null; then
- echo "E: offlineimap is already running." >&2
- exit 1
+DEFAULT_ACCOUNT=madduck.net
+
+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
+ accounts=$DEFAULT_ACCOUNT
+else
+ accounts=$(echo "$accounts" | sed -e 's/,/ /g')
fi
if ! test -t 0; then
- echo Renicing because we are not run interactively… >&2
+ say "I: Renicing because we are not run interactively…"
renice 20 -p $$ >/dev/null
ionice -c3 -p $$
fi
-ret=0
-/usr/bin/offlineimap -o "$@" || exit $?
+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
+}
-if [ -x "$(command -v notmuch)" ]; then
- notmuch new || exit $?
+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