root/third_party/talloc/libreplace/test/getifaddrs.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. format_sockaddr
  2. getifaddrs_test

/*
 * Unix SMB/CIFS implementation.
 *
 * libreplace getifaddrs test
 *
 * Copyright (C) Michael Adam <obnox@samba.org> 2008
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef AUTOCONF_TEST
#include "replace.h"
#include "system/network.h"
#endif

#ifdef HAVE_INET_NTOP
#define rep_inet_ntop inet_ntop
#endif

static const char *format_sockaddr(struct sockaddr *addr,
                                   char *addrstring,
                                   socklen_t addrlen)
{
        const char *result = NULL;

        if (addr->sa_family == AF_INET) {
                result = rep_inet_ntop(AF_INET,
                                       &((struct sockaddr_in *)addr)->sin_addr,
                                       addrstring,
                                       addrlen);
#ifdef HAVE_STRUCT_SOCKADDR_IN6
        } else if (addr->sa_family == AF_INET6) {
                result = rep_inet_ntop(AF_INET6,
                                       &((struct sockaddr_in6 *)addr)->sin6_addr,
                                       addrstring,
                                       addrlen);
#endif
        }
        return result;
}

int getifaddrs_test(void)
{
        struct ifaddrs *ifs = NULL;
        struct ifaddrs *ifs_head = NULL;
        int ret;

        ret = getifaddrs(&ifs);
        ifs_head = ifs;
        if (ret != 0) {
                fprintf(stderr, "getifaddrs() failed: %s\n", strerror(errno));
                return 1;
        }

        while (ifs) {
                printf("%-10s ", ifs->ifa_name);
                if (ifs->ifa_addr != NULL) {
                        char addrstring[INET6_ADDRSTRLEN];
                        const char *result;

                        result = format_sockaddr(ifs->ifa_addr,
                                                 addrstring,
                                                 sizeof(addrstring));
                        if (result != NULL) {
                                printf("IP=%s ", addrstring);
                        }

                        if (ifs->ifa_netmask != NULL) {
                                result = format_sockaddr(ifs->ifa_netmask,
                                                         addrstring,
                                                         sizeof(addrstring));
                                if (result != NULL) {
                                        printf("NETMASK=%s", addrstring);
                                }
                        } else {
                                printf("AF=%d ", ifs->ifa_addr->sa_family);
                        }
                } else {
                        printf("<no address>");
                }

                printf("\n");
                ifs = ifs->ifa_next;
        }

        freeifaddrs(ifs_head);

        return 0;
}

/* [<][>][^][v][top][bottom][index][help] */