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:
parent
845df01345
commit
c4a539c8c8
|
@ -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 '.*: .*'
|
||||||
|
|
Loading…
Reference in New Issue