WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] merge

# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID d74e320900fdf06e8d6ed798b31f10dd210ae1c8
# Parent  e8700131597849db2fc37321356b11e689a1717d
# Parent  66e6479d9ab87afee351cd69036226b3f783a346
merge

diff -r e87001315978 -r d74e320900fd tools/console/daemon/io.c
--- a/tools/console/daemon/io.c Wed Aug 10 09:50:05 2005
+++ b/tools/console/daemon/io.c Wed Aug 10 09:50:15 2005
@@ -231,6 +231,7 @@
 
                if (!write_sync(xcs_data_fd, &msg, sizeof(msg))) {
                        dolog(LOG_ERR, "Write to xcs failed: %m");
+                       exit(1);
                }
        } else {
                close(dom->tty_fd);
@@ -262,6 +263,7 @@
 
        if (!read_sync(fd, &msg, sizeof(msg))) {
                dolog(LOG_ERR, "read from xcs failed! %m");
+               exit(1);
        } else if (msg.type == XCS_REQUEST) {
                struct domain *dom;
 
diff -r e87001315978 -r d74e320900fd tools/console/daemon/utils.c
--- a/tools/console/daemon/utils.c      Wed Aug 10 09:50:05 2005
+++ b/tools/console/daemon/utils.c      Wed Aug 10 09:50:15 2005
@@ -59,6 +59,8 @@
 
                if (len < 1) {
                        if (len == -1 && (errno == EAGAIN || errno == EINTR)) {
+                               continue;
+                       } else {
                                return false;
                        }
                } else {
diff -r e87001315978 -r d74e320900fd tools/misc/xend
--- a/tools/misc/xend   Wed Aug 10 09:50:05 2005
+++ b/tools/misc/xend   Wed Aug 10 09:50:15 2005
@@ -24,6 +24,7 @@
 import socket
 import signal
 import time
+import commands
 
 XCS_PATH    = "/var/lib/xen/xcs_socket"
 XCS_EXEC    = "/usr/sbin/xcs"
@@ -116,8 +117,7 @@
        return    
 
 def start_xenstored():
-    if os.fork() == 0:
-        os.execvp('/usr/sbin/xenstored', ['/usr/sbin/xenstored']);
+    s,o = commands.getstatusoutput("/usr/sbin/xenstored 
--pid-file=/var/run/xenstore.pid");
 
 def start_consoled():
     if os.fork() == 0:
diff -r e87001315978 -r d74e320900fd tools/xenstore/utils.c
--- a/tools/xenstore/utils.c    Wed Aug 10 09:50:05 2005
+++ b/tools/xenstore/utils.c    Wed Aug 10 09:50:15 2005
@@ -80,30 +80,6 @@
        barf("malloc of %zu failed", size);
 }
 
-/* Stevens. */
-void daemonize(void)
-{
-       pid_t pid;
-
-       /* Separate from our parent via fork, so init inherits us. */
-       if ((pid = fork()) < 0)
-               barf_perror("Failed to fork daemon");
-       if (pid != 0)
-               exit(0);
-
-       close(STDIN_FILENO);
-       close(STDOUT_FILENO);
-       close(STDERR_FILENO);
-
-       /* Session leader so ^C doesn't whack us. */
-       setsid();
-       /* Move off any mount points we might be in. */
-       chdir("/");
-       /* Discard our parent's old-fashioned umask prejudices. */
-       umask(0);
-}
-
-
 /* This version adds one byte (for nul term) */
 void *grab_file(const char *filename, unsigned long *size)
 {
diff -r e87001315978 -r d74e320900fd tools/xenstore/utils.h
--- a/tools/xenstore/utils.h    Wed Aug 10 09:50:05 2005
+++ b/tools/xenstore/utils.h    Wed Aug 10 09:50:15 2005
@@ -40,9 +40,6 @@
 void *grab_file(const char *filename, unsigned long *size);
 void release_file(void *data, unsigned long size);
 
-/* For writing daemons, based on Stevens. */
-void daemonize(void);
-
 /* Signal handling: returns fd to listen on. */
 int signal_to_fd(int signal);
 void close_signal(int fd);
diff -r e87001315978 -r d74e320900fd tools/xenstore/xenstored_core.c
--- a/tools/xenstore/xenstored_core.c   Wed Aug 10 09:50:05 2005
+++ b/tools/xenstore/xenstored_core.c   Wed Aug 10 09:50:15 2005
@@ -1540,10 +1540,49 @@
                            xs_daemon_transactions());
 }
 
+static void write_pidfile(const char *pidfile)
+{
+       char buf[100];
+       int len;
+       int fd;
+
+       fd = open(pidfile, O_RDWR | O_CREAT, 0600);
+       if (fd == -1)
+               barf_perror("Opening pid file %s", pidfile);
+
+       /* We exit silently if daemon already running. */
+       if (lockf(fd, F_TLOCK, 0) == -1)
+               exit(0);
+
+       len = sprintf(buf, "%d\n", getpid());
+       write(fd, buf, len);
+}
+
+/* Stevens. */
+static void daemonize(void)
+{
+       pid_t pid;
+
+       /* Separate from our parent via fork, so init inherits us. */
+       if ((pid = fork()) < 0)
+               barf_perror("Failed to fork daemon");
+       if (pid != 0)
+               exit(0);
+
+       /* Session leader so ^C doesn't whack us. */
+       setsid();
+       /* Move off any mount points we might be in. */
+       chdir("/");
+       /* Discard our parent's old-fashioned umask prejudices. */
+       umask(0);
+}
+
+
 static struct option options[] = { { "no-fork", 0, NULL, 'N' },
                                   { "verbose", 0, NULL, 'V' },
                                   { "output-pid", 0, NULL, 'P' },
                                   { "trace-file", 1, NULL, 'T' },
+                                  { "pid-file", 1, NULL, 'F' },
                                   { NULL, 0, NULL, 0 } };
 
 int main(int argc, char *argv[])
@@ -1553,6 +1592,7 @@
        fd_set inset, outset;
        bool dofork = true;
        bool outputpid = false;
+       const char *pidfile = NULL;
 
        while ((opt = getopt_long(argc, argv, "DVT:", options, NULL)) != -1) {
                switch (opt) {
@@ -1572,10 +1612,19 @@
                                            optarg);
                         write(tracefd, "\n***\n", strlen("\n***\n"));
                        break;
+               case 'F':
+                       pidfile = optarg;
                }
        }
        if (optind != argc)
                barf("%s: No arguments desired", argv[0]);
+
+       if (dofork) {
+               openlog("xenstored", 0, LOG_DAEMON);
+               daemonize();
+       }
+       if (pidfile)
+               write_pidfile(pidfile);
 
        talloc_enable_leak_report_full();
 
@@ -1623,19 +1672,18 @@
        /* Restore existing connections. */
        restore_existing_connections();
 
-       /* Debugging: daemonize() closes standard fds, so dup here. */
-       tmpout = dup(STDOUT_FILENO);
-       if (dofork) {
-               openlog("xenstored", 0, LOG_DAEMON);
-               daemonize();
-       }
-
        if (outputpid) {
                char buffer[20];
                sprintf(buffer, "%i\n", getpid());
                write(tmpout, buffer, strlen(buffer));
        }
-       close(tmpout);
+
+       /* close stdin/stdout now we're ready to accept connections */
+       if (dofork) {
+               close(STDIN_FILENO);
+               close(STDOUT_FILENO);
+               close(STDERR_FILENO);
+       }
 
 #ifdef TESTING
        signal(SIGUSR1, stop_failtest);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>