003 File Manager
Current Path:
/usr/src/lib/libc/net
usr
/
src
/
lib
/
libc
/
net
/
📁
..
📄
Makefile.inc
(5.08 KB)
📄
Symbol.map
(2.8 KB)
📄
base64.c
(10.39 KB)
📄
byteorder.3
(2.74 KB)
📄
ether_addr.c
(5.68 KB)
📄
ethers.3
(5.85 KB)
📄
eui64.3
(6.37 KB)
📄
eui64.c
(8.3 KB)
📄
gai_strerror.3
(2.49 KB)
📄
gai_strerror.c
(3.98 KB)
📄
getaddrinfo.3
(12.12 KB)
📄
getaddrinfo.c
(70.2 KB)
📄
gethostbydns.c
(19.1 KB)
📄
gethostbyht.c
(9.04 KB)
📄
gethostbyname.3
(8.74 KB)
📄
gethostbynis.c
(6.94 KB)
📄
gethostnamadr.c
(17.01 KB)
📄
getifaddrs.3
(4.24 KB)
📄
getifaddrs.c
(8.57 KB)
📄
getifmaddrs.3
(3 KB)
📄
getifmaddrs.c
(4.79 KB)
📄
getipnodebyname.3
(10.04 KB)
📄
getnameinfo.3
(7.6 KB)
📄
getnameinfo.c
(13.68 KB)
📄
getnetbydns.c
(12 KB)
📄
getnetbyht.c
(7.18 KB)
📄
getnetbynis.c
(6.09 KB)
📄
getnetent.3
(4.36 KB)
📄
getnetnamadr.c
(10.46 KB)
📄
getproto.c
(3.87 KB)
📄
getprotoent.3
(3.78 KB)
📄
getprotoent.c
(12.22 KB)
📄
getprotoname.c
(4.25 KB)
📄
getservent.3
(4.13 KB)
📄
getservent.c
(29.69 KB)
📄
hesiod.3
(4.19 KB)
📄
hesiod.c
(12.17 KB)
📄
hosts
(1.01 KB)
📄
hosts.equiv
(53 B)
📄
if_indextoname.3
(3.94 KB)
📄
if_indextoname.c
(2.94 KB)
📄
if_nameindex.c
(4.21 KB)
📄
if_nametoindex.c
(2.84 KB)
📄
inet.3
(7.76 KB)
📄
inet6_opt_init.3
(9.07 KB)
📄
inet6_option_space.3
(2.18 KB)
📄
inet6_rth_space.3
(6.86 KB)
📄
inet6_rthdr_space.3
(2.22 KB)
📄
inet_net.3
(5.01 KB)
📄
ip6opt.c
(15.36 KB)
📄
linkaddr.3
(3.94 KB)
📄
linkaddr.c
(4.44 KB)
📄
map_v4v6.c
(3.93 KB)
📄
name6.c
(28.18 KB)
📄
netdb_private.h
(5.2 KB)
📄
networks
(310 B)
📄
nscache.c
(10.91 KB)
📄
nscachedcli.c
(14.18 KB)
📄
nsdispatch.3
(6.25 KB)
📄
nsdispatch.c
(20.3 KB)
📄
nslexer.l
(3.01 KB)
📄
nsparser.y
(3.91 KB)
📄
nss_backends.h
(2.04 KB)
📄
nss_compat.c
(7.93 KB)
📄
nsswitch.conf
(272 B)
📄
ntoh.c
(1.75 KB)
📄
protocols
(6.24 KB)
📄
rcmd.3
(8.14 KB)
📄
rcmd.c
(18.57 KB)
📄
rcmdsh.3
(3.23 KB)
📄
rcmdsh.c
(4.95 KB)
📄
recv.c
(2.22 KB)
📄
res_config.h
(299 B)
📄
resolver.3
(11.43 KB)
📄
rthdr.c
(9.7 KB)
📄
sctp_bindx.3
(3.47 KB)
📄
sctp_connectx.3
(3.44 KB)
📄
sctp_freepaddrs.3
(2.26 KB)
📄
sctp_getaddrlen.3
(2.82 KB)
📄
sctp_getassocid.3
(2.44 KB)
📄
sctp_getpaddrs.3
(3.11 KB)
📄
sctp_opt_info.3
(3.55 KB)
📄
sctp_recvmsg.3
(8.43 KB)
📄
sctp_send.3
(11.12 KB)
📄
sctp_sendmsg.3
(10.45 KB)
📄
sctp_sys_calls.c
(30.35 KB)
📄
send.c
(2.23 KB)
📄
sockatmark.3
(3.26 KB)
📄
sockatmark.c
(1.59 KB)
📄
sourcefilter.3
(6.38 KB)
📄
sourcefilter.c
(9.71 KB)
📄
vars.c
(2.07 KB)
Editing: getifaddrs.c
/* $KAME: getifaddrs.c,v 1.9 2001/08/20 02:31:20 itojun Exp $ */ /*- * SPDX-License-Identifier: BSD-1-Clause * * Copyright (c) 1995, 1999 * Berkeley Software Design, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * BSDI getifaddrs.c,v 2.12 2000/02/23 14:51:59 dab Exp */ /* * NOTE: SIOCGIFCONF case is not LP64 friendly. it also does not perform * try-and-error for region size. */ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); #include "namespace.h" #include <sys/types.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <net/if.h> #ifdef NET_RT_IFLIST #include <sys/param.h> #include <net/route.h> #include <sys/sysctl.h> #include <net/if_dl.h> #endif #include <errno.h> #include <ifaddrs.h> #include <stdlib.h> #include <string.h> #include "un-namespace.h" #if !defined(AF_LINK) #define SA_LEN(sa) sizeof(struct sockaddr) #endif #if !defined(SA_LEN) #define SA_LEN(sa) (sa)->sa_len #endif #define SALIGN (sizeof(long) - 1) #define SA_RLEN(sa) ((sa)->sa_len ? (((sa)->sa_len + SALIGN) & ~SALIGN) : (SALIGN + 1)) #ifndef ALIGNBYTES /* * On systems with a routing socket, ALIGNBYTES should match the value * that the kernel uses when building the messages. */ #define ALIGNBYTES XXX #endif #ifndef ALIGN #define ALIGN(p) (((u_long)(p) + ALIGNBYTES) &~ ALIGNBYTES) #endif #define MAX_SYSCTL_TRY 5 int getifaddrs(struct ifaddrs **pif) { int icnt = 1; int dcnt = 0; int ncnt = 0; int ntry = 0; int mib[6]; size_t needed; char *buf; char *next; struct ifaddrs *cif; char *p, *p0; struct rt_msghdr *rtm; struct if_msghdrl *ifm; struct ifa_msghdrl *ifam; struct sockaddr_dl *dl; struct sockaddr *sa; struct ifaddrs *ifa, *ift; struct if_data *if_data; u_short idx = 0; int i; size_t len, alen; char *data; char *names; mib[0] = CTL_NET; mib[1] = PF_ROUTE; mib[2] = 0; /* protocol */ mib[3] = 0; /* wildcard address family */ mib[4] = NET_RT_IFLISTL;/* extra fields for extensible msghdr structs */ mib[5] = 0; /* no flags */ do { /* * We'll try to get addresses several times in case that * the number of addresses is unexpectedly increased during * the two sysctl calls. This should rarely happen, but we'll * try to do our best for applications that assume success of * this library (which should usually be the case). * Portability note: since FreeBSD does not add margin of * memory at the first sysctl, the possibility of failure on * the second sysctl call is a bit higher. */ if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) return (-1); if ((buf = malloc(needed)) == NULL) return (-1); if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) { if (errno != ENOMEM || ++ntry >= MAX_SYSCTL_TRY) { free(buf); return (-1); } free(buf); buf = NULL; } } while (buf == NULL); for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { rtm = (struct rt_msghdr *)(void *)next; if (rtm->rtm_version != RTM_VERSION) continue; switch (rtm->rtm_type) { case RTM_IFINFO: ifm = (struct if_msghdrl *)(void *)rtm; if (ifm->ifm_addrs & RTA_IFP) { idx = ifm->ifm_index; ++icnt; if_data = IF_MSGHDRL_IFM_DATA(ifm); dcnt += if_data->ifi_datalen; dl = (struct sockaddr_dl *)IF_MSGHDRL_RTA(ifm); dcnt += SA_RLEN((struct sockaddr *)(void*)dl) + ALIGNBYTES; ncnt += dl->sdl_nlen + 1; } else idx = 0; break; case RTM_NEWADDR: ifam = (struct ifa_msghdrl *)(void *)rtm; if (idx && ifam->ifam_index != idx) abort(); /* this cannot happen */ #define RTA_MASKS (RTA_NETMASK | RTA_IFA | RTA_BRD) if (idx == 0 || (ifam->ifam_addrs & RTA_MASKS) == 0) break; p = (char *)IFA_MSGHDRL_RTA(ifam); ++icnt; if_data = IFA_MSGHDRL_IFAM_DATA(ifam); dcnt += if_data->ifi_datalen + ALIGNBYTES; /* Scan to look for length of address */ alen = 0; for (p0 = p, i = 0; i < RTAX_MAX; i++) { if ((RTA_MASKS & ifam->ifam_addrs & (1 << i)) == 0) continue; sa = (struct sockaddr *)(void *)p; len = SA_RLEN(sa); if (i == RTAX_IFA) { alen = len; break; } p += len; } for (p = p0, i = 0; i < RTAX_MAX; i++) { if ((RTA_MASKS & ifam->ifam_addrs & (1 << i)) == 0) continue; sa = (struct sockaddr *)(void *)p; len = SA_RLEN(sa); if (i == RTAX_NETMASK && SA_LEN(sa) == 0) dcnt += alen; else dcnt += len; p += len; } break; } } if (icnt + dcnt + ncnt == 1) { *pif = NULL; free(buf); return (0); } data = malloc(sizeof(struct ifaddrs) * icnt + dcnt + ncnt); if (data == NULL) { free(buf); return(-1); } ifa = (struct ifaddrs *)(void *)data; data += sizeof(struct ifaddrs) * icnt; names = data + dcnt; memset(ifa, 0, sizeof(struct ifaddrs) * icnt); ift = ifa; idx = 0; cif = NULL; for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { rtm = (struct rt_msghdr *)(void *)next; if (rtm->rtm_version != RTM_VERSION) continue; switch (rtm->rtm_type) { case RTM_IFINFO: ifm = (struct if_msghdrl *)(void *)rtm; if ((ifm->ifm_addrs & RTA_IFP) == 0) { idx = 0; break; } idx = ifm->ifm_index; dl = (struct sockaddr_dl *)IF_MSGHDRL_RTA(ifm); cif = ift; ift->ifa_name = names; ift->ifa_flags = (int)ifm->ifm_flags; memcpy(names, dl->sdl_data, (size_t)dl->sdl_nlen); names[dl->sdl_nlen] = 0; names += dl->sdl_nlen + 1; ift->ifa_addr = (struct sockaddr *)(void *)data; memcpy(data, dl, (size_t)SA_LEN((struct sockaddr *) (void *)dl)); data += SA_RLEN((struct sockaddr *)(void *)dl); if_data = IF_MSGHDRL_IFM_DATA(ifm); /* ifm_data needs to be aligned */ ift->ifa_data = data = (void *)ALIGN(data); memcpy(data, if_data, if_data->ifi_datalen); data += if_data->ifi_datalen; ift = (ift->ifa_next = ift + 1); break; case RTM_NEWADDR: ifam = (struct ifa_msghdrl *)(void *)rtm; if (idx && ifam->ifam_index != idx) abort(); /* this cannot happen */ if (idx == 0 || (ifam->ifam_addrs & RTA_MASKS) == 0) break; ift->ifa_name = cif->ifa_name; ift->ifa_flags = cif->ifa_flags; ift->ifa_data = NULL; p = (char *)IFA_MSGHDRL_RTA(ifam); /* Scan to look for length of address */ alen = 0; for (p0 = p, i = 0; i < RTAX_MAX; i++) { if ((RTA_MASKS & ifam->ifam_addrs & (1 << i)) == 0) continue; sa = (struct sockaddr *)(void *)p; len = SA_RLEN(sa); if (i == RTAX_IFA) { alen = len; break; } p += len; } for (p = p0, i = 0; i < RTAX_MAX; i++) { if ((RTA_MASKS & ifam->ifam_addrs & (1 << i)) == 0) continue; sa = (struct sockaddr *)(void *)p; len = SA_RLEN(sa); switch (i) { case RTAX_IFA: ift->ifa_addr = (struct sockaddr *)(void *)data; memcpy(data, p, len); data += len; break; case RTAX_NETMASK: ift->ifa_netmask = (struct sockaddr *)(void *)data; if (SA_LEN(sa) == 0) { memset(data, 0, alen); data += alen; break; } memcpy(data, p, len); data += len; break; case RTAX_BRD: ift->ifa_broadaddr = (struct sockaddr *)(void *)data; memcpy(data, p, len); data += len; break; } p += len; } if_data = IFA_MSGHDRL_IFAM_DATA(ifam); /* ifam_data needs to be aligned */ ift->ifa_data = data = (void *)ALIGN(data); memcpy(data, if_data, if_data->ifi_datalen); data += if_data->ifi_datalen; ift = (ift->ifa_next = ift + 1); break; } } free(buf); if (--ift >= ifa) { ift->ifa_next = NULL; *pif = ifa; } else { *pif = NULL; free(ifa); } return (0); } void freeifaddrs(struct ifaddrs *ifp) { free(ifp); }
Upload File
Create Folder