14b22b933Srs200217 /* -*- Mode: C; tab-width: 4 -*- 24b22b933Srs200217 * 34b22b933Srs200217 * Copyright (c) 2003-2004, Apple Computer, Inc. All rights reserved. 44b22b933Srs200217 * 54b22b933Srs200217 * Redistribution and use in source and binary forms, with or without 64b22b933Srs200217 * modification, are permitted provided that the following conditions are met: 74b22b933Srs200217 * 84b22b933Srs200217 * 1. Redistributions of source code must retain the above copyright notice, 94b22b933Srs200217 * this list of conditions and the following disclaimer. 104b22b933Srs200217 * 2. Redistributions in binary form must reproduce the above copyright notice, 114b22b933Srs200217 * this list of conditions and the following disclaimer in the documentation 124b22b933Srs200217 * and/or other materials provided with the distribution. 134b22b933Srs200217 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of its 144b22b933Srs200217 * contributors may be used to endorse or promote products derived from this 154b22b933Srs200217 * software without specific prior written permission. 164b22b933Srs200217 * 174b22b933Srs200217 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 184b22b933Srs200217 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 194b22b933Srs200217 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 204b22b933Srs200217 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 214b22b933Srs200217 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 224b22b933Srs200217 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 234b22b933Srs200217 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 244b22b933Srs200217 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254b22b933Srs200217 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 264b22b933Srs200217 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274b22b933Srs200217 */ 284b22b933Srs200217 294b22b933Srs200217 #ifndef DNSSD_IPC_H 304b22b933Srs200217 #define DNSSD_IPC_H 314b22b933Srs200217 324b22b933Srs200217 #include "dns_sd.h" 334b22b933Srs200217 344b22b933Srs200217 // 354b22b933Srs200217 // Common cross platform services 364b22b933Srs200217 // 374b22b933Srs200217 #if defined(WIN32) 384b22b933Srs200217 # include <winsock2.h> 394b22b933Srs200217 # define dnssd_InvalidSocket INVALID_SOCKET 40*5ffb0c9bSToomas Soome # define dnssd_SocketValid(s) ((s) != INVALID_SOCKET) 414b22b933Srs200217 # define dnssd_EWOULDBLOCK WSAEWOULDBLOCK 424b22b933Srs200217 # define dnssd_EINTR WSAEINTR 43*5ffb0c9bSToomas Soome # define dnssd_ECONNRESET WSAECONNRESET 444b22b933Srs200217 # define dnssd_sock_t SOCKET 454b22b933Srs200217 # define dnssd_socklen_t int 464b22b933Srs200217 # define dnssd_close(sock) closesocket(sock) 47*5ffb0c9bSToomas Soome # define dnssd_errno WSAGetLastError() 48*5ffb0c9bSToomas Soome # define dnssd_strerror(X) win32_strerror(X) 494b22b933Srs200217 # define ssize_t int 504b22b933Srs200217 # define getpid _getpid 51*5ffb0c9bSToomas Soome # define unlink _unlink 52*5ffb0c9bSToomas Soome extern char *win32_strerror(int inErrorCode); 534b22b933Srs200217 #else 544b22b933Srs200217 # include <sys/types.h> 554b22b933Srs200217 # include <unistd.h> 564b22b933Srs200217 # include <sys/un.h> 574b22b933Srs200217 # include <string.h> 584b22b933Srs200217 # include <stdio.h> 594b22b933Srs200217 # include <stdlib.h> 604b22b933Srs200217 # include <sys/stat.h> 614b22b933Srs200217 # include <sys/socket.h> 624b22b933Srs200217 # include <netinet/in.h> 63*5ffb0c9bSToomas Soome # include <arpa/inet.h> 644b22b933Srs200217 # define dnssd_InvalidSocket -1 65*5ffb0c9bSToomas Soome # define dnssd_SocketValid(s) ((s) >= 0) 664b22b933Srs200217 # define dnssd_EWOULDBLOCK EWOULDBLOCK 674b22b933Srs200217 # define dnssd_EINTR EINTR 68*5ffb0c9bSToomas Soome # define dnssd_ECONNRESET ECONNRESET 694b22b933Srs200217 # define dnssd_EPIPE EPIPE 704b22b933Srs200217 # define dnssd_sock_t int 714b22b933Srs200217 # define dnssd_socklen_t unsigned int 724b22b933Srs200217 # define dnssd_close(sock) close(sock) 73*5ffb0c9bSToomas Soome # define dnssd_errno errno 74*5ffb0c9bSToomas Soome # define dnssd_strerror(X) strerror(X) 754b22b933Srs200217 #endif 764b22b933Srs200217 774b22b933Srs200217 #if defined(USE_TCP_LOOPBACK) 784b22b933Srs200217 # define AF_DNSSD AF_INET 794b22b933Srs200217 # define MDNS_TCP_SERVERADDR "127.0.0.1" 804b22b933Srs200217 # define MDNS_TCP_SERVERPORT 5354 814b22b933Srs200217 # define LISTENQ 5 824b22b933Srs200217 # define dnssd_sockaddr_t struct sockaddr_in 834b22b933Srs200217 #else 844b22b933Srs200217 # define AF_DNSSD AF_LOCAL 854b22b933Srs200217 # ifndef MDNS_UDS_SERVERPATH 864b22b933Srs200217 # define MDNS_UDS_SERVERPATH "/var/run/mDNSResponder" 874b22b933Srs200217 # endif 88*5ffb0c9bSToomas Soome # define MDNS_UDS_SERVERPATH_ENVVAR "DNSSD_UDS_PATH" 894b22b933Srs200217 # define LISTENQ 100 904b22b933Srs200217 // longest legal control path length 914b22b933Srs200217 # define MAX_CTLPATH 256 924b22b933Srs200217 # define dnssd_sockaddr_t struct sockaddr_un 934b22b933Srs200217 #endif 944b22b933Srs200217 954b22b933Srs200217 // Compatibility workaround 964b22b933Srs200217 #ifndef AF_LOCAL 974b22b933Srs200217 #define AF_LOCAL AF_UNIX 984b22b933Srs200217 #endif 994b22b933Srs200217 1004b22b933Srs200217 // General UDS constants 1014b22b933Srs200217 #define TXT_RECORD_INDEX ((uint32_t)(-1)) // record index for default text record 1024b22b933Srs200217 1034b22b933Srs200217 // IPC data encoding constants and types 1044b22b933Srs200217 #define VERSION 1 1054b22b933Srs200217 #define IPC_FLAGS_NOREPLY 1 // set flag if no asynchronous replies are to be sent to client 106*5ffb0c9bSToomas Soome 107*5ffb0c9bSToomas Soome // Structure packing macro. If we're not using GNUC, it's not fatal. Most compilers naturally pack the on-the-wire 108*5ffb0c9bSToomas Soome // structures correctly anyway, so a plain "struct" is usually fine. In the event that structures are not packed 109*5ffb0c9bSToomas Soome // correctly, our compile-time assertion checks will catch it and prevent inadvertent generation of non-working code. 110*5ffb0c9bSToomas Soome #ifndef packedstruct 111*5ffb0c9bSToomas Soome #if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9))) 112*5ffb0c9bSToomas Soome #define packedstruct struct __attribute__((__packed__)) 113*5ffb0c9bSToomas Soome #define packedunion union __attribute__((__packed__)) 114*5ffb0c9bSToomas Soome #else 115*5ffb0c9bSToomas Soome #define packedstruct struct 116*5ffb0c9bSToomas Soome #define packedunion union 117*5ffb0c9bSToomas Soome #endif 118*5ffb0c9bSToomas Soome #endif 1194b22b933Srs200217 1204b22b933Srs200217 typedef enum 1214b22b933Srs200217 { 122*5ffb0c9bSToomas Soome request_op_none = 0, // No request yet received on this connection 123*5ffb0c9bSToomas Soome connection_request = 1, // connected socket via DNSServiceConnect() 1244b22b933Srs200217 reg_record_request, // reg/remove record only valid for connected sockets 1254b22b933Srs200217 remove_record_request, 1264b22b933Srs200217 enumeration_request, 1274b22b933Srs200217 reg_service_request, 1284b22b933Srs200217 browse_request, 1294b22b933Srs200217 resolve_request, 1304b22b933Srs200217 query_request, 1314b22b933Srs200217 reconfirm_record_request, 1324b22b933Srs200217 add_record_request, 1334b22b933Srs200217 update_record_request, 134*5ffb0c9bSToomas Soome setdomain_request, // Up to here is in Tiger and B4W 1.0.3 135*5ffb0c9bSToomas Soome getproperty_request, // New in B4W 1.0.4 136*5ffb0c9bSToomas Soome port_mapping_request, // New in Leopard and B4W 2.0 137*5ffb0c9bSToomas Soome addrinfo_request, 138*5ffb0c9bSToomas Soome send_bpf, // New in SL 139*5ffb0c9bSToomas Soome getpid_request, 140*5ffb0c9bSToomas Soome release_request, 141*5ffb0c9bSToomas Soome connection_delegate_request, 142*5ffb0c9bSToomas Soome 143*5ffb0c9bSToomas Soome cancel_request = 63 1444b22b933Srs200217 } request_op_t; 1454b22b933Srs200217 1464b22b933Srs200217 typedef enum 1474b22b933Srs200217 { 1484b22b933Srs200217 enumeration_reply_op = 64, 1494b22b933Srs200217 reg_service_reply_op, 1504b22b933Srs200217 browse_reply_op, 1514b22b933Srs200217 resolve_reply_op, 1524b22b933Srs200217 query_reply_op, 153*5ffb0c9bSToomas Soome reg_record_reply_op, // Up to here is in Tiger and B4W 1.0.3 154*5ffb0c9bSToomas Soome getproperty_reply_op, // New in B4W 1.0.4 155*5ffb0c9bSToomas Soome port_mapping_reply_op, // New in Leopard and B4W 2.0 156*5ffb0c9bSToomas Soome addrinfo_reply_op 1574b22b933Srs200217 } reply_op_t; 1584b22b933Srs200217 159*5ffb0c9bSToomas Soome #if defined(_WIN64) 160*5ffb0c9bSToomas Soome # pragma pack(push,4) 161*5ffb0c9bSToomas Soome #elif !defined(__GNUC__) 162*5ffb0c9bSToomas Soome # pragma pack(1) 163*5ffb0c9bSToomas Soome #endif 1644b22b933Srs200217 165*5ffb0c9bSToomas Soome // Define context object big enough to hold a 64-bit pointer, 166*5ffb0c9bSToomas Soome // to accomodate 64-bit clients communicating with 32-bit daemon. 167*5ffb0c9bSToomas Soome // There's no reason for the daemon to ever be a 64-bit process, but its clients might be 168*5ffb0c9bSToomas Soome typedef packedunion 1694b22b933Srs200217 { 1704b22b933Srs200217 void *context; 171*5ffb0c9bSToomas Soome uint32_t u32[2]; 1724b22b933Srs200217 } client_context_t; 1734b22b933Srs200217 174*5ffb0c9bSToomas Soome typedef packedstruct 1754b22b933Srs200217 { 1764b22b933Srs200217 uint32_t version; 1774b22b933Srs200217 uint32_t datalen; 178*5ffb0c9bSToomas Soome uint32_t ipc_flags; 1794b22b933Srs200217 uint32_t op; // request_op_t or reply_op_t 1804b22b933Srs200217 client_context_t client_context; // context passed from client, returned by server in corresponding reply 1814b22b933Srs200217 uint32_t reg_index; // identifier for a record registered via DNSServiceRegisterRecord() on a 182*5ffb0c9bSToomas Soome // socket connected by DNSServiceCreateConnection(). Must be unique in the scope of the connection, such that and 1834b22b933Srs200217 // index/socket pair uniquely identifies a record. (Used to select records for removal by DNSServiceRemoveRecord()) 184*5ffb0c9bSToomas Soome } ipc_msg_hdr; 1854b22b933Srs200217 186*5ffb0c9bSToomas Soome #if defined(_WIN64) 187*5ffb0c9bSToomas Soome # pragma pack(pop) 188*5ffb0c9bSToomas Soome #elif !defined(__GNUC__) 189*5ffb0c9bSToomas Soome # pragma pack() 190*5ffb0c9bSToomas Soome #endif 191*5ffb0c9bSToomas Soome 1924b22b933Srs200217 // routines to write to and extract data from message buffers. 1934b22b933Srs200217 // caller responsible for bounds checking. 1944b22b933Srs200217 // ptr is the address of the pointer to the start of the field. 1954b22b933Srs200217 // it is advanced to point to the next field, or the end of the message 1964b22b933Srs200217 197*5ffb0c9bSToomas Soome void put_uint32(const uint32_t l, char **ptr); 198*5ffb0c9bSToomas Soome uint32_t get_uint32(const char **ptr, const char *end); 1994b22b933Srs200217 200*5ffb0c9bSToomas Soome void put_uint16(uint16_t s, char **ptr); 201*5ffb0c9bSToomas Soome uint16_t get_uint16(const char **ptr, const char *end); 2024b22b933Srs200217 203*5ffb0c9bSToomas Soome #define put_flags put_uint32 204*5ffb0c9bSToomas Soome #define get_flags get_uint32 2054b22b933Srs200217 206*5ffb0c9bSToomas Soome #define put_error_code put_uint32 207*5ffb0c9bSToomas Soome #define get_error_code get_uint32 2084b22b933Srs200217 2094b22b933Srs200217 int put_string(const char *str, char **ptr); 210*5ffb0c9bSToomas Soome int get_string(const char **ptr, const char *const end, char *buffer, int buflen); 2114b22b933Srs200217 2124b22b933Srs200217 void put_rdata(const int rdlen, const unsigned char *rdata, char **ptr); 213*5ffb0c9bSToomas Soome const char *get_rdata(const char **ptr, const char *end, int rdlen); // return value is rdata pointed to by *ptr - 2144b22b933Srs200217 // rdata is not copied from buffer. 2154b22b933Srs200217 2164b22b933Srs200217 void ConvertHeaderBytes(ipc_msg_hdr *hdr); 2174b22b933Srs200217 218*5ffb0c9bSToomas Soome struct CompileTimeAssertionChecks_dnssd_ipc 219*5ffb0c9bSToomas Soome { 220*5ffb0c9bSToomas Soome // Check that the compiler generated our on-the-wire packet format structure definitions 221*5ffb0c9bSToomas Soome // properly packed, without adding padding bytes to align fields on 32-bit or 64-bit boundaries. 222*5ffb0c9bSToomas Soome char assert0[(sizeof(client_context_t) == 8) ? 1 : -1]; 223*5ffb0c9bSToomas Soome char assert1[(sizeof(ipc_msg_hdr) == 28) ? 1 : -1]; 224*5ffb0c9bSToomas Soome }; 225*5ffb0c9bSToomas Soome 2264b22b933Srs200217 #endif // DNSSD_IPC_H 227