From: Anthony Liguori <aliguori@us.ibm.com>
To: xen-devel@lists.sourceforge.net
Subject: [PATCH] Daemonize xcs
Date: Fri, 28 Jan 2005 14:34:45 -0600 [thread overview]
Message-ID: <1106944485.9908.48.camel@localhost> (raw)
[-- Attachment #1: Type: text/plain, Size: 520 bytes --]
Currently xcs is run by xend in xen-unstable by simply making it a child
process. If you launch xend from an ssh session, the session won't exit
because the xcs still is connected to it's controlling terminal.
xcs should daemonize itself to prevent this from happening. This patch
does that along with making the domain id => port mapping dynamically
allocated.
Regards,
--
Anthony Liguori
Linux Technology Center (LTC) - IBM Austin
E-mail: aliguori@us.ibm.com
Phone: (512) 838-1208
Signed-off-by: Anthony Liguori
[-- Attachment #2: xcs_daemon.diff --]
[-- Type: text/x-patch, Size: 3410 bytes --]
--- xen-unstable/tools/xcs/xcs.c 2005-01-25 22:29:13.000000000 -0600
+++ xen-unstable-new/tools/xcs/xcs.c 2005-01-26 15:13:30.606838000 -0600
@@ -74,6 +74,8 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
+#include <malloc.h>
+#include <fcntl.h>
#include "xcs.h"
#undef fd_max
@@ -82,14 +84,36 @@
/* ------[ Control channel interfaces ]------------------------------------*/
static control_channel_t *cc_list[NR_EVENT_CHANNELS];
-static int dom_to_port[MAX_DOMS]; /* This should not be a fixed-size array.*/
+static int *dom_port_map = 0;
+static int dom_port_map_size = 0;
+
+static void map_dom_to_port(u32 dom, int port)
+{
+ if (dom >= dom_port_map_size) {
+ dom_port_map = (int *)realloc(dom_port_map,
+ (dom + 10) * sizeof(dom_port_map[0]));
+
+ if (dom_port_map == NULL) {
+ perror("realloc(dom_port_map)");
+ exit(1);
+ }
+
+ for (; dom_port_map_size < dom + 10; dom_port_map_size++) {
+ dom_port_map[dom_port_map_size] = -1;
+ }
+ }
+
+ dom_port_map[dom] = port;
+}
+
+static int dom_to_port(u32 dom) {
+ if (dom >= dom_port_map_size) return -1;
+
+ return dom_port_map[dom];
+}
static void init_interfaces(void)
{
- int i;
-
- for (i = 0; i < MAX_DOMS; i++)
- dom_to_port[i] = -1;
memset(cc_list, 0, sizeof cc_list);
}
@@ -99,9 +123,9 @@
control_channel_t *cc=NULL, *oldcc;
int ret;
- if (cc_list[dom_to_port[dom]] != NULL)
+ if (cc_list[dom_to_port(dom)] != NULL)
{
- return(cc_list[dom_to_port[dom]]);
+ return(cc_list[dom_to_port(dom)]);
}
if (cc_list[local_port] == NULL)
@@ -133,13 +157,13 @@
{
DPRINTF("CC conflict! (port: %d, old dom: %u, new dom: %u)\n",
cc->local_port, oldcc->remote_dom, cc->remote_dom);
- dom_to_port[oldcc->remote_dom] = -1;
+ map_dom_to_port(oldcc->remote_dom, -1);
ctrl_chan_free(cc_list[cc->local_port]);
}
}
cc_list[cc->local_port] = cc;
- dom_to_port[cc->remote_dom] = cc->local_port;
+ map_dom_to_port(cc->remote_dom, cc->local_port);
cc->type = CC_TYPE_INTERDOMAIN;
cc->ref_count = 0;
return cc;
@@ -436,7 +460,7 @@
if ( cmsg->remote_dom > MAX_DOMS )
break;
- port = dom_to_port[cmsg->remote_dom];
+ port = dom_to_port(cmsg->remote_dom);
if (port == -1) break;
cc = cc_list[port];
if ((cc != NULL) && ( cc->type == CC_TYPE_INTERDOMAIN ))
@@ -455,7 +479,7 @@
if ( cmsg->remote_dom > MAX_DOMS )
break;
- port = dom_to_port[cmsg->remote_dom];
+ port = dom_to_port(cmsg->remote_dom);
if (port == -1) break;
cc = cc_list[port];
if ((cc != NULL) && ( cc->type == CC_TYPE_INTERDOMAIN ))
@@ -627,7 +651,30 @@
init_bindings();
listen_fd = listen_socket(XCS_TCP_PORT);
-
+
+ /* detach from our controlling tty so that a shell does hang waiting for
+ stopped jobs. */
+ /* we should use getopt() here */
+
+ if (!(argc == 2 && !strcmp(argv[1], "-i"))) {
+ pid_t pid = fork();
+ int fd;
+
+ if (pid == -1) {
+ perror("fork()");
+ } else if (pid) {
+ exit(0);
+ }
+
+ setsid();
+ close(2);
+ close(1);
+ close(0);
+ fd = open("/dev/null", O_RDWR);
+ dup(fd);
+ dup(fd);
+ }
+
for (;;)
{
int n, ret;
next reply other threads:[~2005-01-28 20:34 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-28 20:34 Anthony Liguori [this message]
2005-01-29 0:28 ` [PATCH] Daemonize xcs Jared Rhine
2005-01-29 0:48 ` Anthony Liguori
2005-01-31 22:24 ` Allen Short
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1106944485.9908.48.camel@localhost \
--to=aliguori@us.ibm.com \
--cc=xen-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.