| 1 | /*
 | 
|---|
| 2 |  * Copyright (c) 2009 Kungliga Tekniska Högskolan
 | 
|---|
| 3 |  * (Royal Institute of Technology, Stockholm, Sweden).
 | 
|---|
| 4 |  * All rights reserved.
 | 
|---|
| 5 |  *
 | 
|---|
| 6 |  * Portions Copyright (c) 2009, Secure Endpoints Inc. All rights reserved.
 | 
|---|
| 7 |  *
 | 
|---|
| 8 |  * Redistribution and use in source and binary forms, with or without
 | 
|---|
| 9 |  * modification, are permitted provided that the following conditions
 | 
|---|
| 10 |  * are met:
 | 
|---|
| 11 |  *
 | 
|---|
| 12 |  * 1. Redistributions of source code must retain the above copyright
 | 
|---|
| 13 |  *    notice, this list of conditions and the following disclaimer.
 | 
|---|
| 14 |  *
 | 
|---|
| 15 |  * 2. Redistributions in binary form must reproduce the above copyright
 | 
|---|
| 16 |  *    notice, this list of conditions and the following disclaimer in the
 | 
|---|
| 17 |  *    documentation and/or other materials provided with the distribution.
 | 
|---|
| 18 |  *
 | 
|---|
| 19 |  * 3. Neither the name of the Institute nor the names of its contributors
 | 
|---|
| 20 |  *    may be used to endorse or promote products derived from this software
 | 
|---|
| 21 |  *    without specific prior written permission.
 | 
|---|
| 22 |  *
 | 
|---|
| 23 |  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
 | 
|---|
| 24 |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
|---|
| 25 |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
|---|
| 26 |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
 | 
|---|
| 27 |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
|---|
| 28 |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
|---|
| 29 |  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
|---|
| 30 |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
|---|
| 31 |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
|---|
| 32 |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
|---|
| 33 |  * SUCH DAMAGE.
 | 
|---|
| 34 |  */
 | 
|---|
| 35 | 
 | 
|---|
| 36 | #include <config.h>
 | 
|---|
| 37 | #include <err.h>
 | 
|---|
| 38 | #include "getarg.h"
 | 
|---|
| 39 | 
 | 
|---|
| 40 | #include "roken.h"
 | 
|---|
| 41 | 
 | 
|---|
| 42 | #include <ifaddrs.h>
 | 
|---|
| 43 | 
 | 
|---|
| 44 | static int verbose_counter;
 | 
|---|
| 45 | static int version_flag;
 | 
|---|
| 46 | static int help_flag;
 | 
|---|
| 47 | 
 | 
|---|
| 48 | static struct getargs args[] = {
 | 
|---|
| 49 |     {"verbose", 0,      arg_counter,    &verbose_counter,"verbose",     NULL},
 | 
|---|
| 50 |     {"version", 0,      arg_flag,       &version_flag,  "print version",NULL},
 | 
|---|
| 51 |     {"help",    0,      arg_flag,       &help_flag,     NULL,           NULL}
 | 
|---|
| 52 | };
 | 
|---|
| 53 | 
 | 
|---|
| 54 | static void
 | 
|---|
| 55 | usage(int ret)
 | 
|---|
| 56 | {
 | 
|---|
| 57 |     arg_printusage (args,
 | 
|---|
| 58 |                     sizeof(args) / sizeof(args[0]),
 | 
|---|
| 59 |                     NULL, "");
 | 
|---|
| 60 |     exit (ret);
 | 
|---|
| 61 | }
 | 
|---|
| 62 | 
 | 
|---|
| 63 | 
 | 
|---|
| 64 | static void
 | 
|---|
| 65 | print_addr(const char *s, struct sockaddr *sa)
 | 
|---|
| 66 | {
 | 
|---|
| 67 |     int i;
 | 
|---|
| 68 |     printf("  %s=%d/", s, sa->sa_family);
 | 
|---|
| 69 | #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
 | 
|---|
| 70 |     for(i = 0; i < sa->sa_len - ((long)sa->sa_data - (long)&sa->sa_family); i++)
 | 
|---|
| 71 |         printf("%02x", ((unsigned char*)sa->sa_data)[i]);
 | 
|---|
| 72 | #else
 | 
|---|
| 73 |     for(i = 0; i < sizeof(sa->sa_data); i++)
 | 
|---|
| 74 |         printf("%02x", ((unsigned char*)sa->sa_data)[i]);
 | 
|---|
| 75 | #endif
 | 
|---|
| 76 |     printf("\n");
 | 
|---|
| 77 | }
 | 
|---|
| 78 | 
 | 
|---|
| 79 | static void
 | 
|---|
| 80 | print_ifaddrs(struct ifaddrs *x)
 | 
|---|
| 81 | {
 | 
|---|
| 82 |     struct ifaddrs *p;
 | 
|---|
| 83 | 
 | 
|---|
| 84 |     for(p = x; p; p = p->ifa_next) {
 | 
|---|
| 85 |         if (verbose_counter) {
 | 
|---|
| 86 |             printf("%s\n", p->ifa_name);
 | 
|---|
| 87 |             printf("  flags=%x\n", p->ifa_flags);
 | 
|---|
| 88 |             if(p->ifa_addr)
 | 
|---|
| 89 |                 print_addr("addr", p->ifa_addr);
 | 
|---|
| 90 |             if(p->ifa_dstaddr)
 | 
|---|
| 91 |                 print_addr("dstaddr", p->ifa_dstaddr);
 | 
|---|
| 92 |             if(p->ifa_netmask)
 | 
|---|
| 93 |                 print_addr("netmask", p->ifa_netmask);
 | 
|---|
| 94 |             printf("  %p\n", p->ifa_data);
 | 
|---|
| 95 |         }
 | 
|---|
| 96 |     }
 | 
|---|
| 97 | }
 | 
|---|
| 98 | 
 | 
|---|
| 99 | int
 | 
|---|
| 100 | main(int argc, char **argv)
 | 
|---|
| 101 | {
 | 
|---|
| 102 |     struct ifaddrs *addrs = NULL;
 | 
|---|
| 103 |     int ret, optidx = 0;
 | 
|---|
| 104 | 
 | 
|---|
| 105 |     setprogname (argv[0]);
 | 
|---|
| 106 | 
 | 
|---|
| 107 |     if (getarg (args, sizeof(args) / sizeof(args[0]), argc, argv,
 | 
|---|
| 108 |                 &optidx))
 | 
|---|
| 109 |         usage (1);
 | 
|---|
| 110 | 
 | 
|---|
| 111 |     if (help_flag)
 | 
|---|
| 112 |         usage (0);
 | 
|---|
| 113 | 
 | 
|---|
| 114 |     if (version_flag) {
 | 
|---|
| 115 |         fprintf (stderr, "%s from %s-%s\n", getprogname(), PACKAGE, VERSION);
 | 
|---|
| 116 |         return 0;
 | 
|---|
| 117 |     }
 | 
|---|
| 118 | 
 | 
|---|
| 119 |     if (rk_SOCK_INIT())
 | 
|---|
| 120 |         errx(1, "Couldn't initialize sockets. Err=%d\n", rk_SOCK_ERRNO);
 | 
|---|
| 121 | 
 | 
|---|
| 122 |     ret = getifaddrs(&addrs);
 | 
|---|
| 123 |     if (ret != 0)
 | 
|---|
| 124 |         err(1, "getifaddrs");
 | 
|---|
| 125 | 
 | 
|---|
| 126 |     if (addrs == NULL)
 | 
|---|
| 127 |         errx(1, "address == NULL");
 | 
|---|
| 128 | 
 | 
|---|
| 129 |     print_ifaddrs(addrs);
 | 
|---|
| 130 | 
 | 
|---|
| 131 |     /* Check that freeifaddrs doesn't crash */
 | 
|---|
| 132 |     freeifaddrs(addrs);
 | 
|---|
| 133 | 
 | 
|---|
| 134 |     rk_SOCK_EXIT();
 | 
|---|
| 135 | 
 | 
|---|
| 136 |     return 0;
 | 
|---|
| 137 | }
 | 
|---|