#include <rpc/types.h>
#include <rpc/xdr.h>
#include <getopt.h>
-#include <netdb.h>
#include <sys/param.h>
-#include <sys/select.h>
#include <sys/types.h>
-#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
+#include <netdb.h>
+#include <sys/select.h>
+#include <sys/wait.h>
+
+#ifdef HAVE_PRINTF_H
#include <printf.h>
+#endif
#include "c-ctype.h"
#include "ignore-value.h"
#define GUESTFWD_ADDR "10.0.2.4"
#define GUESTFWD_PORT "6666"
+/* This is only a hint. If not defined, ignore it. */
+#ifndef AI_ADDRCONFIG
+#define AI_ADDRCONFIG 0
+#endif
+
int verbose = 0;
static int print_shell_quote (FILE *stream, const struct printf_info *info, const void *const *args);
case '?':
usage ();
- exit (0);
+ exit (EXIT_SUCCESS);
default:
fprintf (stderr, "guestfsd: unexpected command line option 0x%x\n", c);
- exit (1);
+ exit (EXIT_FAILURE);
}
}
if (optind < argc) {
usage ();
- exit (1);
+ exit (EXIT_FAILURE);
}
cmdline = read_cmdline ();
printf ("could not read linux command line\n");
}
+#ifndef WIN32
/* Make sure SIGPIPE doesn't kill us. */
struct sigaction sa;
memset (&sa, 0, sizeof sa);
sa.sa_flags = 0;
if (sigaction (SIGPIPE, &sa, NULL) == -1)
perror ("sigaction SIGPIPE"); /* but try to continue anyway ... */
+#endif
/* Set up a basic environment. After we are called by /init the
* environment is essentially empty.
vmchannel = strndup (p + 18, len);
if (!vmchannel) {
perror ("strndup");
- exit (1);
+ exit (EXIT_FAILURE);
}
}
vmchannel = strndup (p + 4, len);
if (!vmchannel) {
perror ("strndup");
- exit (1);
+ exit (EXIT_FAILURE);
}
memcpy (vmchannel, "tcp:", 4);
}
vmchannel = strdup ("tcp:" GUESTFWD_ADDR ":" GUESTFWD_PORT);
if (!vmchannel) {
perror ("strdup");
- exit (1);
+ exit (EXIT_FAILURE);
}
}
/* Connect to vmchannel. */
int sock = -1;
- if (strncmp (vmchannel, "tcp:", 4) == 0) {
+ if (STREQLEN (vmchannel, "tcp:", 4)) {
/* Resolve the hostname. */
struct addrinfo *res, *rr;
struct addrinfo hints;
} else {
fprintf (stderr, "vmchannel: expecting \"tcp:<ip>:<port>\": %s\n",
vmchannel);
- exit (1);
+ exit (EXIT_FAILURE);
}
memset (&hints, 0, sizeof hints);
if (r != 0) {
fprintf (stderr, "%s:%s: %s\n",
host, port, gai_strerror (r));
- exit (1);
+ exit (EXIT_FAILURE);
}
/* Connect to the given TCP socket. */
"unknown vmchannel connection type: %s\n"
"expecting \"tcp:<ip>:<port>\"\n",
vmchannel);
- exit (1);
+ exit (EXIT_FAILURE);
}
if (sock == -1) {
"or on the libguestfs redhat com mailing list.\n"
"\n",
vmchannel);
- exit (1);
+ exit (EXIT_FAILURE);
}
/* Send the magic length message which indicates that
XDR xdr;
uint32_t len = GUESTFS_LAUNCH_FLAG;
xdrmem_create (&xdr, lenbuf, sizeof lenbuf, XDR_ENCODE);
- xdr_uint32_t (&xdr, &len);
+ xdr_u_int (&xdr, &len);
if (xwrite (sock, lenbuf, sizeof lenbuf) == -1)
- exit (1);
+ exit (EXIT_FAILURE);
xdr_destroy (&xdr);
if (!dont_fork) {
if (daemon (0, 1) == -1) {
perror ("daemon");
- exit (1);
+ exit (EXIT_FAILURE);
}
}
/* Enter the main loop, reading and performing actions. */
main_loop (sock);
- exit (0);
+ exit (EXIT_SUCCESS);
}
/* Read /proc/cmdline. */
int size = 0, alloc = 0;
char *p, *pend;
- if (strcmp (str, "") == 0)
+ if (STREQ (str, ""))
goto empty_list;
p = str;
void
udev_settle (void)
{
- command (NULL, NULL, "/sbin/udevadm", "settle", NULL);
+ static int which_prog = 0;
+
+ if (which_prog == 0) {
+ if (access ("/sbin/udevsettle", X_OK) == 0)
+ which_prog = 2;
+ else if (access ("/sbin/udevadm", X_OK) == 0)
+ which_prog = 1;
+ else
+ which_prog = 3;
+ }
+
+ switch (which_prog) {
+ case 1:
+ command (NULL, NULL, "/sbin/udevadm", "settle", NULL);
+ break;
+ case 2:
+ command (NULL, NULL, "/sbin/udevsettle", NULL);
+ break;
+ default:
+ ;
+ }
}