`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 <[email protected]>
---
 .../e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh   |   72 +++++++++++++++-----
 1 file 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 47f5b5b..a1808b3 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 '.*: .*'
-- 
1.7.9.5

-- 
_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to