14b22b933Srs /* -*- Mode: C; tab-width: 4 -*- 24b22b933Srs * 3*472cd20dSToomas Soome * Copyright (c) 2003-2020 Apple Inc. All rights reserved. 44b22b933Srs * 55ffb0c9bSToomas Soome * Redistribution and use in source and binary forms, with or without 64b22b933Srs * modification, are permitted provided that the following conditions are met: 74b22b933Srs * 85ffb0c9bSToomas Soome * 1. Redistributions of source code must retain the above copyright notice, 95ffb0c9bSToomas Soome * this list of conditions and the following disclaimer. 105ffb0c9bSToomas Soome * 2. Redistributions in binary form must reproduce the above copyright notice, 115ffb0c9bSToomas Soome * this list of conditions and the following disclaimer in the documentation 125ffb0c9bSToomas Soome * and/or other materials provided with the distribution. 13cda73f64SToomas Soome * 3. Neither the name of Apple Inc. ("Apple") nor the names of its 145ffb0c9bSToomas Soome * contributors may be used to endorse or promote products derived from this 155ffb0c9bSToomas Soome * software without specific prior written permission. 164b22b933Srs * 175ffb0c9bSToomas Soome * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 185ffb0c9bSToomas Soome * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 195ffb0c9bSToomas Soome * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 205ffb0c9bSToomas Soome * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 215ffb0c9bSToomas Soome * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 225ffb0c9bSToomas Soome * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 235ffb0c9bSToomas Soome * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 245ffb0c9bSToomas Soome * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255ffb0c9bSToomas Soome * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 264b22b933Srs * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274b22b933Srs */ 284b22b933Srs 294b22b933Srs #ifndef DNSSD_IPC_H 304b22b933Srs #define DNSSD_IPC_H 314b22b933Srs 324b22b933Srs #include "dns_sd.h" 334b22b933Srs 344b22b933Srs // 354b22b933Srs // Common cross platform services 364b22b933Srs // 374b22b933Srs #if defined(WIN32) 385ffb0c9bSToomas Soome # include <winsock2.h> 395ffb0c9bSToomas Soome # define dnssd_InvalidSocket INVALID_SOCKET 405ffb0c9bSToomas Soome # define dnssd_SocketValid(s) ((s) != INVALID_SOCKET) 415ffb0c9bSToomas Soome # define dnssd_EWOULDBLOCK WSAEWOULDBLOCK 425ffb0c9bSToomas Soome # define dnssd_EINTR WSAEINTR 435ffb0c9bSToomas Soome # define dnssd_ECONNRESET WSAECONNRESET 445ffb0c9bSToomas Soome # define dnssd_socklen_t int 455ffb0c9bSToomas Soome # define dnssd_close(sock) closesocket(sock) 465ffb0c9bSToomas Soome # define dnssd_errno WSAGetLastError() 475ffb0c9bSToomas Soome # define dnssd_strerror(X) win32_strerror(X) 485ffb0c9bSToomas Soome # define ssize_t int 495ffb0c9bSToomas Soome # define getpid _getpid 505ffb0c9bSToomas Soome # define unlink _unlink 515ffb0c9bSToomas Soome extern char *win32_strerror(int inErrorCode); 524b22b933Srs #else 535ffb0c9bSToomas Soome # include <sys/types.h> 545ffb0c9bSToomas Soome # include <unistd.h> 555ffb0c9bSToomas Soome # include <sys/un.h> 565ffb0c9bSToomas Soome # include <string.h> 575ffb0c9bSToomas Soome # include <stdio.h> 585ffb0c9bSToomas Soome # include <stdlib.h> 595ffb0c9bSToomas Soome # include <sys/stat.h> 605ffb0c9bSToomas Soome # include <sys/socket.h> 615ffb0c9bSToomas Soome # include <netinet/in.h> 625ffb0c9bSToomas Soome # include <arpa/inet.h> 635ffb0c9bSToomas Soome # define dnssd_InvalidSocket -1 645ffb0c9bSToomas Soome # define dnssd_SocketValid(s) ((s) >= 0) 655ffb0c9bSToomas Soome # define dnssd_EWOULDBLOCK EWOULDBLOCK 665ffb0c9bSToomas Soome # define dnssd_EINTR EINTR 675ffb0c9bSToomas Soome # define dnssd_ECONNRESET ECONNRESET 685ffb0c9bSToomas Soome # define dnssd_EPIPE EPIPE 695ffb0c9bSToomas Soome # define dnssd_socklen_t unsigned int 705ffb0c9bSToomas Soome # define dnssd_close(sock) close(sock) 715ffb0c9bSToomas Soome # define dnssd_errno errno 725ffb0c9bSToomas Soome # define dnssd_strerror(X) strerror(X) 734b22b933Srs #endif 744b22b933Srs 754b22b933Srs #if defined(USE_TCP_LOOPBACK) 765ffb0c9bSToomas Soome # define AF_DNSSD AF_INET 775ffb0c9bSToomas Soome # define MDNS_TCP_SERVERADDR "127.0.0.1" 785ffb0c9bSToomas Soome # define MDNS_TCP_SERVERPORT 5354 795ffb0c9bSToomas Soome # define LISTENQ 5 805ffb0c9bSToomas Soome # define dnssd_sockaddr_t struct sockaddr_in 814b22b933Srs #else 825ffb0c9bSToomas Soome # define AF_DNSSD AF_LOCAL 835ffb0c9bSToomas Soome # ifndef MDNS_UDS_SERVERPATH 845ffb0c9bSToomas Soome # define MDNS_UDS_SERVERPATH "/var/run/mDNSResponder" 855ffb0c9bSToomas Soome # endif 865ffb0c9bSToomas Soome # define MDNS_UDS_SERVERPATH_ENVVAR "DNSSD_UDS_PATH" 875ffb0c9bSToomas Soome # define LISTENQ 100 885ffb0c9bSToomas Soome // longest legal control path length 89cda73f64SToomas Soome # define MAX_CTLPATH (sizeof(((struct sockaddr_un*)0)->sun_path)) 905ffb0c9bSToomas Soome # define dnssd_sockaddr_t struct sockaddr_un 914b22b933Srs #endif 924b22b933Srs 934b22b933Srs // Compatibility workaround 944b22b933Srs #ifndef AF_LOCAL 955ffb0c9bSToomas Soome #define AF_LOCAL AF_UNIX 964b22b933Srs #endif 974b22b933Srs 984b22b933Srs // General UDS constants 995ffb0c9bSToomas Soome #define TXT_RECORD_INDEX ((uint32_t)(-1)) // record index for default text record 1004b22b933Srs 1014b22b933Srs // IPC data encoding constants and types 1024b22b933Srs #define VERSION 1 103*472cd20dSToomas Soome #define IPC_FLAGS_NOREPLY (1U << 0) // Set flag if no asynchronous replies are to be sent to client. 104*472cd20dSToomas Soome #define IPC_FLAGS_TRAILING_TLVS (1U << 1) // Set flag if TLVs follow the standard request data. 105*472cd20dSToomas Soome 106*472cd20dSToomas Soome #define IPC_TLV_TYPE_RESOLVER_CONFIG_PLIST_DATA 1 // An nw_resolver_config as a binary property list. 107*472cd20dSToomas Soome #define IPC_TLV_TYPE_REQUIRE_PRIVACY 2 // A uint8. Non-zero means privacy is required, zero means not required. 1085ffb0c9bSToomas Soome 1095ffb0c9bSToomas Soome // Structure packing macro. If we're not using GNUC, it's not fatal. Most compilers naturally pack the on-the-wire 1105ffb0c9bSToomas Soome // structures correctly anyway, so a plain "struct" is usually fine. In the event that structures are not packed 1115ffb0c9bSToomas Soome // correctly, our compile-time assertion checks will catch it and prevent inadvertent generation of non-working code. 1125ffb0c9bSToomas Soome #ifndef packedstruct 1135ffb0c9bSToomas Soome #if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9))) 1145ffb0c9bSToomas Soome #define packedstruct struct __attribute__((__packed__)) 1155ffb0c9bSToomas Soome #define packedunion union __attribute__((__packed__)) 1165ffb0c9bSToomas Soome #else 1175ffb0c9bSToomas Soome #define packedstruct struct 1185ffb0c9bSToomas Soome #define packedunion union 1195ffb0c9bSToomas Soome #endif 1205ffb0c9bSToomas Soome #endif 1214b22b933Srs 1224b22b933Srs typedef enum 1235ffb0c9bSToomas Soome { 1245ffb0c9bSToomas Soome request_op_none = 0, // No request yet received on this connection 1255ffb0c9bSToomas Soome connection_request = 1, // connected socket via DNSServiceConnect() 1265ffb0c9bSToomas Soome reg_record_request, // reg/remove record only valid for connected sockets 1274b22b933Srs remove_record_request, 1284b22b933Srs enumeration_request, 1294b22b933Srs reg_service_request, 1304b22b933Srs browse_request, 1314b22b933Srs resolve_request, 1324b22b933Srs query_request, 1334b22b933Srs reconfirm_record_request, 1344b22b933Srs add_record_request, 1354b22b933Srs update_record_request, 1365ffb0c9bSToomas Soome setdomain_request, // Up to here is in Tiger and B4W 1.0.3 1375ffb0c9bSToomas Soome getproperty_request, // New in B4W 1.0.4 1385ffb0c9bSToomas Soome port_mapping_request, // New in Leopard and B4W 2.0 1395ffb0c9bSToomas Soome addrinfo_request, 1405ffb0c9bSToomas Soome send_bpf, // New in SL 1415ffb0c9bSToomas Soome getpid_request, 1425ffb0c9bSToomas Soome release_request, 1435ffb0c9bSToomas Soome connection_delegate_request, 1445ffb0c9bSToomas Soome 1455ffb0c9bSToomas Soome cancel_request = 63 1465ffb0c9bSToomas Soome } request_op_t; 1474b22b933Srs 1484b22b933Srs typedef enum 1495ffb0c9bSToomas Soome { 1504b22b933Srs enumeration_reply_op = 64, 1514b22b933Srs reg_service_reply_op, 1524b22b933Srs browse_reply_op, 1534b22b933Srs resolve_reply_op, 1544b22b933Srs query_reply_op, 1555ffb0c9bSToomas Soome reg_record_reply_op, // Up to here is in Tiger and B4W 1.0.3 1565ffb0c9bSToomas Soome getproperty_reply_op, // New in B4W 1.0.4 1575ffb0c9bSToomas Soome port_mapping_reply_op, // New in Leopard and B4W 2.0 1585ffb0c9bSToomas Soome addrinfo_reply_op 1595ffb0c9bSToomas Soome } reply_op_t; 1605ffb0c9bSToomas Soome 1615ffb0c9bSToomas Soome #if defined(_WIN64) 1625ffb0c9bSToomas Soome # pragma pack(push,4) 1635ffb0c9bSToomas Soome #elif !defined(__GNUC__) 1645ffb0c9bSToomas Soome # pragma pack(1) 1655ffb0c9bSToomas Soome #endif 1664b22b933Srs 1675ffb0c9bSToomas Soome // Define context object big enough to hold a 64-bit pointer, 1685ffb0c9bSToomas Soome // to accomodate 64-bit clients communicating with 32-bit daemon. 1695ffb0c9bSToomas Soome // There's no reason for the daemon to ever be a 64-bit process, but its clients might be 1705ffb0c9bSToomas Soome typedef packedunion 1715ffb0c9bSToomas Soome { 1724b22b933Srs void *context; 1735ffb0c9bSToomas Soome uint32_t u32[2]; 1745ffb0c9bSToomas Soome } client_context_t; 1754b22b933Srs 1765ffb0c9bSToomas Soome typedef packedstruct 1775ffb0c9bSToomas Soome { 1784b22b933Srs uint32_t version; 1794b22b933Srs uint32_t datalen; 1805ffb0c9bSToomas Soome uint32_t ipc_flags; 1815ffb0c9bSToomas Soome uint32_t op; // request_op_t or reply_op_t 1824b22b933Srs client_context_t client_context; // context passed from client, returned by server in corresponding reply 1834b22b933Srs uint32_t reg_index; // identifier for a record registered via DNSServiceRegisterRecord() on a 1845ffb0c9bSToomas Soome // socket connected by DNSServiceCreateConnection(). Must be unique in the scope of the connection, such that and 1854b22b933Srs // index/socket pair uniquely identifies a record. (Used to select records for removal by DNSServiceRemoveRecord()) 1865ffb0c9bSToomas Soome } ipc_msg_hdr; 1875ffb0c9bSToomas Soome 1885ffb0c9bSToomas Soome #if defined(_WIN64) 1895ffb0c9bSToomas Soome # pragma pack(pop) 1905ffb0c9bSToomas Soome #elif !defined(__GNUC__) 1915ffb0c9bSToomas Soome # pragma pack() 1925ffb0c9bSToomas Soome #endif 1934b22b933Srs 1944b22b933Srs // routines to write to and extract data from message buffers. 1954b22b933Srs // caller responsible for bounds checking. 1964b22b933Srs // ptr is the address of the pointer to the start of the field. 1974b22b933Srs // it is advanced to point to the next field, or the end of the message 1984b22b933Srs 1995ffb0c9bSToomas Soome void put_uint32(const uint32_t l, char **ptr); 2005ffb0c9bSToomas Soome uint32_t get_uint32(const char **ptr, const char *end); 2014b22b933Srs 2025ffb0c9bSToomas Soome void put_uint16(uint16_t s, char **ptr); 2035ffb0c9bSToomas Soome uint16_t get_uint16(const char **ptr, const char *end); 2044b22b933Srs 2055ffb0c9bSToomas Soome #define put_flags put_uint32 2065ffb0c9bSToomas Soome #define get_flags get_uint32 2074b22b933Srs 2085ffb0c9bSToomas Soome #define put_error_code put_uint32 2095ffb0c9bSToomas Soome #define get_error_code get_uint32 2104b22b933Srs 2114b22b933Srs int put_string(const char *str, char **ptr); 2125ffb0c9bSToomas Soome int get_string(const char **ptr, const char *const end, char *buffer, int buflen); 2134b22b933Srs 2144b22b933Srs void put_rdata(const int rdlen, const unsigned char *rdata, char **ptr); 2155ffb0c9bSToomas Soome const char *get_rdata(const char **ptr, const char *end, int rdlen); // return value is rdata pointed to by *ptr - 2165ffb0c9bSToomas Soome // rdata is not copied from buffer. 2174b22b933Srs 218*472cd20dSToomas Soome #if APPLE_OSX_mDNSResponder 219*472cd20dSToomas Soome size_t get_required_tlv16_length(const uint16_t valuelen); 220*472cd20dSToomas Soome void put_tlv16(const uint16_t type, const uint16_t length, const uint8_t *value, char **ptr); 221*472cd20dSToomas Soome #endif 222*472cd20dSToomas Soome 2234b22b933Srs void ConvertHeaderBytes(ipc_msg_hdr *hdr); 2244b22b933Srs 2255ffb0c9bSToomas Soome struct CompileTimeAssertionChecks_dnssd_ipc 2265ffb0c9bSToomas Soome { 2275ffb0c9bSToomas Soome // Check that the compiler generated our on-the-wire packet format structure definitions 2285ffb0c9bSToomas Soome // properly packed, without adding padding bytes to align fields on 32-bit or 64-bit boundaries. 2295ffb0c9bSToomas Soome char assert0[(sizeof(client_context_t) == 8) ? 1 : -1]; 2305ffb0c9bSToomas Soome char assert1[(sizeof(ipc_msg_hdr) == 28) ? 1 : -1]; 2315ffb0c9bSToomas Soome }; 2325ffb0c9bSToomas Soome 2334b22b933Srs #endif // DNSSD_IPC_H 234