1#!/bin/bash
2
3if [ $# -eq 0 ] || [ ! -f $1 ]; then
4	echo "Usage: $0 <playlist> [partition]"
5	exit 1
6fi
7
8if [ "x$2" = "x" ]; then
9	dev=$(mount | grep "on / " | cut -d ' ' -f 1)
10else
11	dev=$2
12fi
13
14in=$1
15out=${in%.playlist}.logical_playlist
16
17echo "Using $dev as the root device"
18echo "Converting $in to $out"
19
20blocks=$(mktemp /tmp/blocks.XXXXXX)
21files=$(mktemp /tmp/files.XXXXXX)
22sorted=$(mktemp /tmp/sorted.XXXXXX)
23
24echo -n "Getting blocks from $in ..."
25sudo BootCacheControl -f $in print | egrep '^([0-9A-F]){8}-' |\
26       	awk '{for (i = 0;i < $3; i += 4096) {print ($2+i)/512}}' > $blocks
27echo " done."
28
29echo -n "Finding files on disk..."
30sudo fsck_hfs -B $blocks -f $dev > $files
31echo " done."
32
33echo -n "Sorting..."
34grep ROOT_OF_VOLUME $files | cut -d '"' -f 2 | sed 's/ROOT_OF_VOLUME//' | sort -u > $sorted
35echo " done."
36
37echo -n "Filtering out non files..."
38(
39	while read file; do
40		if [ -f "$file" ]; then echo $file; fi
41	done
42) <$sorted >$out
43echo " done."
44
45rm $blocks
46rm $files
47rm $sorted
48