#!/bin/sh # Copyright (C) 2015 # Thomas Schmitt , libburnia-project.org # Provided under BSD license: Use, modify, and distribute as you like. # set -x # ---------------------------- functions --------------------------- usage() { echo >&2 echo "usage: $0 "'\' >&2 echo " [-xorriso path] id_string [-dev] iso_adr [xorriso_arguments ...]" >&2 echo >&2 echo " This script looks for named pipe" >&2 echo ' /tmp/xorriso_stdin_pipe_${id_string}' >&2 echo " which is supposed to be connected to a xorriso process." >&2 echo " If not found, the stdin pipe and a stdout pipe get created" >&2 echo " and a xorriso dialog process gets started and connected." >&2 echo " Each character in id_string must match [-+:.,=@0-9A-Za-z]." >&2 echo " If iso_adr differs from the previous run with the same id_string," >&2 echo " then any changes on the previous ISO are committed as session" >&2 echo " before command -dev is performed to load the meta data of" >&2 echo " the newly addressed ISO." >&2 echo " After this is done, the optionally given xorriso_arguments" >&2 echo " are written into the stdin pipe from where xorriso will read" >&2 echo " them as commands and their parameters." >&2 echo >&2 } # Make filenames safe for transport by wrapping them in quotes and # escaping quotes in their text xorriso_esc() { echo -n "'" echo -n "$1" | sed -e "s/'/'"'"'"'"'"'"'/g" echo -n "'" } # Send one or more command lines to xorriso xorriso_send_cmd() { # $1 : the lines to send # >>> is it possible to have a timeout on echo ? if test -p "$cmd_pipe" then echo " $1" >"$cmd_pipe" else xorriso_is_running=0 return 1 fi } # Send command and wait for answer xorriso_cmd_and_result() { # $1: command line for xorriso # $2: if not empty, grep expression for stdout if test "$xorriso_is_running" = 0 then return 1 fi xorriso_send_cmd "$1" || return 1 if test -n "$2" then cat "$result_pipe" else grep "$2" <"$result_pipe" fi return 0 } # ------------------------------- main ----------------------------- # Argument interpreter if test "$#" -lt 2 then usage "$0" exit 1 fi xorriso=xorriso if test o"$1" = o"-xorriso" then xorriso="$2" shift 2 fi export xorriso_is_running=0 if test "$#" -lt 2 then usage "$0" exit 1 fi id_string=$(echo "$1" | sed -e 's/[^-+:.,=@0-9A-Za-z]/_/g' ) shift 1 # Ignore second argument -dev if test o"$1" = o"-dev" then shift 1 if test "$#" -lt 1 then usage "$0" exit 1 fi fi device="$1" shift 1 # Perform the action export cmd_pipe=/tmp/xorriso_stdin_pipe_$id_string export result_pipe=/tmp/xorriso_stdout_pipe_$id_string if test -p "$cmd_pipe" then xorriso_is_running=1 else xorriso_is_running=0 fi if test "$xorriso_is_running" = "0" then # xorriso is not started yet # Check for xorriso version which knows command -named_pipe_loop echo "Checking xorriso version ..." >&2 xorriso_version_req="1.3.2" version=$("$xorriso" -version | grep '^xorriso version' | sed -e 's/^xorriso version : //') smallest=$( (echo "$xorriso_version_req" ; echo "$version" ) | \ sort | head -1) if test "$smallest" = "$xorriso_version_req" then dummy=dummy else echo "$0 : FATAL : Need xorriso version >= $xorriso_version_req" >&2 echo "Found version: $version" >&2 exit 2 fi if mknod "$cmd_pipe" p then echo "Created named pipe for xorriso commands: $cmd_pipe" >&2 else echo "Failed to create named pipe for xorriso commands: $cmd_pipe" >&2 exit 3 fi if mknod "$result_pipe" p then echo "Created named pipe for xorriso result channel: $result_pipe" >&2 else echo \ "Failed to create named pipe for xorriso result channel: $result_pipe" >&2 if rm "$cmd_pipe" then echo "Removed named pipe for xorriso commands: $cmd_pipe" >&2 fi exit 3 fi echo "Starting xorriso process ..." >&2 "$xorriso" -abort_on NEVER -for_backup \ -named_pipe_loop cleanup:buffered "$cmd_pipe" "$result_pipe" "-" \ >&2 & # (stdout is redirected to stderr, in order not to keep a pipe waiting for # input from the still open stdout copy of the background process. # -named_pipe_loop will disconnect xorriso result channel from stdout.) xorriso_is_running=1 fi # Inquire current xorriso -dev xorriso_device=$(xorriso_cmd_and_result "-status -dev" "^-dev" | \ sed -e 's/^-dev //') if echo " $device" | grep "^ '" >/dev/null then quoted="$device" else quoted=$(xorriso_esc "$device") fi if test "$xorriso_device" = "$quoted" then dummy=dummy else # Inquire the need for a -commit command pending=$(xorriso_cmd_and_result "-changes_pending show_status" \ "^-changes_pending" \ | sed -e 's/^-changes_pending //') if test "$pending" = "yes" then if xorriso_cmd_and_result "-commit" then dummy=dummy else exit 1 fi fi # Now change ISO filesystem if xorriso_cmd_and_result "-dev $device" then xorriso_device="$device" else exit 1 fi fi test "$*" = "" && exit 0 if xorriso_cmd_and_result "$*" then dummy=dummy else exit 1 fi exit 0