1 /*
2    Unix SMB/CIFS implementation.
3 
4    Manually parsed structures for DNSSERVER
5 
6    Copyright (C) Amitay Isaacs 2011
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 "includes.h"
23 #include "librpc/gen_ndr/ndr_dnsp.h"
24 #include "librpc/gen_ndr/ndr_dnsserver.h"
25 
26 /*
27  * parsing DNS_RPC_RECORDS_ARRAY
28  */
29 
ndr_pull_DNS_RPC_RECORDS_ARRAY(struct ndr_pull * ndr,int ndr_flags,struct DNS_RPC_RECORDS_ARRAY * rec)30 enum ndr_err_code ndr_pull_DNS_RPC_RECORDS_ARRAY(struct ndr_pull *ndr,
31 		int ndr_flags, struct DNS_RPC_RECORDS_ARRAY *rec)
32 {
33 	rec->count = 0;
34 	rec->rec = talloc_array(ndr->current_mem_ctx, struct DNS_RPC_RECORDS, rec->count);
35 	if (! rec->rec) {
36 		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull DNS_RPC_RECORDS_ARRAY");
37 	}
38 
39 	while (ndr->offset < ndr->data_size) {
40 		rec->rec = talloc_realloc(ndr->current_mem_ctx, rec->rec, struct DNS_RPC_RECORDS, rec->count+1);
41 		if (! rec->rec) {
42 			return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull DNS_RPC_RECORDS_ARRAY");
43 		}
44 		NDR_CHECK(ndr_pull_DNS_RPC_RECORDS(ndr, ndr_flags, &rec->rec[rec->count]));
45 		NDR_PULL_ALIGN(ndr, 4);
46 		rec->count++;
47 	}
48 
49 	return NDR_ERR_SUCCESS;
50 }
51 
ndr_push_DNS_RPC_RECORDS_ARRAY(struct ndr_push * ndr,int ndr_flags,const struct DNS_RPC_RECORDS_ARRAY * rec)52 enum ndr_err_code ndr_push_DNS_RPC_RECORDS_ARRAY(struct ndr_push *ndr,
53 		int ndr_flags, const struct DNS_RPC_RECORDS_ARRAY *rec)
54 {
55 	int i;
56 
57 	for (i=0; i<rec->count; i++) {
58 		NDR_CHECK(ndr_push_DNS_RPC_RECORDS(ndr, ndr_flags, &rec->rec[i]));
59 		NDR_PUSH_ALIGN(ndr, 4);
60 	}
61 
62 	return NDR_ERR_SUCCESS;
63 }
64 
65 /*
66  * Parsing of DNS_RPC_RECORD_STRING
67  */
68 
ndr_pull_DNS_RPC_RECORD_STRING(struct ndr_pull * ndr,int ndr_flags,struct DNS_RPC_RECORD_STRING * rec)69 enum ndr_err_code ndr_pull_DNS_RPC_RECORD_STRING(struct ndr_pull *ndr,
70 		int ndr_flags, struct DNS_RPC_RECORD_STRING *rec)
71 {
72 	rec->count = 0;
73 	rec->str = talloc_array(ndr->current_mem_ctx, struct DNS_RPC_NAME, rec->count);
74 	if (! rec->str) {
75 		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull DNS_RPC_RECORD_STRING");
76 	}
77 
78 	while (ndr->offset < ndr->data_size) {
79 		rec->str = talloc_realloc(ndr->current_mem_ctx, rec->str, struct DNS_RPC_NAME, rec->count+1);
80 		if (! rec->str) {
81 			return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull DNS_RPC_RECORD_STRING");
82 		}
83 		NDR_CHECK(ndr_pull_DNS_RPC_NAME(ndr, ndr_flags, &rec->str[rec->count]));
84 		rec->count++;
85 	}
86 
87 	return NDR_ERR_SUCCESS;
88 }
89 
ndr_push_DNS_RPC_RECORD_STRING(struct ndr_push * ndr,int ndr_flags,const struct DNS_RPC_RECORD_STRING * rec)90 enum ndr_err_code ndr_push_DNS_RPC_RECORD_STRING(struct ndr_push *ndr,
91 		int ndr_flags, const struct DNS_RPC_RECORD_STRING *rec)
92 {
93 	int i;
94 
95 	for (i=0; i<rec->count; i++) {
96 		NDR_CHECK(ndr_push_DNS_RPC_NAME(ndr, ndr_flags, &rec->str[i]));
97 	}
98 
99 	return NDR_ERR_SUCCESS;
100 }
101