[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |