aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChen Qi <Qi.Chen@windriver.com>2014-07-04 16:50:04 +0800
committerChen Qi <Qi.Chen@windriver.com>2014-07-08 18:36:54 +0800
commit0464141ef5a06bfbcdb797c5a0b1b58dbd1775fd (patch)
treea9f7b79ab451957ab9dda38c8e32ef7aadd50fbc
parent330c3085317a0b0981163ff5c41c54596e0d127d (diff)
downloadopenembedded-core-contrib-ChenQi/dora-populate-extfs.tar.gz
populate-extfs.sh: fix to handle special file names correctlyChenQi/dora-populate-extfs
`debugfs' treats spaces and "" specially. So when we are dealing with file names, great care should be taken to make sure that `debugfs' recognizes file names correctly. The basic solution here is: 1. Use quotation marks to handle spaces correctly. 2. Replace "xxx" with ""xxx"" so that debugfs knows that the quotation marks are parts of the file name. [YOCTO #6503] Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
-rw-r--r--meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh72
1 files changed, 54 insertions, 18 deletions
diff --git a/meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh b/meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh
index 47f5b5b237..a1808b3b3f 100644
--- a/meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh
+++ b/meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh
@@ -30,8 +30,41 @@ DEBUGFS="debugfs"
DIR="$(dirname "$DIR")"
+ # debugfs handles the quotation mark differently from other special marks like {
+ # If FILE contains quotation marks in its name, then we have to replace " with ""
+ # so that debugfs could correclty recognize them. In this script, we use the prefix
+ # of D_ to denote the file names that should be used by debugfs.
+ #
+ # The usage of case statements here is to avoid performace impact.
+ case $FILE in
+ *\"*)
+ D_FILE="$(echo $FILE | sed -e 's#\"#\"\"#g')"
+ ;;
+ *)
+ D_FILE="$FILE"
+ ;;
+ esac
+
+ case $DIR in
+ *\"*)
+ D_DIR="$(echo $DIR | sed -e 's#\"#\"\"#g')"
+ ;;
+ *)
+ D_DIR="$DIR"
+ ;;
+ esac
+
+ case $TGT in
+ *\"*)
+ D_TGT="$(echo $TGT | sed -e 's#\"#\"\"#g')"
+ ;;
+ *)
+ D_TGT="$TGT"
+ ;;
+ esac
+
if [ "$DIR" != "$CWD" ]; then
- echo "cd $DIR"
+ echo "cd \"$D_DIR\""
CWD="$DIR"
fi
@@ -41,23 +74,24 @@ DEBUGFS="debugfs"
case $TYPE in
"directory")
- echo "mkdir $TGT"
+ echo "mkdir \"$D_TGT\""
;;
"regular file" | "regular empty file")
- echo "write \"$FILE\" \"$TGT\""
+ echo "write \"$D_FILE\" \"$D_TGT\""
;;
"symbolic link")
LINK_TGT=$(readlink "$FILE")
- echo "symlink \"$TGT\" \"$LINK_TGT\""
+ D_LINK_TGT="$(echo $LINK_TGT | sed -e 's#\"#\"\"#g')"
+ echo "symlink \"$D_TGT\" \"$D_LINK_TGT\""
;;
"block special file")
- echo "mknod \"$TGT\" b $DEVNO"
+ echo "mknod \"$D_TGT\" b $DEVNO"
;;
"character special file")
- echo "mknod \"$TGT\" c $DEVNO"
+ echo "mknod \"$D_TGT\" c $DEVNO"
;;
"fifo")
- echo "mknod \"$TGT\" p"
+ echo "mknod \"$D_TGT\" p"
;;
*)
echo "Unknown/unhandled file type '$TYPE' file: $FILE" 1>&2
@@ -65,19 +99,19 @@ DEBUGFS="debugfs"
esac
# Set the file mode
- echo "sif \"$TGT\" mode 0x$MODE"
+ echo "sif \"$D_TGT\" mode 0x$MODE"
# Set uid and gid
- echo "sif \"$TGT\" uid $U"
- echo "sif \"$TGT\" gid $G"
+ echo "sif \"$D_TGT\" uid $U"
+ echo "sif \"$D_TGT\" gid $G"
# Set atime, mtime and ctime
AT=`echo $AT | cut -d'.' -f1 | sed -e 's#[- :]##g'`
MT=`echo $MT | cut -d'.' -f1 | sed -e 's#[- :]##g'`
CT=`echo $CT | cut -d'.' -f1 | sed -e 's#[- :]##g'`
- echo "sif \"$TGT\" atime $AT"
- echo "sif \"$TGT\" mtime $MT"
- echo "sif \"$TGT\" ctime $CT"
+ echo "sif \"$D_TGT\" atime $AT"
+ echo "sif \"$D_TGT\" mtime $MT"
+ echo "sif \"$D_TGT\" ctime $CT"
done
# Handle the hard links.
@@ -91,15 +125,17 @@ DEBUGFS="debugfs"
# Use the debugfs' ln and "sif links_count" to handle them.
for i in `ls $INODE_DIR`; do
# The link source
- SRC=`head -1 $INODE_DIR/$i`
+ SRC="$(head -1 $INODE_DIR/$i)"
+ D_SRC="$(echo $SRC | sed -e 's#\"#\"\"#g')"
# Remove the files and link them again except the first one
- for TGT in `sed -n -e '1!p' $INODE_DIR/$i`; do
- echo "rm $TGT"
- echo "ln $SRC $TGT"
+ sed -n -e '1!p' $INODE_DIR/$i | while read TGT; do
+ D_TGT="$(echo $TGT | sed -e 's#\"#\"\"#g')"
+ echo "rm \"$D_TGT\""
+ echo "ln \"$D_SRC\" \"$D_TGT\""
done
LN_CNT=`cat $INODE_DIR/$i | wc -l`
# Set the links count
- echo "sif $SRC links_count $LN_CNT"
+ echo "sif \"$D_SRC\" links_count $LN_CNT"
done
rm -fr $INODE_DIR
} | $DEBUGFS -w -f - $DEVICE 2>&1 1>/dev/null | grep '.*: .*'