#define _BSD_SOURCE /* for daemon(3) */
#ifdef HAVE_WINDOWS_H
-#include <windows.h>
+# include <windows.h>
#endif
#include <stdio.h>
#include <netdb.h>
#include <sys/select.h>
#include <sys/wait.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
#ifdef HAVE_PRINTF_H
-#include <printf.h>
+# include <printf.h>
#endif
+#include "sockets.h"
#include "c-ctype.h"
#include "ignore-value.h"
+#include "error.h"
#include "daemon.h"
/* This is only a hint. If not defined, ignore it. */
#ifndef AI_ADDRCONFIG
-#define AI_ADDRCONFIG 0
+# define AI_ADDRCONFIG 0
#endif
#ifndef MAX
-#define MAX(a,b) ((a)>(b)?(a):(b))
+# define MAX(a,b) ((a)>(b)?(a):(b))
#endif
int verbose = 0;
#endif
#endif
+#ifdef WIN32
+static int
+daemon (int nochdir, int noclose)
+{
+ fprintf (stderr,
+ "On Windows the daemon does not support forking into the "
+ "background.\nYou *must* run the daemon with the -f option.\n");
+ exit (EXIT_FAILURE);
+}
+#endif /* WIN32 */
+
+#ifdef WIN32
+static int
+winsock_init (void)
+{
+ int r;
+
+ /* http://msdn2.microsoft.com/en-us/library/ms742213.aspx */
+ r = gl_sockets_startup (SOCKETS_2_2);
+ return r == 0 ? 0 : -1;
+}
+#else /* !WIN32 */
+static int
+winsock_init (void)
+{
+ return 0;
+}
+#endif /* !WIN32 */
+
/* Location to mount root device. */
const char *sysroot = "/sysroot"; /* No trailing slash. */
int sysroot_len = 8;
+/* Not used explicitly, but required by the gnulib 'error' module. */
+const char *program_name = "guestfsd";
+
static void
usage (void)
{
char *cmdline;
char *vmchannel = NULL;
+ if (winsock_init () == -1)
+ error (EXIT_FAILURE, 0, "winsock initialization failed");
+
#ifdef HAVE_REGISTER_PRINTF_SPECIFIER
/* http://udrepper.livejournal.com/20948.html */
register_printf_specifier ('Q', print_shell_quote, print_arginfo);
#endif
#ifdef WIN32
-#define setenv(n,v,f) _putenv(n "=" v)
+# define setenv(n,v,f) _putenv(n "=" v)
#endif
/* Set up a basic environment. After we are called by /init the
* environment is essentially empty.
/* Fork into the background. */
if (!dont_fork) {
-#ifndef WIN32
if (daemon (0, 1) == -1) {
perror ("daemon");
exit (EXIT_FAILURE);
}
-#else /* WIN32 */
- fprintf (stderr, "On Windows the daemon does not support forking into the background.\nYou *must* run the daemon with the -f option.\n");
- exit (EXIT_FAILURE);
-#endif /* WIN32 */
}
/* Enter the main loop, reading and performing actions. */
* involved. eg. You can create or remove some device, but the /dev
* device node won't appear until some time later. This means that
* you get an error if you run one command followed by another.
+ *
* Use 'udevadm settle' after certain commands, but don't be too
* fussed if it fails.
+ *
+ * 'udevsettle' was the old name for this command (RHEL 5). This was
+ * deprecated in favour of 'udevadm settle'. The old 'udevsettle'
+ * command was left as a symlink. Then in Fedora 13 the old symlink
+ * remained but it stopped working (RHBZ#548121), so we have to be
+ * careful not to assume that we can use 'udevsettle' if it exists.
*/
void
udev_settle (void)
{
- 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:
- ;
- }
+ (void) command (NULL, NULL, "/sbin/udevadm", "settle", NULL);
+ (void) command (NULL, NULL, "/sbin/udevsettle", NULL);
}