Added Michael Sweet's CUPS patch to call directly into the CUPS backend.
[samba.git] / source3 / rpc_server / srv_samr.c
1 /* 
2  *  Unix SMB/Netbios implementation.
3  *  Version 1.9.
4  *  RPC Pipe client / server routines
5  *  Copyright (C) Andrew Tridgell              1992-1997,
6  *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
7  *  Copyright (C) Paul Ashton                       1997.
8  *  Copyright (C) Marc Jacobsen                                         1999.
9  *      
10  *      Split into interface and implementation modules by, 
11  *
12  *  Copyright (C) Jeremy Allison                    2001.
13  *  
14  *  This program is free software; you can redistribute it and/or modify
15  *  it under the terms of the GNU General Public License as published by
16  *  the Free Software Foundation; either version 2 of the License, or
17  *  (at your option) any later version.
18  *  
19  *  This program is distributed in the hope that it will be useful,
20  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  *  GNU General Public License for more details.
23  *  
24  *  You should have received a copy of the GNU General Public License
25  *  along with this program; if not, write to the Free Software
26  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27  */
28
29 /*
30  * This is the interface to the SAMR code.
31  */
32
33 #include "includes.h"
34
35 extern int DEBUGLEVEL;
36
37 /*******************************************************************
38  api_samr_close_hnd
39  ********************************************************************/
40
41 static BOOL api_samr_close_hnd(pipes_struct *p)
42 {
43         SAMR_Q_CLOSE_HND q_u;
44         SAMR_R_CLOSE_HND r_u;
45         prs_struct *data = &p->in_data.data;
46         prs_struct *rdata = &p->out_data.rdata;
47
48         ZERO_STRUCT(q_u);
49         ZERO_STRUCT(r_u);
50
51         if(!samr_io_q_close_hnd("", &q_u, data, 0)) {
52                 DEBUG(0,("api_samr_close_hnd: unable to unmarshall SAMR_Q_CLOSE_HND.\n"));
53                 return False;
54         }
55
56         r_u.status = _samr_close_hnd(p, &q_u, &r_u);
57
58         /* store the response in the SMB stream */
59         if(!samr_io_r_close_hnd("", &r_u, rdata, 0)) {
60                 DEBUG(0,("api_samr_close_hnd: unable to marshall SAMR_R_CLOSE_HND.\n"));
61                 return False;
62         }
63
64         return True;
65 }
66
67 /*******************************************************************
68  api_samr_open_domain
69  ********************************************************************/
70
71 static BOOL api_samr_open_domain(pipes_struct *p)
72 {
73         SAMR_Q_OPEN_DOMAIN q_u;
74         SAMR_R_OPEN_DOMAIN r_u;
75
76         prs_struct *data = &p->in_data.data;
77         prs_struct *rdata = &p->out_data.rdata;
78
79         ZERO_STRUCT(q_u);
80         ZERO_STRUCT(r_u);
81
82         if(!samr_io_q_open_domain("", &q_u, data, 0)) {
83                 DEBUG(0,("api_samr_open_domain: unable to unmarshall SAMR_Q_OPEN_DOMAIN.\n"));
84                 return False;
85         }
86
87         r_u.status = _samr_open_domain(p, &q_u, &r_u);
88
89         /* store the response in the SMB stream */
90         if(!samr_io_r_open_domain("", &r_u, rdata, 0)) {
91                 DEBUG(0,("api_samr_open_domain: unable to marshall SAMR_R_OPEN_DOMAIN.\n"));
92                 return False;
93         }
94
95         return True;
96 }
97
98 /*******************************************************************
99  api_samr_get_usrdom_pwinfo
100  ********************************************************************/
101
102 static BOOL api_samr_get_usrdom_pwinfo(pipes_struct *p)
103 {
104         SAMR_Q_GET_USRDOM_PWINFO q_u;
105         SAMR_R_GET_USRDOM_PWINFO r_u;
106
107         prs_struct *data = &p->in_data.data;
108         prs_struct *rdata = &p->out_data.rdata;
109
110         ZERO_STRUCT(q_u);
111         ZERO_STRUCT(r_u);
112
113         if(!samr_io_q_get_usrdom_pwinfo("", &q_u, data, 0))
114                 return False;
115
116         r_u.status = _samr_get_usrdom_pwinfo(p, &q_u, &r_u);
117
118         if(!samr_io_r_get_usrdom_pwinfo("", &r_u, rdata, 0))
119                 return False;
120
121         return True;
122 }
123
124 /*******************************************************************
125  api_samr_query_sec_obj
126  ********************************************************************/
127
128 static BOOL api_samr_query_sec_obj(pipes_struct *p)
129 {
130         SAMR_Q_QUERY_SEC_OBJ q_u;
131         SAMR_R_QUERY_SEC_OBJ r_u;
132
133         prs_struct *data = &p->in_data.data;
134         prs_struct *rdata = &p->out_data.rdata;
135
136         ZERO_STRUCT(q_u);
137         ZERO_STRUCT(r_u);
138
139         if(!samr_io_q_query_sec_obj("", &q_u, data, 0))
140                 return False;
141
142         r_u.status = _samr_query_sec_obj(p, &q_u, &r_u);
143
144         if(!samr_io_r_query_sec_obj("", &r_u, rdata, 0))
145                 return False;
146
147         return True;
148 }
149
150 /*******************************************************************
151  api_samr_enum_dom_users
152  ********************************************************************/
153
154 static BOOL api_samr_enum_dom_users(pipes_struct *p)
155 {
156         SAMR_Q_ENUM_DOM_USERS q_u;
157         SAMR_R_ENUM_DOM_USERS r_u;
158         prs_struct *data = &p->in_data.data;
159         prs_struct *rdata = &p->out_data.rdata;
160
161         ZERO_STRUCT(q_u);
162         ZERO_STRUCT(r_u);
163
164         /* grab the samr open */
165         if(!samr_io_q_enum_dom_users("", &q_u, data, 0))
166                 return False;
167
168         r_u.status = _samr_enum_dom_users(p, &q_u, &r_u);
169
170         /* store the response in the SMB stream */
171         if(!samr_io_r_enum_dom_users("", &r_u, rdata, 0))
172                 return False;
173
174         return True;
175 }
176
177 /*******************************************************************
178  api_samr_enum_dom_groups
179  ********************************************************************/
180
181 static BOOL api_samr_enum_dom_groups(pipes_struct *p)
182 {
183         SAMR_Q_ENUM_DOM_GROUPS q_u;
184         SAMR_R_ENUM_DOM_GROUPS r_u;
185         prs_struct *data = &p->in_data.data;
186         prs_struct *rdata = &p->out_data.rdata;
187
188         ZERO_STRUCT(q_u);
189         ZERO_STRUCT(r_u);
190
191         /* grab the samr open */
192         if(!samr_io_q_enum_dom_groups("", &q_u, data, 0))
193                 return False;
194
195         r_u.status = _samr_enum_dom_groups(p, &q_u, &r_u);
196
197         /* store the response in the SMB stream */
198         if(!samr_io_r_enum_dom_groups("", &r_u, rdata, 0))
199                 return False;
200
201         return True;
202 }
203
204 /*******************************************************************
205  api_samr_enum_dom_aliases
206  ********************************************************************/
207
208 static BOOL api_samr_enum_dom_aliases(pipes_struct *p)
209 {
210         SAMR_Q_ENUM_DOM_ALIASES q_u;
211         SAMR_R_ENUM_DOM_ALIASES r_u;
212         prs_struct *data = &p->in_data.data;
213         prs_struct *rdata = &p->out_data.rdata;
214         
215         ZERO_STRUCT(q_u);
216         ZERO_STRUCT(r_u);
217
218         /* grab the samr open */
219         if(!samr_io_q_enum_dom_aliases("", &q_u, data, 0))
220                 return False;
221
222         r_u.status = _samr_enum_dom_aliases(p, &q_u, &r_u);
223
224         /* store the response in the SMB stream */
225         if(!samr_io_r_enum_dom_aliases("", &r_u, rdata, 0))
226                 return False;
227
228         return True;
229 }
230
231 /*******************************************************************
232  api_samr_query_dispinfo
233  ********************************************************************/
234
235 static BOOL api_samr_query_dispinfo(pipes_struct *p)
236 {
237         SAMR_Q_QUERY_DISPINFO q_u;
238         SAMR_R_QUERY_DISPINFO r_u;
239         prs_struct *data = &p->in_data.data;
240         prs_struct *rdata = &p->out_data.rdata;
241
242         ZERO_STRUCT(q_u);
243         ZERO_STRUCT(r_u);
244
245         if(!samr_io_q_query_dispinfo("", &q_u, data, 0))
246                 return False;
247
248         r_u.status = _samr_query_dispinfo(p, &q_u, &r_u);
249
250         /* store the response in the SMB stream */
251         if(!samr_io_r_query_dispinfo("", &r_u, rdata, 0))
252                 return False;
253
254         return True;
255 }
256
257 /*******************************************************************
258  api_samr_query_aliasinfo
259  ********************************************************************/
260
261 static BOOL api_samr_query_aliasinfo(pipes_struct *p)
262 {
263         SAMR_Q_QUERY_ALIASINFO q_u;
264         SAMR_R_QUERY_ALIASINFO r_u;
265         prs_struct *data = &p->in_data.data;
266         prs_struct *rdata = &p->out_data.rdata;
267
268         ZERO_STRUCT(q_u);
269         ZERO_STRUCT(r_u);
270
271         /* grab the samr open */
272         if(!samr_io_q_query_aliasinfo("", &q_u, data, 0))
273                 return False;
274
275         r_u.status = _samr_query_aliasinfo(p, &q_u, &r_u);
276
277         /* store the response in the SMB stream */
278         if(!samr_io_r_query_aliasinfo("", &r_u, rdata, 0))
279                 return False;
280   
281         return True;
282 }
283
284 /*******************************************************************
285  api_samr_lookup_names
286  ********************************************************************/
287
288 static BOOL api_samr_lookup_names(pipes_struct *p)
289 {
290         SAMR_Q_LOOKUP_NAMES q_u;
291         SAMR_R_LOOKUP_NAMES r_u;
292         prs_struct *data = &p->in_data.data;
293         prs_struct *rdata = &p->out_data.rdata;
294
295         ZERO_STRUCT(q_u);
296         ZERO_STRUCT(r_u);
297
298         /* grab the samr lookup names */
299         if(!samr_io_q_lookup_names("", &q_u, data, 0))
300                 return False;
301
302         r_u.status = _samr_lookup_names(p, &q_u, &r_u);
303
304         /* store the response in the SMB stream */
305         if(!samr_io_r_lookup_names("", &r_u, rdata, 0))
306                 return False;
307
308         return True;
309 }
310
311 /*******************************************************************
312  api_samr_chgpasswd_user
313  ********************************************************************/
314
315 static BOOL api_samr_chgpasswd_user(pipes_struct *p)
316 {
317         SAMR_Q_CHGPASSWD_USER q_u;
318         SAMR_R_CHGPASSWD_USER r_u;
319         prs_struct *data = &p->in_data.data;
320         prs_struct *rdata = &p->out_data.rdata;
321
322         ZERO_STRUCT(q_u);
323         ZERO_STRUCT(r_u);
324
325         /* unknown 38 command */
326         if (!samr_io_q_chgpasswd_user("", &q_u, data, 0)) {
327                 DEBUG(0,("api_samr_chgpasswd_user: Failed to unmarshall SAMR_Q_CHGPASSWD_USER.\n"));
328                 return False;
329         }
330
331         r_u.status = _samr_chgpasswd_user(p, &q_u, &r_u);
332
333         /* store the response in the SMB stream */
334         if(!samr_io_r_chgpasswd_user("", &r_u, rdata, 0)) {
335                 DEBUG(0,("api_samr_chgpasswd_user: Failed to marshall SAMR_R_CHGPASSWD_USER.\n" ));
336                 return False;
337         }
338
339         return True;
340 }
341
342 /*******************************************************************
343  api_samr_lookup_rids
344  ********************************************************************/
345
346 static BOOL api_samr_lookup_rids(pipes_struct *p)
347 {
348         SAMR_Q_LOOKUP_RIDS q_u;
349         SAMR_R_LOOKUP_RIDS r_u;
350         prs_struct *data = &p->in_data.data;
351         prs_struct *rdata = &p->out_data.rdata;
352
353         ZERO_STRUCT(q_u);
354         ZERO_STRUCT(r_u);
355
356         /* grab the samr lookup names */
357         if(!samr_io_q_lookup_rids("", &q_u, data, 0))
358                 return False;
359
360         r_u.status = _samr_lookup_rids(p, &q_u, &r_u);
361
362         /* store the response in the SMB stream */
363         if(!samr_io_r_lookup_rids("", &r_u, rdata, 0))
364                 return False;
365
366         return True;
367 }
368
369 /*******************************************************************
370  api_samr_open_user
371  ********************************************************************/
372
373 static BOOL api_samr_open_user(pipes_struct *p)
374 {
375         SAMR_Q_OPEN_USER q_u;
376         SAMR_R_OPEN_USER r_u;
377         prs_struct *data = &p->in_data.data;
378         prs_struct *rdata = &p->out_data.rdata;
379
380         ZERO_STRUCT(q_u);
381         ZERO_STRUCT(r_u);
382
383         /* grab the samr unknown 22 */
384         if(!samr_io_q_open_user("", &q_u, data, 0))
385                 return False;
386
387         r_u.status = _api_samr_open_user(p, &q_u, &r_u);
388
389         /* store the response in the SMB stream */
390         if(!samr_io_r_open_user("", &r_u, rdata, 0))
391                 return False;
392
393         DEBUG(5,("samr_open_user: %d\n", __LINE__));
394
395         return True;
396 }
397
398 /*******************************************************************
399  api_samr_query_userinfo
400  ********************************************************************/
401
402 static BOOL api_samr_query_userinfo(pipes_struct *p)
403 {
404         SAMR_Q_QUERY_USERINFO q_u;
405         SAMR_R_QUERY_USERINFO r_u;
406         prs_struct *data = &p->in_data.data;
407         prs_struct *rdata = &p->out_data.rdata;
408
409         ZERO_STRUCT(q_u);
410         ZERO_STRUCT(r_u);
411
412         /* grab the samr unknown 24 */
413         if(!samr_io_q_query_userinfo("", &q_u, data, 0))
414                 return False;
415
416         r_u.status = _samr_query_userinfo(p, &q_u, &r_u);
417
418         /* store the response in the SMB stream */
419         if(!samr_io_r_query_userinfo("", &r_u, rdata, 0))
420                 return False;
421
422         return True;
423 }
424
425 /*******************************************************************
426  api_samr_query_usergroups
427  ********************************************************************/
428
429 static BOOL api_samr_query_usergroups(pipes_struct *p)
430 {
431         SAMR_Q_QUERY_USERGROUPS q_u;
432         SAMR_R_QUERY_USERGROUPS r_u;
433         prs_struct *data = &p->in_data.data;
434         prs_struct *rdata = &p->out_data.rdata;
435
436         ZERO_STRUCT(q_u);
437         ZERO_STRUCT(r_u);
438
439         /* grab the samr unknown 32 */
440         if(!samr_io_q_query_usergroups("", &q_u, data, 0))
441                 return False;
442
443         r_u.status = _samr_query_usergroups(p, &q_u, &r_u);
444
445         /* store the response in the SMB stream */
446         if(!samr_io_r_query_usergroups("", &r_u, rdata, 0)) {
447                 return False;
448         }
449
450         return True;
451 }
452
453 /*******************************************************************
454  api_samr_query_dom_info
455  ********************************************************************/
456
457 static BOOL api_samr_query_dom_info(pipes_struct *p)
458 {
459         SAMR_Q_QUERY_DOMAIN_INFO q_u;
460         SAMR_R_QUERY_DOMAIN_INFO r_u;
461         prs_struct *data = &p->in_data.data;
462         prs_struct *rdata = &p->out_data.rdata;
463
464         ZERO_STRUCT(q_u);
465         ZERO_STRUCT(r_u);
466
467         /* grab the samr unknown 8 command */
468         if(!samr_io_q_query_dom_info("", &q_u, data, 0))
469                 return False;
470
471         r_u.status = _samr_query_dom_info(p, &q_u, &r_u);
472
473         /* store the response in the SMB stream */
474         if(!samr_io_r_query_dom_info("", &r_u, rdata, 0))
475                 return False;
476
477         DEBUG(5,("api_samr_query_dom_info: %d\n", __LINE__));
478
479         return True;
480 }
481
482 /*******************************************************************
483  api_samr_create_user
484  ********************************************************************/
485
486 static BOOL api_samr_create_user(pipes_struct *p)
487 {
488         prs_struct *data = &p->in_data.data;
489         prs_struct *rdata = &p->out_data.rdata;
490
491         SAMR_Q_CREATE_USER q_u;
492         SAMR_R_CREATE_USER r_u;
493
494         ZERO_STRUCT(q_u);
495         ZERO_STRUCT(r_u);
496
497         /* grab the samr create user */
498         if (!samr_io_q_create_user("", &q_u, data, 0)) {
499                 DEBUG(0,("api_samr_create_user: Unable to unmarshall SAMR_Q_CREATE_USER.\n"));
500                 return False;
501         }
502
503         r_u.status=_api_samr_create_user(p, &q_u, &r_u);
504
505         /* store the response in the SMB stream */
506         if(!samr_io_r_create_user("", &r_u, rdata, 0)) {
507                 DEBUG(0,("api_samr_create_user: Unable to marshall SAMR_R_CREATE_USER.\n"));
508                 return False;
509         }
510
511         return True;
512 }
513
514 /*******************************************************************
515  api_samr_connect_anon
516  ********************************************************************/
517
518 static BOOL api_samr_connect_anon(pipes_struct *p)
519 {
520         SAMR_Q_CONNECT_ANON q_u;
521         SAMR_R_CONNECT_ANON r_u;
522         prs_struct *data = &p->in_data.data;
523         prs_struct *rdata = &p->out_data.rdata;
524
525         ZERO_STRUCT(q_u);
526         ZERO_STRUCT(r_u);
527
528         /* grab the samr open policy */
529         if(!samr_io_q_connect_anon("", &q_u, data, 0))
530                 return False;
531
532         r_u.status = _samr_connect_anon(p, &q_u, &r_u);
533
534         /* store the response in the SMB stream */
535         if(!samr_io_r_connect_anon("", &r_u, rdata, 0))
536                 return False;
537
538         return True;
539 }
540
541 /*******************************************************************
542  api_samr_connect
543  ********************************************************************/
544
545 static BOOL api_samr_connect(pipes_struct *p)
546 {
547         SAMR_Q_CONNECT q_u;
548         SAMR_R_CONNECT r_u;
549         prs_struct *data = &p->in_data.data;
550         prs_struct *rdata = &p->out_data.rdata;
551
552         ZERO_STRUCT(q_u);
553         ZERO_STRUCT(r_u);
554
555         /* grab the samr open policy */
556         if(!samr_io_q_connect("", &q_u, data, 0))
557                 return False;
558
559         r_u.status = _samr_connect(p, &q_u, &r_u);
560
561         /* store the response in the SMB stream */
562         if(!samr_io_r_connect("", &r_u, rdata, 0))
563                 return False;
564
565         return True;
566 }
567
568 /**********************************************************************
569  api_samr_lookup_domain
570  **********************************************************************/
571
572 static BOOL api_samr_lookup_domain(pipes_struct *p)
573 {
574         SAMR_Q_LOOKUP_DOMAIN q_u;
575         SAMR_R_LOOKUP_DOMAIN r_u;
576         prs_struct *data = &p->in_data.data;
577         prs_struct *rdata = &p->out_data.rdata;
578   
579         ZERO_STRUCT(q_u);
580         ZERO_STRUCT(r_u);
581
582         if(!samr_io_q_lookup_domain("", &q_u, data, 0)) {
583                 DEBUG(0,("api_samr_lookup_domain: Unable to unmarshall SAMR_Q_LOOKUP_DOMAIN.\n"));
584                 return False;
585         }
586
587         r_u.status = _samr_lookup_domain(p, &q_u, &r_u);
588         
589         if(!samr_io_r_lookup_domain("", &r_u, rdata, 0)){
590                 DEBUG(0,("api_samr_lookup_domain: Unable to marshall SAMR_R_LOOKUP_DOMAIN.\n"));
591                 return False;
592         }
593         
594         return True;
595 }
596
597 /**********************************************************************
598  api_samr_enum_domains
599  **********************************************************************/
600
601 static BOOL api_samr_enum_domains(pipes_struct *p)
602 {
603         SAMR_Q_ENUM_DOMAINS q_u;
604         SAMR_R_ENUM_DOMAINS r_u;
605         prs_struct *data = &p->in_data.data;
606         prs_struct *rdata = &p->out_data.rdata;
607   
608         ZERO_STRUCT(q_u);
609         ZERO_STRUCT(r_u);
610
611         if(!samr_io_q_enum_domains("", &q_u, data, 0)) {
612                 DEBUG(0,("api_samr_enum_domains: Unable to unmarshall SAMR_Q_ENUM_DOMAINS.\n"));
613                 return False;
614         }
615
616         r_u.status = _samr_enum_domains(p, &q_u, &r_u);
617
618         if(!samr_io_r_enum_domains("", &r_u, rdata, 0)) {
619                 DEBUG(0,("api_samr_enum_domains: Unable to marshall SAMR_R_ENUM_DOMAINS.\n"));
620                 return False;
621         }
622         
623         return True;
624 }
625
626 /*******************************************************************
627  api_samr_open_alias
628  ********************************************************************/
629
630 static BOOL api_samr_open_alias(pipes_struct *p)
631 {
632         SAMR_Q_OPEN_ALIAS q_u;
633         SAMR_R_OPEN_ALIAS r_u;
634         prs_struct *data = &p->in_data.data;
635         prs_struct *rdata = &p->out_data.rdata;
636
637         ZERO_STRUCT(q_u);
638         ZERO_STRUCT(r_u);
639
640         /* grab the samr open policy */
641         if(!samr_io_q_open_alias("", &q_u, data, 0)) {
642                 DEBUG(0,("api_samr_open_alias: Unable to unmarshall SAMR_Q_OPEN_ALIAS.\n"));
643                 return False;
644         }
645
646         r_u.status=_api_samr_open_alias(p, &q_u, &r_u);
647
648         /* store the response in the SMB stream */
649         if(!samr_io_r_open_alias("", &r_u, rdata, 0)) {
650                 DEBUG(0,("api_samr_open_alias: Unable to marshall SAMR_R_OPEN_ALIAS.\n"));
651                 return False;
652         }
653         
654         return True;
655 }
656
657 /*******************************************************************
658  api_samr_set_userinfo
659  ********************************************************************/
660
661 static BOOL api_samr_set_userinfo(pipes_struct *p)
662 {
663         SAMR_Q_SET_USERINFO q_u;
664         SAMR_R_SET_USERINFO r_u;
665         prs_struct *data = &p->in_data.data;
666         prs_struct *rdata = &p->out_data.rdata;
667
668         ZERO_STRUCT(q_u);
669         ZERO_STRUCT(r_u);
670
671         if (!samr_io_q_set_userinfo("", &q_u, data, 0)) {
672                 DEBUG(0,("api_samr_set_userinfo: Unable to unmarshall SAMR_Q_SET_USERINFO.\n"));
673                 return False;
674         }
675
676         r_u.status = _samr_set_userinfo(p, &q_u, &r_u);
677
678         if(!samr_io_r_set_userinfo("", &r_u, rdata, 0)) {
679                 DEBUG(0,("api_samr_set_userinfo: Unable to marshall SAMR_R_SET_USERINFO.\n"));
680                 return False;
681         }
682
683         return True;
684 }
685
686 /*******************************************************************
687  api_samr_set_userinfo2
688  ********************************************************************/
689
690 static BOOL api_samr_set_userinfo2(pipes_struct *p)
691 {
692         SAMR_Q_SET_USERINFO2 q_u;
693         SAMR_R_SET_USERINFO2 r_u;
694
695         prs_struct *data = &p->in_data.data;
696         prs_struct *rdata = &p->out_data.rdata;
697
698         ZERO_STRUCT(q_u);
699         ZERO_STRUCT(r_u);
700
701         if (!samr_io_q_set_userinfo2("", &q_u, data, 0)) {
702                 DEBUG(0,("api_samr_set_userinfo2: Unable to unmarshall SAMR_Q_SET_USERINFO2.\n"));
703                 return False;
704         }
705
706         r_u.status = _samr_set_userinfo2(p, &q_u, &r_u);
707
708         if(!samr_io_r_set_userinfo2("", &r_u, rdata, 0)) {
709                 DEBUG(0,("api_samr_set_userinfo2: Unable to marshall SAMR_R_SET_USERINFO2.\n"));
710                 return False;
711         }
712
713         return True;
714 }
715
716 /*******************************************************************
717  api_samr_query_useraliases
718  ********************************************************************/
719
720 static BOOL api_samr_query_useraliases(pipes_struct *p)
721 {
722         SAMR_Q_QUERY_USERALIASES q_u;
723         SAMR_R_QUERY_USERALIASES r_u;
724
725         prs_struct *data = &p->in_data.data;
726         prs_struct *rdata = &p->out_data.rdata;
727
728         ZERO_STRUCT(q_u);
729         ZERO_STRUCT(r_u);
730
731         if (!samr_io_q_query_useraliases("", &q_u, data, 0)) {
732                 DEBUG(0,("api_samr_query_useraliases:  Unable to unmarshall SAMR_Q_QUERY_USERALIASES.\n"));
733                 return False;
734         }
735
736         r_u.status = _samr_query_useraliases(p, &q_u, &r_u);
737
738         if (! samr_io_r_query_useraliases("", &r_u, rdata, 0)) {
739                 DEBUG(0,("api_samr_query_useraliases:  Unable to nmarshall SAMR_R_QUERY_USERALIASES.\n"));
740                 return False;
741         }
742
743         return True;
744 }
745
746 /*******************************************************************
747  api_samr_query_aliasmem
748  ********************************************************************/
749
750 static BOOL api_samr_query_aliasmem(pipes_struct *p)
751 {
752         SAMR_Q_QUERY_ALIASMEM q_u;
753         SAMR_R_QUERY_ALIASMEM r_u;
754
755         prs_struct *data = &p->in_data.data;
756         prs_struct *rdata = &p->out_data.rdata;
757
758         ZERO_STRUCT(q_u);
759         ZERO_STRUCT(r_u);
760
761         if (!samr_io_q_query_aliasmem("", &q_u, data, 0)) {
762                 return False;
763         }
764
765         r_u.status = _samr_query_aliasmem(p, &q_u, &r_u);
766
767         if (!samr_io_r_query_aliasmem("", &r_u, rdata, 0)) {
768                 return False;
769         }
770
771         return True;
772 }
773
774 /*******************************************************************
775  api_samr_query_groupmem
776  ********************************************************************/
777
778 static BOOL api_samr_query_groupmem(pipes_struct *p)
779 {
780         SAMR_Q_QUERY_GROUPMEM q_u;
781         SAMR_R_QUERY_GROUPMEM r_u;
782
783         prs_struct *data = &p->in_data.data;
784         prs_struct *rdata = &p->out_data.rdata;
785
786         ZERO_STRUCT(q_u);
787         ZERO_STRUCT(r_u);
788
789         if (!samr_io_q_query_groupmem("", &q_u, data, 0)) {
790                 return False;
791         }
792
793         r_u.status = _samr_query_groupmem(p, &q_u, &r_u);
794
795         if (!samr_io_r_query_groupmem("", &r_u, rdata, 0)) {
796                 return False;
797         }
798
799         return True;
800 }
801
802 /*******************************************************************
803  api_samr_add_aliasmem
804  ********************************************************************/
805
806 static BOOL api_samr_add_aliasmem(pipes_struct *p)
807 {
808         SAMR_Q_ADD_ALIASMEM q_u;
809         SAMR_R_ADD_ALIASMEM r_u;
810
811         prs_struct *data = &p->in_data.data;
812         prs_struct *rdata = &p->out_data.rdata;
813
814         ZERO_STRUCT(q_u);
815         ZERO_STRUCT(r_u);
816
817         if (!samr_io_q_add_aliasmem("", &q_u, data, 0)) {
818                 return False;
819         }
820
821         r_u.status = _samr_add_aliasmem(p, &q_u, &r_u);
822
823         if (!samr_io_r_add_aliasmem("", &r_u, rdata, 0)) {
824                 return False;
825         }
826
827         return True;
828 }
829
830 /*******************************************************************
831  api_samr_del_aliasmem
832  ********************************************************************/
833
834 static BOOL api_samr_del_aliasmem(pipes_struct *p)
835 {
836         SAMR_Q_DEL_ALIASMEM q_u;
837         SAMR_R_DEL_ALIASMEM r_u;
838
839         prs_struct *data = &p->in_data.data;
840         prs_struct *rdata = &p->out_data.rdata;
841
842         ZERO_STRUCT(q_u);
843         ZERO_STRUCT(r_u);
844
845         if (!samr_io_q_del_aliasmem("", &q_u, data, 0)) {
846                 return False;
847         }
848
849         r_u.status = _samr_del_aliasmem(p, &q_u, &r_u);
850
851         if (!samr_io_r_del_aliasmem("", &r_u, rdata, 0)) {
852                 return False;
853         }
854
855         return True;
856 }
857
858 /*******************************************************************
859  api_samr_add_groupmem
860  ********************************************************************/
861
862 static BOOL api_samr_add_groupmem(pipes_struct *p)
863 {
864         SAMR_Q_ADD_GROUPMEM q_u;
865         SAMR_R_ADD_GROUPMEM r_u;
866
867         prs_struct *data = &p->in_data.data;
868         prs_struct *rdata = &p->out_data.rdata;
869
870         ZERO_STRUCT(q_u);
871         ZERO_STRUCT(r_u);
872
873         if (!samr_io_q_add_groupmem("", &q_u, data, 0)) {
874                 return False;
875         }
876
877         r_u.status = _samr_add_groupmem(p, &q_u, &r_u);
878
879         if (!samr_io_r_add_groupmem("", &r_u, rdata, 0)) {
880                 return False;
881         }
882
883         return True;
884 }
885
886 /*******************************************************************
887  api_samr_del_groupmem
888  ********************************************************************/
889
890 static BOOL api_samr_del_groupmem(pipes_struct *p)
891 {
892         SAMR_Q_DEL_GROUPMEM q_u;
893         SAMR_R_DEL_GROUPMEM r_u;
894
895         prs_struct *data = &p->in_data.data;
896         prs_struct *rdata = &p->out_data.rdata;
897
898         ZERO_STRUCT(q_u);
899         ZERO_STRUCT(r_u);
900
901         if (!samr_io_q_del_groupmem("", &q_u, data, 0)) {
902                 return False;
903         }
904
905         r_u.status = _samr_del_groupmem(p, &q_u, &r_u);
906
907         if (!samr_io_r_del_groupmem("", &r_u, rdata, 0)) {
908                 return False;
909         }
910
911         return True;
912 }
913
914 /*******************************************************************
915  api_samr_delete_dom_user
916  ********************************************************************/
917
918 static BOOL api_samr_delete_dom_user(pipes_struct *p)
919 {
920         SAMR_Q_DELETE_DOM_USER q_u;
921         SAMR_R_DELETE_DOM_USER r_u;
922
923         prs_struct *data = &p->in_data.data;
924         prs_struct *rdata = &p->out_data.rdata;
925
926         ZERO_STRUCT(q_u);
927         ZERO_STRUCT(r_u);
928
929         if (!samr_io_q_delete_dom_user("", &q_u, data, 0)) {
930                 return False;
931         }
932
933         r_u.status = _samr_delete_dom_user(p, &q_u, &r_u);
934
935         if (!samr_io_r_delete_dom_user("", &r_u, rdata, 0)) {
936                 return False;
937         }
938
939         return True;
940 }
941
942 /*******************************************************************
943  api_samr_delete_dom_group
944  ********************************************************************/
945
946 static BOOL api_samr_delete_dom_group(pipes_struct *p)
947 {
948         SAMR_Q_DELETE_DOM_GROUP q_u;
949         SAMR_R_DELETE_DOM_GROUP r_u;
950
951         prs_struct *data = &p->in_data.data;
952         prs_struct *rdata = &p->out_data.rdata;
953
954         ZERO_STRUCT(q_u);
955         ZERO_STRUCT(r_u);
956
957         if (!samr_io_q_delete_dom_group("", &q_u, data, 0)) {
958                 return False;
959         }
960
961         r_u.status = _samr_delete_dom_group(p, &q_u, &r_u);
962
963         if (!samr_io_r_delete_dom_group("", &r_u, rdata, 0)) {
964                 return False;
965         }
966
967         return True;
968 }
969
970 /*******************************************************************
971  api_samr_delete_dom_alias
972  ********************************************************************/
973
974 static BOOL api_samr_delete_dom_alias(pipes_struct *p)
975 {
976         SAMR_Q_DELETE_DOM_ALIAS q_u;
977         SAMR_R_DELETE_DOM_ALIAS r_u;
978
979         prs_struct *data = &p->in_data.data;
980         prs_struct *rdata = &p->out_data.rdata;
981
982         ZERO_STRUCT(q_u);
983         ZERO_STRUCT(r_u);
984
985         if (!samr_io_q_delete_dom_alias("", &q_u, data, 0)) {
986                 return False;
987         }
988
989         r_u.status = _samr_delete_dom_alias(p, &q_u, &r_u);
990
991         if (!samr_io_r_delete_dom_alias("", &r_u, rdata, 0)) {
992                 return False;
993         }
994
995         return True;
996 }
997
998 /*******************************************************************
999  api_samr_create_dom_group
1000  ********************************************************************/
1001
1002 static BOOL api_samr_create_dom_group(pipes_struct *p)
1003 {
1004         SAMR_Q_CREATE_DOM_GROUP q_u;
1005         SAMR_R_CREATE_DOM_GROUP r_u;
1006
1007         prs_struct *data = &p->in_data.data;
1008         prs_struct *rdata = &p->out_data.rdata;
1009
1010         ZERO_STRUCT(q_u);
1011         ZERO_STRUCT(r_u);
1012
1013         if (!samr_io_q_create_dom_group("", &q_u, data, 0)) {
1014                 return False;
1015         }
1016
1017         r_u.status = _samr_create_dom_group(p, &q_u, &r_u);
1018
1019         if (!samr_io_r_create_dom_group("", &r_u, rdata, 0)) {
1020                 return False;
1021         }
1022
1023         return True;
1024 }
1025
1026 /*******************************************************************
1027  api_samr_create_dom_alias
1028  ********************************************************************/
1029
1030 static BOOL api_samr_create_dom_alias(pipes_struct *p)
1031 {
1032         SAMR_Q_CREATE_DOM_ALIAS q_u;
1033         SAMR_R_CREATE_DOM_ALIAS r_u;
1034
1035         prs_struct *data = &p->in_data.data;
1036         prs_struct *rdata = &p->out_data.rdata;
1037
1038         ZERO_STRUCT(q_u);
1039         ZERO_STRUCT(r_u);
1040
1041         if (!samr_io_q_create_dom_alias("", &q_u, data, 0)) {
1042                 return False;
1043         }
1044
1045         r_u.status = _samr_create_dom_alias(p, &q_u, &r_u);
1046
1047         if (!samr_io_r_create_dom_alias("", &r_u, rdata, 0)) {
1048                 return False;
1049         }
1050
1051         return True;
1052 }
1053
1054 /*******************************************************************
1055  api_samr_query_groupinfo
1056  ********************************************************************/
1057
1058 static BOOL api_samr_query_groupinfo(pipes_struct *p)
1059 {
1060         SAMR_Q_QUERY_GROUPINFO q_u;
1061         SAMR_R_QUERY_GROUPINFO r_u;
1062
1063         prs_struct *data = &p->in_data.data;
1064         prs_struct *rdata = &p->out_data.rdata;
1065
1066         ZERO_STRUCT(q_u);
1067         ZERO_STRUCT(r_u);
1068
1069         if (!samr_io_q_query_groupinfo("", &q_u, data, 0)) {
1070                 return False;
1071         }
1072
1073         r_u.status = _samr_query_groupinfo(p, &q_u, &r_u);
1074
1075         if (!samr_io_r_query_groupinfo("", &r_u, rdata, 0)) {
1076                 return False;
1077         }
1078
1079         return True;
1080 }
1081
1082 /*******************************************************************
1083  api_samr_set_groupinfo
1084  ********************************************************************/
1085
1086 static BOOL api_samr_set_groupinfo(pipes_struct *p)
1087 {
1088         SAMR_Q_SET_GROUPINFO q_u;
1089         SAMR_R_SET_GROUPINFO r_u;
1090
1091         prs_struct *data = &p->in_data.data;
1092         prs_struct *rdata = &p->out_data.rdata;
1093
1094         ZERO_STRUCT(q_u);
1095         ZERO_STRUCT(r_u);
1096
1097         if (!samr_io_q_set_groupinfo("", &q_u, data, 0)) {
1098                 return False;
1099         }
1100
1101         r_u.status = _samr_set_groupinfo(p, &q_u, &r_u);
1102
1103         if (!samr_io_r_set_groupinfo("", &r_u, rdata, 0)) {
1104                 return False;
1105         }
1106
1107         return True;
1108 }
1109
1110 /*******************************************************************
1111  api_samr_get_dom_pwinfo
1112  ********************************************************************/
1113
1114 static BOOL api_samr_get_dom_pwinfo(pipes_struct *p)
1115 {
1116         SAMR_Q_GET_DOM_PWINFO q_u;
1117         SAMR_R_GET_DOM_PWINFO r_u;
1118
1119         prs_struct *data = &p->in_data.data;
1120         prs_struct *rdata = &p->out_data.rdata;
1121
1122         ZERO_STRUCT(q_u);
1123         ZERO_STRUCT(r_u);
1124
1125         if (!samr_io_q_get_dom_pwinfo("", &q_u, data, 0)) {
1126                 return False;
1127         }
1128
1129         r_u.status = _samr_get_dom_pwinfo(p, &q_u, &r_u);
1130
1131         if (!samr_io_r_get_dom_pwinfo("", &r_u, rdata, 0)) {
1132                 return False;
1133         }
1134
1135         return True;
1136 }
1137
1138 /*******************************************************************
1139  api_samr_open_group
1140  ********************************************************************/
1141
1142 static BOOL api_samr_open_group(pipes_struct *p)
1143 {
1144         SAMR_Q_OPEN_GROUP q_u;
1145         SAMR_R_OPEN_GROUP r_u;
1146
1147         prs_struct *data = &p->in_data.data;
1148         prs_struct *rdata = &p->out_data.rdata;
1149
1150         ZERO_STRUCT(q_u);
1151         ZERO_STRUCT(r_u);
1152
1153         if (!samr_io_q_open_group("", &q_u, data, 0)) {
1154                 return False;
1155         }
1156
1157         r_u.status = _samr_open_group(p, &q_u, &r_u);
1158
1159         if (!samr_io_r_open_group("", &r_u, rdata, 0)) {
1160                 return False;
1161         }
1162
1163         return True;
1164 }
1165
1166 /*******************************************************************
1167  api_samr_unknown_2d
1168  ********************************************************************/
1169
1170 static BOOL api_samr_unknown_2d(pipes_struct *p)
1171 {
1172         SAMR_Q_UNKNOWN_2D q_u;
1173         SAMR_R_UNKNOWN_2D r_u;
1174
1175         prs_struct *data = &p->in_data.data;
1176         prs_struct *rdata = &p->out_data.rdata;
1177
1178         ZERO_STRUCT(q_u);
1179         ZERO_STRUCT(r_u);
1180
1181         if (!samr_io_q_unknown_2d("", &q_u, data, 0)) {
1182                 return False;
1183         }
1184
1185         r_u.status = _samr_unknown_2d(p, &q_u, &r_u);
1186
1187         if (!samr_io_r_unknown_2d("", &r_u, rdata, 0)) {
1188                 return False;
1189         }
1190
1191         return True;
1192 }
1193
1194 /*******************************************************************
1195  array of \PIPE\samr operations
1196  ********************************************************************/
1197
1198 static struct api_struct api_samr_cmds [] =
1199 {
1200         {"SAMR_CLOSE_HND", SAMR_CLOSE_HND, api_samr_close_hnd},
1201         {"SAMR_CONNECT", SAMR_CONNECT, api_samr_connect},
1202         {"SAMR_CONNECT_ANON", SAMR_CONNECT_ANON, api_samr_connect_anon},
1203         {"SAMR_ENUM_DOMAINS", SAMR_ENUM_DOMAINS, api_samr_enum_domains},
1204         {"SAMR_ENUM_DOM_USERS", SAMR_ENUM_DOM_USERS, api_samr_enum_dom_users},
1205
1206         {"SAMR_ENUM_DOM_GROUPS", SAMR_ENUM_DOM_GROUPS, api_samr_enum_dom_groups},
1207         {"SAMR_ENUM_DOM_ALIASES", SAMR_ENUM_DOM_ALIASES, api_samr_enum_dom_aliases},
1208         {"SAMR_QUERY_USERALIASES", SAMR_QUERY_USERALIASES, api_samr_query_useraliases},
1209         {"SAMR_QUERY_ALIASMEM", SAMR_QUERY_ALIASMEM, api_samr_query_aliasmem},
1210         {"SAMR_QUERY_GROUPMEM", SAMR_QUERY_GROUPMEM, api_samr_query_groupmem},
1211         {"SAMR_ADD_ALIASMEM", SAMR_ADD_ALIASMEM, api_samr_add_aliasmem},
1212         {"SAMR_DEL_ALIASMEM", SAMR_DEL_ALIASMEM, api_samr_del_aliasmem},
1213         {"SAMR_ADD_GROUPMEM", SAMR_ADD_GROUPMEM, api_samr_add_groupmem},
1214         {"SAMR_DEL_GROUPMEM", SAMR_DEL_GROUPMEM, api_samr_del_groupmem},
1215
1216         {"SAMR_DELETE_DOM_USER", SAMR_DELETE_DOM_USER, api_samr_delete_dom_user},
1217         {"SAMR_DELETE_DOM_GROUP", SAMR_DELETE_DOM_GROUP, api_samr_delete_dom_group},
1218         {"SAMR_DELETE_DOM_ALIAS", SAMR_DELETE_DOM_ALIAS, api_samr_delete_dom_alias},
1219         {"SAMR_CREATE_DOM_GROUP", SAMR_CREATE_DOM_GROUP, api_samr_create_dom_group},
1220         {"SAMR_CREATE_DOM_ALIAS", SAMR_CREATE_DOM_ALIAS, api_samr_create_dom_alias},
1221         {"SAMR_LOOKUP_NAMES", SAMR_LOOKUP_NAMES, api_samr_lookup_names},
1222         {"SAMR_OPEN_USER", SAMR_OPEN_USER, api_samr_open_user},
1223         {"SAMR_QUERY_USERINFO", SAMR_QUERY_USERINFO, api_samr_query_userinfo},
1224         {"SAMR_SET_USERINFO", SAMR_SET_USERINFO, api_samr_set_userinfo},
1225         {"SAMR_SET_USERINFO2", SAMR_SET_USERINFO2, api_samr_set_userinfo2},
1226
1227         {"SAMR_QUERY_DOMAIN_INFO", SAMR_QUERY_DOMAIN_INFO, api_samr_query_dom_info},
1228         {"SAMR_QUERY_USERGROUPS", SAMR_QUERY_USERGROUPS, api_samr_query_usergroups},
1229         {"SAMR_QUERY_DISPINFO", SAMR_QUERY_DISPINFO, api_samr_query_dispinfo},
1230         {"SAMR_QUERY_DISPINFO3", SAMR_QUERY_DISPINFO3, api_samr_query_dispinfo},
1231         {"SAMR_QUERY_DISPINFO4", SAMR_QUERY_DISPINFO4, api_samr_query_dispinfo},
1232
1233         {"SAMR_QUERY_ALIASINFO", SAMR_QUERY_ALIASINFO, api_samr_query_aliasinfo},
1234         {"SAMR_QUERY_GROUPINFO", SAMR_QUERY_GROUPINFO, api_samr_query_groupinfo},
1235         {"SAMR_SET_GROUPINFO", SAMR_SET_GROUPINFO, api_samr_set_groupinfo},
1236         {"SAMR_CREATE_USER", SAMR_CREATE_USER, api_samr_create_user},
1237         {"SAMR_LOOKUP_RIDS", SAMR_LOOKUP_RIDS, api_samr_lookup_rids},
1238         {"SAMR_GET_DOM_PWINFO", SAMR_GET_DOM_PWINFO, api_samr_get_dom_pwinfo},
1239         {"SAMR_CHGPASSWD_USER", SAMR_CHGPASSWD_USER, api_samr_chgpasswd_user},
1240         {"SAMR_OPEN_ALIAS", SAMR_OPEN_ALIAS, api_samr_open_alias},
1241         {"SAMR_OPEN_GROUP", SAMR_OPEN_GROUP, api_samr_open_group},
1242         {"SAMR_OPEN_DOMAIN", SAMR_OPEN_DOMAIN, api_samr_open_domain},
1243         {"SAMR_UNKNOWN_2D", SAMR_UNKNOWN_2D, api_samr_unknown_2d},
1244         {"SAMR_LOOKUP_DOMAIN", SAMR_LOOKUP_DOMAIN, api_samr_lookup_domain},
1245
1246         {"SAMR_QUERY_SEC_OBJECT", SAMR_QUERY_SEC_OBJECT, api_samr_query_sec_obj},
1247         {"SAMR_GET_USRDOM_PWINFO", SAMR_GET_USRDOM_PWINFO, api_samr_get_usrdom_pwinfo},
1248         {NULL, 0, NULL}
1249
1250 #if 0
1251
1252         { "SAMR_CLOSE_HND"        , SAMR_CLOSE_HND        , api_samr_close_hnd        },
1253         { "SAMR_CONNECT"          , SAMR_CONNECT          , api_samr_connect          },
1254         { "SAMR_CONNECT_ANON"     , SAMR_CONNECT_ANON     , api_samr_connect_anon     },
1255         { "SAMR_ENUM_DOM_USERS"   , SAMR_ENUM_DOM_USERS   , api_samr_enum_dom_users   },
1256         { "SAMR_ENUM_DOM_GROUPS"  , SAMR_ENUM_DOM_GROUPS  , api_samr_enum_dom_groups  },
1257         { "SAMR_ENUM_DOM_ALIASES" , SAMR_ENUM_DOM_ALIASES , api_samr_enum_dom_aliases },
1258         { "SAMR_LOOKUP_IDS"       , SAMR_LOOKUP_IDS       , api_samr_lookup_ids       },
1259         { "SAMR_LOOKUP_NAMES"     , SAMR_LOOKUP_NAMES     , api_samr_lookup_names     },
1260         { "SAMR_OPEN_USER"        , SAMR_OPEN_USER        , api_samr_open_user        },
1261         { "SAMR_QUERY_USERINFO"   , SAMR_QUERY_USERINFO   , api_samr_query_userinfo   },
1262         { "SAMR_QUERY_DOMAIN_INFO", SAMR_QUERY_DOMAIN_INFO, api_samr_query_dom_info   },
1263         { "SAMR_QUERY_USERGROUPS" , SAMR_QUERY_USERGROUPS , api_samr_query_usergroups },
1264         { "SAMR_QUERY_DISPINFO"   , SAMR_QUERY_DISPINFO   , api_samr_query_dispinfo   },
1265         { "SAMR_QUERY_ALIASINFO"  , SAMR_QUERY_ALIASINFO  , api_samr_query_aliasinfo  },
1266         { "SAMR_CREATE_USER"      , SAMR_CREATE_USER      , api_samr_create_user      },
1267         { "SAMR_LOOKUP_RIDS"      , SAMR_LOOKUP_RIDS      , api_samr_lookup_rids      },
1268         { "SAMR_UNKNOWN_38"       , SAMR_UNKNOWN_38       , api_samr_unknown_38       },
1269         { "SAMR_CHGPASSWD_USER"   , SAMR_CHGPASSWD_USER   , api_samr_chgpasswd_user   },
1270         { "SAMR_OPEN_ALIAS"       , SAMR_OPEN_ALIAS       , api_samr_open_alias       },
1271         { "SAMR_OPEN_DOMAIN"      , SAMR_OPEN_DOMAIN      , api_samr_open_domain      },
1272         { "SAMR_QUERY_SEC_OBJECT" , SAMR_QUERY_SEC_OBJECT , api_samr_query_sec_obj    },
1273         { "SAMR_GET_USRDOM_PWINFO", SAMR_GET_USRDOM_PWINFO, api_samr_get_usrdom_pwinfo},
1274         { "SAMR_LOOKUP_DOMAIN"    , SAMR_LOOKUP_DOMAIN    , api_samr_lookup_domain    },
1275         { "SAMR_ENUM_DOMAINS"     , SAMR_ENUM_DOMAINS     , api_samr_enum_domains     },
1276         { "SAMR_SET_USERINFO"     , SAMR_SET_USERINFO     , api_samr_set_userinfo     },
1277         { "SAMR_SET_USERINFO2"    , SAMR_SET_USERINFO2    , api_samr_set_userinfo2    },
1278         { NULL                    , 0                     , NULL                      }
1279 #endif
1280 };
1281
1282 /*******************************************************************
1283  receives a samr pipe and responds.
1284  ********************************************************************/
1285 BOOL api_samr_rpc(pipes_struct *p)
1286 {
1287         return api_rpcTNP(p, "api_samr_rpc", api_samr_cmds);
1288 }