+close_fd() {
+ local fd=$1
+
+ exec {fd}>&-
+}
+
+send_result_kvm() {
+ echo "$@" > /dev/ttyS1
+}
+
+send_monitor_message_kvm() {
+ echo "$@" > /dev/ttyS2
+}
+
+send_result_xen() {
+ xenstore-write /local/domain/0/snf-image-helper/$DOMID "$*"
+}
+
+send_monitor_message_xen() {
+ #Broadcast the message
+ echo "$@" | socat "STDIO" "UDP-DATAGRAM:${BROADCAST}:${MONITOR_PORT},broadcast"
+}
+
+prepare_helper() {
+ local cmdline item key val hypervisor domid
+
+ read -a cmdline < /proc/cmdline
+ for item in "${cmdline[@]}"; do
+ key=$(cut -d= -f1 <<< "$item")
+ val=$(cut -d= -f2 <<< "$item")
+ if [ "$key" = "hypervisor" ]; then
+ hypervisor="$val"
+ fi
+ if [ "$key" = "rules_dev" ]; then
+ export RULES_DEV="$val"
+ fi
+ if [ "$key" = "helper_ip" ]; then
+ export IP="$val"
+ export NETWORK="$IP/24"
+ export BROADCAST="${IP%.*}.255"
+ fi
+ if [ "$key" = "monitor_port" ]; then
+ export MONITOR_PORT="$val"
+ fi
+ done
+
+ case "$hypervisor" in
+ kvm)
+ HYPERVISOR=kvm
+ ;;
+ xen-hvm|xen-pvm)
+ if [ -z "$IP" ]; then
+ echo "ERROR: \`helper_ip' not defined or empty" >&2
+ exit 1
+ fi
+ if [ -z "$MONITOR_PORT" ]; then
+ echo "ERROR: \`monitor_port' not defined or empty" >&2
+ exit 1
+ fi
+ $MOUNT -t xenfs xenfs /proc/xen
+ ip addr add "$NETWORK" dev eth0
+ ip link set eth0 up
+ ip route add default dev eth0
+ export DOMID=$(xenstore-read domid)
+ HYPERVISOR=xen
+ ;;
+ *)
+ echo "ERROR: Unknown hypervisor: \`$hypervisor'" >&2
+ exit 1
+ ;;
+ esac
+
+ export HYPERVISOR
+}
+