# 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
|