xref: /freebsd/contrib/smbfs/smbutil/smbutil.c (revision df3342d686a25c2ac043aab1f024ef5f96b52f27)
1f1b9d127SSheldon Hearn #include <sys/param.h>
2f1b9d127SSheldon Hearn #include <sys/time.h>
3f1b9d127SSheldon Hearn #include <stdio.h>
4f1b9d127SSheldon Hearn #include <string.h>
5f1b9d127SSheldon Hearn #include <unistd.h>
6f1b9d127SSheldon Hearn #include <stdlib.h>
7f1b9d127SSheldon Hearn #include <err.h>
8f1b9d127SSheldon Hearn #include <sysexits.h>
9f1b9d127SSheldon Hearn 
10f1b9d127SSheldon Hearn #include <netsmb/smb_lib.h>
11f1b9d127SSheldon Hearn #include <netsmb/smb_conn.h>
12f1b9d127SSheldon Hearn 
13f1b9d127SSheldon Hearn #include "common.h"
14f1b9d127SSheldon Hearn 
15f1b9d127SSheldon Hearn extern char *__progname;
16f1b9d127SSheldon Hearn 
17f1b9d127SSheldon Hearn static void help(void);
18f1b9d127SSheldon Hearn static void help_usage(void);
19f1b9d127SSheldon Hearn static int  cmd_crypt(int argc, char *argv[]);
20f1b9d127SSheldon Hearn static int  cmd_help(int argc, char *argv[]);
21f1b9d127SSheldon Hearn 
22f1b9d127SSheldon Hearn int verbose;
23f1b9d127SSheldon Hearn 
24f1b9d127SSheldon Hearn typedef int cmd_fn_t (int argc, char *argv[]);
25f1b9d127SSheldon Hearn typedef void cmd_usage_t (void);
26f1b9d127SSheldon Hearn 
27f1b9d127SSheldon Hearn #define	CMDFL_NO_KMOD	0x0001
28f1b9d127SSheldon Hearn 
29f1b9d127SSheldon Hearn static struct commands {
30f1b9d127SSheldon Hearn 	const char *	name;
31f1b9d127SSheldon Hearn 	cmd_fn_t*	fn;
32f1b9d127SSheldon Hearn 	cmd_usage_t *	usage;
33f1b9d127SSheldon Hearn 	int 		flags;
34f1b9d127SSheldon Hearn } commands[] = {
35f1b9d127SSheldon Hearn 	{"crypt",	cmd_crypt,	NULL, CMDFL_NO_KMOD},
36f1b9d127SSheldon Hearn 	{"help",	cmd_help,	help_usage, CMDFL_NO_KMOD},
37f1b9d127SSheldon Hearn 	{"lc",		cmd_dumptree,	NULL},
38f1b9d127SSheldon Hearn 	{"login",	cmd_login,	login_usage},
39f1b9d127SSheldon Hearn 	{"logout",	cmd_logout,	logout_usage},
40f1b9d127SSheldon Hearn 	{"lookup",	cmd_lookup,	lookup_usage, CMDFL_NO_KMOD},
41f1b9d127SSheldon Hearn 	{"print",	cmd_print,	print_usage},
42f1b9d127SSheldon Hearn 	{"view",	cmd_view,	view_usage},
43f1b9d127SSheldon Hearn 	{NULL, NULL}
44f1b9d127SSheldon Hearn };
45f1b9d127SSheldon Hearn 
46f1b9d127SSheldon Hearn static struct commands *
lookupcmd(const char * name)47f1b9d127SSheldon Hearn lookupcmd(const char *name)
48f1b9d127SSheldon Hearn {
49f1b9d127SSheldon Hearn 	struct commands *cmd;
50f1b9d127SSheldon Hearn 
51f1b9d127SSheldon Hearn 	for (cmd = commands; cmd->name; cmd++) {
52f1b9d127SSheldon Hearn 		if (strcmp(cmd->name, name) == 0)
53f1b9d127SSheldon Hearn 			return cmd;
54f1b9d127SSheldon Hearn 	}
55f1b9d127SSheldon Hearn 	return NULL;
56f1b9d127SSheldon Hearn }
57f1b9d127SSheldon Hearn 
58f1b9d127SSheldon Hearn int
cmd_crypt(int argc,char * argv[])59f1b9d127SSheldon Hearn cmd_crypt(int argc, char *argv[])
60f1b9d127SSheldon Hearn {
61f1b9d127SSheldon Hearn 	char *cp, *psw;
62f1b9d127SSheldon Hearn 
63f1b9d127SSheldon Hearn 	if (argc < 2)
64f1b9d127SSheldon Hearn 		psw = getpass("Password:");
65f1b9d127SSheldon Hearn 	else
66f1b9d127SSheldon Hearn 		psw = argv[1];
67df3342d6SSheldon Hearn 	cp = smb_simplecrypt(NULL, psw);
68f1b9d127SSheldon Hearn 	if (cp == NULL)
69f1b9d127SSheldon Hearn 		errx(EX_DATAERR, "out of memory");
70f1b9d127SSheldon Hearn 	printf("%s\n", cp);
71f1b9d127SSheldon Hearn 	free(cp);
72f1b9d127SSheldon Hearn 	exit(0);
73f1b9d127SSheldon Hearn }
74f1b9d127SSheldon Hearn 
75f1b9d127SSheldon Hearn int
cmd_help(int argc,char * argv[])76f1b9d127SSheldon Hearn cmd_help(int argc, char *argv[])
77f1b9d127SSheldon Hearn {
78f1b9d127SSheldon Hearn 	struct commands *cmd;
79f1b9d127SSheldon Hearn 	char *cp;
80f1b9d127SSheldon Hearn 
81f1b9d127SSheldon Hearn 	if (argc < 2)
82f1b9d127SSheldon Hearn 		help_usage();
83f1b9d127SSheldon Hearn 	cp = argv[1];
84f1b9d127SSheldon Hearn 	cmd = lookupcmd(cp);
85f1b9d127SSheldon Hearn 	if (cmd == NULL)
86f1b9d127SSheldon Hearn 		errx(EX_DATAERR, "unknown command %s", cp);
87f1b9d127SSheldon Hearn 	if (cmd->usage == NULL)
88f1b9d127SSheldon Hearn 		errx(EX_DATAERR, "no specific help for command %s", cp);
89f1b9d127SSheldon Hearn 	cmd->usage();
90f1b9d127SSheldon Hearn 	exit(0);
91f1b9d127SSheldon Hearn }
92f1b9d127SSheldon Hearn 
93f1b9d127SSheldon Hearn int
main(int argc,char * argv[])94f1b9d127SSheldon Hearn main(int argc, char *argv[])
95f1b9d127SSheldon Hearn {
96f1b9d127SSheldon Hearn 	struct commands *cmd;
97f1b9d127SSheldon Hearn 	char *cp;
98f1b9d127SSheldon Hearn 	int opt;
99df3342d6SSheldon Hearn #ifdef APPLE
100df3342d6SSheldon Hearn         extern void dropsuid();
101df3342d6SSheldon Hearn 
102df3342d6SSheldon Hearn 	dropsuid();
103df3342d6SSheldon Hearn #endif /* APPLE */
104f1b9d127SSheldon Hearn 
105f1b9d127SSheldon Hearn 	if (argc < 2)
106f1b9d127SSheldon Hearn 		help();
107f1b9d127SSheldon Hearn 
108f1b9d127SSheldon Hearn 	while ((opt = getopt(argc, argv, "hv")) != EOF) {
109f1b9d127SSheldon Hearn 		switch (opt) {
110f1b9d127SSheldon Hearn 		    case 'h':
111f1b9d127SSheldon Hearn 			help();
112f1b9d127SSheldon Hearn 			/*NOTREACHED */
113f1b9d127SSheldon Hearn 		    case 'v':
114f1b9d127SSheldon Hearn 			verbose = 1;
115f1b9d127SSheldon Hearn 			break;
116f1b9d127SSheldon Hearn 		    default:
117f1b9d127SSheldon Hearn 			warnx("invalid option %c", opt);
118f1b9d127SSheldon Hearn 			help();
119f1b9d127SSheldon Hearn 			/*NOTREACHED */
120f1b9d127SSheldon Hearn 		}
121f1b9d127SSheldon Hearn 	}
122f1b9d127SSheldon Hearn 	if (optind >= argc)
123f1b9d127SSheldon Hearn 		help();
124f1b9d127SSheldon Hearn 
125f1b9d127SSheldon Hearn 	cp = argv[optind];
126f1b9d127SSheldon Hearn 	cmd = lookupcmd(cp);
127f1b9d127SSheldon Hearn 	if (cmd == NULL)
128f1b9d127SSheldon Hearn 		errx(EX_DATAERR, "unknown command %s", cp);
129f1b9d127SSheldon Hearn 
130f1b9d127SSheldon Hearn 	if ((cmd->flags & CMDFL_NO_KMOD) == 0 && smb_lib_init() != 0)
131f1b9d127SSheldon Hearn 		exit(1);
132f1b9d127SSheldon Hearn 
133f1b9d127SSheldon Hearn 	argc -= optind;
134f1b9d127SSheldon Hearn 	argv += optind;
135f1b9d127SSheldon Hearn 	optind = optreset = 1;
136f1b9d127SSheldon Hearn 	return cmd->fn(argc, argv);
137f1b9d127SSheldon Hearn }
138f1b9d127SSheldon Hearn 
139f1b9d127SSheldon Hearn static void
help(void)140f1b9d127SSheldon Hearn help(void) {
141f1b9d127SSheldon Hearn 	printf("\n");
142f1b9d127SSheldon Hearn 	printf("usage: %s [-hv] command [args]\n", __progname);
143f1b9d127SSheldon Hearn 	printf("where commands are:\n"
144f1b9d127SSheldon Hearn 	" crypt [password]		slightly encrypt password\n"
145f1b9d127SSheldon Hearn 	" help command			display help on \"command\"\n"
146f1b9d127SSheldon Hearn 	" lc 				display active connections\n"
147f1b9d127SSheldon Hearn 	" login //user@host[/share]	login to the specified host\n"
148f1b9d127SSheldon Hearn 	" logout //user@host[/share]	logout from the specified host\n"
149f1b9d127SSheldon Hearn 	" print //user@host/share file	print file to the specified remote printer\n"
150f1b9d127SSheldon Hearn 	" view //user@host		list resources on the specified host\n"
151f1b9d127SSheldon Hearn 	"\n");
152f1b9d127SSheldon Hearn 	exit(1);
153f1b9d127SSheldon Hearn }
154f1b9d127SSheldon Hearn 
155f1b9d127SSheldon Hearn static void
help_usage(void)156f1b9d127SSheldon Hearn help_usage(void) {
157f1b9d127SSheldon Hearn 	printf("usage: smbutil help command\n");
158f1b9d127SSheldon Hearn 	exit(1);
159f1b9d127SSheldon Hearn }
160