daemon: Make the RUN_PARTED macro take an error statement.
[libguestfs.git] / daemon / guestfsd.c
index 0fc0128..69baf9e 100644 (file)
@@ -220,10 +220,14 @@ main (int argc, char *argv[])
   /* Set up a basic environment.  After we are called by /init the
    * environment is essentially empty.
    * https://bugzilla.redhat.com/show_bug.cgi?id=502074#c5
+   *
+   * NOTE: if you change $PATH, you must also change 'prog_exists'
+   * function below.
    */
-  setenv ("PATH", "/usr/bin:/bin", 1);
+  setenv ("PATH", "/sbin:/usr/sbin:/bin:/usr/bin", 1);
   setenv ("SHELL", "/bin/sh", 1);
   setenv ("LC_ALL", "C", 1);
+  setenv ("TERM", "dumb", 1);
 
 #ifndef WIN32
   /* We document that umask defaults to 022 (it should be this anyway). */
@@ -928,6 +932,28 @@ split_lines (char *str)
   return lines;
 }
 
+/* Skip leading and trailing whitespace, updating the original string
+ * in-place.
+ */
+void
+trim (char *str)
+{
+  size_t len = strlen (str);
+
+  while (len > 0 && c_isspace (str[len-1])) {
+    str[len-1] = '\0';
+    len--;
+  }
+
+  const char *p = str;
+  while (*p && c_isspace (*p)) {
+    p++;
+    len--;
+  }
+
+  memmove (str, p, len+1);
+}
+
 /* printf helper function so we can use %Q ("quoted") and %R to print
  * shell-quoted strings.  See HACKING file for more details.
  */
@@ -1034,6 +1060,25 @@ device_name_translation (char *device, const char *func)
   goto error;
 }
 
+/* Check program exists and is executable on $PATH.  Actually, we
+ * just assume PATH contains the default entries (see main() above).
+ */
+int
+prog_exists (const char *prog)
+{
+  static const char * const dirs[] =
+    { "/sbin", "/usr/sbin", "/bin", "/usr/bin" };
+  size_t i;
+  char buf[1024];
+
+  for (i = 0; i < sizeof dirs / sizeof dirs[0]; ++i) {
+    snprintf (buf, sizeof buf, "%s/%s", dirs[i], prog);
+    if (access (buf, X_OK) == 0)
+      return 1;
+  }
+  return 0;
+}
+
 /* LVM and other commands aren't synchronous, especially when udev is
  * involved.  eg. You can create or remove some device, but the /dev
  * device node won't appear until some time later.  This means that
@@ -1051,6 +1096,6 @@ device_name_translation (char *device, const char *func)
 void
 udev_settle (void)
 {
-  (void) command (NULL, NULL, "/sbin/udevadm", "settle", NULL);
-  (void) command (NULL, NULL, "/sbin/udevsettle", NULL);
+  (void) command (NULL, NULL, "udevadm", "settle", NULL);
+  (void) command (NULL, NULL, "udevsettle", NULL);
 }