Daemon: fix handling of errors from xread and xwrite.
[libguestfs.git] / daemon / guestfsd.c
index 7bd384e..7c4e72e 100644 (file)
@@ -68,7 +68,7 @@ int
 main (int argc, char *argv[])
 {
   static const char *options = "fh:p:?";
-  static struct option long_options[] = {
+  static const struct option long_options[] = {
     { "foreground", 0, 0, 'f' },
     { "help", 0, 0, '?' },
     { "host", 1, 0, 'h' },
@@ -159,11 +159,11 @@ main (int argc, char *argv[])
       p += 8;
       p2 = strchr (p, ':');
       if (p2) {
-       *p2++ = '\0';
-       host = p;
-       r = strcspn (p2, " \n");
-       p2[r] = '\0';
-       port = p2;
+        *p2++ = '\0';
+        host = p;
+        r = strcspn (p2, " \n");
+        p2[r] = '\0';
+        port = p2;
       }
     }
   }
@@ -188,7 +188,7 @@ main (int argc, char *argv[])
    */
   setenv ("PATH", "/usr/bin:/bin", 1);
   setenv ("SHELL", "/bin/sh", 1);
-  setenv ("LANG", "C", 1);
+  setenv ("LC_ALL", "C", 1);
 
   /* We document that umask defaults to 022 (it should be this anyway). */
   umask (022);
@@ -209,7 +209,7 @@ main (int argc, char *argv[])
     sock = socket (rr->ai_family, rr->ai_socktype, rr->ai_protocol);
     if (sock != -1) {
       if (connect (sock, rr->ai_addr, rr->ai_addrlen) == 0)
-       break;
+        break;
       perror ("connect");
 
       close (sock);
@@ -233,7 +233,8 @@ main (int argc, char *argv[])
     exit (1);
   }
 
-  (void) xwrite (sock, buf, xdr_getpos (&xdr));
+  if (xwrite (sock, buf, xdr_getpos (&xdr)) == -1)
+    exit (1);
 
   xdr_destroy (&xdr);
 
@@ -273,9 +274,10 @@ sysroot_path (const char *path)
 }
 
 int
-xwrite (int sock, const void *buf, size_t len)
+xwrite (int sock, const void *v_buf, size_t len)
 {
   int r;
+  const char *buf = v_buf;
 
   while (len > 0) {
     r = write (sock, buf, len);
@@ -291,9 +293,10 @@ xwrite (int sock, const void *buf, size_t len)
 }
 
 int
-xread (int sock, void *buf, size_t len)
+xread (int sock, void *v_buf, size_t len)
 {
   int r;
+  char *buf = v_buf;
 
   while (len > 0) {
     r = read (sock, buf, len);
@@ -351,7 +354,7 @@ add_string (char ***argv, int *size, int *alloc, const char *str)
 }
 
 int
-count_strings (char * const* const argv)
+count_strings (char *const *argv)
 {
   int argc;
 
@@ -403,7 +406,7 @@ int
 command (char **stdoutput, char **stderror, const char *name, ...)
 {
   va_list args;
-  char **argv, **p;
+  const char **argv;
   char *s;
   int i, r;
 
@@ -420,7 +423,7 @@ command (char **stdoutput, char **stderror, const char *name, ...)
   va_start (args, name);
 
   while ((s = va_arg (args, char *)) != NULL) {
-    p = realloc (argv, sizeof (char *) * (++i));
+    const char **p = realloc (argv, sizeof (char *) * (++i));
     if (p == NULL) {
       perror ("realloc");
       free (argv);
@@ -434,7 +437,7 @@ command (char **stdoutput, char **stderror, const char *name, ...)
 
   va_end (args);
 
-  r = commandv (stdoutput, stderror, argv);
+  r = commandv (stdoutput, stderror, (char **) argv);
 
   /* NB: Mustn't free the strings which are on the stack. */
   free (argv);
@@ -450,7 +453,7 @@ int
 commandr (char **stdoutput, char **stderror, const char *name, ...)
 {
   va_list args;
-  char **argv, **p;
+  const char **argv;
   char *s;
   int i, r;
 
@@ -467,7 +470,7 @@ commandr (char **stdoutput, char **stderror, const char *name, ...)
   va_start (args, name);
 
   while ((s = va_arg (args, char *)) != NULL) {
-    p = realloc (argv, sizeof (char *) * (++i));
+    const char **p = realloc (argv, sizeof (char *) * (++i));
     if (p == NULL) {
       perror ("realloc");
       free (argv);
@@ -491,11 +494,11 @@ commandr (char **stdoutput, char **stderror, const char *name, ...)
 
 /* Same as 'command', but passing an argv. */
 int
-commandv (char **stdoutput, char **stderror, char * const* const argv)
+commandv (char **stdoutput, char **stderror, char *const *argv)
 {
   int r;
 
-  r = commandrv (stdoutput, stderror, argv);
+  r = commandrv (stdoutput, stderror, (void *) argv);
   if (r == 0)
     return 0;
   else
@@ -503,7 +506,7 @@ commandv (char **stdoutput, char **stderror, char * const* const argv)
 }
 
 int
-commandrv (char **stdoutput, char **stderror, char * const* const argv)
+commandrv (char **stdoutput, char **stderror, char const* const *argv)
 {
   int so_size = 0, se_size = 0;
   int so_fd[2], se_fd[2];
@@ -547,7 +550,7 @@ commandrv (char **stdoutput, char **stderror, char * const* const argv)
     close (so_fd[1]);
     close (se_fd[1]);
 
-    execvp (argv[0], argv);
+    execvp (argv[0], (void *) argv);
     perror (argv[0]);
     _exit (1);
   }
@@ -578,40 +581,40 @@ commandrv (char **stdoutput, char **stderror, char * const* const argv)
     if (FD_ISSET (so_fd[0], &rset2)) { /* something on stdout */
       r = read (so_fd[0], buf, sizeof buf);
       if (r == -1) {
-       perror ("read");
-       goto quit;
+        perror ("read");
+        goto quit;
       }
       if (r == 0) { FD_CLR (so_fd[0], &rset); quit++; }
 
       if (r > 0 && stdoutput) {
-       so_size += r;
-       p = realloc (*stdoutput, so_size);
-       if (p == NULL) {
-         perror ("realloc");
-         goto quit;
-       }
-       *stdoutput = p;
-       memcpy (*stdoutput + so_size - r, buf, r);
+        so_size += r;
+        p = realloc (*stdoutput, so_size);
+        if (p == NULL) {
+          perror ("realloc");
+          goto quit;
+        }
+        *stdoutput = p;
+        memcpy (*stdoutput + so_size - r, buf, r);
       }
     }
 
     if (FD_ISSET (se_fd[0], &rset2)) { /* something on stderr */
       r = read (se_fd[0], buf, sizeof buf);
       if (r == -1) {
-       perror ("read");
-       goto quit;
+        perror ("read");
+        goto quit;
       }
       if (r == 0) { FD_CLR (se_fd[0], &rset); quit++; }
 
       if (r > 0 && stderror) {
-       se_size += r;
-       p = realloc (*stderror, se_size);
-       if (p == NULL) {
-         perror ("realloc");
-         goto quit;
-       }
-       *stderror = p;
-       memcpy (*stderror + se_size - r, buf, r);
+        se_size += r;
+        p = realloc (*stderror, se_size);
+        if (p == NULL) {
+          perror ("realloc");
+          goto quit;
+        }
+        *stderror = p;
+        memcpy (*stderror + se_size - r, buf, r);
       }
     }
   }
@@ -643,7 +646,7 @@ commandrv (char **stdoutput, char **stderror, char * const* const argv)
       (*stderror)[se_size] = '\0';
       se_size--;
       while (se_size >= 0 && (*stderror)[se_size] == '\n')
-       (*stderror)[se_size--] = '\0';
+        (*stderror)[se_size--] = '\0';
     }
   }
 
@@ -718,11 +721,11 @@ split_lines (char *str)
  */
 static int
 print_shell_quote (FILE *stream,
-                   const struct printf_info *info,
+                   const struct printf_info *info ATTRIBUTE_UNUSED,
                    const void *const *args)
 {
 #define SAFE(c) (isalnum((c)) ||                                       \
-                (c) == '/' || (c) == '-' || (c) == '_' || (c) == '.')
+                 (c) == '/' || (c) == '-' || (c) == '_' || (c) == '.')
   int i, len;
   const char *str = *((const char **) (args[0]));
 
@@ -740,19 +743,17 @@ print_shell_quote (FILE *stream,
 
 static int
 print_sysroot_shell_quote (FILE *stream,
-                          const struct printf_info *info,
-                          const void *const *args)
+                           const struct printf_info *info,
+                           const void *const *args)
 {
-#define SAFE(c) (isalnum((c)) ||                                       \
-                (c) == '/' || (c) == '-' || (c) == '_' || (c) == '.')
   fputs (sysroot, stream);
   return sysroot_len + print_shell_quote (stream, info, args);
 }
 
 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
 static int
-print_arginfo (const struct printf_info *info,
-              size_t n, int *argtypes, int *size)
+print_arginfo (const struct printf_info *info ATTRIBUTE_UNUSED,
+               size_t n, int *argtypes, int *size)
 {
   if (n > 0) {
     argtypes[0] = PA_STRING;
@@ -775,7 +776,7 @@ print_arginfo (const struct printf_info *info, size_t n, int *argtypes)
 #endif
 
 /* Perform device name translation.  Don't call this directly -
- * use the IS_DEVICE macro.
+ * use the RESOLVE_DEVICE macro.
  *
  * See guestfs(3) for the algorithm.
  *