sysupgrade: print errno on failure
[project/procd.git] / sysupgrade.c
index a5bad9a8e4264e3cfc1caf4f0a2a4edec70043bb..96a29e919e0db0458695774519f0508c2ef41bdc 100644 (file)
  */
 
 
+#define _GNU_SOURCE
 #include "watchdog.h"
 #include "sysupgrade.h"
 
 #include <ctype.h>
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 
 #include <libubox/blobmsg.h>
 
-void sysupgrade_exec_upgraded(const char *prefix, char *path, char *command,
+void sysupgrade_exec_upgraded(const char *prefix, char *path,
+                             const char *backup, char *command,
                              struct blob_attr *options)
 {
        char *wdt_fd = watchdog_fd();
@@ -47,6 +51,9 @@ void sysupgrade_exec_upgraded(const char *prefix, char *path, char *command,
                setenv("WDTFD", wdt_fd, 1);
        }
 
+       if (backup)
+               setenv("UPGRADE_BACKUP", backup, 1);
+
        blobmsg_for_each_attr(option, options, rem) {
                const char *prefix = "UPGRADE_OPT_";
                char value[11];
@@ -98,7 +105,7 @@ void sysupgrade_exec_upgraded(const char *prefix, char *path, char *command,
        execvp(argv[0], argv);
 
        /* Cleanup on failure */
-       fprintf(stderr, "Failed to exec upgraded.\n");
+       fprintf(stderr, "Failed to exec upgraded: %s\n", strerror(-errno));
        unsetenv("WDTFD");
        watchdog_set_cloexec(true);
        ret = chroot(".");