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