#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;
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;
}
"Session with different pid[%u]", child->pid);
}
} else {
- kill_child(child);
- LOG(log_note, logtype_default,
- "Terminated disconnected session[%u]", child->pid);
+ /* One client with multiple sessions */
+ LOG(log_debug, logtype_default,
+ "Found another session[%u] for client[%u]", child->pid, pid);
}
}
} else {
child->time = boottime;
if (child->clientid)
free(child->clientid);
- LOG(log_debug, logtype_default, "Setting client ID for %d", child->pid);
+ LOG(log_debug, logtype_default, "Setting client ID for %u", child->pid);
child->uid = uid;
child->valid = 1;
child->idlen = idlen;