4b22b9337f359bfd063322244f5336cc7c6ffcfars/* -*- Mode: C; tab-width: 4 -*-
4b22b9337f359bfd063322244f5336cc7c6ffcfars *
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome * Copyright (c) 2003-2015 Apple Inc. All rights reserved.
4b22b9337f359bfd063322244f5336cc7c6ffcfars *
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * Redistribution and use in source and binary forms, with or without
4b22b9337f359bfd063322244f5336cc7c6ffcfars * modification, are permitted provided that the following conditions are met:
4b22b9337f359bfd063322244f5336cc7c6ffcfars *
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * 1. Redistributions of source code must retain the above copyright notice,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * this list of conditions and the following disclaimer.
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * 2. Redistributions in binary form must reproduce the above copyright notice,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * this list of conditions and the following disclaimer in the documentation
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * and/or other materials provided with the distribution.
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome * 3. Neither the name of Apple Inc. ("Apple") nor the names of its
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * contributors may be used to endorse or promote products derived from this
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * software without specific prior written permission.
4b22b9337f359bfd063322244f5336cc7c6ffcfars *
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
4b22b9337f359bfd063322244f5336cc7c6ffcfars * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4b22b9337f359bfd063322244f5336cc7c6ffcfars */
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars#ifndef DNSSD_IPC_H
4b22b9337f359bfd063322244f5336cc7c6ffcfars#define DNSSD_IPC_H
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars#include "dns_sd.h"
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars//
4b22b9337f359bfd063322244f5336cc7c6ffcfars// Common cross platform services
4b22b9337f359bfd063322244f5336cc7c6ffcfars//
4b22b9337f359bfd063322244f5336cc7c6ffcfars#if defined(WIN32)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# include <winsock2.h>
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_InvalidSocket INVALID_SOCKET
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_SocketValid(s) ((s) != INVALID_SOCKET)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_EWOULDBLOCK WSAEWOULDBLOCK
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_EINTR WSAEINTR
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_ECONNRESET WSAECONNRESET
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_sock_t SOCKET
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_socklen_t int
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_close(sock) closesocket(sock)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_errno WSAGetLastError()
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_strerror(X) win32_strerror(X)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define ssize_t int
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define getpid _getpid
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define unlink _unlink
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomeextern char *win32_strerror(int inErrorCode);
4b22b9337f359bfd063322244f5336cc7c6ffcfars#else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# include <sys/types.h>
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# include <unistd.h>
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# include <sys/un.h>
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# include <string.h>
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# include <stdio.h>
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# include <stdlib.h>
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# include <sys/stat.h>
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# include <sys/socket.h>
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# include <netinet/in.h>
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# include <arpa/inet.h>
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_InvalidSocket -1
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_SocketValid(s) ((s) >= 0)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_EWOULDBLOCK EWOULDBLOCK
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_EINTR EINTR
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_ECONNRESET ECONNRESET
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_EPIPE EPIPE
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_sock_t int
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_socklen_t unsigned int
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_close(sock) close(sock)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_errno errno
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_strerror(X) strerror(X)
4b22b9337f359bfd063322244f5336cc7c6ffcfars#endif
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars#if defined(USE_TCP_LOOPBACK)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define AF_DNSSD AF_INET
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define MDNS_TCP_SERVERADDR "127.0.0.1"
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define MDNS_TCP_SERVERPORT 5354
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define LISTENQ 5
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_sockaddr_t struct sockaddr_in
4b22b9337f359bfd063322244f5336cc7c6ffcfars#else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define AF_DNSSD AF_LOCAL
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# ifndef MDNS_UDS_SERVERPATH
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define MDNS_UDS_SERVERPATH "/var/run/mDNSResponder"
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define MDNS_UDS_SERVERPATH_ENVVAR "DNSSD_UDS_PATH"
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define LISTENQ 100
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// longest legal control path length
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome# define MAX_CTLPATH (sizeof(((struct sockaddr_un*)0)->sun_path))
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# define dnssd_sockaddr_t struct sockaddr_un
4b22b9337f359bfd063322244f5336cc7c6ffcfars#endif
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars// Compatibility workaround
4b22b9337f359bfd063322244f5336cc7c6ffcfars#ifndef AF_LOCAL
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#define AF_LOCAL AF_UNIX
4b22b9337f359bfd063322244f5336cc7c6ffcfars#endif
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars// General UDS constants
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#define TXT_RECORD_INDEX ((uint32_t)(-1)) // record index for default text record
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars// IPC data encoding constants and types
4b22b9337f359bfd063322244f5336cc7c6ffcfars#define VERSION 1
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#define IPC_FLAGS_NOREPLY 1 // set flag if no asynchronous replies are to be sent to client
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// Structure packing macro. If we're not using GNUC, it's not fatal. Most compilers naturally pack the on-the-wire
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// structures correctly anyway, so a plain "struct" is usually fine. In the event that structures are not packed
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// correctly, our compile-time assertion checks will catch it and prevent inadvertent generation of non-working code.
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#ifndef packedstruct
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome #if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 9)))
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome #define packedstruct struct __attribute__((__packed__))
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome #define packedunion union __attribute__((__packed__))
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome #else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome #define packedstruct struct
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome #define packedunion union
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome #endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfarstypedef enum
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome request_op_none = 0, // No request yet received on this connection
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome connection_request = 1, // connected socket via DNSServiceConnect()
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome reg_record_request, // reg/remove record only valid for connected sockets
4b22b9337f359bfd063322244f5336cc7c6ffcfars remove_record_request,
4b22b9337f359bfd063322244f5336cc7c6ffcfars enumeration_request,
4b22b9337f359bfd063322244f5336cc7c6ffcfars reg_service_request,
4b22b9337f359bfd063322244f5336cc7c6ffcfars browse_request,
4b22b9337f359bfd063322244f5336cc7c6ffcfars resolve_request,
4b22b9337f359bfd063322244f5336cc7c6ffcfars query_request,
4b22b9337f359bfd063322244f5336cc7c6ffcfars reconfirm_record_request,
4b22b9337f359bfd063322244f5336cc7c6ffcfars add_record_request,
4b22b9337f359bfd063322244f5336cc7c6ffcfars update_record_request,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome setdomain_request, // Up to here is in Tiger and B4W 1.0.3
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome getproperty_request, // New in B4W 1.0.4
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome port_mapping_request, // New in Leopard and B4W 2.0
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome addrinfo_request,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome send_bpf, // New in SL
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome getpid_request,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome release_request,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome connection_delegate_request,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome cancel_request = 63
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome} request_op_t;
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfarstypedef enum
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
4b22b9337f359bfd063322244f5336cc7c6ffcfars enumeration_reply_op = 64,
4b22b9337f359bfd063322244f5336cc7c6ffcfars reg_service_reply_op,
4b22b9337f359bfd063322244f5336cc7c6ffcfars browse_reply_op,
4b22b9337f359bfd063322244f5336cc7c6ffcfars resolve_reply_op,
4b22b9337f359bfd063322244f5336cc7c6ffcfars query_reply_op,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome reg_record_reply_op, // Up to here is in Tiger and B4W 1.0.3
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome getproperty_reply_op, // New in B4W 1.0.4
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome port_mapping_reply_op, // New in Leopard and B4W 2.0
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome addrinfo_reply_op
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome} reply_op_t;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#if defined(_WIN64)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# pragma pack(push,4)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#elif !defined(__GNUC__)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# pragma pack(1)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// Define context object big enough to hold a 64-bit pointer,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// to accomodate 64-bit clients communicating with 32-bit daemon.
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// There's no reason for the daemon to ever be a 64-bit process, but its clients might be
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soometypedef packedunion
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
4b22b9337f359bfd063322244f5336cc7c6ffcfars void *context;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome uint32_t u32[2];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome} client_context_t;
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soometypedef packedstruct
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
4b22b9337f359bfd063322244f5336cc7c6ffcfars uint32_t version;
4b22b9337f359bfd063322244f5336cc7c6ffcfars uint32_t datalen;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome uint32_t ipc_flags;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome uint32_t op; // request_op_t or reply_op_t
4b22b9337f359bfd063322244f5336cc7c6ffcfars client_context_t client_context; // context passed from client, returned by server in corresponding reply
4b22b9337f359bfd063322244f5336cc7c6ffcfars uint32_t reg_index; // identifier for a record registered via DNSServiceRegisterRecord() on a
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // socket connected by DNSServiceCreateConnection(). Must be unique in the scope of the connection, such that and
4b22b9337f359bfd063322244f5336cc7c6ffcfars // index/socket pair uniquely identifies a record. (Used to select records for removal by DNSServiceRemoveRecord())
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome} ipc_msg_hdr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#if defined(_WIN64)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# pragma pack(pop)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#elif !defined(__GNUC__)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# pragma pack()
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars// routines to write to and extract data from message buffers.
4b22b9337f359bfd063322244f5336cc7c6ffcfars// caller responsible for bounds checking.
4b22b9337f359bfd063322244f5336cc7c6ffcfars// ptr is the address of the pointer to the start of the field.
4b22b9337f359bfd063322244f5336cc7c6ffcfars// it is advanced to point to the next field, or the end of the message
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid put_uint32(const uint32_t l, char **ptr);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomeuint32_t get_uint32(const char **ptr, const char *end);
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid put_uint16(uint16_t s, char **ptr);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomeuint16_t get_uint16(const char **ptr, const char *end);
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#define put_flags put_uint32
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#define get_flags get_uint32
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#define put_error_code put_uint32
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#define get_error_code get_uint32
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfarsint put_string(const char *str, char **ptr);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomeint get_string(const char **ptr, const char *const end, char *buffer, int buflen);
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfarsvoid put_rdata(const int rdlen, const unsigned char *rdata, char **ptr);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomeconst char *get_rdata(const char **ptr, const char *end, int rdlen); // return value is rdata pointed to by *ptr -
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// rdata is not copied from buffer.
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfarsvoid ConvertHeaderBytes(ipc_msg_hdr *hdr);
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomestruct CompileTimeAssertionChecks_dnssd_ipc
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // Check that the compiler generated our on-the-wire packet format structure definitions
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // properly packed, without adding padding bytes to align fields on 32-bit or 64-bit boundaries.
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome char assert0[(sizeof(client_context_t) == 8) ? 1 : -1];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome char assert1[(sizeof(ipc_msg_hdr) == 28) ? 1 : -1];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome};
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
4b22b9337f359bfd063322244f5336cc7c6ffcfars#endif // DNSSD_IPC_H