X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Futil%2Fserver_child.c;h=7fea57c8305a768cde34bc2b4fb72d0f62074e60;hb=fe4626c5d6b380835b3fc1fc35ab6164e6404032;hp=ecefbd2cb7502c65ff349e68b3b845f65e88d91b;hpb=bee44bcbf6b614d7e737602f27a41d041d8efee7;p=netatalk.git diff --git a/libatalk/util/server_child.c b/libatalk/util/server_child.c index ecefbd2c..7fea57c8 100644 --- a/libatalk/util/server_child.c +++ b/libatalk/util/server_child.c @@ -135,8 +135,10 @@ afp_child_t *server_child_add(server_child *children, int forkid, pid_t pid, uin /* it's possible that the child could have already died before the * pthread_sigmask. we need to check for this. */ - if (kill(pid, 0) < 0) + if (kill(pid, 0) < 0) { + LOG(log_error, logtype_default, "server_child_add: no such process pid [%d]", pid); goto exit; + } fork = (server_child_fork *) children->fork + forkid; @@ -205,6 +207,7 @@ void server_child_free(server_child *children) server_child_fork *fork; struct server_child_data *child, *tmp; int i, j; + pid_t pid = getpid(); for (i = 0; i < children->nforks; i++) { fork = (server_child_fork *) children->fork + i; @@ -212,6 +215,9 @@ void server_child_free(server_child *children) child = fork->table[j]; /* start at the beginning */ while (child) { tmp = child->next; + + if (child->ipc_fds[0] != -1) + close(child->ipc_fds[0]); if (child->clientid) { free(child->clientid); } @@ -279,6 +285,16 @@ int server_child_transfer_session(server_child *children, fork = (server_child_fork *) children->fork + forkid; if ((child = resolve_child(fork->table, pid)) == NULL) { LOG(log_note, logtype_default, "Reconnect: no child[%u]", pid); + if (kill(pid, 0) == 0) { + LOG(log_note, logtype_default, "Reconnect: terminating old session[%u]", pid); + kill(pid, SIGTERM); + sleep(2); + if (kill(pid, 0) == 0) { + LOG(log_error, logtype_default, "Reconnect: killing old session[%u]", pid); + kill(pid, SIGKILL); + sleep(2); + } + } return 0; }