]> arthur.barton.de Git - netatalk.git/commitdiff
Merge master
authorFrank Lahm <franklahm@googlemail.com>
Tue, 27 Mar 2012 14:04:52 +0000 (16:04 +0200)
committerFrank Lahm <franklahm@googlemail.com>
Tue, 27 Mar 2012 14:04:52 +0000 (16:04 +0200)
1  2 
NEWS
etc/afpd/afp_dsi.c
libatalk/dsi/dsi_stream.c
libatalk/dsi/dsi_tcp.c

diff --cc NEWS
index 6c8fd3cdfaadff6cd3761682056351e1fcb68f1a,4b68c54f96a42aaa7e29b5880aeb610eb4cf2590..49b88d8da342fb5074e8ed3005b7f9b606c98200
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -33,7 -10,7 +33,8 @@@ Changes in 2.2.
         and -krb5service are not set, from Jamie Gilbertson
  * FIX: afpd: sendfile() on FreeBSD was broken, courtesy of Denis Ahrens
  * FIX: afpd: Dont use searchdb when doing partial name search
 +* FIX: debian initscript: start avahi-daemon (if available) before atalkd
+ * FIX: afpd: Fix a possible bug handling disconnected sessions, NetAFP Bug ID #16
  
  Changes in 2.2.2
  ================
index 3c42a6796d6967b287ac8788e40c7f420870614e,8379f5bca3706f79997f9b7001275986c1eb407c..e282002e4a37b02dd761a82f85446543be2887c3
  #include "fork.h"
  #include "dircache.h"
  
 -#ifdef FORCE_UIDGID
 -#warning UIDGID
 -#include "uid.h"
 -#endif /* FORCE_UIDGID */
 -
+ #ifndef SOL_TCP
 -#define SOL_TCP IPPROTO_TCP
++#define SOL_TCP IPPROTO_TCPSOL_TCP
+ #endif
  /* 
   * We generally pass this from afp_over_dsi to all afp_* funcs, so it should already be
   * available everywhere. Unfortunately some funcs (eg acltoownermode) need acces to it
Simple merge
index 6e7ac97431735d3bceb3392a1674ce296892b790,3aa900ff20e5270a4495974d5bb1969298e01275..2c16323e2d607884e60ceff2dc6371b3f0a92a7b
@@@ -303,64 -301,67 +301,62 @@@ int dsi_tcp_init(DSI *dsi, const char *
          hints.ai_family = AF_UNSPEC;
  #endif
      }
 -    if ((ret = getaddrinfo(address ? address : NULL, port ? port : "548", &hints, &servinfo)) != 0) {
 +    if ((ret = getaddrinfo(address ? address : NULL, port, &hints, &servinfo)) != 0) {
          LOG(log_error, logtype_dsi, "dsi_tcp_init: getaddrinfo: %s\n", gai_strerror(ret));
 -        return 0;
 +        EC_FAIL;
      }
  
 -    /* create a socket */
 -    if (proxy)
 -        dsi->serversock = -1;
 -    else {
 -        /* loop through all the results and bind to the first we can */
 -        for (p = servinfo; p != NULL; p = p->ai_next) {
 -            if ((dsi->serversock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
 -                LOG(log_info, logtype_dsi, "dsi_tcp_init: socket: %s", strerror(errno));
 -                continue;
 -            }
 +    /* loop through all the results and bind to the first we can */
 +    for (p = servinfo; p != NULL; p = p->ai_next) {
 +        if ((dsi->serversock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
 +            LOG(log_info, logtype_dsi, "dsi_tcp_init: socket: %s", strerror(errno));
 +            continue;
 +        }
  
 -            /*
 -             * Set some socket options:
 -             * SO_REUSEADDR deals w/ quick close/opens
 -             * TCP_NODELAY diables Nagle
 -             */
 +        /*
 +         * Set some socket options:
 +         * SO_REUSEADDR deals w/ quick close/opens
 +         * TCP_NODELAY diables Nagle
 +         */
  #ifdef SO_REUSEADDR
 -            flag = 1;
 -            setsockopt(dsi->serversock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
 +        flag = 1;
 +        setsockopt(dsi->serversock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
  #endif
  #if defined(FREEBSD) && defined(IPV6_BINDV6ONLY)
 -            int on = 0;
 -            setsockopt(dsi->serversock, IPPROTO_IPV6, IPV6_BINDV6ONLY, (char *)&on, sizeof (on));
 +        int on = 0;
 +        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));
 -            
 -            if (bind(dsi->serversock, p->ai_addr, p->ai_addrlen) == -1) {
 -                close(dsi->serversock);
 -                LOG(log_info, logtype_dsi, "dsi_tcp_init: bind: %s\n", strerror(errno));
 -                continue;
 -            }
 -
 -            if (listen(dsi->serversock, DSI_TCPMAXPEND) < 0) {
 -                close(dsi->serversock);
 -                LOG(log_info, logtype_dsi, "dsi_tcp_init: listen: %s\n", strerror(errno));
 -                continue;
 -            }
 +        flag = 1;
 +        setsockopt(dsi->serversock, SOL_TCP, TCP_NODELAY, &flag, sizeof(flag));
- #endif /* USE_TCP_NODELAY */
              
 -            break;
 +        if (bind(dsi->serversock, p->ai_addr, p->ai_addrlen) == -1) {
 +            close(dsi->serversock);
 +            LOG(log_info, logtype_dsi, "dsi_tcp_init: bind: %s\n", strerror(errno));
 +            continue;
          }
  
 -        if (p == NULL)  {
 -            LOG(log_error, logtype_dsi, "dsi_tcp_init: no suitable network config for TCP socket");
 -            freeaddrinfo(servinfo);
 -            return 0;
 +        if (listen(dsi->serversock, DSI_TCPMAXPEND) < 0) {
 +            close(dsi->serversock);
 +            LOG(log_info, logtype_dsi, "dsi_tcp_init: listen: %s\n", strerror(errno));
 +            continue;
          }
 +            
 +        break;
 +    }
  
 -        /* Copy struct sockaddr to struct sockaddr_storage */
 -        memcpy(&dsi->server, p->ai_addr, p->ai_addrlen);
 +    if (p == NULL)  {
 +        LOG(log_error, logtype_dsi, "dsi_tcp_init: no suitable network config for TCP socket");
          freeaddrinfo(servinfo);
 -    } /* if (proxy) */
 +        EC_FAIL;
 +    }
 +
 +    /* Copy struct sockaddr to struct sockaddr_storage */
 +    memcpy(&dsi->server, p->ai_addr, p->ai_addrlen);
 +    freeaddrinfo(servinfo);
  
      /* Point protocol specific functions to tcp versions */
      dsi->proto_open = dsi_tcp_open;