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