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;
}
if ( child->pid != pid) {
if (child->idlen == idlen && memcmp(child->clientid, id, idlen) == 0) {
if ( child->time != boottime ) {
+ /* Client rebooted */
if (uid == child->uid) {
kill_child(child);
- LOG(log_note, logtype_default, "Disconnected child[%u], client rebooted.", child->pid);
+ LOG(log_warning, logtype_default,
+ "Terminated disconnected child[%u], client rebooted.",
+ child->pid);
} else {
- LOG(log_note, logtype_default, "Session with different pid[%u]", child->pid);
+ LOG(log_warning, logtype_default,
+ "Session with different pid[%u]", child->pid);
}
+ } else {
+ /* One client with multiple sessions */
+ LOG(log_debug, logtype_default,
+ "Found another session[%u] for client[%u]", child->pid, pid);
}
- if (child->killed)
- kill_child(child); /* this will send SIGKILL */
- LOG(log_note, logtype_default, "", child->pid, pid);
}
} else {
/* update childs own slot */
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;