xref: /aosp_15_r20/external/mdnsresponder/mDNSShared/dnssd_ipc.h (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
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