r2066: add 'net time' command
[bbaumbach/samba-autobuild/.git] / source4 / utils / net / net.c
1 /* 
2    Samba Unix/Linux SMB client library 
3    Distributed SMB/CIFS Server Management Utility 
4    Copyright (C) 2001 Steve French  (sfrench@us.ibm.com)
5    Copyright (C) 2001 Jim McDonough (jmcd@us.ibm.com)
6    Copyright (C) 2001 Andrew Tridgell (tridge@samba.org)
7    Copyright (C) 2001 Andrew Bartlett (abartlet@samba.org)
8    Copyright (C) 2004 Stefan Metzmacher (metze@samba.org)
9
10    Largely rewritten by metze in August 2004
11
12    Originally written by Steve and Jim. Largely rewritten by tridge in
13    November 2001.
14
15    Reworked again by abartlet in December 2001
16
17    This program is free software; you can redistribute it and/or modify
18    it under the terms of the GNU General Public License as published by
19    the Free Software Foundation; either version 2 of the License, or
20    (at your option) any later version.
21    
22    This program is distributed in the hope that it will be useful,
23    but WITHOUT ANY WARRANTY; without even the implied warranty of
24    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25    GNU General Public License for more details.
26    
27    You should have received a copy of the GNU General Public License
28    along with this program; if not, write to the Free Software
29    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
30 */
31  
32 /*****************************************************/
33 /*                                                   */
34 /*   Distributed SMB/CIFS Server Management Utility  */
35 /*                                                   */
36 /*   The intent was to make the syntax similar       */
37 /*   to the NET utility (first developed in DOS      */
38 /*   with additional interesting & useful functions  */
39 /*   added in later SMB server network operating     */
40 /*   systems).                                       */
41 /*                                                   */
42 /*****************************************************/
43
44 #include "includes.h"
45
46 /*
47   run a function from a function table. If not found then
48   call the specified usage function 
49 */
50 int net_run_function(struct net_context *ctx,
51                         int argc, const char **argv,
52                         const struct net_functable *functable, 
53                         int (*usage_fn)(struct net_context *ctx, int argc, const char **argv))
54 {
55         int i;
56
57         if (argc < 1) {
58                 d_printf("Usage: \n");
59                 return usage_fn(ctx, argc, argv);
60         }
61
62         for (i=0; functable[i].name; i++) {
63                 if (StrCaseCmp(argv[0], functable[i].name) == 0)
64                         return functable[i].fn(ctx, argc-1, argv+1);
65         }
66
67         d_printf("No command: %s\n", argv[0]);
68         return usage_fn(ctx, argc, argv);
69 }
70
71 /*
72   run a usage function from a function table. If not found then fail
73 */
74 int net_run_usage(struct net_context *ctx,
75                         int argc, const char **argv,
76                         const struct net_functable *functable)
77 {
78         int i;
79
80         if (argc < 1) {
81                 d_printf("net_run_usage: TODO (argc < 1)\n");
82                 return 1;
83         }
84
85         for (i=0; functable[i].name; i++) {
86                 if (StrCaseCmp(argv[0], functable[i].name) == 0)
87                         if (functable[i].usage) {
88                                 return functable[i].usage(ctx, argc-1, argv+1);
89                         }
90         }
91
92         d_printf("No usage for command: %s\n", argv[0]);
93
94         return 1;
95 }
96
97 /*
98   run a usage function from a function table. If not found then fail
99 */
100 int net_run_help(struct net_context *ctx,
101                         int argc, const char **argv,
102                         const struct net_functable *functable)
103 {
104         int i;
105
106         if (argc < 1) {
107                 d_printf("net_run_help: TODO (argc < 1)\n");
108                 return 1;
109         }
110
111         for (i=0; functable[i].name; i++) {
112                 if (StrCaseCmp(argv[0], functable[i].name) == 0)
113                         if (functable[i].help) {
114                                 return functable[i].help(ctx, argc-1, argv+1);
115                         }
116         }
117
118         d_printf("No help for command: %s\n", argv[0]);
119
120         return 1;
121 }
122
123 static int net_help(struct net_context *ctx, int argc, const char **argv)
124 {
125         d_printf("net_help: TODO\n");
126         return 0;
127 }
128
129 static int net_help_usage(struct net_context *ctx, int argc, const char **argv)
130 {
131         d_printf("net_help_usage: TODO\n");
132         return 0;       
133 }
134
135 /* main function table */
136 static const struct net_functable const net_functable[] = {
137         {"password", net_password, net_password_usage, net_password_help},
138         {"time", net_time, net_time_usage, net_time_help},
139
140         {"help", net_help, net_help_usage, net_help},
141         {NULL, NULL}
142 };
143
144 static int net_usage(struct net_context *ctx, int argc, const char **argv)
145 {
146         return net_run_usage(ctx, argc, argv, net_functable);
147 }
148
149 /****************************************************************************
150   main program
151 ****************************************************************************/
152 static int binary_net(int argc, const char **argv)
153 {
154         int opt,i;
155         int rc;
156         int argc_new;
157         const char **argv_new;
158         TALLOC_CTX *mem_ctx;
159         struct net_context *ctx;
160         poptContext pc;
161         struct poptOption long_options[] = {
162                 POPT_AUTOHELP
163                 POPT_COMMON_SAMBA
164                 POPT_COMMON_CONNECTION
165                 POPT_COMMON_CREDENTIALS
166                 POPT_COMMON_VERSION
167                 POPT_TABLEEND
168         };
169
170         setup_logging("net", DEBUG_STDOUT);
171
172 #ifdef HAVE_SETBUFFER
173         setbuffer(stdout, NULL, 0);
174 #endif
175
176         pc = poptGetContext("net", argc, (const char **) argv, long_options, 
177                                 POPT_CONTEXT_KEEP_FIRST);
178
179         while((opt = poptGetNextOpt(pc)) != -1) {
180                 switch (opt) {
181                 default:
182                         d_printf("Invalid option %s: %s\n", 
183                                  poptBadOption(pc, 0), poptStrerror(opt));
184                         net_help(ctx, argc, argv);
185                         exit(1);
186                 }
187         }
188
189         lp_load(dyn_CONFIGFILE,True,False,False);
190         load_interfaces();
191
192         argv_new = (const char **)poptGetArgs(pc);
193
194         argc_new = argc;
195         for (i=0; i<argc; i++) {
196                 if (argv_new[i] == NULL) {
197                         argc_new = i;
198                         break;
199                 }
200         }
201
202         if (argc_new < 2) {
203                 d_printf("Usage: TODO\n");
204                 return 1;
205         }
206
207         mem_ctx = talloc_init("net_context");
208         ctx = talloc_p(mem_ctx, struct net_context);
209         if (!ctx) {
210                 d_printf("talloc_init(net_context) failed\n");
211                 exit(1);
212         }
213
214         ZERO_STRUCTP(ctx);
215         ctx->mem_ctx = mem_ctx;
216         ctx->user.account_name = talloc_strdup(ctx->mem_ctx, cmdline_get_username());
217         ctx->user.domain_name = talloc_strdup(ctx->mem_ctx, cmdline_get_userdomain());
218         ctx->user.password = talloc_strdup(ctx->mem_ctx, cmdline_get_userpassword());
219
220         rc = net_run_function(ctx, argc_new-1, argv_new+1, net_functable, net_usage);
221
222         if (rc != 0) {
223                 DEBUG(0,("return code = %d\n", rc));
224         }
225
226         talloc_destroy(mem_ctx);
227         return rc;
228 }
229
230  int main(int argc, const char **argv)
231 {
232         return binary_net(argc, argv);
233 }