]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/util/server_child.c
Merge master
[netatalk.git] / libatalk / util / server_child.c
index e8ed4d4d956382d06330ff02767f0efbf2afe18e..34cec28d17d5b0d601a5fef0daacf0c8b3bbbe90 100644 (file)
@@ -273,6 +273,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;
     }
 
@@ -331,9 +341,9 @@ void server_child_kill_one_by_id(server_child *children, int forkid, pid_t pid,
                                 "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 {
@@ -341,7 +351,7 @@ void server_child_kill_one_by_id(server_child *children, int forkid, pid_t pid,
                 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;