xref: /aosp_15_r20/external/mdnsresponder/mDNSShared/dnssd_ipc.c (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 #include "dnssd_ipc.h"
30*48a54d36SAndroid Build Coastguard Worker 
31*48a54d36SAndroid Build Coastguard Worker #if defined(_WIN32)
32*48a54d36SAndroid Build Coastguard Worker 
win32_strerror(int inErrorCode)33*48a54d36SAndroid Build Coastguard Worker char *win32_strerror(int inErrorCode)
34*48a54d36SAndroid Build Coastguard Worker 	{
35*48a54d36SAndroid Build Coastguard Worker 	static char buffer[1024];
36*48a54d36SAndroid Build Coastguard Worker 	DWORD       n;
37*48a54d36SAndroid Build Coastguard Worker 	memset(buffer, 0, sizeof(buffer));
38*48a54d36SAndroid Build Coastguard Worker 	n = FormatMessageA(
39*48a54d36SAndroid Build Coastguard Worker 			FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
40*48a54d36SAndroid Build Coastguard Worker 			NULL,
41*48a54d36SAndroid Build Coastguard Worker 			(DWORD) inErrorCode,
42*48a54d36SAndroid Build Coastguard Worker 			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
43*48a54d36SAndroid Build Coastguard Worker 			buffer,
44*48a54d36SAndroid Build Coastguard Worker 			sizeof(buffer),
45*48a54d36SAndroid Build Coastguard Worker 			NULL);
46*48a54d36SAndroid Build Coastguard Worker 	if (n > 0)
47*48a54d36SAndroid Build Coastguard Worker 		{
48*48a54d36SAndroid Build Coastguard Worker 		// Remove any trailing CR's or LF's since some messages have them.
49*48a54d36SAndroid Build Coastguard Worker 		while ((n > 0) && isspace(((unsigned char *) buffer)[n - 1]))
50*48a54d36SAndroid Build Coastguard Worker 			buffer[--n] = '\0';
51*48a54d36SAndroid Build Coastguard Worker 		}
52*48a54d36SAndroid Build Coastguard Worker 	return buffer;
53*48a54d36SAndroid Build Coastguard Worker 	}
54*48a54d36SAndroid Build Coastguard Worker 
55*48a54d36SAndroid Build Coastguard Worker #endif
56*48a54d36SAndroid Build Coastguard Worker 
put_uint32(const uint32_t l,char ** ptr)57*48a54d36SAndroid Build Coastguard Worker void put_uint32(const uint32_t l, char **ptr)
58*48a54d36SAndroid Build Coastguard Worker 	{
59*48a54d36SAndroid Build Coastguard Worker 	(*ptr)[0] = (char)((l >> 24) &  0xFF);
60*48a54d36SAndroid Build Coastguard Worker 	(*ptr)[1] = (char)((l >> 16) &  0xFF);
61*48a54d36SAndroid Build Coastguard Worker 	(*ptr)[2] = (char)((l >>  8) &  0xFF);
62*48a54d36SAndroid Build Coastguard Worker 	(*ptr)[3] = (char)((l      ) &  0xFF);
63*48a54d36SAndroid Build Coastguard Worker 	*ptr += sizeof(uint32_t);
64*48a54d36SAndroid Build Coastguard Worker 	}
65*48a54d36SAndroid Build Coastguard Worker 
get_uint32(const char ** ptr,const char * end)66*48a54d36SAndroid Build Coastguard Worker uint32_t get_uint32(const char **ptr, const char *end)
67*48a54d36SAndroid Build Coastguard Worker 	{
68*48a54d36SAndroid Build Coastguard Worker 	if (!*ptr || *ptr + sizeof(uint32_t) > end)
69*48a54d36SAndroid Build Coastguard Worker 		{
70*48a54d36SAndroid Build Coastguard Worker 		*ptr = NULL;
71*48a54d36SAndroid Build Coastguard Worker 		return(0);
72*48a54d36SAndroid Build Coastguard Worker 		}
73*48a54d36SAndroid Build Coastguard Worker 	else
74*48a54d36SAndroid Build Coastguard Worker 		{
75*48a54d36SAndroid Build Coastguard Worker 		uint8_t *p = (uint8_t*) *ptr;
76*48a54d36SAndroid Build Coastguard Worker 		*ptr += sizeof(uint32_t);
77*48a54d36SAndroid Build Coastguard Worker 		return((uint32_t) ((uint32_t)p[0] << 24 | (uint32_t)p[1] << 16 | (uint32_t)p[2] << 8 | p[3]));
78*48a54d36SAndroid Build Coastguard Worker 		}
79*48a54d36SAndroid Build Coastguard Worker 	}
80*48a54d36SAndroid Build Coastguard Worker 
put_uint16(uint16_t s,char ** ptr)81*48a54d36SAndroid Build Coastguard Worker void put_uint16(uint16_t s, char **ptr)
82*48a54d36SAndroid Build Coastguard Worker 	{
83*48a54d36SAndroid Build Coastguard Worker 	(*ptr)[0] = (char)((s >>  8) &  0xFF);
84*48a54d36SAndroid Build Coastguard Worker 	(*ptr)[1] = (char)((s      ) &  0xFF);
85*48a54d36SAndroid Build Coastguard Worker 	*ptr += sizeof(uint16_t);
86*48a54d36SAndroid Build Coastguard Worker 	}
87*48a54d36SAndroid Build Coastguard Worker 
get_uint16(const char ** ptr,const char * end)88*48a54d36SAndroid Build Coastguard Worker uint16_t get_uint16(const char **ptr, const char *end)
89*48a54d36SAndroid Build Coastguard Worker 	{
90*48a54d36SAndroid Build Coastguard Worker 	if (!*ptr || *ptr + sizeof(uint16_t) > end)
91*48a54d36SAndroid Build Coastguard Worker 		{
92*48a54d36SAndroid Build Coastguard Worker 		*ptr = NULL;
93*48a54d36SAndroid Build Coastguard Worker 		return(0);
94*48a54d36SAndroid Build Coastguard Worker 		}
95*48a54d36SAndroid Build Coastguard Worker 	else
96*48a54d36SAndroid Build Coastguard Worker 		{
97*48a54d36SAndroid Build Coastguard Worker 		uint8_t *p = (uint8_t*) *ptr;
98*48a54d36SAndroid Build Coastguard Worker 		*ptr += sizeof(uint16_t);
99*48a54d36SAndroid Build Coastguard Worker 		return((uint16_t) ((uint16_t)p[0] << 8 | p[1]));
100*48a54d36SAndroid Build Coastguard Worker 		}
101*48a54d36SAndroid Build Coastguard Worker 	}
102*48a54d36SAndroid Build Coastguard Worker 
put_string(const char * str,char ** ptr)103*48a54d36SAndroid Build Coastguard Worker int put_string(const char *str, char **ptr)
104*48a54d36SAndroid Build Coastguard Worker 	{
105*48a54d36SAndroid Build Coastguard Worker 	if (!str) str = "";
106*48a54d36SAndroid Build Coastguard Worker 	strcpy(*ptr, str);
107*48a54d36SAndroid Build Coastguard Worker 	*ptr += strlen(str) + 1;
108*48a54d36SAndroid Build Coastguard Worker 	return 0;
109*48a54d36SAndroid Build Coastguard Worker 	}
110*48a54d36SAndroid Build Coastguard Worker 
get_string(const char ** ptr,const char * const end,char * buffer,int buflen)111*48a54d36SAndroid Build Coastguard Worker int get_string(const char **ptr, const char *const end, char *buffer, int buflen)
112*48a54d36SAndroid Build Coastguard Worker 	{
113*48a54d36SAndroid Build Coastguard Worker 	if (!*ptr)
114*48a54d36SAndroid Build Coastguard Worker 		{
115*48a54d36SAndroid Build Coastguard Worker 		*buffer = 0;
116*48a54d36SAndroid Build Coastguard Worker 		return(-1);
117*48a54d36SAndroid Build Coastguard Worker 		}
118*48a54d36SAndroid Build Coastguard Worker 	else
119*48a54d36SAndroid Build Coastguard Worker 		{
120*48a54d36SAndroid Build Coastguard Worker 		char *lim = buffer + buflen;	// Calculate limit
121*48a54d36SAndroid Build Coastguard Worker 		while (*ptr < end && buffer < lim)
122*48a54d36SAndroid Build Coastguard Worker 			{
123*48a54d36SAndroid Build Coastguard Worker 			char c = *buffer++ = *(*ptr)++;
124*48a54d36SAndroid Build Coastguard Worker 			if (c == 0) return(0);		// Success
125*48a54d36SAndroid Build Coastguard Worker 			}
126*48a54d36SAndroid Build Coastguard Worker 		if (buffer == lim) buffer--;
127*48a54d36SAndroid Build Coastguard Worker 		*buffer = 0;					// Failed, so terminate string,
128*48a54d36SAndroid Build Coastguard Worker 		*ptr = NULL;					// clear pointer,
129*48a54d36SAndroid Build Coastguard Worker 		return(-1);						// and return failure indication
130*48a54d36SAndroid Build Coastguard Worker 		}
131*48a54d36SAndroid Build Coastguard Worker 	}
132*48a54d36SAndroid Build Coastguard Worker 
put_rdata(const int rdlen,const unsigned char * rdata,char ** ptr)133*48a54d36SAndroid Build Coastguard Worker void put_rdata(const int rdlen, const unsigned char *rdata, char **ptr)
134*48a54d36SAndroid Build Coastguard Worker 	{
135*48a54d36SAndroid Build Coastguard Worker 	memcpy(*ptr, rdata, rdlen);
136*48a54d36SAndroid Build Coastguard Worker 	*ptr += rdlen;
137*48a54d36SAndroid Build Coastguard Worker 	}
138*48a54d36SAndroid Build Coastguard Worker 
get_rdata(const char ** ptr,const char * end,int rdlen)139*48a54d36SAndroid Build Coastguard Worker const char *get_rdata(const char **ptr, const char *end, int rdlen)
140*48a54d36SAndroid Build Coastguard Worker 	{
141*48a54d36SAndroid Build Coastguard Worker 	if (!*ptr || *ptr + rdlen > end)
142*48a54d36SAndroid Build Coastguard Worker 		{
143*48a54d36SAndroid Build Coastguard Worker 		*ptr = NULL;
144*48a54d36SAndroid Build Coastguard Worker 		return(0);
145*48a54d36SAndroid Build Coastguard Worker 		}
146*48a54d36SAndroid Build Coastguard Worker 	else
147*48a54d36SAndroid Build Coastguard Worker 		{
148*48a54d36SAndroid Build Coastguard Worker 		const char *rd = *ptr;
149*48a54d36SAndroid Build Coastguard Worker 		*ptr += rdlen;
150*48a54d36SAndroid Build Coastguard Worker 		return rd;
151*48a54d36SAndroid Build Coastguard Worker 		}
152*48a54d36SAndroid Build Coastguard Worker 	}
153*48a54d36SAndroid Build Coastguard Worker 
ConvertHeaderBytes(ipc_msg_hdr * hdr)154*48a54d36SAndroid Build Coastguard Worker void ConvertHeaderBytes(ipc_msg_hdr *hdr)
155*48a54d36SAndroid Build Coastguard Worker 	{
156*48a54d36SAndroid Build Coastguard Worker 	hdr->version   = htonl(hdr->version);
157*48a54d36SAndroid Build Coastguard Worker 	hdr->datalen   = htonl(hdr->datalen);
158*48a54d36SAndroid Build Coastguard Worker 	hdr->ipc_flags = htonl(hdr->ipc_flags);
159*48a54d36SAndroid Build Coastguard Worker 	hdr->op        = htonl(hdr->op );
160*48a54d36SAndroid Build Coastguard Worker 	hdr->reg_index = htonl(hdr->reg_index);
161*48a54d36SAndroid Build Coastguard Worker 	}
162