smbutil.c revision 88283
1199989Srdivacky#include <sys/param.h>
2199989Srdivacky#include <sys/time.h>
3199989Srdivacky#include <stdio.h>
4199989Srdivacky#include <string.h>
5199989Srdivacky#include <unistd.h>
6199989Srdivacky#include <stdlib.h>
7199989Srdivacky#include <err.h>
8199989Srdivacky#include <sysexits.h>
9199989Srdivacky
10199989Srdivacky#include <netsmb/smb_lib.h>
11199989Srdivacky#include <netsmb/smb_conn.h>
12199989Srdivacky
13199989Srdivacky#include "common.h"
14199989Srdivacky
15199989Srdivackyextern char *__progname;
16234353Sdim
17210299Sedstatic void help(void);
18199989Srdivackystatic void help_usage(void);
19199989Srdivackystatic int  cmd_crypt(int argc, char *argv[]);
20199989Srdivackystatic int  cmd_help(int argc, char *argv[]);
21199989Srdivacky
22199989Srdivackyint verbose;
23199989Srdivacky
24212904Sdimtypedef int cmd_fn_t (int argc, char *argv[]);
25207618Srdivackytypedef void cmd_usage_t (void);
26199989Srdivacky
27199989Srdivacky#define	CMDFL_NO_KMOD	0x0001
28199989Srdivacky
29199989Srdivackystatic struct commands {
30199989Srdivacky	const char *	name;
31199989Srdivacky	cmd_fn_t*	fn;
32199989Srdivacky	cmd_usage_t *	usage;
33199989Srdivacky	int 		flags;
34199989Srdivacky} commands[] = {
35199989Srdivacky	{"crypt",	cmd_crypt,	NULL, CMDFL_NO_KMOD},
36199989Srdivacky	{"help",	cmd_help,	help_usage, CMDFL_NO_KMOD},
37199989Srdivacky	{"lc",		cmd_dumptree,	NULL},
38199989Srdivacky	{"login",	cmd_login,	login_usage},
39199989Srdivacky	{"logout",	cmd_logout,	logout_usage},
40199989Srdivacky	{"lookup",	cmd_lookup,	lookup_usage, CMDFL_NO_KMOD},
41199989Srdivacky	{"print",	cmd_print,	print_usage},
42199989Srdivacky	{"view",	cmd_view,	view_usage},
43199989Srdivacky	{NULL, NULL}
44199989Srdivacky};
45207618Srdivacky
46207618Srdivackystatic struct commands *
47199989Srdivackylookupcmd(const char *name)
48207618Srdivacky{
49207618Srdivacky	struct commands *cmd;
50210299Sed
51210299Sed	for (cmd = commands; cmd->name; cmd++) {
52210299Sed		if (strcmp(cmd->name, name) == 0)
53199989Srdivacky			return cmd;
54210299Sed	}
55199989Srdivacky	return NULL;
56199989Srdivacky}
57199989Srdivacky
58207618Srdivackyint
59199989Srdivackycmd_crypt(int argc, char *argv[])
60199989Srdivacky{
61199989Srdivacky	char *cp, *psw;
62210299Sed
63199989Srdivacky	if (argc < 2)
64199989Srdivacky		psw = getpass("Password:");
65199989Srdivacky	else
66199989Srdivacky		psw = argv[1];
67210299Sed	cp = smb_simplecrypt(NULL, psw);
68210299Sed	if (cp == NULL)
69210299Sed		errx(EX_DATAERR, "out of memory");
70210299Sed	printf("%s\n", cp);
71223017Sdim	free(cp);
72234353Sdim	exit(0);
73210299Sed}
74210299Sed
75199989Srdivackyint
76199989Srdivackycmd_help(int argc, char *argv[])
77199989Srdivacky{
78207618Srdivacky	struct commands *cmd;
79207618Srdivacky	char *cp;
80207618Srdivacky
81207618Srdivacky	if (argc < 2)
82226633Sdim		help_usage();
83199989Srdivacky	cp = argv[1];
84199989Srdivacky	cmd = lookupcmd(cp);
85199989Srdivacky	if (cmd == NULL)
86199989Srdivacky		errx(EX_DATAERR, "unknown command %s", cp);
87199989Srdivacky	if (cmd->usage == NULL)
88199989Srdivacky		errx(EX_DATAERR, "no specific help for command %s", cp);
89199989Srdivacky	cmd->usage();
90212904Sdim	exit(0);
91212904Sdim}
92212904Sdim
93212904Sdimint
94212904Sdimmain(int argc, char *argv[])
95212904Sdim{
96234353Sdim	struct commands *cmd;
97212904Sdim	char *cp;
98199989Srdivacky	int opt;
99234353Sdim#ifdef APPLE
100234353Sdim        extern void dropsuid();
101199989Srdivacky
102199989Srdivacky	dropsuid();
103199989Srdivacky#endif /* APPLE */
104234353Sdim
105234353Sdim	if (argc < 2)
106212904Sdim		help();
107212904Sdim
108207618Srdivacky	while ((opt = getopt(argc, argv, "hv")) != EOF) {
109199989Srdivacky		switch (opt) {
110199989Srdivacky		    case 'h':
111199989Srdivacky			help();
112199989Srdivacky			/*NOTREACHED */
113212904Sdim		    case 'v':
114212904Sdim			verbose = 1;
115212904Sdim			break;
116212904Sdim		    default:
117212904Sdim			warnx("invalid option %c", opt);
118212904Sdim			help();
119212904Sdim			/*NOTREACHED */
120212904Sdim		}
121212904Sdim	}
122212904Sdim	if (optind >= argc)
123212904Sdim		help();
124212904Sdim
125212904Sdim	cp = argv[optind];
126212904Sdim	cmd = lookupcmd(cp);
127212904Sdim	if (cmd == NULL)
128212904Sdim		errx(EX_DATAERR, "unknown command %s", cp);
129212904Sdim
130212904Sdim	if ((cmd->flags & CMDFL_NO_KMOD) == 0 && smb_lib_init() != 0)
131212904Sdim		exit(1);
132212904Sdim
133212904Sdim	argc -= optind;
134212904Sdim	argv += optind;
135212904Sdim	optind = optreset = 1;
136212904Sdim	return cmd->fn(argc, argv);
137212904Sdim}
138212904Sdim
139212904Sdimstatic void
140212904Sdimhelp(void) {
141212904Sdim	printf("\n");
142199989Srdivacky	printf("usage: %s [-hv] command [args]\n", __progname);
143199989Srdivacky	printf("where commands are:\n"
144199989Srdivacky	" crypt [password]		slightly encrypt password\n"
145207618Srdivacky	" help command			display help on \"command\"\n"
146199989Srdivacky	" lc 				display active connections\n"
147199989Srdivacky	" login //user@host[/share]	login to the specified host\n"
148199989Srdivacky	" logout //user@host[/share]	logout from the specified host\n"
149199989Srdivacky	" print //user@host/share file	print file to the specified remote printer\n"
150199989Srdivacky	" view //user@host		list resources on the specified host\n"
151199989Srdivacky	"\n");
152199989Srdivacky	exit(1);
153199989Srdivacky}
154199989Srdivacky
155199989Srdivackystatic void
156199989Srdivackyhelp_usage(void) {
157199989Srdivacky	printf("usage: smbutil help command\n");
158207618Srdivacky	exit(1);
159207618Srdivacky}
160207618Srdivacky