annotate packages/net/common/current/src/ifaddrs.c @ 1777:c16341b1bac6 default tip

* Added execute permissions to files missed in conversion from CVS
author alexs
date Mon, 12 Oct 2009 02:26:09 +0100
parents 6627c3a1df79
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
2 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
3 // src/ifaddrs.c
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
4 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
5 //==========================================================================
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
6 //####BSDCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
7 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
8 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
9 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
10 // Portions of this software may have been derived from OpenBSD,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
11 // FreeBSD or other sources, and are covered by the appropriate
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
12 // copyright disclaimers included herein.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
13 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
14 // Portions created by Red Hat are
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
15 // Copyright (C) 2002 Red Hat, Inc. All Rights Reserved.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
16 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
17 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
18 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
19 //####BSDCOPYRIGHTEND####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
20 //==========================================================================
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
21
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
22 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
23 // Adapted from KAME getifaddrs.c, if_nametoindex.c, if_indextoname.c
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
24 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
25
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
26 /* $KAME: getifaddrs.c,v 1.9 2001/08/20 02:31:20 itojun Exp $ */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
27 /* $KAME: if_nametoindex.c,v 1.6 2000/11/24 08:18:54 itojun Exp $ */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
28 /* $KAME: if_indextoname.c,v 1.7 2000/11/08 03:09:30 itojun Exp $ */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
29
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
30 /*
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
31 * Copyright (c) 1995, 1999
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
32 * Berkeley Software Design, Inc. All rights reserved.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
33 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
34 * Redistribution and use in source and binary forms, with or without
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
35 * modification, are permitted provided that the following conditions
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
36 * are met:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
37 * 1. Redistributions of source code must retain the above copyright
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
38 * notice, this list of conditions and the following disclaimer.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
39 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
40 * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
43 * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
50 * SUCH DAMAGE.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
51 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
52 * BSDI getifaddrs.c,v 2.12 2000/02/23 14:51:59 dab Exp
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
53 */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
54
957
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 208
diff changeset
55 #include <cyg/infra/diag.h>
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 208
diff changeset
56
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
57 #include <unistd.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
58 #include <stdlib.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
59 #include <string.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
60
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
61 #undef _KERNEL
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
62 #undef __INSIDE_NET
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
63 #include <sys/param.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
64 #include <sys/types.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
65 #include <sys/ioctl.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
66 #include <sys/socket.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
67 #include <net/if.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
68 #include <net/if_dl.h>
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
69 #ifndef CYGPKG_NET_OPENBSD_STACK
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
70 #include <net/if_var.h>
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
71 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
72 #include <errno.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
73 #include <netinet/in.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
74 #include <net/netdb.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
75 #include <ifaddrs.h>
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
76 #include <netinet/in_var.h>
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
77
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
78
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
79 #if !defined(AF_LINK)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
80 #define SA_LEN(sa) sizeof(struct sockaddr)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
81 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
82
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
83 #if !defined(SA_LEN)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
84 #define SA_LEN(sa) (sa)->sa_len
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
85 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
86
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
87 #define SALIGN (sizeof(long) - 1)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
88 #define SA_RLEN(sa) ((sa)->sa_len ? (((sa)->sa_len + SALIGN) & ~SALIGN) : (SALIGN + 1))
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
89
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
90 #ifndef ALIGNBYTES
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
91 /*
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
92 * On systems with a routing socket, ALIGNBYTES should match the value
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
93 * that the kernel uses when building the messages.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
94 */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
95 #define ALIGNBYTES XXX
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
96 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
97 #ifndef ALIGN
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
98 #define ALIGN(p) (((u_long)(p) + ALIGNBYTES) &~ ALIGNBYTES)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
99 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
100
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
101 int
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
102 getifaddrs(struct ifaddrs **pif)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
103 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
104 int icnt = 1; // Interface count
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
105 int dcnt = 0; // Data [length] count
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
106 int ncnt = 0; // Length of interface names
1219
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
107 char *buf;
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
108 #define IF_WORK_SPACE_SZ 1024
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
109 int i, sock;
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
110 #ifdef CYGPKG_NET_INET6
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
111 int sock6;
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
112 struct in6_ifreq ifrq6;
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
113 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
114 struct ifconf ifc;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
115 struct ifreq *ifr, *lifr;
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
116 struct ifreq ifrq;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
117 char *data, *names;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
118 struct ifaddrs *ifa, *ift;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
119
1219
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
120 buf = malloc(IF_WORK_SPACE_SZ);
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
121 if (buf == NULL)
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
122 return (-1);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
123 ifc.ifc_buf = buf;
1219
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
124 ifc.ifc_len = IF_WORK_SPACE_SZ;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
125
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
126 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
1219
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
127 {
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
128 free(buf);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
129 return (-1);
1219
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
130 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
131 i = ioctl(sock, SIOCGIFCONF, (char *)&ifc);
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
132
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
133 if (i < 0) {
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
134 close(sock);
1219
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
135 free(buf);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
136 return (-1);
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
137 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
138
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
139 ifr = ifc.ifc_req;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
140 lifr = (struct ifreq *)&ifc.ifc_buf[ifc.ifc_len];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
141
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
142 while (ifr < lifr) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
143 struct sockaddr *sa;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
144
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
145 sa = &ifr->ifr_addr;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
146 ++icnt;
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
147 dcnt += SA_RLEN(sa) * 3; /* addr, mask, brdcst */
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
148 ncnt += sizeof(ifr->ifr_name) + 1;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
149
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
150 if (SA_LEN(sa) < sizeof(*sa))
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
151 ifr = (struct ifreq *)(((char *)sa) + sizeof(*sa));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
152 else
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
153 ifr = (struct ifreq *)(((char *)sa) + SA_LEN(sa));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
154 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
155
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
156 if (icnt + dcnt + ncnt == 1) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
157 // Nothing found
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
158 *pif = NULL;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
159 free(buf);
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
160 close(sock);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
161 return (0);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
162 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
163 data = malloc(sizeof(struct ifaddrs) * icnt + dcnt + ncnt);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
164 if (data == NULL) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
165 free(buf);
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
166 close(sock);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
167 return(-1);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
168 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
169
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
170 ifa = (struct ifaddrs *)(void *)data;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
171 data += sizeof(struct ifaddrs) * icnt;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
172 names = data + dcnt;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
173
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
174 memset(ifa, 0, sizeof(struct ifaddrs) * icnt);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
175 ift = ifa;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
176
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
177 ifr = ifc.ifc_req;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
178
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
179 #ifdef CYGPKG_NET_INET6
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
180 if ((sock6 = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {
1219
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
181 free(buf);
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
182 free(data);
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
183 close(sock);
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
184 return (-1);
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
185 }
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
186 #endif
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
187
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
188 while (ifr < lifr) {
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
189 struct sockaddr * sa;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
190
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
191 ift->ifa_name = names;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
192 names[sizeof(ifr->ifr_name)] = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
193 strncpy(names, ifr->ifr_name, sizeof(ifr->ifr_name));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
194 while (*names++) ;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
195
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
196 ift->ifa_addr = (struct sockaddr *)data;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
197 sa = &ifr->ifr_addr;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
198 memcpy(data, sa, SA_LEN(sa));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
199 data += SA_RLEN(sa);
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
200
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
201 if ((sa->sa_family == AF_INET) || (sa->sa_family == AF_INET6)) {
1010
9dd1e2b5492e Fixed a compiler warning.
asl
parents: 1007
diff changeset
202 struct sockaddr *sa_netmask = NULL;
9dd1e2b5492e Fixed a compiler warning.
asl
parents: 1007
diff changeset
203 struct sockaddr *sa_broadcast = NULL;
1670
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
204 struct sockaddr *sa_dst = NULL;
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
205
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
206 memset(&ifrq,0,sizeof(ifrq));
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
207 strcpy(ifrq.ifr_name,ifr->ifr_name);
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
208 ioctl( sock, SIOCGIFFLAGS, &ifrq );
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
209
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
210 ift->ifa_flags = ifrq.ifr_flags;
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
211
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
212 memcpy(&ifrq.ifr_addr, ift->ifa_addr,sizeof(struct sockaddr));
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
213 if (sa->sa_family == AF_INET) {
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
214 ioctl(sock, SIOCGIFNETMASK, &ifrq);
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
215 sa_netmask = &ifrq.ifr_addr;
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
216 }
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
217 #ifdef CYGPKG_NET_INET6
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
218 if (sa->sa_family == AF_INET6) {
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
219 memset(&ifrq6,0,sizeof(ifrq));
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
220 strcpy(ifrq6.ifr_name,ifr->ifr_name);
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
221 memcpy(&ifrq6.ifr_addr, ift->ifa_addr,sizeof(struct sockaddr));
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
222
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
223 ioctl(sock6, SIOCGIFNETMASK_IN6, &ifrq6);
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
224 sa_netmask = (struct sockaddr *)&ifrq6.ifr_addr;
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
225 }
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
226 #endif
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
227 ift->ifa_netmask = (struct sockaddr *)data;
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
228 memcpy(data, sa_netmask, SA_LEN(sa_netmask));
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
229 data += SA_RLEN(sa_netmask);
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
230
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
231 memcpy(&ifrq.ifr_addr, ift->ifa_addr,sizeof(struct sockaddr));
1670
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
232 if ((sa->sa_family == AF_INET) && (ift->ifa_flags & IFF_BROADCAST)) {
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
233 if (ioctl(sock, SIOCGIFBRDADDR, &ifrq) == 0) {
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
234 sa_broadcast = &ifrq.ifr_addr;
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
235 ift->ifa_broadaddr = (struct sockaddr *)data;
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
236 memcpy(data, sa_broadcast, SA_LEN(sa_broadcast));
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
237 data += SA_RLEN(sa_broadcast);
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
238 }
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
239 }
1670
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
240
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
241 memcpy(&ifrq.ifr_addr, ift->ifa_addr,sizeof(struct sockaddr));
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
242 if ((sa->sa_family == AF_INET) &&
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
243 (ift->ifa_flags & IFF_POINTOPOINT)) {
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
244 if (ioctl(sock, SIOCGIFDSTADDR, &ifrq) == 0) {
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
245 sa_dst = &ifrq.ifr_addr;
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
246 ift->ifa_dstaddr = (struct sockaddr *)data;
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
247 memcpy(data, sa_dst, SA_LEN(sa_dst));
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
248 data += SA_RLEN(sa_dst);
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
249 }
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
250 }
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
251 }
1670
6627c3a1df79 * src/ifaddrs.c (getifaddrs): Return destination address for P2P
asl
parents: 1219
diff changeset
252
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
253 if (SA_LEN(sa) < sizeof(*sa))
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
254 ifr = (struct ifreq *)(((char *)sa) + sizeof(*sa));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
255 else
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
256 ifr = (struct ifreq *)(((char *)sa) + SA_LEN(sa));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
257 ift = (ift->ifa_next = ift + 1);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
258 }
1219
f2d548ecdbde Be more careful with allocated space, etc. in getifaddrs()
gthomas
parents: 1010
diff changeset
259 free(buf);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
260
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
261 if (--ift >= ifa) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
262 ift->ifa_next = NULL;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
263 *pif = ifa;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
264 } else {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
265 *pif = NULL;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
266 free(ifa);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
267 }
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
268 #ifdef CYGPKG_NET_INET6
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
269 close(sock6);
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
270 #endif
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
271 close(sock);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
272 return (0);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
273 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
274
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
275 void
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
276 freeifaddrs(struct ifaddrs *ifp)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
277 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
278 free(ifp);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
279 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
280
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
281 void
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
282 _show_all_interfaces(void)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
283 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
284 struct ifaddrs *iflist, *ifp;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
285 char addr[64];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
286 int indx;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
287
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
288 if (getifaddrs(&iflist) < 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
289 diag_printf("Can't get interface information!!\n");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
290 return;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
291 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
292 ifp = iflist;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
293 while (ifp != (struct ifaddrs *)NULL) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
294 if (ifp->ifa_addr->sa_family != AF_LINK) {
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
295 getnameinfo (ifp->ifa_addr, ifp->ifa_addr->sa_len, addr,
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
296 sizeof(addr), 0, 0, NI_NUMERICHOST);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
297 diag_printf("%p - %s - %s\n", ifp, ifp->ifa_name, addr);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
298 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
299 ifp = ifp->ifa_next;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
300 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
301 indx = if_nametoindex(iflist->ifa_name);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
302 diag_printf("indx(%s) = %d\n", iflist->ifa_name, indx);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
303 if (indx > 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
304 if (if_indextoname(indx, addr)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
305 diag_printf("index(%s) = %d/%s\n", iflist->ifa_name, indx, addr);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
306 } else {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
307 diag_printf("index(%s) = %d: %s\n", iflist->ifa_name, indx, strerror(errno));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
308 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
309 } else {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
310 diag_printf("index(%s): %s\n", iflist->ifa_name, strerror(errno));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
311 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
312 freeifaddrs(iflist);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
313 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
314
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
315 /*
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
316 * From RFC 2553:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
317 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
318 * 4.1 Name-to-Index
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
319 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
320 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
321 * The first function maps an interface name into its corresponding
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
322 * index.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
323 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
324 * #include <net/if.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
325 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
326 * unsigned int if_nametoindex(const char *ifname);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
327 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
328 * If the specified interface name does not exist, the return value is
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
329 * 0, and errno is set to ENXIO. If there was a system error (such as
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
330 * running out of memory), the return value is 0 and errno is set to the
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
331 * proper value (e.g., ENOMEM).
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
332 */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
333
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
334 unsigned int
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
335 if_nametoindex(const char *ifname)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
336 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
337 struct ifaddrs *ifaddrs, *ifa;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
338 unsigned int ni;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
339
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
340 if (getifaddrs(&ifaddrs) < 0)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
341 return(0);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
342
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
343 ni = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
344
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
345 for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
346 if (ifa->ifa_addr &&
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
347 ifa->ifa_addr->sa_family == AF_LINK &&
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
348 strcmp(ifa->ifa_name, ifname) == 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
349 ni = ((struct sockaddr_dl*)ifa->ifa_addr)->sdl_index;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
350 break;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
351 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
352 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
353
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
354 freeifaddrs(ifaddrs);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
355 if (!ni)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
356 errno = ENXIO;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
357 return(ni);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
358 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
359
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
360 /*
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
361 * From RFC 2533:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
362 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
363 * The second function maps an interface index into its corresponding
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
364 * name.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
365 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
366 * #include <net/if.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
367 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
368 * char *if_indextoname(unsigned int ifindex, char *ifname);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
369 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
370 * The ifname argument must point to a buffer of at least IF_NAMESIZE
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
371 * bytes into which the interface name corresponding to the specified
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
372 * index is returned. (IF_NAMESIZE is also defined in <net/if.h> and
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
373 * its value includes a terminating null byte at the end of the
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
374 * interface name.) This pointer is also the return value of the
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
375 * function. If there is no interface corresponding to the specified
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
376 * index, NULL is returned, and errno is set to ENXIO, if there was a
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
377 * system error (such as running out of memory), if_indextoname returns
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
378 * NULL and errno would be set to the proper value (e.g., ENOMEM).
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
379 */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
380
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
381 char *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
382 if_indextoname(unsigned int ifindex, char *ifname)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
383 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
384 struct ifaddrs *ifaddrs, *ifa;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
385 int error = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
386
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
387 if (getifaddrs(&ifaddrs) < 0)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
388 return(NULL); /* getifaddrs properly set errno */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
389
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
390 for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
391 if (ifa->ifa_addr &&
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
392 ifa->ifa_addr->sa_family == AF_LINK &&
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
393 ifindex == ((struct sockaddr_dl*)ifa->ifa_addr)->sdl_index)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
394 break;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
395 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
396
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
397 if (ifa == NULL) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
398 error = ENXIO;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
399 ifname = NULL;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
400 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
401 else
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
402 strncpy(ifname, ifa->ifa_name, IFNAMSIZ);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
403
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
404 freeifaddrs(ifaddrs);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
405
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
406 errno = error;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
407 return(ifname);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
408 }