2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
5 * Copyright (C) Gerald Carter 2002-2003
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 /************************************************************************
25 ************************************************************************/
27 static BOOL
ds_io_dominfobasic(const char *desc
, DSROLE_PRIMARY_DOMAIN_INFO_BASIC
**basic
, prs_struct
*ps
, int depth
)
29 DSROLE_PRIMARY_DOMAIN_INFO_BASIC
*p
= *basic
;
31 if ( UNMARSHALLING(ps
) ) {
32 p
= *basic
= PRS_ALLOC_MEM(ps
, DSROLE_PRIMARY_DOMAIN_INFO_BASIC
, 1);
38 if ( !prs_uint16("machine_role", ps
, depth
, &p
->machine_role
) )
40 if ( !prs_uint16("unknown", ps
, depth
, &p
->unknown
) )
43 if ( !prs_uint32("flags", ps
, depth
, &p
->flags
) )
46 if ( !prs_uint32("netbios_ptr", ps
, depth
, &p
->netbios_ptr
) )
48 if ( !prs_uint32("dnsname_ptr", ps
, depth
, &p
->dnsname_ptr
) )
50 if ( !prs_uint32("forestname_ptr", ps
, depth
, &p
->forestname_ptr
) )
53 if ( !smb_io_uuid("domain_guid", &p
->domain_guid
, ps
, depth
) )
56 if ( !smb_io_unistr2( "netbios_domain", &p
->netbios_domain
, p
->netbios_ptr
, ps
, depth
) )
61 if ( !smb_io_unistr2( "dns_domain", &p
->dns_domain
, p
->dnsname_ptr
, ps
, depth
) )
66 if ( !smb_io_unistr2( "forest_domain", &p
->forest_domain
, p
->forestname_ptr
, ps
, depth
) )
76 /************************************************************************
77 ************************************************************************/
79 BOOL
ds_io_q_getprimdominfo( const char *desc
, DS_Q_GETPRIMDOMINFO
*q_u
, prs_struct
*ps
, int depth
)
81 prs_debug(ps
, depth
, desc
, "ds_io_q_getprimdominfo");
87 if ( !prs_uint16( "level", ps
, depth
, &q_u
->level
) )
93 /************************************************************************
94 ************************************************************************/
96 BOOL
ds_io_r_getprimdominfo( const char *desc
, DS_R_GETPRIMDOMINFO
*r_u
, prs_struct
*ps
, int depth
)
98 prs_debug(ps
, depth
, desc
, "ds_io_r_getprimdominfo");
104 if ( !prs_uint32( "ptr", ps
, depth
, &r_u
->ptr
) )
109 if ( !prs_uint16( "level", ps
, depth
, &r_u
->level
) )
112 if ( !prs_uint16( "unknown0", ps
, depth
, &r_u
->unknown0
) )
115 switch ( r_u
->level
)
117 case DsRolePrimaryDomainInfoBasic
:
118 if ( !ds_io_dominfobasic( "dominfobasic", &r_u
->info
.basic
, ps
, depth
) )
126 if ( !prs_align(ps
) )
129 if ( !prs_ntstatus("status", ps
, depth
, &r_u
->status
) )
135 /************************************************************************
136 initialize a DS_ENUM_DOM_TRUSTS structure
137 ************************************************************************/
139 BOOL
init_q_ds_enum_domain_trusts( DS_Q_ENUM_DOM_TRUSTS
*q
, const char *server
, uint32 flags
)
143 if ( server
&& *server
)
148 init_unistr2( &q
->server
, server
, UNI_STR_TERMINATE
);
153 /************************************************************************
154 ************************************************************************/
156 static BOOL
ds_io_domain_trusts( const char *desc
, DS_DOMAIN_TRUSTS
*trust
, prs_struct
*ps
, int depth
)
158 prs_debug(ps
, depth
, desc
, "ds_io_dom_trusts_ctr");
161 if ( !prs_uint32( "netbios_ptr", ps
, depth
, &trust
->netbios_ptr
) )
164 if ( !prs_uint32( "dns_ptr", ps
, depth
, &trust
->dns_ptr
) )
167 if ( !prs_uint32( "flags", ps
, depth
, &trust
->flags
) )
170 if ( !prs_uint32( "parent_index", ps
, depth
, &trust
->parent_index
) )
173 if ( !prs_uint32( "trust_type", ps
, depth
, &trust
->trust_type
) )
176 if ( !prs_uint32( "trust_attributes", ps
, depth
, &trust
->trust_attributes
) )
179 if ( !prs_uint32( "sid_ptr", ps
, depth
, &trust
->sid_ptr
) )
182 if ( !smb_io_uuid("guid", &trust
->guid
, ps
, depth
) )
188 /************************************************************************
189 ************************************************************************/
191 static BOOL
ds_io_dom_trusts_ctr( const char *desc
, DS_DOMAIN_TRUSTS_CTR
*ctr
, prs_struct
*ps
, int depth
)
195 prs_debug(ps
, depth
, desc
, "ds_io_dom_trusts_ctr");
198 if ( !prs_uint32( "ptr", ps
, depth
, &ctr
->ptr
) )
201 if ( !prs_uint32( "max_count", ps
, depth
, &ctr
->max_count
) )
206 if ( ctr
->max_count
== 0 )
209 /* allocate the domain trusts array are parse it */
211 ctr
->trusts
= TALLOC_ARRAY(ps
->mem_ctx
, DS_DOMAIN_TRUSTS
, ctr
->max_count
);
216 /* this stinks; the static portion o fthe structure is read here and then
217 we need another loop to read the UNISTR2's and SID's */
219 for ( i
=0; i
<ctr
->max_count
;i
++ ) {
220 if ( !ds_io_domain_trusts("domain_trusts", &ctr
->trusts
[i
], ps
, depth
) )
224 for ( i
=0; i
<ctr
->max_count
; i
++ ) {
226 if ( !smb_io_unistr2("netbios_domain", &ctr
->trusts
[i
].netbios_domain
, ctr
->trusts
[i
].netbios_ptr
, ps
, depth
) )
232 if ( !smb_io_unistr2("dns_domain", &ctr
->trusts
[i
].dns_domain
, ctr
->trusts
[i
].dns_ptr
, ps
, depth
) )
238 if ( ctr
->trusts
[i
].sid_ptr
) {
239 if ( !smb_io_dom_sid2("sid", &ctr
->trusts
[i
].sid
, ps
, depth
) )
247 /************************************************************************
248 initialize a DS_ENUM_DOM_TRUSTS request
249 ************************************************************************/
251 BOOL
ds_io_q_enum_domain_trusts( const char *desc
, DS_Q_ENUM_DOM_TRUSTS
*q_u
, prs_struct
*ps
, int depth
)
253 prs_debug(ps
, depth
, desc
, "ds_io_q_enum_domain_trusts");
256 if ( !prs_align(ps
) )
259 if ( !prs_uint32( "server_ptr", ps
, depth
, &q_u
->server_ptr
) )
262 if ( !smb_io_unistr2("server", &q_u
->server
, q_u
->server_ptr
, ps
, depth
) )
265 if ( !prs_align(ps
) )
268 if ( !prs_uint32( "flags", ps
, depth
, &q_u
->flags
) )
274 /************************************************************************
275 ************************************************************************/
277 BOOL
ds_io_r_enum_domain_trusts( const char *desc
, DS_R_ENUM_DOM_TRUSTS
*r_u
, prs_struct
*ps
, int depth
)
279 prs_debug(ps
, depth
, desc
, "ds_io_r_enum_domain_trusts");
285 if ( !prs_uint32( "num_domains", ps
, depth
, &r_u
->num_domains
) )
288 if ( r_u
->num_domains
) {
289 if ( !ds_io_dom_trusts_ctr("domains", &r_u
->domains
, ps
, depth
) )
296 if ( !prs_ntstatus("status", ps
, depth
, &r_u
->status
) )