Merge branch 'master' of ssh://jra@git.samba.org/data/git/samba
[sfrench/samba-autobuild/.git] / librpc / gen_ndr / srv_samr.c
1 /*
2  * Unix SMB/CIFS implementation.
3  * server auto-generated by pidl. DO NOT MODIFY!
4  */
5
6 #include "includes.h"
7 #include "../librpc/gen_ndr/srv_samr.h"
8
9 static bool api_samr_Connect(pipes_struct *p)
10 {
11         const struct ndr_interface_call *call;
12         struct ndr_pull *pull;
13         struct ndr_push *push;
14         enum ndr_err_code ndr_err;
15         DATA_BLOB blob;
16         struct samr_Connect *r;
17
18         call = &ndr_table_samr.calls[NDR_SAMR_CONNECT];
19
20         r = talloc(talloc_tos(), struct samr_Connect);
21         if (r == NULL) {
22                 return false;
23         }
24
25         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
26                 talloc_free(r);
27                 return false;
28         }
29
30         pull = ndr_pull_init_blob(&blob, r, NULL);
31         if (pull == NULL) {
32                 talloc_free(r);
33                 return false;
34         }
35
36         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
37         ndr_err = call->ndr_pull(pull, NDR_IN, r);
38         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
39                 talloc_free(r);
40                 return false;
41         }
42
43         if (DEBUGLEVEL >= 10) {
44                 NDR_PRINT_IN_DEBUG(samr_Connect, r);
45         }
46
47         ZERO_STRUCT(r->out);
48         r->out.connect_handle = talloc_zero(r, struct policy_handle);
49         if (r->out.connect_handle == NULL) {
50                 talloc_free(r);
51                 return false;
52         }
53
54         r->out.result = _samr_Connect(p, r);
55
56         if (p->rng_fault_state) {
57                 talloc_free(r);
58                 /* Return true here, srv_pipe_hnd.c will take care */
59                 return true;
60         }
61
62         if (DEBUGLEVEL >= 10) {
63                 NDR_PRINT_OUT_DEBUG(samr_Connect, r);
64         }
65
66         push = ndr_push_init_ctx(r, NULL);
67         if (push == NULL) {
68                 talloc_free(r);
69                 return false;
70         }
71
72         ndr_err = call->ndr_push(push, NDR_OUT, r);
73         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
74                 talloc_free(r);
75                 return false;
76         }
77
78         blob = ndr_push_blob(push);
79         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
80                 talloc_free(r);
81                 return false;
82         }
83
84         talloc_free(r);
85
86         return true;
87 }
88
89 static bool api_samr_Close(pipes_struct *p)
90 {
91         const struct ndr_interface_call *call;
92         struct ndr_pull *pull;
93         struct ndr_push *push;
94         enum ndr_err_code ndr_err;
95         DATA_BLOB blob;
96         struct samr_Close *r;
97
98         call = &ndr_table_samr.calls[NDR_SAMR_CLOSE];
99
100         r = talloc(talloc_tos(), struct samr_Close);
101         if (r == NULL) {
102                 return false;
103         }
104
105         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
106                 talloc_free(r);
107                 return false;
108         }
109
110         pull = ndr_pull_init_blob(&blob, r, NULL);
111         if (pull == NULL) {
112                 talloc_free(r);
113                 return false;
114         }
115
116         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
117         ndr_err = call->ndr_pull(pull, NDR_IN, r);
118         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
119                 talloc_free(r);
120                 return false;
121         }
122
123         if (DEBUGLEVEL >= 10) {
124                 NDR_PRINT_IN_DEBUG(samr_Close, r);
125         }
126
127         ZERO_STRUCT(r->out);
128         r->out.handle = r->in.handle;
129         r->out.result = _samr_Close(p, r);
130
131         if (p->rng_fault_state) {
132                 talloc_free(r);
133                 /* Return true here, srv_pipe_hnd.c will take care */
134                 return true;
135         }
136
137         if (DEBUGLEVEL >= 10) {
138                 NDR_PRINT_OUT_DEBUG(samr_Close, r);
139         }
140
141         push = ndr_push_init_ctx(r, NULL);
142         if (push == NULL) {
143                 talloc_free(r);
144                 return false;
145         }
146
147         ndr_err = call->ndr_push(push, NDR_OUT, r);
148         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
149                 talloc_free(r);
150                 return false;
151         }
152
153         blob = ndr_push_blob(push);
154         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
155                 talloc_free(r);
156                 return false;
157         }
158
159         talloc_free(r);
160
161         return true;
162 }
163
164 static bool api_samr_SetSecurity(pipes_struct *p)
165 {
166         const struct ndr_interface_call *call;
167         struct ndr_pull *pull;
168         struct ndr_push *push;
169         enum ndr_err_code ndr_err;
170         DATA_BLOB blob;
171         struct samr_SetSecurity *r;
172
173         call = &ndr_table_samr.calls[NDR_SAMR_SETSECURITY];
174
175         r = talloc(talloc_tos(), struct samr_SetSecurity);
176         if (r == NULL) {
177                 return false;
178         }
179
180         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
181                 talloc_free(r);
182                 return false;
183         }
184
185         pull = ndr_pull_init_blob(&blob, r, NULL);
186         if (pull == NULL) {
187                 talloc_free(r);
188                 return false;
189         }
190
191         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
192         ndr_err = call->ndr_pull(pull, NDR_IN, r);
193         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
194                 talloc_free(r);
195                 return false;
196         }
197
198         if (DEBUGLEVEL >= 10) {
199                 NDR_PRINT_IN_DEBUG(samr_SetSecurity, r);
200         }
201
202         r->out.result = _samr_SetSecurity(p, r);
203
204         if (p->rng_fault_state) {
205                 talloc_free(r);
206                 /* Return true here, srv_pipe_hnd.c will take care */
207                 return true;
208         }
209
210         if (DEBUGLEVEL >= 10) {
211                 NDR_PRINT_OUT_DEBUG(samr_SetSecurity, r);
212         }
213
214         push = ndr_push_init_ctx(r, NULL);
215         if (push == NULL) {
216                 talloc_free(r);
217                 return false;
218         }
219
220         ndr_err = call->ndr_push(push, NDR_OUT, r);
221         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
222                 talloc_free(r);
223                 return false;
224         }
225
226         blob = ndr_push_blob(push);
227         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
228                 talloc_free(r);
229                 return false;
230         }
231
232         talloc_free(r);
233
234         return true;
235 }
236
237 static bool api_samr_QuerySecurity(pipes_struct *p)
238 {
239         const struct ndr_interface_call *call;
240         struct ndr_pull *pull;
241         struct ndr_push *push;
242         enum ndr_err_code ndr_err;
243         DATA_BLOB blob;
244         struct samr_QuerySecurity *r;
245
246         call = &ndr_table_samr.calls[NDR_SAMR_QUERYSECURITY];
247
248         r = talloc(talloc_tos(), struct samr_QuerySecurity);
249         if (r == NULL) {
250                 return false;
251         }
252
253         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
254                 talloc_free(r);
255                 return false;
256         }
257
258         pull = ndr_pull_init_blob(&blob, r, NULL);
259         if (pull == NULL) {
260                 talloc_free(r);
261                 return false;
262         }
263
264         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
265         ndr_err = call->ndr_pull(pull, NDR_IN, r);
266         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
267                 talloc_free(r);
268                 return false;
269         }
270
271         if (DEBUGLEVEL >= 10) {
272                 NDR_PRINT_IN_DEBUG(samr_QuerySecurity, r);
273         }
274
275         ZERO_STRUCT(r->out);
276         r->out.sdbuf = talloc_zero(r, struct sec_desc_buf *);
277         if (r->out.sdbuf == NULL) {
278                 talloc_free(r);
279                 return false;
280         }
281
282         r->out.result = _samr_QuerySecurity(p, r);
283
284         if (p->rng_fault_state) {
285                 talloc_free(r);
286                 /* Return true here, srv_pipe_hnd.c will take care */
287                 return true;
288         }
289
290         if (DEBUGLEVEL >= 10) {
291                 NDR_PRINT_OUT_DEBUG(samr_QuerySecurity, r);
292         }
293
294         push = ndr_push_init_ctx(r, NULL);
295         if (push == NULL) {
296                 talloc_free(r);
297                 return false;
298         }
299
300         ndr_err = call->ndr_push(push, NDR_OUT, r);
301         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
302                 talloc_free(r);
303                 return false;
304         }
305
306         blob = ndr_push_blob(push);
307         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
308                 talloc_free(r);
309                 return false;
310         }
311
312         talloc_free(r);
313
314         return true;
315 }
316
317 static bool api_samr_Shutdown(pipes_struct *p)
318 {
319         const struct ndr_interface_call *call;
320         struct ndr_pull *pull;
321         struct ndr_push *push;
322         enum ndr_err_code ndr_err;
323         DATA_BLOB blob;
324         struct samr_Shutdown *r;
325
326         call = &ndr_table_samr.calls[NDR_SAMR_SHUTDOWN];
327
328         r = talloc(talloc_tos(), struct samr_Shutdown);
329         if (r == NULL) {
330                 return false;
331         }
332
333         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
334                 talloc_free(r);
335                 return false;
336         }
337
338         pull = ndr_pull_init_blob(&blob, r, NULL);
339         if (pull == NULL) {
340                 talloc_free(r);
341                 return false;
342         }
343
344         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
345         ndr_err = call->ndr_pull(pull, NDR_IN, r);
346         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
347                 talloc_free(r);
348                 return false;
349         }
350
351         if (DEBUGLEVEL >= 10) {
352                 NDR_PRINT_IN_DEBUG(samr_Shutdown, r);
353         }
354
355         r->out.result = _samr_Shutdown(p, r);
356
357         if (p->rng_fault_state) {
358                 talloc_free(r);
359                 /* Return true here, srv_pipe_hnd.c will take care */
360                 return true;
361         }
362
363         if (DEBUGLEVEL >= 10) {
364                 NDR_PRINT_OUT_DEBUG(samr_Shutdown, r);
365         }
366
367         push = ndr_push_init_ctx(r, NULL);
368         if (push == NULL) {
369                 talloc_free(r);
370                 return false;
371         }
372
373         ndr_err = call->ndr_push(push, NDR_OUT, r);
374         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
375                 talloc_free(r);
376                 return false;
377         }
378
379         blob = ndr_push_blob(push);
380         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
381                 talloc_free(r);
382                 return false;
383         }
384
385         talloc_free(r);
386
387         return true;
388 }
389
390 static bool api_samr_LookupDomain(pipes_struct *p)
391 {
392         const struct ndr_interface_call *call;
393         struct ndr_pull *pull;
394         struct ndr_push *push;
395         enum ndr_err_code ndr_err;
396         DATA_BLOB blob;
397         struct samr_LookupDomain *r;
398
399         call = &ndr_table_samr.calls[NDR_SAMR_LOOKUPDOMAIN];
400
401         r = talloc(talloc_tos(), struct samr_LookupDomain);
402         if (r == NULL) {
403                 return false;
404         }
405
406         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
407                 talloc_free(r);
408                 return false;
409         }
410
411         pull = ndr_pull_init_blob(&blob, r, NULL);
412         if (pull == NULL) {
413                 talloc_free(r);
414                 return false;
415         }
416
417         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
418         ndr_err = call->ndr_pull(pull, NDR_IN, r);
419         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
420                 talloc_free(r);
421                 return false;
422         }
423
424         if (DEBUGLEVEL >= 10) {
425                 NDR_PRINT_IN_DEBUG(samr_LookupDomain, r);
426         }
427
428         ZERO_STRUCT(r->out);
429         r->out.sid = talloc_zero(r, struct dom_sid2 *);
430         if (r->out.sid == NULL) {
431                 talloc_free(r);
432                 return false;
433         }
434
435         r->out.result = _samr_LookupDomain(p, r);
436
437         if (p->rng_fault_state) {
438                 talloc_free(r);
439                 /* Return true here, srv_pipe_hnd.c will take care */
440                 return true;
441         }
442
443         if (DEBUGLEVEL >= 10) {
444                 NDR_PRINT_OUT_DEBUG(samr_LookupDomain, r);
445         }
446
447         push = ndr_push_init_ctx(r, NULL);
448         if (push == NULL) {
449                 talloc_free(r);
450                 return false;
451         }
452
453         ndr_err = call->ndr_push(push, NDR_OUT, r);
454         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
455                 talloc_free(r);
456                 return false;
457         }
458
459         blob = ndr_push_blob(push);
460         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
461                 talloc_free(r);
462                 return false;
463         }
464
465         talloc_free(r);
466
467         return true;
468 }
469
470 static bool api_samr_EnumDomains(pipes_struct *p)
471 {
472         const struct ndr_interface_call *call;
473         struct ndr_pull *pull;
474         struct ndr_push *push;
475         enum ndr_err_code ndr_err;
476         DATA_BLOB blob;
477         struct samr_EnumDomains *r;
478
479         call = &ndr_table_samr.calls[NDR_SAMR_ENUMDOMAINS];
480
481         r = talloc(talloc_tos(), struct samr_EnumDomains);
482         if (r == NULL) {
483                 return false;
484         }
485
486         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
487                 talloc_free(r);
488                 return false;
489         }
490
491         pull = ndr_pull_init_blob(&blob, r, NULL);
492         if (pull == NULL) {
493                 talloc_free(r);
494                 return false;
495         }
496
497         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
498         ndr_err = call->ndr_pull(pull, NDR_IN, r);
499         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
500                 talloc_free(r);
501                 return false;
502         }
503
504         if (DEBUGLEVEL >= 10) {
505                 NDR_PRINT_IN_DEBUG(samr_EnumDomains, r);
506         }
507
508         ZERO_STRUCT(r->out);
509         r->out.resume_handle = r->in.resume_handle;
510         r->out.sam = talloc_zero(r, struct samr_SamArray *);
511         if (r->out.sam == NULL) {
512                 talloc_free(r);
513                 return false;
514         }
515
516         r->out.num_entries = talloc_zero(r, uint32_t);
517         if (r->out.num_entries == NULL) {
518                 talloc_free(r);
519                 return false;
520         }
521
522         r->out.result = _samr_EnumDomains(p, r);
523
524         if (p->rng_fault_state) {
525                 talloc_free(r);
526                 /* Return true here, srv_pipe_hnd.c will take care */
527                 return true;
528         }
529
530         if (DEBUGLEVEL >= 10) {
531                 NDR_PRINT_OUT_DEBUG(samr_EnumDomains, r);
532         }
533
534         push = ndr_push_init_ctx(r, NULL);
535         if (push == NULL) {
536                 talloc_free(r);
537                 return false;
538         }
539
540         ndr_err = call->ndr_push(push, NDR_OUT, r);
541         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
542                 talloc_free(r);
543                 return false;
544         }
545
546         blob = ndr_push_blob(push);
547         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
548                 talloc_free(r);
549                 return false;
550         }
551
552         talloc_free(r);
553
554         return true;
555 }
556
557 static bool api_samr_OpenDomain(pipes_struct *p)
558 {
559         const struct ndr_interface_call *call;
560         struct ndr_pull *pull;
561         struct ndr_push *push;
562         enum ndr_err_code ndr_err;
563         DATA_BLOB blob;
564         struct samr_OpenDomain *r;
565
566         call = &ndr_table_samr.calls[NDR_SAMR_OPENDOMAIN];
567
568         r = talloc(talloc_tos(), struct samr_OpenDomain);
569         if (r == NULL) {
570                 return false;
571         }
572
573         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
574                 talloc_free(r);
575                 return false;
576         }
577
578         pull = ndr_pull_init_blob(&blob, r, NULL);
579         if (pull == NULL) {
580                 talloc_free(r);
581                 return false;
582         }
583
584         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
585         ndr_err = call->ndr_pull(pull, NDR_IN, r);
586         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
587                 talloc_free(r);
588                 return false;
589         }
590
591         if (DEBUGLEVEL >= 10) {
592                 NDR_PRINT_IN_DEBUG(samr_OpenDomain, r);
593         }
594
595         ZERO_STRUCT(r->out);
596         r->out.domain_handle = talloc_zero(r, struct policy_handle);
597         if (r->out.domain_handle == NULL) {
598                 talloc_free(r);
599                 return false;
600         }
601
602         r->out.result = _samr_OpenDomain(p, r);
603
604         if (p->rng_fault_state) {
605                 talloc_free(r);
606                 /* Return true here, srv_pipe_hnd.c will take care */
607                 return true;
608         }
609
610         if (DEBUGLEVEL >= 10) {
611                 NDR_PRINT_OUT_DEBUG(samr_OpenDomain, r);
612         }
613
614         push = ndr_push_init_ctx(r, NULL);
615         if (push == NULL) {
616                 talloc_free(r);
617                 return false;
618         }
619
620         ndr_err = call->ndr_push(push, NDR_OUT, r);
621         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
622                 talloc_free(r);
623                 return false;
624         }
625
626         blob = ndr_push_blob(push);
627         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
628                 talloc_free(r);
629                 return false;
630         }
631
632         talloc_free(r);
633
634         return true;
635 }
636
637 static bool api_samr_QueryDomainInfo(pipes_struct *p)
638 {
639         const struct ndr_interface_call *call;
640         struct ndr_pull *pull;
641         struct ndr_push *push;
642         enum ndr_err_code ndr_err;
643         DATA_BLOB blob;
644         struct samr_QueryDomainInfo *r;
645
646         call = &ndr_table_samr.calls[NDR_SAMR_QUERYDOMAININFO];
647
648         r = talloc(talloc_tos(), struct samr_QueryDomainInfo);
649         if (r == NULL) {
650                 return false;
651         }
652
653         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
654                 talloc_free(r);
655                 return false;
656         }
657
658         pull = ndr_pull_init_blob(&blob, r, NULL);
659         if (pull == NULL) {
660                 talloc_free(r);
661                 return false;
662         }
663
664         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
665         ndr_err = call->ndr_pull(pull, NDR_IN, r);
666         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
667                 talloc_free(r);
668                 return false;
669         }
670
671         if (DEBUGLEVEL >= 10) {
672                 NDR_PRINT_IN_DEBUG(samr_QueryDomainInfo, r);
673         }
674
675         ZERO_STRUCT(r->out);
676         r->out.info = talloc_zero(r, union samr_DomainInfo *);
677         if (r->out.info == NULL) {
678                 talloc_free(r);
679                 return false;
680         }
681
682         r->out.result = _samr_QueryDomainInfo(p, r);
683
684         if (p->rng_fault_state) {
685                 talloc_free(r);
686                 /* Return true here, srv_pipe_hnd.c will take care */
687                 return true;
688         }
689
690         if (DEBUGLEVEL >= 10) {
691                 NDR_PRINT_OUT_DEBUG(samr_QueryDomainInfo, r);
692         }
693
694         push = ndr_push_init_ctx(r, NULL);
695         if (push == NULL) {
696                 talloc_free(r);
697                 return false;
698         }
699
700         ndr_err = call->ndr_push(push, NDR_OUT, r);
701         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
702                 talloc_free(r);
703                 return false;
704         }
705
706         blob = ndr_push_blob(push);
707         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
708                 talloc_free(r);
709                 return false;
710         }
711
712         talloc_free(r);
713
714         return true;
715 }
716
717 static bool api_samr_SetDomainInfo(pipes_struct *p)
718 {
719         const struct ndr_interface_call *call;
720         struct ndr_pull *pull;
721         struct ndr_push *push;
722         enum ndr_err_code ndr_err;
723         DATA_BLOB blob;
724         struct samr_SetDomainInfo *r;
725
726         call = &ndr_table_samr.calls[NDR_SAMR_SETDOMAININFO];
727
728         r = talloc(talloc_tos(), struct samr_SetDomainInfo);
729         if (r == NULL) {
730                 return false;
731         }
732
733         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
734                 talloc_free(r);
735                 return false;
736         }
737
738         pull = ndr_pull_init_blob(&blob, r, NULL);
739         if (pull == NULL) {
740                 talloc_free(r);
741                 return false;
742         }
743
744         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
745         ndr_err = call->ndr_pull(pull, NDR_IN, r);
746         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
747                 talloc_free(r);
748                 return false;
749         }
750
751         if (DEBUGLEVEL >= 10) {
752                 NDR_PRINT_IN_DEBUG(samr_SetDomainInfo, r);
753         }
754
755         r->out.result = _samr_SetDomainInfo(p, r);
756
757         if (p->rng_fault_state) {
758                 talloc_free(r);
759                 /* Return true here, srv_pipe_hnd.c will take care */
760                 return true;
761         }
762
763         if (DEBUGLEVEL >= 10) {
764                 NDR_PRINT_OUT_DEBUG(samr_SetDomainInfo, r);
765         }
766
767         push = ndr_push_init_ctx(r, NULL);
768         if (push == NULL) {
769                 talloc_free(r);
770                 return false;
771         }
772
773         ndr_err = call->ndr_push(push, NDR_OUT, r);
774         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
775                 talloc_free(r);
776                 return false;
777         }
778
779         blob = ndr_push_blob(push);
780         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
781                 talloc_free(r);
782                 return false;
783         }
784
785         talloc_free(r);
786
787         return true;
788 }
789
790 static bool api_samr_CreateDomainGroup(pipes_struct *p)
791 {
792         const struct ndr_interface_call *call;
793         struct ndr_pull *pull;
794         struct ndr_push *push;
795         enum ndr_err_code ndr_err;
796         DATA_BLOB blob;
797         struct samr_CreateDomainGroup *r;
798
799         call = &ndr_table_samr.calls[NDR_SAMR_CREATEDOMAINGROUP];
800
801         r = talloc(talloc_tos(), struct samr_CreateDomainGroup);
802         if (r == NULL) {
803                 return false;
804         }
805
806         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
807                 talloc_free(r);
808                 return false;
809         }
810
811         pull = ndr_pull_init_blob(&blob, r, NULL);
812         if (pull == NULL) {
813                 talloc_free(r);
814                 return false;
815         }
816
817         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
818         ndr_err = call->ndr_pull(pull, NDR_IN, r);
819         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
820                 talloc_free(r);
821                 return false;
822         }
823
824         if (DEBUGLEVEL >= 10) {
825                 NDR_PRINT_IN_DEBUG(samr_CreateDomainGroup, r);
826         }
827
828         ZERO_STRUCT(r->out);
829         r->out.group_handle = talloc_zero(r, struct policy_handle);
830         if (r->out.group_handle == NULL) {
831                 talloc_free(r);
832                 return false;
833         }
834
835         r->out.rid = talloc_zero(r, uint32_t);
836         if (r->out.rid == NULL) {
837                 talloc_free(r);
838                 return false;
839         }
840
841         r->out.result = _samr_CreateDomainGroup(p, r);
842
843         if (p->rng_fault_state) {
844                 talloc_free(r);
845                 /* Return true here, srv_pipe_hnd.c will take care */
846                 return true;
847         }
848
849         if (DEBUGLEVEL >= 10) {
850                 NDR_PRINT_OUT_DEBUG(samr_CreateDomainGroup, r);
851         }
852
853         push = ndr_push_init_ctx(r, NULL);
854         if (push == NULL) {
855                 talloc_free(r);
856                 return false;
857         }
858
859         ndr_err = call->ndr_push(push, NDR_OUT, r);
860         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
861                 talloc_free(r);
862                 return false;
863         }
864
865         blob = ndr_push_blob(push);
866         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
867                 talloc_free(r);
868                 return false;
869         }
870
871         talloc_free(r);
872
873         return true;
874 }
875
876 static bool api_samr_EnumDomainGroups(pipes_struct *p)
877 {
878         const struct ndr_interface_call *call;
879         struct ndr_pull *pull;
880         struct ndr_push *push;
881         enum ndr_err_code ndr_err;
882         DATA_BLOB blob;
883         struct samr_EnumDomainGroups *r;
884
885         call = &ndr_table_samr.calls[NDR_SAMR_ENUMDOMAINGROUPS];
886
887         r = talloc(talloc_tos(), struct samr_EnumDomainGroups);
888         if (r == NULL) {
889                 return false;
890         }
891
892         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
893                 talloc_free(r);
894                 return false;
895         }
896
897         pull = ndr_pull_init_blob(&blob, r, NULL);
898         if (pull == NULL) {
899                 talloc_free(r);
900                 return false;
901         }
902
903         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
904         ndr_err = call->ndr_pull(pull, NDR_IN, r);
905         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
906                 talloc_free(r);
907                 return false;
908         }
909
910         if (DEBUGLEVEL >= 10) {
911                 NDR_PRINT_IN_DEBUG(samr_EnumDomainGroups, r);
912         }
913
914         ZERO_STRUCT(r->out);
915         r->out.resume_handle = r->in.resume_handle;
916         r->out.sam = talloc_zero(r, struct samr_SamArray *);
917         if (r->out.sam == NULL) {
918                 talloc_free(r);
919                 return false;
920         }
921
922         r->out.num_entries = talloc_zero(r, uint32_t);
923         if (r->out.num_entries == NULL) {
924                 talloc_free(r);
925                 return false;
926         }
927
928         r->out.result = _samr_EnumDomainGroups(p, r);
929
930         if (p->rng_fault_state) {
931                 talloc_free(r);
932                 /* Return true here, srv_pipe_hnd.c will take care */
933                 return true;
934         }
935
936         if (DEBUGLEVEL >= 10) {
937                 NDR_PRINT_OUT_DEBUG(samr_EnumDomainGroups, r);
938         }
939
940         push = ndr_push_init_ctx(r, NULL);
941         if (push == NULL) {
942                 talloc_free(r);
943                 return false;
944         }
945
946         ndr_err = call->ndr_push(push, NDR_OUT, r);
947         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
948                 talloc_free(r);
949                 return false;
950         }
951
952         blob = ndr_push_blob(push);
953         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
954                 talloc_free(r);
955                 return false;
956         }
957
958         talloc_free(r);
959
960         return true;
961 }
962
963 static bool api_samr_CreateUser(pipes_struct *p)
964 {
965         const struct ndr_interface_call *call;
966         struct ndr_pull *pull;
967         struct ndr_push *push;
968         enum ndr_err_code ndr_err;
969         DATA_BLOB blob;
970         struct samr_CreateUser *r;
971
972         call = &ndr_table_samr.calls[NDR_SAMR_CREATEUSER];
973
974         r = talloc(talloc_tos(), struct samr_CreateUser);
975         if (r == NULL) {
976                 return false;
977         }
978
979         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
980                 talloc_free(r);
981                 return false;
982         }
983
984         pull = ndr_pull_init_blob(&blob, r, NULL);
985         if (pull == NULL) {
986                 talloc_free(r);
987                 return false;
988         }
989
990         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
991         ndr_err = call->ndr_pull(pull, NDR_IN, r);
992         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
993                 talloc_free(r);
994                 return false;
995         }
996
997         if (DEBUGLEVEL >= 10) {
998                 NDR_PRINT_IN_DEBUG(samr_CreateUser, r);
999         }
1000
1001         ZERO_STRUCT(r->out);
1002         r->out.user_handle = talloc_zero(r, struct policy_handle);
1003         if (r->out.user_handle == NULL) {
1004                 talloc_free(r);
1005                 return false;
1006         }
1007
1008         r->out.rid = talloc_zero(r, uint32_t);
1009         if (r->out.rid == NULL) {
1010                 talloc_free(r);
1011                 return false;
1012         }
1013
1014         r->out.result = _samr_CreateUser(p, r);
1015
1016         if (p->rng_fault_state) {
1017                 talloc_free(r);
1018                 /* Return true here, srv_pipe_hnd.c will take care */
1019                 return true;
1020         }
1021
1022         if (DEBUGLEVEL >= 10) {
1023                 NDR_PRINT_OUT_DEBUG(samr_CreateUser, r);
1024         }
1025
1026         push = ndr_push_init_ctx(r, NULL);
1027         if (push == NULL) {
1028                 talloc_free(r);
1029                 return false;
1030         }
1031
1032         ndr_err = call->ndr_push(push, NDR_OUT, r);
1033         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1034                 talloc_free(r);
1035                 return false;
1036         }
1037
1038         blob = ndr_push_blob(push);
1039         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
1040                 talloc_free(r);
1041                 return false;
1042         }
1043
1044         talloc_free(r);
1045
1046         return true;
1047 }
1048
1049 static bool api_samr_EnumDomainUsers(pipes_struct *p)
1050 {
1051         const struct ndr_interface_call *call;
1052         struct ndr_pull *pull;
1053         struct ndr_push *push;
1054         enum ndr_err_code ndr_err;
1055         DATA_BLOB blob;
1056         struct samr_EnumDomainUsers *r;
1057
1058         call = &ndr_table_samr.calls[NDR_SAMR_ENUMDOMAINUSERS];
1059
1060         r = talloc(talloc_tos(), struct samr_EnumDomainUsers);
1061         if (r == NULL) {
1062                 return false;
1063         }
1064
1065         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
1066                 talloc_free(r);
1067                 return false;
1068         }
1069
1070         pull = ndr_pull_init_blob(&blob, r, NULL);
1071         if (pull == NULL) {
1072                 talloc_free(r);
1073                 return false;
1074         }
1075
1076         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
1077         ndr_err = call->ndr_pull(pull, NDR_IN, r);
1078         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1079                 talloc_free(r);
1080                 return false;
1081         }
1082
1083         if (DEBUGLEVEL >= 10) {
1084                 NDR_PRINT_IN_DEBUG(samr_EnumDomainUsers, r);
1085         }
1086
1087         ZERO_STRUCT(r->out);
1088         r->out.resume_handle = r->in.resume_handle;
1089         r->out.sam = talloc_zero(r, struct samr_SamArray *);
1090         if (r->out.sam == NULL) {
1091                 talloc_free(r);
1092                 return false;
1093         }
1094
1095         r->out.num_entries = talloc_zero(r, uint32_t);
1096         if (r->out.num_entries == NULL) {
1097                 talloc_free(r);
1098                 return false;
1099         }
1100
1101         r->out.result = _samr_EnumDomainUsers(p, r);
1102
1103         if (p->rng_fault_state) {
1104                 talloc_free(r);
1105                 /* Return true here, srv_pipe_hnd.c will take care */
1106                 return true;
1107         }
1108
1109         if (DEBUGLEVEL >= 10) {
1110                 NDR_PRINT_OUT_DEBUG(samr_EnumDomainUsers, r);
1111         }
1112
1113         push = ndr_push_init_ctx(r, NULL);
1114         if (push == NULL) {
1115                 talloc_free(r);
1116                 return false;
1117         }
1118
1119         ndr_err = call->ndr_push(push, NDR_OUT, r);
1120         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1121                 talloc_free(r);
1122                 return false;
1123         }
1124
1125         blob = ndr_push_blob(push);
1126         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
1127                 talloc_free(r);
1128                 return false;
1129         }
1130
1131         talloc_free(r);
1132
1133         return true;
1134 }
1135
1136 static bool api_samr_CreateDomAlias(pipes_struct *p)
1137 {
1138         const struct ndr_interface_call *call;
1139         struct ndr_pull *pull;
1140         struct ndr_push *push;
1141         enum ndr_err_code ndr_err;
1142         DATA_BLOB blob;
1143         struct samr_CreateDomAlias *r;
1144
1145         call = &ndr_table_samr.calls[NDR_SAMR_CREATEDOMALIAS];
1146
1147         r = talloc(talloc_tos(), struct samr_CreateDomAlias);
1148         if (r == NULL) {
1149                 return false;
1150         }
1151
1152         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
1153                 talloc_free(r);
1154                 return false;
1155         }
1156
1157         pull = ndr_pull_init_blob(&blob, r, NULL);
1158         if (pull == NULL) {
1159                 talloc_free(r);
1160                 return false;
1161         }
1162
1163         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
1164         ndr_err = call->ndr_pull(pull, NDR_IN, r);
1165         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1166                 talloc_free(r);
1167                 return false;
1168         }
1169
1170         if (DEBUGLEVEL >= 10) {
1171                 NDR_PRINT_IN_DEBUG(samr_CreateDomAlias, r);
1172         }
1173
1174         ZERO_STRUCT(r->out);
1175         r->out.alias_handle = talloc_zero(r, struct policy_handle);
1176         if (r->out.alias_handle == NULL) {
1177                 talloc_free(r);
1178                 return false;
1179         }
1180
1181         r->out.rid = talloc_zero(r, uint32_t);
1182         if (r->out.rid == NULL) {
1183                 talloc_free(r);
1184                 return false;
1185         }
1186
1187         r->out.result = _samr_CreateDomAlias(p, r);
1188
1189         if (p->rng_fault_state) {
1190                 talloc_free(r);
1191                 /* Return true here, srv_pipe_hnd.c will take care */
1192                 return true;
1193         }
1194
1195         if (DEBUGLEVEL >= 10) {
1196                 NDR_PRINT_OUT_DEBUG(samr_CreateDomAlias, r);
1197         }
1198
1199         push = ndr_push_init_ctx(r, NULL);
1200         if (push == NULL) {
1201                 talloc_free(r);
1202                 return false;
1203         }
1204
1205         ndr_err = call->ndr_push(push, NDR_OUT, r);
1206         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1207                 talloc_free(r);
1208                 return false;
1209         }
1210
1211         blob = ndr_push_blob(push);
1212         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
1213                 talloc_free(r);
1214                 return false;
1215         }
1216
1217         talloc_free(r);
1218
1219         return true;
1220 }
1221
1222 static bool api_samr_EnumDomainAliases(pipes_struct *p)
1223 {
1224         const struct ndr_interface_call *call;
1225         struct ndr_pull *pull;
1226         struct ndr_push *push;
1227         enum ndr_err_code ndr_err;
1228         DATA_BLOB blob;
1229         struct samr_EnumDomainAliases *r;
1230
1231         call = &ndr_table_samr.calls[NDR_SAMR_ENUMDOMAINALIASES];
1232
1233         r = talloc(talloc_tos(), struct samr_EnumDomainAliases);
1234         if (r == NULL) {
1235                 return false;
1236         }
1237
1238         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
1239                 talloc_free(r);
1240                 return false;
1241         }
1242
1243         pull = ndr_pull_init_blob(&blob, r, NULL);
1244         if (pull == NULL) {
1245                 talloc_free(r);
1246                 return false;
1247         }
1248
1249         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
1250         ndr_err = call->ndr_pull(pull, NDR_IN, r);
1251         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1252                 talloc_free(r);
1253                 return false;
1254         }
1255
1256         if (DEBUGLEVEL >= 10) {
1257                 NDR_PRINT_IN_DEBUG(samr_EnumDomainAliases, r);
1258         }
1259
1260         ZERO_STRUCT(r->out);
1261         r->out.resume_handle = r->in.resume_handle;
1262         r->out.sam = talloc_zero(r, struct samr_SamArray *);
1263         if (r->out.sam == NULL) {
1264                 talloc_free(r);
1265                 return false;
1266         }
1267
1268         r->out.num_entries = talloc_zero(r, uint32_t);
1269         if (r->out.num_entries == NULL) {
1270                 talloc_free(r);
1271                 return false;
1272         }
1273
1274         r->out.result = _samr_EnumDomainAliases(p, r);
1275
1276         if (p->rng_fault_state) {
1277                 talloc_free(r);
1278                 /* Return true here, srv_pipe_hnd.c will take care */
1279                 return true;
1280         }
1281
1282         if (DEBUGLEVEL >= 10) {
1283                 NDR_PRINT_OUT_DEBUG(samr_EnumDomainAliases, r);
1284         }
1285
1286         push = ndr_push_init_ctx(r, NULL);
1287         if (push == NULL) {
1288                 talloc_free(r);
1289                 return false;
1290         }
1291
1292         ndr_err = call->ndr_push(push, NDR_OUT, r);
1293         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1294                 talloc_free(r);
1295                 return false;
1296         }
1297
1298         blob = ndr_push_blob(push);
1299         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
1300                 talloc_free(r);
1301                 return false;
1302         }
1303
1304         talloc_free(r);
1305
1306         return true;
1307 }
1308
1309 static bool api_samr_GetAliasMembership(pipes_struct *p)
1310 {
1311         const struct ndr_interface_call *call;
1312         struct ndr_pull *pull;
1313         struct ndr_push *push;
1314         enum ndr_err_code ndr_err;
1315         DATA_BLOB blob;
1316         struct samr_GetAliasMembership *r;
1317
1318         call = &ndr_table_samr.calls[NDR_SAMR_GETALIASMEMBERSHIP];
1319
1320         r = talloc(talloc_tos(), struct samr_GetAliasMembership);
1321         if (r == NULL) {
1322                 return false;
1323         }
1324
1325         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
1326                 talloc_free(r);
1327                 return false;
1328         }
1329
1330         pull = ndr_pull_init_blob(&blob, r, NULL);
1331         if (pull == NULL) {
1332                 talloc_free(r);
1333                 return false;
1334         }
1335
1336         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
1337         ndr_err = call->ndr_pull(pull, NDR_IN, r);
1338         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1339                 talloc_free(r);
1340                 return false;
1341         }
1342
1343         if (DEBUGLEVEL >= 10) {
1344                 NDR_PRINT_IN_DEBUG(samr_GetAliasMembership, r);
1345         }
1346
1347         ZERO_STRUCT(r->out);
1348         r->out.rids = talloc_zero(r, struct samr_Ids);
1349         if (r->out.rids == NULL) {
1350                 talloc_free(r);
1351                 return false;
1352         }
1353
1354         r->out.result = _samr_GetAliasMembership(p, r);
1355
1356         if (p->rng_fault_state) {
1357                 talloc_free(r);
1358                 /* Return true here, srv_pipe_hnd.c will take care */
1359                 return true;
1360         }
1361
1362         if (DEBUGLEVEL >= 10) {
1363                 NDR_PRINT_OUT_DEBUG(samr_GetAliasMembership, r);
1364         }
1365
1366         push = ndr_push_init_ctx(r, NULL);
1367         if (push == NULL) {
1368                 talloc_free(r);
1369                 return false;
1370         }
1371
1372         ndr_err = call->ndr_push(push, NDR_OUT, r);
1373         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1374                 talloc_free(r);
1375                 return false;
1376         }
1377
1378         blob = ndr_push_blob(push);
1379         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
1380                 talloc_free(r);
1381                 return false;
1382         }
1383
1384         talloc_free(r);
1385
1386         return true;
1387 }
1388
1389 static bool api_samr_LookupNames(pipes_struct *p)
1390 {
1391         const struct ndr_interface_call *call;
1392         struct ndr_pull *pull;
1393         struct ndr_push *push;
1394         enum ndr_err_code ndr_err;
1395         DATA_BLOB blob;
1396         struct samr_LookupNames *r;
1397
1398         call = &ndr_table_samr.calls[NDR_SAMR_LOOKUPNAMES];
1399
1400         r = talloc(talloc_tos(), struct samr_LookupNames);
1401         if (r == NULL) {
1402                 return false;
1403         }
1404
1405         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
1406                 talloc_free(r);
1407                 return false;
1408         }
1409
1410         pull = ndr_pull_init_blob(&blob, r, NULL);
1411         if (pull == NULL) {
1412                 talloc_free(r);
1413                 return false;
1414         }
1415
1416         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
1417         ndr_err = call->ndr_pull(pull, NDR_IN, r);
1418         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1419                 talloc_free(r);
1420                 return false;
1421         }
1422
1423         if (DEBUGLEVEL >= 10) {
1424                 NDR_PRINT_IN_DEBUG(samr_LookupNames, r);
1425         }
1426
1427         ZERO_STRUCT(r->out);
1428         r->out.rids = talloc_zero(r, struct samr_Ids);
1429         if (r->out.rids == NULL) {
1430                 talloc_free(r);
1431                 return false;
1432         }
1433
1434         r->out.types = talloc_zero(r, struct samr_Ids);
1435         if (r->out.types == NULL) {
1436                 talloc_free(r);
1437                 return false;
1438         }
1439
1440         r->out.result = _samr_LookupNames(p, r);
1441
1442         if (p->rng_fault_state) {
1443                 talloc_free(r);
1444                 /* Return true here, srv_pipe_hnd.c will take care */
1445                 return true;
1446         }
1447
1448         if (DEBUGLEVEL >= 10) {
1449                 NDR_PRINT_OUT_DEBUG(samr_LookupNames, r);
1450         }
1451
1452         push = ndr_push_init_ctx(r, NULL);
1453         if (push == NULL) {
1454                 talloc_free(r);
1455                 return false;
1456         }
1457
1458         ndr_err = call->ndr_push(push, NDR_OUT, r);
1459         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1460                 talloc_free(r);
1461                 return false;
1462         }
1463
1464         blob = ndr_push_blob(push);
1465         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
1466                 talloc_free(r);
1467                 return false;
1468         }
1469
1470         talloc_free(r);
1471
1472         return true;
1473 }
1474
1475 static bool api_samr_LookupRids(pipes_struct *p)
1476 {
1477         const struct ndr_interface_call *call;
1478         struct ndr_pull *pull;
1479         struct ndr_push *push;
1480         enum ndr_err_code ndr_err;
1481         DATA_BLOB blob;
1482         struct samr_LookupRids *r;
1483
1484         call = &ndr_table_samr.calls[NDR_SAMR_LOOKUPRIDS];
1485
1486         r = talloc(talloc_tos(), struct samr_LookupRids);
1487         if (r == NULL) {
1488                 return false;
1489         }
1490
1491         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
1492                 talloc_free(r);
1493                 return false;
1494         }
1495
1496         pull = ndr_pull_init_blob(&blob, r, NULL);
1497         if (pull == NULL) {
1498                 talloc_free(r);
1499                 return false;
1500         }
1501
1502         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
1503         ndr_err = call->ndr_pull(pull, NDR_IN, r);
1504         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1505                 talloc_free(r);
1506                 return false;
1507         }
1508
1509         if (DEBUGLEVEL >= 10) {
1510                 NDR_PRINT_IN_DEBUG(samr_LookupRids, r);
1511         }
1512
1513         ZERO_STRUCT(r->out);
1514         r->out.names = talloc_zero(r, struct lsa_Strings);
1515         if (r->out.names == NULL) {
1516                 talloc_free(r);
1517                 return false;
1518         }
1519
1520         r->out.types = talloc_zero(r, struct samr_Ids);
1521         if (r->out.types == NULL) {
1522                 talloc_free(r);
1523                 return false;
1524         }
1525
1526         r->out.result = _samr_LookupRids(p, r);
1527
1528         if (p->rng_fault_state) {
1529                 talloc_free(r);
1530                 /* Return true here, srv_pipe_hnd.c will take care */
1531                 return true;
1532         }
1533
1534         if (DEBUGLEVEL >= 10) {
1535                 NDR_PRINT_OUT_DEBUG(samr_LookupRids, r);
1536         }
1537
1538         push = ndr_push_init_ctx(r, NULL);
1539         if (push == NULL) {
1540                 talloc_free(r);
1541                 return false;
1542         }
1543
1544         ndr_err = call->ndr_push(push, NDR_OUT, r);
1545         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1546                 talloc_free(r);
1547                 return false;
1548         }
1549
1550         blob = ndr_push_blob(push);
1551         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
1552                 talloc_free(r);
1553                 return false;
1554         }
1555
1556         talloc_free(r);
1557
1558         return true;
1559 }
1560
1561 static bool api_samr_OpenGroup(pipes_struct *p)
1562 {
1563         const struct ndr_interface_call *call;
1564         struct ndr_pull *pull;
1565         struct ndr_push *push;
1566         enum ndr_err_code ndr_err;
1567         DATA_BLOB blob;
1568         struct samr_OpenGroup *r;
1569
1570         call = &ndr_table_samr.calls[NDR_SAMR_OPENGROUP];
1571
1572         r = talloc(talloc_tos(), struct samr_OpenGroup);
1573         if (r == NULL) {
1574                 return false;
1575         }
1576
1577         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
1578                 talloc_free(r);
1579                 return false;
1580         }
1581
1582         pull = ndr_pull_init_blob(&blob, r, NULL);
1583         if (pull == NULL) {
1584                 talloc_free(r);
1585                 return false;
1586         }
1587
1588         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
1589         ndr_err = call->ndr_pull(pull, NDR_IN, r);
1590         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1591                 talloc_free(r);
1592                 return false;
1593         }
1594
1595         if (DEBUGLEVEL >= 10) {
1596                 NDR_PRINT_IN_DEBUG(samr_OpenGroup, r);
1597         }
1598
1599         ZERO_STRUCT(r->out);
1600         r->out.group_handle = talloc_zero(r, struct policy_handle);
1601         if (r->out.group_handle == NULL) {
1602                 talloc_free(r);
1603                 return false;
1604         }
1605
1606         r->out.result = _samr_OpenGroup(p, r);
1607
1608         if (p->rng_fault_state) {
1609                 talloc_free(r);
1610                 /* Return true here, srv_pipe_hnd.c will take care */
1611                 return true;
1612         }
1613
1614         if (DEBUGLEVEL >= 10) {
1615                 NDR_PRINT_OUT_DEBUG(samr_OpenGroup, r);
1616         }
1617
1618         push = ndr_push_init_ctx(r, NULL);
1619         if (push == NULL) {
1620                 talloc_free(r);
1621                 return false;
1622         }
1623
1624         ndr_err = call->ndr_push(push, NDR_OUT, r);
1625         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1626                 talloc_free(r);
1627                 return false;
1628         }
1629
1630         blob = ndr_push_blob(push);
1631         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
1632                 talloc_free(r);
1633                 return false;
1634         }
1635
1636         talloc_free(r);
1637
1638         return true;
1639 }
1640
1641 static bool api_samr_QueryGroupInfo(pipes_struct *p)
1642 {
1643         const struct ndr_interface_call *call;
1644         struct ndr_pull *pull;
1645         struct ndr_push *push;
1646         enum ndr_err_code ndr_err;
1647         DATA_BLOB blob;
1648         struct samr_QueryGroupInfo *r;
1649
1650         call = &ndr_table_samr.calls[NDR_SAMR_QUERYGROUPINFO];
1651
1652         r = talloc(talloc_tos(), struct samr_QueryGroupInfo);
1653         if (r == NULL) {
1654                 return false;
1655         }
1656
1657         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
1658                 talloc_free(r);
1659                 return false;
1660         }
1661
1662         pull = ndr_pull_init_blob(&blob, r, NULL);
1663         if (pull == NULL) {
1664                 talloc_free(r);
1665                 return false;
1666         }
1667
1668         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
1669         ndr_err = call->ndr_pull(pull, NDR_IN, r);
1670         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1671                 talloc_free(r);
1672                 return false;
1673         }
1674
1675         if (DEBUGLEVEL >= 10) {
1676                 NDR_PRINT_IN_DEBUG(samr_QueryGroupInfo, r);
1677         }
1678
1679         ZERO_STRUCT(r->out);
1680         r->out.info = talloc_zero(r, union samr_GroupInfo *);
1681         if (r->out.info == NULL) {
1682                 talloc_free(r);
1683                 return false;
1684         }
1685
1686         r->out.result = _samr_QueryGroupInfo(p, r);
1687
1688         if (p->rng_fault_state) {
1689                 talloc_free(r);
1690                 /* Return true here, srv_pipe_hnd.c will take care */
1691                 return true;
1692         }
1693
1694         if (DEBUGLEVEL >= 10) {
1695                 NDR_PRINT_OUT_DEBUG(samr_QueryGroupInfo, r);
1696         }
1697
1698         push = ndr_push_init_ctx(r, NULL);
1699         if (push == NULL) {
1700                 talloc_free(r);
1701                 return false;
1702         }
1703
1704         ndr_err = call->ndr_push(push, NDR_OUT, r);
1705         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1706                 talloc_free(r);
1707                 return false;
1708         }
1709
1710         blob = ndr_push_blob(push);
1711         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
1712                 talloc_free(r);
1713                 return false;
1714         }
1715
1716         talloc_free(r);
1717
1718         return true;
1719 }
1720
1721 static bool api_samr_SetGroupInfo(pipes_struct *p)
1722 {
1723         const struct ndr_interface_call *call;
1724         struct ndr_pull *pull;
1725         struct ndr_push *push;
1726         enum ndr_err_code ndr_err;
1727         DATA_BLOB blob;
1728         struct samr_SetGroupInfo *r;
1729
1730         call = &ndr_table_samr.calls[NDR_SAMR_SETGROUPINFO];
1731
1732         r = talloc(talloc_tos(), struct samr_SetGroupInfo);
1733         if (r == NULL) {
1734                 return false;
1735         }
1736
1737         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
1738                 talloc_free(r);
1739                 return false;
1740         }
1741
1742         pull = ndr_pull_init_blob(&blob, r, NULL);
1743         if (pull == NULL) {
1744                 talloc_free(r);
1745                 return false;
1746         }
1747
1748         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
1749         ndr_err = call->ndr_pull(pull, NDR_IN, r);
1750         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1751                 talloc_free(r);
1752                 return false;
1753         }
1754
1755         if (DEBUGLEVEL >= 10) {
1756                 NDR_PRINT_IN_DEBUG(samr_SetGroupInfo, r);
1757         }
1758
1759         r->out.result = _samr_SetGroupInfo(p, r);
1760
1761         if (p->rng_fault_state) {
1762                 talloc_free(r);
1763                 /* Return true here, srv_pipe_hnd.c will take care */
1764                 return true;
1765         }
1766
1767         if (DEBUGLEVEL >= 10) {
1768                 NDR_PRINT_OUT_DEBUG(samr_SetGroupInfo, r);
1769         }
1770
1771         push = ndr_push_init_ctx(r, NULL);
1772         if (push == NULL) {
1773                 talloc_free(r);
1774                 return false;
1775         }
1776
1777         ndr_err = call->ndr_push(push, NDR_OUT, r);
1778         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1779                 talloc_free(r);
1780                 return false;
1781         }
1782
1783         blob = ndr_push_blob(push);
1784         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
1785                 talloc_free(r);
1786                 return false;
1787         }
1788
1789         talloc_free(r);
1790
1791         return true;
1792 }
1793
1794 static bool api_samr_AddGroupMember(pipes_struct *p)
1795 {
1796         const struct ndr_interface_call *call;
1797         struct ndr_pull *pull;
1798         struct ndr_push *push;
1799         enum ndr_err_code ndr_err;
1800         DATA_BLOB blob;
1801         struct samr_AddGroupMember *r;
1802
1803         call = &ndr_table_samr.calls[NDR_SAMR_ADDGROUPMEMBER];
1804
1805         r = talloc(talloc_tos(), struct samr_AddGroupMember);
1806         if (r == NULL) {
1807                 return false;
1808         }
1809
1810         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
1811                 talloc_free(r);
1812                 return false;
1813         }
1814
1815         pull = ndr_pull_init_blob(&blob, r, NULL);
1816         if (pull == NULL) {
1817                 talloc_free(r);
1818                 return false;
1819         }
1820
1821         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
1822         ndr_err = call->ndr_pull(pull, NDR_IN, r);
1823         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1824                 talloc_free(r);
1825                 return false;
1826         }
1827
1828         if (DEBUGLEVEL >= 10) {
1829                 NDR_PRINT_IN_DEBUG(samr_AddGroupMember, r);
1830         }
1831
1832         r->out.result = _samr_AddGroupMember(p, r);
1833
1834         if (p->rng_fault_state) {
1835                 talloc_free(r);
1836                 /* Return true here, srv_pipe_hnd.c will take care */
1837                 return true;
1838         }
1839
1840         if (DEBUGLEVEL >= 10) {
1841                 NDR_PRINT_OUT_DEBUG(samr_AddGroupMember, r);
1842         }
1843
1844         push = ndr_push_init_ctx(r, NULL);
1845         if (push == NULL) {
1846                 talloc_free(r);
1847                 return false;
1848         }
1849
1850         ndr_err = call->ndr_push(push, NDR_OUT, r);
1851         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1852                 talloc_free(r);
1853                 return false;
1854         }
1855
1856         blob = ndr_push_blob(push);
1857         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
1858                 talloc_free(r);
1859                 return false;
1860         }
1861
1862         talloc_free(r);
1863
1864         return true;
1865 }
1866
1867 static bool api_samr_DeleteDomainGroup(pipes_struct *p)
1868 {
1869         const struct ndr_interface_call *call;
1870         struct ndr_pull *pull;
1871         struct ndr_push *push;
1872         enum ndr_err_code ndr_err;
1873         DATA_BLOB blob;
1874         struct samr_DeleteDomainGroup *r;
1875
1876         call = &ndr_table_samr.calls[NDR_SAMR_DELETEDOMAINGROUP];
1877
1878         r = talloc(talloc_tos(), struct samr_DeleteDomainGroup);
1879         if (r == NULL) {
1880                 return false;
1881         }
1882
1883         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
1884                 talloc_free(r);
1885                 return false;
1886         }
1887
1888         pull = ndr_pull_init_blob(&blob, r, NULL);
1889         if (pull == NULL) {
1890                 talloc_free(r);
1891                 return false;
1892         }
1893
1894         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
1895         ndr_err = call->ndr_pull(pull, NDR_IN, r);
1896         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1897                 talloc_free(r);
1898                 return false;
1899         }
1900
1901         if (DEBUGLEVEL >= 10) {
1902                 NDR_PRINT_IN_DEBUG(samr_DeleteDomainGroup, r);
1903         }
1904
1905         ZERO_STRUCT(r->out);
1906         r->out.group_handle = r->in.group_handle;
1907         r->out.result = _samr_DeleteDomainGroup(p, r);
1908
1909         if (p->rng_fault_state) {
1910                 talloc_free(r);
1911                 /* Return true here, srv_pipe_hnd.c will take care */
1912                 return true;
1913         }
1914
1915         if (DEBUGLEVEL >= 10) {
1916                 NDR_PRINT_OUT_DEBUG(samr_DeleteDomainGroup, r);
1917         }
1918
1919         push = ndr_push_init_ctx(r, NULL);
1920         if (push == NULL) {
1921                 talloc_free(r);
1922                 return false;
1923         }
1924
1925         ndr_err = call->ndr_push(push, NDR_OUT, r);
1926         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1927                 talloc_free(r);
1928                 return false;
1929         }
1930
1931         blob = ndr_push_blob(push);
1932         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
1933                 talloc_free(r);
1934                 return false;
1935         }
1936
1937         talloc_free(r);
1938
1939         return true;
1940 }
1941
1942 static bool api_samr_DeleteGroupMember(pipes_struct *p)
1943 {
1944         const struct ndr_interface_call *call;
1945         struct ndr_pull *pull;
1946         struct ndr_push *push;
1947         enum ndr_err_code ndr_err;
1948         DATA_BLOB blob;
1949         struct samr_DeleteGroupMember *r;
1950
1951         call = &ndr_table_samr.calls[NDR_SAMR_DELETEGROUPMEMBER];
1952
1953         r = talloc(talloc_tos(), struct samr_DeleteGroupMember);
1954         if (r == NULL) {
1955                 return false;
1956         }
1957
1958         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
1959                 talloc_free(r);
1960                 return false;
1961         }
1962
1963         pull = ndr_pull_init_blob(&blob, r, NULL);
1964         if (pull == NULL) {
1965                 talloc_free(r);
1966                 return false;
1967         }
1968
1969         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
1970         ndr_err = call->ndr_pull(pull, NDR_IN, r);
1971         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1972                 talloc_free(r);
1973                 return false;
1974         }
1975
1976         if (DEBUGLEVEL >= 10) {
1977                 NDR_PRINT_IN_DEBUG(samr_DeleteGroupMember, r);
1978         }
1979
1980         r->out.result = _samr_DeleteGroupMember(p, r);
1981
1982         if (p->rng_fault_state) {
1983                 talloc_free(r);
1984                 /* Return true here, srv_pipe_hnd.c will take care */
1985                 return true;
1986         }
1987
1988         if (DEBUGLEVEL >= 10) {
1989                 NDR_PRINT_OUT_DEBUG(samr_DeleteGroupMember, r);
1990         }
1991
1992         push = ndr_push_init_ctx(r, NULL);
1993         if (push == NULL) {
1994                 talloc_free(r);
1995                 return false;
1996         }
1997
1998         ndr_err = call->ndr_push(push, NDR_OUT, r);
1999         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2000                 talloc_free(r);
2001                 return false;
2002         }
2003
2004         blob = ndr_push_blob(push);
2005         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2006                 talloc_free(r);
2007                 return false;
2008         }
2009
2010         talloc_free(r);
2011
2012         return true;
2013 }
2014
2015 static bool api_samr_QueryGroupMember(pipes_struct *p)
2016 {
2017         const struct ndr_interface_call *call;
2018         struct ndr_pull *pull;
2019         struct ndr_push *push;
2020         enum ndr_err_code ndr_err;
2021         DATA_BLOB blob;
2022         struct samr_QueryGroupMember *r;
2023
2024         call = &ndr_table_samr.calls[NDR_SAMR_QUERYGROUPMEMBER];
2025
2026         r = talloc(talloc_tos(), struct samr_QueryGroupMember);
2027         if (r == NULL) {
2028                 return false;
2029         }
2030
2031         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2032                 talloc_free(r);
2033                 return false;
2034         }
2035
2036         pull = ndr_pull_init_blob(&blob, r, NULL);
2037         if (pull == NULL) {
2038                 talloc_free(r);
2039                 return false;
2040         }
2041
2042         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2043         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2044         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2045                 talloc_free(r);
2046                 return false;
2047         }
2048
2049         if (DEBUGLEVEL >= 10) {
2050                 NDR_PRINT_IN_DEBUG(samr_QueryGroupMember, r);
2051         }
2052
2053         ZERO_STRUCT(r->out);
2054         r->out.rids = talloc_zero(r, struct samr_RidTypeArray *);
2055         if (r->out.rids == NULL) {
2056                 talloc_free(r);
2057                 return false;
2058         }
2059
2060         r->out.result = _samr_QueryGroupMember(p, r);
2061
2062         if (p->rng_fault_state) {
2063                 talloc_free(r);
2064                 /* Return true here, srv_pipe_hnd.c will take care */
2065                 return true;
2066         }
2067
2068         if (DEBUGLEVEL >= 10) {
2069                 NDR_PRINT_OUT_DEBUG(samr_QueryGroupMember, r);
2070         }
2071
2072         push = ndr_push_init_ctx(r, NULL);
2073         if (push == NULL) {
2074                 talloc_free(r);
2075                 return false;
2076         }
2077
2078         ndr_err = call->ndr_push(push, NDR_OUT, r);
2079         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2080                 talloc_free(r);
2081                 return false;
2082         }
2083
2084         blob = ndr_push_blob(push);
2085         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2086                 talloc_free(r);
2087                 return false;
2088         }
2089
2090         talloc_free(r);
2091
2092         return true;
2093 }
2094
2095 static bool api_samr_SetMemberAttributesOfGroup(pipes_struct *p)
2096 {
2097         const struct ndr_interface_call *call;
2098         struct ndr_pull *pull;
2099         struct ndr_push *push;
2100         enum ndr_err_code ndr_err;
2101         DATA_BLOB blob;
2102         struct samr_SetMemberAttributesOfGroup *r;
2103
2104         call = &ndr_table_samr.calls[NDR_SAMR_SETMEMBERATTRIBUTESOFGROUP];
2105
2106         r = talloc(talloc_tos(), struct samr_SetMemberAttributesOfGroup);
2107         if (r == NULL) {
2108                 return false;
2109         }
2110
2111         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2112                 talloc_free(r);
2113                 return false;
2114         }
2115
2116         pull = ndr_pull_init_blob(&blob, r, NULL);
2117         if (pull == NULL) {
2118                 talloc_free(r);
2119                 return false;
2120         }
2121
2122         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2123         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2124         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2125                 talloc_free(r);
2126                 return false;
2127         }
2128
2129         if (DEBUGLEVEL >= 10) {
2130                 NDR_PRINT_IN_DEBUG(samr_SetMemberAttributesOfGroup, r);
2131         }
2132
2133         r->out.result = _samr_SetMemberAttributesOfGroup(p, r);
2134
2135         if (p->rng_fault_state) {
2136                 talloc_free(r);
2137                 /* Return true here, srv_pipe_hnd.c will take care */
2138                 return true;
2139         }
2140
2141         if (DEBUGLEVEL >= 10) {
2142                 NDR_PRINT_OUT_DEBUG(samr_SetMemberAttributesOfGroup, r);
2143         }
2144
2145         push = ndr_push_init_ctx(r, NULL);
2146         if (push == NULL) {
2147                 talloc_free(r);
2148                 return false;
2149         }
2150
2151         ndr_err = call->ndr_push(push, NDR_OUT, r);
2152         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2153                 talloc_free(r);
2154                 return false;
2155         }
2156
2157         blob = ndr_push_blob(push);
2158         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2159                 talloc_free(r);
2160                 return false;
2161         }
2162
2163         talloc_free(r);
2164
2165         return true;
2166 }
2167
2168 static bool api_samr_OpenAlias(pipes_struct *p)
2169 {
2170         const struct ndr_interface_call *call;
2171         struct ndr_pull *pull;
2172         struct ndr_push *push;
2173         enum ndr_err_code ndr_err;
2174         DATA_BLOB blob;
2175         struct samr_OpenAlias *r;
2176
2177         call = &ndr_table_samr.calls[NDR_SAMR_OPENALIAS];
2178
2179         r = talloc(talloc_tos(), struct samr_OpenAlias);
2180         if (r == NULL) {
2181                 return false;
2182         }
2183
2184         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2185                 talloc_free(r);
2186                 return false;
2187         }
2188
2189         pull = ndr_pull_init_blob(&blob, r, NULL);
2190         if (pull == NULL) {
2191                 talloc_free(r);
2192                 return false;
2193         }
2194
2195         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2196         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2197         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2198                 talloc_free(r);
2199                 return false;
2200         }
2201
2202         if (DEBUGLEVEL >= 10) {
2203                 NDR_PRINT_IN_DEBUG(samr_OpenAlias, r);
2204         }
2205
2206         ZERO_STRUCT(r->out);
2207         r->out.alias_handle = talloc_zero(r, struct policy_handle);
2208         if (r->out.alias_handle == NULL) {
2209                 talloc_free(r);
2210                 return false;
2211         }
2212
2213         r->out.result = _samr_OpenAlias(p, r);
2214
2215         if (p->rng_fault_state) {
2216                 talloc_free(r);
2217                 /* Return true here, srv_pipe_hnd.c will take care */
2218                 return true;
2219         }
2220
2221         if (DEBUGLEVEL >= 10) {
2222                 NDR_PRINT_OUT_DEBUG(samr_OpenAlias, r);
2223         }
2224
2225         push = ndr_push_init_ctx(r, NULL);
2226         if (push == NULL) {
2227                 talloc_free(r);
2228                 return false;
2229         }
2230
2231         ndr_err = call->ndr_push(push, NDR_OUT, r);
2232         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2233                 talloc_free(r);
2234                 return false;
2235         }
2236
2237         blob = ndr_push_blob(push);
2238         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2239                 talloc_free(r);
2240                 return false;
2241         }
2242
2243         talloc_free(r);
2244
2245         return true;
2246 }
2247
2248 static bool api_samr_QueryAliasInfo(pipes_struct *p)
2249 {
2250         const struct ndr_interface_call *call;
2251         struct ndr_pull *pull;
2252         struct ndr_push *push;
2253         enum ndr_err_code ndr_err;
2254         DATA_BLOB blob;
2255         struct samr_QueryAliasInfo *r;
2256
2257         call = &ndr_table_samr.calls[NDR_SAMR_QUERYALIASINFO];
2258
2259         r = talloc(talloc_tos(), struct samr_QueryAliasInfo);
2260         if (r == NULL) {
2261                 return false;
2262         }
2263
2264         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2265                 talloc_free(r);
2266                 return false;
2267         }
2268
2269         pull = ndr_pull_init_blob(&blob, r, NULL);
2270         if (pull == NULL) {
2271                 talloc_free(r);
2272                 return false;
2273         }
2274
2275         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2276         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2277         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2278                 talloc_free(r);
2279                 return false;
2280         }
2281
2282         if (DEBUGLEVEL >= 10) {
2283                 NDR_PRINT_IN_DEBUG(samr_QueryAliasInfo, r);
2284         }
2285
2286         ZERO_STRUCT(r->out);
2287         r->out.info = talloc_zero(r, union samr_AliasInfo *);
2288         if (r->out.info == NULL) {
2289                 talloc_free(r);
2290                 return false;
2291         }
2292
2293         r->out.result = _samr_QueryAliasInfo(p, r);
2294
2295         if (p->rng_fault_state) {
2296                 talloc_free(r);
2297                 /* Return true here, srv_pipe_hnd.c will take care */
2298                 return true;
2299         }
2300
2301         if (DEBUGLEVEL >= 10) {
2302                 NDR_PRINT_OUT_DEBUG(samr_QueryAliasInfo, r);
2303         }
2304
2305         push = ndr_push_init_ctx(r, NULL);
2306         if (push == NULL) {
2307                 talloc_free(r);
2308                 return false;
2309         }
2310
2311         ndr_err = call->ndr_push(push, NDR_OUT, r);
2312         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2313                 talloc_free(r);
2314                 return false;
2315         }
2316
2317         blob = ndr_push_blob(push);
2318         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2319                 talloc_free(r);
2320                 return false;
2321         }
2322
2323         talloc_free(r);
2324
2325         return true;
2326 }
2327
2328 static bool api_samr_SetAliasInfo(pipes_struct *p)
2329 {
2330         const struct ndr_interface_call *call;
2331         struct ndr_pull *pull;
2332         struct ndr_push *push;
2333         enum ndr_err_code ndr_err;
2334         DATA_BLOB blob;
2335         struct samr_SetAliasInfo *r;
2336
2337         call = &ndr_table_samr.calls[NDR_SAMR_SETALIASINFO];
2338
2339         r = talloc(talloc_tos(), struct samr_SetAliasInfo);
2340         if (r == NULL) {
2341                 return false;
2342         }
2343
2344         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2345                 talloc_free(r);
2346                 return false;
2347         }
2348
2349         pull = ndr_pull_init_blob(&blob, r, NULL);
2350         if (pull == NULL) {
2351                 talloc_free(r);
2352                 return false;
2353         }
2354
2355         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2356         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2357         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2358                 talloc_free(r);
2359                 return false;
2360         }
2361
2362         if (DEBUGLEVEL >= 10) {
2363                 NDR_PRINT_IN_DEBUG(samr_SetAliasInfo, r);
2364         }
2365
2366         r->out.result = _samr_SetAliasInfo(p, r);
2367
2368         if (p->rng_fault_state) {
2369                 talloc_free(r);
2370                 /* Return true here, srv_pipe_hnd.c will take care */
2371                 return true;
2372         }
2373
2374         if (DEBUGLEVEL >= 10) {
2375                 NDR_PRINT_OUT_DEBUG(samr_SetAliasInfo, r);
2376         }
2377
2378         push = ndr_push_init_ctx(r, NULL);
2379         if (push == NULL) {
2380                 talloc_free(r);
2381                 return false;
2382         }
2383
2384         ndr_err = call->ndr_push(push, NDR_OUT, r);
2385         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2386                 talloc_free(r);
2387                 return false;
2388         }
2389
2390         blob = ndr_push_blob(push);
2391         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2392                 talloc_free(r);
2393                 return false;
2394         }
2395
2396         talloc_free(r);
2397
2398         return true;
2399 }
2400
2401 static bool api_samr_DeleteDomAlias(pipes_struct *p)
2402 {
2403         const struct ndr_interface_call *call;
2404         struct ndr_pull *pull;
2405         struct ndr_push *push;
2406         enum ndr_err_code ndr_err;
2407         DATA_BLOB blob;
2408         struct samr_DeleteDomAlias *r;
2409
2410         call = &ndr_table_samr.calls[NDR_SAMR_DELETEDOMALIAS];
2411
2412         r = talloc(talloc_tos(), struct samr_DeleteDomAlias);
2413         if (r == NULL) {
2414                 return false;
2415         }
2416
2417         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2418                 talloc_free(r);
2419                 return false;
2420         }
2421
2422         pull = ndr_pull_init_blob(&blob, r, NULL);
2423         if (pull == NULL) {
2424                 talloc_free(r);
2425                 return false;
2426         }
2427
2428         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2429         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2430         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2431                 talloc_free(r);
2432                 return false;
2433         }
2434
2435         if (DEBUGLEVEL >= 10) {
2436                 NDR_PRINT_IN_DEBUG(samr_DeleteDomAlias, r);
2437         }
2438
2439         ZERO_STRUCT(r->out);
2440         r->out.alias_handle = r->in.alias_handle;
2441         r->out.result = _samr_DeleteDomAlias(p, r);
2442
2443         if (p->rng_fault_state) {
2444                 talloc_free(r);
2445                 /* Return true here, srv_pipe_hnd.c will take care */
2446                 return true;
2447         }
2448
2449         if (DEBUGLEVEL >= 10) {
2450                 NDR_PRINT_OUT_DEBUG(samr_DeleteDomAlias, r);
2451         }
2452
2453         push = ndr_push_init_ctx(r, NULL);
2454         if (push == NULL) {
2455                 talloc_free(r);
2456                 return false;
2457         }
2458
2459         ndr_err = call->ndr_push(push, NDR_OUT, r);
2460         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2461                 talloc_free(r);
2462                 return false;
2463         }
2464
2465         blob = ndr_push_blob(push);
2466         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2467                 talloc_free(r);
2468                 return false;
2469         }
2470
2471         talloc_free(r);
2472
2473         return true;
2474 }
2475
2476 static bool api_samr_AddAliasMember(pipes_struct *p)
2477 {
2478         const struct ndr_interface_call *call;
2479         struct ndr_pull *pull;
2480         struct ndr_push *push;
2481         enum ndr_err_code ndr_err;
2482         DATA_BLOB blob;
2483         struct samr_AddAliasMember *r;
2484
2485         call = &ndr_table_samr.calls[NDR_SAMR_ADDALIASMEMBER];
2486
2487         r = talloc(talloc_tos(), struct samr_AddAliasMember);
2488         if (r == NULL) {
2489                 return false;
2490         }
2491
2492         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2493                 talloc_free(r);
2494                 return false;
2495         }
2496
2497         pull = ndr_pull_init_blob(&blob, r, NULL);
2498         if (pull == NULL) {
2499                 talloc_free(r);
2500                 return false;
2501         }
2502
2503         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2504         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2505         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2506                 talloc_free(r);
2507                 return false;
2508         }
2509
2510         if (DEBUGLEVEL >= 10) {
2511                 NDR_PRINT_IN_DEBUG(samr_AddAliasMember, r);
2512         }
2513
2514         r->out.result = _samr_AddAliasMember(p, r);
2515
2516         if (p->rng_fault_state) {
2517                 talloc_free(r);
2518                 /* Return true here, srv_pipe_hnd.c will take care */
2519                 return true;
2520         }
2521
2522         if (DEBUGLEVEL >= 10) {
2523                 NDR_PRINT_OUT_DEBUG(samr_AddAliasMember, r);
2524         }
2525
2526         push = ndr_push_init_ctx(r, NULL);
2527         if (push == NULL) {
2528                 talloc_free(r);
2529                 return false;
2530         }
2531
2532         ndr_err = call->ndr_push(push, NDR_OUT, r);
2533         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2534                 talloc_free(r);
2535                 return false;
2536         }
2537
2538         blob = ndr_push_blob(push);
2539         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2540                 talloc_free(r);
2541                 return false;
2542         }
2543
2544         talloc_free(r);
2545
2546         return true;
2547 }
2548
2549 static bool api_samr_DeleteAliasMember(pipes_struct *p)
2550 {
2551         const struct ndr_interface_call *call;
2552         struct ndr_pull *pull;
2553         struct ndr_push *push;
2554         enum ndr_err_code ndr_err;
2555         DATA_BLOB blob;
2556         struct samr_DeleteAliasMember *r;
2557
2558         call = &ndr_table_samr.calls[NDR_SAMR_DELETEALIASMEMBER];
2559
2560         r = talloc(talloc_tos(), struct samr_DeleteAliasMember);
2561         if (r == NULL) {
2562                 return false;
2563         }
2564
2565         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2566                 talloc_free(r);
2567                 return false;
2568         }
2569
2570         pull = ndr_pull_init_blob(&blob, r, NULL);
2571         if (pull == NULL) {
2572                 talloc_free(r);
2573                 return false;
2574         }
2575
2576         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2577         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2578         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2579                 talloc_free(r);
2580                 return false;
2581         }
2582
2583         if (DEBUGLEVEL >= 10) {
2584                 NDR_PRINT_IN_DEBUG(samr_DeleteAliasMember, r);
2585         }
2586
2587         r->out.result = _samr_DeleteAliasMember(p, r);
2588
2589         if (p->rng_fault_state) {
2590                 talloc_free(r);
2591                 /* Return true here, srv_pipe_hnd.c will take care */
2592                 return true;
2593         }
2594
2595         if (DEBUGLEVEL >= 10) {
2596                 NDR_PRINT_OUT_DEBUG(samr_DeleteAliasMember, r);
2597         }
2598
2599         push = ndr_push_init_ctx(r, NULL);
2600         if (push == NULL) {
2601                 talloc_free(r);
2602                 return false;
2603         }
2604
2605         ndr_err = call->ndr_push(push, NDR_OUT, r);
2606         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2607                 talloc_free(r);
2608                 return false;
2609         }
2610
2611         blob = ndr_push_blob(push);
2612         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2613                 talloc_free(r);
2614                 return false;
2615         }
2616
2617         talloc_free(r);
2618
2619         return true;
2620 }
2621
2622 static bool api_samr_GetMembersInAlias(pipes_struct *p)
2623 {
2624         const struct ndr_interface_call *call;
2625         struct ndr_pull *pull;
2626         struct ndr_push *push;
2627         enum ndr_err_code ndr_err;
2628         DATA_BLOB blob;
2629         struct samr_GetMembersInAlias *r;
2630
2631         call = &ndr_table_samr.calls[NDR_SAMR_GETMEMBERSINALIAS];
2632
2633         r = talloc(talloc_tos(), struct samr_GetMembersInAlias);
2634         if (r == NULL) {
2635                 return false;
2636         }
2637
2638         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2639                 talloc_free(r);
2640                 return false;
2641         }
2642
2643         pull = ndr_pull_init_blob(&blob, r, NULL);
2644         if (pull == NULL) {
2645                 talloc_free(r);
2646                 return false;
2647         }
2648
2649         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2650         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2651         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2652                 talloc_free(r);
2653                 return false;
2654         }
2655
2656         if (DEBUGLEVEL >= 10) {
2657                 NDR_PRINT_IN_DEBUG(samr_GetMembersInAlias, r);
2658         }
2659
2660         ZERO_STRUCT(r->out);
2661         r->out.sids = talloc_zero(r, struct lsa_SidArray);
2662         if (r->out.sids == NULL) {
2663                 talloc_free(r);
2664                 return false;
2665         }
2666
2667         r->out.result = _samr_GetMembersInAlias(p, r);
2668
2669         if (p->rng_fault_state) {
2670                 talloc_free(r);
2671                 /* Return true here, srv_pipe_hnd.c will take care */
2672                 return true;
2673         }
2674
2675         if (DEBUGLEVEL >= 10) {
2676                 NDR_PRINT_OUT_DEBUG(samr_GetMembersInAlias, r);
2677         }
2678
2679         push = ndr_push_init_ctx(r, NULL);
2680         if (push == NULL) {
2681                 talloc_free(r);
2682                 return false;
2683         }
2684
2685         ndr_err = call->ndr_push(push, NDR_OUT, r);
2686         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2687                 talloc_free(r);
2688                 return false;
2689         }
2690
2691         blob = ndr_push_blob(push);
2692         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2693                 talloc_free(r);
2694                 return false;
2695         }
2696
2697         talloc_free(r);
2698
2699         return true;
2700 }
2701
2702 static bool api_samr_OpenUser(pipes_struct *p)
2703 {
2704         const struct ndr_interface_call *call;
2705         struct ndr_pull *pull;
2706         struct ndr_push *push;
2707         enum ndr_err_code ndr_err;
2708         DATA_BLOB blob;
2709         struct samr_OpenUser *r;
2710
2711         call = &ndr_table_samr.calls[NDR_SAMR_OPENUSER];
2712
2713         r = talloc(talloc_tos(), struct samr_OpenUser);
2714         if (r == NULL) {
2715                 return false;
2716         }
2717
2718         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2719                 talloc_free(r);
2720                 return false;
2721         }
2722
2723         pull = ndr_pull_init_blob(&blob, r, NULL);
2724         if (pull == NULL) {
2725                 talloc_free(r);
2726                 return false;
2727         }
2728
2729         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2730         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2731         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2732                 talloc_free(r);
2733                 return false;
2734         }
2735
2736         if (DEBUGLEVEL >= 10) {
2737                 NDR_PRINT_IN_DEBUG(samr_OpenUser, r);
2738         }
2739
2740         ZERO_STRUCT(r->out);
2741         r->out.user_handle = talloc_zero(r, struct policy_handle);
2742         if (r->out.user_handle == NULL) {
2743                 talloc_free(r);
2744                 return false;
2745         }
2746
2747         r->out.result = _samr_OpenUser(p, r);
2748
2749         if (p->rng_fault_state) {
2750                 talloc_free(r);
2751                 /* Return true here, srv_pipe_hnd.c will take care */
2752                 return true;
2753         }
2754
2755         if (DEBUGLEVEL >= 10) {
2756                 NDR_PRINT_OUT_DEBUG(samr_OpenUser, r);
2757         }
2758
2759         push = ndr_push_init_ctx(r, NULL);
2760         if (push == NULL) {
2761                 talloc_free(r);
2762                 return false;
2763         }
2764
2765         ndr_err = call->ndr_push(push, NDR_OUT, r);
2766         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2767                 talloc_free(r);
2768                 return false;
2769         }
2770
2771         blob = ndr_push_blob(push);
2772         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2773                 talloc_free(r);
2774                 return false;
2775         }
2776
2777         talloc_free(r);
2778
2779         return true;
2780 }
2781
2782 static bool api_samr_DeleteUser(pipes_struct *p)
2783 {
2784         const struct ndr_interface_call *call;
2785         struct ndr_pull *pull;
2786         struct ndr_push *push;
2787         enum ndr_err_code ndr_err;
2788         DATA_BLOB blob;
2789         struct samr_DeleteUser *r;
2790
2791         call = &ndr_table_samr.calls[NDR_SAMR_DELETEUSER];
2792
2793         r = talloc(talloc_tos(), struct samr_DeleteUser);
2794         if (r == NULL) {
2795                 return false;
2796         }
2797
2798         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2799                 talloc_free(r);
2800                 return false;
2801         }
2802
2803         pull = ndr_pull_init_blob(&blob, r, NULL);
2804         if (pull == NULL) {
2805                 talloc_free(r);
2806                 return false;
2807         }
2808
2809         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2810         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2811         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2812                 talloc_free(r);
2813                 return false;
2814         }
2815
2816         if (DEBUGLEVEL >= 10) {
2817                 NDR_PRINT_IN_DEBUG(samr_DeleteUser, r);
2818         }
2819
2820         ZERO_STRUCT(r->out);
2821         r->out.user_handle = r->in.user_handle;
2822         r->out.result = _samr_DeleteUser(p, r);
2823
2824         if (p->rng_fault_state) {
2825                 talloc_free(r);
2826                 /* Return true here, srv_pipe_hnd.c will take care */
2827                 return true;
2828         }
2829
2830         if (DEBUGLEVEL >= 10) {
2831                 NDR_PRINT_OUT_DEBUG(samr_DeleteUser, r);
2832         }
2833
2834         push = ndr_push_init_ctx(r, NULL);
2835         if (push == NULL) {
2836                 talloc_free(r);
2837                 return false;
2838         }
2839
2840         ndr_err = call->ndr_push(push, NDR_OUT, r);
2841         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2842                 talloc_free(r);
2843                 return false;
2844         }
2845
2846         blob = ndr_push_blob(push);
2847         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2848                 talloc_free(r);
2849                 return false;
2850         }
2851
2852         talloc_free(r);
2853
2854         return true;
2855 }
2856
2857 static bool api_samr_QueryUserInfo(pipes_struct *p)
2858 {
2859         const struct ndr_interface_call *call;
2860         struct ndr_pull *pull;
2861         struct ndr_push *push;
2862         enum ndr_err_code ndr_err;
2863         DATA_BLOB blob;
2864         struct samr_QueryUserInfo *r;
2865
2866         call = &ndr_table_samr.calls[NDR_SAMR_QUERYUSERINFO];
2867
2868         r = talloc(talloc_tos(), struct samr_QueryUserInfo);
2869         if (r == NULL) {
2870                 return false;
2871         }
2872
2873         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2874                 talloc_free(r);
2875                 return false;
2876         }
2877
2878         pull = ndr_pull_init_blob(&blob, r, NULL);
2879         if (pull == NULL) {
2880                 talloc_free(r);
2881                 return false;
2882         }
2883
2884         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2885         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2886         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2887                 talloc_free(r);
2888                 return false;
2889         }
2890
2891         if (DEBUGLEVEL >= 10) {
2892                 NDR_PRINT_IN_DEBUG(samr_QueryUserInfo, r);
2893         }
2894
2895         ZERO_STRUCT(r->out);
2896         r->out.info = talloc_zero(r, union samr_UserInfo *);
2897         if (r->out.info == NULL) {
2898                 talloc_free(r);
2899                 return false;
2900         }
2901
2902         r->out.result = _samr_QueryUserInfo(p, r);
2903
2904         if (p->rng_fault_state) {
2905                 talloc_free(r);
2906                 /* Return true here, srv_pipe_hnd.c will take care */
2907                 return true;
2908         }
2909
2910         if (DEBUGLEVEL >= 10) {
2911                 NDR_PRINT_OUT_DEBUG(samr_QueryUserInfo, r);
2912         }
2913
2914         push = ndr_push_init_ctx(r, NULL);
2915         if (push == NULL) {
2916                 talloc_free(r);
2917                 return false;
2918         }
2919
2920         ndr_err = call->ndr_push(push, NDR_OUT, r);
2921         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2922                 talloc_free(r);
2923                 return false;
2924         }
2925
2926         blob = ndr_push_blob(push);
2927         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
2928                 talloc_free(r);
2929                 return false;
2930         }
2931
2932         talloc_free(r);
2933
2934         return true;
2935 }
2936
2937 static bool api_samr_SetUserInfo(pipes_struct *p)
2938 {
2939         const struct ndr_interface_call *call;
2940         struct ndr_pull *pull;
2941         struct ndr_push *push;
2942         enum ndr_err_code ndr_err;
2943         DATA_BLOB blob;
2944         struct samr_SetUserInfo *r;
2945
2946         call = &ndr_table_samr.calls[NDR_SAMR_SETUSERINFO];
2947
2948         r = talloc(talloc_tos(), struct samr_SetUserInfo);
2949         if (r == NULL) {
2950                 return false;
2951         }
2952
2953         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
2954                 talloc_free(r);
2955                 return false;
2956         }
2957
2958         pull = ndr_pull_init_blob(&blob, r, NULL);
2959         if (pull == NULL) {
2960                 talloc_free(r);
2961                 return false;
2962         }
2963
2964         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
2965         ndr_err = call->ndr_pull(pull, NDR_IN, r);
2966         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2967                 talloc_free(r);
2968                 return false;
2969         }
2970
2971         if (DEBUGLEVEL >= 10) {
2972                 NDR_PRINT_IN_DEBUG(samr_SetUserInfo, r);
2973         }
2974
2975         r->out.result = _samr_SetUserInfo(p, r);
2976
2977         if (p->rng_fault_state) {
2978                 talloc_free(r);
2979                 /* Return true here, srv_pipe_hnd.c will take care */
2980                 return true;
2981         }
2982
2983         if (DEBUGLEVEL >= 10) {
2984                 NDR_PRINT_OUT_DEBUG(samr_SetUserInfo, r);
2985         }
2986
2987         push = ndr_push_init_ctx(r, NULL);
2988         if (push == NULL) {
2989                 talloc_free(r);
2990                 return false;
2991         }
2992
2993         ndr_err = call->ndr_push(push, NDR_OUT, r);
2994         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
2995                 talloc_free(r);
2996                 return false;
2997         }
2998
2999         blob = ndr_push_blob(push);
3000         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3001                 talloc_free(r);
3002                 return false;
3003         }
3004
3005         talloc_free(r);
3006
3007         return true;
3008 }
3009
3010 static bool api_samr_ChangePasswordUser(pipes_struct *p)
3011 {
3012         const struct ndr_interface_call *call;
3013         struct ndr_pull *pull;
3014         struct ndr_push *push;
3015         enum ndr_err_code ndr_err;
3016         DATA_BLOB blob;
3017         struct samr_ChangePasswordUser *r;
3018
3019         call = &ndr_table_samr.calls[NDR_SAMR_CHANGEPASSWORDUSER];
3020
3021         r = talloc(talloc_tos(), struct samr_ChangePasswordUser);
3022         if (r == NULL) {
3023                 return false;
3024         }
3025
3026         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3027                 talloc_free(r);
3028                 return false;
3029         }
3030
3031         pull = ndr_pull_init_blob(&blob, r, NULL);
3032         if (pull == NULL) {
3033                 talloc_free(r);
3034                 return false;
3035         }
3036
3037         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3038         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3039         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3040                 talloc_free(r);
3041                 return false;
3042         }
3043
3044         if (DEBUGLEVEL >= 10) {
3045                 NDR_PRINT_IN_DEBUG(samr_ChangePasswordUser, r);
3046         }
3047
3048         r->out.result = _samr_ChangePasswordUser(p, r);
3049
3050         if (p->rng_fault_state) {
3051                 talloc_free(r);
3052                 /* Return true here, srv_pipe_hnd.c will take care */
3053                 return true;
3054         }
3055
3056         if (DEBUGLEVEL >= 10) {
3057                 NDR_PRINT_OUT_DEBUG(samr_ChangePasswordUser, r);
3058         }
3059
3060         push = ndr_push_init_ctx(r, NULL);
3061         if (push == NULL) {
3062                 talloc_free(r);
3063                 return false;
3064         }
3065
3066         ndr_err = call->ndr_push(push, NDR_OUT, r);
3067         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3068                 talloc_free(r);
3069                 return false;
3070         }
3071
3072         blob = ndr_push_blob(push);
3073         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3074                 talloc_free(r);
3075                 return false;
3076         }
3077
3078         talloc_free(r);
3079
3080         return true;
3081 }
3082
3083 static bool api_samr_GetGroupsForUser(pipes_struct *p)
3084 {
3085         const struct ndr_interface_call *call;
3086         struct ndr_pull *pull;
3087         struct ndr_push *push;
3088         enum ndr_err_code ndr_err;
3089         DATA_BLOB blob;
3090         struct samr_GetGroupsForUser *r;
3091
3092         call = &ndr_table_samr.calls[NDR_SAMR_GETGROUPSFORUSER];
3093
3094         r = talloc(talloc_tos(), struct samr_GetGroupsForUser);
3095         if (r == NULL) {
3096                 return false;
3097         }
3098
3099         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3100                 talloc_free(r);
3101                 return false;
3102         }
3103
3104         pull = ndr_pull_init_blob(&blob, r, NULL);
3105         if (pull == NULL) {
3106                 talloc_free(r);
3107                 return false;
3108         }
3109
3110         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3111         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3112         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3113                 talloc_free(r);
3114                 return false;
3115         }
3116
3117         if (DEBUGLEVEL >= 10) {
3118                 NDR_PRINT_IN_DEBUG(samr_GetGroupsForUser, r);
3119         }
3120
3121         ZERO_STRUCT(r->out);
3122         r->out.rids = talloc_zero(r, struct samr_RidWithAttributeArray *);
3123         if (r->out.rids == NULL) {
3124                 talloc_free(r);
3125                 return false;
3126         }
3127
3128         r->out.result = _samr_GetGroupsForUser(p, r);
3129
3130         if (p->rng_fault_state) {
3131                 talloc_free(r);
3132                 /* Return true here, srv_pipe_hnd.c will take care */
3133                 return true;
3134         }
3135
3136         if (DEBUGLEVEL >= 10) {
3137                 NDR_PRINT_OUT_DEBUG(samr_GetGroupsForUser, r);
3138         }
3139
3140         push = ndr_push_init_ctx(r, NULL);
3141         if (push == NULL) {
3142                 talloc_free(r);
3143                 return false;
3144         }
3145
3146         ndr_err = call->ndr_push(push, NDR_OUT, r);
3147         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3148                 talloc_free(r);
3149                 return false;
3150         }
3151
3152         blob = ndr_push_blob(push);
3153         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3154                 talloc_free(r);
3155                 return false;
3156         }
3157
3158         talloc_free(r);
3159
3160         return true;
3161 }
3162
3163 static bool api_samr_QueryDisplayInfo(pipes_struct *p)
3164 {
3165         const struct ndr_interface_call *call;
3166         struct ndr_pull *pull;
3167         struct ndr_push *push;
3168         enum ndr_err_code ndr_err;
3169         DATA_BLOB blob;
3170         struct samr_QueryDisplayInfo *r;
3171
3172         call = &ndr_table_samr.calls[NDR_SAMR_QUERYDISPLAYINFO];
3173
3174         r = talloc(talloc_tos(), struct samr_QueryDisplayInfo);
3175         if (r == NULL) {
3176                 return false;
3177         }
3178
3179         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3180                 talloc_free(r);
3181                 return false;
3182         }
3183
3184         pull = ndr_pull_init_blob(&blob, r, NULL);
3185         if (pull == NULL) {
3186                 talloc_free(r);
3187                 return false;
3188         }
3189
3190         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3191         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3192         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3193                 talloc_free(r);
3194                 return false;
3195         }
3196
3197         if (DEBUGLEVEL >= 10) {
3198                 NDR_PRINT_IN_DEBUG(samr_QueryDisplayInfo, r);
3199         }
3200
3201         ZERO_STRUCT(r->out);
3202         r->out.total_size = talloc_zero(r, uint32_t);
3203         if (r->out.total_size == NULL) {
3204                 talloc_free(r);
3205                 return false;
3206         }
3207
3208         r->out.returned_size = talloc_zero(r, uint32_t);
3209         if (r->out.returned_size == NULL) {
3210                 talloc_free(r);
3211                 return false;
3212         }
3213
3214         r->out.info = talloc_zero(r, union samr_DispInfo);
3215         if (r->out.info == NULL) {
3216                 talloc_free(r);
3217                 return false;
3218         }
3219
3220         r->out.result = _samr_QueryDisplayInfo(p, r);
3221
3222         if (p->rng_fault_state) {
3223                 talloc_free(r);
3224                 /* Return true here, srv_pipe_hnd.c will take care */
3225                 return true;
3226         }
3227
3228         if (DEBUGLEVEL >= 10) {
3229                 NDR_PRINT_OUT_DEBUG(samr_QueryDisplayInfo, r);
3230         }
3231
3232         push = ndr_push_init_ctx(r, NULL);
3233         if (push == NULL) {
3234                 talloc_free(r);
3235                 return false;
3236         }
3237
3238         ndr_err = call->ndr_push(push, NDR_OUT, r);
3239         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3240                 talloc_free(r);
3241                 return false;
3242         }
3243
3244         blob = ndr_push_blob(push);
3245         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3246                 talloc_free(r);
3247                 return false;
3248         }
3249
3250         talloc_free(r);
3251
3252         return true;
3253 }
3254
3255 static bool api_samr_GetDisplayEnumerationIndex(pipes_struct *p)
3256 {
3257         const struct ndr_interface_call *call;
3258         struct ndr_pull *pull;
3259         struct ndr_push *push;
3260         enum ndr_err_code ndr_err;
3261         DATA_BLOB blob;
3262         struct samr_GetDisplayEnumerationIndex *r;
3263
3264         call = &ndr_table_samr.calls[NDR_SAMR_GETDISPLAYENUMERATIONINDEX];
3265
3266         r = talloc(talloc_tos(), struct samr_GetDisplayEnumerationIndex);
3267         if (r == NULL) {
3268                 return false;
3269         }
3270
3271         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3272                 talloc_free(r);
3273                 return false;
3274         }
3275
3276         pull = ndr_pull_init_blob(&blob, r, NULL);
3277         if (pull == NULL) {
3278                 talloc_free(r);
3279                 return false;
3280         }
3281
3282         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3283         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3284         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3285                 talloc_free(r);
3286                 return false;
3287         }
3288
3289         if (DEBUGLEVEL >= 10) {
3290                 NDR_PRINT_IN_DEBUG(samr_GetDisplayEnumerationIndex, r);
3291         }
3292
3293         ZERO_STRUCT(r->out);
3294         r->out.idx = talloc_zero(r, uint32_t);
3295         if (r->out.idx == NULL) {
3296                 talloc_free(r);
3297                 return false;
3298         }
3299
3300         r->out.result = _samr_GetDisplayEnumerationIndex(p, r);
3301
3302         if (p->rng_fault_state) {
3303                 talloc_free(r);
3304                 /* Return true here, srv_pipe_hnd.c will take care */
3305                 return true;
3306         }
3307
3308         if (DEBUGLEVEL >= 10) {
3309                 NDR_PRINT_OUT_DEBUG(samr_GetDisplayEnumerationIndex, r);
3310         }
3311
3312         push = ndr_push_init_ctx(r, NULL);
3313         if (push == NULL) {
3314                 talloc_free(r);
3315                 return false;
3316         }
3317
3318         ndr_err = call->ndr_push(push, NDR_OUT, r);
3319         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3320                 talloc_free(r);
3321                 return false;
3322         }
3323
3324         blob = ndr_push_blob(push);
3325         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3326                 talloc_free(r);
3327                 return false;
3328         }
3329
3330         talloc_free(r);
3331
3332         return true;
3333 }
3334
3335 static bool api_samr_TestPrivateFunctionsDomain(pipes_struct *p)
3336 {
3337         const struct ndr_interface_call *call;
3338         struct ndr_pull *pull;
3339         struct ndr_push *push;
3340         enum ndr_err_code ndr_err;
3341         DATA_BLOB blob;
3342         struct samr_TestPrivateFunctionsDomain *r;
3343
3344         call = &ndr_table_samr.calls[NDR_SAMR_TESTPRIVATEFUNCTIONSDOMAIN];
3345
3346         r = talloc(talloc_tos(), struct samr_TestPrivateFunctionsDomain);
3347         if (r == NULL) {
3348                 return false;
3349         }
3350
3351         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3352                 talloc_free(r);
3353                 return false;
3354         }
3355
3356         pull = ndr_pull_init_blob(&blob, r, NULL);
3357         if (pull == NULL) {
3358                 talloc_free(r);
3359                 return false;
3360         }
3361
3362         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3363         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3364         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3365                 talloc_free(r);
3366                 return false;
3367         }
3368
3369         if (DEBUGLEVEL >= 10) {
3370                 NDR_PRINT_IN_DEBUG(samr_TestPrivateFunctionsDomain, r);
3371         }
3372
3373         r->out.result = _samr_TestPrivateFunctionsDomain(p, r);
3374
3375         if (p->rng_fault_state) {
3376                 talloc_free(r);
3377                 /* Return true here, srv_pipe_hnd.c will take care */
3378                 return true;
3379         }
3380
3381         if (DEBUGLEVEL >= 10) {
3382                 NDR_PRINT_OUT_DEBUG(samr_TestPrivateFunctionsDomain, r);
3383         }
3384
3385         push = ndr_push_init_ctx(r, NULL);
3386         if (push == NULL) {
3387                 talloc_free(r);
3388                 return false;
3389         }
3390
3391         ndr_err = call->ndr_push(push, NDR_OUT, r);
3392         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3393                 talloc_free(r);
3394                 return false;
3395         }
3396
3397         blob = ndr_push_blob(push);
3398         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3399                 talloc_free(r);
3400                 return false;
3401         }
3402
3403         talloc_free(r);
3404
3405         return true;
3406 }
3407
3408 static bool api_samr_TestPrivateFunctionsUser(pipes_struct *p)
3409 {
3410         const struct ndr_interface_call *call;
3411         struct ndr_pull *pull;
3412         struct ndr_push *push;
3413         enum ndr_err_code ndr_err;
3414         DATA_BLOB blob;
3415         struct samr_TestPrivateFunctionsUser *r;
3416
3417         call = &ndr_table_samr.calls[NDR_SAMR_TESTPRIVATEFUNCTIONSUSER];
3418
3419         r = talloc(talloc_tos(), struct samr_TestPrivateFunctionsUser);
3420         if (r == NULL) {
3421                 return false;
3422         }
3423
3424         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3425                 talloc_free(r);
3426                 return false;
3427         }
3428
3429         pull = ndr_pull_init_blob(&blob, r, NULL);
3430         if (pull == NULL) {
3431                 talloc_free(r);
3432                 return false;
3433         }
3434
3435         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3436         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3437         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3438                 talloc_free(r);
3439                 return false;
3440         }
3441
3442         if (DEBUGLEVEL >= 10) {
3443                 NDR_PRINT_IN_DEBUG(samr_TestPrivateFunctionsUser, r);
3444         }
3445
3446         r->out.result = _samr_TestPrivateFunctionsUser(p, r);
3447
3448         if (p->rng_fault_state) {
3449                 talloc_free(r);
3450                 /* Return true here, srv_pipe_hnd.c will take care */
3451                 return true;
3452         }
3453
3454         if (DEBUGLEVEL >= 10) {
3455                 NDR_PRINT_OUT_DEBUG(samr_TestPrivateFunctionsUser, r);
3456         }
3457
3458         push = ndr_push_init_ctx(r, NULL);
3459         if (push == NULL) {
3460                 talloc_free(r);
3461                 return false;
3462         }
3463
3464         ndr_err = call->ndr_push(push, NDR_OUT, r);
3465         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3466                 talloc_free(r);
3467                 return false;
3468         }
3469
3470         blob = ndr_push_blob(push);
3471         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3472                 talloc_free(r);
3473                 return false;
3474         }
3475
3476         talloc_free(r);
3477
3478         return true;
3479 }
3480
3481 static bool api_samr_GetUserPwInfo(pipes_struct *p)
3482 {
3483         const struct ndr_interface_call *call;
3484         struct ndr_pull *pull;
3485         struct ndr_push *push;
3486         enum ndr_err_code ndr_err;
3487         DATA_BLOB blob;
3488         struct samr_GetUserPwInfo *r;
3489
3490         call = &ndr_table_samr.calls[NDR_SAMR_GETUSERPWINFO];
3491
3492         r = talloc(talloc_tos(), struct samr_GetUserPwInfo);
3493         if (r == NULL) {
3494                 return false;
3495         }
3496
3497         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3498                 talloc_free(r);
3499                 return false;
3500         }
3501
3502         pull = ndr_pull_init_blob(&blob, r, NULL);
3503         if (pull == NULL) {
3504                 talloc_free(r);
3505                 return false;
3506         }
3507
3508         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3509         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3510         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3511                 talloc_free(r);
3512                 return false;
3513         }
3514
3515         if (DEBUGLEVEL >= 10) {
3516                 NDR_PRINT_IN_DEBUG(samr_GetUserPwInfo, r);
3517         }
3518
3519         ZERO_STRUCT(r->out);
3520         r->out.info = talloc_zero(r, struct samr_PwInfo);
3521         if (r->out.info == NULL) {
3522                 talloc_free(r);
3523                 return false;
3524         }
3525
3526         r->out.result = _samr_GetUserPwInfo(p, r);
3527
3528         if (p->rng_fault_state) {
3529                 talloc_free(r);
3530                 /* Return true here, srv_pipe_hnd.c will take care */
3531                 return true;
3532         }
3533
3534         if (DEBUGLEVEL >= 10) {
3535                 NDR_PRINT_OUT_DEBUG(samr_GetUserPwInfo, r);
3536         }
3537
3538         push = ndr_push_init_ctx(r, NULL);
3539         if (push == NULL) {
3540                 talloc_free(r);
3541                 return false;
3542         }
3543
3544         ndr_err = call->ndr_push(push, NDR_OUT, r);
3545         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3546                 talloc_free(r);
3547                 return false;
3548         }
3549
3550         blob = ndr_push_blob(push);
3551         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3552                 talloc_free(r);
3553                 return false;
3554         }
3555
3556         talloc_free(r);
3557
3558         return true;
3559 }
3560
3561 static bool api_samr_RemoveMemberFromForeignDomain(pipes_struct *p)
3562 {
3563         const struct ndr_interface_call *call;
3564         struct ndr_pull *pull;
3565         struct ndr_push *push;
3566         enum ndr_err_code ndr_err;
3567         DATA_BLOB blob;
3568         struct samr_RemoveMemberFromForeignDomain *r;
3569
3570         call = &ndr_table_samr.calls[NDR_SAMR_REMOVEMEMBERFROMFOREIGNDOMAIN];
3571
3572         r = talloc(talloc_tos(), struct samr_RemoveMemberFromForeignDomain);
3573         if (r == NULL) {
3574                 return false;
3575         }
3576
3577         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3578                 talloc_free(r);
3579                 return false;
3580         }
3581
3582         pull = ndr_pull_init_blob(&blob, r, NULL);
3583         if (pull == NULL) {
3584                 talloc_free(r);
3585                 return false;
3586         }
3587
3588         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3589         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3590         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3591                 talloc_free(r);
3592                 return false;
3593         }
3594
3595         if (DEBUGLEVEL >= 10) {
3596                 NDR_PRINT_IN_DEBUG(samr_RemoveMemberFromForeignDomain, r);
3597         }
3598
3599         r->out.result = _samr_RemoveMemberFromForeignDomain(p, r);
3600
3601         if (p->rng_fault_state) {
3602                 talloc_free(r);
3603                 /* Return true here, srv_pipe_hnd.c will take care */
3604                 return true;
3605         }
3606
3607         if (DEBUGLEVEL >= 10) {
3608                 NDR_PRINT_OUT_DEBUG(samr_RemoveMemberFromForeignDomain, r);
3609         }
3610
3611         push = ndr_push_init_ctx(r, NULL);
3612         if (push == NULL) {
3613                 talloc_free(r);
3614                 return false;
3615         }
3616
3617         ndr_err = call->ndr_push(push, NDR_OUT, r);
3618         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3619                 talloc_free(r);
3620                 return false;
3621         }
3622
3623         blob = ndr_push_blob(push);
3624         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3625                 talloc_free(r);
3626                 return false;
3627         }
3628
3629         talloc_free(r);
3630
3631         return true;
3632 }
3633
3634 static bool api_samr_QueryDomainInfo2(pipes_struct *p)
3635 {
3636         const struct ndr_interface_call *call;
3637         struct ndr_pull *pull;
3638         struct ndr_push *push;
3639         enum ndr_err_code ndr_err;
3640         DATA_BLOB blob;
3641         struct samr_QueryDomainInfo2 *r;
3642
3643         call = &ndr_table_samr.calls[NDR_SAMR_QUERYDOMAININFO2];
3644
3645         r = talloc(talloc_tos(), struct samr_QueryDomainInfo2);
3646         if (r == NULL) {
3647                 return false;
3648         }
3649
3650         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3651                 talloc_free(r);
3652                 return false;
3653         }
3654
3655         pull = ndr_pull_init_blob(&blob, r, NULL);
3656         if (pull == NULL) {
3657                 talloc_free(r);
3658                 return false;
3659         }
3660
3661         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3662         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3663         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3664                 talloc_free(r);
3665                 return false;
3666         }
3667
3668         if (DEBUGLEVEL >= 10) {
3669                 NDR_PRINT_IN_DEBUG(samr_QueryDomainInfo2, r);
3670         }
3671
3672         ZERO_STRUCT(r->out);
3673         r->out.info = talloc_zero(r, union samr_DomainInfo *);
3674         if (r->out.info == NULL) {
3675                 talloc_free(r);
3676                 return false;
3677         }
3678
3679         r->out.result = _samr_QueryDomainInfo2(p, r);
3680
3681         if (p->rng_fault_state) {
3682                 talloc_free(r);
3683                 /* Return true here, srv_pipe_hnd.c will take care */
3684                 return true;
3685         }
3686
3687         if (DEBUGLEVEL >= 10) {
3688                 NDR_PRINT_OUT_DEBUG(samr_QueryDomainInfo2, r);
3689         }
3690
3691         push = ndr_push_init_ctx(r, NULL);
3692         if (push == NULL) {
3693                 talloc_free(r);
3694                 return false;
3695         }
3696
3697         ndr_err = call->ndr_push(push, NDR_OUT, r);
3698         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3699                 talloc_free(r);
3700                 return false;
3701         }
3702
3703         blob = ndr_push_blob(push);
3704         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3705                 talloc_free(r);
3706                 return false;
3707         }
3708
3709         talloc_free(r);
3710
3711         return true;
3712 }
3713
3714 static bool api_samr_QueryUserInfo2(pipes_struct *p)
3715 {
3716         const struct ndr_interface_call *call;
3717         struct ndr_pull *pull;
3718         struct ndr_push *push;
3719         enum ndr_err_code ndr_err;
3720         DATA_BLOB blob;
3721         struct samr_QueryUserInfo2 *r;
3722
3723         call = &ndr_table_samr.calls[NDR_SAMR_QUERYUSERINFO2];
3724
3725         r = talloc(talloc_tos(), struct samr_QueryUserInfo2);
3726         if (r == NULL) {
3727                 return false;
3728         }
3729
3730         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3731                 talloc_free(r);
3732                 return false;
3733         }
3734
3735         pull = ndr_pull_init_blob(&blob, r, NULL);
3736         if (pull == NULL) {
3737                 talloc_free(r);
3738                 return false;
3739         }
3740
3741         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3742         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3743         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3744                 talloc_free(r);
3745                 return false;
3746         }
3747
3748         if (DEBUGLEVEL >= 10) {
3749                 NDR_PRINT_IN_DEBUG(samr_QueryUserInfo2, r);
3750         }
3751
3752         ZERO_STRUCT(r->out);
3753         r->out.info = talloc_zero(r, union samr_UserInfo *);
3754         if (r->out.info == NULL) {
3755                 talloc_free(r);
3756                 return false;
3757         }
3758
3759         r->out.result = _samr_QueryUserInfo2(p, r);
3760
3761         if (p->rng_fault_state) {
3762                 talloc_free(r);
3763                 /* Return true here, srv_pipe_hnd.c will take care */
3764                 return true;
3765         }
3766
3767         if (DEBUGLEVEL >= 10) {
3768                 NDR_PRINT_OUT_DEBUG(samr_QueryUserInfo2, r);
3769         }
3770
3771         push = ndr_push_init_ctx(r, NULL);
3772         if (push == NULL) {
3773                 talloc_free(r);
3774                 return false;
3775         }
3776
3777         ndr_err = call->ndr_push(push, NDR_OUT, r);
3778         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3779                 talloc_free(r);
3780                 return false;
3781         }
3782
3783         blob = ndr_push_blob(push);
3784         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3785                 talloc_free(r);
3786                 return false;
3787         }
3788
3789         talloc_free(r);
3790
3791         return true;
3792 }
3793
3794 static bool api_samr_QueryDisplayInfo2(pipes_struct *p)
3795 {
3796         const struct ndr_interface_call *call;
3797         struct ndr_pull *pull;
3798         struct ndr_push *push;
3799         enum ndr_err_code ndr_err;
3800         DATA_BLOB blob;
3801         struct samr_QueryDisplayInfo2 *r;
3802
3803         call = &ndr_table_samr.calls[NDR_SAMR_QUERYDISPLAYINFO2];
3804
3805         r = talloc(talloc_tos(), struct samr_QueryDisplayInfo2);
3806         if (r == NULL) {
3807                 return false;
3808         }
3809
3810         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3811                 talloc_free(r);
3812                 return false;
3813         }
3814
3815         pull = ndr_pull_init_blob(&blob, r, NULL);
3816         if (pull == NULL) {
3817                 talloc_free(r);
3818                 return false;
3819         }
3820
3821         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3822         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3823         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3824                 talloc_free(r);
3825                 return false;
3826         }
3827
3828         if (DEBUGLEVEL >= 10) {
3829                 NDR_PRINT_IN_DEBUG(samr_QueryDisplayInfo2, r);
3830         }
3831
3832         ZERO_STRUCT(r->out);
3833         r->out.total_size = talloc_zero(r, uint32_t);
3834         if (r->out.total_size == NULL) {
3835                 talloc_free(r);
3836                 return false;
3837         }
3838
3839         r->out.returned_size = talloc_zero(r, uint32_t);
3840         if (r->out.returned_size == NULL) {
3841                 talloc_free(r);
3842                 return false;
3843         }
3844
3845         r->out.info = talloc_zero(r, union samr_DispInfo);
3846         if (r->out.info == NULL) {
3847                 talloc_free(r);
3848                 return false;
3849         }
3850
3851         r->out.result = _samr_QueryDisplayInfo2(p, r);
3852
3853         if (p->rng_fault_state) {
3854                 talloc_free(r);
3855                 /* Return true here, srv_pipe_hnd.c will take care */
3856                 return true;
3857         }
3858
3859         if (DEBUGLEVEL >= 10) {
3860                 NDR_PRINT_OUT_DEBUG(samr_QueryDisplayInfo2, r);
3861         }
3862
3863         push = ndr_push_init_ctx(r, NULL);
3864         if (push == NULL) {
3865                 talloc_free(r);
3866                 return false;
3867         }
3868
3869         ndr_err = call->ndr_push(push, NDR_OUT, r);
3870         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3871                 talloc_free(r);
3872                 return false;
3873         }
3874
3875         blob = ndr_push_blob(push);
3876         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3877                 talloc_free(r);
3878                 return false;
3879         }
3880
3881         talloc_free(r);
3882
3883         return true;
3884 }
3885
3886 static bool api_samr_GetDisplayEnumerationIndex2(pipes_struct *p)
3887 {
3888         const struct ndr_interface_call *call;
3889         struct ndr_pull *pull;
3890         struct ndr_push *push;
3891         enum ndr_err_code ndr_err;
3892         DATA_BLOB blob;
3893         struct samr_GetDisplayEnumerationIndex2 *r;
3894
3895         call = &ndr_table_samr.calls[NDR_SAMR_GETDISPLAYENUMERATIONINDEX2];
3896
3897         r = talloc(talloc_tos(), struct samr_GetDisplayEnumerationIndex2);
3898         if (r == NULL) {
3899                 return false;
3900         }
3901
3902         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3903                 talloc_free(r);
3904                 return false;
3905         }
3906
3907         pull = ndr_pull_init_blob(&blob, r, NULL);
3908         if (pull == NULL) {
3909                 talloc_free(r);
3910                 return false;
3911         }
3912
3913         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3914         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3915         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3916                 talloc_free(r);
3917                 return false;
3918         }
3919
3920         if (DEBUGLEVEL >= 10) {
3921                 NDR_PRINT_IN_DEBUG(samr_GetDisplayEnumerationIndex2, r);
3922         }
3923
3924         ZERO_STRUCT(r->out);
3925         r->out.idx = talloc_zero(r, uint32_t);
3926         if (r->out.idx == NULL) {
3927                 talloc_free(r);
3928                 return false;
3929         }
3930
3931         r->out.result = _samr_GetDisplayEnumerationIndex2(p, r);
3932
3933         if (p->rng_fault_state) {
3934                 talloc_free(r);
3935                 /* Return true here, srv_pipe_hnd.c will take care */
3936                 return true;
3937         }
3938
3939         if (DEBUGLEVEL >= 10) {
3940                 NDR_PRINT_OUT_DEBUG(samr_GetDisplayEnumerationIndex2, r);
3941         }
3942
3943         push = ndr_push_init_ctx(r, NULL);
3944         if (push == NULL) {
3945                 talloc_free(r);
3946                 return false;
3947         }
3948
3949         ndr_err = call->ndr_push(push, NDR_OUT, r);
3950         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3951                 talloc_free(r);
3952                 return false;
3953         }
3954
3955         blob = ndr_push_blob(push);
3956         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
3957                 talloc_free(r);
3958                 return false;
3959         }
3960
3961         talloc_free(r);
3962
3963         return true;
3964 }
3965
3966 static bool api_samr_CreateUser2(pipes_struct *p)
3967 {
3968         const struct ndr_interface_call *call;
3969         struct ndr_pull *pull;
3970         struct ndr_push *push;
3971         enum ndr_err_code ndr_err;
3972         DATA_BLOB blob;
3973         struct samr_CreateUser2 *r;
3974
3975         call = &ndr_table_samr.calls[NDR_SAMR_CREATEUSER2];
3976
3977         r = talloc(talloc_tos(), struct samr_CreateUser2);
3978         if (r == NULL) {
3979                 return false;
3980         }
3981
3982         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
3983                 talloc_free(r);
3984                 return false;
3985         }
3986
3987         pull = ndr_pull_init_blob(&blob, r, NULL);
3988         if (pull == NULL) {
3989                 talloc_free(r);
3990                 return false;
3991         }
3992
3993         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
3994         ndr_err = call->ndr_pull(pull, NDR_IN, r);
3995         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
3996                 talloc_free(r);
3997                 return false;
3998         }
3999
4000         if (DEBUGLEVEL >= 10) {
4001                 NDR_PRINT_IN_DEBUG(samr_CreateUser2, r);
4002         }
4003
4004         ZERO_STRUCT(r->out);
4005         r->out.user_handle = talloc_zero(r, struct policy_handle);
4006         if (r->out.user_handle == NULL) {
4007                 talloc_free(r);
4008                 return false;
4009         }
4010
4011         r->out.access_granted = talloc_zero(r, uint32_t);
4012         if (r->out.access_granted == NULL) {
4013                 talloc_free(r);
4014                 return false;
4015         }
4016
4017         r->out.rid = talloc_zero(r, uint32_t);
4018         if (r->out.rid == NULL) {
4019                 talloc_free(r);
4020                 return false;
4021         }
4022
4023         r->out.result = _samr_CreateUser2(p, r);
4024
4025         if (p->rng_fault_state) {
4026                 talloc_free(r);
4027                 /* Return true here, srv_pipe_hnd.c will take care */
4028                 return true;
4029         }
4030
4031         if (DEBUGLEVEL >= 10) {
4032                 NDR_PRINT_OUT_DEBUG(samr_CreateUser2, r);
4033         }
4034
4035         push = ndr_push_init_ctx(r, NULL);
4036         if (push == NULL) {
4037                 talloc_free(r);
4038                 return false;
4039         }
4040
4041         ndr_err = call->ndr_push(push, NDR_OUT, r);
4042         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4043                 talloc_free(r);
4044                 return false;
4045         }
4046
4047         blob = ndr_push_blob(push);
4048         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4049                 talloc_free(r);
4050                 return false;
4051         }
4052
4053         talloc_free(r);
4054
4055         return true;
4056 }
4057
4058 static bool api_samr_QueryDisplayInfo3(pipes_struct *p)
4059 {
4060         const struct ndr_interface_call *call;
4061         struct ndr_pull *pull;
4062         struct ndr_push *push;
4063         enum ndr_err_code ndr_err;
4064         DATA_BLOB blob;
4065         struct samr_QueryDisplayInfo3 *r;
4066
4067         call = &ndr_table_samr.calls[NDR_SAMR_QUERYDISPLAYINFO3];
4068
4069         r = talloc(talloc_tos(), struct samr_QueryDisplayInfo3);
4070         if (r == NULL) {
4071                 return false;
4072         }
4073
4074         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
4075                 talloc_free(r);
4076                 return false;
4077         }
4078
4079         pull = ndr_pull_init_blob(&blob, r, NULL);
4080         if (pull == NULL) {
4081                 talloc_free(r);
4082                 return false;
4083         }
4084
4085         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
4086         ndr_err = call->ndr_pull(pull, NDR_IN, r);
4087         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4088                 talloc_free(r);
4089                 return false;
4090         }
4091
4092         if (DEBUGLEVEL >= 10) {
4093                 NDR_PRINT_IN_DEBUG(samr_QueryDisplayInfo3, r);
4094         }
4095
4096         ZERO_STRUCT(r->out);
4097         r->out.total_size = talloc_zero(r, uint32_t);
4098         if (r->out.total_size == NULL) {
4099                 talloc_free(r);
4100                 return false;
4101         }
4102
4103         r->out.returned_size = talloc_zero(r, uint32_t);
4104         if (r->out.returned_size == NULL) {
4105                 talloc_free(r);
4106                 return false;
4107         }
4108
4109         r->out.info = talloc_zero(r, union samr_DispInfo);
4110         if (r->out.info == NULL) {
4111                 talloc_free(r);
4112                 return false;
4113         }
4114
4115         r->out.result = _samr_QueryDisplayInfo3(p, r);
4116
4117         if (p->rng_fault_state) {
4118                 talloc_free(r);
4119                 /* Return true here, srv_pipe_hnd.c will take care */
4120                 return true;
4121         }
4122
4123         if (DEBUGLEVEL >= 10) {
4124                 NDR_PRINT_OUT_DEBUG(samr_QueryDisplayInfo3, r);
4125         }
4126
4127         push = ndr_push_init_ctx(r, NULL);
4128         if (push == NULL) {
4129                 talloc_free(r);
4130                 return false;
4131         }
4132
4133         ndr_err = call->ndr_push(push, NDR_OUT, r);
4134         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4135                 talloc_free(r);
4136                 return false;
4137         }
4138
4139         blob = ndr_push_blob(push);
4140         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4141                 talloc_free(r);
4142                 return false;
4143         }
4144
4145         talloc_free(r);
4146
4147         return true;
4148 }
4149
4150 static bool api_samr_AddMultipleMembersToAlias(pipes_struct *p)
4151 {
4152         const struct ndr_interface_call *call;
4153         struct ndr_pull *pull;
4154         struct ndr_push *push;
4155         enum ndr_err_code ndr_err;
4156         DATA_BLOB blob;
4157         struct samr_AddMultipleMembersToAlias *r;
4158
4159         call = &ndr_table_samr.calls[NDR_SAMR_ADDMULTIPLEMEMBERSTOALIAS];
4160
4161         r = talloc(talloc_tos(), struct samr_AddMultipleMembersToAlias);
4162         if (r == NULL) {
4163                 return false;
4164         }
4165
4166         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
4167                 talloc_free(r);
4168                 return false;
4169         }
4170
4171         pull = ndr_pull_init_blob(&blob, r, NULL);
4172         if (pull == NULL) {
4173                 talloc_free(r);
4174                 return false;
4175         }
4176
4177         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
4178         ndr_err = call->ndr_pull(pull, NDR_IN, r);
4179         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4180                 talloc_free(r);
4181                 return false;
4182         }
4183
4184         if (DEBUGLEVEL >= 10) {
4185                 NDR_PRINT_IN_DEBUG(samr_AddMultipleMembersToAlias, r);
4186         }
4187
4188         r->out.result = _samr_AddMultipleMembersToAlias(p, r);
4189
4190         if (p->rng_fault_state) {
4191                 talloc_free(r);
4192                 /* Return true here, srv_pipe_hnd.c will take care */
4193                 return true;
4194         }
4195
4196         if (DEBUGLEVEL >= 10) {
4197                 NDR_PRINT_OUT_DEBUG(samr_AddMultipleMembersToAlias, r);
4198         }
4199
4200         push = ndr_push_init_ctx(r, NULL);
4201         if (push == NULL) {
4202                 talloc_free(r);
4203                 return false;
4204         }
4205
4206         ndr_err = call->ndr_push(push, NDR_OUT, r);
4207         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4208                 talloc_free(r);
4209                 return false;
4210         }
4211
4212         blob = ndr_push_blob(push);
4213         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4214                 talloc_free(r);
4215                 return false;
4216         }
4217
4218         talloc_free(r);
4219
4220         return true;
4221 }
4222
4223 static bool api_samr_RemoveMultipleMembersFromAlias(pipes_struct *p)
4224 {
4225         const struct ndr_interface_call *call;
4226         struct ndr_pull *pull;
4227         struct ndr_push *push;
4228         enum ndr_err_code ndr_err;
4229         DATA_BLOB blob;
4230         struct samr_RemoveMultipleMembersFromAlias *r;
4231
4232         call = &ndr_table_samr.calls[NDR_SAMR_REMOVEMULTIPLEMEMBERSFROMALIAS];
4233
4234         r = talloc(talloc_tos(), struct samr_RemoveMultipleMembersFromAlias);
4235         if (r == NULL) {
4236                 return false;
4237         }
4238
4239         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
4240                 talloc_free(r);
4241                 return false;
4242         }
4243
4244         pull = ndr_pull_init_blob(&blob, r, NULL);
4245         if (pull == NULL) {
4246                 talloc_free(r);
4247                 return false;
4248         }
4249
4250         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
4251         ndr_err = call->ndr_pull(pull, NDR_IN, r);
4252         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4253                 talloc_free(r);
4254                 return false;
4255         }
4256
4257         if (DEBUGLEVEL >= 10) {
4258                 NDR_PRINT_IN_DEBUG(samr_RemoveMultipleMembersFromAlias, r);
4259         }
4260
4261         r->out.result = _samr_RemoveMultipleMembersFromAlias(p, r);
4262
4263         if (p->rng_fault_state) {
4264                 talloc_free(r);
4265                 /* Return true here, srv_pipe_hnd.c will take care */
4266                 return true;
4267         }
4268
4269         if (DEBUGLEVEL >= 10) {
4270                 NDR_PRINT_OUT_DEBUG(samr_RemoveMultipleMembersFromAlias, r);
4271         }
4272
4273         push = ndr_push_init_ctx(r, NULL);
4274         if (push == NULL) {
4275                 talloc_free(r);
4276                 return false;
4277         }
4278
4279         ndr_err = call->ndr_push(push, NDR_OUT, r);
4280         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4281                 talloc_free(r);
4282                 return false;
4283         }
4284
4285         blob = ndr_push_blob(push);
4286         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4287                 talloc_free(r);
4288                 return false;
4289         }
4290
4291         talloc_free(r);
4292
4293         return true;
4294 }
4295
4296 static bool api_samr_OemChangePasswordUser2(pipes_struct *p)
4297 {
4298         const struct ndr_interface_call *call;
4299         struct ndr_pull *pull;
4300         struct ndr_push *push;
4301         enum ndr_err_code ndr_err;
4302         DATA_BLOB blob;
4303         struct samr_OemChangePasswordUser2 *r;
4304
4305         call = &ndr_table_samr.calls[NDR_SAMR_OEMCHANGEPASSWORDUSER2];
4306
4307         r = talloc(talloc_tos(), struct samr_OemChangePasswordUser2);
4308         if (r == NULL) {
4309                 return false;
4310         }
4311
4312         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
4313                 talloc_free(r);
4314                 return false;
4315         }
4316
4317         pull = ndr_pull_init_blob(&blob, r, NULL);
4318         if (pull == NULL) {
4319                 talloc_free(r);
4320                 return false;
4321         }
4322
4323         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
4324         ndr_err = call->ndr_pull(pull, NDR_IN, r);
4325         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4326                 talloc_free(r);
4327                 return false;
4328         }
4329
4330         if (DEBUGLEVEL >= 10) {
4331                 NDR_PRINT_IN_DEBUG(samr_OemChangePasswordUser2, r);
4332         }
4333
4334         r->out.result = _samr_OemChangePasswordUser2(p, r);
4335
4336         if (p->rng_fault_state) {
4337                 talloc_free(r);
4338                 /* Return true here, srv_pipe_hnd.c will take care */
4339                 return true;
4340         }
4341
4342         if (DEBUGLEVEL >= 10) {
4343                 NDR_PRINT_OUT_DEBUG(samr_OemChangePasswordUser2, r);
4344         }
4345
4346         push = ndr_push_init_ctx(r, NULL);
4347         if (push == NULL) {
4348                 talloc_free(r);
4349                 return false;
4350         }
4351
4352         ndr_err = call->ndr_push(push, NDR_OUT, r);
4353         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4354                 talloc_free(r);
4355                 return false;
4356         }
4357
4358         blob = ndr_push_blob(push);
4359         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4360                 talloc_free(r);
4361                 return false;
4362         }
4363
4364         talloc_free(r);
4365
4366         return true;
4367 }
4368
4369 static bool api_samr_ChangePasswordUser2(pipes_struct *p)
4370 {
4371         const struct ndr_interface_call *call;
4372         struct ndr_pull *pull;
4373         struct ndr_push *push;
4374         enum ndr_err_code ndr_err;
4375         DATA_BLOB blob;
4376         struct samr_ChangePasswordUser2 *r;
4377
4378         call = &ndr_table_samr.calls[NDR_SAMR_CHANGEPASSWORDUSER2];
4379
4380         r = talloc(talloc_tos(), struct samr_ChangePasswordUser2);
4381         if (r == NULL) {
4382                 return false;
4383         }
4384
4385         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
4386                 talloc_free(r);
4387                 return false;
4388         }
4389
4390         pull = ndr_pull_init_blob(&blob, r, NULL);
4391         if (pull == NULL) {
4392                 talloc_free(r);
4393                 return false;
4394         }
4395
4396         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
4397         ndr_err = call->ndr_pull(pull, NDR_IN, r);
4398         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4399                 talloc_free(r);
4400                 return false;
4401         }
4402
4403         if (DEBUGLEVEL >= 10) {
4404                 NDR_PRINT_IN_DEBUG(samr_ChangePasswordUser2, r);
4405         }
4406
4407         r->out.result = _samr_ChangePasswordUser2(p, r);
4408
4409         if (p->rng_fault_state) {
4410                 talloc_free(r);
4411                 /* Return true here, srv_pipe_hnd.c will take care */
4412                 return true;
4413         }
4414
4415         if (DEBUGLEVEL >= 10) {
4416                 NDR_PRINT_OUT_DEBUG(samr_ChangePasswordUser2, r);
4417         }
4418
4419         push = ndr_push_init_ctx(r, NULL);
4420         if (push == NULL) {
4421                 talloc_free(r);
4422                 return false;
4423         }
4424
4425         ndr_err = call->ndr_push(push, NDR_OUT, r);
4426         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4427                 talloc_free(r);
4428                 return false;
4429         }
4430
4431         blob = ndr_push_blob(push);
4432         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4433                 talloc_free(r);
4434                 return false;
4435         }
4436
4437         talloc_free(r);
4438
4439         return true;
4440 }
4441
4442 static bool api_samr_GetDomPwInfo(pipes_struct *p)
4443 {
4444         const struct ndr_interface_call *call;
4445         struct ndr_pull *pull;
4446         struct ndr_push *push;
4447         enum ndr_err_code ndr_err;
4448         DATA_BLOB blob;
4449         struct samr_GetDomPwInfo *r;
4450
4451         call = &ndr_table_samr.calls[NDR_SAMR_GETDOMPWINFO];
4452
4453         r = talloc(talloc_tos(), struct samr_GetDomPwInfo);
4454         if (r == NULL) {
4455                 return false;
4456         }
4457
4458         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
4459                 talloc_free(r);
4460                 return false;
4461         }
4462
4463         pull = ndr_pull_init_blob(&blob, r, NULL);
4464         if (pull == NULL) {
4465                 talloc_free(r);
4466                 return false;
4467         }
4468
4469         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
4470         ndr_err = call->ndr_pull(pull, NDR_IN, r);
4471         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4472                 talloc_free(r);
4473                 return false;
4474         }
4475
4476         if (DEBUGLEVEL >= 10) {
4477                 NDR_PRINT_IN_DEBUG(samr_GetDomPwInfo, r);
4478         }
4479
4480         ZERO_STRUCT(r->out);
4481         r->out.info = talloc_zero(r, struct samr_PwInfo);
4482         if (r->out.info == NULL) {
4483                 talloc_free(r);
4484                 return false;
4485         }
4486
4487         r->out.result = _samr_GetDomPwInfo(p, r);
4488
4489         if (p->rng_fault_state) {
4490                 talloc_free(r);
4491                 /* Return true here, srv_pipe_hnd.c will take care */
4492                 return true;
4493         }
4494
4495         if (DEBUGLEVEL >= 10) {
4496                 NDR_PRINT_OUT_DEBUG(samr_GetDomPwInfo, r);
4497         }
4498
4499         push = ndr_push_init_ctx(r, NULL);
4500         if (push == NULL) {
4501                 talloc_free(r);
4502                 return false;
4503         }
4504
4505         ndr_err = call->ndr_push(push, NDR_OUT, r);
4506         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4507                 talloc_free(r);
4508                 return false;
4509         }
4510
4511         blob = ndr_push_blob(push);
4512         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4513                 talloc_free(r);
4514                 return false;
4515         }
4516
4517         talloc_free(r);
4518
4519         return true;
4520 }
4521
4522 static bool api_samr_Connect2(pipes_struct *p)
4523 {
4524         const struct ndr_interface_call *call;
4525         struct ndr_pull *pull;
4526         struct ndr_push *push;
4527         enum ndr_err_code ndr_err;
4528         DATA_BLOB blob;
4529         struct samr_Connect2 *r;
4530
4531         call = &ndr_table_samr.calls[NDR_SAMR_CONNECT2];
4532
4533         r = talloc(talloc_tos(), struct samr_Connect2);
4534         if (r == NULL) {
4535                 return false;
4536         }
4537
4538         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
4539                 talloc_free(r);
4540                 return false;
4541         }
4542
4543         pull = ndr_pull_init_blob(&blob, r, NULL);
4544         if (pull == NULL) {
4545                 talloc_free(r);
4546                 return false;
4547         }
4548
4549         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
4550         ndr_err = call->ndr_pull(pull, NDR_IN, r);
4551         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4552                 talloc_free(r);
4553                 return false;
4554         }
4555
4556         if (DEBUGLEVEL >= 10) {
4557                 NDR_PRINT_IN_DEBUG(samr_Connect2, r);
4558         }
4559
4560         ZERO_STRUCT(r->out);
4561         r->out.connect_handle = talloc_zero(r, struct policy_handle);
4562         if (r->out.connect_handle == NULL) {
4563                 talloc_free(r);
4564                 return false;
4565         }
4566
4567         r->out.result = _samr_Connect2(p, r);
4568
4569         if (p->rng_fault_state) {
4570                 talloc_free(r);
4571                 /* Return true here, srv_pipe_hnd.c will take care */
4572                 return true;
4573         }
4574
4575         if (DEBUGLEVEL >= 10) {
4576                 NDR_PRINT_OUT_DEBUG(samr_Connect2, r);
4577         }
4578
4579         push = ndr_push_init_ctx(r, NULL);
4580         if (push == NULL) {
4581                 talloc_free(r);
4582                 return false;
4583         }
4584
4585         ndr_err = call->ndr_push(push, NDR_OUT, r);
4586         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4587                 talloc_free(r);
4588                 return false;
4589         }
4590
4591         blob = ndr_push_blob(push);
4592         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4593                 talloc_free(r);
4594                 return false;
4595         }
4596
4597         talloc_free(r);
4598
4599         return true;
4600 }
4601
4602 static bool api_samr_SetUserInfo2(pipes_struct *p)
4603 {
4604         const struct ndr_interface_call *call;
4605         struct ndr_pull *pull;
4606         struct ndr_push *push;
4607         enum ndr_err_code ndr_err;
4608         DATA_BLOB blob;
4609         struct samr_SetUserInfo2 *r;
4610
4611         call = &ndr_table_samr.calls[NDR_SAMR_SETUSERINFO2];
4612
4613         r = talloc(talloc_tos(), struct samr_SetUserInfo2);
4614         if (r == NULL) {
4615                 return false;
4616         }
4617
4618         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
4619                 talloc_free(r);
4620                 return false;
4621         }
4622
4623         pull = ndr_pull_init_blob(&blob, r, NULL);
4624         if (pull == NULL) {
4625                 talloc_free(r);
4626                 return false;
4627         }
4628
4629         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
4630         ndr_err = call->ndr_pull(pull, NDR_IN, r);
4631         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4632                 talloc_free(r);
4633                 return false;
4634         }
4635
4636         if (DEBUGLEVEL >= 10) {
4637                 NDR_PRINT_IN_DEBUG(samr_SetUserInfo2, r);
4638         }
4639
4640         r->out.result = _samr_SetUserInfo2(p, r);
4641
4642         if (p->rng_fault_state) {
4643                 talloc_free(r);
4644                 /* Return true here, srv_pipe_hnd.c will take care */
4645                 return true;
4646         }
4647
4648         if (DEBUGLEVEL >= 10) {
4649                 NDR_PRINT_OUT_DEBUG(samr_SetUserInfo2, r);
4650         }
4651
4652         push = ndr_push_init_ctx(r, NULL);
4653         if (push == NULL) {
4654                 talloc_free(r);
4655                 return false;
4656         }
4657
4658         ndr_err = call->ndr_push(push, NDR_OUT, r);
4659         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4660                 talloc_free(r);
4661                 return false;
4662         }
4663
4664         blob = ndr_push_blob(push);
4665         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4666                 talloc_free(r);
4667                 return false;
4668         }
4669
4670         talloc_free(r);
4671
4672         return true;
4673 }
4674
4675 static bool api_samr_SetBootKeyInformation(pipes_struct *p)
4676 {
4677         const struct ndr_interface_call *call;
4678         struct ndr_pull *pull;
4679         struct ndr_push *push;
4680         enum ndr_err_code ndr_err;
4681         DATA_BLOB blob;
4682         struct samr_SetBootKeyInformation *r;
4683
4684         call = &ndr_table_samr.calls[NDR_SAMR_SETBOOTKEYINFORMATION];
4685
4686         r = talloc(talloc_tos(), struct samr_SetBootKeyInformation);
4687         if (r == NULL) {
4688                 return false;
4689         }
4690
4691         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
4692                 talloc_free(r);
4693                 return false;
4694         }
4695
4696         pull = ndr_pull_init_blob(&blob, r, NULL);
4697         if (pull == NULL) {
4698                 talloc_free(r);
4699                 return false;
4700         }
4701
4702         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
4703         ndr_err = call->ndr_pull(pull, NDR_IN, r);
4704         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4705                 talloc_free(r);
4706                 return false;
4707         }
4708
4709         if (DEBUGLEVEL >= 10) {
4710                 NDR_PRINT_IN_DEBUG(samr_SetBootKeyInformation, r);
4711         }
4712
4713         r->out.result = _samr_SetBootKeyInformation(p, r);
4714
4715         if (p->rng_fault_state) {
4716                 talloc_free(r);
4717                 /* Return true here, srv_pipe_hnd.c will take care */
4718                 return true;
4719         }
4720
4721         if (DEBUGLEVEL >= 10) {
4722                 NDR_PRINT_OUT_DEBUG(samr_SetBootKeyInformation, r);
4723         }
4724
4725         push = ndr_push_init_ctx(r, NULL);
4726         if (push == NULL) {
4727                 talloc_free(r);
4728                 return false;
4729         }
4730
4731         ndr_err = call->ndr_push(push, NDR_OUT, r);
4732         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4733                 talloc_free(r);
4734                 return false;
4735         }
4736
4737         blob = ndr_push_blob(push);
4738         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4739                 talloc_free(r);
4740                 return false;
4741         }
4742
4743         talloc_free(r);
4744
4745         return true;
4746 }
4747
4748 static bool api_samr_GetBootKeyInformation(pipes_struct *p)
4749 {
4750         const struct ndr_interface_call *call;
4751         struct ndr_pull *pull;
4752         struct ndr_push *push;
4753         enum ndr_err_code ndr_err;
4754         DATA_BLOB blob;
4755         struct samr_GetBootKeyInformation *r;
4756
4757         call = &ndr_table_samr.calls[NDR_SAMR_GETBOOTKEYINFORMATION];
4758
4759         r = talloc(talloc_tos(), struct samr_GetBootKeyInformation);
4760         if (r == NULL) {
4761                 return false;
4762         }
4763
4764         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
4765                 talloc_free(r);
4766                 return false;
4767         }
4768
4769         pull = ndr_pull_init_blob(&blob, r, NULL);
4770         if (pull == NULL) {
4771                 talloc_free(r);
4772                 return false;
4773         }
4774
4775         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
4776         ndr_err = call->ndr_pull(pull, NDR_IN, r);
4777         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4778                 talloc_free(r);
4779                 return false;
4780         }
4781
4782         if (DEBUGLEVEL >= 10) {
4783                 NDR_PRINT_IN_DEBUG(samr_GetBootKeyInformation, r);
4784         }
4785
4786         ZERO_STRUCT(r->out);
4787         r->out.unknown = talloc_zero(r, uint32_t);
4788         if (r->out.unknown == NULL) {
4789                 talloc_free(r);
4790                 return false;
4791         }
4792
4793         r->out.result = _samr_GetBootKeyInformation(p, r);
4794
4795         if (p->rng_fault_state) {
4796                 talloc_free(r);
4797                 /* Return true here, srv_pipe_hnd.c will take care */
4798                 return true;
4799         }
4800
4801         if (DEBUGLEVEL >= 10) {
4802                 NDR_PRINT_OUT_DEBUG(samr_GetBootKeyInformation, r);
4803         }
4804
4805         push = ndr_push_init_ctx(r, NULL);
4806         if (push == NULL) {
4807                 talloc_free(r);
4808                 return false;
4809         }
4810
4811         ndr_err = call->ndr_push(push, NDR_OUT, r);
4812         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4813                 talloc_free(r);
4814                 return false;
4815         }
4816
4817         blob = ndr_push_blob(push);
4818         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4819                 talloc_free(r);
4820                 return false;
4821         }
4822
4823         talloc_free(r);
4824
4825         return true;
4826 }
4827
4828 static bool api_samr_Connect3(pipes_struct *p)
4829 {
4830         const struct ndr_interface_call *call;
4831         struct ndr_pull *pull;
4832         struct ndr_push *push;
4833         enum ndr_err_code ndr_err;
4834         DATA_BLOB blob;
4835         struct samr_Connect3 *r;
4836
4837         call = &ndr_table_samr.calls[NDR_SAMR_CONNECT3];
4838
4839         r = talloc(talloc_tos(), struct samr_Connect3);
4840         if (r == NULL) {
4841                 return false;
4842         }
4843
4844         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
4845                 talloc_free(r);
4846                 return false;
4847         }
4848
4849         pull = ndr_pull_init_blob(&blob, r, NULL);
4850         if (pull == NULL) {
4851                 talloc_free(r);
4852                 return false;
4853         }
4854
4855         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
4856         ndr_err = call->ndr_pull(pull, NDR_IN, r);
4857         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4858                 talloc_free(r);
4859                 return false;
4860         }
4861
4862         if (DEBUGLEVEL >= 10) {
4863                 NDR_PRINT_IN_DEBUG(samr_Connect3, r);
4864         }
4865
4866         ZERO_STRUCT(r->out);
4867         r->out.connect_handle = talloc_zero(r, struct policy_handle);
4868         if (r->out.connect_handle == NULL) {
4869                 talloc_free(r);
4870                 return false;
4871         }
4872
4873         r->out.result = _samr_Connect3(p, r);
4874
4875         if (p->rng_fault_state) {
4876                 talloc_free(r);
4877                 /* Return true here, srv_pipe_hnd.c will take care */
4878                 return true;
4879         }
4880
4881         if (DEBUGLEVEL >= 10) {
4882                 NDR_PRINT_OUT_DEBUG(samr_Connect3, r);
4883         }
4884
4885         push = ndr_push_init_ctx(r, NULL);
4886         if (push == NULL) {
4887                 talloc_free(r);
4888                 return false;
4889         }
4890
4891         ndr_err = call->ndr_push(push, NDR_OUT, r);
4892         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4893                 talloc_free(r);
4894                 return false;
4895         }
4896
4897         blob = ndr_push_blob(push);
4898         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4899                 talloc_free(r);
4900                 return false;
4901         }
4902
4903         talloc_free(r);
4904
4905         return true;
4906 }
4907
4908 static bool api_samr_Connect4(pipes_struct *p)
4909 {
4910         const struct ndr_interface_call *call;
4911         struct ndr_pull *pull;
4912         struct ndr_push *push;
4913         enum ndr_err_code ndr_err;
4914         DATA_BLOB blob;
4915         struct samr_Connect4 *r;
4916
4917         call = &ndr_table_samr.calls[NDR_SAMR_CONNECT4];
4918
4919         r = talloc(talloc_tos(), struct samr_Connect4);
4920         if (r == NULL) {
4921                 return false;
4922         }
4923
4924         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
4925                 talloc_free(r);
4926                 return false;
4927         }
4928
4929         pull = ndr_pull_init_blob(&blob, r, NULL);
4930         if (pull == NULL) {
4931                 talloc_free(r);
4932                 return false;
4933         }
4934
4935         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
4936         ndr_err = call->ndr_pull(pull, NDR_IN, r);
4937         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4938                 talloc_free(r);
4939                 return false;
4940         }
4941
4942         if (DEBUGLEVEL >= 10) {
4943                 NDR_PRINT_IN_DEBUG(samr_Connect4, r);
4944         }
4945
4946         ZERO_STRUCT(r->out);
4947         r->out.connect_handle = talloc_zero(r, struct policy_handle);
4948         if (r->out.connect_handle == NULL) {
4949                 talloc_free(r);
4950                 return false;
4951         }
4952
4953         r->out.result = _samr_Connect4(p, r);
4954
4955         if (p->rng_fault_state) {
4956                 talloc_free(r);
4957                 /* Return true here, srv_pipe_hnd.c will take care */
4958                 return true;
4959         }
4960
4961         if (DEBUGLEVEL >= 10) {
4962                 NDR_PRINT_OUT_DEBUG(samr_Connect4, r);
4963         }
4964
4965         push = ndr_push_init_ctx(r, NULL);
4966         if (push == NULL) {
4967                 talloc_free(r);
4968                 return false;
4969         }
4970
4971         ndr_err = call->ndr_push(push, NDR_OUT, r);
4972         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
4973                 talloc_free(r);
4974                 return false;
4975         }
4976
4977         blob = ndr_push_blob(push);
4978         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
4979                 talloc_free(r);
4980                 return false;
4981         }
4982
4983         talloc_free(r);
4984
4985         return true;
4986 }
4987
4988 static bool api_samr_ChangePasswordUser3(pipes_struct *p)
4989 {
4990         const struct ndr_interface_call *call;
4991         struct ndr_pull *pull;
4992         struct ndr_push *push;
4993         enum ndr_err_code ndr_err;
4994         DATA_BLOB blob;
4995         struct samr_ChangePasswordUser3 *r;
4996
4997         call = &ndr_table_samr.calls[NDR_SAMR_CHANGEPASSWORDUSER3];
4998
4999         r = talloc(talloc_tos(), struct samr_ChangePasswordUser3);
5000         if (r == NULL) {
5001                 return false;
5002         }
5003
5004         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
5005                 talloc_free(r);
5006                 return false;
5007         }
5008
5009         pull = ndr_pull_init_blob(&blob, r, NULL);
5010         if (pull == NULL) {
5011                 talloc_free(r);
5012                 return false;
5013         }
5014
5015         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
5016         ndr_err = call->ndr_pull(pull, NDR_IN, r);
5017         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
5018                 talloc_free(r);
5019                 return false;
5020         }
5021
5022         if (DEBUGLEVEL >= 10) {
5023                 NDR_PRINT_IN_DEBUG(samr_ChangePasswordUser3, r);
5024         }
5025
5026         ZERO_STRUCT(r->out);
5027         r->out.dominfo = talloc_zero(r, struct samr_DomInfo1 *);
5028         if (r->out.dominfo == NULL) {
5029                 talloc_free(r);
5030                 return false;
5031         }
5032
5033         r->out.reject = talloc_zero(r, struct userPwdChangeFailureInformation *);
5034         if (r->out.reject == NULL) {
5035                 talloc_free(r);
5036                 return false;
5037         }
5038
5039         r->out.result = _samr_ChangePasswordUser3(p, r);
5040
5041         if (p->rng_fault_state) {
5042                 talloc_free(r);
5043                 /* Return true here, srv_pipe_hnd.c will take care */
5044                 return true;
5045         }
5046
5047         if (DEBUGLEVEL >= 10) {
5048                 NDR_PRINT_OUT_DEBUG(samr_ChangePasswordUser3, r);
5049         }
5050
5051         push = ndr_push_init_ctx(r, NULL);
5052         if (push == NULL) {
5053                 talloc_free(r);
5054                 return false;
5055         }
5056
5057         ndr_err = call->ndr_push(push, NDR_OUT, r);
5058         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
5059                 talloc_free(r);
5060                 return false;
5061         }
5062
5063         blob = ndr_push_blob(push);
5064         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
5065                 talloc_free(r);
5066                 return false;
5067         }
5068
5069         talloc_free(r);
5070
5071         return true;
5072 }
5073
5074 static bool api_samr_Connect5(pipes_struct *p)
5075 {
5076         const struct ndr_interface_call *call;
5077         struct ndr_pull *pull;
5078         struct ndr_push *push;
5079         enum ndr_err_code ndr_err;
5080         DATA_BLOB blob;
5081         struct samr_Connect5 *r;
5082
5083         call = &ndr_table_samr.calls[NDR_SAMR_CONNECT5];
5084
5085         r = talloc(talloc_tos(), struct samr_Connect5);
5086         if (r == NULL) {
5087                 return false;
5088         }
5089
5090         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
5091                 talloc_free(r);
5092                 return false;
5093         }
5094
5095         pull = ndr_pull_init_blob(&blob, r, NULL);
5096         if (pull == NULL) {
5097                 talloc_free(r);
5098                 return false;
5099         }
5100
5101         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
5102         ndr_err = call->ndr_pull(pull, NDR_IN, r);
5103         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
5104                 talloc_free(r);
5105                 return false;
5106         }
5107
5108         if (DEBUGLEVEL >= 10) {
5109                 NDR_PRINT_IN_DEBUG(samr_Connect5, r);
5110         }
5111
5112         ZERO_STRUCT(r->out);
5113         r->out.level_out = talloc_zero(r, uint32_t);
5114         if (r->out.level_out == NULL) {
5115                 talloc_free(r);
5116                 return false;
5117         }
5118
5119         r->out.info_out = talloc_zero(r, union samr_ConnectInfo);
5120         if (r->out.info_out == NULL) {
5121                 talloc_free(r);
5122                 return false;
5123         }
5124
5125         r->out.connect_handle = talloc_zero(r, struct policy_handle);
5126         if (r->out.connect_handle == NULL) {
5127                 talloc_free(r);
5128                 return false;
5129         }
5130
5131         r->out.result = _samr_Connect5(p, r);
5132
5133         if (p->rng_fault_state) {
5134                 talloc_free(r);
5135                 /* Return true here, srv_pipe_hnd.c will take care */
5136                 return true;
5137         }
5138
5139         if (DEBUGLEVEL >= 10) {
5140                 NDR_PRINT_OUT_DEBUG(samr_Connect5, r);
5141         }
5142
5143         push = ndr_push_init_ctx(r, NULL);
5144         if (push == NULL) {
5145                 talloc_free(r);
5146                 return false;
5147         }
5148
5149         ndr_err = call->ndr_push(push, NDR_OUT, r);
5150         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
5151                 talloc_free(r);
5152                 return false;
5153         }
5154
5155         blob = ndr_push_blob(push);
5156         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
5157                 talloc_free(r);
5158                 return false;
5159         }
5160
5161         talloc_free(r);
5162
5163         return true;
5164 }
5165
5166 static bool api_samr_RidToSid(pipes_struct *p)
5167 {
5168         const struct ndr_interface_call *call;
5169         struct ndr_pull *pull;
5170         struct ndr_push *push;
5171         enum ndr_err_code ndr_err;
5172         DATA_BLOB blob;
5173         struct samr_RidToSid *r;
5174
5175         call = &ndr_table_samr.calls[NDR_SAMR_RIDTOSID];
5176
5177         r = talloc(talloc_tos(), struct samr_RidToSid);
5178         if (r == NULL) {
5179                 return false;
5180         }
5181
5182         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
5183                 talloc_free(r);
5184                 return false;
5185         }
5186
5187         pull = ndr_pull_init_blob(&blob, r, NULL);
5188         if (pull == NULL) {
5189                 talloc_free(r);
5190                 return false;
5191         }
5192
5193         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
5194         ndr_err = call->ndr_pull(pull, NDR_IN, r);
5195         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
5196                 talloc_free(r);
5197                 return false;
5198         }
5199
5200         if (DEBUGLEVEL >= 10) {
5201                 NDR_PRINT_IN_DEBUG(samr_RidToSid, r);
5202         }
5203
5204         ZERO_STRUCT(r->out);
5205         r->out.sid = talloc_zero(r, struct dom_sid2 *);
5206         if (r->out.sid == NULL) {
5207                 talloc_free(r);
5208                 return false;
5209         }
5210
5211         r->out.result = _samr_RidToSid(p, r);
5212
5213         if (p->rng_fault_state) {
5214                 talloc_free(r);
5215                 /* Return true here, srv_pipe_hnd.c will take care */
5216                 return true;
5217         }
5218
5219         if (DEBUGLEVEL >= 10) {
5220                 NDR_PRINT_OUT_DEBUG(samr_RidToSid, r);
5221         }
5222
5223         push = ndr_push_init_ctx(r, NULL);
5224         if (push == NULL) {
5225                 talloc_free(r);
5226                 return false;
5227         }
5228
5229         ndr_err = call->ndr_push(push, NDR_OUT, r);
5230         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
5231                 talloc_free(r);
5232                 return false;
5233         }
5234
5235         blob = ndr_push_blob(push);
5236         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
5237                 talloc_free(r);
5238                 return false;
5239         }
5240
5241         talloc_free(r);
5242
5243         return true;
5244 }
5245
5246 static bool api_samr_SetDsrmPassword(pipes_struct *p)
5247 {
5248         const struct ndr_interface_call *call;
5249         struct ndr_pull *pull;
5250         struct ndr_push *push;
5251         enum ndr_err_code ndr_err;
5252         DATA_BLOB blob;
5253         struct samr_SetDsrmPassword *r;
5254
5255         call = &ndr_table_samr.calls[NDR_SAMR_SETDSRMPASSWORD];
5256
5257         r = talloc(talloc_tos(), struct samr_SetDsrmPassword);
5258         if (r == NULL) {
5259                 return false;
5260         }
5261
5262         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
5263                 talloc_free(r);
5264                 return false;
5265         }
5266
5267         pull = ndr_pull_init_blob(&blob, r, NULL);
5268         if (pull == NULL) {
5269                 talloc_free(r);
5270                 return false;
5271         }
5272
5273         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
5274         ndr_err = call->ndr_pull(pull, NDR_IN, r);
5275         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
5276                 talloc_free(r);
5277                 return false;
5278         }
5279
5280         if (DEBUGLEVEL >= 10) {
5281                 NDR_PRINT_IN_DEBUG(samr_SetDsrmPassword, r);
5282         }
5283
5284         r->out.result = _samr_SetDsrmPassword(p, r);
5285
5286         if (p->rng_fault_state) {
5287                 talloc_free(r);
5288                 /* Return true here, srv_pipe_hnd.c will take care */
5289                 return true;
5290         }
5291
5292         if (DEBUGLEVEL >= 10) {
5293                 NDR_PRINT_OUT_DEBUG(samr_SetDsrmPassword, r);
5294         }
5295
5296         push = ndr_push_init_ctx(r, NULL);
5297         if (push == NULL) {
5298                 talloc_free(r);
5299                 return false;
5300         }
5301
5302         ndr_err = call->ndr_push(push, NDR_OUT, r);
5303         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
5304                 talloc_free(r);
5305                 return false;
5306         }
5307
5308         blob = ndr_push_blob(push);
5309         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
5310                 talloc_free(r);
5311                 return false;
5312         }
5313
5314         talloc_free(r);
5315
5316         return true;
5317 }
5318
5319 static bool api_samr_ValidatePassword(pipes_struct *p)
5320 {
5321         const struct ndr_interface_call *call;
5322         struct ndr_pull *pull;
5323         struct ndr_push *push;
5324         enum ndr_err_code ndr_err;
5325         DATA_BLOB blob;
5326         struct samr_ValidatePassword *r;
5327
5328         call = &ndr_table_samr.calls[NDR_SAMR_VALIDATEPASSWORD];
5329
5330         r = talloc(talloc_tos(), struct samr_ValidatePassword);
5331         if (r == NULL) {
5332                 return false;
5333         }
5334
5335         if (!prs_data_blob(&p->in_data.data, &blob, r)) {
5336                 talloc_free(r);
5337                 return false;
5338         }
5339
5340         pull = ndr_pull_init_blob(&blob, r, NULL);
5341         if (pull == NULL) {
5342                 talloc_free(r);
5343                 return false;
5344         }
5345
5346         pull->flags |= LIBNDR_FLAG_REF_ALLOC;
5347         ndr_err = call->ndr_pull(pull, NDR_IN, r);
5348         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
5349                 talloc_free(r);
5350                 return false;
5351         }
5352
5353         if (DEBUGLEVEL >= 10) {
5354                 NDR_PRINT_IN_DEBUG(samr_ValidatePassword, r);
5355         }
5356
5357         ZERO_STRUCT(r->out);
5358         r->out.rep = talloc_zero(r, union samr_ValidatePasswordRep *);
5359         if (r->out.rep == NULL) {
5360                 talloc_free(r);
5361                 return false;
5362         }
5363
5364         r->out.result = _samr_ValidatePassword(p, r);
5365
5366         if (p->rng_fault_state) {
5367                 talloc_free(r);
5368                 /* Return true here, srv_pipe_hnd.c will take care */
5369                 return true;
5370         }
5371
5372         if (DEBUGLEVEL >= 10) {
5373                 NDR_PRINT_OUT_DEBUG(samr_ValidatePassword, r);
5374         }
5375
5376         push = ndr_push_init_ctx(r, NULL);
5377         if (push == NULL) {
5378                 talloc_free(r);
5379                 return false;
5380         }
5381
5382         ndr_err = call->ndr_push(push, NDR_OUT, r);
5383         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
5384                 talloc_free(r);
5385                 return false;
5386         }
5387
5388         blob = ndr_push_blob(push);
5389         if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
5390                 talloc_free(r);
5391                 return false;
5392         }
5393
5394         talloc_free(r);
5395
5396         return true;
5397 }
5398
5399
5400 /* Tables */
5401 static struct api_struct api_samr_cmds[] = 
5402 {
5403         {"SAMR_CONNECT", NDR_SAMR_CONNECT, api_samr_Connect},
5404         {"SAMR_CLOSE", NDR_SAMR_CLOSE, api_samr_Close},
5405         {"SAMR_SETSECURITY", NDR_SAMR_SETSECURITY, api_samr_SetSecurity},
5406         {"SAMR_QUERYSECURITY", NDR_SAMR_QUERYSECURITY, api_samr_QuerySecurity},
5407         {"SAMR_SHUTDOWN", NDR_SAMR_SHUTDOWN, api_samr_Shutdown},
5408         {"SAMR_LOOKUPDOMAIN", NDR_SAMR_LOOKUPDOMAIN, api_samr_LookupDomain},
5409         {"SAMR_ENUMDOMAINS", NDR_SAMR_ENUMDOMAINS, api_samr_EnumDomains},
5410         {"SAMR_OPENDOMAIN", NDR_SAMR_OPENDOMAIN, api_samr_OpenDomain},
5411         {"SAMR_QUERYDOMAININFO", NDR_SAMR_QUERYDOMAININFO, api_samr_QueryDomainInfo},
5412         {"SAMR_SETDOMAININFO", NDR_SAMR_SETDOMAININFO, api_samr_SetDomainInfo},
5413         {"SAMR_CREATEDOMAINGROUP", NDR_SAMR_CREATEDOMAINGROUP, api_samr_CreateDomainGroup},
5414         {"SAMR_ENUMDOMAINGROUPS", NDR_SAMR_ENUMDOMAINGROUPS, api_samr_EnumDomainGroups},
5415         {"SAMR_CREATEUSER", NDR_SAMR_CREATEUSER, api_samr_CreateUser},
5416         {"SAMR_ENUMDOMAINUSERS", NDR_SAMR_ENUMDOMAINUSERS, api_samr_EnumDomainUsers},
5417         {"SAMR_CREATEDOMALIAS", NDR_SAMR_CREATEDOMALIAS, api_samr_CreateDomAlias},
5418         {"SAMR_ENUMDOMAINALIASES", NDR_SAMR_ENUMDOMAINALIASES, api_samr_EnumDomainAliases},
5419         {"SAMR_GETALIASMEMBERSHIP", NDR_SAMR_GETALIASMEMBERSHIP, api_samr_GetAliasMembership},
5420         {"SAMR_LOOKUPNAMES", NDR_SAMR_LOOKUPNAMES, api_samr_LookupNames},
5421         {"SAMR_LOOKUPRIDS", NDR_SAMR_LOOKUPRIDS, api_samr_LookupRids},
5422         {"SAMR_OPENGROUP", NDR_SAMR_OPENGROUP, api_samr_OpenGroup},
5423         {"SAMR_QUERYGROUPINFO", NDR_SAMR_QUERYGROUPINFO, api_samr_QueryGroupInfo},
5424         {"SAMR_SETGROUPINFO", NDR_SAMR_SETGROUPINFO, api_samr_SetGroupInfo},
5425         {"SAMR_ADDGROUPMEMBER", NDR_SAMR_ADDGROUPMEMBER, api_samr_AddGroupMember},
5426         {"SAMR_DELETEDOMAINGROUP", NDR_SAMR_DELETEDOMAINGROUP, api_samr_DeleteDomainGroup},
5427         {"SAMR_DELETEGROUPMEMBER", NDR_SAMR_DELETEGROUPMEMBER, api_samr_DeleteGroupMember},
5428         {"SAMR_QUERYGROUPMEMBER", NDR_SAMR_QUERYGROUPMEMBER, api_samr_QueryGroupMember},
5429         {"SAMR_SETMEMBERATTRIBUTESOFGROUP", NDR_SAMR_SETMEMBERATTRIBUTESOFGROUP, api_samr_SetMemberAttributesOfGroup},
5430         {"SAMR_OPENALIAS", NDR_SAMR_OPENALIAS, api_samr_OpenAlias},
5431         {"SAMR_QUERYALIASINFO", NDR_SAMR_QUERYALIASINFO, api_samr_QueryAliasInfo},
5432         {"SAMR_SETALIASINFO", NDR_SAMR_SETALIASINFO, api_samr_SetAliasInfo},
5433         {"SAMR_DELETEDOMALIAS", NDR_SAMR_DELETEDOMALIAS, api_samr_DeleteDomAlias},
5434         {"SAMR_ADDALIASMEMBER", NDR_SAMR_ADDALIASMEMBER, api_samr_AddAliasMember},
5435         {"SAMR_DELETEALIASMEMBER", NDR_SAMR_DELETEALIASMEMBER, api_samr_DeleteAliasMember},
5436         {"SAMR_GETMEMBERSINALIAS", NDR_SAMR_GETMEMBERSINALIAS, api_samr_GetMembersInAlias},
5437         {"SAMR_OPENUSER", NDR_SAMR_OPENUSER, api_samr_OpenUser},
5438         {"SAMR_DELETEUSER", NDR_SAMR_DELETEUSER, api_samr_DeleteUser},
5439         {"SAMR_QUERYUSERINFO", NDR_SAMR_QUERYUSERINFO, api_samr_QueryUserInfo},
5440         {"SAMR_SETUSERINFO", NDR_SAMR_SETUSERINFO, api_samr_SetUserInfo},
5441         {"SAMR_CHANGEPASSWORDUSER", NDR_SAMR_CHANGEPASSWORDUSER, api_samr_ChangePasswordUser},
5442         {"SAMR_GETGROUPSFORUSER", NDR_SAMR_GETGROUPSFORUSER, api_samr_GetGroupsForUser},
5443         {"SAMR_QUERYDISPLAYINFO", NDR_SAMR_QUERYDISPLAYINFO, api_samr_QueryDisplayInfo},
5444         {"SAMR_GETDISPLAYENUMERATIONINDEX", NDR_SAMR_GETDISPLAYENUMERATIONINDEX, api_samr_GetDisplayEnumerationIndex},
5445         {"SAMR_TESTPRIVATEFUNCTIONSDOMAIN", NDR_SAMR_TESTPRIVATEFUNCTIONSDOMAIN, api_samr_TestPrivateFunctionsDomain},
5446         {"SAMR_TESTPRIVATEFUNCTIONSUSER", NDR_SAMR_TESTPRIVATEFUNCTIONSUSER, api_samr_TestPrivateFunctionsUser},
5447         {"SAMR_GETUSERPWINFO", NDR_SAMR_GETUSERPWINFO, api_samr_GetUserPwInfo},
5448         {"SAMR_REMOVEMEMBERFROMFOREIGNDOMAIN", NDR_SAMR_REMOVEMEMBERFROMFOREIGNDOMAIN, api_samr_RemoveMemberFromForeignDomain},
5449         {"SAMR_QUERYDOMAININFO2", NDR_SAMR_QUERYDOMAININFO2, api_samr_QueryDomainInfo2},
5450         {"SAMR_QUERYUSERINFO2", NDR_SAMR_QUERYUSERINFO2, api_samr_QueryUserInfo2},
5451         {"SAMR_QUERYDISPLAYINFO2", NDR_SAMR_QUERYDISPLAYINFO2, api_samr_QueryDisplayInfo2},
5452         {"SAMR_GETDISPLAYENUMERATIONINDEX2", NDR_SAMR_GETDISPLAYENUMERATIONINDEX2, api_samr_GetDisplayEnumerationIndex2},
5453         {"SAMR_CREATEUSER2", NDR_SAMR_CREATEUSER2, api_samr_CreateUser2},
5454         {"SAMR_QUERYDISPLAYINFO3", NDR_SAMR_QUERYDISPLAYINFO3, api_samr_QueryDisplayInfo3},
5455         {"SAMR_ADDMULTIPLEMEMBERSTOALIAS", NDR_SAMR_ADDMULTIPLEMEMBERSTOALIAS, api_samr_AddMultipleMembersToAlias},
5456         {"SAMR_REMOVEMULTIPLEMEMBERSFROMALIAS", NDR_SAMR_REMOVEMULTIPLEMEMBERSFROMALIAS, api_samr_RemoveMultipleMembersFromAlias},
5457         {"SAMR_OEMCHANGEPASSWORDUSER2", NDR_SAMR_OEMCHANGEPASSWORDUSER2, api_samr_OemChangePasswordUser2},
5458         {"SAMR_CHANGEPASSWORDUSER2", NDR_SAMR_CHANGEPASSWORDUSER2, api_samr_ChangePasswordUser2},
5459         {"SAMR_GETDOMPWINFO", NDR_SAMR_GETDOMPWINFO, api_samr_GetDomPwInfo},
5460         {"SAMR_CONNECT2", NDR_SAMR_CONNECT2, api_samr_Connect2},
5461         {"SAMR_SETUSERINFO2", NDR_SAMR_SETUSERINFO2, api_samr_SetUserInfo2},
5462         {"SAMR_SETBOOTKEYINFORMATION", NDR_SAMR_SETBOOTKEYINFORMATION, api_samr_SetBootKeyInformation},
5463         {"SAMR_GETBOOTKEYINFORMATION", NDR_SAMR_GETBOOTKEYINFORMATION, api_samr_GetBootKeyInformation},
5464         {"SAMR_CONNECT3", NDR_SAMR_CONNECT3, api_samr_Connect3},
5465         {"SAMR_CONNECT4", NDR_SAMR_CONNECT4, api_samr_Connect4},
5466         {"SAMR_CHANGEPASSWORDUSER3", NDR_SAMR_CHANGEPASSWORDUSER3, api_samr_ChangePasswordUser3},
5467         {"SAMR_CONNECT5", NDR_SAMR_CONNECT5, api_samr_Connect5},
5468         {"SAMR_RIDTOSID", NDR_SAMR_RIDTOSID, api_samr_RidToSid},
5469         {"SAMR_SETDSRMPASSWORD", NDR_SAMR_SETDSRMPASSWORD, api_samr_SetDsrmPassword},
5470         {"SAMR_VALIDATEPASSWORD", NDR_SAMR_VALIDATEPASSWORD, api_samr_ValidatePassword},
5471 };
5472
5473 void samr_get_pipe_fns(struct api_struct **fns, int *n_fns)
5474 {
5475         *fns = api_samr_cmds;
5476         *n_fns = sizeof(api_samr_cmds) / sizeof(struct api_struct);
5477 }
5478
5479 NTSTATUS rpc_samr_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, const struct ndr_interface_table *table, uint32_t opnum, void *_r)
5480 {
5481         if (cli->pipes_struct == NULL) {
5482                 return NT_STATUS_INVALID_PARAMETER;
5483         }
5484
5485         switch (opnum)
5486         {
5487                 case NDR_SAMR_CONNECT: {
5488                         struct samr_Connect *r = (struct samr_Connect *)_r;
5489                         ZERO_STRUCT(r->out);
5490                         r->out.connect_handle = talloc_zero(mem_ctx, struct policy_handle);
5491                         if (r->out.connect_handle == NULL) {
5492                         return NT_STATUS_NO_MEMORY;
5493                         }
5494
5495                         r->out.result = _samr_Connect(cli->pipes_struct, r);
5496                         return NT_STATUS_OK;
5497                 }
5498
5499                 case NDR_SAMR_CLOSE: {
5500                         struct samr_Close *r = (struct samr_Close *)_r;
5501                         ZERO_STRUCT(r->out);
5502                         r->out.handle = r->in.handle;
5503                         r->out.result = _samr_Close(cli->pipes_struct, r);
5504                         return NT_STATUS_OK;
5505                 }
5506
5507                 case NDR_SAMR_SETSECURITY: {
5508                         struct samr_SetSecurity *r = (struct samr_SetSecurity *)_r;
5509                         r->out.result = _samr_SetSecurity(cli->pipes_struct, r);
5510                         return NT_STATUS_OK;
5511                 }
5512
5513                 case NDR_SAMR_QUERYSECURITY: {
5514                         struct samr_QuerySecurity *r = (struct samr_QuerySecurity *)_r;
5515                         ZERO_STRUCT(r->out);
5516                         r->out.sdbuf = talloc_zero(mem_ctx, struct sec_desc_buf *);
5517                         if (r->out.sdbuf == NULL) {
5518                         return NT_STATUS_NO_MEMORY;
5519                         }
5520
5521                         r->out.result = _samr_QuerySecurity(cli->pipes_struct, r);
5522                         return NT_STATUS_OK;
5523                 }
5524
5525                 case NDR_SAMR_SHUTDOWN: {
5526                         struct samr_Shutdown *r = (struct samr_Shutdown *)_r;
5527                         r->out.result = _samr_Shutdown(cli->pipes_struct, r);
5528                         return NT_STATUS_OK;
5529                 }
5530
5531                 case NDR_SAMR_LOOKUPDOMAIN: {
5532                         struct samr_LookupDomain *r = (struct samr_LookupDomain *)_r;
5533                         ZERO_STRUCT(r->out);
5534                         r->out.sid = talloc_zero(mem_ctx, struct dom_sid2 *);
5535                         if (r->out.sid == NULL) {
5536                         return NT_STATUS_NO_MEMORY;
5537                         }
5538
5539                         r->out.result = _samr_LookupDomain(cli->pipes_struct, r);
5540                         return NT_STATUS_OK;
5541                 }
5542
5543                 case NDR_SAMR_ENUMDOMAINS: {
5544                         struct samr_EnumDomains *r = (struct samr_EnumDomains *)_r;
5545                         ZERO_STRUCT(r->out);
5546                         r->out.resume_handle = r->in.resume_handle;
5547                         r->out.sam = talloc_zero(mem_ctx, struct samr_SamArray *);
5548                         if (r->out.sam == NULL) {
5549                         return NT_STATUS_NO_MEMORY;
5550                         }
5551
5552                         r->out.num_entries = talloc_zero(mem_ctx, uint32_t);
5553                         if (r->out.num_entries == NULL) {
5554                         return NT_STATUS_NO_MEMORY;
5555                         }
5556
5557                         r->out.result = _samr_EnumDomains(cli->pipes_struct, r);
5558                         return NT_STATUS_OK;
5559                 }
5560
5561                 case NDR_SAMR_OPENDOMAIN: {
5562                         struct samr_OpenDomain *r = (struct samr_OpenDomain *)_r;
5563                         ZERO_STRUCT(r->out);
5564                         r->out.domain_handle = talloc_zero(mem_ctx, struct policy_handle);
5565                         if (r->out.domain_handle == NULL) {
5566                         return NT_STATUS_NO_MEMORY;
5567                         }
5568
5569                         r->out.result = _samr_OpenDomain(cli->pipes_struct, r);
5570                         return NT_STATUS_OK;
5571                 }
5572
5573                 case NDR_SAMR_QUERYDOMAININFO: {
5574                         struct samr_QueryDomainInfo *r = (struct samr_QueryDomainInfo *)_r;
5575                         ZERO_STRUCT(r->out);
5576                         r->out.info = talloc_zero(mem_ctx, union samr_DomainInfo *);
5577                         if (r->out.info == NULL) {
5578                         return NT_STATUS_NO_MEMORY;
5579                         }
5580
5581                         r->out.result = _samr_QueryDomainInfo(cli->pipes_struct, r);
5582                         return NT_STATUS_OK;
5583                 }
5584
5585                 case NDR_SAMR_SETDOMAININFO: {
5586                         struct samr_SetDomainInfo *r = (struct samr_SetDomainInfo *)_r;
5587                         r->out.result = _samr_SetDomainInfo(cli->pipes_struct, r);
5588                         return NT_STATUS_OK;
5589                 }
5590
5591                 case NDR_SAMR_CREATEDOMAINGROUP: {
5592                         struct samr_CreateDomainGroup *r = (struct samr_CreateDomainGroup *)_r;
5593                         ZERO_STRUCT(r->out);
5594                         r->out.group_handle = talloc_zero(mem_ctx, struct policy_handle);
5595                         if (r->out.group_handle == NULL) {
5596                         return NT_STATUS_NO_MEMORY;
5597                         }
5598
5599                         r->out.rid = talloc_zero(mem_ctx, uint32_t);
5600                         if (r->out.rid == NULL) {
5601                         return NT_STATUS_NO_MEMORY;
5602                         }
5603
5604                         r->out.result = _samr_CreateDomainGroup(cli->pipes_struct, r);
5605                         return NT_STATUS_OK;
5606                 }
5607
5608                 case NDR_SAMR_ENUMDOMAINGROUPS: {
5609                         struct samr_EnumDomainGroups *r = (struct samr_EnumDomainGroups *)_r;
5610                         ZERO_STRUCT(r->out);
5611                         r->out.resume_handle = r->in.resume_handle;
5612                         r->out.sam = talloc_zero(mem_ctx, struct samr_SamArray *);
5613                         if (r->out.sam == NULL) {
5614                         return NT_STATUS_NO_MEMORY;
5615                         }
5616
5617                         r->out.num_entries = talloc_zero(mem_ctx, uint32_t);
5618                         if (r->out.num_entries == NULL) {
5619                         return NT_STATUS_NO_MEMORY;
5620                         }
5621
5622                         r->out.result = _samr_EnumDomainGroups(cli->pipes_struct, r);
5623                         return NT_STATUS_OK;
5624                 }
5625
5626                 case NDR_SAMR_CREATEUSER: {
5627                         struct samr_CreateUser *r = (struct samr_CreateUser *)_r;
5628                         ZERO_STRUCT(r->out);
5629                         r->out.user_handle = talloc_zero(mem_ctx, struct policy_handle);
5630                         if (r->out.user_handle == NULL) {
5631                         return NT_STATUS_NO_MEMORY;
5632                         }
5633
5634                         r->out.rid = talloc_zero(mem_ctx, uint32_t);
5635                         if (r->out.rid == NULL) {
5636                         return NT_STATUS_NO_MEMORY;
5637                         }
5638
5639                         r->out.result = _samr_CreateUser(cli->pipes_struct, r);
5640                         return NT_STATUS_OK;
5641                 }
5642
5643                 case NDR_SAMR_ENUMDOMAINUSERS: {
5644                         struct samr_EnumDomainUsers *r = (struct samr_EnumDomainUsers *)_r;
5645                         ZERO_STRUCT(r->out);
5646                         r->out.resume_handle = r->in.resume_handle;
5647                         r->out.sam = talloc_zero(mem_ctx, struct samr_SamArray *);
5648                         if (r->out.sam == NULL) {
5649                         return NT_STATUS_NO_MEMORY;
5650                         }
5651
5652                         r->out.num_entries = talloc_zero(mem_ctx, uint32_t);
5653                         if (r->out.num_entries == NULL) {
5654                         return NT_STATUS_NO_MEMORY;
5655                         }
5656
5657                         r->out.result = _samr_EnumDomainUsers(cli->pipes_struct, r);
5658                         return NT_STATUS_OK;
5659                 }
5660
5661                 case NDR_SAMR_CREATEDOMALIAS: {
5662                         struct samr_CreateDomAlias *r = (struct samr_CreateDomAlias *)_r;
5663                         ZERO_STRUCT(r->out);
5664                         r->out.alias_handle = talloc_zero(mem_ctx, struct policy_handle);
5665                         if (r->out.alias_handle == NULL) {
5666                         return NT_STATUS_NO_MEMORY;
5667                         }
5668
5669                         r->out.rid = talloc_zero(mem_ctx, uint32_t);
5670                         if (r->out.rid == NULL) {
5671                         return NT_STATUS_NO_MEMORY;
5672                         }
5673
5674                         r->out.result = _samr_CreateDomAlias(cli->pipes_struct, r);
5675                         return NT_STATUS_OK;
5676                 }
5677
5678                 case NDR_SAMR_ENUMDOMAINALIASES: {
5679                         struct samr_EnumDomainAliases *r = (struct samr_EnumDomainAliases *)_r;
5680                         ZERO_STRUCT(r->out);
5681                         r->out.resume_handle = r->in.resume_handle;
5682                         r->out.sam = talloc_zero(mem_ctx, struct samr_SamArray *);
5683                         if (r->out.sam == NULL) {
5684                         return NT_STATUS_NO_MEMORY;
5685                         }
5686
5687                         r->out.num_entries = talloc_zero(mem_ctx, uint32_t);
5688                         if (r->out.num_entries == NULL) {
5689                         return NT_STATUS_NO_MEMORY;
5690                         }
5691
5692                         r->out.result = _samr_EnumDomainAliases(cli->pipes_struct, r);
5693                         return NT_STATUS_OK;
5694                 }
5695
5696                 case NDR_SAMR_GETALIASMEMBERSHIP: {
5697                         struct samr_GetAliasMembership *r = (struct samr_GetAliasMembership *)_r;
5698                         ZERO_STRUCT(r->out);
5699                         r->out.rids = talloc_zero(mem_ctx, struct samr_Ids);
5700                         if (r->out.rids == NULL) {
5701                         return NT_STATUS_NO_MEMORY;
5702                         }
5703
5704                         r->out.result = _samr_GetAliasMembership(cli->pipes_struct, r);
5705                         return NT_STATUS_OK;
5706                 }
5707
5708                 case NDR_SAMR_LOOKUPNAMES: {
5709                         struct samr_LookupNames *r = (struct samr_LookupNames *)_r;
5710                         ZERO_STRUCT(r->out);
5711                         r->out.rids = talloc_zero(mem_ctx, struct samr_Ids);
5712                         if (r->out.rids == NULL) {
5713                         return NT_STATUS_NO_MEMORY;
5714                         }
5715
5716                         r->out.types = talloc_zero(mem_ctx, struct samr_Ids);
5717                         if (r->out.types == NULL) {
5718                         return NT_STATUS_NO_MEMORY;
5719                         }
5720
5721                         r->out.result = _samr_LookupNames(cli->pipes_struct, r);
5722                         return NT_STATUS_OK;
5723                 }
5724
5725                 case NDR_SAMR_LOOKUPRIDS: {
5726                         struct samr_LookupRids *r = (struct samr_LookupRids *)_r;
5727                         ZERO_STRUCT(r->out);
5728                         r->out.names = talloc_zero(mem_ctx, struct lsa_Strings);
5729                         if (r->out.names == NULL) {
5730                         return NT_STATUS_NO_MEMORY;
5731                         }
5732
5733                         r->out.types = talloc_zero(mem_ctx, struct samr_Ids);
5734                         if (r->out.types == NULL) {
5735                         return NT_STATUS_NO_MEMORY;
5736                         }
5737
5738                         r->out.result = _samr_LookupRids(cli->pipes_struct, r);
5739                         return NT_STATUS_OK;
5740                 }
5741
5742                 case NDR_SAMR_OPENGROUP: {
5743                         struct samr_OpenGroup *r = (struct samr_OpenGroup *)_r;
5744                         ZERO_STRUCT(r->out);
5745                         r->out.group_handle = talloc_zero(mem_ctx, struct policy_handle);
5746                         if (r->out.group_handle == NULL) {
5747                         return NT_STATUS_NO_MEMORY;
5748                         }
5749
5750                         r->out.result = _samr_OpenGroup(cli->pipes_struct, r);
5751                         return NT_STATUS_OK;
5752                 }
5753
5754                 case NDR_SAMR_QUERYGROUPINFO: {
5755                         struct samr_QueryGroupInfo *r = (struct samr_QueryGroupInfo *)_r;
5756                         ZERO_STRUCT(r->out);
5757                         r->out.info = talloc_zero(mem_ctx, union samr_GroupInfo *);
5758                         if (r->out.info == NULL) {
5759                         return NT_STATUS_NO_MEMORY;
5760                         }
5761
5762                         r->out.result = _samr_QueryGroupInfo(cli->pipes_struct, r);
5763                         return NT_STATUS_OK;
5764                 }
5765
5766                 case NDR_SAMR_SETGROUPINFO: {
5767                         struct samr_SetGroupInfo *r = (struct samr_SetGroupInfo *)_r;
5768                         r->out.result = _samr_SetGroupInfo(cli->pipes_struct, r);
5769                         return NT_STATUS_OK;
5770                 }
5771
5772                 case NDR_SAMR_ADDGROUPMEMBER: {
5773                         struct samr_AddGroupMember *r = (struct samr_AddGroupMember *)_r;
5774                         r->out.result = _samr_AddGroupMember(cli->pipes_struct, r);
5775                         return NT_STATUS_OK;
5776                 }
5777
5778                 case NDR_SAMR_DELETEDOMAINGROUP: {
5779                         struct samr_DeleteDomainGroup *r = (struct samr_DeleteDomainGroup *)_r;
5780                         ZERO_STRUCT(r->out);
5781                         r->out.group_handle = r->in.group_handle;
5782                         r->out.result = _samr_DeleteDomainGroup(cli->pipes_struct, r);
5783                         return NT_STATUS_OK;
5784                 }
5785
5786                 case NDR_SAMR_DELETEGROUPMEMBER: {
5787                         struct samr_DeleteGroupMember *r = (struct samr_DeleteGroupMember *)_r;
5788                         r->out.result = _samr_DeleteGroupMember(cli->pipes_struct, r);
5789                         return NT_STATUS_OK;
5790                 }
5791
5792                 case NDR_SAMR_QUERYGROUPMEMBER: {
5793                         struct samr_QueryGroupMember *r = (struct samr_QueryGroupMember *)_r;
5794                         ZERO_STRUCT(r->out);
5795                         r->out.rids = talloc_zero(mem_ctx, struct samr_RidTypeArray *);
5796                         if (r->out.rids == NULL) {
5797                         return NT_STATUS_NO_MEMORY;
5798                         }
5799
5800                         r->out.result = _samr_QueryGroupMember(cli->pipes_struct, r);
5801                         return NT_STATUS_OK;
5802                 }
5803
5804                 case NDR_SAMR_SETMEMBERATTRIBUTESOFGROUP: {
5805                         struct samr_SetMemberAttributesOfGroup *r = (struct samr_SetMemberAttributesOfGroup *)_r;
5806                         r->out.result = _samr_SetMemberAttributesOfGroup(cli->pipes_struct, r);
5807                         return NT_STATUS_OK;
5808                 }
5809
5810                 case NDR_SAMR_OPENALIAS: {
5811                         struct samr_OpenAlias *r = (struct samr_OpenAlias *)_r;
5812                         ZERO_STRUCT(r->out);
5813                         r->out.alias_handle = talloc_zero(mem_ctx, struct policy_handle);
5814                         if (r->out.alias_handle == NULL) {
5815                         return NT_STATUS_NO_MEMORY;
5816                         }
5817
5818                         r->out.result = _samr_OpenAlias(cli->pipes_struct, r);
5819                         return NT_STATUS_OK;
5820                 }
5821
5822                 case NDR_SAMR_QUERYALIASINFO: {
5823                         struct samr_QueryAliasInfo *r = (struct samr_QueryAliasInfo *)_r;
5824                         ZERO_STRUCT(r->out);
5825                         r->out.info = talloc_zero(mem_ctx, union samr_AliasInfo *);
5826                         if (r->out.info == NULL) {
5827                         return NT_STATUS_NO_MEMORY;
5828                         }
5829
5830                         r->out.result = _samr_QueryAliasInfo(cli->pipes_struct, r);
5831                         return NT_STATUS_OK;
5832                 }
5833
5834                 case NDR_SAMR_SETALIASINFO: {
5835                         struct samr_SetAliasInfo *r = (struct samr_SetAliasInfo *)_r;
5836                         r->out.result = _samr_SetAliasInfo(cli->pipes_struct, r);
5837                         return NT_STATUS_OK;
5838                 }
5839
5840                 case NDR_SAMR_DELETEDOMALIAS: {
5841                         struct samr_DeleteDomAlias *r = (struct samr_DeleteDomAlias *)_r;
5842                         ZERO_STRUCT(r->out);
5843                         r->out.alias_handle = r->in.alias_handle;
5844                         r->out.result = _samr_DeleteDomAlias(cli->pipes_struct, r);
5845                         return NT_STATUS_OK;
5846                 }
5847
5848                 case NDR_SAMR_ADDALIASMEMBER: {
5849                         struct samr_AddAliasMember *r = (struct samr_AddAliasMember *)_r;
5850                         r->out.result = _samr_AddAliasMember(cli->pipes_struct, r);
5851                         return NT_STATUS_OK;
5852                 }
5853
5854                 case NDR_SAMR_DELETEALIASMEMBER: {
5855                         struct samr_DeleteAliasMember *r = (struct samr_DeleteAliasMember *)_r;
5856                         r->out.result = _samr_DeleteAliasMember(cli->pipes_struct, r);
5857                         return NT_STATUS_OK;
5858                 }
5859
5860                 case NDR_SAMR_GETMEMBERSINALIAS: {
5861                         struct samr_GetMembersInAlias *r = (struct samr_GetMembersInAlias *)_r;
5862                         ZERO_STRUCT(r->out);
5863                         r->out.sids = talloc_zero(mem_ctx, struct lsa_SidArray);
5864                         if (r->out.sids == NULL) {
5865                         return NT_STATUS_NO_MEMORY;
5866                         }
5867
5868                         r->out.result = _samr_GetMembersInAlias(cli->pipes_struct, r);
5869                         return NT_STATUS_OK;
5870                 }
5871
5872                 case NDR_SAMR_OPENUSER: {
5873                         struct samr_OpenUser *r = (struct samr_OpenUser *)_r;
5874                         ZERO_STRUCT(r->out);
5875                         r->out.user_handle = talloc_zero(mem_ctx, struct policy_handle);
5876                         if (r->out.user_handle == NULL) {
5877                         return NT_STATUS_NO_MEMORY;
5878                         }
5879
5880                         r->out.result = _samr_OpenUser(cli->pipes_struct, r);
5881                         return NT_STATUS_OK;
5882                 }
5883
5884                 case NDR_SAMR_DELETEUSER: {
5885                         struct samr_DeleteUser *r = (struct samr_DeleteUser *)_r;
5886                         ZERO_STRUCT(r->out);
5887                         r->out.user_handle = r->in.user_handle;
5888                         r->out.result = _samr_DeleteUser(cli->pipes_struct, r);
5889                         return NT_STATUS_OK;
5890                 }
5891
5892                 case NDR_SAMR_QUERYUSERINFO: {
5893                         struct samr_QueryUserInfo *r = (struct samr_QueryUserInfo *)_r;
5894                         ZERO_STRUCT(r->out);
5895                         r->out.info = talloc_zero(mem_ctx, union samr_UserInfo *);
5896                         if (r->out.info == NULL) {
5897                         return NT_STATUS_NO_MEMORY;
5898                         }
5899
5900                         r->out.result = _samr_QueryUserInfo(cli->pipes_struct, r);
5901                         return NT_STATUS_OK;
5902                 }
5903
5904                 case NDR_SAMR_SETUSERINFO: {
5905                         struct samr_SetUserInfo *r = (struct samr_SetUserInfo *)_r;
5906                         r->out.result = _samr_SetUserInfo(cli->pipes_struct, r);
5907                         return NT_STATUS_OK;
5908                 }
5909
5910                 case NDR_SAMR_CHANGEPASSWORDUSER: {
5911                         struct samr_ChangePasswordUser *r = (struct samr_ChangePasswordUser *)_r;
5912                         r->out.result = _samr_ChangePasswordUser(cli->pipes_struct, r);
5913                         return NT_STATUS_OK;
5914                 }
5915
5916                 case NDR_SAMR_GETGROUPSFORUSER: {
5917                         struct samr_GetGroupsForUser *r = (struct samr_GetGroupsForUser *)_r;
5918                         ZERO_STRUCT(r->out);
5919                         r->out.rids = talloc_zero(mem_ctx, struct samr_RidWithAttributeArray *);
5920                         if (r->out.rids == NULL) {
5921                         return NT_STATUS_NO_MEMORY;
5922                         }
5923
5924                         r->out.result = _samr_GetGroupsForUser(cli->pipes_struct, r);
5925                         return NT_STATUS_OK;
5926                 }
5927
5928                 case NDR_SAMR_QUERYDISPLAYINFO: {
5929                         struct samr_QueryDisplayInfo *r = (struct samr_QueryDisplayInfo *)_r;
5930                         ZERO_STRUCT(r->out);
5931                         r->out.total_size = talloc_zero(mem_ctx, uint32_t);
5932                         if (r->out.total_size == NULL) {
5933                         return NT_STATUS_NO_MEMORY;
5934                         }
5935
5936                         r->out.returned_size = talloc_zero(mem_ctx, uint32_t);
5937                         if (r->out.returned_size == NULL) {
5938                         return NT_STATUS_NO_MEMORY;
5939                         }
5940
5941                         r->out.info = talloc_zero(mem_ctx, union samr_DispInfo);
5942                         if (r->out.info == NULL) {
5943                         return NT_STATUS_NO_MEMORY;
5944                         }
5945
5946                         r->out.result = _samr_QueryDisplayInfo(cli->pipes_struct, r);
5947                         return NT_STATUS_OK;
5948                 }
5949
5950                 case NDR_SAMR_GETDISPLAYENUMERATIONINDEX: {
5951                         struct samr_GetDisplayEnumerationIndex *r = (struct samr_GetDisplayEnumerationIndex *)_r;
5952                         ZERO_STRUCT(r->out);
5953                         r->out.idx = talloc_zero(mem_ctx, uint32_t);
5954                         if (r->out.idx == NULL) {
5955                         return NT_STATUS_NO_MEMORY;
5956                         }
5957
5958                         r->out.result = _samr_GetDisplayEnumerationIndex(cli->pipes_struct, r);
5959                         return NT_STATUS_OK;
5960                 }
5961
5962                 case NDR_SAMR_TESTPRIVATEFUNCTIONSDOMAIN: {
5963                         struct samr_TestPrivateFunctionsDomain *r = (struct samr_TestPrivateFunctionsDomain *)_r;
5964                         r->out.result = _samr_TestPrivateFunctionsDomain(cli->pipes_struct, r);
5965                         return NT_STATUS_OK;
5966                 }
5967
5968                 case NDR_SAMR_TESTPRIVATEFUNCTIONSUSER: {
5969                         struct samr_TestPrivateFunctionsUser *r = (struct samr_TestPrivateFunctionsUser *)_r;
5970                         r->out.result = _samr_TestPrivateFunctionsUser(cli->pipes_struct, r);
5971                         return NT_STATUS_OK;
5972                 }
5973
5974                 case NDR_SAMR_GETUSERPWINFO: {
5975                         struct samr_GetUserPwInfo *r = (struct samr_GetUserPwInfo *)_r;
5976                         ZERO_STRUCT(r->out);
5977                         r->out.info = talloc_zero(mem_ctx, struct samr_PwInfo);
5978                         if (r->out.info == NULL) {
5979                         return NT_STATUS_NO_MEMORY;
5980                         }
5981
5982                         r->out.result = _samr_GetUserPwInfo(cli->pipes_struct, r);
5983                         return NT_STATUS_OK;
5984                 }
5985
5986                 case NDR_SAMR_REMOVEMEMBERFROMFOREIGNDOMAIN: {
5987                         struct samr_RemoveMemberFromForeignDomain *r = (struct samr_RemoveMemberFromForeignDomain *)_r;
5988                         r->out.result = _samr_RemoveMemberFromForeignDomain(cli->pipes_struct, r);
5989                         return NT_STATUS_OK;
5990                 }
5991
5992                 case NDR_SAMR_QUERYDOMAININFO2: {
5993                         struct samr_QueryDomainInfo2 *r = (struct samr_QueryDomainInfo2 *)_r;
5994                         ZERO_STRUCT(r->out);
5995                         r->out.info = talloc_zero(mem_ctx, union samr_DomainInfo *);
5996                         if (r->out.info == NULL) {
5997                         return NT_STATUS_NO_MEMORY;
5998                         }
5999
6000                         r->out.result = _samr_QueryDomainInfo2(cli->pipes_struct, r);
6001                         return NT_STATUS_OK;
6002                 }
6003
6004                 case NDR_SAMR_QUERYUSERINFO2: {
6005                         struct samr_QueryUserInfo2 *r = (struct samr_QueryUserInfo2 *)_r;
6006                         ZERO_STRUCT(r->out);
6007                         r->out.info = talloc_zero(mem_ctx, union samr_UserInfo *);
6008                         if (r->out.info == NULL) {
6009                         return NT_STATUS_NO_MEMORY;
6010                         }
6011
6012                         r->out.result = _samr_QueryUserInfo2(cli->pipes_struct, r);
6013                         return NT_STATUS_OK;
6014                 }
6015
6016                 case NDR_SAMR_QUERYDISPLAYINFO2: {
6017                         struct samr_QueryDisplayInfo2 *r = (struct samr_QueryDisplayInfo2 *)_r;
6018                         ZERO_STRUCT(r->out);
6019                         r->out.total_size = talloc_zero(mem_ctx, uint32_t);
6020                         if (r->out.total_size == NULL) {
6021                         return NT_STATUS_NO_MEMORY;
6022                         }
6023
6024                         r->out.returned_size = talloc_zero(mem_ctx, uint32_t);
6025                         if (r->out.returned_size == NULL) {
6026                         return NT_STATUS_NO_MEMORY;
6027                         }
6028
6029                         r->out.info = talloc_zero(mem_ctx, union samr_DispInfo);
6030                         if (r->out.info == NULL) {
6031                         return NT_STATUS_NO_MEMORY;
6032                         }
6033
6034                         r->out.result = _samr_QueryDisplayInfo2(cli->pipes_struct, r);
6035                         return NT_STATUS_OK;
6036                 }
6037
6038                 case NDR_SAMR_GETDISPLAYENUMERATIONINDEX2: {
6039                         struct samr_GetDisplayEnumerationIndex2 *r = (struct samr_GetDisplayEnumerationIndex2 *)_r;
6040                         ZERO_STRUCT(r->out);
6041                         r->out.idx = talloc_zero(mem_ctx, uint32_t);
6042                         if (r->out.idx == NULL) {
6043                         return NT_STATUS_NO_MEMORY;
6044                         }
6045
6046                         r->out.result = _samr_GetDisplayEnumerationIndex2(cli->pipes_struct, r);
6047                         return NT_STATUS_OK;
6048                 }
6049
6050                 case NDR_SAMR_CREATEUSER2: {
6051                         struct samr_CreateUser2 *r = (struct samr_CreateUser2 *)_r;
6052                         ZERO_STRUCT(r->out);
6053                         r->out.user_handle = talloc_zero(mem_ctx, struct policy_handle);
6054                         if (r->out.user_handle == NULL) {
6055                         return NT_STATUS_NO_MEMORY;
6056                         }
6057
6058                         r->out.access_granted = talloc_zero(mem_ctx, uint32_t);
6059                         if (r->out.access_granted == NULL) {
6060                         return NT_STATUS_NO_MEMORY;
6061                         }
6062
6063                         r->out.rid = talloc_zero(mem_ctx, uint32_t);
6064                         if (r->out.rid == NULL) {
6065                         return NT_STATUS_NO_MEMORY;
6066                         }
6067
6068                         r->out.result = _samr_CreateUser2(cli->pipes_struct, r);
6069                         return NT_STATUS_OK;
6070                 }
6071
6072                 case NDR_SAMR_QUERYDISPLAYINFO3: {
6073                         struct samr_QueryDisplayInfo3 *r = (struct samr_QueryDisplayInfo3 *)_r;
6074                         ZERO_STRUCT(r->out);
6075                         r->out.total_size = talloc_zero(mem_ctx, uint32_t);
6076                         if (r->out.total_size == NULL) {
6077                         return NT_STATUS_NO_MEMORY;
6078                         }
6079
6080                         r->out.returned_size = talloc_zero(mem_ctx, uint32_t);
6081                         if (r->out.returned_size == NULL) {
6082                         return NT_STATUS_NO_MEMORY;
6083                         }
6084
6085                         r->out.info = talloc_zero(mem_ctx, union samr_DispInfo);
6086                         if (r->out.info == NULL) {
6087                         return NT_STATUS_NO_MEMORY;
6088                         }
6089
6090                         r->out.result = _samr_QueryDisplayInfo3(cli->pipes_struct, r);
6091                         return NT_STATUS_OK;
6092                 }
6093
6094                 case NDR_SAMR_ADDMULTIPLEMEMBERSTOALIAS: {
6095                         struct samr_AddMultipleMembersToAlias *r = (struct samr_AddMultipleMembersToAlias *)_r;
6096                         r->out.result = _samr_AddMultipleMembersToAlias(cli->pipes_struct, r);
6097                         return NT_STATUS_OK;
6098                 }
6099
6100                 case NDR_SAMR_REMOVEMULTIPLEMEMBERSFROMALIAS: {
6101                         struct samr_RemoveMultipleMembersFromAlias *r = (struct samr_RemoveMultipleMembersFromAlias *)_r;
6102                         r->out.result = _samr_RemoveMultipleMembersFromAlias(cli->pipes_struct, r);
6103                         return NT_STATUS_OK;
6104                 }
6105
6106                 case NDR_SAMR_OEMCHANGEPASSWORDUSER2: {
6107                         struct samr_OemChangePasswordUser2 *r = (struct samr_OemChangePasswordUser2 *)_r;
6108                         r->out.result = _samr_OemChangePasswordUser2(cli->pipes_struct, r);
6109                         return NT_STATUS_OK;
6110                 }
6111
6112                 case NDR_SAMR_CHANGEPASSWORDUSER2: {
6113                         struct samr_ChangePasswordUser2 *r = (struct samr_ChangePasswordUser2 *)_r;
6114                         r->out.result = _samr_ChangePasswordUser2(cli->pipes_struct, r);
6115                         return NT_STATUS_OK;
6116                 }
6117
6118                 case NDR_SAMR_GETDOMPWINFO: {
6119                         struct samr_GetDomPwInfo *r = (struct samr_GetDomPwInfo *)_r;
6120                         ZERO_STRUCT(r->out);
6121                         r->out.info = talloc_zero(mem_ctx, struct samr_PwInfo);
6122                         if (r->out.info == NULL) {
6123                         return NT_STATUS_NO_MEMORY;
6124                         }
6125
6126                         r->out.result = _samr_GetDomPwInfo(cli->pipes_struct, r);
6127                         return NT_STATUS_OK;
6128                 }
6129
6130                 case NDR_SAMR_CONNECT2: {
6131                         struct samr_Connect2 *r = (struct samr_Connect2 *)_r;
6132                         ZERO_STRUCT(r->out);
6133                         r->out.connect_handle = talloc_zero(mem_ctx, struct policy_handle);
6134                         if (r->out.connect_handle == NULL) {
6135                         return NT_STATUS_NO_MEMORY;
6136                         }
6137
6138                         r->out.result = _samr_Connect2(cli->pipes_struct, r);
6139                         return NT_STATUS_OK;
6140                 }
6141
6142                 case NDR_SAMR_SETUSERINFO2: {
6143                         struct samr_SetUserInfo2 *r = (struct samr_SetUserInfo2 *)_r;
6144                         r->out.result = _samr_SetUserInfo2(cli->pipes_struct, r);
6145                         return NT_STATUS_OK;
6146                 }
6147
6148                 case NDR_SAMR_SETBOOTKEYINFORMATION: {
6149                         struct samr_SetBootKeyInformation *r = (struct samr_SetBootKeyInformation *)_r;
6150                         r->out.result = _samr_SetBootKeyInformation(cli->pipes_struct, r);
6151                         return NT_STATUS_OK;
6152                 }
6153
6154                 case NDR_SAMR_GETBOOTKEYINFORMATION: {
6155                         struct samr_GetBootKeyInformation *r = (struct samr_GetBootKeyInformation *)_r;
6156                         ZERO_STRUCT(r->out);
6157                         r->out.unknown = talloc_zero(mem_ctx, uint32_t);
6158                         if (r->out.unknown == NULL) {
6159                         return NT_STATUS_NO_MEMORY;
6160                         }
6161
6162                         r->out.result = _samr_GetBootKeyInformation(cli->pipes_struct, r);
6163                         return NT_STATUS_OK;
6164                 }
6165
6166                 case NDR_SAMR_CONNECT3: {
6167                         struct samr_Connect3 *r = (struct samr_Connect3 *)_r;
6168                         ZERO_STRUCT(r->out);
6169                         r->out.connect_handle = talloc_zero(mem_ctx, struct policy_handle);
6170                         if (r->out.connect_handle == NULL) {
6171                         return NT_STATUS_NO_MEMORY;
6172                         }
6173
6174                         r->out.result = _samr_Connect3(cli->pipes_struct, r);
6175                         return NT_STATUS_OK;
6176                 }
6177
6178                 case NDR_SAMR_CONNECT4: {
6179                         struct samr_Connect4 *r = (struct samr_Connect4 *)_r;
6180                         ZERO_STRUCT(r->out);
6181                         r->out.connect_handle = talloc_zero(mem_ctx, struct policy_handle);
6182                         if (r->out.connect_handle == NULL) {
6183                         return NT_STATUS_NO_MEMORY;
6184                         }
6185
6186                         r->out.result = _samr_Connect4(cli->pipes_struct, r);
6187                         return NT_STATUS_OK;
6188                 }
6189
6190                 case NDR_SAMR_CHANGEPASSWORDUSER3: {
6191                         struct samr_ChangePasswordUser3 *r = (struct samr_ChangePasswordUser3 *)_r;
6192                         ZERO_STRUCT(r->out);
6193                         r->out.dominfo = talloc_zero(mem_ctx, struct samr_DomInfo1 *);
6194                         if (r->out.dominfo == NULL) {
6195                         return NT_STATUS_NO_MEMORY;
6196                         }
6197
6198                         r->out.reject = talloc_zero(mem_ctx, struct userPwdChangeFailureInformation *);
6199                         if (r->out.reject == NULL) {
6200                         return NT_STATUS_NO_MEMORY;
6201                         }
6202
6203                         r->out.result = _samr_ChangePasswordUser3(cli->pipes_struct, r);
6204                         return NT_STATUS_OK;
6205                 }
6206
6207                 case NDR_SAMR_CONNECT5: {
6208                         struct samr_Connect5 *r = (struct samr_Connect5 *)_r;
6209                         ZERO_STRUCT(r->out);
6210                         r->out.level_out = talloc_zero(mem_ctx, uint32_t);
6211                         if (r->out.level_out == NULL) {
6212                         return NT_STATUS_NO_MEMORY;
6213                         }
6214
6215                         r->out.info_out = talloc_zero(mem_ctx, union samr_ConnectInfo);
6216                         if (r->out.info_out == NULL) {
6217                         return NT_STATUS_NO_MEMORY;
6218                         }
6219
6220                         r->out.connect_handle = talloc_zero(mem_ctx, struct policy_handle);
6221                         if (r->out.connect_handle == NULL) {
6222                         return NT_STATUS_NO_MEMORY;
6223                         }
6224
6225                         r->out.result = _samr_Connect5(cli->pipes_struct, r);
6226                         return NT_STATUS_OK;
6227                 }
6228
6229                 case NDR_SAMR_RIDTOSID: {
6230                         struct samr_RidToSid *r = (struct samr_RidToSid *)_r;
6231                         ZERO_STRUCT(r->out);
6232                         r->out.sid = talloc_zero(mem_ctx, struct dom_sid2 *);
6233                         if (r->out.sid == NULL) {
6234                         return NT_STATUS_NO_MEMORY;
6235                         }
6236
6237                         r->out.result = _samr_RidToSid(cli->pipes_struct, r);
6238                         return NT_STATUS_OK;
6239                 }
6240
6241                 case NDR_SAMR_SETDSRMPASSWORD: {
6242                         struct samr_SetDsrmPassword *r = (struct samr_SetDsrmPassword *)_r;
6243                         r->out.result = _samr_SetDsrmPassword(cli->pipes_struct, r);
6244                         return NT_STATUS_OK;
6245                 }
6246
6247                 case NDR_SAMR_VALIDATEPASSWORD: {
6248                         struct samr_ValidatePassword *r = (struct samr_ValidatePassword *)_r;
6249                         ZERO_STRUCT(r->out);
6250                         r->out.rep = talloc_zero(mem_ctx, union samr_ValidatePasswordRep *);
6251                         if (r->out.rep == NULL) {
6252                         return NT_STATUS_NO_MEMORY;
6253                         }
6254
6255                         r->out.result = _samr_ValidatePassword(cli->pipes_struct, r);
6256                         return NT_STATUS_OK;
6257                 }
6258
6259                 default:
6260                         return NT_STATUS_NOT_IMPLEMENTED;
6261         }
6262 }
6263
6264 NTSTATUS rpc_samr_init(void)
6265 {
6266         return rpc_srv_register(SMB_RPC_INTERFACE_VERSION, "samr", "samr", &ndr_table_samr, api_samr_cmds, sizeof(api_samr_cmds) / sizeof(struct api_struct));
6267 }