1 /*
2    Unix SMB/CIFS implementation.
3 
4    routines for marshalling/unmarshalling DCOM string arrays
5 
6    Copyright (C) Jelmer Vernooij 2004
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 
23 #include "includes.h"
24 #include "librpc/gen_ndr/ndr_orpc.h"
25 
ndr_pull_DUALSTRINGARRAY(struct ndr_pull * ndr,int ndr_flags,struct DUALSTRINGARRAY * ar)26 enum ndr_err_code ndr_pull_DUALSTRINGARRAY(struct ndr_pull *ndr, int ndr_flags, struct DUALSTRINGARRAY *ar)
27 {
28 	uint16_t num_entries, security_offset;
29 	uint16_t towerid;
30 	uint32_t towernum = 0, conformant_size;
31 
32 	if (!(ndr_flags & NDR_SCALARS)) {
33 		return NDR_ERR_SUCCESS;
34 	}
35 
36 	NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &conformant_size));
37 	NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &num_entries));
38 	NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &security_offset));
39 
40 	ar->stringbindings = talloc_array(ndr, struct STRINGBINDING *, 1);
41 	ar->stringbindings[0] = NULL;
42 
43 	do {
44 		/* 'Peek' */
45 		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &towerid));
46 
47 		if (towerid > 0) {
48 			ndr->offset -= 2;
49 			ar->stringbindings = talloc_realloc(ndr, ar->stringbindings, struct STRINGBINDING *, towernum+2);
50 			ar->stringbindings[towernum] = talloc(ndr, struct STRINGBINDING);
51 			NDR_CHECK(ndr_pull_STRINGBINDING(ndr, ndr_flags, ar->stringbindings[towernum]));
52 			towernum++;
53 		}
54 	} while (towerid != 0);
55 
56 	ar->stringbindings[towernum] = NULL;
57 	towernum = 0;
58 
59 	ar->securitybindings = talloc_array(ndr, struct SECURITYBINDING *, 1);
60 	ar->securitybindings[0] = NULL;
61 
62 	do {
63 		/* 'Peek' */
64 		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &towerid));
65 
66 		if (towerid > 0) {
67 			ndr->offset -= 2;
68 			ar->securitybindings = talloc_realloc(ndr, ar->securitybindings, struct SECURITYBINDING *, towernum+2);
69 			ar->securitybindings[towernum] = talloc(ndr, struct SECURITYBINDING);
70 			NDR_CHECK(ndr_pull_SECURITYBINDING(ndr, ndr_flags, ar->securitybindings[towernum]));
71 			towernum++;
72 		}
73 	} while (towerid != 0);
74 
75 	ar->securitybindings[towernum] = NULL;
76 
77 	return NDR_ERR_SUCCESS;
78 }
79 
ndr_push_DUALSTRINGARRAY(struct ndr_push * ndr,int ndr_flags,const struct DUALSTRINGARRAY * ar)80 enum ndr_err_code ndr_push_DUALSTRINGARRAY(struct ndr_push *ndr, int ndr_flags, const struct DUALSTRINGARRAY *ar)
81 {
82 	return ndr_push_error(ndr, NDR_ERR_STRING, "ndr_push_DUALSTRINGARRAY not implemented");
83 }
84 
85 /*
86   print a dom_sid
87 */
ndr_print_DUALSTRINGARRAY(struct ndr_print * ndr,const char * name,const struct DUALSTRINGARRAY * ar)88 void ndr_print_DUALSTRINGARRAY(struct ndr_print *ndr, const char *name, const struct DUALSTRINGARRAY *ar)
89 {
90 	int i;
91 	ndr->print(ndr, "%-25s: DUALSTRINGARRAY", name);
92 	ndr->depth++;
93 	ndr->print(ndr, "STRING BINDINGS");
94 	ndr->depth++;
95 	for (i=0;ar->stringbindings[i];i++)	{
96 		char idx[13];	/* 2^32 has 10 digits */
97 		snprintf(idx, sizeof(idx), "[%d]", i);
98 		ndr_print_STRINGBINDING(ndr, idx, ar->stringbindings[i]);
99 	}
100 	ndr->depth--;
101 	ndr->print(ndr, "SECURITY BINDINGS");
102 	ndr->depth++;
103 	for (i=0;ar->securitybindings[i];i++)	{
104 		char idx[13];	/* 2^32 has 10 digits */
105 		snprintf(idx, sizeof(idx), "[%d]", i);
106 		ndr_print_SECURITYBINDING(ndr, idx, ar->securitybindings[i]);
107 	}
108 	ndr->depth--;
109 }
110 
ndr_pull_STRINGARRAY(struct ndr_pull * ndr,int ndr_flags,struct STRINGARRAY * ar)111 enum ndr_err_code ndr_pull_STRINGARRAY(struct ndr_pull *ndr, int ndr_flags, struct STRINGARRAY *ar)
112 {
113 	uint16_t towerid;
114 	uint32_t towernum = 0;
115 	uint16_t num_entries;
116 
117 	if (!(ndr_flags & NDR_SCALARS)) {
118 		return NDR_ERR_SUCCESS;
119 	}
120 
121 	NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &num_entries));
122 
123 	ar->stringbindings = talloc_array(ndr, struct STRINGBINDING *, 1);
124 	ar->stringbindings[0] = NULL;
125 
126 	do {
127 		/* 'Peek' */
128 		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &towerid));
129 
130 		if (towerid > 0) {
131 			ndr->offset -= 2;
132 			ar->stringbindings = talloc_realloc(ndr, ar->stringbindings, struct STRINGBINDING *, towernum+2);
133 			ar->stringbindings[towernum] = talloc(ndr, struct STRINGBINDING);
134 			NDR_CHECK(ndr_pull_STRINGBINDING(ndr, ndr_flags, ar->stringbindings[towernum]));
135 			towernum++;
136 		}
137 	} while (towerid != 0);
138 
139 	ar->stringbindings[towernum] = NULL;
140 
141 	return NDR_ERR_SUCCESS;
142 }
143 
ndr_push_STRINGARRAY(struct ndr_push * ndr,int ndr_flags,const struct STRINGARRAY * ar)144 enum ndr_err_code ndr_push_STRINGARRAY(struct ndr_push *ndr, int ndr_flags, const struct STRINGARRAY *ar)
145 {
146 	return ndr_push_error(ndr, NDR_ERR_STRING, "ndr_push_STRINGARRAY not implemented");
147 }
148 
149 /*
150   print a dom_sid
151 */
ndr_print_STRINGARRAY(struct ndr_print * ndr,const char * name,const struct STRINGARRAY * ar)152 void ndr_print_STRINGARRAY(struct ndr_print *ndr, const char *name, const struct STRINGARRAY *ar)
153 {
154 	int i;
155 	ndr->print(ndr, "%-25s: STRINGARRAY", name);
156 	ndr->depth++;
157 	for (i=0;ar->stringbindings[i];i++)	{
158 		char idx[13];	/* 2^32 has 10 digits */
159 		snprintf(idx, sizeof(idx), "[%d]", i);
160 		ndr_print_STRINGBINDING(ndr, idx, ar->stringbindings[i]);
161 	}
162 	ndr->depth--;
163 }
164