Ignore:
Timestamp:
Nov 27, 2012, 4:43:17 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.0

Location:
trunk/server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/server

  • trunk/server/lib/util/util_net.c

    r414 r745  
    2828#include "system/locale.h"
    2929#include "system/filesys.h"
     30#include "lib/util/util_net.h"
    3031#undef strcasecmp
    3132
     
    3637void zero_sockaddr(struct sockaddr_storage *pss)
    3738{
    38         memset(pss, '\0', sizeof(*pss));
     39        ZERO_STRUCTP(pss);
    3940        /* Ensure we're at least a valid sockaddr-storage. */
    4041        pss->ss_family = AF_INET;
     
    5051        struct addrinfo hints;
    5152
    52         memset(&hints, '\0', sizeof(hints));
     53        ZERO_STRUCT(hints);
     54
    5355        /* By default make sure it supports TCP. */
    5456        hints.ai_socktype = SOCK_STREAM;
    5557        hints.ai_flags = flags;
    5658
    57         /* Linux man page on getaddinfo() says port will be
    58            uninitialized when service string in NULL */
     59        /* Linux man page on getaddrinfo() says port will be
     60           uninitialized when service string is NULL */
    5961
    6062        ret = getaddrinfo(str, NULL,
     
    383385 * Check if a struct sockaddr has an unspecified address.
    384386 */
    385 bool is_zero_addr(const struct sockaddr *pss)
    386 {
    387 #if defined(HAVE_IPV6)
    388         if (pss->sa_family == AF_INET6) {
     387bool is_zero_addr(const struct sockaddr_storage *pss)
     388{
     389#if defined(HAVE_IPV6)
     390        if (pss->ss_family == AF_INET6) {
    389391                const struct in6_addr *pin6 =
    390392                        &((const struct sockaddr_in6 *)pss)->sin6_addr;
     
    392394        }
    393395#endif
    394         if (pss->sa_family == AF_INET) {
     396        if (pss->ss_family == AF_INET) {
    395397                const struct in_addr *pin = &((const struct sockaddr_in *)pss)->sin_addr;
    396398                return is_zero_ip_v4(*pin);
     
    539541
    540542
     543/****************************************************************************
     544 Get a port number in host byte order from a sockaddr_storage.
     545****************************************************************************/
     546
     547uint16_t get_sockaddr_port(const struct sockaddr_storage *pss)
     548{
     549        uint16_t port = 0;
     550
     551        if (pss->ss_family != AF_INET) {
     552#if defined(HAVE_IPV6)
     553                /* IPv6 */
     554                const struct sockaddr_in6 *sa6 =
     555                        (const struct sockaddr_in6 *)pss;
     556                port = ntohs(sa6->sin6_port);
     557#endif
     558        } else {
     559                const struct sockaddr_in *sa =
     560                        (const struct sockaddr_in *)pss;
     561                port = ntohs(sa->sin_port);
     562        }
     563        return port;
     564}
     565
     566/****************************************************************************
     567 Print out an IPv4 or IPv6 address from a struct sockaddr_storage.
     568****************************************************************************/
     569
     570char *print_sockaddr_len(char *dest,
     571                         size_t destlen,
     572                        const struct sockaddr *psa,
     573                        socklen_t psalen)
     574{
     575        if (destlen > 0) {
     576                dest[0] = '\0';
     577        }
     578        (void)sys_getnameinfo(psa,
     579                        psalen,
     580                        dest, destlen,
     581                        NULL, 0,
     582                        NI_NUMERICHOST);
     583        return dest;
     584}
     585
     586/****************************************************************************
     587 Print out an IPv4 or IPv6 address from a struct sockaddr_storage.
     588****************************************************************************/
     589
     590char *print_sockaddr(char *dest,
     591                        size_t destlen,
     592                        const struct sockaddr_storage *psa)
     593{
     594        return print_sockaddr_len(dest, destlen, (struct sockaddr *)psa,
     595                        sizeof(struct sockaddr_storage));
     596}
     597
     598/****************************************************************************
     599 Print out a canonical IPv4 or IPv6 address from a struct sockaddr_storage.
     600****************************************************************************/
     601
     602char *print_canonical_sockaddr(TALLOC_CTX *ctx,
     603                        const struct sockaddr_storage *pss)
     604{
     605        char addr[INET6_ADDRSTRLEN];
     606        char *dest = NULL;
     607        int ret;
     608
     609        /* Linux getnameinfo() man pages says port is unitialized if
     610           service name is NULL. */
     611
     612        ret = sys_getnameinfo((const struct sockaddr *)pss,
     613                        sizeof(struct sockaddr_storage),
     614                        addr, sizeof(addr),
     615                        NULL, 0,
     616                        NI_NUMERICHOST);
     617        if (ret != 0) {
     618                return NULL;
     619        }
     620
     621        if (pss->ss_family != AF_INET) {
     622#if defined(HAVE_IPV6)
     623                dest = talloc_asprintf(ctx, "[%s]", addr);
     624#else
     625                return NULL;
     626#endif
     627        } else {
     628                dest = talloc_asprintf(ctx, "%s", addr);
     629        }
     630
     631        return dest;
     632}
     633
     634/****************************************************************************
     635 Return the port number we've bound to on a socket.
     636****************************************************************************/
     637
     638int get_socket_port(int fd)
     639{
     640        struct sockaddr_storage sa;
     641        socklen_t length = sizeof(sa);
     642
     643        if (fd == -1) {
     644                return -1;
     645        }
     646
     647        if (getsockname(fd, (struct sockaddr *)&sa, &length) < 0) {
     648                int level = (errno == ENOTCONN) ? 2 : 0;
     649                DEBUG(level, ("getsockname failed. Error was %s\n",
     650                               strerror(errno)));
     651                return -1;
     652        }
     653
     654#if defined(HAVE_IPV6)
     655        if (sa.ss_family == AF_INET6) {
     656                return ntohs(((struct sockaddr_in6 *)&sa)->sin6_port);
     657        }
     658#endif
     659        if (sa.ss_family == AF_INET) {
     660                return ntohs(((struct sockaddr_in *)&sa)->sin_port);
     661        }
     662        return -1;
     663}
     664
     665/****************************************************************************
     666 Return the string of an IP address (IPv4 or IPv6).
     667****************************************************************************/
     668
     669static const char *get_socket_addr(int fd, char *addr_buf, size_t addr_len)
     670{
     671        struct sockaddr_storage sa;
     672        socklen_t length = sizeof(sa);
     673
     674        /* Ok, returning a hard coded IPv4 address
     675         * is bogus, but it's just as bogus as a
     676         * zero IPv6 address. No good choice here.
     677         */
     678
     679        strlcpy(addr_buf, "0.0.0.0", addr_len);
     680
     681        if (fd == -1) {
     682                return addr_buf;
     683        }
     684
     685        if (getsockname(fd, (struct sockaddr *)&sa, &length) < 0) {
     686                DEBUG(0,("getsockname failed. Error was %s\n",
     687                        strerror(errno) ));
     688                return addr_buf;
     689        }
     690
     691        return print_sockaddr_len(addr_buf, addr_len, (struct sockaddr *)&sa, length);
     692}
     693
     694const char *client_socket_addr(int fd, char *addr, size_t addr_len)
     695{
     696        return get_socket_addr(fd, addr, addr_len);
     697}
Note: See TracChangeset for help on using the changeset viewer.