1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*- 2*48a54d36SAndroid Build Coastguard Worker * 3*48a54d36SAndroid Build Coastguard Worker * Copyright (c) 2003-2004, Apple Computer, Inc. All rights reserved. 4*48a54d36SAndroid Build Coastguard Worker * 5*48a54d36SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*48a54d36SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met: 7*48a54d36SAndroid Build Coastguard Worker * 8*48a54d36SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright notice, 9*48a54d36SAndroid Build Coastguard Worker * this list of conditions and the following disclaimer. 10*48a54d36SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright notice, 11*48a54d36SAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation 12*48a54d36SAndroid Build Coastguard Worker * and/or other materials provided with the distribution. 13*48a54d36SAndroid Build Coastguard Worker * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of its 14*48a54d36SAndroid Build Coastguard Worker * contributors may be used to endorse or promote products derived from this 15*48a54d36SAndroid Build Coastguard Worker * software without specific prior written permission. 16*48a54d36SAndroid Build Coastguard Worker * 17*48a54d36SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18*48a54d36SAndroid Build Coastguard Worker * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19*48a54d36SAndroid Build Coastguard Worker * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20*48a54d36SAndroid Build Coastguard Worker * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21*48a54d36SAndroid Build Coastguard Worker * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22*48a54d36SAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23*48a54d36SAndroid Build Coastguard Worker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24*48a54d36SAndroid Build Coastguard Worker * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25*48a54d36SAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26*48a54d36SAndroid Build Coastguard Worker * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27*48a54d36SAndroid Build Coastguard Worker */ 28*48a54d36SAndroid Build Coastguard Worker 29*48a54d36SAndroid Build Coastguard Worker #ifndef DNSSD_IPC_H 30*48a54d36SAndroid Build Coastguard Worker #define DNSSD_IPC_H 31*48a54d36SAndroid Build Coastguard Worker 32*48a54d36SAndroid Build Coastguard Worker #include "dns_sd.h" 33*48a54d36SAndroid Build Coastguard Worker 34*48a54d36SAndroid Build Coastguard Worker // 35*48a54d36SAndroid Build Coastguard Worker // Common cross platform services 36*48a54d36SAndroid Build Coastguard Worker // 37*48a54d36SAndroid Build Coastguard Worker #if defined(WIN32) 38*48a54d36SAndroid Build Coastguard Worker # include <winsock2.h> 39*48a54d36SAndroid Build Coastguard Worker # define dnssd_InvalidSocket INVALID_SOCKET 40*48a54d36SAndroid Build Coastguard Worker # define dnssd_SocketValid(s) ((s) != INVALID_SOCKET) 41*48a54d36SAndroid Build Coastguard Worker # define dnssd_EWOULDBLOCK WSAEWOULDBLOCK 42*48a54d36SAndroid Build Coastguard Worker # define dnssd_EINTR WSAEINTR 43*48a54d36SAndroid Build Coastguard Worker # define dnssd_ECONNRESET WSAECONNRESET 44*48a54d36SAndroid Build Coastguard Worker # define dnssd_sock_t SOCKET 45*48a54d36SAndroid Build Coastguard Worker # define dnssd_socklen_t int 46*48a54d36SAndroid Build Coastguard Worker # define dnssd_close(sock) closesocket(sock) 47*48a54d36SAndroid Build Coastguard Worker # define dnssd_errno WSAGetLastError() 48*48a54d36SAndroid Build Coastguard Worker # define dnssd_strerror(X) win32_strerror(X) 49*48a54d36SAndroid Build Coastguard Worker # define ssize_t int 50*48a54d36SAndroid Build Coastguard Worker # define getpid _getpid 51*48a54d36SAndroid Build Coastguard Worker # define unlink _unlink 52*48a54d36SAndroid Build Coastguard Worker extern char *win32_strerror(int inErrorCode); 53*48a54d36SAndroid Build Coastguard Worker #else 54*48a54d36SAndroid Build Coastguard Worker # include <sys/types.h> 55*48a54d36SAndroid Build Coastguard Worker # include <unistd.h> 56*48a54d36SAndroid Build Coastguard Worker #ifdef __ANDROID__ 57*48a54d36SAndroid Build Coastguard Worker # include <sys/socket.h> 58*48a54d36SAndroid Build Coastguard Worker #endif // __ANDROID__ 59*48a54d36SAndroid Build Coastguard Worker # include <sys/un.h> 60*48a54d36SAndroid Build Coastguard Worker # include <string.h> 61*48a54d36SAndroid Build Coastguard Worker # include <stdio.h> 62*48a54d36SAndroid Build Coastguard Worker # include <stdlib.h> 63*48a54d36SAndroid Build Coastguard Worker # include <sys/stat.h> 64*48a54d36SAndroid Build Coastguard Worker #ifndef __ANDROID__ 65*48a54d36SAndroid Build Coastguard Worker # include <sys/socket.h> 66*48a54d36SAndroid Build Coastguard Worker #endif // !__ANDROID__ 67*48a54d36SAndroid Build Coastguard Worker # include <netinet/in.h> 68*48a54d36SAndroid Build Coastguard Worker # define dnssd_InvalidSocket -1 69*48a54d36SAndroid Build Coastguard Worker # define dnssd_SocketValid(s) ((s) >= 0) 70*48a54d36SAndroid Build Coastguard Worker # define dnssd_EWOULDBLOCK EWOULDBLOCK 71*48a54d36SAndroid Build Coastguard Worker # define dnssd_EINTR EINTR 72*48a54d36SAndroid Build Coastguard Worker # define dnssd_ECONNRESET ECONNRESET 73*48a54d36SAndroid Build Coastguard Worker # define dnssd_EPIPE EPIPE 74*48a54d36SAndroid Build Coastguard Worker # define dnssd_sock_t int 75*48a54d36SAndroid Build Coastguard Worker # define dnssd_socklen_t unsigned int 76*48a54d36SAndroid Build Coastguard Worker # define dnssd_close(sock) close(sock) 77*48a54d36SAndroid Build Coastguard Worker # define dnssd_errno errno 78*48a54d36SAndroid Build Coastguard Worker # define dnssd_strerror(X) strerror(X) 79*48a54d36SAndroid Build Coastguard Worker #endif 80*48a54d36SAndroid Build Coastguard Worker 81*48a54d36SAndroid Build Coastguard Worker #if defined(USE_TCP_LOOPBACK) 82*48a54d36SAndroid Build Coastguard Worker # define AF_DNSSD AF_INET 83*48a54d36SAndroid Build Coastguard Worker # define MDNS_TCP_SERVERADDR "127.0.0.1" 84*48a54d36SAndroid Build Coastguard Worker # define MDNS_TCP_SERVERPORT 5354 85*48a54d36SAndroid Build Coastguard Worker # define LISTENQ 5 86*48a54d36SAndroid Build Coastguard Worker # define dnssd_sockaddr_t struct sockaddr_in 87*48a54d36SAndroid Build Coastguard Worker #else 88*48a54d36SAndroid Build Coastguard Worker # define AF_DNSSD AF_LOCAL 89*48a54d36SAndroid Build Coastguard Worker # ifndef MDNS_UDS_SERVERPATH 90*48a54d36SAndroid Build Coastguard Worker # define MDNS_UDS_SERVERPATH "/var/run/mDNSResponder" 91*48a54d36SAndroid Build Coastguard Worker # endif 92*48a54d36SAndroid Build Coastguard Worker # define LISTENQ 100 93*48a54d36SAndroid Build Coastguard Worker // longest legal control path length 94*48a54d36SAndroid Build Coastguard Worker # define MAX_CTLPATH 256 95*48a54d36SAndroid Build Coastguard Worker # define dnssd_sockaddr_t struct sockaddr_un 96*48a54d36SAndroid Build Coastguard Worker #endif 97*48a54d36SAndroid Build Coastguard Worker 98*48a54d36SAndroid Build Coastguard Worker // Compatibility workaround 99*48a54d36SAndroid Build Coastguard Worker #ifndef AF_LOCAL 100*48a54d36SAndroid Build Coastguard Worker #define AF_LOCAL AF_UNIX 101*48a54d36SAndroid Build Coastguard Worker #endif 102*48a54d36SAndroid Build Coastguard Worker 103*48a54d36SAndroid Build Coastguard Worker // General UDS constants 104*48a54d36SAndroid Build Coastguard Worker #define TXT_RECORD_INDEX ((uint32_t)(-1)) // record index for default text record 105*48a54d36SAndroid Build Coastguard Worker 106*48a54d36SAndroid Build Coastguard Worker // IPC data encoding constants and types 107*48a54d36SAndroid Build Coastguard Worker #define VERSION 1 108*48a54d36SAndroid Build Coastguard Worker #define IPC_FLAGS_NOREPLY 1 // set flag if no asynchronous replies are to be sent to client 109*48a54d36SAndroid Build Coastguard Worker 110*48a54d36SAndroid Build Coastguard Worker // Structure packing macro. If we're not using GNUC, it's not fatal. Most compilers naturally pack the on-the-wire 111*48a54d36SAndroid Build Coastguard Worker // structures correctly anyway, so a plain "struct" is usually fine. In the event that structures are not packed 112*48a54d36SAndroid Build Coastguard Worker // correctly, our compile-time assertion checks will catch it and prevent inadvertent generation of non-working code. 113*48a54d36SAndroid Build Coastguard Worker #ifndef packedstruct 114*48a54d36SAndroid Build Coastguard Worker #if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9))) 115*48a54d36SAndroid Build Coastguard Worker #define packedstruct struct __attribute__((__packed__)) 116*48a54d36SAndroid Build Coastguard Worker #define packedunion union __attribute__((__packed__)) 117*48a54d36SAndroid Build Coastguard Worker #else 118*48a54d36SAndroid Build Coastguard Worker #define packedstruct struct 119*48a54d36SAndroid Build Coastguard Worker #define packedunion union 120*48a54d36SAndroid Build Coastguard Worker #endif 121*48a54d36SAndroid Build Coastguard Worker #endif 122*48a54d36SAndroid Build Coastguard Worker 123*48a54d36SAndroid Build Coastguard Worker typedef enum 124*48a54d36SAndroid Build Coastguard Worker { 125*48a54d36SAndroid Build Coastguard Worker request_op_none = 0, // No request yet received on this connection 126*48a54d36SAndroid Build Coastguard Worker connection_request = 1, // connected socket via DNSServiceConnect() 127*48a54d36SAndroid Build Coastguard Worker reg_record_request, // reg/remove record only valid for connected sockets 128*48a54d36SAndroid Build Coastguard Worker remove_record_request, 129*48a54d36SAndroid Build Coastguard Worker enumeration_request, 130*48a54d36SAndroid Build Coastguard Worker reg_service_request, 131*48a54d36SAndroid Build Coastguard Worker browse_request, 132*48a54d36SAndroid Build Coastguard Worker resolve_request, 133*48a54d36SAndroid Build Coastguard Worker query_request, 134*48a54d36SAndroid Build Coastguard Worker reconfirm_record_request, 135*48a54d36SAndroid Build Coastguard Worker add_record_request, 136*48a54d36SAndroid Build Coastguard Worker update_record_request, 137*48a54d36SAndroid Build Coastguard Worker setdomain_request, // Up to here is in Tiger and B4W 1.0.3 138*48a54d36SAndroid Build Coastguard Worker getproperty_request, // New in B4W 1.0.4 139*48a54d36SAndroid Build Coastguard Worker port_mapping_request, // New in Leopard and B4W 2.0 140*48a54d36SAndroid Build Coastguard Worker addrinfo_request, 141*48a54d36SAndroid Build Coastguard Worker send_bpf, // New in SL 142*48a54d36SAndroid Build Coastguard Worker sethost_request, 143*48a54d36SAndroid Build Coastguard Worker cancel_request = 63 144*48a54d36SAndroid Build Coastguard Worker } request_op_t; 145*48a54d36SAndroid Build Coastguard Worker 146*48a54d36SAndroid Build Coastguard Worker typedef enum 147*48a54d36SAndroid Build Coastguard Worker { 148*48a54d36SAndroid Build Coastguard Worker enumeration_reply_op = 64, 149*48a54d36SAndroid Build Coastguard Worker reg_service_reply_op, 150*48a54d36SAndroid Build Coastguard Worker browse_reply_op, 151*48a54d36SAndroid Build Coastguard Worker resolve_reply_op, 152*48a54d36SAndroid Build Coastguard Worker query_reply_op, 153*48a54d36SAndroid Build Coastguard Worker reg_record_reply_op, // Up to here is in Tiger and B4W 1.0.3 154*48a54d36SAndroid Build Coastguard Worker getproperty_reply_op, // New in B4W 1.0.4 155*48a54d36SAndroid Build Coastguard Worker port_mapping_reply_op, // New in Leopard and B4W 2.0 156*48a54d36SAndroid Build Coastguard Worker addrinfo_reply_op, 157*48a54d36SAndroid Build Coastguard Worker sethost_reply, 158*48a54d36SAndroid Build Coastguard Worker } reply_op_t; 159*48a54d36SAndroid Build Coastguard Worker 160*48a54d36SAndroid Build Coastguard Worker #if defined(_WIN64) 161*48a54d36SAndroid Build Coastguard Worker # pragma pack(4) 162*48a54d36SAndroid Build Coastguard Worker #endif 163*48a54d36SAndroid Build Coastguard Worker 164*48a54d36SAndroid Build Coastguard Worker // Define context object big enough to hold a 64-bit pointer, 165*48a54d36SAndroid Build Coastguard Worker // to accomodate 64-bit clients communicating with 32-bit daemon. 166*48a54d36SAndroid Build Coastguard Worker // There's no reason for the daemon to ever be a 64-bit process, but its clients might be 167*48a54d36SAndroid Build Coastguard Worker typedef packedunion 168*48a54d36SAndroid Build Coastguard Worker { 169*48a54d36SAndroid Build Coastguard Worker void *context; 170*48a54d36SAndroid Build Coastguard Worker uint32_t u32[2]; 171*48a54d36SAndroid Build Coastguard Worker } client_context_t; 172*48a54d36SAndroid Build Coastguard Worker 173*48a54d36SAndroid Build Coastguard Worker typedef packedstruct 174*48a54d36SAndroid Build Coastguard Worker { 175*48a54d36SAndroid Build Coastguard Worker uint32_t version; 176*48a54d36SAndroid Build Coastguard Worker uint32_t datalen; 177*48a54d36SAndroid Build Coastguard Worker uint32_t ipc_flags; 178*48a54d36SAndroid Build Coastguard Worker uint32_t op; // request_op_t or reply_op_t 179*48a54d36SAndroid Build Coastguard Worker client_context_t client_context; // context passed from client, returned by server in corresponding reply 180*48a54d36SAndroid Build Coastguard Worker uint32_t reg_index; // identifier for a record registered via DNSServiceRegisterRecord() on a 181*48a54d36SAndroid Build Coastguard Worker // socket connected by DNSServiceCreateConnection(). Must be unique in the scope of the connection, such that and 182*48a54d36SAndroid Build Coastguard Worker // index/socket pair uniquely identifies a record. (Used to select records for removal by DNSServiceRemoveRecord()) 183*48a54d36SAndroid Build Coastguard Worker } ipc_msg_hdr; 184*48a54d36SAndroid Build Coastguard Worker 185*48a54d36SAndroid Build Coastguard Worker // routines to write to and extract data from message buffers. 186*48a54d36SAndroid Build Coastguard Worker // caller responsible for bounds checking. 187*48a54d36SAndroid Build Coastguard Worker // ptr is the address of the pointer to the start of the field. 188*48a54d36SAndroid Build Coastguard Worker // it is advanced to point to the next field, or the end of the message 189*48a54d36SAndroid Build Coastguard Worker 190*48a54d36SAndroid Build Coastguard Worker void put_uint32(const uint32_t l, char **ptr); 191*48a54d36SAndroid Build Coastguard Worker uint32_t get_uint32(const char **ptr, const char *end); 192*48a54d36SAndroid Build Coastguard Worker 193*48a54d36SAndroid Build Coastguard Worker void put_uint16(uint16_t s, char **ptr); 194*48a54d36SAndroid Build Coastguard Worker uint16_t get_uint16(const char **ptr, const char *end); 195*48a54d36SAndroid Build Coastguard Worker 196*48a54d36SAndroid Build Coastguard Worker #define put_flags put_uint32 197*48a54d36SAndroid Build Coastguard Worker #define get_flags get_uint32 198*48a54d36SAndroid Build Coastguard Worker 199*48a54d36SAndroid Build Coastguard Worker #define put_error_code put_uint32 200*48a54d36SAndroid Build Coastguard Worker #define get_error_code get_uint32 201*48a54d36SAndroid Build Coastguard Worker 202*48a54d36SAndroid Build Coastguard Worker int put_string(const char *str, char **ptr); 203*48a54d36SAndroid Build Coastguard Worker int get_string(const char **ptr, const char *const end, char *buffer, int buflen); 204*48a54d36SAndroid Build Coastguard Worker 205*48a54d36SAndroid Build Coastguard Worker void put_rdata(const int rdlen, const unsigned char *rdata, char **ptr); 206*48a54d36SAndroid Build Coastguard Worker const char *get_rdata(const char **ptr, const char *end, int rdlen); // return value is rdata pointed to by *ptr - 207*48a54d36SAndroid Build Coastguard Worker // rdata is not copied from buffer. 208*48a54d36SAndroid Build Coastguard Worker 209*48a54d36SAndroid Build Coastguard Worker void ConvertHeaderBytes(ipc_msg_hdr *hdr); 210*48a54d36SAndroid Build Coastguard Worker 211*48a54d36SAndroid Build Coastguard Worker struct CompileTimeAssertionChecks_dnssd_ipc 212*48a54d36SAndroid Build Coastguard Worker { 213*48a54d36SAndroid Build Coastguard Worker // Check that the compiler generated our on-the-wire packet format structure definitions 214*48a54d36SAndroid Build Coastguard Worker // properly packed, without adding padding bytes to align fields on 32-bit or 64-bit boundaries. 215*48a54d36SAndroid Build Coastguard Worker char assert0[(sizeof(client_context_t) == 8) ? 1 : -1]; 216*48a54d36SAndroid Build Coastguard Worker char assert1[(sizeof(ipc_msg_hdr) == 28) ? 1 : -1]; 217*48a54d36SAndroid Build Coastguard Worker }; 218*48a54d36SAndroid Build Coastguard Worker 219*48a54d36SAndroid Build Coastguard Worker #endif // DNSSD_IPC_H 220