#include <stdlib.h>
#include <string.h>
-#ifdef HAVE_UNISTD_H
#include <unistd.h>
-#endif /* HAVE_UNISTD_H */
#include <signal.h>
#include <errno.h>
-
-/* POSIX.1 sys/wait.h check */
#include <sys/types.h>
-#ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h>
-#endif /* HAVE_SYS_WAIT_H */
#include <sys/time.h>
#include <atalk/logger.h>
void (*cleanup)(const pid_t);
} server_child_fork;
-int parent_or_child; /* 0: parent, 1: child */
-
static inline void hash_child(struct server_child_data **htable,
struct server_child_data *child)
{
/* 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;
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;
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);
}
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;
}