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)
10 Largely rewritten by metze in August 2004
12 Originally written by Steve and Jim. Largely rewritten by tridge in
15 Reworked again by abartlet in December 2001
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.
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.
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.
32 /*****************************************************/
34 /* Distributed SMB/CIFS Server Management Utility */
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 */
42 /*****************************************************/
45 #include "dynconfig.h"
46 #include "utils/net/net.h"
47 #include "lib/cmdline/popt_common.h"
50 run a function from a function table. If not found then
51 call the specified usage function
53 int net_run_function(struct net_context *ctx,
54 int argc, const char **argv,
55 const struct net_functable *functable,
56 int (*usage_fn)(struct net_context *ctx, int argc, const char **argv))
61 d_printf("Usage: \n");
62 return usage_fn(ctx, argc, argv);
65 for (i=0; functable[i].name; i++) {
66 if (StrCaseCmp(argv[0], functable[i].name) == 0)
67 return functable[i].fn(ctx, argc-1, argv+1);
70 d_printf("No command: %s\n", argv[0]);
71 return usage_fn(ctx, argc, argv);
75 run a usage function from a function table. If not found then fail
77 int net_run_usage(struct net_context *ctx,
78 int argc, const char **argv,
79 const struct net_functable *functable)
84 d_printf("net_run_usage: TODO (argc < 1)\n");
88 for (i=0; functable[i].name; i++) {
89 if (StrCaseCmp(argv[0], functable[i].name) == 0)
90 if (functable[i].usage) {
91 return functable[i].usage(ctx, argc-1, argv+1);
95 d_printf("No usage for command: %s\n", argv[0]);
101 run a usage function from a function table. If not found then fail
103 int net_run_help(struct net_context *ctx,
104 int argc, const char **argv,
105 const struct net_functable *functable)
110 d_printf("net_run_help: TODO (argc < 1)\n");
114 for (i=0; functable[i].name; i++) {
115 if (StrCaseCmp(argv[0], functable[i].name) == 0)
116 if (functable[i].help) {
117 return functable[i].help(ctx, argc-1, argv+1);
121 d_printf("No help for command: %s\n", argv[0]);
126 static int net_help(struct net_context *ctx, int argc, const char **argv)
128 d_printf("net_help: TODO\n");
132 static int net_help_usage(struct net_context *ctx, int argc, const char **argv)
134 d_printf("net_help_usage: TODO\n");
138 /* main function table */
139 static const struct net_functable const net_functable[] = {
140 {"password", net_password, net_password_usage, net_password_help},
141 {"time", net_time, net_time_usage, net_time_help},
143 {"help", net_help, net_help_usage, net_help},
147 static int net_usage(struct net_context *ctx, int argc, const char **argv)
149 return net_run_usage(ctx, argc, argv, net_functable);
152 /****************************************************************************
154 ****************************************************************************/
155 static int binary_net(int argc, const char **argv)
160 const char **argv_new;
162 struct net_context *ctx;
164 struct poptOption long_options[] = {
167 POPT_COMMON_CONNECTION
168 POPT_COMMON_CREDENTIALS
173 setup_logging("net", DEBUG_STDOUT);
175 #ifdef HAVE_SETBUFFER
176 setbuffer(stdout, NULL, 0);
179 pc = poptGetContext("net", argc, (const char **) argv, long_options,
180 POPT_CONTEXT_KEEP_FIRST);
182 while((opt = poptGetNextOpt(pc)) != -1) {
185 d_printf("Invalid option %s: %s\n",
186 poptBadOption(pc, 0), poptStrerror(opt));
187 net_help(ctx, argc, argv);
192 lp_load(dyn_CONFIGFILE,True,False,False);
195 argv_new = (const char **)poptGetArgs(pc);
198 for (i=0; i<argc; i++) {
199 if (argv_new[i] == NULL) {
206 d_printf("Usage: TODO\n");
210 mem_ctx = talloc_init("net_context");
211 ctx = talloc_p(mem_ctx, struct net_context);
213 d_printf("talloc_init(net_context) failed\n");
218 ctx->mem_ctx = mem_ctx;
219 ctx->user.account_name = talloc_strdup(ctx->mem_ctx, cmdline_get_username());
220 ctx->user.domain_name = talloc_strdup(ctx->mem_ctx, cmdline_get_userdomain());
221 ctx->user.password = talloc_strdup(ctx->mem_ctx, cmdline_get_userpassword());
223 rc = net_run_function(ctx, argc_new-1, argv_new+1, net_functable, net_usage);
226 DEBUG(0,("return code = %d\n", rc));
229 talloc_destroy(mem_ctx);
233 int main(int argc, const char **argv)
235 return binary_net(argc, argv);