1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*- 2*48a54d36SAndroid Build Coastguard Worker * 3*48a54d36SAndroid Build Coastguard Worker * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved. 4*48a54d36SAndroid Build Coastguard Worker * 5*48a54d36SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*48a54d36SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*48a54d36SAndroid Build Coastguard Worker * You may obtain a copy of the License at 8*48a54d36SAndroid Build Coastguard Worker * 9*48a54d36SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*48a54d36SAndroid Build Coastguard Worker * 11*48a54d36SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*48a54d36SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*48a54d36SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*48a54d36SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*48a54d36SAndroid Build Coastguard Worker * limitations under the License. 16*48a54d36SAndroid Build Coastguard Worker */ 17*48a54d36SAndroid Build Coastguard Worker 18*48a54d36SAndroid Build Coastguard Worker #ifndef __mDNSUNP_h 19*48a54d36SAndroid Build Coastguard Worker #define __mDNSUNP_h 20*48a54d36SAndroid Build Coastguard Worker 21*48a54d36SAndroid Build Coastguard Worker #include <sys/types.h> 22*48a54d36SAndroid Build Coastguard Worker #include <sys/socket.h> 23*48a54d36SAndroid Build Coastguard Worker #include <net/if.h> 24*48a54d36SAndroid Build Coastguard Worker #include <netinet/in.h> 25*48a54d36SAndroid Build Coastguard Worker 26*48a54d36SAndroid Build Coastguard Worker #ifdef HAVE_LINUX 27*48a54d36SAndroid Build Coastguard Worker #include <linux/socket.h> 28*48a54d36SAndroid Build Coastguard Worker #define IPV6_2292_PKTINFO IPV6_2292PKTINFO 29*48a54d36SAndroid Build Coastguard Worker #define IPV6_2292_HOPLIMIT IPV6_2292HOPLIMIT 30*48a54d36SAndroid Build Coastguard Worker #else 31*48a54d36SAndroid Build Coastguard Worker // The following are the supported non-linux posix OSes - 32*48a54d36SAndroid Build Coastguard Worker // netbsd, freebsd and openbsd. 33*48a54d36SAndroid Build Coastguard Worker #if HAVE_IPV6 34*48a54d36SAndroid Build Coastguard Worker #define IPV6_2292_PKTINFO 19 35*48a54d36SAndroid Build Coastguard Worker #define IPV6_2292_HOPLIMIT 20 36*48a54d36SAndroid Build Coastguard Worker #endif 37*48a54d36SAndroid Build Coastguard Worker #endif 38*48a54d36SAndroid Build Coastguard Worker 39*48a54d36SAndroid Build Coastguard Worker #ifdef __cplusplus 40*48a54d36SAndroid Build Coastguard Worker extern "C" { 41*48a54d36SAndroid Build Coastguard Worker #endif 42*48a54d36SAndroid Build Coastguard Worker 43*48a54d36SAndroid Build Coastguard Worker #ifdef NOT_HAVE_SOCKLEN_T 44*48a54d36SAndroid Build Coastguard Worker typedef unsigned int socklen_t; 45*48a54d36SAndroid Build Coastguard Worker #endif 46*48a54d36SAndroid Build Coastguard Worker 47*48a54d36SAndroid Build Coastguard Worker #if !defined(_SS_MAXSIZE) && !defined(__ANDROID__) 48*48a54d36SAndroid Build Coastguard Worker #if HAVE_IPV6 49*48a54d36SAndroid Build Coastguard Worker #define sockaddr_storage sockaddr_in6 50*48a54d36SAndroid Build Coastguard Worker #else 51*48a54d36SAndroid Build Coastguard Worker #define sockaddr_storage sockaddr 52*48a54d36SAndroid Build Coastguard Worker #endif // HAVE_IPV6 53*48a54d36SAndroid Build Coastguard Worker #endif // !defined(_SS_MAXSIZE) && !defined(__ANDROID__) 54*48a54d36SAndroid Build Coastguard Worker 55*48a54d36SAndroid Build Coastguard Worker #ifndef NOT_HAVE_SA_LEN 56*48a54d36SAndroid Build Coastguard Worker #define GET_SA_LEN(X) (sizeof(struct sockaddr) > ((struct sockaddr*)&(X))->sa_len ? \ 57*48a54d36SAndroid Build Coastguard Worker sizeof(struct sockaddr) : ((struct sockaddr*)&(X))->sa_len ) 58*48a54d36SAndroid Build Coastguard Worker #elif HAVE_IPV6 59*48a54d36SAndroid Build Coastguard Worker #define GET_SA_LEN(X) (((struct sockaddr*)&(X))->sa_family == AF_INET ? sizeof(struct sockaddr_in) : \ 60*48a54d36SAndroid Build Coastguard Worker ((struct sockaddr*)&(X))->sa_family == AF_INET6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr)) 61*48a54d36SAndroid Build Coastguard Worker #else 62*48a54d36SAndroid Build Coastguard Worker #define GET_SA_LEN(X) (((struct sockaddr*)&(X))->sa_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr)) 63*48a54d36SAndroid Build Coastguard Worker #endif 64*48a54d36SAndroid Build Coastguard Worker 65*48a54d36SAndroid Build Coastguard Worker #define IFI_NAME 16 /* same as IFNAMSIZ in <net/if.h> */ 66*48a54d36SAndroid Build Coastguard Worker #define IFI_HADDR 8 /* allow for 64-bit EUI-64 in future */ 67*48a54d36SAndroid Build Coastguard Worker 68*48a54d36SAndroid Build Coastguard Worker // Renamed from my_in_pktinfo because in_pktinfo is used by Linux. 69*48a54d36SAndroid Build Coastguard Worker 70*48a54d36SAndroid Build Coastguard Worker struct my_in_pktinfo { 71*48a54d36SAndroid Build Coastguard Worker struct sockaddr_storage ipi_addr; 72*48a54d36SAndroid Build Coastguard Worker int ipi_ifindex; /* received interface index */ 73*48a54d36SAndroid Build Coastguard Worker char ipi_ifname[IFI_NAME]; /* received interface name */ 74*48a54d36SAndroid Build Coastguard Worker }; 75*48a54d36SAndroid Build Coastguard Worker 76*48a54d36SAndroid Build Coastguard Worker /* From the text (Stevens, section 20.2): */ 77*48a54d36SAndroid Build Coastguard Worker /* 'As an example of recvmsg we will write a function named recvfrom_flags that */ 78*48a54d36SAndroid Build Coastguard Worker /* is similar to recvfrom but also returns: */ 79*48a54d36SAndroid Build Coastguard Worker /* 1. the returned msg_flags value, */ 80*48a54d36SAndroid Build Coastguard Worker /* 2. the destination addres of the received datagram (from the IP_RECVDSTADDR socket option, and */ 81*48a54d36SAndroid Build Coastguard Worker /* 3. the index of the interface on which the datagram was received (the IP_RECVIF socket option).' */ 82*48a54d36SAndroid Build Coastguard Worker extern ssize_t recvfrom_flags(int fd, void *ptr, size_t nbytes, int *flagsp, 83*48a54d36SAndroid Build Coastguard Worker struct sockaddr *sa, socklen_t *salenptr, struct my_in_pktinfo *pktp, u_char *ttl); 84*48a54d36SAndroid Build Coastguard Worker 85*48a54d36SAndroid Build Coastguard Worker struct ifi_info { 86*48a54d36SAndroid Build Coastguard Worker char ifi_name[IFI_NAME]; /* interface name, null terminated */ 87*48a54d36SAndroid Build Coastguard Worker u_char ifi_haddr[IFI_HADDR]; /* hardware address */ 88*48a54d36SAndroid Build Coastguard Worker u_short ifi_hlen; /* #bytes in hardware address: 0, 6, 8 */ 89*48a54d36SAndroid Build Coastguard Worker short ifi_flags; /* IFF_xxx constants from <net/if.h> */ 90*48a54d36SAndroid Build Coastguard Worker short ifi_myflags; /* our own IFI_xxx flags */ 91*48a54d36SAndroid Build Coastguard Worker int ifi_index; /* interface index */ 92*48a54d36SAndroid Build Coastguard Worker struct sockaddr *ifi_addr; /* primary address */ 93*48a54d36SAndroid Build Coastguard Worker struct sockaddr *ifi_netmask; 94*48a54d36SAndroid Build Coastguard Worker struct sockaddr *ifi_brdaddr;/* broadcast address */ 95*48a54d36SAndroid Build Coastguard Worker struct sockaddr *ifi_dstaddr;/* destination address */ 96*48a54d36SAndroid Build Coastguard Worker struct ifi_info *ifi_next; /* next of these structures */ 97*48a54d36SAndroid Build Coastguard Worker }; 98*48a54d36SAndroid Build Coastguard Worker 99*48a54d36SAndroid Build Coastguard Worker #if defined(AF_INET6) && HAVE_IPV6 && HAVE_LINUX 100*48a54d36SAndroid Build Coastguard Worker #define PROC_IFINET6_PATH "/proc/net/if_inet6" 101*48a54d36SAndroid Build Coastguard Worker extern struct ifi_info *get_ifi_info_linuxv6(int family, int doaliases); 102*48a54d36SAndroid Build Coastguard Worker #endif 103*48a54d36SAndroid Build Coastguard Worker 104*48a54d36SAndroid Build Coastguard Worker #if defined(AF_INET6) && HAVE_IPV6 105*48a54d36SAndroid Build Coastguard Worker #define INET6_ADDRSTRLEN 46 /*Maximum length of IPv6 address */ 106*48a54d36SAndroid Build Coastguard Worker #endif 107*48a54d36SAndroid Build Coastguard Worker 108*48a54d36SAndroid Build Coastguard Worker 109*48a54d36SAndroid Build Coastguard Worker 110*48a54d36SAndroid Build Coastguard Worker #define IFI_ALIAS 1 /* ifi_addr is an alias */ 111*48a54d36SAndroid Build Coastguard Worker 112*48a54d36SAndroid Build Coastguard Worker /* From the text (Stevens, section 16.6): */ 113*48a54d36SAndroid Build Coastguard Worker /* 'Since many programs need to know all the interfaces on a system, we will develop a */ 114*48a54d36SAndroid Build Coastguard Worker /* function of our own named get_ifi_info that returns a linked list of structures, one */ 115*48a54d36SAndroid Build Coastguard Worker /* for each interface that is currently "up."' */ 116*48a54d36SAndroid Build Coastguard Worker extern struct ifi_info *get_ifi_info(int family, int doaliases); 117*48a54d36SAndroid Build Coastguard Worker 118*48a54d36SAndroid Build Coastguard Worker /* 'The free_ifi_info function, which takes a pointer that was */ 119*48a54d36SAndroid Build Coastguard Worker /* returned by get_ifi_info and frees all the dynamic memory.' */ 120*48a54d36SAndroid Build Coastguard Worker extern void free_ifi_info(struct ifi_info *); 121*48a54d36SAndroid Build Coastguard Worker 122*48a54d36SAndroid Build Coastguard Worker #ifdef NOT_HAVE_DAEMON 123*48a54d36SAndroid Build Coastguard Worker extern int daemon(int nochdir, int noclose); 124*48a54d36SAndroid Build Coastguard Worker #endif 125*48a54d36SAndroid Build Coastguard Worker 126*48a54d36SAndroid Build Coastguard Worker #ifdef __cplusplus 127*48a54d36SAndroid Build Coastguard Worker } 128*48a54d36SAndroid Build Coastguard Worker #endif 129*48a54d36SAndroid Build Coastguard Worker 130*48a54d36SAndroid Build Coastguard Worker #endif 131