From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: [PATCH] Daemonize xcs Date: Fri, 28 Jan 2005 14:34:45 -0600 Message-ID: <1106944485.9908.48.camel@localhost> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-DhadJRRqnVRCrvttqwwf" Return-path: Sender: xen-devel-admin@lists.sourceforge.net Errors-To: xen-devel-admin@lists.sourceforge.net List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , List-Archive: To: xen-devel@lists.sourceforge.net List-Id: xen-devel@lists.xenproject.org --=-DhadJRRqnVRCrvttqwwf Content-Type: text/plain Content-Transfer-Encoding: 7bit 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 --=-DhadJRRqnVRCrvttqwwf Content-Disposition: attachment; filename=xcs_daemon.diff Content-Type: text/x-patch; name=xcs_daemon.diff; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: 7bit --- 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 #include #include +#include +#include #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; --=-DhadJRRqnVRCrvttqwwf-- ------------------------------------------------------- This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting Tool for open source databases. Create drag-&-drop reports. Save time by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc. Download a FREE copy at http://www.intelliview.com/go/osdn_nl