General clean up. Merged routines for parsing enum_trust_dom rpc call.
[samba.git] / source / rpc_parse / parse_lsa.c
1 /* 
2  *  Unix SMB/Netbios implementation.
3  *  Version 1.9.
4  *  RPC Pipe client / server routines
5  *  Copyright (C) Andrew Tridgell              1992-1997,
6  *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
7  *  Copyright (C) Paul Ashton                       1997.
8  *  
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or
12  *  (at your option) any later version.
13  *  
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *  
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program; if not, write to the Free Software
21  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  */
23
24 #include "includes.h"
25
26 extern int DEBUGLEVEL;
27
28 static BOOL lsa_io_trans_names(char *desc, LSA_TRANS_NAME_ENUM *trn, prs_struct *ps, int depth);
29
30 /*******************************************************************
31  Inits a LSA_TRANS_NAME structure.
32 ********************************************************************/
33
34 void init_lsa_trans_name(LSA_TRANS_NAME *trn, UNISTR2 *uni_name,
35                          uint16 sid_name_use, char *name, uint32 idx)
36 {
37         int len_name = strlen(name)+1;
38
39         if(len_name == 0)
40                 len_name = 1;
41
42         trn->sid_name_use = sid_name_use;
43         init_uni_hdr(&trn->hdr_name, len_name);
44         init_unistr2(uni_name, name, len_name);
45         trn->domain_idx = idx;
46 }
47
48 /*******************************************************************
49  Reads or writes a LSA_TRANS_NAME structure.
50 ********************************************************************/
51
52 static BOOL lsa_io_trans_name(char *desc, LSA_TRANS_NAME *trn, prs_struct *ps, 
53                               int depth)
54 {
55         prs_debug(ps, depth, desc, "lsa_io_trans_name");
56         depth++;
57
58         if(!prs_align(ps))
59                 return False;
60         
61         if(!prs_uint16("sid_name_use", ps, depth, &trn->sid_name_use))
62                 return False;
63         if(!prs_align(ps))
64                 return False;
65         
66         if(!smb_io_unihdr ("hdr_name", &trn->hdr_name, ps, depth))
67                 return False;
68         if(!prs_uint32("domain_idx  ", ps, depth, &trn->domain_idx))
69                 return False;
70
71         return True;
72 }
73
74 /*******************************************************************
75  Reads or writes a DOM_R_REF structure.
76 ********************************************************************/
77
78 static BOOL lsa_io_dom_r_ref(char *desc, DOM_R_REF *r_r, prs_struct *ps, 
79                              int depth)
80 {
81         int i;
82
83         prs_debug(ps, depth, desc, "lsa_io_dom_r_ref");
84         depth++;
85
86         if(!prs_align(ps))
87                 return False;
88         
89         if(!prs_uint32("num_ref_doms_1", ps, depth, &r_r->num_ref_doms_1)) /* num referenced domains? */
90                 return False;
91         if(!prs_uint32("ptr_ref_dom   ", ps, depth, &r_r->ptr_ref_dom)) /* undocumented buffer pointer. */
92                 return False;
93         if(!prs_uint32("max_entries   ", ps, depth, &r_r->max_entries)) /* 32 - max number of entries */
94                 return False;
95
96         SMB_ASSERT_ARRAY(r_r->hdr_ref_dom, r_r->num_ref_doms_1);
97
98         if (r_r->ptr_ref_dom != 0) {
99
100                 if(!prs_uint32("num_ref_doms_2", ps, depth, &r_r->num_ref_doms_2)) /* 4 - num referenced domains? */
101                         return False;
102
103                 SMB_ASSERT_ARRAY(r_r->ref_dom, r_r->num_ref_doms_2);
104
105                 for (i = 0; i < r_r->num_ref_doms_1; i++) {
106                         fstring t;
107
108                         slprintf(t, sizeof(t) - 1, "dom_ref[%d] ", i);
109                         if(!smb_io_unihdr(t, &r_r->hdr_ref_dom[i].hdr_dom_name, ps, depth))
110                                 return False;
111
112                         slprintf(t, sizeof(t) - 1, "sid_ptr[%d] ", i);
113                         if(!prs_uint32(t, ps, depth, &r_r->hdr_ref_dom[i].ptr_dom_sid))
114                                 return False;
115                 }
116
117                 for (i = 0; i < r_r->num_ref_doms_2; i++) {
118                         fstring t;
119
120                         if (r_r->hdr_ref_dom[i].hdr_dom_name.buffer != 0) {
121                                 slprintf(t, sizeof(t) - 1, "dom_ref[%d] ", i);
122                                 if(!smb_io_unistr2(t, &r_r->ref_dom[i].uni_dom_name, True, ps, depth)) /* domain name unicode string */
123                                         return False;
124                                 if(!prs_align(ps))
125                                         return False;
126                         }
127
128                         if (r_r->hdr_ref_dom[i].ptr_dom_sid != 0) {
129                                 slprintf(t, sizeof(t) - 1, "sid_ptr[%d] ", i);
130                                 if(!smb_io_dom_sid2(t, &r_r->ref_dom[i].ref_dom, ps, depth)) /* referenced domain SIDs */
131                                         return False;
132                         }
133                 }
134         }
135
136         return True;
137 }
138
139 /*******************************************************************
140  Inits an LSA_SEC_QOS structure.
141 ********************************************************************/
142
143 void init_lsa_sec_qos(LSA_SEC_QOS *qos, uint16 imp_lev, uint8 ctxt, uint8 eff,
144                       uint32 unknown)
145 {
146         DEBUG(5, ("init_lsa_sec_qos\n"));
147
148         qos->len = 0x0c; /* length of quality of service block, in bytes */
149         qos->sec_imp_level = imp_lev;
150         qos->sec_ctxt_mode = ctxt;
151         qos->effective_only = eff;
152         qos->unknown = unknown;
153 }
154
155 /*******************************************************************
156  Reads or writes an LSA_SEC_QOS structure.
157 ********************************************************************/
158
159 static BOOL lsa_io_sec_qos(char *desc,  LSA_SEC_QOS *qos, prs_struct *ps, 
160                            int depth)
161 {
162         uint32 start;
163
164         prs_debug(ps, depth, desc, "lsa_io_obj_qos");
165         depth++;
166
167         if(!prs_align(ps))
168                 return False;
169         
170         start = prs_offset(ps);
171
172         /* these pointers had _better_ be zero, because we don't know
173            what they point to!
174          */
175         if(!prs_uint32("len           ", ps, depth, &qos->len)) /* 0x18 - length (in bytes) inc. the length field. */
176                 return False;
177         if(!prs_uint16("sec_imp_level ", ps, depth, &qos->sec_imp_level ))
178                 return False;
179         if(!prs_uint8 ("sec_ctxt_mode ", ps, depth, &qos->sec_ctxt_mode ))
180                 return False;
181         if(!prs_uint8 ("effective_only", ps, depth, &qos->effective_only))
182                 return False;
183         if(!prs_uint32("unknown       ", ps, depth, &qos->unknown))
184                 return False;
185
186         if (qos->len != prs_offset(ps) - start) {
187                 DEBUG(3,("lsa_io_sec_qos: length %x does not match size %x\n",
188                          qos->len, prs_offset(ps) - start));
189                 return False;
190         }
191
192         return True;
193 }
194
195 /*******************************************************************
196  Inits an LSA_OBJ_ATTR structure.
197 ********************************************************************/
198
199 void init_lsa_obj_attr(LSA_OBJ_ATTR *attr, uint32 attributes, LSA_SEC_QOS *qos)
200 {
201         DEBUG(5, ("init_lsa_obj_attr\n"));
202
203         attr->len = 0x18; /* length of object attribute block, in bytes */
204         attr->ptr_root_dir = 0;
205         attr->ptr_obj_name = 0;
206         attr->attributes = attributes;
207         attr->ptr_sec_desc = 0;
208         
209         if (qos != NULL) {
210                 attr->ptr_sec_qos = 1;
211                 attr->sec_qos = qos;
212         } else {
213                 attr->ptr_sec_qos = 0;
214                 attr->sec_qos = NULL;
215         }
216 }
217
218 /*******************************************************************
219  Reads or writes an LSA_OBJ_ATTR structure.
220 ********************************************************************/
221
222 static BOOL lsa_io_obj_attr(char *desc, LSA_OBJ_ATTR *attr, prs_struct *ps, 
223                             int depth)
224 {
225         uint32 start;
226
227         prs_debug(ps, depth, desc, "lsa_io_obj_attr");
228         depth++;
229
230         if(!prs_align(ps))
231                 return False;
232         
233         start = prs_offset(ps);
234
235         /* these pointers had _better_ be zero, because we don't know
236            what they point to!
237          */
238         if(!prs_uint32("len         ", ps, depth, &attr->len)) /* 0x18 - length (in bytes) inc. the length field. */
239                 return False;
240         if(!prs_uint32("ptr_root_dir", ps, depth, &attr->ptr_root_dir)) /* 0 - root directory (pointer) */
241                 return False;
242         if(!prs_uint32("ptr_obj_name", ps, depth, &attr->ptr_obj_name)) /* 0 - object name (pointer) */
243                 return False;
244         if(!prs_uint32("attributes  ", ps, depth, &attr->attributes)) /* 0 - attributes (undocumented) */
245                 return False;
246         if(!prs_uint32("ptr_sec_desc", ps, depth, &attr->ptr_sec_desc)) /* 0 - security descriptior (pointer) */
247                 return False;
248         if(!prs_uint32("ptr_sec_qos ", ps, depth, &attr->ptr_sec_qos )) /* security quality of service (pointer) */
249                 return False;
250
251         if (attr->len != prs_offset(ps) - start) {
252                 DEBUG(3,("lsa_io_obj_attr: length %x does not match size %x\n",
253                          attr->len, prs_offset(ps) - start));
254                 return False;
255         }
256
257         if (attr->ptr_sec_qos != 0 && attr->sec_qos != NULL) {
258                 if(!lsa_io_sec_qos("sec_qos", attr->sec_qos, ps, depth))
259                         return False;
260         }
261
262         return True;
263 }
264
265
266 /*******************************************************************
267  Inits an LSA_Q_OPEN_POL structure.
268 ********************************************************************/
269
270 void init_q_open_pol(LSA_Q_OPEN_POL *r_q, uint16 system_name,
271                      uint32 attributes, uint32 desired_access,
272                      LSA_SEC_QOS *qos)
273 {
274         DEBUG(5, ("init_open_pol: attr:%d da:%d\n", attributes, 
275                   desired_access));
276
277         r_q->ptr = 1; /* undocumented pointer */
278
279         if (qos == NULL)
280                 r_q->des_access = desired_access;
281
282         r_q->system_name = system_name;
283         init_lsa_obj_attr(&r_q->attr, attributes, qos);
284 }
285
286 /*******************************************************************
287  Reads or writes an LSA_Q_OPEN_POL structure.
288 ********************************************************************/
289
290 BOOL lsa_io_q_open_pol(char *desc, LSA_Q_OPEN_POL *r_q, prs_struct *ps, 
291                        int depth)
292 {
293         prs_debug(ps, depth, desc, "lsa_io_q_open_pol");
294         depth++;
295
296         if(!prs_uint32("ptr       ", ps, depth, &r_q->ptr))
297                 return False;
298         if(!prs_uint16("system_name", ps, depth, &r_q->system_name))
299                 return False;
300         if(!prs_align( ps ))
301                 return False;
302
303         if(!lsa_io_obj_attr("", &r_q->attr, ps, depth))
304                 return False;
305
306         if (r_q->attr.ptr_sec_qos == 0) {
307                 if(!prs_uint32("des_access", ps, depth, &r_q->des_access))
308                         return False;
309         }
310
311         return True;
312 }
313
314 /*******************************************************************
315  Reads or writes an LSA_R_OPEN_POL structure.
316 ********************************************************************/
317
318 BOOL lsa_io_r_open_pol(char *desc, LSA_R_OPEN_POL *r_p, prs_struct *ps, 
319                        int depth)
320 {
321         prs_debug(ps, depth, desc, "lsa_io_r_open_pol");
322         depth++;
323
324         if(!smb_io_pol_hnd("", &r_p->pol, ps, depth))
325                 return False;
326
327         if(!prs_uint32("status", ps, depth, &r_p->status))
328                 return False;
329
330         return True;
331 }
332
333 /*******************************************************************
334  Inits an LSA_Q_OPEN_POL2 structure.
335 ********************************************************************/
336
337 void init_q_open_pol2(LSA_Q_OPEN_POL2 *r_q, char *server_name,
338                         uint32 attributes, uint32 desired_access,
339                         LSA_SEC_QOS *qos)
340 {
341         DEBUG(5, ("init_q_open_pol2: attr:%d da:%d\n", attributes, 
342                   desired_access));
343
344         r_q->ptr = 1; /* undocumented pointer */
345
346         if (qos == NULL)
347                 r_q->des_access = desired_access;
348
349         init_unistr2(&r_q->uni_server_name, server_name, 
350                      strlen(server_name) + 1);
351
352         init_lsa_obj_attr(&r_q->attr, attributes, qos);
353 }
354
355 /*******************************************************************
356  Reads or writes an LSA_Q_OPEN_POL2 structure.
357 ********************************************************************/
358
359 BOOL lsa_io_q_open_pol2(char *desc, LSA_Q_OPEN_POL2 *r_q, prs_struct *ps, 
360                         int depth)
361 {
362         prs_debug(ps, depth, desc, "lsa_io_q_open_pol2");
363         depth++;
364
365         if(!prs_uint32("ptr       ", ps, depth, &r_q->ptr))
366                 return False;
367
368         if(!smb_io_unistr2 ("", &r_q->uni_server_name, r_q->ptr, ps, depth))
369                 return False;
370         if(!lsa_io_obj_attr("", &r_q->attr, ps, depth))
371                 return False;
372
373         if (r_q->attr.ptr_sec_qos == 0) {
374                 if(!prs_uint32("des_access", ps, depth, &r_q->des_access))
375                         return False;
376         }
377
378         return True;
379 }
380
381 /*******************************************************************
382  Reads or writes an LSA_R_OPEN_POL2 structure.
383 ********************************************************************/
384
385 BOOL lsa_io_r_open_pol2(char *desc, LSA_R_OPEN_POL2 *r_p, prs_struct *ps, 
386                         int depth)
387 {
388         prs_debug(ps, depth, desc, "lsa_io_r_open_pol2");
389         depth++;
390
391         if(!smb_io_pol_hnd("", &r_p->pol, ps, depth))
392                 return False;
393
394         if(!prs_uint32("status", ps, depth, &r_p->status))
395                 return False;
396
397         return True;
398 }
399
400 /*******************************************************************
401 makes an LSA_Q_QUERY_SEC_OBJ structure.
402 ********************************************************************/
403
404 void init_q_query_sec_obj(LSA_Q_QUERY_SEC_OBJ *q_q, const POLICY_HND *hnd, 
405                           uint32 sec_info)
406 {
407         DEBUG(5, ("init_q_query_sec_obj\n"));
408
409         q_q->pol = *hnd;
410         q_q->sec_info = sec_info;
411
412         return;
413 }
414
415 /*******************************************************************
416  Reads or writes an LSA_Q_QUERY_SEC_OBJ structure.
417 ********************************************************************/
418
419 BOOL lsa_io_q_query_sec_obj(char *desc, LSA_Q_QUERY_SEC_OBJ *q_q, 
420                             prs_struct *ps, int depth)
421 {
422         prs_debug(ps, depth, desc, "lsa_io_q_query_sec_obj");
423         depth++;
424
425         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
426                 return False;
427
428         if (!prs_uint32("sec_info", ps, depth, &q_q->sec_info))
429                 return False;
430
431         return True;
432
433
434 /*******************************************************************
435  Reads or writes a LSA_R_QUERY_SEC_OBJ structure.
436 ********************************************************************/
437
438 BOOL lsa_io_r_query_sec_obj(char *desc, LSA_R_QUERY_SEC_OBJ *r_u, 
439                             prs_struct *ps, int depth)
440 {
441         prs_debug(ps, depth, desc, "lsa_io_r_query_sec_obj");
442         depth++;
443
444         if (!prs_align(ps))
445                 return False;
446
447         if (!prs_uint32("ptr", ps, depth, &r_u->ptr))
448                 return False;
449
450         if (r_u->ptr != 0) {
451                 if (!sec_io_desc_buf("sec", &r_u->buf, ps, depth))
452                         return False;
453         }
454
455         if (!prs_uint32("status", ps, depth, &r_u->status))
456                 return False;
457
458         return True;
459 }
460
461 /*******************************************************************
462  Inits an LSA_Q_QUERY_INFO structure.
463 ********************************************************************/
464
465 void init_q_query(LSA_Q_QUERY_INFO *q_q, POLICY_HND *hnd, uint16 info_class)
466 {
467         DEBUG(5, ("init_q_query\n"));
468
469         memcpy(&q_q->pol, hnd, sizeof(q_q->pol));
470
471         q_q->info_class = info_class;
472 }
473
474 /*******************************************************************
475  Reads or writes an LSA_Q_QUERY_INFO structure.
476 ********************************************************************/
477
478 BOOL lsa_io_q_query(char *desc, LSA_Q_QUERY_INFO *q_q, prs_struct *ps, 
479                     int depth)
480 {
481         prs_debug(ps, depth, desc, "lsa_io_q_query");
482         depth++;
483
484         if(!smb_io_pol_hnd("", &q_q->pol, ps, depth))
485                 return False;
486
487         if(!prs_uint16("info_class", ps, depth, &q_q->info_class))
488                 return False;
489
490         return True;
491 }
492
493 /*******************************************************************
494 makes an LSA_Q_ENUM_TRUST_DOM structure.
495 ********************************************************************/
496 BOOL init_q_enum_trust_dom(LSA_Q_ENUM_TRUST_DOM * q_e, POLICY_HND *pol,
497                            uint32 enum_context, uint32 preferred_len)
498 {
499         DEBUG(5, ("init_q_enum_trust_dom\n"));
500
501         q_e->pol = *pol;
502         q_e->enum_context = enum_context;
503         q_e->preferred_len = preferred_len;
504
505         return True;
506 }
507
508 /*******************************************************************
509  Reads or writes an LSA_Q_ENUM_TRUST_DOM structure.
510 ********************************************************************/
511
512 BOOL lsa_io_q_enum_trust_dom(char *desc, LSA_Q_ENUM_TRUST_DOM *q_e, 
513                              prs_struct *ps, int depth)
514 {
515         prs_debug(ps, depth, desc, "lsa_io_q_enum_trust_dom");
516         depth++;
517
518         if(!smb_io_pol_hnd("", &q_e->pol, ps, depth))
519                 return False;
520
521         if(!prs_uint32("enum_context ", ps, depth, &q_e->enum_context))
522                 return False;
523         if(!prs_uint32("preferred_len", ps, depth, &q_e->preferred_len))
524                 return False;
525
526         return True;
527 }
528
529 /*******************************************************************
530  Reads or writes an LSA_R_ENUM_TRUST_DOM structure.
531 ********************************************************************/
532
533 BOOL lsa_io_r_enum_trust_dom(char *desc, LSA_R_ENUM_TRUST_DOM *r_e, 
534                              prs_struct *ps, int depth)
535 {
536         prs_debug(ps, depth, desc, "lsa_io_r_enum_trust_dom");
537         depth++;
538
539         if(!prs_uint32("enum_context    ", ps, depth, &r_e->enum_context))
540                 return False;
541         if(!prs_uint32("num_domains     ", ps, depth, &r_e->num_domains))
542                 return False;
543         if(!prs_uint32("ptr_enum_domains", ps, depth, &r_e->ptr_enum_domains))
544                 return False;
545
546         if (r_e->ptr_enum_domains) {
547                 int i, num_domains;
548
549                 if(!prs_uint32("num_domains2", ps, depth, &r_e->num_domains2))
550                         return False;
551
552                 num_domains = r_e->num_domains2;
553
554                 if (!(r_e->hdr_domain_name = (UNIHDR2 *)
555                       malloc(sizeof(UNIHDR2) * num_domains)))
556                         return False;
557
558                 if (!(r_e->uni_domain_name = (UNISTR2 *)
559                       malloc(sizeof(UNISTR2) * num_domains)))
560                         return False;
561
562                 if (!(r_e->domain_sid = (DOM_SID *)
563                       malloc(sizeof(DOM_SID) * num_domains)))
564                         return False;
565
566                 for (i = 0; i < num_domains; i++) {
567                         if(!smb_io_unihdr2 ("", &r_e->hdr_domain_name[i], ps, 
568                                             depth))
569                                 return False;
570                 }
571                 
572                 for (i = 0; i < num_domains; i++) {
573                         if(!smb_io_unistr2 ("", &r_e->uni_domain_name[i],
574                                             r_e->hdr_domain_name[i].buffer, 
575                                             ps, depth))
576                                 return False;
577                         if(!smb_io_dom_sid2("", &r_e->domain_sid[i], ps, 
578                                             depth))
579                                 return False;
580                 }
581         }
582
583         if(!prs_uint32("status", ps, depth, &r_e->status))
584                 return False;
585
586         return True;
587 }
588
589 void lsa_free_r_enum_trust_dom(LSA_R_ENUM_TRUST_DOM * r_e)
590 {
591         safe_free(r_e->uni_domain_name);
592         safe_free(r_e->hdr_domain_name);
593         safe_free(r_e->domain_sid);
594
595         r_e->uni_domain_name = NULL;
596         r_e->hdr_domain_name = NULL;
597         r_e->domain_sid = NULL;
598
599         r_e->num_domains = 0;
600         r_e->ptr_enum_domains = 0;
601 }
602
603 /*******************************************************************
604  Reads or writes an LSA_Q_QUERY_INFO structure.
605 ********************************************************************/
606
607 BOOL lsa_io_r_query(char *desc, LSA_R_QUERY_INFO *r_q, prs_struct *ps,
608                     int depth)
609 {
610         prs_debug(ps, depth, desc, "lsa_io_r_query");
611         depth++;
612
613         if(!prs_uint32("undoc_buffer", ps, depth, &r_q->undoc_buffer))
614                 return False;
615
616         if (r_q->undoc_buffer != 0) {
617                 if(!prs_uint16("info_class", ps, depth, &r_q->info_class))
618                         return False;
619
620                 switch (r_q->info_class) {
621                 case 3:
622                         if(!smb_io_dom_query_3("", &r_q->dom.id3, ps, depth))
623                                 return False;
624                         break;
625                 case 5:
626                         if(!smb_io_dom_query_5("", &r_q->dom.id3, ps, depth))
627                                 return False;
628                         break;
629                 default:
630                         /* PANIC! */
631                         break;
632                 }
633         }
634
635         if(!prs_uint32("status", ps, depth, &r_q->status))
636                 return False;
637
638         return True;
639 }
640
641 /*******************************************************************
642  Inits a LSA_SID_ENUM structure.
643 ********************************************************************/
644
645 void init_lsa_sid_enum(TALLOC_CTX *mem_ctx, LSA_SID_ENUM *sen, 
646                        int num_entries, DOM_SID *sids)
647 {
648         int i;
649
650         DEBUG(5, ("init_lsa_sid_enum\n"));
651
652         sen->num_entries  = num_entries;
653         sen->ptr_sid_enum = (num_entries != 0);
654         sen->num_entries2 = num_entries;
655
656         /* Allocate memory for sids and sid pointers */
657
658         if (num_entries == 0) return;
659
660         if ((sen->ptr_sid = (uint32 *)talloc(mem_ctx, num_entries * 
661                                              sizeof(uint32))) == NULL) {
662                 DEBUG(3, ("init_lsa_sid_enum(): out of memory for ptr_sid\n"));
663                 return;
664         }
665
666         if ((sen->sid = (DOM_SID2 *)talloc(mem_ctx, num_entries * 
667                                            sizeof(DOM_SID2))) == NULL) {
668                 DEBUG(3, ("init_lsa_sid_enum(): out of memory for sids\n"));
669                 return;
670         }
671
672         /* Copy across SIDs and SID pointers */
673
674         for (i = 0; i < num_entries; i++) {
675                 sen->ptr_sid[i] = 1;
676                 init_dom_sid2(&sen->sid[i], &sids[i]);
677         }
678 }
679
680 /*******************************************************************
681  Reads or writes a LSA_SID_ENUM structure.
682 ********************************************************************/
683
684 static BOOL lsa_io_sid_enum(char *desc, LSA_SID_ENUM *sen, prs_struct *ps, 
685                             int depth)
686 {
687         int i;
688
689         prs_debug(ps, depth, desc, "lsa_io_sid_enum");
690         depth++;
691
692         if(!prs_align(ps))
693                 return False;
694         
695         if(!prs_uint32("num_entries ", ps, depth, &sen->num_entries))
696                 return False;
697         if(!prs_uint32("ptr_sid_enum", ps, depth, &sen->ptr_sid_enum))
698                 return False;
699         if(!prs_uint32("num_entries2", ps, depth, &sen->num_entries2))
700                 return False;
701
702         /* Mallocate memory if we're unpacking from the wire */
703
704         if (UNMARSHALLING(ps)) {
705                 if ((sen->ptr_sid = (uint32 *)prs_alloc_mem( ps,
706                         sen->num_entries * sizeof(uint32))) == NULL) {
707                         DEBUG(3, ("init_lsa_sid_enum(): out of memory for "
708                                   "ptr_sid\n"));
709                         return False;
710                 }
711
712                 if ((sen->sid = (DOM_SID2 *)prs_alloc_mem( ps,
713                         sen->num_entries * sizeof(DOM_SID2))) == NULL) {
714                         DEBUG(3, ("init_lsa_sid_enum(): out of memory for "
715                                   "sids\n"));
716                         return False;
717                 }
718         }
719
720         for (i = 0; i < sen->num_entries; i++) {        
721                 fstring temp;
722
723                 slprintf(temp, sizeof(temp) - 1, "ptr_sid[%d]", i);
724                 if(!prs_uint32(temp, ps, depth, &sen->ptr_sid[i])) {
725                         return False;
726                 }
727         }
728
729         for (i = 0; i < sen->num_entries; i++) {
730                 fstring temp;
731
732                 slprintf(temp, sizeof(temp) - 1, "sid[%d]", i);
733                 if(!smb_io_dom_sid2(temp, &sen->sid[i], ps, depth)) {
734                         return False;
735                 }
736         }
737
738         return True;
739 }
740
741 /*******************************************************************
742  Inits an LSA_R_ENUM_TRUST_DOM structure.
743 ********************************************************************/
744
745 void init_q_lookup_sids(TALLOC_CTX *mem_ctx, LSA_Q_LOOKUP_SIDS *q_l, 
746                         POLICY_HND *hnd, int num_sids, DOM_SID *sids,
747                         uint16 level)
748 {
749         DEBUG(5, ("init_r_enum_trust_dom\n"));
750
751         ZERO_STRUCTP(q_l);
752
753         memcpy(&q_l->pol, hnd, sizeof(q_l->pol));
754         init_lsa_sid_enum(mem_ctx, &q_l->sids, num_sids, sids);
755         
756         q_l->level.value = level;
757 }
758
759 /*******************************************************************
760  Reads or writes a LSA_Q_LOOKUP_SIDS structure.
761 ********************************************************************/
762
763 BOOL lsa_io_q_lookup_sids(char *desc, LSA_Q_LOOKUP_SIDS *q_s, prs_struct *ps,
764                           int depth)
765 {
766         prs_debug(ps, depth, desc, "lsa_io_q_lookup_sids");
767         depth++;
768
769         if(!prs_align(ps))
770                 return False;
771         
772         if(!smb_io_pol_hnd("pol_hnd", &q_s->pol, ps, depth)) /* policy handle */
773                 return False;
774         if(!lsa_io_sid_enum("sids   ", &q_s->sids, ps, depth)) /* sids to be looked up */
775                 return False;
776         if(!lsa_io_trans_names("names  ", &q_s->names, ps, depth)) /* translated names */
777                 return False;
778         if(!smb_io_lookup_level("switch ", &q_s->level, ps, depth)) /* lookup level */
779                 return False;
780
781         if(!prs_uint32("mapped_count", ps, depth, &q_s->mapped_count))
782                 return False;
783
784         return True;
785 }
786
787 /*******************************************************************
788  Reads or writes a structure.
789 ********************************************************************/
790
791 static BOOL lsa_io_trans_names(char *desc, LSA_TRANS_NAME_ENUM *trn,
792                 prs_struct *ps, int depth)
793 {
794         int i;
795
796         prs_debug(ps, depth, desc, "lsa_io_trans_names");
797         depth++;
798
799         if(!prs_align(ps))
800                 return False;
801    
802         if(!prs_uint32("num_entries    ", ps, depth, &trn->num_entries))
803                 return False;
804         if(!prs_uint32("ptr_trans_names", ps, depth, &trn->ptr_trans_names))
805                 return False;
806
807         if (trn->ptr_trans_names != 0) {
808                 if(!prs_uint32("num_entries2   ", ps, depth, 
809                                &trn->num_entries2))
810                         return False;
811
812                 if (UNMARSHALLING(ps)) {
813                         if ((trn->name = (LSA_TRANS_NAME *)
814                              prs_alloc_mem(ps, trn->num_entries * 
815                                     sizeof(LSA_TRANS_NAME))) == NULL) {
816                                 return False;
817                         }
818
819                         if ((trn->uni_name = (UNISTR2 *)
820                              prs_alloc_mem(ps, trn->num_entries *
821                                     sizeof(UNISTR2))) == NULL) {
822                                 return False;
823                         }
824                 }
825
826                 for (i = 0; i < trn->num_entries2; i++) {
827                         fstring t;
828                         slprintf(t, sizeof(t) - 1, "name[%d] ", i);
829
830                         if(!lsa_io_trans_name(t, &trn->name[i], ps, depth)) /* translated name */
831                                 return False;
832                 }
833
834                 for (i = 0; i < trn->num_entries2; i++) {
835                         fstring t;
836                         slprintf(t, sizeof(t) - 1, "name[%d] ", i);
837
838                         if(!smb_io_unistr2(t, &trn->uni_name[i], trn->name[i].hdr_name.buffer, ps, depth))
839                                 return False;
840                         if(!prs_align(ps))
841                                 return False;
842                 }
843         }
844
845         return True;
846 }
847
848 /*******************************************************************
849  Reads or writes a structure.
850 ********************************************************************/
851
852 BOOL lsa_io_r_lookup_sids(char *desc, LSA_R_LOOKUP_SIDS *r_s, 
853                           prs_struct *ps, int depth)
854 {
855         prs_debug(ps, depth, desc, "lsa_io_r_lookup_sids");
856         depth++;
857
858         if(!prs_align(ps))
859                 return False;
860         
861         if(!prs_uint32("ptr_dom_ref", ps, depth, &r_s->ptr_dom_ref))
862                 return False;
863
864         if (r_s->ptr_dom_ref != 0)
865                 if(!lsa_io_dom_r_ref ("dom_ref", r_s->dom_ref, ps, depth)) /* domain reference info */
866                         return False;
867
868         if(!lsa_io_trans_names("names  ", r_s->names, ps, depth)) /* translated names */
869                 return False;
870
871         if(!prs_align(ps))
872                 return False;
873
874         if(!prs_uint32("mapped_count", ps, depth, &r_s->mapped_count))
875                 return False;
876
877         if(!prs_uint32("status      ", ps, depth, &r_s->status))
878                 return False;
879
880         return True;
881 }
882
883 /*******************************************************************
884 makes a structure.
885 ********************************************************************/
886
887 void init_q_lookup_names(TALLOC_CTX *mem_ctx, LSA_Q_LOOKUP_NAMES *q_l, 
888                          POLICY_HND *hnd, int num_names, char **names)
889 {
890         int i;
891
892         DEBUG(5, ("init_q_lookup_names\n"));
893
894         ZERO_STRUCTP(q_l);
895
896         q_l->pol = *hnd;
897         q_l->num_entries = num_names;
898         q_l->num_entries2 = num_names;
899         q_l->lookup_level = 1;
900
901         if ((q_l->uni_name = (UNISTR2 *)talloc(
902                 mem_ctx, num_names * sizeof(UNISTR2))) == NULL) {
903                 DEBUG(3, ("init_q_lookup_names(): out of memory\n"));
904                 return;
905         }
906
907         if ((q_l->hdr_name = (UNIHDR *)talloc(
908                 mem_ctx, num_names * sizeof(UNIHDR))) == NULL) {
909                 DEBUG(3, ("init_q_lookup_names(): out of memory\n"));
910                 return;
911         }
912
913         for (i = 0; i < num_names; i++) {
914                 char* name = names[i];
915                 int len = strlen(name);
916
917                 init_uni_hdr(&q_l->hdr_name[i], len);
918                 init_unistr2(&q_l->uni_name[i], name, len);
919         }
920 }
921
922 /*******************************************************************
923 reads or writes a structure.
924 ********************************************************************/
925
926 BOOL lsa_io_q_lookup_names(char *desc, LSA_Q_LOOKUP_NAMES *q_r, 
927                            prs_struct *ps, int depth)
928 {
929         int i;
930
931         prs_debug(ps, depth, desc, "lsa_io_q_lookup_names");
932         depth++;
933
934         if(!prs_align(ps))
935                 return False;
936
937         if(!smb_io_pol_hnd("", &q_r->pol, ps, depth)) /* policy handle */
938                 return False;
939
940         if(!prs_align(ps))
941                 return False;
942         if(!prs_uint32("num_entries    ", ps, depth, &q_r->num_entries))
943                 return False;
944         if(!prs_uint32("num_entries2   ", ps, depth, &q_r->num_entries2))
945                 return False;
946
947         if (UNMARSHALLING(ps)) {
948                 if (q_r->num_entries) {
949                         if ((q_r->hdr_name = (UNIHDR *)prs_alloc_mem(ps,
950                                         q_r->num_entries * sizeof(UNIHDR))) == NULL)
951                                 return False;
952                         if ((q_r->uni_name = (UNISTR2 *)prs_alloc_mem(ps,
953                                         q_r->num_entries * sizeof(UNISTR2))) == NULL)
954                                 return False;
955                 }
956         }
957
958         for (i = 0; i < q_r->num_entries; i++) {
959                 if(!prs_align(ps))
960                         return False;
961                 if(!smb_io_unihdr("hdr_name", &q_r->hdr_name[i], ps, depth)) /* pointer names */
962                         return False;
963         }
964
965         for (i = 0; i < q_r->num_entries; i++) {
966                 if(!prs_align(ps))
967                         return False;
968                 if(!smb_io_unistr2("dom_name", &q_r->uni_name[i], q_r->hdr_name[i].buffer, ps, depth)) /* names to be looked up */
969                         return False;
970         }
971
972         if(!prs_align(ps))
973                 return False;
974         if(!prs_uint32("num_trans_entries ", ps, depth, &q_r->num_trans_entries))
975                 return False;
976         if(!prs_uint32("ptr_trans_sids ", ps, depth, &q_r->ptr_trans_sids))
977                 return False;
978         if(!prs_uint32("lookup_level   ", ps, depth, &q_r->lookup_level))
979                 return False;
980         if(!prs_uint32("mapped_count   ", ps, depth, &q_r->mapped_count))
981                 return False;
982
983         return True;
984 }
985
986 /*******************************************************************
987 reads or writes a structure.
988 ********************************************************************/
989
990 BOOL lsa_io_r_lookup_names(char *desc, LSA_R_LOOKUP_NAMES *r_r, 
991                            prs_struct *ps, int depth)
992 {
993         int i;
994
995         prs_debug(ps, depth, desc, "lsa_io_r_lookup_names");
996         depth++;
997
998         if(!prs_align(ps))
999                 return False;
1000
1001         if(!prs_uint32("ptr_dom_ref", ps, depth, &r_r->ptr_dom_ref))
1002                 return False;
1003
1004         if (r_r->ptr_dom_ref != 0)
1005                 if(!lsa_io_dom_r_ref("", r_r->dom_ref, ps, depth))
1006                         return False;
1007
1008         if(!prs_uint32("num_entries", ps, depth, &r_r->num_entries))
1009                 return False;
1010         if(!prs_uint32("ptr_entries", ps, depth, &r_r->ptr_entries))
1011                 return False;
1012
1013         if (r_r->ptr_entries != 0) {
1014                 if(!prs_uint32("num_entries2", ps, depth, &r_r->num_entries2))
1015                         return False;
1016
1017                 if (r_r->num_entries2 != r_r->num_entries) {
1018                         /* RPC fault */
1019                         return False;
1020                 }
1021
1022                 if (UNMARSHALLING(ps)) {
1023                         if ((r_r->dom_rid = (DOM_RID2 *)prs_alloc_mem(ps, r_r->num_entries2 * sizeof(DOM_RID2)))
1024                             == NULL) {
1025                                 DEBUG(3, ("lsa_io_r_lookup_names(): out of memory\n"));
1026                                 return False;
1027                         }
1028                 }
1029
1030                 for (i = 0; i < r_r->num_entries2; i++)
1031                         if(!smb_io_dom_rid2("", &r_r->dom_rid[i], ps, depth)) /* domain RIDs being looked up */
1032                                 return False;
1033         }
1034
1035         if(!prs_uint32("mapped_count", ps, depth, &r_r->mapped_count))
1036                 return False;
1037
1038         if(!prs_uint32("status      ", ps, depth, &r_r->status))
1039                 return False;
1040
1041         return True;
1042 }
1043
1044
1045 /*******************************************************************
1046  Inits an LSA_Q_CLOSE structure.
1047 ********************************************************************/
1048
1049 void init_lsa_q_close(LSA_Q_CLOSE *q_c, POLICY_HND *hnd)
1050 {
1051         DEBUG(5, ("init_lsa_q_close\n"));
1052
1053         memcpy(&q_c->pol, hnd, sizeof(q_c->pol));
1054 }
1055
1056 /*******************************************************************
1057  Reads or writes an LSA_Q_CLOSE structure.
1058 ********************************************************************/
1059
1060 BOOL lsa_io_q_close(char *desc, LSA_Q_CLOSE *q_c, prs_struct *ps, int depth)
1061 {
1062         prs_debug(ps, depth, desc, "lsa_io_q_close");
1063         depth++;
1064
1065         if(!smb_io_pol_hnd("", &q_c->pol, ps, depth))
1066                 return False;
1067
1068         return True;
1069 }
1070
1071 /*******************************************************************
1072  Reads or writes an LSA_R_CLOSE structure.
1073 ********************************************************************/
1074
1075 BOOL lsa_io_r_close(char *desc,  LSA_R_CLOSE *r_c, prs_struct *ps, int depth)
1076 {
1077         prs_debug(ps, depth, desc, "lsa_io_r_close");
1078         depth++;
1079
1080         if(!smb_io_pol_hnd("", &r_c->pol, ps, depth))
1081                 return False;
1082
1083         if(!prs_uint32("status", ps, depth, &r_c->status))
1084                 return False;
1085
1086         return True;
1087 }