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