backuptool: Preserve the SELinux context of the files

Add a function that allows to copy files preserving their SELinux
context that is generic enough to work with both busybox and toybox.

Change-Id: If2c245863df5675c18dbf43b6bcedeb33383fc38
diff --git a/prebuilt/common/bin/backuptool.functions b/prebuilt/common/bin/backuptool.functions
index c7e47b9..4528a33 100644
--- a/prebuilt/common/bin/backuptool.functions
+++ b/prebuilt/common/bin/backuptool.functions
@@ -7,6 +7,16 @@
 export S=/system
 export V=14.1
 
+copy_file() {
+  cp -dp "$1" "$2"
+  # symlinks don't have a context
+  if [ ! -L "$1" ]; then
+    # it is assumed that every label starts with 'u:object_r' and has no white-spaces
+    local context=`ls -Z "$1" | grep -o 'u:object_r:[^ ]*' | head -1`
+    chcon "$context" "$2"
+  fi
+}
+
 backup_file() {
   if [ -e "$1" -o -L "$1" ]; then
     local F=`basename "$1"`
@@ -16,7 +26,7 @@
       echo "Skipping odexed apk $1";
     else
       mkdir -p "$C/$D"
-      cp -dp $1 "$C/$D/$F"
+      copy_file "$1" "$C/$D/$F"
     fi
   fi
 }
@@ -28,7 +38,7 @@
     if [ ! -d "$DIR" ]; then
       mkdir -p "$DIR";
     fi
-    cp -dp "$C/$DIR/$FILE" "$1";
+    copy_file "$C/$DIR/$FILE" "$1";
     if [ -n "$2" ]; then
       echo "Deleting obsolete file $2"
       rm "$2";