From 03e00b27862368d0dac6cbf8a33c1cd757d6a6e3 Mon Sep 17 00:00:00 2001 From: Gerrit Pannek Date: Mon, 13 Nov 2017 11:35:11 +0100 Subject: [PATCH] Did some improvements, Version bump to 0.9 --- Changelog.txt => CHANGELOG | 7 + COPYRIGHT | 0 Makefile | 22 ++- README | 67 -------- README.md | 81 ++++++++++ bin/mksdiso | 316 ++++++++++++++++++------------------- 6 files changed, 256 insertions(+), 237 deletions(-) rename Changelog.txt => CHANGELOG (69%) mode change 100755 => 100644 COPYRIGHT delete mode 100755 README create mode 100644 README.md diff --git a/Changelog.txt b/CHANGELOG similarity index 69% rename from Changelog.txt rename to CHANGELOG index 9704123..3b4d2a7 100644 --- a/Changelog.txt +++ b/CHANGELOG @@ -25,3 +25,10 @@ Version 0.8 - (Fixed) Filenames including spaces/special characters - (Improved) Tool-detection in burncdi & mksdiso - (Improved) Much minor stuff.. + +Version 0.9 +- (Improved) A lot of code / Error-Catching / Output / ... +- (Changed) CDI/ISOs are now extracted to /tmp/mksdio_USERNAME_XXXXX +- (Changed) Output-File will be written in current working directory, if no filename is given +- (Fixed) Error when only one Session in CDI +- (Fixed) Error when 1ST_READ can't be found using "dd" diff --git a/COPYRIGHT b/COPYRIGHT old mode 100755 new mode 100644 diff --git a/Makefile b/Makefile index d07378e..aa51c18 100644 --- a/Makefile +++ b/Makefile @@ -6,20 +6,32 @@ default: @echo " package | Build debian Package" @echo " install | install to /usr/local/bin" @echo " clean | cleanup package build directory" - exit 0 + exit 0 package: - mkdir -p $(BUILD_DIR)/usr/bin $(BUILD_DIR)/etc/mksdiso $(BUILD_DIR)/DEBIAN + mkdir -p $(BUILD_DIR)/usr/bin $(BUILD_DIR)/usr/share/mksdiso $(BUILD_DIR)/DEBIAN cp debian/control $(BUILD_DIR)/DEBIAN/ cp bin/* $(BUILD_DIR)/usr/bin/ - cp -r mksdiso/* $(BUILD_DIR)/etc/mksdiso/ - sed -i 's/^DATADIR=.*/DATADIR=\/etc\/mksdiso/' $(BUILD_DIR)/usr/bin/mksdiso + cp -r mksdiso/* $(BUILD_DIR)/usr/share/mksdiso/ + sed -i 's/^DATADIR=.*/DATADIR=\/usr\/share\/mksdiso/' $(BUILD_DIR)/usr/bin/mksdiso sed -i 's/^Version:.*/Version:\ $(VERSION)/' $(BUILD_DIR)/DEBIAN/control dpkg-deb --build $(BUILD_DIR) +# Local install, modifes mksdiso-data-path to /usr/local/share/mksdiso install: cp -r bin/* /usr/local/bin/ - cp -r mksdiso ~/.mksdiso + sed -i 's/^DATADIR=.*/DATADIR=\/usr\/local\/share\/mksdiso/' /usr/local/bin/mksdiso + mkdir -p /usr/local/share || true + cp -r mksdiso /usr/local/share/ + +uninstall: + rm -r /usr/local/share/mksdiso || true + rm /usr/local/bin/mksdiso || true + rm /usr/local/bin/cdirip || true + rm /usr/local/bin/isofix || true + rm /usr/local/bin/binhack32 || true + rm /usr/local/bin/burncdi || true + rm /usr/local/bin/scramble || true clean: rm -r build/ diff --git a/README b/README deleted file mode 100755 index d884a12..0000000 --- a/README +++ /dev/null @@ -1,67 +0,0 @@ -mksdiso - Verison: 0.8 - -This toolkit is a collection of free tools & scripts (for Linux), that can be used to create SDISO-Files which can run using Dreamshell on a Sega Dreamcast. Or burn a CDI-Image to disc. - -mksdiso itself can be called the "SDISO Multimaker" for Linux. - -This Git-Repository includes: - - binhack32 (IP.BIN/BOOT.BIN SB Hacker - 32bit BINHACK Clone by FamilyGuy 2010) - - isofix (ISO LBA fixer 1.3 - (C) 2001 by DeXT) - - scramble ("scrambler" for 1ST_READ.BIN) - - cdirip (Ver. 0.6.2 - (C) 2001 by DeXT - Hacked for Linux by me 2012) - - burncdi (Script for burning CDI-Files using Linux - By milksheik & me) - - mksdiso (Script to convert a Dir/CDI/ISO to Dreamshell SD-ISO format) - - -Requirements: - - 7zip for ISO extraction - - genisoimage or mkisofs to create SD-ISOs - - wodim or cdrecord for burning CDI-Files - - On Ubuntu/Debian run: - $ sudo apt-get install p7zip wodim genisoimage - - -Installation: - On Ubuntu/Debian: - ------------------ - 1. Download latest release .deb-file: https://github.com/Nold360/mksdiso/releases - 2. Install file - $ sudo dpkg -i mksdiso-*-all.deb - - 3. Install dependencies - $ sudo apt-get -f install - - - On any other Linux-Distribution: - --------------------------------- - 0. Clone git & change directory: - $ git clone https://github.com/Nold360/mksdiso - $ cd mksdiso - - 1. Copy Scripts & Binaries into $PATH: - $ sudo cp ./bin/* /usr/local/bin/ - - 2. Copy mksdiso folder, including required files into your home: - $ cp -r mksdiso ~/.mksdiso - - 4. Run mksdiso - 5. Have fun! :) - - -Usage: - Convert (Katana) myImage.cdi to SDISO: - $ mksdiso -k myImage.cdi - - Convert (Homebrew) myImage.cdi to SDISO: - $ mksdiso -h myImage.cdi - - Convert (Katana) ISO to SDISO: - $ mksdiso -k myImage.iso - - Pack Homebrew-Folder into SDISO: - $ mksdiso -h myFolder/ - - -Sources for all the binarys are also included. -Thanks to the creaters of all these tools. diff --git a/README.md b/README.md new file mode 100644 index 0000000..03b3dbe --- /dev/null +++ b/README.md @@ -0,0 +1,81 @@ +# mksdiso - Verison: 0.9 +## General +This toolkit is a collection of free tools & scripts (for Linux), that can be used to create SDISO-Files which can run using Dreamshell on a Sega Dreamcast. Or burn a CDI-Image to disc. + +mksdiso itself can be called the "SDISO Multimaker" for Linux. +To burn CDI-Images on Linux, there is also a included script called "burncdi". + +This Git-Repository includes: + - binhack32 (IP.BIN/BOOT.BIN SB Hacker - 32bit BINHACK Clone by FamilyGuy 2010) + - isofix (ISO LBA fixer 1.3 - (C) 2001 by DeXT) + - scramble ("scrambler" for 1ST_READ.BIN) + - cdirip (Ver. 0.6.2 - (C) 2001 by DeXT - Hacked for Linux by me 2012) + - burncdi (Script for burning CDI-Files using Linux - By milksheik & me) + - mksdiso (Script to convert a Dir/CDI/ISO to Dreamshell SD-ISO format) + + +## Dependencies + - 7zip (for ISO extraction without need of root) + - genisoimage or mkisofs (to repack ISOs) + - wodim or cdrecord (optional for mksdiso, used for burning CDI-Files using burncdi) + +### For Ubuntu/Debian: +``` +$ sudo apt-get install p7zip wodim genisoimage +``` + +## Installation +### On Ubuntu/Debian +1. Download latest .deb-file from [Releases](https://github.com/Nold360/mksdiso/releases) +2. Install deb +``` +$ sudo dpkg -i mksdiso-*-all.deb +``` +3. Install dependencies +``` +$ sudo apt-get -f install +``` + +On any other Distribution: +--------------------------------- +0. Clone git repo: +``` +$ git clone https://github.com/Nold360/mksdiso +$ cd mksdiso +``` + +1. Copy scripts & binaries into $PATH: +``` +$ sudo cp ./bin/* /usr/local/bin/ +``` + +2. Copy mksdiso folder, including required files into your home: +``` +$ cp -r mksdiso ~/.mksdiso +``` + +4. Run mksdiso +5. Have fun! :) + + +## Usage +Convert (Katana) myImage.cdi to SDISO: +``` + $ mksdiso -k myImage.cdi +``` +Convert (Homebrew) myImage.cdi to SDISO: +``` + $ mksdiso -h myImage.cdi +``` +Convert (Katana) ISO to SDISO: +``` + $ mksdiso -k myImage.iso +``` +Pack Homebrew-Folder into SDISO: +``` + $ mksdiso -h myFolder/ myGreatApp.iso +``` + +## Misc +Sources for all the binarys are also included. +Thanks to the creators of all these tools. diff --git a/bin/mksdiso b/bin/mksdiso index 7ede10c..05c7f91 100755 --- a/bin/mksdiso +++ b/bin/mksdiso @@ -1,44 +1,29 @@ #!/bin/bash -############################################################################################################## -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -############################################################################################################## -# Copyright (c) 2012, Nold, http://nold.freeunix.net -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# - Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# - Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -############################################################################################################### -set -u trap cleanup EXIT SIGINT SIGKILL IFS=$'\n' -VERSION="0.8-3" +VERSION="0.9" echo "mksdiso Ver. $VERSION | By Nold 2013-2017 | Visit: https://nold.in" -# Directory which includes the IP.BIN files included in this git +# Directory which includes the IP.BIN files included in mksdiso source git DATADIR=$HOME/.mksdiso +# Set save defaults +DEL_IN_DIR=0 + function usage() { echo "Usage: $(basename $0) < -h | -k > [OUTPUT-DIR/-ISO]" + echo "This script convertes a "normal" Dreamcast game image into a SD-ISO-Image" + echo "For usage with Dreamshell ISO-Loader" + echo + echo "Paramaters:" echo -e "\t-h | Create ISO from Homebrew" - echo -e "\t-k | Create ISO from Katana Image\n" + echo -e "\t-k | Create ISO from Katana Image\n" + echo + echo "Supported Source-Files: CDI, ISO, Directory" + echo "Feel free to open issues/contribute at https://github.com/nold360/mksdiso" } +# Check for needed binaries function check_dependencies() { if ! type mkisofs &>/dev/null ; then if ! type genisoimage &>/dev/null ; then @@ -51,7 +36,7 @@ function check_dependencies() { ISOTOOL=mkisofs fi - for bin in binhack32 cdirip isofix mksdiso scramble 7z; do + for bin in binhack32 cdirip isofix scramble 7z; do if ! type $bin &>/dev/null ; then echo "Please install $bin or include it in \$PATH" exit 1 @@ -59,66 +44,75 @@ function check_dependencies() { done if [ ! -d $DATADIR ] ; then - echo "Data-Dir not found. Please copy the 'mksdiso' from git to $DATADIR" + echo "Data-Dir not found. Please copy the 'mksdiso'-directory from git to $DATADIR" exit 1 fi } +# Cleanup temporary files on exit function cleanup() { - rm -rf --one-file-system "$EXT_PATH" "$OUT_PATH" $IN_FILE.out 2>/dev/null + rm -rf --one-file-system "$EXT_PATH" $LOGFILE 2>/dev/null if [ "$DEL_IN_DIR" == "1" ] ; then rm -rf --one-file-system $IN_DIR 2>/dev/null fi } +# Hack LBA of 1ST_READ.BIN +# Params: TARGET_DIR (including 1ST_READ.BIN) +# Return: 0|1 (Successfull or not) function hack_lba() { #ARGs: target-dir - if [ ! -f $1/1ST_READ.BIN ] ; then - if [ -f $1/1st_read.bin ] ; then - mv $1/1st_read.bin $1/1ST_READ.BIN + if [ ! -f "${1}/1ST_READ.BIN" ] ; then + if [ -f "${1}/1st_read.bin" ] ; then + mv "${1}/1st_read.bin" "${1}/1ST_READ.BIN" else - echo "---------------------------------------------------" - echo "Couldn't read 1ST_READ.BIN" - echo "---------------------------------------------------" + echo "--> ERROR: Couldn't find 1ST_READ.BIN in '${1}'" return 1 fi - fi - cp $DATADIR/katana/IP.BIN . - echo -e -n "$1/1ST_READ.BIN\nIP.BIN\n0\n" | binhack32 + fi + + # FIXME: Copy IP.BIN, Workaround for binhack32 :/ + cp ${DATADIR}/katana/IP.BIN IP.BIN + echo -e -n "${1}/1ST_READ.BIN\nIP.BIN\n0\n" | binhack32 rm IP.BIN return 0 } -#Reads out the name of the "1ST_READ.BIN" - It's different in some games... +# Reads out the name of the "1ST_READ.BIN" - It's different in some games... +# Params: ISO-File +# Return: none - echoes 1st_read.bin-name function extract_1st_read_name() { #ARGs: ISO-File - FILE=$1 - echo $(dd if=$FILE skip=96 count=16 bs=1 2>/dev/null | awk '/\.BIN/ {print $1}') + st_read=$(dd if=${1} skip=96 count=16 bs=1 2>/dev/null | awk '/\.BIN/ {print $1}') + if [ -z "$st_read" ] ; then + echo "--> WARNING: Didn't find 1ST_READ.BIN using dd.." >/dev/stderr + echo " --> Trying to continue..." >/dev/stderr + echo "1ST_READ.BIN" + else + echo $st_read + fi } -function extract_image() { #ARGs File, Destionation Path +# Extract CDI/ISO Images, hack LBA & Stuff +# Params: +# IN_FILE - CDI/ISO +function extract_image() { + set -u IN_FILE=$1 - OUT_PATH=$2 - EXT_PATH="$(dirname "$OUT_PATH")/cdi_$(basename "$IN_FILE" | sed 's/[^a-z|A-Z|0-9|\.|\/]//g;')" - - mkdir "$OUT_PATH" - if [ ! -d "$OUT_PATH" ] ; then - echo "ERROR: Couldn't create directory '$OUT_PATH'" - exit 1 - fi + + # Path for CDI extraction + EXT_PATH=$2 + + # Logfile for CDI-RIP + LOGFILE=$(mktemp /tmp/mksdiso_${USER}_log.XXXXX) + + # Path for iso extraction + OUT_PATH="${EXT_PATH}/data" #CDI file? if echo $IN_FILE | egrep -q "\.cdi$" ; then - mkdir "$EXT_PATH" &> /dev/null - if [ ! -d "$EXT_PATH" ] ; then - echo "---------------------------------------------------" - echo "ERROR: Couldn't create Directory '$EXT_PATH'" - echo "---------------------------------------------------" - exit 2 - fi - - cdirip "$IN_FILE" "$EXT_PATH" | tee "$IN_FILE.out" - if [ $(cat "$IN_FILE.out" | wc -l) -le 7 ] ; then + cdirip "$IN_FILE" "$EXT_PATH" | tee "$LOGFILE" + if [ $(cat "$LOGFILE" | wc -l) -le 7 ] ; then echo "---------------------------------------------------" - echo "ERROR: cdirip dosn't look good - Exiting!" + echo " ERROR: cdirip output doesn't look good - Exiting!" echo "---------------------------------------------------" exit 1 fi @@ -126,148 +120,138 @@ function extract_image() { #ARGs File, Destionation Path # No CDDA-Audio Support in (SD-)ISO :/ rm "$EXT_PATH"/taudio*.wav "$EXT_PATH/tdisc.cue" &>/dev/null - echo "---------------------------------------------------" - echo "Trying to fix extracted iso..." - for line in $(grep ^Saving $IN_FILE.out | grep ISO); do + echo "--> Trying to fix extracted iso(s)..." + for line in $(grep ^Saving $LOGFILE); do ISO_NR=$(echo $line | awk '{print $3}') if [ $ISO_NR -lt 9 ] ; then ISO_NR="0$ISO_NR" fi - LBA=$(echo $line | awk '{print $9}') + LBA=$(echo $line | awk '{print $NF}') + if [ -z "$LBA" ] ; then + echo "--> WARNING: Invalid LBA: ${LBA}... Trying to continue.." + LBA=0 + fi - echo "---------------------------------------------------" - echo "Extracting META-Informations to obtain 1ST_READ.BIN name..." + echo "--> Extracting META-Informations to obtain 1ST_READ.BIN name..." SR_READ=$(extract_1st_read_name $EXT_PATH/tdata$ISO_NR.iso) - if [ $? -ne 0 ] ; then - echo "ERROR: Couldn't read 1ST_READ.BIN from Image..." - exit 2 + if [ $? -ne 0 ] || [ -z "$SR_READ" ] ; then + echo "--> WARNING: Couldn't read 1ST_READ.BIN from Image..." + echo " --> Trying to continue anyways..." + SR_READ="1ST_READ.BIN" fi + # Test 1st_read if [ "$SR_READ" == "1ST_READ.BIN" ] ;then - echo "Look's fine... Everything where it belongs!" + echo " -- Look's fine... Everything where it belongs!" elif [ "$SR_READ" != "" ] ; then - echo "Found that bit** as $SR_READ!" + echo "--> Found 1ST_READ.BIN as $SR_READ!" else - echo "No 1ST_READ.BIN found in tdata$ISO_NR.iso!" + echo "--> WARNING: No 1ST_READ.BIN found in tdata$ISO_NR.iso!" if [ "$ISO_NR" == "01" ] ; then - echo "Trying to continue.. Handling as fixed!" - mv "$EXT_PATH/tdata$ISO_NR.iso" "$EXT_PATH/fixed_tdata$ISO_NR.iso" + echo " --> Trying to continue.. Handling as fixed!" continue - elif [ "$LBA" == "" ] ; then - echo "Let's try to fix it..." fi fi - isofix "${EXT_PATH}/tdata${ISO_NR}.iso" "${EXT_PATH}/fixed_tdata${ISO_NR}.iso" $LBA &&\ + + # Fix iso LBA + if [ "$LBA" != "0" ] ; then + isofix "${EXT_PATH}/tdata${ISO_NR}.iso" "${EXT_PATH}/fixed_tdata${ISO_NR}.iso" $LBA &&\ rm "${EXT_PATH}/tdata${ISO_NR}.iso" + else + mv "$EXT_PATH/tdata$ISO_NR.iso" "$EXT_PATH/fixed_tdata$ISO_NR.iso" + fi done - rm $IN_FILE.out bootfile.bin header.iso - - echo "---------------------------------------------------" - echo "Extracting data from image... This could take a while..." - echo "---------------------------------------------------" + + echo " - Extracting data from image... This could take a while..." for file in $(ls -1 "$EXT_PATH"/fixed_tdata*.iso); do 7z -bb1 -aoa -o"${OUT_PATH}" x "$file" - rm $file + #rm $file done else #Just a single ISO - echo "---------------------------------------------------" - echo "Extracting META-Informations to obtain 1ST_READ.BIN name.." + echo " - Extracting META-Informations to obtain 1ST_READ.BIN name.." SR_READ=$(extract_1st_read_name $IN_FILE) - if [ $? -ne 0 ] ; then - echo "ERROR: Couldn't read 1ST_READ.BIN from Image..." - exit 2 + if [ $? -ne 0 ] || [ -z "$SR_READ" ] ; then + echo "--> WARNING: Couldn't read 1ST_READ.BIN from Image..." + echo " --> Trying to continue anyways..." + SR_READ="1ST_READ.BIN" fi if [ "$SR_READ" == "1ST_READ.BIN" ] ;then - echo "Look's fine... Everything where it belongs!" + echo "--> Look's fine... Everything where it belongs!" elif [ ! -z "$SR_READ" ] ; then - echo "Found 1ST_READ.BIN as $SR_READ!" + echo "--> Found 1ST_READ.BIN as $SR_READ!" fi - echo "---------------------------------------------------" - echo "Extracting Data from Image... This could take a while..." - echo "---------------------------------------------------" + echo "--> Extracting Data from Image... This could take a while..." 7z -bb1 -aoa -o"${OUT_PATH}" x "$IN_FILE" fi #Move 1st_read.bin where it belongs! if [ ! -z "$SR_READ" ] ; then if [ "$SR_READ" != "1ST_READ.BIN" ] ; then - echo "Moving '$SR_READ' to 1ST_READ.BIN!" + echo "--> Moving '$SR_READ' to 1ST_READ.BIN!" mv "$OUT_PATH/$SR_READ" "${OUT_PATH}/1ST_READ.BIN" else - echo "1ST_READ.BIN looks fine. Skipping moving..." - fi - else - echo "---------------------------------------------------" - echo "ERROR: Moving '$SR_READ' to 1ST_READ.BIN!" - echo "---------------------------------------------------" + echo "--> 1ST_READ.BIN looks fine. Skipping moving..." + fi + elif [ ! -e "$OUT_PATH/1ST_READ.BIN" ] ; then + echo "--> ERROR: Moving '$SR_READ' to 1ST_READ.BIN!" exit 5 - fi + fi } -function create_homebrew_iso() { #ARGs: Source, Destination, Destination Name +function create_homebrew_iso() { #ARGs: Source, Destination IN_DIR=$1 - OUT_DIR=$2 - OUT_NAME=$3 - TMP_DIR=$(mktemp -d) + OUT_NAME=$2 + TMP_DIR=$(mktemp -d /tmp/mksdiso_${USER}.XXXXX) if [ ! -f "$IN_DIR/1ST_READ.BIN" ] ; then if [ -f "$IN_DIR/1st_read.bin" ] ; then mv "$IN_DIR/1st_read.bin" "$IN_DIR/1ST_READ.BIN" else - echo "ERROR: Couldn't find $IN_DIR/1ST_READ.BIN!" + echo "--> ERROR: Couldn't find $IN_DIR/1ST_READ.BIN!" return 4 - fi + fi fi - cp "$IN_DIR/1ST_READ.BIN" "/$TMP_DIR/1ST_READ.BIN" - echo "---------------------------------------------------" - echo "Descrambling 1ST_READ.BIN..." + cp "$IN_DIR/1ST_READ.BIN" "$TMP_DIR/1ST_READ.BIN" + echo "--> Descrambling 1ST_READ.BIN..." scramble -d "$IN_DIR/1ST_READ.BIN" "$IN_DIR/unscrambled.bin" ||\ - (echo "ERROR while descrambling!" && return 1) + (echo " -- ERROR while descrambling!" && return 1) rm "$IN_DIR/1ST_READ.BIN" mv "$IN_DIR/unscrambled.bin" "$IN_DIR/1ST_READ.BIN" - echo "---------------------------------------------------" - echo "Repacking ISO..." - echo "---------------------------------------------------" - $ISOTOOL -V ${OUT_NAME:0:31} -G $DATADIR/homebrew/IP.BIN -J -r -l -o "$OUT_DIR/$OUT_NAME" "$IN_DIR" + echo "--> Repacking ISO..." + $ISOTOOL -V ${OUT_NAME:0:31} -G $DATADIR/homebrew/IP.BIN -J -r -l -o "$OUT_NAME" "$IN_DIR" rm "$IN_DIR/1ST_READ.BIN" mv "$TMP_DIR/1ST_READ.BIN" "$IN_DIR/1ST_READ.BIN" rm -r $TMP_DIR - if [ ! -e "$OUT_DIR/$OUT_NAME" ] ; then - echo "ERROR: $ISOTOOL failed while creating '$OUT_DIR/$OUT_NAME'" + if [ ! -e "$OUT_NAME" ] ; then + echo "--> ERROR: $ISOTOOL failed while creating '$OUT_NAME'" return 1 fi return 0 } -function create_katana_iso() { #ARGs: Source, Destination, Destination Name +function create_katana_iso() { #ARGs: Source, Destination IN_DIR=$1 - - OUT_DIR=$2 - OUT_NAME=$3 + OUT_NAME=$2 - echo "---------------------------------------------------" - echo "Hacking LBA..." - hack_lba $IN_DIR - - if [ $? -ne 0 ] ; then - echo "ERROR: Couldn't hack LBA of 1ST_READ.BIN" + echo "--> Hacking LBA..." + if ! hack_lba $IN_DIR ; then + echo "--> ERROR: Couldn't hack LBA of 1ST_READ.BIN" return 4 fi - echo "---------------------------------------------------" - echo "Creating ISO..." - $ISOTOOL -V ${OUT_NAME:0:31} -G $DATADIR/katana/IP.BIN -J -r -l -o "$OUT_DIR/$OUT_NAME" "$IN_DIR" - if [ -e "$OUT_DIR/$OUT_NAME" ] ; then - echo "ERROR: $ISOTOOL failed while creating '$OUT_DIR/$OUT_NAME'" + echo "--> Creating SD-ISO..." + $ISOTOOL -V ${OUT_NAME:0:31} -G $DATADIR/katana/IP.BIN -J -r -l -o "$OUT_NAME" "$IN_DIR" + if [ ! -e "$OUT_NAME" ] ; then + echo "--> ERROR: $ISOTOOL failed while creating '$OUT_NAME'" return 1 fi return 0 @@ -281,60 +265,62 @@ if [ $# -lt 2 -o "$1" != "-h" -a "$1" != "-k" ] ; then usage exit 1 fi +set -u #Check if Source is a directory or a file -IN_DIR=$(dirname "$2") if [ -d "$2" ] ; then - DEL_IN_DIR=0 + IN_DIR="$2" else - IN_FILENAME="$(basename "$2")" - IN_NAME=$(echo $IN_FILENAME | sed 's/[^a-z|A-Z|0-9|\.|\/]//g;') + IN_FILE="$2" + IN_NAME=$(basename "$2" | sed 's/[^a-z|A-Z|0-9|\.|\/]//g;') - if [ ! -e "$IN_FILENAME" ] ; then - echo "ERROR: Couldn't open file '$IN_FILENAME'" - exit 1 - fi + # IN_DIR for cdi extraction + IN_DIR=$(mktemp -d /tmp/mksdiso_${USER}.XXXXX) - mkdir "$IN_DIR" 2>/dev/null - if [ -d "$IN_DIR" ] ; then - extract_image "$IN_DIR/$IN_FILENAME" "$IN_DIR/ext_$IN_NAME" - else - echo "ERROR: Couldn't create directory '$IN_DIR'" - exit 1 - fi - IN_DIR="$IN_DIR/ext_$IN_NAME" + # RAW Data dir for (SD-)ISO (re)packing + IN_DATA_DIR="${IN_DIR}/data" + + # Remove IN_DIR if finished DEL_IN_DIR=1 fi set +u -if [ ! -z "$3" ] ; then +if [ ! -z "$3" ] ; then #Check if Destination is a directory or a fle - OUT_DIR=$(dirname $3) if [ -d "$3" ] ; then - OUT_NAME="$(echo $IN_NAME | cut -f1 -d.)-sd.iso" + OUT_NAME=$(echo $IN_NAME | sed 's/\.[a-zA-Z]*$/_sd.iso/') else - OUT_NAME=$(basename $3) + OUT_NAME=$3 fi else - OUT_DIR="./" + # Create a output-filename by using the input file OUT_NAME=$(echo $IN_NAME | sed 's/\.[a-zA-Z]*$/_sd.iso/') + if [ -e "$OUT_NAME" ] ; then + echo "--> ERROR: Output-File '${OUT_NAME}' already exists, select a different one!" + exit 1 + fi +fi +echo "--> Output File: '$OUT_NAME'" + +# Extract Image if needed... +if [ ! -z "$IN_FILE" ] ; then + set -u + extract_image "$IN_FILE" "$IN_DIR" fi -set -u -echo "Output Filename: '$OUT_NAME'" -#Choose what to do -case "$1" in - "-k" ) create_katana_iso "$IN_DIR" "$OUT_DIR" "$OUT_NAME" ;; - "-h" ) create_homebrew_iso "$IN_DIR" "$OUT_DIR" "$OUT_NAME" ;; +#Choose what to do with data/extracted image +case "$1" in + "-k" ) create_katana_iso "$IN_DATA_DIR" "$OUT_NAME" ;; + "-h" ) create_homebrew_iso "$IN_DATA_DIR" "$OUT_NAME" ;; * ) usage ; exit 1 ;; esac RET=$? echo "---------------------------------------------------" if [ $RET -eq 0 ] ; then - echo "SUCCESS: SD-ISO saved as $OUT_NAME" + echo "--> SUCCESS: SD-ISO saved as $OUT_NAME" else - echo "ERROR: An error accrued while creating $OUT_NAME" + echo "--> ERROR: An error accrued while creating $OUT_NAME" fi echo "---------------------------------------------------" exit $RET