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