#! /bin/sh
#
# Autor   : Carsten Grohmann
#
# Stand   : 23. Dezember 2004
#
 VERSION="0.7g"
#
# Lizenz  : GPL
#
# Erstellt eine Daten CD mit dem Inhalt eines Verzeichnisses.
#
# $Id: writeCD,v 1.41 2004/12/23 12:27:00 carsten Exp $
#
# Veränderungen:
# - zu Version 0.2			Autor: Carsten Grohmann
#   - Anzeigen und Überprüfen des Syntax eingefügt
#   - Auslagerung diverser Einstellungen in Variablen
# - zu Version 0.2a			Autor: Carsten Grohmann
#   - Parameter der aufgerufenen Programme im Kommentar erläutert
# - zu Version 0.3			Autor: Carsten Grohmann
#   - Syntaxauswertung hinzugefügt
#   - Joliet-Erweiterung wird unterstützt
#   - Geschwindigkeit wählbar
# - zu Version 0.3b			Autor: Carsten Grohmann
#   - Syntaxauswertung verbessert
# - zu Version 0.3c			Autor: Carsten Grohmann
#   - trap und function ende eingefügt
#   - Auswertung der Rückgabewerte eingefügt
# - zu Version 0.3d	03.09.2001	Autor: Carsten Grohmann
#   - Rock Ridge Protokoll ab jetzt abschaltbar 
# - zu Version 0.4	27.09.2001	Autor: Carsten Grohmann
#   - Multi-Session möglich
# - zu Version 0.5	13.12.2001	Autor: Carsten Grohmann
#   - CDRWs erkennen und auf Wunsch vorher löschen
#   - Löschverfahren ist frei (entsprechend cdrecord) wählbar
# - zu Version 0.5b	14.01.2002	Autor: Carsten Grohmann
#   - Eigenschaften des Brenners werden überprüft:
#     - Schreiben von CDRWs
#     - Unterstützung von BURN-Proof
#     - simulierten Schreiben
#     - Multi-Session-CDs
#   - --disable-burnproof hinzugefügt
# - zu Version 0.5c	15.01.2002	Autor: Carsten Grohmann
#   - um --use-sudo erweitert
#   - kleinere Umstrukturierung
# - zu Version 0.5d	25.01.2002	Autor: Carsten Grohmann
#   - Fehler beseitigt
#   - Kleine Änderungen im Syntax
# - zu Version 0.5e	01.02.2002	Autor: Carsten Grohmann
#   - dao bzw nodao hinzugefügt (EXPERIMENTELL)
#   - case * hinzugefügt, um alle nicht erkannten Argumente auszugeben
# - zu Version 0.5f	04.02.2002	Autor: Carsten Grohmann
#   - Erkennung für DAO bzw. TAO hinzugefügt
#   - burnproof durch burnfree ersetzt
# - zu Version 0.5g	07.02.2002	Autor: Carsten Grohmann
#   - Prüfung auf das Vorhandensein von cdrecord, mkisofs und sudo geprüft
#   - Ausführbare Programme müssen einfache Dateien sein und für den
#     Benutzer ausführbar sein
#   - $TEMPDATEI wird überprüft, ob es eine reguläre Datei ist
# - zu Version 0.5h	27.02.2002	Autor: Carsten Grohmann
#   - Bug gefixt -isosize ist bei Multi-Session CDs nicht möglich
#   - Zusammenspiel der Optionen überarbeitet
# - zu Version 0.5i  12.03.2002
#   - diverse Debugmeldungen eingefügt
#   - Erkennung der Buffer-Underrun-Technologie der aktuellen Version von
#     cdrecord angepaßt
# - zu Version 0.5j  02.05.2002
#   - copy-cd testweise ohne Eintrag in den Syntax hinzugefügt
# - zu Version 0.5k  17.05.2002
#   - --copycd befindet sich schon im Syntax
#   - --cleancdrw eingefügt
# - zu Version 0.5l 22.05.2002
#   - $VERZEICHNIS nach $DIRECTORIES umgewandelt
#   - Optionen --tao und --notao hinzugefügt, haben aber keinen Einfluß auf 
#     cdrecord
# - zu Version 0.5m 23.05.2002
#   - Fehler behoben
# - zu Version 0.5n 28.05.2002, 30.05.2002, 04.06.2002
#   - Syntax an mehrere Verzeichnisse angepassen
#   - CD-Name wählbar gestaltet
#   - folgende Funktionen umbenannt, damit diese besser von Systemfunktionen
#     unterschieden werden können:
#      info          -> do_info        debug          -> do_debug
#      syntax_zeigen -> do_usage       ende           -> do_exit
#      doku_zeigen   -> do_showdoc     sub_clean_cdrw -> do_cleancdrw
#      test_file     -> do_searchprog
#   - TEMPDATEI in TEMPFILE umbenannt
#   - ERGEBNIS in RESULT umbenannt
#   - Funktionsbeschreibung weiter kommentiert
#   - Variable CD_TYPE eingefügt
#   - --version hinzugefügt
# - zu Version 0.5o  11.06.2002
#   - Fehler bei der Erkennung des korrekten CD-Typs beseitigt
#   - Hinweise zur Garantie und Haftung bei do_showhints hinzugefügt
# - zu Version 0.5p  19.01.2003
#   - Fehler beim Erkenner unbekannter Optionen behoben
#
# $Log: writeCD,v $
# Revision 1.41  2004/12/23 12:27:00  carsten
# - falsch geschriebene Variable USE_DAO berichtigt
# - version 0.7g
#
# Revision 1.40  2004/12/13 18:42:23  carsten
# - Eigenschaften von Brenner und CD werden nun zwischengespeichert
#
# Revision 1.39  2004/11/14 18:31:49  carsten
# - Zwischenspeicher der Laufwerksinformationen wird nun beim Suchen nach Laufwerken
#   gelöscht
#
# Revision 1.38  2004/11/10 21:20:57  carsten
# - neue Version 0.7e
# - löschen der Zwischenergebnisse beim automatischen Suchen
#   eines Brenners hinzugefügt
#
# Revision 1.37  2004/11/01 20:27:43  carsten
# - neue Version 0.7d
# - Erkennung des Brenners (check_device) beschleunigt
#
# Revision 1.36  2004/10/11 18:35:20  carsten
# - neue Version 0.7c
# - Verbesserungen der Performance durch Zwischenspeicherung der Abfrageergebnisse
#   der CD bzw. des Brenners
#
# Revision 1.35  2004/10/05 20:14:54  carsten
# - neue Version 0.7b
# - fehlerhafte Variablennamen in cd_isclosed und cd_isfirstsession korrigiert
#
# Revision 1.34  2004/10/03 17:31:17  carsten
# - neue Version 0.7a
# - struktureller Fehler in zwei verschachtelten if anweisungen behoben
#
# Revision 1.33  2004/10/01 20:31:35  carsten
#
# - Rockridge-Optionen für mkisofs geändert - Eigentum und Berechtigung
#   der Dateien werden root:root und rxrxrx gesetzt (-rational-rock)
#
# Revision 1.32  2004/09/28 19:06:24  carsten
# - neue Version 0.7
# - ungenutzte Unterstützung für Logdateien entfernt
# - automatische Erkennung des Brenners hinzugefügt
# - Dokumentation erweitert
# - Option --norun entfernt, statt dessen--dummy benutzen
# - Option zum Schreiben eines ISO-Abbildes hinzugefügt
# - Erkennung von Eigenschaften des Brenners oder der CD in Funktionen
#   ausgelagert
# - Anzahl der Debugmeldungen reduziert
#
# Revision 1.31  2004/01/29 18:52:56  carsten
# - neue Version 0.6b
# - temporäre Datei wird mit mktemp erzeugt
# - kleine Änderungen
#
# Revision 1.30  2003/01/20 20:29:58  carsten
#
# neue Version 0.6
# kleine Schönheitskorrekturen
#
# Revision 1.29  2003/01/20 20:26:37  carsten
#
# folgende Schalter hinzugefügt:
#  --leadingdot, --appid, --volid, --preparer, --publisher
#

#
# Rückgabewerte:
#  -  1		Fehlerhafter Syntax
#  -  2 	cdrecord nicht gefunden
#  -  3		cdrecord darf nicht ausgeführt werden
#  -  4 	mkisofs nicht gefunden
#  -  5		mkisofs darf nicht ausgeführt werden
#  -  6 	sudo nicht gefunden
#  -  7		sudo darf nicht ausgeführt werden
#  -  8		Fehler beim Anlegen der temporären Datei
#  - 11 	Keine oder beschädigte CD im Laufwerk
#  - 12 	CD wahrscheinlich schon abgeschlossen
#  - 13 	Brenner kann keine CDRWs schreiben
#  - 14         Brenner unterstützt kein simuliertes Schreiben
#  - 15         Benutzer möchte mit --use-sudo eine weitere Session hinzufügen
#                => abgelehnt, da Rechte dazu fehlen
#  - 16         Brenner unterstützt kein DAO-Mode
#  - 17         Brenner unterstützt kein TAO-Mode
#  - 21		Fehler beim Erstellen des Abbildes
#  - 22		Fehler beim Löschen der CDRW
#  - 23 	Fehler beim Schreiben der CD
#  - 24         Kein Brenner gefunden
#  - 25         Angebenener Brenner wurde nicht gefunden
#  - 100        Fehler bei der Kombination von Optionen
#
# Verbesserungen:
# - CD Status erweitern
# - SUPPORT_MULTISESSION weiter integrieren -> Parameter am Ende zusammenstellen
# - genauere Optionen des Laufwerks erfragen
# - maximale Schreibgeschwindigkeit aus -prcap entnehmen
# - COPY_SOURCE_DEVICE über Parameter auswählbar gestalten
# - --dao und --tao an die neuen cdrecord Schalter anpassen
# - CD schreiben in eine Funktion auslagern
# - CD Infos beim einfachen löschen von cdrws nicht ausgeben
# - mehrere identische CDs ermoeglichen

#set -x
#set -n
#set -v

# Variablen setzen
TIME=`date +%d.%m.%Y`
TEMPFILE="NOT_SET"
DEBUG="no"				# Debug-Modus abschalten
SILENT="yes"				# Meldungen ausgeben

# Vom Brenner unterstützte Optionen
SUPPORT_MULTISESSION=""			# (yes|no) entsprechend Brennerunterstützung
SUPPORT_BURNFREE=""			# (yes|no) entsprechend Brennerunterstützung
SUPPORT_DUMMY=""			# (yes|no) entsprechend Brennerunterstützung
SUPPROT_CDRW=""				# (yes|no) entsprechend Brennerunterstützung

# Allgemeine Konfiguration
CDRECORD_BIN="/usr/bin/cdrecord"        # Pfad zu cdrecord
MKISOFS_BIN="/usr/bin/mkisofs"          # Pfad zu mkisofs
SUDO_BIN="/usr/bin/sudo"		# Pfad zu sudo
MAX_SPEED=48                            # Maxiamal zulässige Geschwindigkeit
ST_DEVICE="AUTO"                        # Standarddevice setzen
ST_SPEED=16                             # Standardgeschwindigkeit
USE_SUDO="no"				# Vorgabe für die Verwendung von sudo
USE_DAO="yes"				# Vorgabe zum Schreiben der CDs im Disk at Once Mode
USE_TAO="no"                            # Vorgabe zum Schreiben der CDs im Track at Once Mode

# Standardeinstellungen zur CD
APPLICATION_ID=""			# Applicationsname
BLANKTYPE="all"				# Löschenverfahren
CD_TYPE=""				# Type der eingelegten CD (CDR|CDRW)
CLEAN_CDRW="no"			        # CDRWs nicht vorher löschen
COPY_CD="no"                            # yes -> CD wird kopiert
COPY_SOURCE_DEVICE="/dev/hdd"           # Quellcd beim Kopieren
COPY_USE_DAO="yes"                      # CDs im DAO-Mode kopieren
DIRECTORIES=""                          # Soll alle Verzeichnisse enthalten
ISO_IMAGE=""                            # Name des fertigen ISO-Image
LAST_SESSION="no"			# Letzte Session
MKISOFS_VERBOSE="no"			# Geschwätzigkeit von mkisofs erhöhen
MULTISESSION_CD="yes"			# Multi-Session CDs erzeugen
PREPARER=""				# Erzeuger der CD
PUBLISHER=""				# Herausgeber der CD
SIMULATE_WRITING="no"			# Brennen nur simulieren
USE_BURNFREE="yes"                      # BURN-Proof o.ä. nutzen, wenn vorhanden
USE_JOLIET="yes" 			# Joliet einschalten
USE_LEADINGDOT="no"			# Dateinamen mit Punkten am Anfang (verletzt ISO 9660)
USE_ROCKRIDGE="yes"                     # Rock Ridge Protokoll benutzen
VOLUMEN_ID=""				# CD-Name
MSINFO=""                               # MultiSession Informationen der CD

#
# Eigene Funktionen
#

function do_info () {
# Zeigt zusätzliche Informationen zum Programmablauf an
# zu übergebene Parameter - keine
if [ ! "$SILENT" = "yes" ]; then
  echo $*
fi
}

function do_debug () {
# Zeigt zusätzliche Debuginformationen an
# zu übergebene Parameter
#  - Parameter können in beliebiger Form und Anzahl übergeben werden
if [ "$DEBUG" = "yes" ]; then
  echo Debug: $*
fi
}

function do_exit () {
# Beendet das Programm sauber
# zu übergebene Parameter
# 1. Parameter:	Rückgabewert
  if [ "$TEMPFILE" != "NOT_SET" -a -e $TEMPFILE ]; then
    rm $TEMPFILE
  fi
  if [ ! $1 ]; then
    do_debug "Programmende ohne Rückgabewert"
  else
    do_debug "Programmende Rückgabewert $1"
  fi
  exit $1
}

function do_searchprog() {
# Sucht die ausführbaren Programme, falls der angegebene Pfad nicht stimmt
# zu übergebene Parameter
# 1. Parameter:	Programmname
# 2. Parameter:	Fehlercode fürs nicht finden
# 3. Parameter:	Fehlercode fürs nicht ausführbar
  FILE=$1
  if [ ! -f "$FILE" ]; then
    do_debug "$FILE existiert nicht. Suche Alternative..."
    BASENAME=`basename $FILE`
    FILE=`which $BASENAME`
    if [ -z "$FILE" ]; then
      do_debug "... keine Alternative gefunden"
      echo Fehler $FILE bzw. `basename $FILE`wurde nicht gefunden
      do_exit $2;
    fi
    do_debug "... Alternative $FILE gefunden"
  fi

  if [ ! -x "$FILE" ]; then
    echo "Fehler $FILE darf nicht ausgeführt werden. Bitte setzen"
    echo "Sie die passenden Attribute."
    do_exit $3
  fi

  return 0
}

function do_usage() {
# Zeigt den Syntax des Programmes an
# zu übergebene Parameter - keine
echo "Syntax: writeCD [Verzeichnis(se)] [Optionen] "
echo "Schreibt den Inhalt der angebenen Verzeichnisses inkl. Unterver- "
echo "zeichnisse auf eine CD-R bzw. CD-RW. "
echo "Die Reihenfolge von Optionen und Verzeichnis(sen) spielt keine Rolle."
echo "  --appid <Name>     Name der Anwendung"
echo "  --blanktype <Verfahren>  Verfahren zum Löschen der CDRW (Standard: $BLANKTYPE)"
echo "  --cleancdrw        Löscht die CDRW einzeln bzw. vor dem Schreiben"
echo "  --copycd           Kopiert eine CD. $COPY_SOURCE_DEVICE ist das Quelllaufwerk"
echo "  --dao              Schreibt die CD im Disk At Once Mode (DAO)"
echo "  --debug            Gibt programminterne Informationen aus"
echo "  --device <DEVICE>  Gerät zum Brennen der CD (Standard: $ST_DEVICE)"
echo "  --disable-burnfree BURNFree bzw. alternative Buffer-Underrun-"
echo "                     Technologien nicht nutzen"
echo "  --doc              Zeigt eine kurze Dokumentation an"
echo "  --dummy            Simuliert den Brennvorgang"
echo "  --image [Datei]    Brennt ein fertiges ISO-Abbild auf CD"
echo "  --joliet           Erzeugt zusätzlich Joliet-Verzeichniseinträge (Standard)"
echo "  --lastsession      Schließt nach dem Schreiben der Daten die CD ab"
echo "  --leadingdot       Erlaubt Dateinamen mit einen Punkt am Anfang **"
echo "  --multisession     Erzeugt eine Multi-Session-CD (Standard)"
echo "  --nodao            Schaltet den DAO-Mode aus"
echo "  --nojoliet         Erzeugt keine Joliet-Verzeichniseinträge "
echo "  --nomultisession   Erzeugt KEINE Multi-Session-CD"
echo "  --norockridge      Verwendet das Rock Ridge Protokoll nicht"
echo "  --nosilent         Gibt mehr Meldungen aus"
echo "  --notao            Schaltet den TAO-Mode aus *"
echo "  --rockridge        Verwendet das Rock Ridge Protokoll (Standard)"
echo "  --preparer <Name>  Erzeuger der CD"
echo "  --publisher <Name> Herausgeber der CD"
echo "  --silent           Verhindert die Ausgabe von Meldungen "
echo "  --speed <Geschwindigkeit>  Schreibgeschwindigkeit zwischen 1 und $MAX_SPEED "
echo "  --tao              Schreibt die CD im Track At Once Mode (TAO) *"
echo "  --use-sudo         sudo verwenden, um die Rechte zum Brennen zu erlangen"
echo "  --verbose          Identisch mit --nosilent"
echo "  --version          zeigt die Version des Skriptes an"
echo "  --volid            Name der CD"
echo "  --help             Zeigt diese Hilfe an"
echo " *  Diese Optionen haben noch keinen Einfluß auf das Programm"
echo " ** Diese Optionen verletzen ISO 9660"
do_exit 1
};

function do_showdoc() {
# Zeigt die Dokumentation zum Programm an
# zu übergebene Parameter - keine
cat << EOF
Dokumentation für writeCD Stand 29. August 2004
WARNUNG:
Ich übernehme keine Garantie, ob writeCD funktioniert und wirklich das tut was
von ihm erwartet wird. Ich übernehme auch keine Haftung für eventuelle Schäden,
die durch writeCD entstehen können. Die Benutzung von writeCD erfolgt auf
eigene Gefahr und Verantwortung.

Lizenz
------
Dieses Skript steht unter GPL. Mehr Informationen zur GPL befinden sich
unter http://www.fsf.org/licenses/licenses.html.

Allgemeines
-----------
Auf vielen neueren Systemen sollte das Brennen von CDs ohne root-Rechte
möglich sein. Sollte dies nicht er Fall kann, kann der Administrator
die berechtigten Benutzer für das Programm cdrecord in /etc/sudoers eintragen.
Diese Benutzer können anschließend über die Option --use-sudo CDs brennen.
Leider ist es damit nicht mehr möglich weitere Sessions an eine CD anzuhängen.

Erkennung von CD-Brennern
-------------------------
Dieses Skript kann im System vorhandene CD-Brenner automatisch erkennen.
WriteCD verwendet den ersten gefundenen Brenner des Systems, wenn keine
manuelle Auswahl über die Option "--device" erfolgte.

Aktuelle Version
----------------
Die aktuelle Version dieses Skriptes befindet sich auf
http://www.carstengrohmann.de

Fehler und Verbesserungsvorschläge
----------------------------------
writeCD wurde nach besten Wissen und Gewissen programmiert. Falls dennoch ein
Fehler auftritt, bitte ich um eine Mail, mit einer kurzen Fehlerbeschreibung
an folgende Adresse mail_ad_carstengrohmann.de .
EOF
do_exit
}

function can_writeCDR() {
# prüft, ob das Gerät CD-Rs schreiben kann
# zu übergebene Parameter
# 1. Parameter: DEVICE
# Ausgaben:
#  0 Gerät unterstützt Merkmal
#  1 Gerät unterstützt Merkmal nicht
[ -z "$_PRCAP" ] && _PRCAP=$(cdrecord -dev=$1 -prcap 2>&1)
echo $_PRCAP | grep --silent "Does write CD-R media"
}

function can_writeCDRW() {
# prüft, ob das Gerät CD-RWs schreiben kann
# zu übergebene Parameter
# 1. Parameter: DEVICE
# Ausgaben:
#  0 Gerät unterstützt Merkmal
#  1 Gerät unterstützt Merkmal nicht
[ -z "$_PRCAP" ] && _PRCAP=$(cdrecord -dev=$1 -prcap 2>&1)
echo $_PRCAP | grep --silent "Does write CD-RW media"
}

function can_writeTEST() {
# prüft, ob das Gerät den Brennvorgang simulieren kann
# zu übergebene Parameter
# 1. Parameter: DEVICE
# Ausgaben:
#  0 Gerät unterstützt Merkmal
#  1 Gerät unterstützt Merkmal nicht
[ -z "$_PRCAP" ] && _PRCAP=$(cdrecord -dev=$1 -prcap 2>&1)
echo $_PRCAP | grep --silent "Does support test writing"
}

function can_writeMS() {
# prüft, ob der Brenner multi-session CDs brennen kann
# zu übergebene Parameter
# 1. Parameter: DEVICE
# Ausgaben:
#  0 Gerät unterstützt Merkmal
#  1 Gerät unterstützt Merkmal nicht
[ -z "$_PRCAP" ] && _PRCAP=$(cdrecord -dev=$1 -prcap 2>&1)
echo $_PRCAP | grep --silent "Does read multi-session CDs"
}

function can_useBUT() {
# überprüft, ob der Brenner Technologien zur Vermeidung von Pufferunterläufen
# unterstützt
# zu übergebene Parameter
# 1. Parameter: DEVICE
# Ausgaben:
#  0 Gerät unterstützt Merkmal
#  1 Gerät unterstützt Merkmal nicht
[ -z "$_PRCAP" ] && _PRCAP=$(cdrecord -dev=$1 -prcap 2>&1)
echo $_PRCAP | grep --silent "Does support Buffer-Underrun-Free recording"
}

function can_writeTAO() {
# prüft, ob der Brenner CDs im TAO (Track at once) Modus schreiben kann
# zu übergebene Parameter
# 1. Parameter: DEVICE
# Ausgaben:
#  0 Gerät unterstützt Merkmal
#  1 Gerät unterstützt Merkmal nicht
[ -z "$_ATIP" ] && _ATIP=$(cdrecord -dev=$1 -atip 2>&1)
echo $_ATIP | grep --silent "Supported modes:.*TAO.*"
}

function can_writeDAO() {
# prüft, ob der Brenner CDs im DAO (Disk at once) Modus schreiben kann
# zu übergebene Parameter
# 1. Parameter: DEVICE
# Ausgaben:
#  0 Gerät unterstützt Merkmal
#  1 Gerät unterstützt Merkmal nicht
[ -z "$_ATIP" ] && _ATIP=$(cdrecord -dev=$1 -atip 2>&1)
echo $_ATIP | grep --silent "Supported modes:.*SAO.*"
}

function disktype() {
# ermittelt den Typ der eingelegten CD
# zu übergebene Parameter
# 1. Parameter: DEVICE
# Ausgaben:
#  CDR  eingelegte CD ist eine CD-R
#  CDRW eingelegte CD ist eine CD-RW
[ -z "$_ATIP" ] && _ATIP=$(cdrecord -dev=$1 -atip 2>&1)
echo $_ATIP | grep --silent "Is erasable"
[ $? -eq 0 ] && echo "CDRW" || echo "CDR"
}

function is_disk() {
# prüft, ob eine CD eingelegt ist
# zu übergebene Parameter
# 1. Parameter: DEVICE
# Ausgaben:
#  0 CD eingelegt
#  1 CD nicht eingelegt
[ -z "$_ATIP" ] && _ATIP=$(cdrecord -dev=$1 -atip 2>&1)
echo $_ATIP | grep --silent --invert-match "No disk / Wrong disk!"
}

function cd_isclosed() {
# prüft, ob eine CD abgeschlossen ist
# zu übergebene Parameter
# 1. Parameter: DEVICE
# Ausgaben:
#  0 CD ist abgeschlossen
#  1  CD ist nicht abgeschlossen
[ -z "$_MSINFO" ] && _MSINFO=$(cdrecord -dev=$1 -msinfo 2>&1)
echo $_MSINFO | grep --silent "Cannot read first writeable address"
}

function cd_isfirstsession() {
# prüft, ob schon die aktuelle session die erste session wird
# zu übergebene Parameter
# 1. Parameter: DEVICE
# Ausgaben:
#  0 aktuelle session wird die erste session
#  1  aktuelle session wird nicht die erste session
[ -z "$_MSINFO" ] && _MSINFO=$(cdrecord -dev=$1 -msinfo 2>&1)
echo $_MSINFO | grep --silent "Cannot read session offset"
}

function check_device() {
# überprüft, ob das Device existiert und gültig ist
# zu übergebene Parameter
# 1. Parameter: DEVICE
# Ausgaben:
#  not_found -> kein Brenner gefunden
#  found     -> Brenner gefunden
#  DEVICE    -> Brenner nicht gefunden, Vorschlag eines anderen Brenners

# schnelle Überprüfung
can_writeCDR $1 && {
  echo "found"
  return
}

# lösche _PRCAP Buffer
unset _PRCAP

_DEVICE=$1

# ermittle alle vorhandenen Geräte
_DEVLIST=$(cdrecord -scanbus 2>/dev/null | awk '/Removable/ { print $1 }')

# leere Liste -> not_found zurückgeben
if [ -z "$_DEVLIST" ]; then
  echo "not_found"
  return
fi

# Liste überprüfen
echo $_DEVLIST | grep --silent $_DEVICE
if [ $? -eq 0 ]; then
  # Brenner gefunden
  echo "found"
  return
fi

# Brenner suchen
for i in $_DEVLIST; do
  can_writeCDR $i && {
    echo $i
    return
  }

  # lösche _PRCAP Buffer
  unset _PRCAP
  
done

# kein Brenner gefunden
echo "not_found"
}

function do_cleancdrw() {
# Löscht eine CDRW
# zu übergebene Parameter
# 1. Parameter: DEVICE
# 2. Parameter: Löschtyp
# 3. Parameter: Geschwindigkeit

if [ "$CD_TYPE" = "CDRW" ]; then

  CDRECORD_OPTIONEN="-v speed=$3 dev=$1 blank=$2"

  do_info
  do_info "CDRW löschen"
  do_info "------------"
  do_info "CDRW löschen: $CDRECORD_BIN $CDRECORD_OPTIONEN"
  do_info

  do_debug "Zeile $LINENO: $CDRECORD_BIN wird gestartet"
  $CDRECORD_BIN $CDRECORD_OPTIONEN
  RESULT=$?

  if [ $RESULT -ne 0 ]; then
    echo "Es trat beim Löschen der CDRW ein Fehler auf."
    echo "Rückgabewert: $RESULT"
    do_exit 22
  fi

fi;
}

trap do_exit SIGHUP SIGSTOP SIGKILL SIGTERM

#
# Syntax auswerten
#

# Syntax ausgeben, wenn keine Parameter
[ $# -eq 0 -o "$1" == "--help" ] && do_usage

# Variablen vorher auf Standard setzen
SPEED=$ST_SPEED
DEVICE=$ST_DEVICE

# Auswertung
for ARG do
  case $1 in
    --speed)
      SPEED=$2
      do_debug "Option $1 \$SPEED=$2"
      shift 2
      ;;
    --device)
      DEVICE=$2
      do_debug "Option $1"      
      shift 2
      ;;
    --dummy)
      SIMULATE_WRITING=yes
      do_debug "Option $1"
      shift
      ;;
    --joliet)
      USE_JOLIET=yes
      do_debug "Option $1"
      shift
      ;;
    --nojoliet)
      USE_JOLIET=no
      do_debug "Option $1"      
      shift
      ;;
    --use-sudo)
      USE_SUDO=yes
      do_debug "Option $1"
      shift
      ;;
    --rockridge)      
      USE_ROCKRIDGE=yes
      do_debug "Option $1"
      shift
      ;;
    --norockridge)
      USE_ROCKRIDGE=no
      do_debug "Option $1"
      shift
      ;;
    --multisession)
      MULTISESSION_CD=yes
      do_debug "Option $1"
      shift
      ;;
    --nomultisession)
      MULTISESSION_CD=no
      do_debug "Option $1"
      shift
      ;;
    --lastsession)
      LAST_SESSION=yes
      do_debug "Option $1"
      shift
      ;;
    --disable-burnfree)
      USE_BURNFREE="no"
      do_debug "Option $1"
      shift
      ;;
    --debug)
      DEBUG=yes
      do_debug "Option $1"
      shift
      ;;
    --silent)
      SILENT="yes"
      do_debug "Option $1"
      shift
      ;;
    --nosilent|--verbose)      
      SILENT="no"
      do_debug "Option $1"
      shift
      ;;
    --cleancdrw)
      CLEAN_CDRW="yes"
      do_debug "Option $1"
      shift
      ;;
    --copycd)
      COPY_CD="yes"
      do_debug "Option $1"
      shift
      ;;
    --blanktype)
      BLANKTYPE=$2
      do_debug "Option $1"
      shift 2
      ;;
    --help)
      do_usage
      ;;
    --doc)
      do_showdoc
      ;;
    --dao)
      USE_DAO="yes"    
      do_debug "Option $1"
      shift
      ;;
    --nodao)
      USE_DAO="no"
      do_debug "Option $1"
      shift
      ;;
    --tao)
      USE_TAO="yes"
      do_debug "Option $1"
      shift
      ;;
    --notao)
      USE_TAO="no"
      do_debug "Option $1"
      shift
      ;;
    --leadingdot)
      USE_LEADINGDOT="yes"
      do_debug "Option $1"
      shift
      ;;
    --version)
      echo "writeCD $VERSION Copyright by Carsten Grohmann"
      do_exit
      ;;
    --volid)
      VOLUMEN_ID=$2
      do_debug "Option $1 \$VOLUMEN_ID=$2"
      shift 2
      ;;
    --appid)
      APPLICATION_ID=$2
      do_debug "Option $1 \$APPLICATION_ID=$2"
      shift 2
      ;;
    --preparer)
      PREPARER=$2
      do_debug "Option $1 \$PREPARER=$2"
      shift 2
      ;;  
    --publisher)
      PUBLISHER=$2
      do_debug "Option $1 \$PUBLISHER=$2"
      shift 2
      ;;
    --image)
      ISO_IMAGE=$2
      do_debug "Option $1 \$ISO_IMAGE=$2"
      shift 2
      ;;

# Alles was bis jetzt noch nicht erkannt wurde, wird verwurfen
    *)
      if [ -d "$1" ]; then
        DIRECTORIES=${DIRECTORIES}"$1 ";
        do_debug "$1 zur Verzeichnisliste hinzugefügt"
      elif [ -e "$1" ]; then
        echo "Fehler: $1 ist kein Verzeichnis."
        do_exit 1
      elif [ "$1" != "" ]; then
        echo "Option $1 unbekannt, wird ignoriert"
      fi
      shift
      ;;
  esac
done

# Programmname und Version ausgeben
echo "writeCD Version $VERSION"

# Fehler ausgeben, wenn der übergebene Parameter kein Verzeichnis ist
if [ -z "$DIRECTORIES" -a "$COPY_CD" = "no" -a "$CLEAN_CDRW" = "no" -a -z "$ISO_IMAGE" ]; then
  echo -n "Fehler! Sie habe vergessen ein existierendes Verzeichnis mit zu "
  echo    "übergeben."
  do_usage
fi


###############################################################################
# Hauptroutine                                                                #
###############################################################################

# Überprüfen, ob $TEMPFILE eine reguläre Datei ist
TEMPFILE=`mktemp /tmp/CDImage.XXXXXX`
if [ $? -ne 0 ]; then
  echo "Fehler! beim Erzeugen der temporären Datei."
  TEMPFILE="NOT_SET"
  do_exit 8
fi

# Auf die Existenz der ausführbaren Programme testen
####################################################

# cdrecord
do_searchprog $CDRECORD_BIN 2 3 && CDRECORD_BIN=$FILE

# mkisofs
do_searchprog $MKISOFS_BIN 4 5  && MKISOFS_BIN=$FILE

# sudo
if [ "$USE_SUDO" = "yes" ]; then
  do_searchprog $SUDO_BIN 6 7     && SUDO_BIN=$FILE
  CDRECORD_BIN="$SUDO_BIN $CDRECORD_BIN"
fi


# Allgemeine Syntaxauswertung
#############################

# Übergebene Geschwindigkeit überprüfen
[ "$SPEED" -lt 1 -o "$SPEED" -gt "$MAX_SPEED" ] &&  SPEED=$MAX_SPEED

# Löschmodus überprüfen
[ "$BLANKTYPE" = "" ]	&& BLANKTYPE="all"

# COPY_CD auf $DIRECTORIES prüfen
if [ "$COPY_CD" = "yes" ]; then
  if [ "$DIRECTORIES" ]; then
    echo "WARNUNG: Obwohl --copycd angewählt ist, sind noch ein oder mehrere "
    echo "Verzeichnisse übergeben wurden. Dies ist nicht zulässig."
    do_exit 1
  fi

# Beim Kopieren sollen keine multi-session Einstellungen verwendet werden
  if [ "$MULTISESSION_CD" = "yes" ]; then
    MULTISESSION_CD="no"
  fi

# Die gesamte CD sollte in einem Rutsch kopiert werden.
  if [ "$COPY_USE_DAO" = "yes" ]; then
    USE_DAO="yes"
  else
    USE_DAO="no"
  fi
fi

# Zusammenspiel von DAO und TAO überprüfen
if [ "$USE_DAO" = "yes" -a "$USE_TAO" = "yes" ]; then
  echo "FEHLER: Die Optionen --dao und --tao können nicht gleichzeitig verwendet"
  echo "werden. Bitte wählen Sie eine aus und starten das Programm neu"
  do_usage
  do_exit 1
fi

# ausgewähltes Device überprüfen
################################

_RESULT=$(check_device $DEVICE)

case $_RESULT in
  "not_found")
    echo "Es wurde kein CD-Brenner gefunden."
    do_exit 24
    ;;
  "found")
    do_info "Brenner $DEVICE wurde gefunden."
    ;;
  *)
    if [ "$DEVICE" = "AUTO" ]; then
      do_info "Es wurde ein CD-Brenner unter \"$_RESULT\" gefunden und ausgewählt."
      DEVICE=$_RESULT
    else
      echo "Das Gerät \"$DEVICE\" existiert nicht. Bitte wählen Sie ein anderes"
      echo "Gerät. Wenn Sie die Option \"--device\" nicht setzen, sucht writeCD"
      echo "automatisch nach einem passenden CD-Brenner."
      do_exit 25
    fi
    ;;
esac

unset _RESULT

# Eigenschaften des Brenners prüfen
###################################

do_debug "Auswertung der Fähigkeiten des Brenners"

# cache Eigenschaften von Brenner und CD
[ -z "$_PRCAP" ]  && _PRCAP=$(cdrecord -dev=$DEVICE -prcap 2>&1)
[ -z "$_ATIP" ]   && _ATIP=$(cdrecord -dev=$DEVICE -atip 2>&1)
[ -z "$_MSINFO" ] && _MSINFO=$(cdrecord -dev=$DEVICE -msinfo 2>&1)

# Schreiben von CDRWs prüfen
can_writeCDRW $DEVICE && SUPPORT_CDRW="yes" || SUPPORT_CDRW="no"
if [ "$CLEAN_CDRW" = "yes" -a "$SUPPORT_CDRW" = "no" ]; then
  echo "FEHLER: Dieser CD-Brenner kann keine CD-RWs beschreiben bzw löschen.";
  do_exit 13
fi

# BURNFREE testen
can_useBUT $DEVICE && SUPPORT_BURNFREE="yes" || SUPPORT_BURNFREE="no"

# Unterstützung für Schreibtest
can_writeTEST $DEVICE && SUPPORT_DUMMY="yes" || SUPPORT_DUMMY="no"

# Unterstützung für Multi-Session CDs
can_writeMS $DEVICE && SUPPORT_MULTISESSION="yes" || SUPPORT_MULTISESSION="no"

# Unterstützung für das Schreiben im DAO (Disk at once) Modus
can_writeDAO $DEVICE && SUPPORT_DAO="yes" || SUPPORT_DAO="no"
if [ $SUPPORT_DAO = "no" -a $USE_DAO = "yes" ]; then
  echo "Dieses Laufwerk unterstützt kein Schreiben der CDs im Disk-At-Once Modus."
  echo "Bitte verwenden sie daher die Option -dao nicht mehr."
  do_exit 16
fi

# Unterstützung für das Schreiben im TAO (Track at once) Modus
can_writeTAO $DEVICE && SUPPORT_TAO="yes" || SUPPORT_TAO="no"
if [ $SUPPORT_TAO = "no" -a $USE_TAO = "yes" ]; then
  echo "Dieses Laufwerk unterstützt kein Schreiben der CDs im Track-At-Once Modus."
  echo "Bitte verwenden sie daher die Option -tao nicht mehr."
  do_exit 17
fi

# Eigenschaften der CD prüfen
#############################

do_debug "Auswertung der Eigenschaften der CD"

# CD eingelegt ?
is_disk $DEVICE || {
  echo "Bitte legen Sie eine CD ein. Falls schon eine CD im Laufwerk ist, so"
  echo "ist diese wahrscheinlich unbrauchbar. Probieren Sie es mit einer "
  echo "anderen noch einmal."
  do_exit 11
}

# Auf CD-Typ testen CDR oder CDRW ?
CD_TYPE=$(disktype $DEVICE)

# CD schon abgeschlossen ?
cd_isclosed $DEVICE && {
  echo "Die eingelegte CD ist wahrscheinlich schon abgeschlossen. Bitte"
  echo "probieren Sie es mit einer anderen noch einmal."
  do_exit 12
}

# Vorhergehenden Sessions ermitteln
if [ "$MULTISESSION_CD" = "yes" ]; then
  cd_isfirstsession $DEVICE
  if [ $? -eq 0 ]; then
    FIRST_SESSION="yes"
  else
    FIRST_SESSION="no"
    MSINFO=${_MSINFO}
  fi
fi

# lösche Eigenschaften von Brenner und CD aus dem Cache
unset _PRCAP
unset _ATIP
unset _MSINFO

# Zusammenspiel der Optionen prüfen
###################################

if [ "$MULTISESSION_CD" = "yes" ]; then

  # Multisession automatisch löschen, wenn nicht verfügbar
  if [ "$MULTISESSION_CD" = "yes" -a "$SUPPORT_MULTISESSON" = "no" ]; then
    do_info "Die Erstellung von Multisession-CDs wird vom CD-Brenner nicht unter-"
    do_info "stützt, daher wird die Option abgeschaltet"
    MULTISESSION_CD="no";
  fi

  # DAO und Multisession funktionieren nicht zusammen
  if [ "$MULTISESSION_CD" = "yes" -a "USE_DAO" = "yes" ]; then
    USE_DAO="no";
  fi

fi

# Kann keine CDRWs verarbeiten -> beenden
if [ "$CD_TYPE" = "CDRW" -a "$SUPPORT_CDRW" = "no" ]; then
  echo "Dieser CD-Brenner kann keine CD-RWs beschreiben. Bitte nutzen Sie";
  echo "einen anderen Rohling."
  do_exit 13;
fi

# Kein simuliertes Schreiben verfügbar -> beende
if [ "$SIMULATE_WRITING" = "yes" -a "$SUPPORT_DUMMY" = "no" ]; then
  echo "WARNUNG: Dieser CD-Brenner unterstützt das simulierte Schreiben nicht.";
  do_exit 14;
fi

# BURNFREE automatisch löschen, wenn nicht verfügbar
if [ "$USE_BURNFREE" = "yes" -a "$SUPPORT_BURNFREE" = "no" ]; then
  echo "WARNUNG: Dieser CD-Brenner unterstützt BURNFREE nicht. Es wird daher"
  echo "nicht verwendet!"
  USE_BURNFREE="no";
fi

# Ausgabe von zusätzlichen Informationen
########################################

if [ "$DEBUG" = yes ]; then
# Allgemeine Informationen
  echo "Gerät:                  $DEVICE"
  echo "Geschwindigkeit:        $SPEED"
  [ "$DIRECTORIES" ]            && echo "Verzeichnisse:        $DIRECTORIES"
  echo "Temporäre Datei:        $TEMPFILE"
  echo "CD Typ:                 $CD_TYPE"

  [ "$USE_SUDO" = "yes" ]       && echo "Es wird sudo zum Starten von cdrecord verwendet"

# Ausgabe der vom Brenner unterstützten Optionen
  [ "$SUPPORT_BURNFREE"     = "yes" ]   && AUSGABE=" - BURN-Proof\n"
  [ "$SUPPORT_CDRW"         = "yes" ]   && AUSGABE=${AUSGABE}" - Schreiben von CDRWs\n"
  [ "$SUPPORT_DUMMY"        = "yes" ]   && AUSGABE=${AUSGABE}" - Simuliertes Schreiben\n"
  [ "$SUPPORT_MULTISESSION" = "yes" ]   && AUSGABE=${AUSGABE}" - Multi-Session CDs\n"
  [ "$SUPPORT_DAO"          = "yes" ]   && AUSGABE=${AUSGABE}" - Disk At Once Mode\n"
  [ "$SUPPORT_TAO"          = "yes" ]   && AUSGABE=${AUSGABE}" - Track At Once Mode\n"
  [ "$AUSGABE" ]                        && echo -e "Ihr Brenner unterstützt folgende Optionen:\n$AUSGABE"

# Ausgabe der gewählten Optionen
  [ "$SIMULATE_WRITING" = "yes" ] &&    echo "Das Schreiben der CD wird nur simuliert."
  echo "Informationen zur CD:"
  [ "$VOLUMEN_ID"               ] &&    echo "  Die CD wird mit $VOLUMEN_ID benannt."
  [ "$CLEAN_CDRW"       = "yes" ] &&    echo "  Die CDRW wird vor den Beschreiben gelöscht."
  [ "$LAST_SESSION"     = "yes" ] &&    echo "  Die CD wird nach dem brennen abgeschlossen."
  [ "$USE_DAO"          = "yes" ] &&    echo "  Die CD wird im Disk At Once Mode erzeugt."
  [ "$USE_TAO"          = "yes" ] &&    echo "  Die CD wird im Track At Once Mode erzeugt."
  [ "$MULTISESSION_CD"  = "yes" ] &&    echo "  Es wird eine Multi-Session-CD erzeugt."  \
                                  ||    echo "  Es wird eine Single-Session-CD erzeugt."
  echo "  Es werden folgende Verzeichnisinformationen erzeugt:"
  [ "$USE_JOLIET"       = "yes" ] &&    echo "    - Joliet"
  [ "$USE_ROCKRIDGE"    = "yes" ] &&    echo "    - Rockridge"
  [ ! "$USE_JOLIET"     = "yes" -a \
    ! "$USE_ROCKRIDGE"  = "yes" ] && echo "    - pures ISO 9660"
fi

# CDRW löschen?
if [ "$CLEAN_CDRW" = "yes" ]; then

  # cdrw löschen
  do_cleancdrw $DEVICE $BLANKTYPE $SPEED

  # Einstellungen für multi-session CDs zurücksetzen
  FIRST_SESSION="yes"

  # beendet das Programm wenn nur die CDRW gelöscht werden sollte
  [ -z "$DIRECTORIES" -a "$COPY_CD" = "no" -a -z "$ISO_IMAGE" ] &&  do_exit

fi

# Beenden bei USE_SUDO und mehreren Sitzungen
if [ "$USE_SUDO" = "yes" -a "$MULTISESSION_CD" = "yes" -a ! "$FIRST_SESSION" = "yes" ]; then
  echo "Da Sie --use-sudo nutzen können Sie keine weiteren Session zur einer "
  echo "Multisession-CD hinzufügen."
  do_exit 15
fi


# Optionen zusammensetzen
# Parameter von mkisofs:
# -o <Datei> 			Dateiname der Image-Datei
# -full-iso9660-filenames	Erlaube 32 Zeichen lange Dateinamen für ISO 9660
# -rational-rock		Rock Ridge Verzeichnisinformationen erzeugen 
#                               und Berechtigungen zurücksetzen
# -disable-deep-relocation	disable deep directory information
# -allow-leading-dots		Erlaube Dateinamen mit '.' am Anfang
# -allow-multidot		Erlaube Dateinamen mit mehreren Punkten
# -p <Erzeuger>			Setze Erzeuger, des ISO-Abbildes
# -appid <ID>			Setze Anwendungs-ID
# Für Multi-Session-CDs
# -M $DEVICE			Pfad zum vorherigen Abbild
# -C XX,XX			Multi-Session-Infos aus cdrecord
# Den Parameter -p -A -V -P folgende Beschreibung darf max. 128 Zeichen
# lang sein

# Allgemeine Parameter setzen
MKISOFS_OPTIONEN="-o $TEMPFILE -allow-multidot -full-iso9660-filenames"

MKISOFS_OPTIONEN=${MKISOFS_OPTIONEN}" -disable-deep-relocation"
MKISOFS_OPTIONEN=${MKISOFS_OPTIONEN}" $DIRECTORIES"

# Parameter in Abhängigkeit von den Schaltern setzen
[ "$MKISOFS_VERBOSE" = "yes" ] && MKISOFS_OPTIONEN="-verbose "${MKISOFS_OPTIONEN}
[ "$USE_JOLIET"      = "yes" ] && MKISOFS_OPTIONEN="-joliet "${MKISOFS_OPTIONEN}
[ "$USE_ROCKRIDGE"   = "yes" ] && MKISOFS_OPTIONEN="-rational-rock "${MKISOFS_OPTIONEN}
[ "$USE_LEADINGDOT"  = "yes" ] && MKISOFS_OPTIONEN="-allow-leading-dots "${MKISOFS_OPTIONEN}
[ "$FIRST_SESSION"   = "no"  ] && MKISOFS_OPTIONEN="-M $DEVICE -C $MSINFO "${MKISOFS_OPTIONEN}
[ "$VOLUMEN_ID" ]     && MKISOFS_OPTIONEN="-volid \"$VOLUMEN_ID\" "${MKISOFS_OPTIONEN}
[ "$APPLICATION_ID" ] && MKISOFS_OPTIONEN="-appid \"$APPLICATION_ID\" "${MKISOFS_OPTIONEN}
[ "$PREPARER" ]       && MKISOFS_OPTIONEN="-preparer \"$PREPARER\" "${MKISOFS_OPTIONEN}
[ "$PUBLISHER" ]      && MKISOFS_OPTIONEN="-publisher \"$PUBLISHER\" "${MKISOFS_OPTIONEN}

# Parameter von cdrecord:
# -v 				Erhöhe das Ausgabelevel der Meldungen um eins
# speed=<Geschwindigkeit>	Schreibgeschwindigkeit des CD-Brenners
# dev=<SCSI-Devcie>		Device des CD-Brenners z.B.'1,00,00'
# -multi 			Erzeut Multi-Session-CDs
# -data				CD-ROM data mode 1
# <Abbilddatei>			Datei mit dem zu schreibenden Track

# Allgemeine Parameter setzen
if [ "$COPY_CD" = "yes" -o "$ISO_IMAGE" ]; then
  CDRECORD_OPTIONEN="-v speed=$SPEED dev=$DEVICE -pad "
else
  CDRECORD_OPTIONEN="-v speed=$SPEED dev=$DEVICE -pad -data "
fi

# Parameter in Abhängigkeit von den Schaltern setzen
[ "$USE_BURNFREE"     = "yes" ]	&& CDRECORD_OPTIONEN="driveropts=burnfree "${CDRECORD_OPTIONEN}
[ "$SIMULATE_WRITING" = "yes" ]	&& CDRECORD_OPTIONEN="-dummy "${CDRECORD_OPTIONEN}
[ "$USE_DAO"          = "yes" ]	&& CDRECORD_OPTIONEN=${CDRECORD_OPTIONEN}"-dao "
if [ ! "$LAST_SESSION" = "yes" -a "$MULTISESSION_CD" = "yes" ]; then
  CDRECORD_OPTIONEN="-multi "${CDRECORD_OPTIONEN}
else
  CDRECORD_OPTIONEN=${CDRECORD_OPTIONEN}"-isosize "
fi

# Abbilddatei an die letzte Stelle "hängen"
if [ "$COPY_CD" = "yes" ]; then
  CDRECORD_OPTIONEN=${CDRECORD_OPTIONEN}" $COPY_SOURCE_DEVICE"
elif [ "$ISO_IMAGE" ]; then
  CDRECORD_OPTIONEN=${CDRECORD_OPTIONEN}" $ISO_IMAGE"
else
  CDRECORD_OPTIONEN=${CDRECORD_OPTIONEN}" $TEMPFILE"

  do_info
  do_info "Temporäres CD-Image erzeugen"
  do_info "----------------------------"
  do_info "Abbild erstellen: $MKISOFS_BIN $MKISOFS_OPTIONEN"
  do_info

  do_debug "Zeile $LINENO: $MKISOFS_BIN wird gestartet"
  $MKISOFS_BIN $MKISOFS_OPTIONEN
  RESULT=$?

  if [ $RESULT -ne 0 ]; then
    echo "Es trat beim Erzeugen des CD-Abbildes ein Fehler auf."
    echo "Rückgabewert: $RESULT"
    do_exit 21
  fi

fi

do_info
do_info "CD erstellen"
do_info "------------"
do_info "CD brennen: $CDRECORD_BIN $CDRECORD_OPTIONEN"
do_info

do_debug "Zeile $LINENO: $CDRECORD_BIN wird gestartet"
$CDRECORD_BIN $CDRECORD_OPTIONEN
RESULT=$?

# Rückgabewert überprüfen
if [ $RESULT -ne 0 ]; then
  echo "Es trat beim Schreiben der CD ein Fehler auf."
  echo "Rückgabewert: $RESULT"
  do_exit 23
fi

do_exit
