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