xref: /freebsd/contrib/smbfs/smbutil/smbutil.c (revision f1b9d12761de3c33754f03e6d2a5bf9f1b40aad9)
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 *
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
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];
67f1b9d127SSheldon Hearn 	cp = malloc(strlen(psw + 4));
68f1b9d127SSheldon Hearn 	if (cp == NULL)
69f1b9d127SSheldon Hearn 		errx(EX_DATAERR, "out of memory");
70f1b9d127SSheldon Hearn 	smb_simplecrypt(cp, psw);
71f1b9d127SSheldon Hearn 	printf("%s\n", cp);
72f1b9d127SSheldon Hearn 	free(cp);
73f1b9d127SSheldon Hearn 	exit(0);
74f1b9d127SSheldon Hearn }
75f1b9d127SSheldon Hearn 
76f1b9d127SSheldon Hearn int
77f1b9d127SSheldon Hearn cmd_help(int argc, char *argv[])
78f1b9d127SSheldon Hearn {
79f1b9d127SSheldon Hearn 	struct commands *cmd;
80f1b9d127SSheldon Hearn 	char *cp;
81f1b9d127SSheldon Hearn 
82f1b9d127SSheldon Hearn 	if (argc < 2)
83f1b9d127SSheldon Hearn 		help_usage();
84f1b9d127SSheldon Hearn 	cp = argv[1];
85f1b9d127SSheldon Hearn 	cmd = lookupcmd(cp);
86f1b9d127SSheldon Hearn 	if (cmd == NULL)
87f1b9d127SSheldon Hearn 		errx(EX_DATAERR, "unknown command %s", cp);
88f1b9d127SSheldon Hearn 	if (cmd->usage == NULL)
89f1b9d127SSheldon Hearn 		errx(EX_DATAERR, "no specific help for command %s", cp);
90f1b9d127SSheldon Hearn 	cmd->usage();
91f1b9d127SSheldon Hearn 	exit(0);
92f1b9d127SSheldon Hearn }
93f1b9d127SSheldon Hearn 
94f1b9d127SSheldon Hearn int
95f1b9d127SSheldon Hearn main(int argc, char *argv[])
96f1b9d127SSheldon Hearn {
97f1b9d127SSheldon Hearn 	struct commands *cmd;
98f1b9d127SSheldon Hearn 	char *cp;
99f1b9d127SSheldon Hearn 	int opt;
100f1b9d127SSheldon Hearn 
101f1b9d127SSheldon Hearn 	if (argc < 2)
102f1b9d127SSheldon Hearn 		help();
103f1b9d127SSheldon Hearn 
104f1b9d127SSheldon Hearn 	while ((opt = getopt(argc, argv, "hv")) != EOF) {
105f1b9d127SSheldon Hearn 		switch (opt) {
106f1b9d127SSheldon Hearn 		    case 'h':
107f1b9d127SSheldon Hearn 			help();
108f1b9d127SSheldon Hearn 			/*NOTREACHED */
109f1b9d127SSheldon Hearn 		    case 'v':
110f1b9d127SSheldon Hearn 			verbose = 1;
111f1b9d127SSheldon Hearn 			break;
112f1b9d127SSheldon Hearn 		    default:
113f1b9d127SSheldon Hearn 			warnx("invalid option %c", opt);
114f1b9d127SSheldon Hearn 			help();
115f1b9d127SSheldon Hearn 			/*NOTREACHED */
116f1b9d127SSheldon Hearn 		}
117f1b9d127SSheldon Hearn 	}
118f1b9d127SSheldon Hearn 	if (optind >= argc)
119f1b9d127SSheldon Hearn 		help();
120f1b9d127SSheldon Hearn 
121f1b9d127SSheldon Hearn 	cp = argv[optind];
122f1b9d127SSheldon Hearn 	cmd = lookupcmd(cp);
123f1b9d127SSheldon Hearn 	if (cmd == NULL)
124f1b9d127SSheldon Hearn 		errx(EX_DATAERR, "unknown command %s", cp);
125f1b9d127SSheldon Hearn 
126f1b9d127SSheldon Hearn 	if ((cmd->flags & CMDFL_NO_KMOD) == 0 && smb_lib_init() != 0)
127f1b9d127SSheldon Hearn 		exit(1);
128f1b9d127SSheldon Hearn 
129f1b9d127SSheldon Hearn 	argc -= optind;
130f1b9d127SSheldon Hearn 	argv += optind;
131f1b9d127SSheldon Hearn 	optind = optreset = 1;
132f1b9d127SSheldon Hearn 	return cmd->fn(argc, argv);
133f1b9d127SSheldon Hearn }
134f1b9d127SSheldon Hearn 
135f1b9d127SSheldon Hearn static void
136f1b9d127SSheldon Hearn help(void) {
137f1b9d127SSheldon Hearn 	printf("\n");
138f1b9d127SSheldon Hearn 	printf("usage: %s [-hv] command [args]\n", __progname);
139f1b9d127SSheldon Hearn 	printf("where commands are:\n"
140f1b9d127SSheldon Hearn 	" crypt [password]		slightly encrypt password\n"
141f1b9d127SSheldon Hearn 	" help command			display help on \"command\"\n"
142f1b9d127SSheldon Hearn 	" lc 				display active connections\n"
143f1b9d127SSheldon Hearn 	" login //user@host[/share]	login to the specified host\n"
144f1b9d127SSheldon Hearn 	" logout //user@host[/share]	logout from the specified host\n"
145f1b9d127SSheldon Hearn 	" print //user@host/share file	print file to the specified remote printer\n"
146f1b9d127SSheldon Hearn 	" view //user@host		list resources on the specified host\n"
147f1b9d127SSheldon Hearn 	"\n");
148f1b9d127SSheldon Hearn 	exit(1);
149f1b9d127SSheldon Hearn }
150f1b9d127SSheldon Hearn 
151f1b9d127SSheldon Hearn static void
152f1b9d127SSheldon Hearn help_usage(void) {
153f1b9d127SSheldon Hearn 	printf("usage: smbutil help command\n");
154f1b9d127SSheldon Hearn 	exit(1);
155f1b9d127SSheldon Hearn }
156