]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/dsi/dsi_tcp.c
Fix function definition, return type is pid_t
[netatalk.git] / libatalk / dsi / dsi_tcp.c
index 37a00bf40c2b163904412d72bb2d43808f36729d..f73147a81a9565309bcbe518042edf1f6865e106 100644 (file)
@@ -10,8 +10,6 @@
 #include "config.h"
 #endif /* HAVE_CONFIG_H */
 
-#define USE_TCP_NODELAY
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -85,9 +83,49 @@ static void timeout_handler(int sig _U_)
     exit(EXITERR_CLNT);
 }
 
+/*!
+ * Allocate DSI read buffer and read-ahead buffer
+ */
+static void dsi_init_buffer(DSI *dsi)
+{
+    if ((dsi->commands = malloc(dsi->server_quantum)) == NULL) {
+        LOG(log_error, logtype_dsi, "dsi_init_buffer: OOM");
+        AFP_PANIC("OOM in dsi_init_buffer");
+    }
+
+    /* dsi_peek() read ahead buffer, default is 12 * 300k = 3,6 MB (Apr 2011) */
+    if ((dsi->buffer = malloc(dsi->dsireadbuf * dsi->server_quantum)) == NULL) {
+        LOG(log_error, logtype_dsi, "dsi_init_buffer: OOM");
+        AFP_PANIC("OOM in dsi_init_buffer");
+    }
+    dsi->start = dsi->buffer;
+    dsi->eof = dsi->buffer;
+    dsi->end = dsi->buffer + (dsi->dsireadbuf * dsi->server_quantum);
+}
+
+/*!
+ * Free any allocated ressources of the master afpd DSI objects and close server socket
+ */
+void dsi_free(DSI *dsi)
+{
+    close(dsi->serversock);
+    dsi->serversock = -1;
+
+    free(dsi->commands);
+    dsi->commands = NULL;
+
+    free(dsi->buffer);
+    dsi->buffer = NULL;
+
+#ifdef USE_ZEROCONF
+    free(dsi->bonjourname);
+    dsi->bonjourname = NULL;
+#endif
+}
+
 static struct itimerval itimer;
 /* accept the socket and do a little sanity checking */
-static int dsi_tcp_open(DSI *dsi)
+static pid_t dsi_tcp_open(DSI *dsi)
 {
     pid_t pid;
     SOCKLEN_T len;
@@ -138,6 +176,8 @@ static int dsi_tcp_open(DSI *dsi)
         }
 #endif
 
+        dsi_init_buffer(dsi);
+
         /* read in commands. this is similar to dsi_receive except
          * for the fact that we do some sanity checking to prevent
          * delinquent connections from causing mischief. */
@@ -176,7 +216,7 @@ static int dsi_tcp_open(DSI *dsi)
         dsi->clientID = ntohs(dsi->header.dsi_requestID);
 
         /* make sure we don't over-write our buffers. */
-        dsi->cmdlen = min(ntohl(dsi->header.dsi_len), DSI_CMDSIZ);
+        dsi->cmdlen = min(ntohl(dsi->header.dsi_len), dsi->server_quantum);
 
         stored = 0;
         while (stored < dsi->cmdlen) {
@@ -249,9 +289,10 @@ static void guess_interface(DSI *dsi, const char *hostname, const char *port)
             getip_string((struct sockaddr *)&dsi->server), port, ifr.ifr_name);
         goto iflist_done;
     }
-    LOG(log_info, logtype_dsi, "dsi_tcp (Chooser will not select afp/tcp) "
-        "Check to make sure %s is in /etc/hosts and the correct domain is in "
-        "/etc/resolv.conf: %s", hostname, strerror(errno));
+
+    LOG(log_note, logtype_dsi, "dsi_tcp: couldn't find network interface with IP address to advertice, "
+        "check to make sure \"%s\" is in /etc/hosts or can be resolved with DNS, or "
+        "add a netinterface that is not a loopback or point-2-point type", hostname);
 
 iflist_done:
     close(fd);
@@ -267,7 +308,7 @@ iflist_done:
 int dsi_tcp_init(DSI *dsi, const char *hostname, const char *inaddress, const char *inport)
 {
     EC_INIT;
-    int                flag;
+    int                flag, err;
     char               *a = NULL, *b;
     const char         *address;
     const char         *port;
@@ -328,13 +369,11 @@ int dsi_tcp_init(DSI *dsi, const char *hostname, const char *inaddress, const ch
         setsockopt(dsi->serversock, IPPROTO_IPV6, IPV6_BINDV6ONLY, (char *)&on, sizeof (on));
 #endif
 
-#ifdef USE_TCP_NODELAY
 #ifndef SOL_TCP
 #define SOL_TCP IPPROTO_TCP
 #endif
         flag = 1;
         setsockopt(dsi->serversock, SOL_TCP, TCP_NODELAY, &flag, sizeof(flag));
-#endif /* USE_TCP_NODELAY */
             
         if (bind(dsi->serversock, p->ai_addr, p->ai_addrlen) == -1) {
             close(dsi->serversock);
@@ -377,8 +416,8 @@ int dsi_tcp_init(DSI *dsi, const char *hostname, const char *inaddress, const ch
     hints.ai_family = AF_UNSPEC;
     hints.ai_socktype = SOCK_STREAM;
 
-    if ((ret = getaddrinfo(hostname, port, &hints, &servinfo)) != 0) {
-        LOG(log_info, logtype_dsi, "dsi_tcp_init: getaddrinfo '%s': %s\n", hostname, gai_strerror(ret));
+    if ((err = getaddrinfo(hostname, port, &hints, &servinfo)) != 0) {
+        LOG(log_info, logtype_dsi, "dsi_tcp_init: getaddrinfo '%s': %s\n", hostname, gai_strerror(err));
         goto interfaces;
     }