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