]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/afp_dsi.c
Sending TM used size
[netatalk.git] / etc / afpd / afp_dsi.c
index d7cf01b39e695e3448bf6199337139b65121cf90..0a735ea4d2ae1a0946b63d0ece3cdea8756547f8 100644 (file)
@@ -118,7 +118,7 @@ static void afp_dsi_die(int sig)
 
     dsi_attention(AFPobj->handle, AFPATTN_SHUTDOWN);
     afp_dsi_close(AFPobj);
-    if (sig) /* if no signal, assume dieing because logins are disabled &
+   if (sig) /* if no signal, assume dieing because logins are disabled &
                 don't log it (maintenance mode)*/
         LOG(log_info, logtype_afpd, "Connection terminated");
     if (sig == SIGTERM || sig == SIGALRM) {
@@ -284,7 +284,7 @@ static void alarm_handler(int sig _U_)
 
     if (dsi->flags & DSI_SLEEPING) {
         if (dsi->tickle > AFPobj->options.sleep) {
-            LOG(log_error, logtype_afpd, "afp_alarm: sleep time ended");
+            LOG(log_note, logtype_afpd, "afp_alarm: sleep time ended");
             afp_dsi_die(EXITERR_CLNT);
         }
         return;
@@ -292,7 +292,7 @@ static void alarm_handler(int sig _U_)
 
     if (dsi->flags & DSI_DISCONNECTED) {
         if (dsi->tickle > AFPobj->options.disconnected) {
-            LOG(log_error, logtype_afpd, "afp_alarm: no reconnect within 10 minutes, goodbye");
+            LOG(log_error, logtype_afpd, "afp_alarm: reconnect timer expired, goodbye");
             afp_dsi_die(EXITERR_CLNT);
         }
         return;
@@ -458,19 +458,23 @@ void afp_over_dsi(AFPObj *obj)
         afp_dsi_die(EXITERR_SYS);
 
     /* set TCP snd/rcv buf */
-    if (setsockopt(dsi->socket,
-                   SOL_SOCKET,
-                   SO_RCVBUF,
-                   &obj->options.tcp_rcvbuf,
-                   sizeof(obj->options.tcp_rcvbuf)) != 0) {
-        LOG(log_error, logtype_dsi, "dsi_tcp_open: setsockopt(SO_RCVBUF): %s", strerror(errno));
+    if (obj->options.tcp_rcvbuf) {
+        if (setsockopt(dsi->socket,
+                       SOL_SOCKET,
+                       SO_RCVBUF,
+                       &obj->options.tcp_rcvbuf,
+                       sizeof(obj->options.tcp_rcvbuf)) != 0) {
+            LOG(log_error, logtype_dsi, "afp_over_dsi: setsockopt(SO_RCVBUF): %s", strerror(errno));
+        }
     }
-    if (setsockopt(dsi->socket,
-                   SOL_SOCKET,
-                   SO_SNDBUF,
-                   &obj->options.tcp_sndbuf,
-                   sizeof(obj->options.tcp_sndbuf)) != 0) {
-        LOG(log_error, logtype_dsi, "dsi_tcp_open: setsockopt(SO_SNDBUF): %s", strerror(errno));
+    if (obj->options.tcp_sndbuf) {
+        if (setsockopt(dsi->socket,
+                       SOL_SOCKET,
+                       SO_SNDBUF,
+                       &obj->options.tcp_sndbuf,
+                       sizeof(obj->options.tcp_sndbuf)) != 0) {
+            LOG(log_error, logtype_dsi, "afp_over_dsi: setsockopt(SO_SNDBUF): %s", strerror(errno));
+        }
     }
 
     /* get stuck here until the end */
@@ -491,6 +495,13 @@ void afp_over_dsi(AFPObj *obj)
             }
             /* Some error on the client connection, enter disconnected state */
             dsi->flags |= DSI_DISCONNECTED;
+
+            /* the client sometimes logs out (afp_logout) but doesn't close the DSI session */
+            if (dsi->flags & DSI_AFP_LOGGED_OUT) {
+                afp_dsi_close(obj);
+                exit(0);
+            }
+
             pause(); /* gets interrupted by SIGALARM or SIGURG tickle */
             continue; /* continue receiving until disconnect timer expires
                        * or a primary reconnect succeeds  */
@@ -535,13 +546,14 @@ void afp_over_dsi(AFPObj *obj)
         switch(cmd) {
 
         case DSIFUNC_CLOSE:
+            LOG(log_debug, logtype_afpd, "DSI: close session request");
             afp_dsi_close(obj);
             LOG(log_note, logtype_afpd, "done");
-            return;
+            exit(0);
 
         case DSIFUNC_TICKLE:
             dsi->flags &= ~DSI_DATA; /* thats no data in the sense we use it in alarm_handler */
-            LOG(log_debug, logtype_afpd, "DSI client tickle");
+            LOG(log_debug, logtype_afpd, "DSI: client tickle");
             /* timer is not every 30 seconds anymore, so we don't get killed on the client side. */
             if ((dsi->flags & DSI_DIE))
                 dsi_tickle(dsi);