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 3 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, see <http://www.gnu.org/licenses/>.
31 /*****************************************************/
33 /* Distributed SMB/CIFS Server Management Utility */
35 /* The intent was to make the syntax similar */
36 /* to the NET utility (first developed in DOS */
37 /* with additional interesting & useful functions */
38 /* added in later SMB server network operating */
41 /*****************************************************/
44 #include "utils/net/net.h"
45 #include "lib/cmdline/popt_common.h"
46 #include "lib/ldb/include/ldb.h"
47 #include "librpc/rpc/dcerpc.h"
48 #include "param/param.h"
51 run a function from a function table. If not found then
52 call the specified usage function
54 int net_run_function(struct net_context *ctx,
55 int argc, const char **argv,
56 const struct net_functable *functable,
57 int (*usage_fn)(struct net_context *ctx, int argc, const char **argv))
62 return usage_fn(ctx, argc, argv);
64 } else if (argc == 1 && strequal(argv[0], "help")) {
65 return net_help(ctx, functable);
68 for (i=0; functable[i].name; i++) {
69 if (strcasecmp_m(argv[0], functable[i].name) == 0)
70 return functable[i].fn(ctx, argc-1, argv+1);
73 d_printf("No command: %s\n", argv[0]);
74 return usage_fn(ctx, argc, argv);
78 run a usage function from a function table. If not found then fail
80 int net_run_usage(struct net_context *ctx,
81 int argc, const char **argv,
82 const struct net_functable *functable)
86 for (i=0; functable[i].name; i++) {
87 if (strcasecmp_m(argv[0], functable[i].name) == 0)
88 if (functable[i].usage) {
89 return functable[i].usage(ctx, argc-1, argv+1);
93 d_printf("No usage information for command: %s\n", argv[0]);
99 /* main function table */
100 static const struct net_functable net_functable[] = {
101 {"password", "change password\n", net_password, net_password_usage},
102 {"time", "get remote server's time\n", net_time, net_time_usage},
103 {"join", "join a domain\n", net_join, net_join_usage},
104 {"samdump", "dump the sam of a domain\n", net_samdump, net_samdump_usage},
105 {"vampire", "join and syncronise an AD domain onto the local server\n", net_vampire, net_vampire_usage},
106 {"samsync", "synchronise into the local ldb the sam of an NT4 domain\n", net_samsync_ldb, net_samsync_ldb_usage},
107 {"user", "manage user accounts\n", net_user, net_user_usage},
108 {NULL, NULL, NULL, NULL}
111 int net_help(struct net_context *ctx, const struct net_functable *ftable)
114 const char *name = ftable[i].name;
115 const char *desc = ftable[i].desc;
117 d_printf("Available commands:\n");
118 while (name && desc) {
119 d_printf("\t%s\t\t%s", name, desc);
120 name = ftable[++i].name;
121 desc = ftable[i].desc;
127 static int net_usage(struct net_context *ctx, int argc, const char **argv)
129 d_printf("Usage:\n");
130 d_printf("net <command> [options]\n");
134 /****************************************************************************
136 ****************************************************************************/
137 static int binary_net(int argc, const char **argv)
142 const char **argv_new;
144 struct net_context *ctx = NULL;
146 struct poptOption long_options[] = {
149 POPT_COMMON_CONNECTION
150 POPT_COMMON_CREDENTIALS
157 pc = poptGetContext("net", argc, (const char **) argv, long_options,
158 POPT_CONTEXT_KEEP_FIRST);
160 while((opt = poptGetNextOpt(pc)) != -1) {
163 d_printf("Invalid option %s: %s\n",
164 poptBadOption(pc, 0), poptStrerror(opt));
165 net_usage(ctx, argc, argv);
170 argv_new = (const char **)poptGetArgs(pc);
173 for (i=0; i<argc; i++) {
174 if (argv_new[i] == NULL) {
181 return net_usage(ctx, argc, argv);
186 mem_ctx = talloc_init("net_context");
187 ctx = talloc(mem_ctx, struct net_context);
189 d_printf("talloc_init(net_context) failed\n");
194 ctx->mem_ctx = mem_ctx;
195 ctx->lp_ctx = cmdline_lp_ctx;
196 ctx->credentials = cmdline_credentials;
198 rc = net_run_function(ctx, argc_new-1, argv_new+1, net_functable, net_usage);
201 DEBUG(0,("return code = %d\n", rc));
204 talloc_free(mem_ctx);
208 int main(int argc, const char **argv)
210 return binary_net(argc, argv);