#!/bin/sh
if [ $# != 2 ]; then
 echo "Usage: $0 image.iso /dev/usb-drive" >&2
 exit 1
fi

if [ $(id -u) != 0 ]; then
 echo "Error: You must be root to run this script!" >&2
 exit 2
fi

SOURCE="$1"
TARGET="$2"

LABEL=$(file "$SOURCE"|cut -d\' -f2|sed 's/ß/ss/g;s/Ä/Ae/g;s/Ö/Oe/g;s/Ü/Ue/g;s/ä/ae/g;s/ö/oe/g;s/ü/ue/g;s/?//g;s/#/-/g;s/ *$//g'|tr ' :' '_-')

if [ $? != 0 ]; then
 echo "Error: $SOURCE is no iso file" >&2
 exit 3
fi

[ -z "$LABEL" ] && LABEL="USB_BOOT"

REM=$(cat /sys/block/${TARGET#/dev/}/removable 2>/dev/null)

if [ "$REM" != "1" ]; then
 echo "Error: No removeable drive $TARGET" >&2
 exit 4
fi

TMP_SYSLINUX=$(mktemp -td create-syslinux-usb-drive.XXXXXX)
TMP_SOURCE=$(mktemp -td create-syslinux-usb-drive-source.XXXXXX)
TMP_TARGET=$(mktemp -td create-syslinux-usb-drive-target.XXXXXX)

mount -o loop "$SOURCE" "$TMP_SOURCE"

#if [ -f "$TMP_SOURCE"/bootmgr ]; then
 VER=4.03
 FILE=syslinux-$VER.tar.gz
 URL=http://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/$FILE
#else
# VER=3.85
# FILE=syslinux-$VER.tar.gz
# URL=http://www.kernel.org/pub/linux/utils/boot/syslinux/3.xx/$FILE
#fi

#VER=4.03-pre6
#FILE=syslinux-$VER.tar.gz
#URL=http://www.kernel.org/pub/linux/utils/boot/syslinux/Testing/$FILE

SYSLINUX="$TMP_SYSLINUX"/syslinux-$VER/linux/syslinux
CHAIN_C32="$TMP_SYSLINUX"/syslinux-$VER/com32/modules/chain.c32
MENU_C32="$TMP_SYSLINUX"/syslinux-$VER/com32/menu/menu.c32
VESAMENU_C32="$TMP_SYSLINUX"/syslinux-$VER/com32/menu/vesamenu.c32
GFXBOOT_C32="$TMP_SYSLINUX"/syslinux-$VER/com32/gfxboot/gfxboot.c32
MBR_BIN="$TMP_SYSLINUX"/syslinux-$VER/mbr/mbr.bin

OPTIONS="umask=000,shortname=mixed,quiet,utf8"

SFDISK=/sbin/sfdisk
MKDOSFS=/sbin/mkdosfs

[ -x /usr/bin/curl ] && LOAD="/usr/bin/curl -s"
[ -x /usr/bin/wget ] && LOAD="/usr/bin/wget -qO-"

$LOAD $URL|tar -C "$TMP_SYSLINUX" -zxv

umount -l $TARGET* 2>/dev/null

dd if=/dev/zero of=$TARGET count=1
$SFDISK -D -uM $TARGET <<EOT
,,b,*
EOT

dd if=$MBR_BIN of=$TARGET
$MKDOSFS -F32 -n$LABEL ${TARGET}1
$SYSLINUX ${TARGET}1

mount -o $OPTIONS ${TARGET}1 "$TMP_TARGET"

cp -av "$TMP_SOURCE"/* "$TMP_TARGET"
[ -d "$TMP_SOURCE"/.disk ] && cp -av "$TMP_SOURCE"/.disk "$TMP_TARGET"

if [ -d "$TMP_TARGET"/isolinux ]; then
 sed -ri 's|(^display\s+)([a-zA-Z0-9])|\1/isolinux/\2|' "$TMP_TARGET"/isolinux/*.cfg
 sed -ri 's|(^include\s+)([a-zA-Z0-9])|\1/isolinux/\2|' "$TMP_TARGET"/isolinux/*.cfg
 sed -ri 's|(^f.\s+)([a-zA-Z0-9])|\1/isolinux/\2|' "$TMP_TARGET"/isolinux/*.cfg
 sed -i 's|^default vesamenu.c32|default /isolinux/vesamenu.c32|' "$TMP_TARGET"/isolinux/isolinux.cfg
 sed -ri 's|(^ui)|#\1|' "$TMP_TARGET"/isolinux/isolinux.cfg
 [ -f "$TMP_TARGET"/isolinux/stdmenu.cfg ] && sed -ri 's|^(menu background )(splash.png)|\1/isolinux/\2|' "$TMP_TARGET"/isolinux/stdmenu.cfg
 for x in menu.cfg exithelp.cfg; do
  [ -f "$TMP_TARGET"/isolinux/$x ] && sed -ri 's|(config\s+)([a-zA-Z0-9])|\1/isolinux/\2|' "$TMP_TARGET"/isolinux/$x
 done
fi

if [ -f "$TMP_TARGET"/isolinux/isolinux.cfg ]; then
 if [ -f "$TMP_TARGET"/isolinux/menu.c32 ]; then
  rm -f "$TMP_TARGET"/isolinux/menu.c32
  cp -v $MENU_C32 "$TMP_TARGET"/isolinux
 fi
 if [ -f "$TMP_TARGET"/isolinux/vesamenu.c32 ]; then
  rm -f "$TMP_TARGET"/isolinux/vesamenu.c32
  cp -v $VESAMENU_C32 "$TMP_TARGET"/isolinux
 fi
 if [ -f "$TMP_TARGET"/isolinux/data/vesamenu.c32 ]; then
  rm -f "$TMP_TARGET"/isolinux/data/vesamenu.c32
  cp -v $VESAMENU_C32 "$TMP_TARGET"/isolinux/data
 fi
 if [ -f "$TMP_TARGET"/isolinux/gfxboot.c32 ]; then
  rm -f "$TMP_TARGET"/isolinux/gfxboot.c32
  cp -v $GFXBOOT_C32 "$TMP_TARGET"/isolinux
 fi
 if ! grep -q isolinux "$TMP_TARGET"/isolinux/isolinux.cfg; then
  mv -v "$TMP_TARGET"/isolinux "$TMP_TARGET"/syslinux
  cp -v "$TMP_TARGET"/syslinux/isolinux.cfg "$TMP_TARGET"/syslinux/syslinux.cfg
 else
  cp -v "$TMP_TARGET"/isolinux/isolinux.cfg "$TMP_TARGET"/syslinux.cfg
 fi
fi

if [ -f "$TMP_TARGET"/bootmgr ]; then
 cp -v $CHAIN_C32 "$TMP_TARGET"
 cat > "$TMP_TARGET"/syslinux.cfg <<EOT
default chain.c32 hd0,1 ntldr=/bootmgr
EOT
fi

umount "$TMP_SOURCE" "$TMP_TARGET"
sync

rm -rf "$TMP_SOURCE" "$TMP_TARGET" "$TMP_SYSLINUX"
