From 1f2b1f58803a91d9a5a43ab63f6e9cff763d983f Mon Sep 17 00:00:00 2001 From: Gao feng Date: Fri, 23 Oct 2015 14:44:15 +0800 Subject: [PATCH] watch up pty fd before exec cmd exec cmd may exit before hyper init watching it's ptmx fd, so the hup event of ptmx may miss, this will cause the eof message fail to send out. Signed-off-by: Gao feng --- src/container.c | 12 +++++++----- src/event.c | 5 ++--- src/exec.c | 10 +++++----- src/parse.c | 1 + 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/container.c b/src/container.c index 169eb42..cecc51f 100644 --- a/src/container.c +++ b/src/container.c @@ -525,6 +525,11 @@ int hyper_start_container(struct hyper_container *container, goto fail; } + if (hyper_watch_exec_pty(&container->exec, pod) < 0) { + fprintf(stderr, "faile to watch container pty\n"); + goto fail; + } + /* wait for ready message */ if (hyper_get_type(arg.pipe[0], &type) < 0 || type != READY) { fprintf(stderr, "wait for container started failed\n"); @@ -534,17 +539,14 @@ int hyper_start_container(struct hyper_container *container, close(arg.pipe[0]); close(arg.pipe[1]); - if (hyper_watch_exec_pty(&container->exec, pod) < 0) { - fprintf(stderr, "faile to watch container pty\n"); - goto fail; - } - fprintf(stdout, "container %s init pid is %d\n", container->id, pid); return 0; fail: close(arg.pipe[0]); close(arg.pipe[1]); close(container->ns); + hyper_reset_event(&container->exec.e); + hyper_reset_event(&container->exec.errev); container->ns = -1; fprintf(stdout, "container %s init exit code %d\n", container->id, -1); container->exec.code = -1; diff --git a/src/event.c b/src/event.c index a6ec6a7..81b6375 100644 --- a/src/event.c +++ b/src/event.c @@ -14,8 +14,9 @@ void hyper_reset_event(struct hyper_event *de) { free(de->rbuf.data); free(de->wbuf.data); - + close(de->fd); memset(de, 0, sizeof(*de)); + de->fd = -1; } int hyper_init_event(struct hyper_event *de, struct hyper_event_ops *ops, void *arg) @@ -219,8 +220,6 @@ void hyper_event_hup(struct hyper_event *de, int efd) { if (epoll_ctl(efd, EPOLL_CTL_DEL, de->fd, NULL) < 0) perror("epoll_ctl del epoll event failed"); - close(de->fd); - de->fd = -1; hyper_reset_event(de); } diff --git a/src/exec.c b/src/exec.c index df2beb8..3916134 100644 --- a/src/exec.c +++ b/src/exec.c @@ -370,6 +370,11 @@ static int hyper_do_exec_cmd(void *data) } else if (pid > 0) { uint32_t type; + if (hyper_watch_exec_pty(exec, pod) < 0) { + fprintf(stderr, "add pts master event failed\n"); + goto out; + } + if (hyper_get_type(pipe[0], &type) < 0 || type != READY) { fprintf(stderr, "hyper init doesn't get execcmd ready message\n"); hyper_send_type(arg->pipe[1], ERROR); @@ -380,11 +385,6 @@ static int hyper_do_exec_cmd(void *data) exec->pid = pid; fprintf(stdout, "create exec cmd %s pid %d\n", exec->argv[0], pid); - if (hyper_watch_exec_pty(exec, pod) < 0) { - fprintf(stderr, "add pts master event failed\n"); - goto out; - } - list_add_tail(&exec->list, &pod->exec_head); ret = 0; goto out; diff --git a/src/parse.c b/src/parse.c index 98c25eb..a159b31 100644 --- a/src/parse.c +++ b/src/parse.c @@ -227,6 +227,7 @@ static int hyper_parse_container(struct hyper_pod *pod, struct hyper_container * c->exec.code = -1; c->exec.e.fd = -1; c->exec.ptyfd = -1; + c->exec.errfd = -1; c->ns = -1; next_container = toks[i].size;