130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#!/bin/bash 230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Copyright (C) 2010 The Android Open Source Project 430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Licensed under the Apache License, Version 2.0 (the "License"); 630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# you may not use this file except in compliance with the License. 730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# You may obtain a copy of the License at 830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# http://www.apache.org/licenses/LICENSE-2.0 1030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 1130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Unless required by applicable law or agreed to in writing, software 1230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# distributed under the License is distributed on an "AS IS" BASIS, 1330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# See the License for the specific language governing permissions and 1530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# limitations under the License. 1630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 1730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 1830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# mkobb.sh - Creates OBB files on Linux machines 1930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 2030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Directory where we should temporarily mount the OBB loopback to copy files 2130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny RootMOUNTDIR=/tmp 2230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 2330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Presets. Changing these will probably break your OBB on the device 24735de3b38abbd6564082a819377673ee593744a6Kenny RootCRYPTO=twofish 2530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny RootFS=vfat 2630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny RootMKFS=mkfs.vfat 2730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny RootLOSETUP=losetup 2830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny RootBLOCK_SIZE=512 2930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny RootSLOP=512 # Amount of filesystem slop in ${BLOCK_SIZE} blocks 3030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 3130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfind_binaries() { 3230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root MKFSBIN=`which ${MKFS}` 3330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root LOSETUPBIN=`which ${LOSETUP}` 3430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root MOUNTBIN=`which mount` 3530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root UMOUNTBIN=`which umount` 3630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root DDBIN=`which dd` 3730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root RSYNCBIN=`which rsync` 383b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root PBKDF2GEN=`which pbkdf2gen` 3930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root} 4030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 4130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootcheck_prereqs() { 4230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if [ "`uname -s`x" != "Linuxx" ]; then \ 4330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: This script only works on Linux!" 4430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 4530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 4630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 4730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if ! egrep -q "^cryptoloop " /proc/modules; then \ 4830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: Could not find cryptoloop in the kernel." 4930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "Perhaps you need to: modprobe cryptoloop" 5030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 5130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 5230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 5330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if ! egrep -q "name\s*:\s*${CRYPTO}$" /proc/crypto; then \ 5430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: Could not find crypto \`${CRYPTO}' in the kernel." 5530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "Perhaps you need to: modprobe ${CRYPTO}" 5630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 5730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 5830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 5930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if ! egrep -q "^\s*${FS}$" /proc/filesystems; then \ 6030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: Could not find filesystem \`${FS}' in the kernel." 6130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "Perhaps you need to: modprobe ${FS}" 6230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 6330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 6430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 6530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if [ "${MKFSBIN}x" = "x" ]; then \ 6630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: Could not find ${MKFS} in your path!" 6730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 6830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root elif [ ! -x "${MKFSBIN}" ]; then \ 6930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: ${MKFSBIN} is not executable!" 7030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 7130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 7230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 7330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if [ "${LOSETUPBIN}x" = "x" ]; then \ 7430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: Could not find ${LOSETUP} in your path!" 7530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 7630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root elif [ ! -x "${LOSETUPBIN}" ]; then \ 7730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: ${LOSETUPBIN} is not executable!" 7830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 7930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 803b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root 813b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root if [ "${PBKDF2GEN}x" = "x" ]; then \ 823b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root echo "ERROR: Could not find pbkdf2gen in your path!" 833b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root exit 1 843b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root fi 8530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root} 8630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 8730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootcleanup() { 8830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if [ "${loopdev}x" != "x" ]; then \ 8930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root ${LOSETUPBIN} -d ${loopdev} 9030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 9130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root} 9230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 9330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Roothidden_prompt() { 9430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root unset output 9530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root prompt="$1" 9630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root outvar="$2" 9730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root while read -s -n 1 -p "$prompt" c; do \ 9830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if [ "x$c" = "x" ]; then \ 9930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root break 10030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 10130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root prompt='*' 10230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root output="${output}${c}" 10330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root done 10430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo 10530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root eval $outvar="$output" 10630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root unset output 10730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root} 10830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 10930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootread_key() { 11030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root hidden_prompt " Encryption key: " key 11130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 11230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if [ "${key}x" = "x" ]; then \ 11330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: An empty key is not allowed!" 11430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 11530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 11630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 11730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root hidden_prompt "Encryption key (again): " key2 11830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 11930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if [ "${key}x" != "${key2}x" ]; then \ 12030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: Encryption keys do not match!" 12130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 12230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 12330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root} 12430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 12530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootonexit() { 12630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if [ "x${temp_mount}" != "x" ]; then \ 12730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root ${UMOUNTBIN} ${temp_mount} 12830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root rmdir ${temp_mount} 12930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 13030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if [ "x${loop_dev}" != "x" ]; then \ 131735de3b38abbd6564082a819377673ee593744a6Kenny Root if [ ${use_crypto} -eq 1 ]; then \ 132735de3b38abbd6564082a819377673ee593744a6Kenny Root dmsetup remove -f ${loop_dev} 133735de3b38abbd6564082a819377673ee593744a6Kenny Root ${LOSETUPBIN} -d ${old_loop_dev} 134735de3b38abbd6564082a819377673ee593744a6Kenny Root else \ 135735de3b38abbd6564082a819377673ee593744a6Kenny Root ${LOSETUPBIN} -d ${loop_dev} 136735de3b38abbd6564082a819377673ee593744a6Kenny Root fi 13730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 13830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if [ "x${tempfile}" != "x" -a -f "${tempfile}" ]; then \ 13930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root rm -f ${tempfile} 14030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 14130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root if [ "x${keyfile}" != "x" -a -f "${keyfile}" ]; then \ 14230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root rm -f ${keyfile} 14330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root fi 14430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "Fatal error." 14530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 14630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root} 14730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 14830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootusage() { 14930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "mkobb.sh -- Create OBB files for use on Android" 15030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "" 15130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo " -d <directory> Use <directory> as input for OBB files" 15230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo " -k <key> Use <key> to encrypt OBB file" 15330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo " -K Prompt for key to encrypt OBB file" 15430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo " -o <filename> Write OBB file out to <filename>" 15530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo " -v Verbose mode" 15630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo " -h Help; this usage screen" 15730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root} 15830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 15930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfind_binaries 16030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootcheck_prereqs 16130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 16230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootuse_crypto=0 16330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 1643b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Rootargs=`getopt -o d:hk:Ko:v -- "$@"` 16530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rooteval set -- "$args" 16630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 16730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootwhile true; do \ 16830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root case "$1" in 16930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root -d) directory=$2; shift 2;; 17030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root -h) usage; exit 1;; 17112ffd9bf4c2cc9075ea7602b4932f823ba940f80Kenny Root -k) key=$2; use_crypto=1; shift 2;; 17212ffd9bf4c2cc9075ea7602b4932f823ba940f80Kenny Root -K) prompt_key=1; use_crypto=1; shift;; 17330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root -v) verbose=1; shift;; 17430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root -o) filename=$2; shift 2;; 17530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root --) shift; break;; 17630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root *) echo "ERROR: Invalid argument in option parsing! Cannot recover. Ever."; exit 1;; 17730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root esac 17830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootdone 17930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 18030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ "${directory}x" = "x" -o ! -d "${directory}" ]; then \ 18130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: Must specify valid input directory" 18230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "" 18330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root usage 18430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1; 18530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi 18630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 18730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ "${filename}x" = "x" ]; then \ 18830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: Must specify filename" 18930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "" 19030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root usage 19130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1; 19230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi 19330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 19430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ ${use_crypto} -eq 1 -a "${key}x" = "x" -a 0${prompt_key} -eq 0 ]; then \ 19530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: Crypto desired, but no key supplied or requested to prompt for." 19630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 19730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi 19830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 19930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ 0${prompt_key} -eq 1 ]; then \ 20030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root read_key 20130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi 20230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 20330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootoutdir=`dirname ${filename}` 20430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ ! -d "${outdir}" ]; then \ 20530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: Output directory does not exist: ${outdir}" 20630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 20730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi 20830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 20930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Make sure we clean up any stuff we create from here on during error conditions 21030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Roottrap onexit ERR 21130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 21230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Roottempfile=$(tempfile -d ${outdir}) || ( echo "ERROR: couldn't create temporary file in ${outdir}"; exit 1 ) 21330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 214735de3b38abbd6564082a819377673ee593744a6Kenny Rootblock_count=`du -s --apparent-size --block-size=512 ${directory} | awk '{ print $1; }'` 21530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ $? -ne 0 ]; then \ 21630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: Couldn't read size of input directory ${directory}" 21730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root exit 1 21830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi 21930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 22030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootecho "Creating temporary file..." 22130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root${DDBIN} if=/dev/zero of=${tempfile} bs=${BLOCK_SIZE} count=$((${block_count} + ${SLOP})) > /dev/null 2>&1 22230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ $? -ne 0 ]; then \ 22330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root echo "ERROR: creating temporary file: $?" 22430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi 22530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 22630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootloop_dev=$(${LOSETUPBIN} -f) || ( echo "ERROR: losetup wouldn't tell us the next unused device"; exit 1 ) 22730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 228735de3b38abbd6564082a819377673ee593744a6Kenny Root${LOSETUPBIN} ${loop_dev} ${tempfile} || ( echo "ERROR: couldn't create loopback device"; exit 1 ) 229735de3b38abbd6564082a819377673ee593744a6Kenny Root 23030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ ${use_crypto} -eq 1 ]; then \ 2313b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root eval `${PBKDF2GEN} ${key}` 232735de3b38abbd6564082a819377673ee593744a6Kenny Root unique_dm_name=`basename ${tempfile}` 2333b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root echo "0 `blockdev --getsize ${loop_dev}` crypt ${CRYPTO} ${key} 0 ${loop_dev} 0" | dmsetup create ${unique_dm_name} 234735de3b38abbd6564082a819377673ee593744a6Kenny Root old_loop_dev=${loop_dev} 235735de3b38abbd6564082a819377673ee593744a6Kenny Root loop_dev=/dev/mapper/${unique_dm_name} 23630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi 23730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 23830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 23930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Create the filesystem 24030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 24130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootecho "" 24230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root${MKFSBIN} -I ${loop_dev} 24330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootecho "" 24430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 24530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 24630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Make the temporary mount point and mount it 24730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 24830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Roottemp_mount="${MOUNTDIR}/${RANDOM}" 24930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootmkdir ${temp_mount} 25030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root${MOUNTBIN} -t ${FS} -o loop ${loop_dev} ${temp_mount} 25130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 25230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 25330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# rsync the files! 25430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 25530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootecho "Copying files:" 25630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root${RSYNCBIN} -av --no-owner --no-group ${directory}/ ${temp_mount}/ 25730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootecho "" 25830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 25930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootecho "Successfully created \`${filename}'" 26030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 2613b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Rootif [ ${use_crypto} -eq 1 ]; then \ 2623b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root echo "salt for use with obbtool is:" 2633b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root echo "${salt}" 2643b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Rootfi 2653b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root 26630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 26730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Undo all the temporaries 26830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 26930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootumount ${temp_mount} 27030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootrmdir ${temp_mount} 271735de3b38abbd6564082a819377673ee593744a6Kenny Rootif [ ${use_crypto} -eq 1 ]; then \ 272735de3b38abbd6564082a819377673ee593744a6Kenny Root dmsetup remove -f ${loop_dev} 273735de3b38abbd6564082a819377673ee593744a6Kenny Root ${LOSETUPBIN} -d ${old_loop_dev} 274735de3b38abbd6564082a819377673ee593744a6Kenny Rootelse \ 275735de3b38abbd6564082a819377673ee593744a6Kenny Root ${LOSETUPBIN} -d ${loop_dev} 276735de3b38abbd6564082a819377673ee593744a6Kenny Rootfi 27730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootmv ${tempfile} ${filename} 27830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 27930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Roottrap - ERR 28030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root 28130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootexit 0 282