check the pid is > 0 before calling waitpid()
[libguestfs.git] / src / appliance.c
index 6d560ec..99bb21f 100644 (file)
@@ -308,7 +308,7 @@ check_for_cached_appliance (guestfs_h *g,
                             uid_t uid,
                             char **kernel, char **initrd, char **appliance)
 {
-  const char *tmpdir = guestfs_tmpdir ();
+  const char *tmpdir = guestfs___persistent_tmpdir ();
 
   /* len must be longer than the length of any pathname we can
    * generate in this function.
@@ -320,7 +320,6 @@ check_for_cached_appliance (guestfs_h *g,
   snprintf (filename, len, "%s/checksum", cachedir);
 
   (void) mkdir (cachedir, 0755);
-  (void) utime (cachedir, NULL);
 
   /* See if the cache directory exists and passes some simple checks
    * to make sure it has not been tampered with.
@@ -344,13 +343,19 @@ check_for_cached_appliance (guestfs_h *g,
     return -1;
   }
 
+  (void) utime (cachedir, NULL);
+
   garbage_collect_appliances (cachedir);
 
   /* Try to open and acquire a lock on the checksum file. */
   int fd = open (filename, O_RDONLY);
   if (fd == -1)
     return 0;
+#ifdef HAVE_FUTIMENS
   (void) futimens (fd, NULL);
+#else
+  (void) futimes (fd, NULL);
+#endif
   struct flock fl;
   fl.l_type = F_RDLCK;
   fl.l_whence = SEEK_SET;
@@ -418,7 +423,7 @@ build_supermin_appliance (guestfs_h *g,
   if (g->verbose)
     guestfs___print_timestamped_message (g, "begin building supermin appliance");
 
-  const char *tmpdir = guestfs_tmpdir ();
+  const char *tmpdir = guestfs___persistent_tmpdir ();
 
   /* len must be longer than the length of any pathname we can
    * generate in this function.
@@ -563,18 +568,23 @@ hard_link_to_cached_appliance (guestfs_h *g,
     perrorf (g, "link: %s %s", filename, *kernel);
     goto error;
   }
+  (void) lutimes (filename, NULL); /* lutimes because it's a symlink */
+
   snprintf (filename, len, "%s/initrd", cachedir);
   (void) unlink (*initrd);
   if (link (filename, *initrd) == -1) {
     perrorf (g, "link: %s %s", filename, *initrd);
     goto error;
   }
+  (void) utime (filename, NULL);
+
   snprintf (filename, len, "%s/root", cachedir);
   (void) unlink (*appliance);
   if (link (filename, *appliance) == -1) {
     perrorf (g, "link: %s %s", filename, *appliance);
     goto error;
   }
+  (void) utime (filename, NULL);
 
   return 0;