netapi: add NetLocalGroupDel() skeleton.
[ira/wip.git] / source3 / lib / netapi / libnetapi.c
1 /*
2  *  Unix SMB/CIFS implementation.
3  *  NetApi Support
4  *  Copyright (C) Guenther Deschner 2007-2008
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 3 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include "includes.h"
21 #include "librpc/gen_ndr/libnetapi.h"
22 #include "lib/netapi/netapi.h"
23 #include "lib/netapi/netapi_private.h"
24 #include "lib/netapi/libnetapi.h"
25 #include "librpc/gen_ndr/ndr_libnetapi.h"
26
27 /****************************************************************
28  NetJoinDomain
29 ****************************************************************/
30
31 NET_API_STATUS NetJoinDomain(const char * server /* [in] [unique] */,
32                              const char * domain /* [in] [ref] */,
33                              const char * account_ou /* [in] [unique] */,
34                              const char * account /* [in] [unique] */,
35                              const char * password /* [in] [unique] */,
36                              uint32_t join_flags /* [in] */)
37 {
38         struct NetJoinDomain r;
39         struct libnetapi_ctx *ctx = NULL;
40         NET_API_STATUS status;
41         WERROR werr;
42
43         status = libnetapi_getctx(&ctx);
44         if (status != 0) {
45                 return status;
46         }
47
48         /* In parameters */
49         r.in.server = server;
50         r.in.domain = domain;
51         r.in.account_ou = account_ou;
52         r.in.account = account;
53         r.in.password = password;
54         r.in.join_flags = join_flags;
55
56         /* Out parameters */
57
58         if (DEBUGLEVEL >= 10) {
59                 NDR_PRINT_IN_DEBUG(NetJoinDomain, &r);
60         }
61
62         if (LIBNETAPI_LOCAL_SERVER(server)) {
63                 werr = NetJoinDomain_l(ctx, &r);
64         } else {
65                 werr = NetJoinDomain_r(ctx, &r);
66         }
67
68         r.out.result = W_ERROR_V(werr);
69
70         if (DEBUGLEVEL >= 10) {
71                 NDR_PRINT_OUT_DEBUG(NetJoinDomain, &r);
72         }
73
74         return r.out.result;
75 }
76
77 /****************************************************************
78  NetUnjoinDomain
79 ****************************************************************/
80
81 NET_API_STATUS NetUnjoinDomain(const char * server_name /* [in] [unique] */,
82                                const char * account /* [in] [unique] */,
83                                const char * password /* [in] [unique] */,
84                                uint32_t unjoin_flags /* [in] */)
85 {
86         struct NetUnjoinDomain r;
87         struct libnetapi_ctx *ctx = NULL;
88         NET_API_STATUS status;
89         WERROR werr;
90
91         status = libnetapi_getctx(&ctx);
92         if (status != 0) {
93                 return status;
94         }
95
96         /* In parameters */
97         r.in.server_name = server_name;
98         r.in.account = account;
99         r.in.password = password;
100         r.in.unjoin_flags = unjoin_flags;
101
102         /* Out parameters */
103
104         if (DEBUGLEVEL >= 10) {
105                 NDR_PRINT_IN_DEBUG(NetUnjoinDomain, &r);
106         }
107
108         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
109                 werr = NetUnjoinDomain_l(ctx, &r);
110         } else {
111                 werr = NetUnjoinDomain_r(ctx, &r);
112         }
113
114         r.out.result = W_ERROR_V(werr);
115
116         if (DEBUGLEVEL >= 10) {
117                 NDR_PRINT_OUT_DEBUG(NetUnjoinDomain, &r);
118         }
119
120         return r.out.result;
121 }
122
123 /****************************************************************
124  NetGetJoinInformation
125 ****************************************************************/
126
127 NET_API_STATUS NetGetJoinInformation(const char * server_name /* [in] [unique] */,
128                                      const char * *name_buffer /* [out] [ref] */,
129                                      uint16_t *name_type /* [out] [ref] */)
130 {
131         struct NetGetJoinInformation r;
132         struct libnetapi_ctx *ctx = NULL;
133         NET_API_STATUS status;
134         WERROR werr;
135
136         status = libnetapi_getctx(&ctx);
137         if (status != 0) {
138                 return status;
139         }
140
141         /* In parameters */
142         r.in.server_name = server_name;
143
144         /* Out parameters */
145         r.out.name_buffer = name_buffer;
146         r.out.name_type = name_type;
147
148         if (DEBUGLEVEL >= 10) {
149                 NDR_PRINT_IN_DEBUG(NetGetJoinInformation, &r);
150         }
151
152         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
153                 werr = NetGetJoinInformation_l(ctx, &r);
154         } else {
155                 werr = NetGetJoinInformation_r(ctx, &r);
156         }
157
158         r.out.result = W_ERROR_V(werr);
159
160         if (DEBUGLEVEL >= 10) {
161                 NDR_PRINT_OUT_DEBUG(NetGetJoinInformation, &r);
162         }
163
164         return r.out.result;
165 }
166
167 /****************************************************************
168  NetGetJoinableOUs
169 ****************************************************************/
170
171 NET_API_STATUS NetGetJoinableOUs(const char * server_name /* [in] [unique] */,
172                                  const char * domain /* [in] [ref] */,
173                                  const char * account /* [in] [unique] */,
174                                  const char * password /* [in] [unique] */,
175                                  uint32_t *ou_count /* [out] [ref] */,
176                                  const char * **ous /* [out] [ref] */)
177 {
178         struct NetGetJoinableOUs r;
179         struct libnetapi_ctx *ctx = NULL;
180         NET_API_STATUS status;
181         WERROR werr;
182
183         status = libnetapi_getctx(&ctx);
184         if (status != 0) {
185                 return status;
186         }
187
188         /* In parameters */
189         r.in.server_name = server_name;
190         r.in.domain = domain;
191         r.in.account = account;
192         r.in.password = password;
193
194         /* Out parameters */
195         r.out.ou_count = ou_count;
196         r.out.ous = ous;
197
198         if (DEBUGLEVEL >= 10) {
199                 NDR_PRINT_IN_DEBUG(NetGetJoinableOUs, &r);
200         }
201
202         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
203                 werr = NetGetJoinableOUs_l(ctx, &r);
204         } else {
205                 werr = NetGetJoinableOUs_r(ctx, &r);
206         }
207
208         r.out.result = W_ERROR_V(werr);
209
210         if (DEBUGLEVEL >= 10) {
211                 NDR_PRINT_OUT_DEBUG(NetGetJoinableOUs, &r);
212         }
213
214         return r.out.result;
215 }
216
217 /****************************************************************
218  NetServerGetInfo
219 ****************************************************************/
220
221 NET_API_STATUS NetServerGetInfo(const char * server_name /* [in] [unique] */,
222                                 uint32_t level /* [in] */,
223                                 uint8_t **buffer /* [out] [ref] */)
224 {
225         struct NetServerGetInfo r;
226         struct libnetapi_ctx *ctx = NULL;
227         NET_API_STATUS status;
228         WERROR werr;
229
230         status = libnetapi_getctx(&ctx);
231         if (status != 0) {
232                 return status;
233         }
234
235         /* In parameters */
236         r.in.server_name = server_name;
237         r.in.level = level;
238
239         /* Out parameters */
240         r.out.buffer = buffer;
241
242         if (DEBUGLEVEL >= 10) {
243                 NDR_PRINT_IN_DEBUG(NetServerGetInfo, &r);
244         }
245
246         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
247                 werr = NetServerGetInfo_l(ctx, &r);
248         } else {
249                 werr = NetServerGetInfo_r(ctx, &r);
250         }
251
252         r.out.result = W_ERROR_V(werr);
253
254         if (DEBUGLEVEL >= 10) {
255                 NDR_PRINT_OUT_DEBUG(NetServerGetInfo, &r);
256         }
257
258         return r.out.result;
259 }
260
261 /****************************************************************
262  NetServerSetInfo
263 ****************************************************************/
264
265 NET_API_STATUS NetServerSetInfo(const char * server_name /* [in] [unique] */,
266                                 uint32_t level /* [in] */,
267                                 uint8_t *buffer /* [in] [ref] */,
268                                 uint32_t *parm_error /* [out] [ref] */)
269 {
270         struct NetServerSetInfo r;
271         struct libnetapi_ctx *ctx = NULL;
272         NET_API_STATUS status;
273         WERROR werr;
274
275         status = libnetapi_getctx(&ctx);
276         if (status != 0) {
277                 return status;
278         }
279
280         /* In parameters */
281         r.in.server_name = server_name;
282         r.in.level = level;
283         r.in.buffer = buffer;
284
285         /* Out parameters */
286         r.out.parm_error = parm_error;
287
288         if (DEBUGLEVEL >= 10) {
289                 NDR_PRINT_IN_DEBUG(NetServerSetInfo, &r);
290         }
291
292         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
293                 werr = NetServerSetInfo_l(ctx, &r);
294         } else {
295                 werr = NetServerSetInfo_r(ctx, &r);
296         }
297
298         r.out.result = W_ERROR_V(werr);
299
300         if (DEBUGLEVEL >= 10) {
301                 NDR_PRINT_OUT_DEBUG(NetServerSetInfo, &r);
302         }
303
304         return r.out.result;
305 }
306
307 /****************************************************************
308  NetGetDCName
309 ****************************************************************/
310
311 NET_API_STATUS NetGetDCName(const char * server_name /* [in] [unique] */,
312                             const char * domain_name /* [in] [unique] */,
313                             uint8_t **buffer /* [out] [ref] */)
314 {
315         struct NetGetDCName r;
316         struct libnetapi_ctx *ctx = NULL;
317         NET_API_STATUS status;
318         WERROR werr;
319
320         status = libnetapi_getctx(&ctx);
321         if (status != 0) {
322                 return status;
323         }
324
325         /* In parameters */
326         r.in.server_name = server_name;
327         r.in.domain_name = domain_name;
328
329         /* Out parameters */
330         r.out.buffer = buffer;
331
332         if (DEBUGLEVEL >= 10) {
333                 NDR_PRINT_IN_DEBUG(NetGetDCName, &r);
334         }
335
336         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
337                 werr = NetGetDCName_l(ctx, &r);
338         } else {
339                 werr = NetGetDCName_r(ctx, &r);
340         }
341
342         r.out.result = W_ERROR_V(werr);
343
344         if (DEBUGLEVEL >= 10) {
345                 NDR_PRINT_OUT_DEBUG(NetGetDCName, &r);
346         }
347
348         return r.out.result;
349 }
350
351 /****************************************************************
352  NetGetAnyDCName
353 ****************************************************************/
354
355 NET_API_STATUS NetGetAnyDCName(const char * server_name /* [in] [unique] */,
356                                const char * domain_name /* [in] [unique] */,
357                                uint8_t **buffer /* [out] [ref] */)
358 {
359         struct NetGetAnyDCName r;
360         struct libnetapi_ctx *ctx = NULL;
361         NET_API_STATUS status;
362         WERROR werr;
363
364         status = libnetapi_getctx(&ctx);
365         if (status != 0) {
366                 return status;
367         }
368
369         /* In parameters */
370         r.in.server_name = server_name;
371         r.in.domain_name = domain_name;
372
373         /* Out parameters */
374         r.out.buffer = buffer;
375
376         if (DEBUGLEVEL >= 10) {
377                 NDR_PRINT_IN_DEBUG(NetGetAnyDCName, &r);
378         }
379
380         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
381                 werr = NetGetAnyDCName_l(ctx, &r);
382         } else {
383                 werr = NetGetAnyDCName_r(ctx, &r);
384         }
385
386         r.out.result = W_ERROR_V(werr);
387
388         if (DEBUGLEVEL >= 10) {
389                 NDR_PRINT_OUT_DEBUG(NetGetAnyDCName, &r);
390         }
391
392         return r.out.result;
393 }
394
395 /****************************************************************
396  DsGetDcName
397 ****************************************************************/
398
399 NET_API_STATUS DsGetDcName(const char * server_name /* [in] [unique] */,
400                            const char * domain_name /* [in] [ref] */,
401                            struct GUID *domain_guid /* [in] [unique] */,
402                            const char * site_name /* [in] [unique] */,
403                            uint32_t flags /* [in] */,
404                            struct DOMAIN_CONTROLLER_INFO **dc_info /* [out] [ref] */)
405 {
406         struct DsGetDcName r;
407         struct libnetapi_ctx *ctx = NULL;
408         NET_API_STATUS status;
409         WERROR werr;
410
411         status = libnetapi_getctx(&ctx);
412         if (status != 0) {
413                 return status;
414         }
415
416         /* In parameters */
417         r.in.server_name = server_name;
418         r.in.domain_name = domain_name;
419         r.in.domain_guid = domain_guid;
420         r.in.site_name = site_name;
421         r.in.flags = flags;
422
423         /* Out parameters */
424         r.out.dc_info = dc_info;
425
426         if (DEBUGLEVEL >= 10) {
427                 NDR_PRINT_IN_DEBUG(DsGetDcName, &r);
428         }
429
430         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
431                 werr = DsGetDcName_l(ctx, &r);
432         } else {
433                 werr = DsGetDcName_r(ctx, &r);
434         }
435
436         r.out.result = W_ERROR_V(werr);
437
438         if (DEBUGLEVEL >= 10) {
439                 NDR_PRINT_OUT_DEBUG(DsGetDcName, &r);
440         }
441
442         return r.out.result;
443 }
444
445 /****************************************************************
446  NetUserAdd
447 ****************************************************************/
448
449 NET_API_STATUS NetUserAdd(const char * server_name /* [in] [unique] */,
450                           uint32_t level /* [in] */,
451                           uint8_t *buffer /* [in] [ref] */,
452                           uint32_t *parm_error /* [out] [ref] */)
453 {
454         struct NetUserAdd r;
455         struct libnetapi_ctx *ctx = NULL;
456         NET_API_STATUS status;
457         WERROR werr;
458
459         status = libnetapi_getctx(&ctx);
460         if (status != 0) {
461                 return status;
462         }
463
464         /* In parameters */
465         r.in.server_name = server_name;
466         r.in.level = level;
467         r.in.buffer = buffer;
468
469         /* Out parameters */
470         r.out.parm_error = parm_error;
471
472         if (DEBUGLEVEL >= 10) {
473                 NDR_PRINT_IN_DEBUG(NetUserAdd, &r);
474         }
475
476         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
477                 werr = NetUserAdd_l(ctx, &r);
478         } else {
479                 werr = NetUserAdd_r(ctx, &r);
480         }
481
482         r.out.result = W_ERROR_V(werr);
483
484         if (DEBUGLEVEL >= 10) {
485                 NDR_PRINT_OUT_DEBUG(NetUserAdd, &r);
486         }
487
488         return r.out.result;
489 }
490
491 /****************************************************************
492  NetUserDel
493 ****************************************************************/
494
495 NET_API_STATUS NetUserDel(const char * server_name /* [in] [unique] */,
496                           const char * user_name /* [in] [ref] */)
497 {
498         struct NetUserDel r;
499         struct libnetapi_ctx *ctx = NULL;
500         NET_API_STATUS status;
501         WERROR werr;
502
503         status = libnetapi_getctx(&ctx);
504         if (status != 0) {
505                 return status;
506         }
507
508         /* In parameters */
509         r.in.server_name = server_name;
510         r.in.user_name = user_name;
511
512         /* Out parameters */
513
514         if (DEBUGLEVEL >= 10) {
515                 NDR_PRINT_IN_DEBUG(NetUserDel, &r);
516         }
517
518         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
519                 werr = NetUserDel_l(ctx, &r);
520         } else {
521                 werr = NetUserDel_r(ctx, &r);
522         }
523
524         r.out.result = W_ERROR_V(werr);
525
526         if (DEBUGLEVEL >= 10) {
527                 NDR_PRINT_OUT_DEBUG(NetUserDel, &r);
528         }
529
530         return r.out.result;
531 }
532
533 /****************************************************************
534  NetUserEnum
535 ****************************************************************/
536
537 NET_API_STATUS NetUserEnum(const char * server_name /* [in] [unique] */,
538                            uint32_t level /* [in] */,
539                            uint32_t filter /* [in] */,
540                            uint8_t **buffer /* [out] [ref] */,
541                            uint32_t prefmaxlen /* [in] */,
542                            uint32_t *entries_read /* [out] [ref] */,
543                            uint32_t *total_entries /* [out] [ref] */,
544                            uint32_t *resume_handle /* [in,out] [ref] */)
545 {
546         struct NetUserEnum r;
547         struct libnetapi_ctx *ctx = NULL;
548         NET_API_STATUS status;
549         WERROR werr;
550
551         status = libnetapi_getctx(&ctx);
552         if (status != 0) {
553                 return status;
554         }
555
556         /* In parameters */
557         r.in.server_name = server_name;
558         r.in.level = level;
559         r.in.filter = filter;
560         r.in.prefmaxlen = prefmaxlen;
561         r.in.resume_handle = resume_handle;
562
563         /* Out parameters */
564         r.out.buffer = buffer;
565         r.out.entries_read = entries_read;
566         r.out.total_entries = total_entries;
567         r.out.resume_handle = resume_handle;
568
569         if (DEBUGLEVEL >= 10) {
570                 NDR_PRINT_IN_DEBUG(NetUserEnum, &r);
571         }
572
573         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
574                 werr = NetUserEnum_l(ctx, &r);
575         } else {
576                 werr = NetUserEnum_r(ctx, &r);
577         }
578
579         r.out.result = W_ERROR_V(werr);
580
581         if (DEBUGLEVEL >= 10) {
582                 NDR_PRINT_OUT_DEBUG(NetUserEnum, &r);
583         }
584
585         return r.out.result;
586 }
587
588 /****************************************************************
589  NetQueryDisplayInformation
590 ****************************************************************/
591
592 NET_API_STATUS NetQueryDisplayInformation(const char * server_name /* [in] [unique] */,
593                                           uint32_t level /* [in] */,
594                                           uint32_t idx /* [in] */,
595                                           uint32_t entries_requested /* [in] */,
596                                           uint32_t prefmaxlen /* [in] */,
597                                           uint32_t *entries_read /* [out] [ref] */,
598                                           void **buffer /* [out] [noprint,ref] */)
599 {
600         struct NetQueryDisplayInformation r;
601         struct libnetapi_ctx *ctx = NULL;
602         NET_API_STATUS status;
603         WERROR werr;
604
605         status = libnetapi_getctx(&ctx);
606         if (status != 0) {
607                 return status;
608         }
609
610         /* In parameters */
611         r.in.server_name = server_name;
612         r.in.level = level;
613         r.in.idx = idx;
614         r.in.entries_requested = entries_requested;
615         r.in.prefmaxlen = prefmaxlen;
616
617         /* Out parameters */
618         r.out.entries_read = entries_read;
619         r.out.buffer = buffer;
620
621         if (DEBUGLEVEL >= 10) {
622                 NDR_PRINT_IN_DEBUG(NetQueryDisplayInformation, &r);
623         }
624
625         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
626                 werr = NetQueryDisplayInformation_l(ctx, &r);
627         } else {
628                 werr = NetQueryDisplayInformation_r(ctx, &r);
629         }
630
631         r.out.result = W_ERROR_V(werr);
632
633         if (DEBUGLEVEL >= 10) {
634                 NDR_PRINT_OUT_DEBUG(NetQueryDisplayInformation, &r);
635         }
636
637         return r.out.result;
638 }
639
640 /****************************************************************
641  NetGroupAdd
642 ****************************************************************/
643
644 NET_API_STATUS NetGroupAdd(const char * server_name /* [in] */,
645                            uint32_t level /* [in] */,
646                            uint8_t *buf /* [in] [ref] */,
647                            uint32_t *parm_err /* [out] [ref] */)
648 {
649         struct NetGroupAdd r;
650         struct libnetapi_ctx *ctx = NULL;
651         NET_API_STATUS status;
652         WERROR werr;
653
654         status = libnetapi_getctx(&ctx);
655         if (status != 0) {
656                 return status;
657         }
658
659         /* In parameters */
660         r.in.server_name = server_name;
661         r.in.level = level;
662         r.in.buf = buf;
663
664         /* Out parameters */
665         r.out.parm_err = parm_err;
666
667         if (DEBUGLEVEL >= 10) {
668                 NDR_PRINT_IN_DEBUG(NetGroupAdd, &r);
669         }
670
671         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
672                 werr = NetGroupAdd_l(ctx, &r);
673         } else {
674                 werr = NetGroupAdd_r(ctx, &r);
675         }
676
677         r.out.result = W_ERROR_V(werr);
678
679         if (DEBUGLEVEL >= 10) {
680                 NDR_PRINT_OUT_DEBUG(NetGroupAdd, &r);
681         }
682
683         return r.out.result;
684 }
685
686 /****************************************************************
687  NetGroupDel
688 ****************************************************************/
689
690 NET_API_STATUS NetGroupDel(const char * server_name /* [in] */,
691                            const char * group_name /* [in] */)
692 {
693         struct NetGroupDel r;
694         struct libnetapi_ctx *ctx = NULL;
695         NET_API_STATUS status;
696         WERROR werr;
697
698         status = libnetapi_getctx(&ctx);
699         if (status != 0) {
700                 return status;
701         }
702
703         /* In parameters */
704         r.in.server_name = server_name;
705         r.in.group_name = group_name;
706
707         /* Out parameters */
708
709         if (DEBUGLEVEL >= 10) {
710                 NDR_PRINT_IN_DEBUG(NetGroupDel, &r);
711         }
712
713         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
714                 werr = NetGroupDel_l(ctx, &r);
715         } else {
716                 werr = NetGroupDel_r(ctx, &r);
717         }
718
719         r.out.result = W_ERROR_V(werr);
720
721         if (DEBUGLEVEL >= 10) {
722                 NDR_PRINT_OUT_DEBUG(NetGroupDel, &r);
723         }
724
725         return r.out.result;
726 }
727
728 /****************************************************************
729  NetGroupSetInfo
730 ****************************************************************/
731
732 NET_API_STATUS NetGroupSetInfo(const char * server_name /* [in] */,
733                                const char * group_name /* [in] */,
734                                uint32_t level /* [in] */,
735                                uint8_t *buf /* [in] [ref] */,
736                                uint32_t *parm_err /* [out] [ref] */)
737 {
738         struct NetGroupSetInfo r;
739         struct libnetapi_ctx *ctx = NULL;
740         NET_API_STATUS status;
741         WERROR werr;
742
743         status = libnetapi_getctx(&ctx);
744         if (status != 0) {
745                 return status;
746         }
747
748         /* In parameters */
749         r.in.server_name = server_name;
750         r.in.group_name = group_name;
751         r.in.level = level;
752         r.in.buf = buf;
753
754         /* Out parameters */
755         r.out.parm_err = parm_err;
756
757         if (DEBUGLEVEL >= 10) {
758                 NDR_PRINT_IN_DEBUG(NetGroupSetInfo, &r);
759         }
760
761         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
762                 werr = NetGroupSetInfo_l(ctx, &r);
763         } else {
764                 werr = NetGroupSetInfo_r(ctx, &r);
765         }
766
767         r.out.result = W_ERROR_V(werr);
768
769         if (DEBUGLEVEL >= 10) {
770                 NDR_PRINT_OUT_DEBUG(NetGroupSetInfo, &r);
771         }
772
773         return r.out.result;
774 }
775
776 /****************************************************************
777  NetGroupGetInfo
778 ****************************************************************/
779
780 NET_API_STATUS NetGroupGetInfo(const char * server_name /* [in] */,
781                                const char * group_name /* [in] */,
782                                uint32_t level /* [in] */,
783                                uint8_t **buf /* [out] [ref] */)
784 {
785         struct NetGroupGetInfo r;
786         struct libnetapi_ctx *ctx = NULL;
787         NET_API_STATUS status;
788         WERROR werr;
789
790         status = libnetapi_getctx(&ctx);
791         if (status != 0) {
792                 return status;
793         }
794
795         /* In parameters */
796         r.in.server_name = server_name;
797         r.in.group_name = group_name;
798         r.in.level = level;
799
800         /* Out parameters */
801         r.out.buf = buf;
802
803         if (DEBUGLEVEL >= 10) {
804                 NDR_PRINT_IN_DEBUG(NetGroupGetInfo, &r);
805         }
806
807         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
808                 werr = NetGroupGetInfo_l(ctx, &r);
809         } else {
810                 werr = NetGroupGetInfo_r(ctx, &r);
811         }
812
813         r.out.result = W_ERROR_V(werr);
814
815         if (DEBUGLEVEL >= 10) {
816                 NDR_PRINT_OUT_DEBUG(NetGroupGetInfo, &r);
817         }
818
819         return r.out.result;
820 }
821
822 /****************************************************************
823  NetGroupAddUser
824 ****************************************************************/
825
826 NET_API_STATUS NetGroupAddUser(const char * server_name /* [in] */,
827                                const char * group_name /* [in] */,
828                                const char * user_name /* [in] */)
829 {
830         struct NetGroupAddUser r;
831         struct libnetapi_ctx *ctx = NULL;
832         NET_API_STATUS status;
833         WERROR werr;
834
835         status = libnetapi_getctx(&ctx);
836         if (status != 0) {
837                 return status;
838         }
839
840         /* In parameters */
841         r.in.server_name = server_name;
842         r.in.group_name = group_name;
843         r.in.user_name = user_name;
844
845         /* Out parameters */
846
847         if (DEBUGLEVEL >= 10) {
848                 NDR_PRINT_IN_DEBUG(NetGroupAddUser, &r);
849         }
850
851         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
852                 werr = NetGroupAddUser_l(ctx, &r);
853         } else {
854                 werr = NetGroupAddUser_r(ctx, &r);
855         }
856
857         r.out.result = W_ERROR_V(werr);
858
859         if (DEBUGLEVEL >= 10) {
860                 NDR_PRINT_OUT_DEBUG(NetGroupAddUser, &r);
861         }
862
863         return r.out.result;
864 }
865
866 /****************************************************************
867  NetGroupDelUser
868 ****************************************************************/
869
870 NET_API_STATUS NetGroupDelUser(const char * server_name /* [in] */,
871                                const char * group_name /* [in] */,
872                                const char * user_name /* [in] */)
873 {
874         struct NetGroupDelUser r;
875         struct libnetapi_ctx *ctx = NULL;
876         NET_API_STATUS status;
877         WERROR werr;
878
879         status = libnetapi_getctx(&ctx);
880         if (status != 0) {
881                 return status;
882         }
883
884         /* In parameters */
885         r.in.server_name = server_name;
886         r.in.group_name = group_name;
887         r.in.user_name = user_name;
888
889         /* Out parameters */
890
891         if (DEBUGLEVEL >= 10) {
892                 NDR_PRINT_IN_DEBUG(NetGroupDelUser, &r);
893         }
894
895         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
896                 werr = NetGroupDelUser_l(ctx, &r);
897         } else {
898                 werr = NetGroupDelUser_r(ctx, &r);
899         }
900
901         r.out.result = W_ERROR_V(werr);
902
903         if (DEBUGLEVEL >= 10) {
904                 NDR_PRINT_OUT_DEBUG(NetGroupDelUser, &r);
905         }
906
907         return r.out.result;
908 }
909
910 /****************************************************************
911  NetLocalGroupAdd
912 ****************************************************************/
913
914 NET_API_STATUS NetLocalGroupAdd(const char * server_name /* [in] */,
915                                 uint32_t level /* [in] */,
916                                 uint8_t *buf /* [in] [ref] */,
917                                 uint32_t *parm_err /* [out] [ref] */)
918 {
919         struct NetLocalGroupAdd r;
920         struct libnetapi_ctx *ctx = NULL;
921         NET_API_STATUS status;
922         WERROR werr;
923
924         status = libnetapi_getctx(&ctx);
925         if (status != 0) {
926                 return status;
927         }
928
929         /* In parameters */
930         r.in.server_name = server_name;
931         r.in.level = level;
932         r.in.buf = buf;
933
934         /* Out parameters */
935         r.out.parm_err = parm_err;
936
937         if (DEBUGLEVEL >= 10) {
938                 NDR_PRINT_IN_DEBUG(NetLocalGroupAdd, &r);
939         }
940
941         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
942                 werr = NetLocalGroupAdd_l(ctx, &r);
943         } else {
944                 werr = NetLocalGroupAdd_r(ctx, &r);
945         }
946
947         r.out.result = W_ERROR_V(werr);
948
949         if (DEBUGLEVEL >= 10) {
950                 NDR_PRINT_OUT_DEBUG(NetLocalGroupAdd, &r);
951         }
952
953         return r.out.result;
954 }
955
956 /****************************************************************
957  NetLocalGroupDel
958 ****************************************************************/
959
960 NET_API_STATUS NetLocalGroupDel(const char * server_name /* [in] */,
961                                 const char * group_name /* [in] */)
962 {
963         struct NetLocalGroupDel r;
964         struct libnetapi_ctx *ctx = NULL;
965         NET_API_STATUS status;
966         WERROR werr;
967
968         status = libnetapi_getctx(&ctx);
969         if (status != 0) {
970                 return status;
971         }
972
973         /* In parameters */
974         r.in.server_name = server_name;
975         r.in.group_name = group_name;
976
977         /* Out parameters */
978
979         if (DEBUGLEVEL >= 10) {
980                 NDR_PRINT_IN_DEBUG(NetLocalGroupDel, &r);
981         }
982
983         if (LIBNETAPI_LOCAL_SERVER(server_name)) {
984                 werr = NetLocalGroupDel_l(ctx, &r);
985         } else {
986                 werr = NetLocalGroupDel_r(ctx, &r);
987         }
988
989         r.out.result = W_ERROR_V(werr);
990
991         if (DEBUGLEVEL >= 10) {
992                 NDR_PRINT_OUT_DEBUG(NetLocalGroupDel, &r);
993         }
994
995         return r.out.result;
996 }
997