+#!/bin/bash
+# 2009-07-25, alex@barton.de
+
+DEBUG=
+VERBOSE=1
+
+backup_d=""
+call_db=""
+
+[ -n "$DEBUG" ] && VERBOSE=1
+
+abort() {
+ echo "$*"
+ exit 1
+}
+
+message() {
+ echo "$*"
+}
+verbose() {
+ [ -n "$VERBOSE" ] && message "$*"
+}
+debug() {
+ [ -n "$DEBUG" ] && verbose "$*"
+}
+
+umask 0077
+
+NAME=`basename "$0" | cut -d'.' -f1`
+DATA_DIR=~/Library/Application\ Support/$NAME
+CALL_LOG="${DATA_DIR}/call.log"
+CALL_TMP="/tmp/$NAME.$$.call.log.tmp"
+debug "DATA_DIR=$DATA_DIR"
+
+mkdir -p "$DATA_DIR" || abort "Can't create \"$DATA_DIR\"!"
+
+if [ -z "$backup_d" ]; then
+ verbose "Locating backup directory ..."
+ cd ~/Library/Application\ Support/MobileSync/Backup/ \
+ || abort "No backup data stores found!?"
+ cd * \
+ || abort "Can't access backup directory!?"
+else
+ cd "$backup_d" || abort "Can't access backup directory!?"
+fi
+verbose "iPhone Backup directory is \"$PWD\"."
+
+if [ -z "$call_db" ]; then
+ verbose "Locating SQLite call database ..."
+ call_db=$(for f in `file * | fgrep SQLite | cut -d':' -f1`; do
+ sqlite3 "$f" ".schema" | fgrep "CREATE TABLE call (" >/dev/null;
+ [ $? -eq 0 ] && echo "$f"; done
+ )
+fi
+verbose "Call database is \"$call_db\"."
+
+if [ -e "$CALL_LOG" ]; then
+ debug "Copying existing ASCII call log ..."
+ cp "$CALL_LOG" "$CALL_TMP" || abort "Can't copy old log file!"
+fi
+verbose "Dumping SQLite call databse ..."
+sqlite3 "$call_db" "select * from call;" >>"$CALL_TMP"
+verbose "Sorting plain ASCII call log ..."
+sort -u "$CALL_TMP" >"$CALL_LOG"
+rm -f "$CALL_TMP"
+first_d=$(date -r `head -1 "$CALL_LOG" | cut -d'|' -f3` "+%Y-%m-%d %H:%M")
+last_d=$(date -r `tail -1 "$CALL_LOG" | cut -d'|' -f3` "+%Y-%m-%d %H:%M")
+message `wc -l "$CALL_LOG" | awk '{print \$1}'`" unique entries logged, from $first_d to $last_d."