Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 :
4 : routines for marshalling/unmarshalling basic types
5 :
6 : Copyright (C) Andrew Tridgell 2003
7 :
8 : This program is free software; you can redistribute it and/or modify
9 : it under the terms of the GNU General Public License as published by
10 : the Free Software Foundation; either version 3 of the License, or
11 : (at your option) any later version.
12 :
13 : This program is distributed in the hope that it will be useful,
14 : but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 : GNU General Public License for more details.
17 :
18 : You should have received a copy of the GNU General Public License
19 : along with this program. If not, see <http://www.gnu.org/licenses/>.
20 : */
21 :
22 : #include "replace.h"
23 : #include "system/network.h"
24 : #include "librpc/ndr/libndr.h"
25 : #include "lib/util/util_net.h"
26 : #include "lib/util/debug.h"
27 : #include "lib/util/util.h"
28 : #include "lib/util/bytearray.h"
29 :
30 : #define NDR_PULL_U16(ndr, ofs) \
31 : (NDR_BE(ndr) ? PULL_BE_U16(ndr->data,ofs) : PULL_LE_U16(ndr->data,ofs))
32 :
33 : #define NDR_PULL_U32(ndr, ofs) \
34 : (NDR_BE(ndr) ? PULL_BE_U32(ndr->data,ofs) : PULL_LE_U32(ndr->data,ofs))
35 :
36 : #define NDR_PULL_I32(ndr, ofs) \
37 : (int32_t)(NDR_BE(ndr) ? PULL_BE_U32(ndr->data,ofs) : PULL_LE_U32(ndr->data,ofs))
38 :
39 : #define NDR_PULL_I64(ndr, ofs) \
40 : (NDR_BE(ndr) ? PULL_BE_I64((ndr)->data, ofs) : PULL_LE_I64((ndr)->data, ofs))
41 :
42 : #define NDR_PUSH_U16(ndr, ofs, v) \
43 : do { \
44 : if (NDR_BE(ndr)) { \
45 : PUSH_BE_U16(ndr->data, ofs, v); \
46 : } else { \
47 : PUSH_LE_U16(ndr->data, ofs, v); \
48 : } \
49 : } while (0)
50 :
51 : #define NDR_PUSH_U32(ndr, ofs, v) \
52 : do { \
53 : if (NDR_BE(ndr)) { \
54 : PUSH_BE_U32(ndr->data, ofs, v); \
55 : } else { \
56 : PUSH_LE_U32(ndr->data, ofs, v); \
57 : } \
58 : } while (0)
59 :
60 : #define NDR_PUSH_I32(ndr, ofs, v) \
61 : do { \
62 : if (NDR_BE(ndr)) { \
63 : PUSH_BE_U32(ndr->data, ofs, v); \
64 : } else { \
65 : PUSH_LE_U32(ndr->data, ofs, v); \
66 : } \
67 : } while (0)
68 :
69 : #define NDR_PUSH_I64(ndr, ofs, v) \
70 : do { \
71 : if (NDR_BE(ndr)) { \
72 : PUSH_BE_I64((ndr)->data, ofs, v); \
73 : } else { \
74 : PUSH_LE_I64((ndr)->data, ofs, v); \
75 : } \
76 : } while (0)
77 :
78 : static void ndr_dump_data(struct ndr_print *ndr, const uint8_t *buf, int len);
79 :
80 : /*
81 : check for data leaks from the server by looking for non-zero pad bytes
82 : these could also indicate that real structure elements have been
83 : mistaken for padding in the IDL
84 : */
85 0 : _PUBLIC_ void ndr_check_padding(struct ndr_pull *ndr, size_t n)
86 : {
87 0 : size_t ofs2 = (ndr->offset + (n-1)) & ~(n-1);
88 0 : size_t i;
89 0 : for (i=ndr->offset;i<ofs2;i++) {
90 0 : if (ndr->data[i] != 0) {
91 0 : break;
92 : }
93 : }
94 0 : if (i<ofs2) {
95 0 : DEBUG(0,("WARNING: Non-zero padding to %zu: ", n));
96 0 : for (i=ndr->offset;i<ofs2;i++) {
97 0 : DEBUG(0,("%02x ", ndr->data[i]));
98 : }
99 0 : DEBUG(0,("\n"));
100 : }
101 :
102 0 : }
103 :
104 : /*
105 : parse a int8_t
106 : */
107 335723893 : _PUBLIC_ enum ndr_err_code ndr_pull_int8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int8_t *v)
108 : {
109 335723893 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
110 335723893 : NDR_PULL_NEED_BYTES(ndr, 1);
111 335723843 : *v = (int8_t)PULL_BE_U8(ndr->data, ndr->offset);
112 335723843 : ndr->offset += 1;
113 335723843 : return NDR_ERR_SUCCESS;
114 : }
115 :
116 : /*
117 : parse a uint8_t
118 : */
119 788796451 : _PUBLIC_ enum ndr_err_code ndr_pull_uint8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint8_t *v)
120 : {
121 788796451 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
122 788796451 : NDR_PULL_NEED_BYTES(ndr, 1);
123 788796066 : *v = PULL_BE_U8(ndr->data, ndr->offset);
124 788796066 : ndr->offset += 1;
125 788796066 : return NDR_ERR_SUCCESS;
126 : }
127 :
128 : /*
129 : parse a int16_t
130 : */
131 0 : _PUBLIC_ enum ndr_err_code ndr_pull_int16(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int16_t *v)
132 : {
133 0 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
134 0 : NDR_PULL_ALIGN(ndr, 2);
135 0 : NDR_PULL_NEED_BYTES(ndr, 2);
136 0 : *v = (uint16_t)NDR_PULL_U16(ndr, ndr->offset);
137 0 : ndr->offset += 2;
138 0 : return NDR_ERR_SUCCESS;
139 : }
140 :
141 : /*
142 : parse a uint16_t
143 : */
144 1456205905 : _PUBLIC_ enum ndr_err_code ndr_pull_uint16(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
145 : {
146 1456205905 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
147 1456205905 : NDR_PULL_ALIGN(ndr, 2);
148 1456205905 : NDR_PULL_NEED_BYTES(ndr, 2);
149 1456205900 : *v = NDR_PULL_U16(ndr, ndr->offset);
150 1456205900 : ndr->offset += 2;
151 1456205900 : return NDR_ERR_SUCCESS;
152 : }
153 :
154 : /*
155 : parse a uint1632_t
156 : */
157 51884 : _PUBLIC_ enum ndr_err_code ndr_pull_uint1632(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
158 : {
159 51884 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
160 51884 : if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
161 8 : uint32_t v32 = 0;
162 8 : enum ndr_err_code err = ndr_pull_uint32(ndr, ndr_flags, &v32);
163 8 : *v = v32;
164 8 : if (unlikely(v32 != *v)) {
165 0 : DEBUG(0,(__location__ ": non-zero upper 16 bits 0x%08"PRIx32"\n", v32));
166 0 : return NDR_ERR_NDR64;
167 : }
168 0 : return err;
169 : }
170 51876 : return ndr_pull_uint16(ndr, ndr_flags, v);
171 : }
172 :
173 : /*
174 : parse a int32_t
175 : */
176 3037541 : _PUBLIC_ enum ndr_err_code ndr_pull_int32(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int32_t *v)
177 : {
178 3037541 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
179 3037541 : NDR_PULL_ALIGN(ndr, 4);
180 3037541 : NDR_PULL_NEED_BYTES(ndr, 4);
181 3037541 : *v = NDR_PULL_I32(ndr, ndr->offset);
182 3037541 : ndr->offset += 4;
183 3037541 : return NDR_ERR_SUCCESS;
184 : }
185 :
186 : /*
187 : parse a uint32_t
188 : */
189 2854456689 : _PUBLIC_ enum ndr_err_code ndr_pull_uint32(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint32_t *v)
190 : {
191 2854456689 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
192 2854456689 : NDR_PULL_ALIGN(ndr, 4);
193 2854456689 : NDR_PULL_NEED_BYTES(ndr, 4);
194 2854456617 : *v = NDR_PULL_U32(ndr, ndr->offset);
195 2854456617 : ndr->offset += 4;
196 2854456617 : return NDR_ERR_SUCCESS;
197 : }
198 :
199 : /*
200 : parse a arch dependent uint32/uint64
201 : */
202 485349293 : _PUBLIC_ enum ndr_err_code ndr_pull_uint3264(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint32_t *v)
203 : {
204 485349293 : uint64_t v64 = 0;
205 3820191 : enum ndr_err_code err;
206 485349293 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
207 485349293 : if (likely(!(ndr->flags & LIBNDR_FLAG_NDR64))) {
208 485348693 : return ndr_pull_uint32(ndr, ndr_flags, v);
209 : }
210 600 : err = ndr_pull_hyper(ndr, ndr_flags, &v64);
211 600 : if (!NDR_ERR_CODE_IS_SUCCESS(err)) {
212 0 : return err;
213 : }
214 600 : *v = (uint32_t)v64;
215 600 : if (unlikely(v64 != *v)) {
216 0 : DEBUG(0,(__location__ ": non-zero upper 32 bits 0x%016"PRIx64"\n",
217 : v64));
218 0 : return ndr_pull_error(ndr, NDR_ERR_NDR64, __location__ ": non-zero upper 32 bits 0x%016"PRIx64"\n",
219 : v64);
220 : }
221 0 : return err;
222 : }
223 :
224 : /*
225 : parse a double
226 : */
227 0 : _PUBLIC_ enum ndr_err_code ndr_pull_double(struct ndr_pull *ndr, ndr_flags_type ndr_flags, double *v)
228 : {
229 0 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
230 0 : NDR_PULL_ALIGN(ndr, 8);
231 0 : NDR_PULL_NEED_BYTES(ndr, 8);
232 0 : memcpy(v, ndr->data+ndr->offset, 8);
233 0 : ndr->offset += 8;
234 0 : return NDR_ERR_SUCCESS;
235 : }
236 :
237 : /*
238 : parse a pointer referent identifier stored in 2 bytes
239 : */
240 542232 : _PUBLIC_ enum ndr_err_code ndr_pull_relative_ptr_short(struct ndr_pull *ndr, uint16_t *v)
241 : {
242 542232 : NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, v));
243 542232 : if (*v != 0) {
244 542180 : ndr->ptr_count++;
245 : }
246 542232 : *(v) -= ndr->relative_rap_convert;
247 542232 : return NDR_ERR_SUCCESS;
248 : }
249 :
250 : /*
251 : parse a pointer referent identifier
252 : */
253 97445575 : _PUBLIC_ enum ndr_err_code ndr_pull_generic_ptr(struct ndr_pull *ndr, uint32_t *v)
254 : {
255 97445575 : NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, v));
256 97445575 : if (*v != 0) {
257 88707005 : ndr->ptr_count++;
258 : }
259 94823385 : return NDR_ERR_SUCCESS;
260 : }
261 :
262 : /*
263 : parse a ref pointer referent identifier
264 : */
265 33317 : _PUBLIC_ enum ndr_err_code ndr_pull_ref_ptr(struct ndr_pull *ndr, uint32_t *v)
266 : {
267 33317 : NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, v));
268 : /* ref pointers always point to data */
269 33317 : *v = 1;
270 33317 : return NDR_ERR_SUCCESS;
271 : }
272 :
273 : /*
274 : parse a udlong
275 : */
276 373807868 : _PUBLIC_ enum ndr_err_code ndr_pull_udlong(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint64_t *v)
277 : {
278 373807868 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
279 373807868 : NDR_PULL_ALIGN(ndr, 4);
280 373807868 : NDR_PULL_NEED_BYTES(ndr, 8);
281 373807860 : *v = NDR_PULL_U32(ndr, ndr->offset);
282 373807860 : *v |= (uint64_t)(NDR_PULL_U32(ndr, ndr->offset+4)) << 32;
283 373807860 : ndr->offset += 8;
284 373807860 : return NDR_ERR_SUCCESS;
285 : }
286 :
287 : /*
288 : parse a udlongr
289 : */
290 14561 : _PUBLIC_ enum ndr_err_code ndr_pull_udlongr(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint64_t *v)
291 : {
292 14561 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
293 14561 : NDR_PULL_ALIGN(ndr, 4);
294 14561 : NDR_PULL_NEED_BYTES(ndr, 8);
295 14561 : *v = ((uint64_t)NDR_PULL_U32(ndr, ndr->offset)) << 32;
296 14561 : *v |= NDR_PULL_U32(ndr, ndr->offset+4);
297 14561 : ndr->offset += 8;
298 14561 : return NDR_ERR_SUCCESS;
299 : }
300 :
301 : /*
302 : parse a dlong
303 : */
304 730 : _PUBLIC_ enum ndr_err_code ndr_pull_dlong(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int64_t *v)
305 : {
306 730 : return ndr_pull_udlong(ndr, ndr_flags, (uint64_t *)v);
307 : }
308 :
309 : /*
310 : parse a hyper
311 : */
312 361860110 : _PUBLIC_ enum ndr_err_code ndr_pull_hyper(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint64_t *v)
313 : {
314 361860110 : NDR_PULL_ALIGN(ndr, 8);
315 361860110 : if (NDR_BE(ndr)) {
316 9087 : return ndr_pull_udlongr(ndr, ndr_flags, v);
317 : }
318 361851023 : return ndr_pull_udlong(ndr, ndr_flags, v);
319 : }
320 :
321 : /*
322 : parse an int64
323 : */
324 489 : _PUBLIC_ enum ndr_err_code ndr_pull_int64(struct ndr_pull *ndr, ndr_flags_type ndr_flags, int64_t *v)
325 : {
326 489 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
327 489 : NDR_PULL_ALIGN(ndr, 8);
328 489 : NDR_PULL_NEED_BYTES(ndr, 8);
329 489 : *v = NDR_PULL_I64(ndr, ndr->offset);
330 489 : ndr->offset += 8;
331 489 : return NDR_ERR_SUCCESS;
332 : }
333 :
334 : /*
335 : parse a pointer
336 : */
337 640707 : _PUBLIC_ enum ndr_err_code ndr_pull_pointer(struct ndr_pull *ndr, ndr_flags_type ndr_flags, void* *v)
338 : {
339 0 : uintptr_t h;
340 640707 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
341 640707 : NDR_PULL_ALIGN(ndr, sizeof(h));
342 640707 : NDR_PULL_NEED_BYTES(ndr, sizeof(h));
343 640707 : memcpy(&h, ndr->data+ndr->offset, sizeof(h));
344 640707 : ndr->offset += sizeof(h);
345 640707 : *v = (void *)h;
346 640707 : return NDR_ERR_SUCCESS;
347 : }
348 :
349 : /*
350 : pull a NTSTATUS
351 : */
352 494401 : _PUBLIC_ enum ndr_err_code ndr_pull_NTSTATUS(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTSTATUS *status)
353 : {
354 39093 : uint32_t v;
355 494401 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
356 494401 : NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
357 494401 : *status = NT_STATUS(v);
358 494401 : return NDR_ERR_SUCCESS;
359 : }
360 :
361 : /*
362 : push a NTSTATUS
363 : */
364 1205611 : _PUBLIC_ enum ndr_err_code ndr_push_NTSTATUS(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTSTATUS status)
365 : {
366 1205611 : return ndr_push_uint32(ndr, ndr_flags, NT_STATUS_V(status));
367 : }
368 :
369 29374 : _PUBLIC_ void ndr_print_NTSTATUS(struct ndr_print *ndr, const char *name, NTSTATUS r)
370 : {
371 29374 : ndr->print(ndr, "%-25s: %s", name, nt_errstr(r));
372 29374 : }
373 :
374 : /*
375 : pull a WERROR
376 : */
377 801552 : _PUBLIC_ enum ndr_err_code ndr_pull_WERROR(struct ndr_pull *ndr, ndr_flags_type ndr_flags, WERROR *status)
378 : {
379 2027 : uint32_t v;
380 801552 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
381 801552 : NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
382 801552 : *status = W_ERROR(v);
383 801552 : return NDR_ERR_SUCCESS;
384 : }
385 :
386 : /*
387 : pull a HRESULT
388 : */
389 8 : _PUBLIC_ enum ndr_err_code ndr_pull_HRESULT(struct ndr_pull *ndr, ndr_flags_type ndr_flags, HRESULT *status)
390 : {
391 8 : uint32_t v;
392 8 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
393 8 : NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
394 8 : *status = HRES_ERROR(v);
395 8 : return NDR_ERR_SUCCESS;
396 : }
397 :
398 : /*
399 : parse a uint8_t enum
400 : */
401 222972116 : _PUBLIC_ enum ndr_err_code ndr_pull_enum_uint8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint8_t *v)
402 : {
403 222972116 : return ndr_pull_uint8(ndr, ndr_flags, v);
404 : }
405 :
406 : /*
407 : parse a uint16_t enum
408 : */
409 1577112 : _PUBLIC_ enum ndr_err_code ndr_pull_enum_uint16(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
410 : {
411 1577112 : return ndr_pull_uint16(ndr, ndr_flags, v);
412 : }
413 :
414 : /*
415 : parse a uint1632_t enum (uint32_t on NDR64)
416 : */
417 74821948 : _PUBLIC_ enum ndr_err_code ndr_pull_enum_uint1632(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint16_t *v)
418 : {
419 74821948 : if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
420 12 : uint32_t v32;
421 12 : NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &v32));
422 12 : *v = v32;
423 12 : if (v32 != *v) {
424 0 : DEBUG(0,(__location__ ": non-zero upper 16 bits 0x%08"PRIx32"\n", v32));
425 0 : return NDR_ERR_NDR64;
426 : }
427 0 : return NDR_ERR_SUCCESS;
428 : }
429 74821936 : return ndr_pull_uint16(ndr, ndr_flags, v);
430 : }
431 :
432 : /*
433 : parse a uint32_t enum
434 : */
435 109211040 : _PUBLIC_ enum ndr_err_code ndr_pull_enum_uint32(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint32_t *v)
436 : {
437 109211040 : return ndr_pull_uint32(ndr, ndr_flags, v);
438 : }
439 :
440 : /*
441 : push a uint8_t enum
442 : */
443 69388682 : _PUBLIC_ enum ndr_err_code ndr_push_enum_uint8(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint8_t v)
444 : {
445 69388682 : return ndr_push_uint8(ndr, ndr_flags, v);
446 : }
447 :
448 : /*
449 : push a uint16_t enum
450 : */
451 1492180 : _PUBLIC_ enum ndr_err_code ndr_push_enum_uint16(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
452 : {
453 1492180 : return ndr_push_uint16(ndr, ndr_flags, v);
454 : }
455 :
456 : /*
457 : push a uint32_t enum
458 : */
459 99222407 : _PUBLIC_ enum ndr_err_code ndr_push_enum_uint32(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint32_t v)
460 : {
461 99222407 : return ndr_push_uint32(ndr, ndr_flags, v);
462 : }
463 :
464 : /*
465 : push a uint1632_t enum
466 : */
467 62995494 : _PUBLIC_ enum ndr_err_code ndr_push_enum_uint1632(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
468 : {
469 62995494 : if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
470 0 : return ndr_push_uint32(ndr, ndr_flags, v);
471 : }
472 62995494 : return ndr_push_uint16(ndr, ndr_flags, v);
473 : }
474 :
475 : /*
476 : push a WERROR
477 : */
478 2505381 : _PUBLIC_ enum ndr_err_code ndr_push_WERROR(struct ndr_push *ndr, ndr_flags_type ndr_flags, WERROR status)
479 : {
480 2505381 : return ndr_push_uint32(ndr, NDR_SCALARS, W_ERROR_V(status));
481 : }
482 :
483 20544 : _PUBLIC_ void ndr_print_WERROR(struct ndr_print *ndr, const char *name, WERROR r)
484 : {
485 20544 : ndr->print(ndr, "%-25s: %s", name, win_errstr(r));
486 20544 : }
487 :
488 : /*
489 : push a HRESULT
490 : */
491 0 : _PUBLIC_ enum ndr_err_code ndr_push_HRESULT(struct ndr_push *ndr, ndr_flags_type ndr_flags, HRESULT status)
492 : {
493 0 : return ndr_push_uint32(ndr, NDR_SCALARS, HRES_ERROR_V(status));
494 : }
495 :
496 8 : _PUBLIC_ void ndr_print_HRESULT(struct ndr_print *ndr, const char *name, HRESULT r)
497 : {
498 8 : ndr->print(ndr, "%-25s: %s", name, hresult_errstr(r));
499 8 : }
500 :
501 :
502 : /*
503 : parse a set of bytes
504 : */
505 1433952389 : _PUBLIC_ enum ndr_err_code ndr_pull_bytes(struct ndr_pull *ndr, uint8_t *data, uint32_t n)
506 : {
507 1433952389 : NDR_PULL_NEED_BYTES(ndr, n);
508 1433952389 : memcpy(data, ndr->data + ndr->offset, n);
509 1433952389 : ndr->offset += n;
510 1433952389 : return NDR_ERR_SUCCESS;
511 : }
512 :
513 : /*
514 : pull an array of uint8
515 : */
516 1433075808 : _PUBLIC_ enum ndr_err_code ndr_pull_array_uint8(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uint8_t *data, uint32_t n)
517 : {
518 1433075808 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
519 1433075808 : if (!(ndr_flags & NDR_SCALARS)) {
520 0 : return NDR_ERR_SUCCESS;
521 : }
522 1433075808 : return ndr_pull_bytes(ndr, data, n);
523 : }
524 :
525 : /*
526 : push a int8_t
527 : */
528 183948117 : _PUBLIC_ enum ndr_err_code ndr_push_int8(struct ndr_push *ndr, ndr_flags_type ndr_flags, int8_t v)
529 : {
530 183948117 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
531 183948117 : NDR_PUSH_NEED_BYTES(ndr, 1);
532 183948117 : PUSH_BE_U8(ndr->data, ndr->offset, (uint8_t)v);
533 183948117 : ndr->offset += 1;
534 183948117 : return NDR_ERR_SUCCESS;
535 : }
536 :
537 : /*
538 : push a uint8_t
539 : */
540 795165708 : _PUBLIC_ enum ndr_err_code ndr_push_uint8(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint8_t v)
541 : {
542 795165708 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
543 795165708 : NDR_PUSH_NEED_BYTES(ndr, 1);
544 795165708 : PUSH_BE_U8(ndr->data, ndr->offset, v);
545 795165708 : ndr->offset += 1;
546 795165708 : return NDR_ERR_SUCCESS;
547 : }
548 :
549 : /*
550 : push a int16_t
551 : */
552 0 : _PUBLIC_ enum ndr_err_code ndr_push_int16(struct ndr_push *ndr, ndr_flags_type ndr_flags, int16_t v)
553 : {
554 0 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
555 0 : NDR_PUSH_ALIGN(ndr, 2);
556 0 : NDR_PUSH_NEED_BYTES(ndr, 2);
557 0 : NDR_PUSH_U16(ndr, ndr->offset, (uint16_t)v);
558 0 : ndr->offset += 2;
559 0 : return NDR_ERR_SUCCESS;
560 : }
561 :
562 : /*
563 : push a uint16_t
564 : */
565 784824262 : _PUBLIC_ enum ndr_err_code ndr_push_uint16(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
566 : {
567 784824262 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
568 790534902 : NDR_PUSH_ALIGN(ndr, 2);
569 784824262 : NDR_PUSH_NEED_BYTES(ndr, 2);
570 784824262 : NDR_PUSH_U16(ndr, ndr->offset, v);
571 784824262 : ndr->offset += 2;
572 784824262 : return NDR_ERR_SUCCESS;
573 : }
574 :
575 : /*
576 : push a uint1632
577 : */
578 0 : _PUBLIC_ enum ndr_err_code ndr_push_uint1632(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint16_t v)
579 : {
580 0 : if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
581 0 : return ndr_push_uint32(ndr, ndr_flags, v);
582 : }
583 0 : return ndr_push_uint16(ndr, ndr_flags, v);
584 : }
585 :
586 : /*
587 : push a int32_t
588 : */
589 3064442 : _PUBLIC_ enum ndr_err_code ndr_push_int32(struct ndr_push *ndr, ndr_flags_type ndr_flags, int32_t v)
590 : {
591 3064442 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
592 3064721 : NDR_PUSH_ALIGN(ndr, 4);
593 3064442 : NDR_PUSH_NEED_BYTES(ndr, 4);
594 3064442 : NDR_PUSH_I32(ndr, ndr->offset, v);
595 3064442 : ndr->offset += 4;
596 3064442 : return NDR_ERR_SUCCESS;
597 : }
598 :
599 : /*
600 : push a uint32_t
601 : */
602 2290475347 : _PUBLIC_ enum ndr_err_code ndr_push_uint32(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint32_t v)
603 : {
604 2290475347 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
605 2351690523 : NDR_PUSH_ALIGN(ndr, 4);
606 2290475347 : NDR_PUSH_NEED_BYTES(ndr, 4);
607 2290475347 : NDR_PUSH_U32(ndr, ndr->offset, v);
608 2290475347 : ndr->offset += 4;
609 2290475347 : return NDR_ERR_SUCCESS;
610 : }
611 :
612 : /*
613 : push a uint3264
614 : */
615 663682337 : _PUBLIC_ enum ndr_err_code ndr_push_uint3264(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint32_t v)
616 : {
617 663682337 : if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
618 0 : return ndr_push_hyper(ndr, ndr_flags, v);
619 : }
620 663682337 : return ndr_push_uint32(ndr, ndr_flags, v);
621 : }
622 :
623 : /*
624 : push a udlong
625 : */
626 284152893 : _PUBLIC_ enum ndr_err_code ndr_push_udlong(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint64_t v)
627 : {
628 284152893 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
629 284829440 : NDR_PUSH_ALIGN(ndr, 4);
630 284152893 : NDR_PUSH_NEED_BYTES(ndr, 8);
631 284152893 : NDR_PUSH_U32(ndr, ndr->offset, (v & 0xFFFFFFFF));
632 284152893 : NDR_PUSH_U32(ndr, ndr->offset+4, (v>>32));
633 284152893 : ndr->offset += 8;
634 284152893 : return NDR_ERR_SUCCESS;
635 : }
636 :
637 : /*
638 : push a udlongr
639 : */
640 413961 : _PUBLIC_ enum ndr_err_code ndr_push_udlongr(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint64_t v)
641 : {
642 413961 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
643 413961 : NDR_PUSH_ALIGN(ndr, 4);
644 413961 : NDR_PUSH_NEED_BYTES(ndr, 8);
645 413961 : NDR_PUSH_U32(ndr, ndr->offset, (v>>32));
646 413961 : NDR_PUSH_U32(ndr, ndr->offset+4, (v & 0xFFFFFFFF));
647 413961 : ndr->offset += 8;
648 413961 : return NDR_ERR_SUCCESS;
649 : }
650 :
651 : /*
652 : push a dlong
653 : */
654 1020 : _PUBLIC_ enum ndr_err_code ndr_push_dlong(struct ndr_push *ndr, ndr_flags_type ndr_flags, int64_t v)
655 : {
656 1020 : return ndr_push_udlong(ndr, NDR_SCALARS, (uint64_t)v);
657 : }
658 :
659 : /*
660 : push a hyper
661 : */
662 272956712 : _PUBLIC_ enum ndr_err_code ndr_push_hyper(struct ndr_push *ndr, ndr_flags_type ndr_flags, uint64_t v)
663 : {
664 583989445 : NDR_PUSH_ALIGN(ndr, 8);
665 272956712 : if (NDR_BE(ndr)) {
666 403013 : return ndr_push_udlongr(ndr, NDR_SCALARS, v);
667 : }
668 272553699 : return ndr_push_udlong(ndr, NDR_SCALARS, v);
669 : }
670 :
671 : /*
672 : push an int64
673 : */
674 3078 : _PUBLIC_ enum ndr_err_code ndr_push_int64(struct ndr_push *ndr, ndr_flags_type ndr_flags, int64_t v)
675 : {
676 3078 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
677 4058 : NDR_PUSH_ALIGN(ndr, 8);
678 3078 : NDR_PUSH_NEED_BYTES(ndr, 8);
679 3078 : NDR_PUSH_I64(ndr, ndr->offset, v);
680 3078 : ndr->offset += 8;
681 3078 : return NDR_ERR_SUCCESS;
682 : }
683 :
684 : /*
685 : push a double
686 : */
687 0 : _PUBLIC_ enum ndr_err_code ndr_push_double(struct ndr_push *ndr, ndr_flags_type ndr_flags, double v)
688 : {
689 0 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
690 0 : NDR_PUSH_ALIGN(ndr, 8);
691 0 : NDR_PUSH_NEED_BYTES(ndr, 8);
692 0 : memcpy(ndr->data+ndr->offset, &v, 8);
693 0 : ndr->offset += 8;
694 0 : return NDR_ERR_SUCCESS;
695 : }
696 :
697 : /*
698 : push a pointer
699 : */
700 484438 : _PUBLIC_ enum ndr_err_code ndr_push_pointer(struct ndr_push *ndr, ndr_flags_type ndr_flags, void* v)
701 : {
702 484438 : uintptr_t h = (intptr_t)v;
703 484438 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
704 1446830 : NDR_PUSH_ALIGN(ndr, sizeof(h));
705 484438 : NDR_PUSH_NEED_BYTES(ndr, sizeof(h));
706 484438 : memcpy(ndr->data+ndr->offset, &h, sizeof(h));
707 484438 : ndr->offset += sizeof(h);
708 484438 : return NDR_ERR_SUCCESS;
709 : }
710 :
711 1065299530 : _PUBLIC_ enum ndr_err_code ndr_push_align(struct ndr_push *ndr, size_t size)
712 : {
713 : /* this is a nasty hack to make pidl work with NDR64 */
714 1065299530 : if (size == 5) {
715 327659761 : if (ndr->flags & LIBNDR_FLAG_NDR64) {
716 0 : size = 8;
717 : } else {
718 327659761 : size = 4;
719 : }
720 737639769 : } else if (size == 3) {
721 128294 : if (ndr->flags & LIBNDR_FLAG_NDR64) {
722 0 : size = 4;
723 : } else {
724 128294 : size = 2;
725 : }
726 : }
727 1137191923 : NDR_PUSH_ALIGN(ndr, size);
728 1052474043 : return NDR_ERR_SUCCESS;
729 : }
730 :
731 1626012903 : _PUBLIC_ enum ndr_err_code ndr_pull_align(struct ndr_pull *ndr, size_t size)
732 : {
733 : /* this is a nasty hack to make pidl work with NDR64 */
734 1626012903 : if (size == 5) {
735 279789273 : if (ndr->flags & LIBNDR_FLAG_NDR64) {
736 0 : size = 8;
737 : } else {
738 279788961 : size = 4;
739 : }
740 1346223630 : } else if (size == 3) {
741 317174 : if (ndr->flags & LIBNDR_FLAG_NDR64) {
742 0 : size = 4;
743 : } else {
744 317174 : size = 2;
745 : }
746 : }
747 1626012903 : NDR_PULL_ALIGN(ndr, size);
748 1588427466 : return NDR_ERR_SUCCESS;
749 : }
750 :
751 194771042 : _PUBLIC_ enum ndr_err_code ndr_push_union_align(struct ndr_push *ndr, size_t size)
752 : {
753 : /* MS-RPCE section 2.2.5.3.4.4 */
754 194771042 : if (ndr->flags & LIBNDR_FLAG_NDR64) {
755 0 : return ndr_push_align(ndr, size);
756 : }
757 190349722 : return NDR_ERR_SUCCESS;
758 : }
759 :
760 709025017 : _PUBLIC_ enum ndr_err_code ndr_pull_union_align(struct ndr_pull *ndr, size_t size)
761 : {
762 : /* MS-RPCE section 2.2.5.3.4.4 */
763 709025017 : if (ndr->flags & LIBNDR_FLAG_NDR64) {
764 76 : return ndr_pull_align(ndr, size);
765 : }
766 688896163 : return NDR_ERR_SUCCESS;
767 : }
768 :
769 861319528 : _PUBLIC_ enum ndr_err_code ndr_push_trailer_align(struct ndr_push *ndr, size_t size)
770 : {
771 : /* MS-RPCE section 2.2.5.3.4.1 */
772 861319528 : if (ndr->flags & LIBNDR_FLAG_NDR64) {
773 0 : return ndr_push_align(ndr, size);
774 : }
775 851769368 : return NDR_ERR_SUCCESS;
776 : }
777 :
778 1288488389 : _PUBLIC_ enum ndr_err_code ndr_pull_trailer_align(struct ndr_pull *ndr, size_t size)
779 : {
780 : /* MS-RPCE section 2.2.5.3.4.1 */
781 1288488389 : if (ndr->flags & LIBNDR_FLAG_NDR64) {
782 202 : return ndr_pull_align(ndr, size);
783 : }
784 1259023828 : return NDR_ERR_SUCCESS;
785 : }
786 :
787 : /*
788 : push some bytes
789 : */
790 1013816208 : _PUBLIC_ enum ndr_err_code ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n)
791 : {
792 1013816208 : if (unlikely(n == 0)) {
793 107829825 : return NDR_ERR_SUCCESS;
794 : }
795 902874608 : if (unlikely(data == NULL)) {
796 0 : return NDR_ERR_INVALID_POINTER;
797 : }
798 902874608 : NDR_PUSH_NEED_BYTES(ndr, n);
799 902874606 : memcpy(ndr->data + ndr->offset, data, n);
800 902874606 : ndr->offset += n;
801 902874606 : return NDR_ERR_SUCCESS;
802 : }
803 :
804 : /*
805 : push some zero bytes
806 : */
807 18700440 : _PUBLIC_ enum ndr_err_code ndr_push_zero(struct ndr_push *ndr, uint32_t n)
808 : {
809 18700440 : NDR_PUSH_NEED_BYTES(ndr, n);
810 18700440 : memset(ndr->data + ndr->offset, 0, n);
811 18700440 : ndr->offset += n;
812 18700440 : return NDR_ERR_SUCCESS;
813 : }
814 :
815 : /*
816 : push an array of uint8
817 : */
818 792325957 : _PUBLIC_ enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, ndr_flags_type ndr_flags, const uint8_t *data, uint32_t n)
819 : {
820 792325957 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
821 792325957 : if (!(ndr_flags & NDR_SCALARS)) {
822 0 : return NDR_ERR_SUCCESS;
823 : }
824 792325957 : return ndr_push_bytes(ndr, data, n);
825 : }
826 :
827 : /*
828 : push a unique non-zero value if a pointer is non-NULL, otherwise 0
829 : */
830 213378810 : _PUBLIC_ enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void *p)
831 : {
832 213378810 : uint32_t ptr = 0;
833 213378810 : if (p) {
834 207408081 : ptr = ndr->ptr_count * 4;
835 207408081 : ptr |= 0x00020000;
836 207408081 : ndr->ptr_count++;
837 : }
838 213378810 : return ndr_push_uint3264(ndr, NDR_SCALARS, ptr);
839 : }
840 :
841 : /*
842 : push a 'simple' full non-zero value if a pointer is non-NULL, otherwise 0
843 : */
844 67577 : _PUBLIC_ enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p)
845 : {
846 67577 : enum ndr_err_code ret = NDR_ERR_SUCCESS;
847 67577 : uint32_t ptr = 0;
848 67577 : if (p) {
849 : /* Check if the pointer already exists and has an id */
850 67377 : ret = ndr_token_peek(&ndr->full_ptr_list, p, &ptr);
851 67377 : if (ret == NDR_ERR_TOKEN) {
852 67377 : ndr->ptr_count++;
853 67377 : ptr = ndr->ptr_count;
854 67377 : ret = ndr_token_store(ndr, &ndr->full_ptr_list, p, ptr);
855 67377 : if (ret != NDR_ERR_SUCCESS) {
856 0 : return ret;
857 : }
858 0 : } else if (ret != NDR_ERR_SUCCESS) {
859 0 : return ret;
860 : }
861 : }
862 67577 : return ndr_push_uint3264(ndr, NDR_SCALARS, ptr);
863 : }
864 :
865 : /*
866 : push always a 0, if a pointer is NULL it's a fatal error
867 : */
868 20903 : _PUBLIC_ enum ndr_err_code ndr_push_ref_ptr(struct ndr_push *ndr)
869 : {
870 20903 : return ndr_push_uint3264(ndr, NDR_SCALARS, 0xAEF1AEF1);
871 : }
872 :
873 :
874 : /*
875 : push a NTTIME
876 : */
877 9005997 : _PUBLIC_ enum ndr_err_code ndr_push_NTTIME(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTTIME t)
878 : {
879 9005997 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
880 9005997 : NDR_CHECK(ndr_push_udlong(ndr, ndr_flags, t));
881 8900372 : return NDR_ERR_SUCCESS;
882 : }
883 :
884 : /*
885 : pull a NTTIME
886 : */
887 9391951 : _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTTIME *t)
888 : {
889 9391951 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
890 9391951 : NDR_CHECK(ndr_pull_udlong(ndr, ndr_flags, t));
891 9320738 : return NDR_ERR_SUCCESS;
892 : }
893 :
894 : /*
895 : push a NTTIME_1sec
896 : */
897 94151976 : _PUBLIC_ enum ndr_err_code ndr_push_NTTIME_1sec(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTTIME t)
898 : {
899 94151976 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
900 94151976 : t /= 10000000;
901 94151976 : NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
902 92287608 : return NDR_ERR_SUCCESS;
903 : }
904 :
905 : /*
906 : pull a NTTIME_1sec
907 : */
908 104079620 : _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTTIME *t)
909 : {
910 104079620 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
911 104079620 : NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
912 104079620 : (*t) *= 10000000;
913 104079620 : return NDR_ERR_SUCCESS;
914 : }
915 :
916 : /*
917 : pull a NTTIME_hyper
918 : */
919 24084 : _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_hyper(struct ndr_pull *ndr, ndr_flags_type ndr_flags, NTTIME *t)
920 : {
921 24084 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
922 24084 : NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
923 24044 : return NDR_ERR_SUCCESS;
924 : }
925 :
926 : /*
927 : push a NTTIME_hyper
928 : */
929 34473 : _PUBLIC_ enum ndr_err_code ndr_push_NTTIME_hyper(struct ndr_push *ndr, ndr_flags_type ndr_flags, NTTIME t)
930 : {
931 34473 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
932 34473 : NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
933 34441 : return NDR_ERR_SUCCESS;
934 : }
935 :
936 : /*
937 : push a time_t
938 : */
939 77375 : _PUBLIC_ enum ndr_err_code ndr_push_time_t(struct ndr_push *ndr, ndr_flags_type ndr_flags, time_t t)
940 : {
941 77375 : return ndr_push_uint32(ndr, ndr_flags, t);
942 : }
943 :
944 : /*
945 : pull a time_t
946 : */
947 182984 : _PUBLIC_ enum ndr_err_code ndr_pull_time_t(struct ndr_pull *ndr, ndr_flags_type ndr_flags, time_t *t)
948 : {
949 6201 : uint32_t tt;
950 182984 : NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &tt));
951 182984 : *t = tt;
952 182984 : return NDR_ERR_SUCCESS;
953 : }
954 :
955 :
956 : /*
957 : push a uid_t
958 : */
959 2557711 : _PUBLIC_ enum ndr_err_code ndr_push_uid_t(struct ndr_push *ndr, ndr_flags_type ndr_flags, uid_t u)
960 : {
961 2557711 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
962 2557711 : return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)u);
963 : }
964 :
965 : /*
966 : pull a uid_t
967 : */
968 1514103 : _PUBLIC_ enum ndr_err_code ndr_pull_uid_t(struct ndr_pull *ndr, ndr_flags_type ndr_flags, uid_t *u)
969 : {
970 1514103 : uint64_t uu = 0;
971 1514103 : NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &uu));
972 1514103 : *u = (uid_t)uu;
973 1514103 : if (unlikely(uu != *u)) {
974 0 : DEBUG(0,(__location__ ": uid_t pull doesn't fit 0x%016"PRIx64"\n",
975 : uu));
976 0 : return NDR_ERR_NDR64;
977 : }
978 1507988 : return NDR_ERR_SUCCESS;
979 : }
980 :
981 :
982 : /*
983 : push a gid_t
984 : */
985 5663648 : _PUBLIC_ enum ndr_err_code ndr_push_gid_t(struct ndr_push *ndr, ndr_flags_type ndr_flags, gid_t g)
986 : {
987 5663648 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
988 5663648 : return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)g);
989 : }
990 :
991 : /*
992 : pull a gid_t
993 : */
994 3980081 : _PUBLIC_ enum ndr_err_code ndr_pull_gid_t(struct ndr_pull *ndr, ndr_flags_type ndr_flags, gid_t *g)
995 : {
996 3980081 : uint64_t gg = 0;
997 3980081 : NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &gg));
998 3980081 : *g = (gid_t)gg;
999 3980081 : if (unlikely(gg != *g)) {
1000 0 : DEBUG(0,(__location__ ": gid_t pull doesn't fit 0x%016"PRIx64"\n",
1001 : gg));
1002 0 : return NDR_ERR_NDR64;
1003 : }
1004 3927686 : return NDR_ERR_SUCCESS;
1005 : }
1006 :
1007 :
1008 : /*
1009 : pull a ipv4address
1010 : */
1011 84330 : _PUBLIC_ enum ndr_err_code ndr_pull_ipv4address(struct ndr_pull *ndr, ndr_flags_type ndr_flags, const char **address)
1012 : {
1013 353 : uint32_t addr;
1014 353 : struct in_addr in;
1015 84330 : NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &addr));
1016 84330 : in.s_addr = htonl(addr);
1017 84330 : *address = talloc_strdup(ndr->current_mem_ctx, inet_ntoa(in));
1018 84330 : NDR_ERR_HAVE_NO_MEMORY(*address);
1019 83977 : return NDR_ERR_SUCCESS;
1020 : }
1021 :
1022 : /*
1023 : push a ipv4address
1024 : */
1025 159048 : _PUBLIC_ enum ndr_err_code ndr_push_ipv4address(struct ndr_push *ndr, ndr_flags_type ndr_flags, const char *address)
1026 : {
1027 1868 : uint32_t addr;
1028 159048 : if (!is_ipaddress_v4(address)) {
1029 88 : return ndr_push_error(ndr, NDR_ERR_IPV4ADDRESS,
1030 : "Invalid IPv4 address: '%s'",
1031 : address);
1032 : }
1033 158960 : addr = inet_addr(address);
1034 158960 : NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, htonl(addr)));
1035 157092 : return NDR_ERR_SUCCESS;
1036 : }
1037 :
1038 : /*
1039 : print a ipv4address
1040 : */
1041 325 : _PUBLIC_ void ndr_print_ipv4address(struct ndr_print *ndr, const char *name,
1042 : const char *address)
1043 : {
1044 325 : ndr->print(ndr, "%-25s: %s", name, address);
1045 325 : }
1046 :
1047 : /*
1048 : pull a ipv6address
1049 : */
1050 : #define IPV6_BYTES 16
1051 : #define IPV6_ADDR_STR_LEN 39
1052 32318 : _PUBLIC_ enum ndr_err_code ndr_pull_ipv6address(struct ndr_pull *ndr, ndr_flags_type ndr_flags, const char **address)
1053 : {
1054 12 : uint8_t addr[IPV6_BYTES];
1055 32318 : char *addr_str = talloc_strdup(ndr->current_mem_ctx, "");
1056 12 : int i;
1057 32318 : NDR_ERR_HAVE_NO_MEMORY(addr_str);
1058 32318 : NDR_CHECK(ndr_pull_array_uint8(ndr, ndr_flags, addr, IPV6_BYTES));
1059 549406 : for (i = 0; i < IPV6_BYTES; ++i) {
1060 517088 : addr_str = talloc_asprintf_append(addr_str, "%02x", addr[i]);
1061 517088 : NDR_ERR_HAVE_NO_MEMORY(addr_str);
1062 : /* We need a ':' every second byte but the last one */
1063 517088 : if (i%2 == 1 && i != (IPV6_BYTES - 1)) {
1064 226226 : addr_str = talloc_strdup_append(addr_str, ":");
1065 226334 : NDR_ERR_HAVE_NO_MEMORY(addr_str);
1066 : }
1067 : }
1068 32318 : *address = addr_str;
1069 32318 : NDR_ERR_HAVE_NO_MEMORY(*address);
1070 32306 : return NDR_ERR_SUCCESS;
1071 : }
1072 :
1073 : /*
1074 : push a ipv6address
1075 : */
1076 51060 : _PUBLIC_ enum ndr_err_code ndr_push_ipv6address(struct ndr_push *ndr, ndr_flags_type ndr_flags, const char *address)
1077 : {
1078 : #ifdef AF_INET6
1079 232 : uint8_t addr[IPV6_BYTES];
1080 232 : int ret;
1081 :
1082 51060 : if (!is_ipaddress(address)) {
1083 264 : return ndr_push_error(ndr, NDR_ERR_IPV6ADDRESS,
1084 : "Invalid IPv6 address: '%s'",
1085 : address);
1086 : }
1087 50796 : ret = inet_pton(AF_INET6, address, addr);
1088 50796 : if (ret <= 0) {
1089 0 : return NDR_ERR_IPV6ADDRESS;
1090 : }
1091 :
1092 50796 : NDR_CHECK(ndr_push_array_uint8(ndr, ndr_flags, addr, IPV6_BYTES));
1093 :
1094 50564 : return NDR_ERR_SUCCESS;
1095 : #else
1096 : return NDR_ERR_IPV6ADDRESS;
1097 : #endif
1098 : }
1099 :
1100 : /*
1101 : print a ipv6address
1102 : */
1103 69 : _PUBLIC_ void ndr_print_ipv6address(struct ndr_print *ndr, const char *name,
1104 : const char *address)
1105 : {
1106 69 : ndr->print(ndr, "%-25s: %s", name, address);
1107 69 : }
1108 : #undef IPV6_BYTES
1109 :
1110 1261394 : _PUBLIC_ void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type)
1111 : {
1112 1261394 : ndr->print(ndr, "%s: struct %s", name, type);
1113 1261394 : }
1114 :
1115 0 : _PUBLIC_ void ndr_print_null(struct ndr_print *ndr)
1116 : {
1117 0 : ndr->print(ndr, "UNEXPECTED NULL POINTER");
1118 0 : }
1119 :
1120 264072 : _PUBLIC_ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type,
1121 : const char *val, uint32_t value)
1122 : {
1123 264072 : if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
1124 213812 : ndr->print(ndr, "%-25s: %s (0x%"PRIX32")", name, val?val:"UNKNOWN_ENUM_VALUE", value);
1125 : } else {
1126 50309 : ndr->print(ndr, "%-25s: %s (%"PRIu32")", name, val?val:"UNKNOWN_ENUM_VALUE", value);
1127 : }
1128 264072 : }
1129 :
1130 549937 : _PUBLIC_ void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value)
1131 : {
1132 549937 : if (flag == 0) {
1133 88 : return;
1134 : }
1135 :
1136 : /* this is an attempt to support multi-bit bitmap masks */
1137 549849 : value &= flag;
1138 :
1139 5085396 : while (!(flag & 1)) {
1140 4535547 : flag >>= 1;
1141 4535547 : value >>= 1;
1142 : }
1143 549849 : if (flag == 1) {
1144 523870 : ndr->print(ndr, " %"PRIu32": %-25s", value, flag_name);
1145 : } else {
1146 25979 : ndr->print(ndr, "0x%02"PRIx32": %-25s (%"PRIu32")", value, flag_name, value);
1147 : }
1148 : }
1149 :
1150 0 : _PUBLIC_ void ndr_print_int8(struct ndr_print *ndr, const char *name, int8_t v)
1151 : {
1152 0 : if (NDR_HIDE_SECRET(ndr)) {
1153 0 : ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1154 0 : return;
1155 : }
1156 0 : ndr->print(ndr, "%-25s: %"PRId8, name, v);
1157 : }
1158 :
1159 479234 : _PUBLIC_ void ndr_print_uint8(struct ndr_print *ndr, const char *name, uint8_t v)
1160 : {
1161 479234 : if (NDR_HIDE_SECRET(ndr)) {
1162 0 : ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1163 0 : return;
1164 : }
1165 479234 : ndr->print(ndr, "%-25s: 0x%02"PRIx8" (%"PRIu8")", name, v, v);
1166 : }
1167 :
1168 0 : _PUBLIC_ void ndr_print_int16(struct ndr_print *ndr, const char *name, int16_t v)
1169 : {
1170 0 : if (NDR_HIDE_SECRET(ndr)) {
1171 0 : ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1172 0 : return;
1173 : }
1174 0 : ndr->print(ndr, "%-25s: %"PRId16, name, v);
1175 : }
1176 :
1177 141309 : _PUBLIC_ void ndr_print_uint16(struct ndr_print *ndr, const char *name, uint16_t v)
1178 : {
1179 141309 : if (NDR_HIDE_SECRET(ndr)) {
1180 0 : ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1181 0 : return;
1182 : }
1183 141309 : ndr->print(ndr, "%-25s: 0x%04"PRIx16" (%"PRIu16")", name, v, v);
1184 : }
1185 :
1186 10 : _PUBLIC_ void ndr_print_int32(struct ndr_print *ndr, const char *name, int32_t v)
1187 : {
1188 10 : if (NDR_HIDE_SECRET(ndr)) {
1189 0 : ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1190 0 : return;
1191 : }
1192 10 : ndr->print(ndr, "%-25s: %"PRId32, name, v);
1193 : }
1194 :
1195 943633 : _PUBLIC_ void ndr_print_uint32(struct ndr_print *ndr, const char *name, uint32_t v)
1196 : {
1197 943633 : if (NDR_HIDE_SECRET(ndr)) {
1198 0 : ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1199 0 : return;
1200 : }
1201 943633 : ndr->print(ndr, "%-25s: 0x%08"PRIx32" (%"PRIu32")", name, v, v);
1202 : }
1203 :
1204 0 : _PUBLIC_ void ndr_print_int3264(struct ndr_print *ndr, const char *name, int32_t v)
1205 : {
1206 0 : if (NDR_HIDE_SECRET(ndr)) {
1207 0 : ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1208 0 : return;
1209 : }
1210 0 : ndr->print(ndr, "%-25s: %"PRId32, name, v);
1211 : }
1212 :
1213 696 : _PUBLIC_ void ndr_print_uint3264(struct ndr_print *ndr, const char *name, uint32_t v)
1214 : {
1215 696 : if (NDR_HIDE_SECRET(ndr)) {
1216 0 : ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1217 0 : return;
1218 : }
1219 696 : ndr->print(ndr, "%-25s: 0x%08"PRIx32" (%"PRIu32")", name, v, v);
1220 : }
1221 :
1222 24 : _PUBLIC_ void ndr_print_udlong(struct ndr_print *ndr, const char *name, uint64_t v)
1223 : {
1224 24 : ndr->print(ndr, "%-25s: 0x%016"PRIx64" (%"PRIu64")", name, v, v);
1225 24 : }
1226 :
1227 0 : _PUBLIC_ void ndr_print_udlongr(struct ndr_print *ndr, const char *name, uint64_t v)
1228 : {
1229 0 : ndr_print_udlong(ndr, name, v);
1230 0 : }
1231 :
1232 221021 : _PUBLIC_ void ndr_print_dlong(struct ndr_print *ndr, const char *name, int64_t v)
1233 : {
1234 221021 : if (NDR_HIDE_SECRET(ndr)) {
1235 0 : ndr->print(ndr, "%-25s: <REDACTED SECRET VALUE>", name);
1236 0 : return;
1237 : }
1238 221021 : ndr->print(ndr, "%-25s: 0x%016"PRIx64" (%"PRId64")", name, v, v);
1239 : }
1240 :
1241 0 : _PUBLIC_ void ndr_print_double(struct ndr_print *ndr, const char *name, double v)
1242 : {
1243 0 : ndr->print(ndr, "%-25s: %f", name, v);
1244 0 : }
1245 :
1246 221013 : _PUBLIC_ void ndr_print_hyper(struct ndr_print *ndr, const char *name, uint64_t v)
1247 : {
1248 221013 : ndr_print_dlong(ndr, name, v);
1249 221013 : }
1250 :
1251 0 : _PUBLIC_ void ndr_print_int64(struct ndr_print *ndr, const char *name, int64_t v)
1252 : {
1253 0 : ndr_print_dlong(ndr, name, v);
1254 0 : }
1255 :
1256 0 : _PUBLIC_ void ndr_print_pointer(struct ndr_print *ndr, const char *name, void *v)
1257 : {
1258 0 : ndr->print(ndr, "%-25s: %p", name, v);
1259 0 : }
1260 :
1261 650376 : _PUBLIC_ void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p)
1262 : {
1263 650376 : if (p) {
1264 623865 : ndr->print(ndr, "%-25s: *", name);
1265 : } else {
1266 26511 : ndr->print(ndr, "%-25s: NULL", name);
1267 : }
1268 650376 : }
1269 :
1270 245274 : _PUBLIC_ void ndr_print_NTTIME(struct ndr_print *ndr, const char *name, NTTIME t)
1271 : {
1272 245274 : ndr->print(ndr, "%-25s: %s", name, nt_time_string(ndr, t));
1273 245274 : }
1274 :
1275 213396 : _PUBLIC_ void ndr_print_NTTIME_1sec(struct ndr_print *ndr, const char *name, NTTIME t)
1276 : {
1277 : /* this is a standard NTTIME here
1278 : * as it's already converted in the pull/push code
1279 : */
1280 213396 : ndr_print_NTTIME(ndr, name, t);
1281 213396 : }
1282 :
1283 136 : _PUBLIC_ void ndr_print_NTTIME_hyper(struct ndr_print *ndr, const char *name, NTTIME t)
1284 : {
1285 136 : ndr_print_NTTIME(ndr, name, t);
1286 136 : }
1287 :
1288 3438 : _PUBLIC_ void ndr_print_time_t(struct ndr_print *ndr, const char *name, time_t t)
1289 : {
1290 3438 : if (t == (time_t)-1 || t == 0) {
1291 3420 : ndr->print(ndr, "%-25s: (time_t)%d", name, (int)t);
1292 : } else {
1293 18 : ndr->print(ndr, "%-25s: %s", name, timestring(ndr, t));
1294 : }
1295 3438 : }
1296 :
1297 0 : _PUBLIC_ void ndr_print_uid_t(struct ndr_print *ndr, const char *name, uid_t u)
1298 : {
1299 0 : ndr_print_dlong(ndr, name, u);
1300 0 : }
1301 :
1302 0 : _PUBLIC_ void ndr_print_gid_t(struct ndr_print *ndr, const char *name, gid_t g)
1303 : {
1304 0 : ndr_print_dlong(ndr, name, g);
1305 0 : }
1306 :
1307 27640 : _PUBLIC_ void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const char *type)
1308 : {
1309 27640 : if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
1310 89 : ndr->print(ndr, "%-25s: union %s(case 0x%X)", name, type, level);
1311 : } else {
1312 27551 : ndr->print(ndr, "%-25s: union %s(case %d)", name, type, level);
1313 : }
1314 27640 : }
1315 :
1316 0 : _PUBLIC_ void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level)
1317 : {
1318 0 : ndr->print(ndr, "UNKNOWN LEVEL %"PRIu16, level);
1319 0 : }
1320 :
1321 20266 : _PUBLIC_ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name,
1322 : const uint8_t *data, uint32_t count)
1323 : {
1324 2295 : uint32_t i;
1325 : #define _ONELINE_LIMIT 32
1326 :
1327 20266 : if (data == NULL) {
1328 0 : ndr->print(ndr, "%s: ARRAY(%"PRIu32") : NULL", name, count);
1329 0 : return;
1330 : }
1331 :
1332 20266 : if (NDR_HIDE_SECRET(ndr)) {
1333 7771 : ndr->print(ndr, "%s: ARRAY(%"PRIu32"): <REDACTED SECRET VALUES>", name, count);
1334 7771 : return;
1335 : }
1336 :
1337 12495 : if (count <= _ONELINE_LIMIT && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
1338 : char s[(_ONELINE_LIMIT + 1) * 2];
1339 109415 : for (i=0;i<count;i++) {
1340 97692 : snprintf(&s[i*2], 3, "%02"PRIx8, data[i]);
1341 : }
1342 11723 : s[i*2] = 0;
1343 11723 : ndr->print(ndr, "%-25s: %s", name, s);
1344 11723 : return;
1345 : }
1346 :
1347 772 : ndr->print(ndr, "%s: ARRAY(%"PRIu32")", name, count);
1348 772 : if (count > _ONELINE_LIMIT && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
1349 8 : ndr_dump_data(ndr, data, count);
1350 8 : return;
1351 : }
1352 :
1353 764 : ndr->depth++;
1354 466602 : for (i=0;i<count;i++) {
1355 465838 : char *idx=NULL;
1356 465838 : if (asprintf(&idx, "[%"PRIu32"]", i) != -1) {
1357 465838 : ndr_print_uint8(ndr, idx, data[i]);
1358 465838 : free(idx);
1359 : }
1360 : }
1361 764 : ndr->depth--;
1362 : #undef _ONELINE_LIMIT
1363 : }
1364 :
1365 32992446 : static void ndr_print_dump_data_cb(const char *buf, void *private_data)
1366 : {
1367 32992446 : struct ndr_print *ndr = (struct ndr_print *)private_data;
1368 :
1369 32992446 : ndr->print(ndr, "%s", buf);
1370 32992446 : }
1371 :
1372 : /*
1373 : ndr_print version of dump_data()
1374 : */
1375 191244 : static void ndr_dump_data(struct ndr_print *ndr, const uint8_t *buf, int len)
1376 : {
1377 191244 : if (NDR_HIDE_SECRET(ndr)) {
1378 6 : return;
1379 : }
1380 191238 : ndr->no_newline = true;
1381 191238 : dump_data_cb(buf, len, true, ndr_print_dump_data_cb, ndr);
1382 191238 : ndr->no_newline = false;
1383 : }
1384 :
1385 :
1386 197478 : _PUBLIC_ void ndr_print_DATA_BLOB(struct ndr_print *ndr, const char *name, DATA_BLOB r)
1387 : {
1388 197478 : ndr->print(ndr, "%-25s: DATA_BLOB length=%zu", name, r.length);
1389 197478 : if (r.length) {
1390 191236 : ndr_dump_data(ndr, r.data, r.length);
1391 : }
1392 197478 : }
1393 :
1394 :
1395 : /*
1396 : * Push a DATA_BLOB onto the wire.
1397 : * 1) When called with LIBNDR_FLAG_ALIGN* alignment flags set, push padding
1398 : * bytes _only_. The length is determined by the alignment required and the
1399 : * current ndr offset.
1400 : * 2) When called with the LIBNDR_FLAG_REMAINING flag, push the byte array to
1401 : * the ndr buffer.
1402 : * 3) Otherwise, push a uint3264 length _and_ a corresponding byte array to the
1403 : * ndr buffer.
1404 : */
1405 159112684 : _PUBLIC_ enum ndr_err_code ndr_push_DATA_BLOB(struct ndr_push *ndr, ndr_flags_type ndr_flags, DATA_BLOB blob)
1406 : {
1407 159112684 : if (ndr->flags & LIBNDR_FLAG_REMAINING) {
1408 : /* nothing to do */
1409 96611080 : } else if (ndr->flags & (LIBNDR_ALIGN_FLAGS & ~LIBNDR_FLAG_NOALIGN)) {
1410 336699 : if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
1411 64 : blob.length = NDR_ALIGN(ndr, 2);
1412 336635 : } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
1413 272437 : blob.length = NDR_ALIGN(ndr, 4);
1414 64198 : } else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
1415 64198 : blob.length = NDR_ALIGN(ndr, 8);
1416 : }
1417 336699 : NDR_PUSH_ALLOC_SIZE(ndr, blob.data, blob.length);
1418 336699 : data_blob_clear(&blob);
1419 : } else {
1420 96274381 : NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, blob.length));
1421 : }
1422 159112684 : NDR_CHECK(ndr_push_bytes(ndr, blob.data, blob.length));
1423 157463410 : return NDR_ERR_SUCCESS;
1424 : }
1425 :
1426 : /*
1427 : * Pull a DATA_BLOB from the wire.
1428 : * 1) when called with LIBNDR_FLAG_ALIGN* alignment flags set, pull padding
1429 : * bytes _only_. The length is determined by the alignment required and the
1430 : * current ndr offset.
1431 : * 2) When called with the LIBNDR_FLAG_REMAINING flag, pull all remaining bytes
1432 : * from the ndr buffer.
1433 : * 3) Otherwise, pull a uint3264 length _and_ a corresponding byte array from the
1434 : * ndr buffer.
1435 : */
1436 324436886 : _PUBLIC_ enum ndr_err_code ndr_pull_DATA_BLOB(struct ndr_pull *ndr, ndr_flags_type ndr_flags, DATA_BLOB *blob)
1437 : {
1438 324436886 : uint32_t length = 0;
1439 :
1440 324436886 : if (ndr->flags & LIBNDR_FLAG_REMAINING) {
1441 211851913 : length = ndr->data_size - ndr->offset;
1442 112584973 : } else if (ndr->flags & (LIBNDR_ALIGN_FLAGS & ~LIBNDR_FLAG_NOALIGN)) {
1443 283840 : if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
1444 66 : length = NDR_ALIGN(ndr, 2);
1445 283774 : } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
1446 224692 : length = NDR_ALIGN(ndr, 4);
1447 59082 : } else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
1448 59082 : length = NDR_ALIGN(ndr, 8);
1449 : }
1450 283840 : if (ndr->data_size - ndr->offset < length) {
1451 0 : length = ndr->data_size - ndr->offset;
1452 : }
1453 : } else {
1454 112301133 : NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, &length));
1455 : }
1456 324436886 : NDR_PULL_NEED_BYTES(ndr, length);
1457 324436884 : *blob = data_blob_talloc(ndr->current_mem_ctx, ndr->data+ndr->offset, length);
1458 324436884 : ndr->offset += length;
1459 324436884 : return NDR_ERR_SUCCESS;
1460 : }
1461 :
1462 91386903 : _PUBLIC_ uint32_t ndr_size_DATA_BLOB(int ret, const DATA_BLOB *data, ndr_flags_type flags)
1463 : {
1464 91386903 : if (!data) return ret;
1465 91386902 : return ret + data->length;
1466 : }
1467 :
1468 0 : _PUBLIC_ void ndr_print_bool(struct ndr_print *ndr, const char *name, const bool b)
1469 : {
1470 0 : ndr->print(ndr, "%-25s: %s", name, b?"true":"false");
1471 0 : }
1472 :
1473 345130011 : _PUBLIC_ NTSTATUS ndr_map_error2ntstatus(enum ndr_err_code ndr_err)
1474 : {
1475 345130011 : switch (ndr_err) {
1476 345129903 : case NDR_ERR_SUCCESS:
1477 345129917 : return NT_STATUS_OK;
1478 14 : case NDR_ERR_BUFSIZE:
1479 14 : return NT_STATUS_BUFFER_TOO_SMALL;
1480 0 : case NDR_ERR_TOKEN:
1481 0 : return NT_STATUS_INTERNAL_ERROR;
1482 0 : case NDR_ERR_ALLOC:
1483 0 : return NT_STATUS_NO_MEMORY;
1484 0 : case NDR_ERR_ARRAY_SIZE:
1485 0 : return NT_STATUS_ARRAY_BOUNDS_EXCEEDED;
1486 2 : case NDR_ERR_INVALID_POINTER:
1487 2 : return NT_STATUS_INVALID_PARAMETER_MIX;
1488 0 : case NDR_ERR_UNREAD_BYTES:
1489 0 : return NT_STATUS_PORT_MESSAGE_TOO_LONG;
1490 92 : default:
1491 92 : break;
1492 : }
1493 :
1494 : /* we should map all error codes to different status codes */
1495 92 : return NT_STATUS_INVALID_PARAMETER;
1496 : }
1497 :
1498 0 : _PUBLIC_ int ndr_map_error2errno(enum ndr_err_code ndr_err)
1499 : {
1500 0 : switch (ndr_err) {
1501 0 : case NDR_ERR_SUCCESS:
1502 0 : return 0;
1503 0 : case NDR_ERR_BUFSIZE:
1504 0 : return ENOSPC;
1505 0 : case NDR_ERR_TOKEN:
1506 0 : return EINVAL;
1507 0 : case NDR_ERR_ALLOC:
1508 0 : return ENOMEM;
1509 0 : case NDR_ERR_ARRAY_SIZE:
1510 0 : return EMSGSIZE;
1511 0 : case NDR_ERR_INVALID_POINTER:
1512 0 : return EINVAL;
1513 0 : case NDR_ERR_UNREAD_BYTES:
1514 0 : return EOVERFLOW;
1515 0 : default:
1516 0 : break;
1517 : }
1518 :
1519 : /* we should map all error codes to different status codes */
1520 0 : return EINVAL;
1521 : }
1522 :
1523 6720 : _PUBLIC_ enum ndr_err_code ndr_push_timespec(struct ndr_push *ndr,
1524 : ndr_flags_type ndr_flags,
1525 : const struct timespec *t)
1526 : {
1527 6720 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
1528 6720 : NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec));
1529 6720 : NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_nsec));
1530 6720 : return NDR_ERR_SUCCESS;
1531 : }
1532 :
1533 2608 : _PUBLIC_ enum ndr_err_code ndr_pull_timespec(struct ndr_pull *ndr,
1534 : ndr_flags_type ndr_flags,
1535 : struct timespec *t)
1536 : {
1537 2608 : uint64_t secs = 0;
1538 2608 : uint32_t nsecs = 0;
1539 2608 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
1540 2608 : NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs));
1541 2608 : NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &nsecs));
1542 2608 : t->tv_sec = secs;
1543 2608 : t->tv_nsec = nsecs;
1544 2608 : return NDR_ERR_SUCCESS;
1545 : }
1546 :
1547 0 : _PUBLIC_ void ndr_print_timespec(struct ndr_print *ndr, const char *name,
1548 : const struct timespec *t)
1549 : {
1550 0 : char *str = timestring(ndr, t->tv_sec);
1551 0 : ndr->print(ndr, "%-25s: %s.%ld", name, str, t->tv_nsec);
1552 0 : TALLOC_FREE(str);
1553 0 : }
1554 :
1555 890964 : _PUBLIC_ enum ndr_err_code ndr_push_timeval(struct ndr_push *ndr,
1556 : ndr_flags_type ndr_flags,
1557 : const struct timeval *t)
1558 : {
1559 890964 : NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
1560 890964 : NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec));
1561 890964 : NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_usec));
1562 888796 : return NDR_ERR_SUCCESS;
1563 : }
1564 :
1565 1916868 : _PUBLIC_ enum ndr_err_code ndr_pull_timeval(struct ndr_pull *ndr,
1566 : ndr_flags_type ndr_flags,
1567 : struct timeval *t)
1568 : {
1569 1916868 : uint64_t secs = 0;
1570 1916868 : uint32_t usecs = 0;
1571 1916868 : NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
1572 1916868 : NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs));
1573 1916868 : NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &usecs));
1574 1916868 : t->tv_sec = secs;
1575 1916868 : t->tv_usec = usecs;
1576 1916868 : return NDR_ERR_SUCCESS;
1577 : }
1578 :
1579 0 : _PUBLIC_ void ndr_print_timeval(struct ndr_print *ndr, const char *name,
1580 : const struct timeval *t)
1581 : {
1582 0 : ndr->print(ndr, "%-25s: %s.%ld", name, timestring(ndr, t->tv_sec),
1583 0 : (long)t->tv_usec);
1584 0 : }
1585 :
1586 26 : _PUBLIC_ void ndr_print_libndr_flags(struct ndr_print *ndr, const char *name,
1587 : libndr_flags flags)
1588 : {
1589 26 : ndr->print(ndr, "%-25s: 0x%016"PRI_LIBNDR_FLAGS" (%"PRI_LIBNDR_FLAGS_DECIMAL")", name, flags, flags);
1590 26 : }
|