populate-extfs.sh: fix to handle special file names correctly

`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]

(From OE-Core rev: 24f17607e996c499c8f86eda0588d02af1e960b9)

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Chen Qi 2014-07-08 18:38:15 +08:00 committed by Richard Purdie
parent 845df01345
commit c4a539c8c8
1 changed files with 54 additions and 18 deletions

View File

@ -30,8 +30,41 @@ DEBUGFS="debugfs"
DIR="$(dirname "$DIR")" 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 if [ "$DIR" != "$CWD" ]; then
echo "cd $DIR" echo "cd \"$D_DIR\""
CWD="$DIR" CWD="$DIR"
fi fi
@ -41,23 +74,24 @@ DEBUGFS="debugfs"
case $TYPE in case $TYPE in
"directory") "directory")
echo "mkdir $TGT" echo "mkdir \"$D_TGT\""
;; ;;
"regular file" | "regular empty file") "regular file" | "regular empty file")
echo "write \"$FILE\" \"$TGT\"" echo "write \"$D_FILE\" \"$D_TGT\""
;; ;;
"symbolic link") "symbolic link")
LINK_TGT=$(readlink "$FILE") 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") "block special file")
echo "mknod \"$TGT\" b $DEVNO" echo "mknod \"$D_TGT\" b $DEVNO"
;; ;;
"character special file") "character special file")
echo "mknod \"$TGT\" c $DEVNO" echo "mknod \"$D_TGT\" c $DEVNO"
;; ;;
"fifo") "fifo")
echo "mknod \"$TGT\" p" echo "mknod \"$D_TGT\" p"
;; ;;
*) *)
echo "Unknown/unhandled file type '$TYPE' file: $FILE" 1>&2 echo "Unknown/unhandled file type '$TYPE' file: $FILE" 1>&2
@ -65,19 +99,19 @@ DEBUGFS="debugfs"
esac esac
# Set the file mode # Set the file mode
echo "sif \"$TGT\" mode 0x$MODE" echo "sif \"$D_TGT\" mode 0x$MODE"
# Set uid and gid # Set uid and gid
echo "sif \"$TGT\" uid $U" echo "sif \"$D_TGT\" uid $U"
echo "sif \"$TGT\" gid $G" echo "sif \"$D_TGT\" gid $G"
# Set atime, mtime and ctime # Set atime, mtime and ctime
AT=`echo $AT | cut -d'.' -f1 | sed -e 's#[- :]##g'` AT=`echo $AT | cut -d'.' -f1 | sed -e 's#[- :]##g'`
MT=`echo $MT | 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'` CT=`echo $CT | cut -d'.' -f1 | sed -e 's#[- :]##g'`
echo "sif \"$TGT\" atime $AT" echo "sif \"$D_TGT\" atime $AT"
echo "sif \"$TGT\" mtime $MT" echo "sif \"$D_TGT\" mtime $MT"
echo "sif \"$TGT\" ctime $CT" echo "sif \"$D_TGT\" ctime $CT"
done done
# Handle the hard links. # Handle the hard links.
@ -91,15 +125,17 @@ DEBUGFS="debugfs"
# Use the debugfs' ln and "sif links_count" to handle them. # Use the debugfs' ln and "sif links_count" to handle them.
for i in `ls $INODE_DIR`; do for i in `ls $INODE_DIR`; do
# The link source # 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 # Remove the files and link them again except the first one
for TGT in `sed -n -e '1!p' $INODE_DIR/$i`; do sed -n -e '1!p' $INODE_DIR/$i | while read TGT; do
echo "rm $TGT" D_TGT="$(echo $TGT | sed -e 's#\"#\"\"#g')"
echo "ln $SRC $TGT" echo "rm \"$D_TGT\""
echo "ln \"$D_SRC\" \"$D_TGT\""
done done
LN_CNT=`cat $INODE_DIR/$i | wc -l` LN_CNT=`cat $INODE_DIR/$i | wc -l`
# Set the links count # Set the links count
echo "sif $SRC links_count $LN_CNT" echo "sif \"$D_SRC\" links_count $LN_CNT"
done done
rm -fr $INODE_DIR rm -fr $INODE_DIR
} | $DEBUGFS -w -f - $DEVICE 2>&1 1>/dev/null | grep '.*: .*' } | $DEBUGFS -w -f - $DEVICE 2>&1 1>/dev/null | grep '.*: .*'