[lxc-devel] [PATCH] lxc-create: use posix shell instead of bash

Natanael Copa ncopa at alpinelinux.org
Fri Nov 16 16:01:55 UTC 2012


- use '[ -x /path/prog ]' instead of 'type /path/prog'
- avoid getopt --longoptions
- add \ at after && and || when those are at end of line
- make sure condition expands to empty string if variable is empty

Signed-off-by: Natanael Copa <ncopa at alpinelinux.org>
---
I have tested it with 'lxc-create -t debian ...' with busybox as /bin/sh

 src/lxc/lxc-create.in | 70 +++++++++++++++++++++++++++++----------------------
 1 file changed, 40 insertions(+), 30 deletions(-)

diff --git a/src/lxc/lxc-create.in b/src/lxc/lxc-create.in
index 101e489..e8056e9 100644
--- a/src/lxc/lxc-create.in
+++ b/src/lxc/lxc-create.in
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 #
 # lxc: linux Container library
@@ -54,16 +54,26 @@ help() {
         echo "  $(basename $0) -t ubuntu -h" >&2
         exit 0
     fi
-    type ${templatedir}/lxc-$lxc_template 2>/dev/null
-    if [ $? -eq 0 ]; then
+    if [ -x ${templatedir}/lxc-$lxc_template ]; then
         echo >&2
         echo "Template-specific options (TEMPLATE_OPTIONS):" >&2
         ${templatedir}/lxc-$lxc_template -h
     fi
 }
 
-shortoptions='hn:f:t:B:'
-longoptions='help,name:,config:,template:,backingstore:,fstype:,dir:,lvname:,vgname:,fssize:'
+usage_err() {
+    [ -n "$1" ] && echo "$1" >&2
+    usage
+    exit 1
+}
+
+optarg_check() {
+    local opt="$1" optarg="$2"
+    if [ -z "$optarg" ]; then
+        usage_err "option '$opt' requires an argument"
+    fi
+}
+
 lxc_path=@LXCPATH@
 bindir=@BINDIR@
 templatedir=@LXCTEMPLATEDIR@
@@ -73,68 +83,69 @@ fssize=500M
 vgname=lxc
 custom_rootfs=""
 
-getopt=$(getopt -o $shortoptions --longoptions  $longoptions -- "$@")
-if [ $? != 0 ]; then
-    usage
-    exit 1;
-fi
-
-eval set -- "$getopt"
-
-while true; do
-        case "$1" in
+while [ $# -gt 0 ]; do
+        local opt="$1"
+        shift
+        case "$opt" in
 	    -h|--help)
 		help
 		exit 1
 		;;
 	    -n|--name)
-		shift
+		optarg_check $opt "$1"
 		lxc_name=$1
 		shift
 		;;
 	    -f|--config)
-		shift
+		optarg_check $opt "$1"
 		lxc_config=$1
 		shift
 		;;
 	    -t|--template)
-		shift
+		optarg_check $opt "$1"
 		lxc_template=$1
 		shift
 		;;
 	    -B|--backingstore)
-		shift
+		optarg_check $opt "$1"
 		backingstore=$1
 		shift
 		;;
 	    --dir)
-		shift
+		optarg_check $opt "$1"
 		custom_rootfs=$1
 		shift
 		;;
 	    --lvname)
-		shift
+		optarg_check $opt "$1"
 		lvname=$1
 		shift
 		;;
 	    --vgname)
-		shift
+		optarg_check $opt "$1"
 		vgname=$1
 		shift
 		;;
 	    --fstype)
-		shift
+		optarg_check $opt "$1"
 		fstype=$1
 		shift
 		;;
 	    --fssize)
-		shift
+		optarg_check $opt "$1"
 		fssize=$1
 		shift
 		;;
             --)
 		shift
 		break;;
+	    -?)
+		usage_err "unknown option '$opt'"
+		;;
+	    -*)
+		# split opts -abc into -a -b -c
+		set -- $(echo "${opt#-}" | sed 's/\(.\)/ -\1/g') "$@"
+		;;
             *)
 		usage
 		exit 1
@@ -200,7 +211,7 @@ rootfs="$lxc_path/$lxc_name/rootfs"
 
 if [ "$backingstore" = "_unset" -o "$backingstore" = "btrfs" ]; then
 # if no backing store was given, then see if btrfs would work
-    if which btrfs >/dev/null 2>&1 &&
+    if which btrfs >/dev/null 2>&1 && \
         btrfs filesystem df "$lxc_path/" >/dev/null 2>&1; then
         backingstore="btrfs"
     else
@@ -246,10 +257,10 @@ elif [ "$backingstore" = "btrfs" ]; then
 fi
 
 cleanup() {
-    if [ $backingstore = "lvm" ]; then
+    if [ "$backingstore" = "lvm" ]; then
         umount $rootfs
         lvremove -f $rootdev
-    elif [ $backingstore = "btrfs" ]; then
+    elif [ "$backingstore" = "btrfs" ]; then
         btrfs subvolume delete "$rootfs"
     fi
     ${bindir}/lxc-destroy -n $lxc_name
@@ -299,8 +310,7 @@ if [ ! -z $lxc_template ]; then
         template_path=${templatedir}/lxc-$lxc_template
     fi
 
-    type $template_path 2>/dev/null
-    if [ $? -ne 0 ]; then
+    if ! [ -x "$template_path" ]; then
         echo "$(basename $0): unknown template '$lxc_template'" >&2
         cleanup
     fi
@@ -314,7 +324,7 @@ if [ ! -z $lxc_template ]; then
     echo "'$lxc_template' template installed"
 fi
 
-if [ $backingstore = "lvm" ]; then
+if [ "$backingstore" = "lvm" ]; then
     echo "Unmounting LVM"
     umount $rootfs
 
-- 
1.8.0





More information about the lxc-devel mailing list