Auto create parent directories for rename support

Sometimes renames will move a file into a directory
that does not yet exist.  This will create the
parent directories, using the same symlink logic,
to ensure that there is a valid destination.

Bug: 16458395
Change-Id: Iaa005a12ce800c39f4db20f7c25a2a68cb40a52d
diff --git a/updater/install.c b/updater/install.c
index edc386d..5025881 100644
--- a/updater/install.c
+++ b/updater/install.c
@@ -357,8 +357,10 @@
                    name);
         goto done;
     }
-
-    if (rename(src_name, dst_name) != 0) {
+    if (make_parents(dst_name) != 0) {
+        ErrorAbort(state, "Creating parent of %s() failed, error %s()",
+          dst_name, strerror(errno));
+    } else if (rename(src_name, dst_name) != 0) {
         ErrorAbort(state, "Rename of %s() to %s() failed, error %s()",
           src_name, dst_name, strerror(errno));
     } else {
@@ -642,7 +644,7 @@
         *p = '\0';
         if (make_parents(name) < 0) return -1;
         int result = mkdir(name, 0700);
-        if (result == 0) printf("symlink(): created [%s]\n", name);
+        if (result == 0) printf("created [%s]\n", name);
         *p = '/';
         if (result == 0 || errno == EEXIST) {
             // successfully created or already existed; we're done
diff --git a/updater/install.h b/updater/install.h
index 94f344f..659c8b4 100644
--- a/updater/install.h
+++ b/updater/install.h
@@ -19,4 +19,6 @@
 
 void RegisterInstallFunctions();
 
+static int make_parents(char* name);
+
 #endif