From 3bf08879c9a61ec61304d7ee942043895727ffba Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 12 Oct 2001 06:03:17 +0000 Subject: This file is really old and not used anymore. (This used to be commit ffef3c386957b08994f62eca18a29554daa91d3c) --- source3/lib/cmd_interp.c | 1375 ---------------------------------------------- 1 file changed, 1375 deletions(-) delete mode 100644 source3/lib/cmd_interp.c (limited to 'source3/lib') diff --git a/source3/lib/cmd_interp.c b/source3/lib/cmd_interp.c deleted file mode 100644 index 54d023e9f7..0000000000 --- a/source3/lib/cmd_interp.c +++ /dev/null @@ -1,1375 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - SMB client - Copyright (C) Andrew Tridgell 1994-1998 - Copyright (C) Luke Kenneth Casson Leighton 1998-2000 - Copyright (C) Gerald Carter 2000 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" -#include "rpc_parse.h" - -#ifndef REGISTER -#define REGISTER 0 -#endif - -extern pstring debugf; -extern pstring global_myname; - -extern pstring user_socket_options; - -/* found in rpc_client/cli_connect.c */ -extern struct user_creds *usr_creds; - - -#define CNV_LANG(s) dos2unix_format(s,False) -#define CNV_INPUT(s) unix2dos_format(s,True) - -static int process_tok(fstring tok); -static uint32 cmd_help(struct client_info *info, int argc, char *argv[]); -static uint32 cmd_quit(struct client_info *info, int argc, char *argv[]); -static uint32 cmd_set(struct client_info *info, int argc, char *argv[]); -static uint32 cmd_use(struct client_info *info, int argc, char *argv[]); - -static struct user_creds usr; - -struct client_info cli_info; - -char **cmd_argv = NULL; -uint32 cmd_argc = 0; - -FILE *out_hnd; - - -static void cmd_set_free(struct command_set *item) -{ - if (item != NULL) - SAFE_FREE(item->name); - - SAFE_FREE(item); -} - -static struct command_set *cmd_set_dup(const struct command_set *from) -{ - if (from != NULL) - { - struct command_set *copy; - - copy = (struct command_set*)malloc(sizeof(struct command_set)); - if (copy != NULL) - { - memcpy(copy, from, sizeof(struct command_set)); - if (from->name != NULL) - copy->name = strdup(from->name); - } - return copy; - } - return NULL; -} - -void free_cmd_set_array(uint32 num_entries, struct command_set **entries) -{ - void (*fn) (void *) = (void (*)(void *))&cmd_set_free; - free_void_array(num_entries, (void **)entries, *fn); -} - -struct command_set *add_cmd_set_to_array(uint32 *len, struct command_set ***array, - const struct command_set *cmd) -{ - void *(*fn) (const void *) = (void *(*)(const void *))&cmd_set_dup; - return (struct command_set *)add_copy_to_array(len, (void ***)array, - (const void *)cmd, *fn, - False); - -} - -static struct command_set **commands = NULL; -static uint32 num_commands = 0; - -/**************************************************************************** - add in individual command-sets. - ****************************************************************************/ -void add_command_set(const struct command_set *cmds) -{ - while (! ((cmds->fn==NULL) && (strlen(cmds->name)==0))) - { - add_cmd_set_to_array(&num_commands, &commands, cmds); - cmds++; - } -} - -/**************************************************************************** - This defines the commands supported by this client - ****************************************************************************/ -static struct command_set general_commands[] = { - /* - * maintenance - */ - - {"General", NULL, NULL, {NULL, NULL}}, - - { "set", cmd_set, - "run rpcclient inside rpcclient (change options etc.)", - {NULL, NULL} - }, - - { "use", cmd_use, - "net use and net view", - {NULL, NULL} - }, - - /* - * bye bye - */ - - { "quit", cmd_quit, - "logoff the server", - {NULL, NULL} - }, - { "q", cmd_quit, - "logoff the server", - {NULL, NULL} - }, - { "exit", cmd_quit, - "logoff the server", - {NULL, NULL} - }, - { "bye", cmd_quit, - "logoff the server", - {NULL, NULL} - }, - - /* - * eek! - */ - - { "help", cmd_help, - "[command] give help on a command", - {NULL, NULL} - }, - { "?", cmd_help, - "[command] give help on a command", - {NULL, NULL} - }, - - /* - * shell - */ - - { "!", NULL, - "run a shell command on the local system", - {NULL, NULL} - }, - - /* - * oop! - */ - - { "", NULL, NULL, - {NULL, NULL} - } -}; - - -/**************************************************************************** -do a (presumably graceful) quit... -****************************************************************************/ -static uint32 cmd_quit(struct client_info *info, int argc, char *argv[]) -{ - free_connections(); - exit(0); - - /* NOTREACHED */ - return 0; -} - -/**************************************************************************** -help -****************************************************************************/ -static uint32 cmd_help(struct client_info *info, int argc, char *argv[]) -{ - int i = 0; - - /* get help on a specific command */ - if (argc > 1) - { - if ((i = process_tok(argv[0])) >= 0) - { - fprintf(out_hnd, "HELP %s:\n\t%s\n\n", commands[i]->name, - commands[i]->description); - } - - return 0; - } - - /* Print out the list of available commands */ - for (i = 0; i < num_commands; i++) - { - if (commands[i]->fn == NULL) - fprintf (out_hnd, "\n"); - else - fprintf (out_hnd, "\t"); - - fprintf(out_hnd, "%s\n", commands[i]->name); - } - - return 0; -} - -/******************************************************************* - lookup a command string in the list of commands, including - abbreviations - ******************************************************************/ -static int process_tok(char *tok) -{ - int i = 0, matches = 0; - int cmd = 0; - int tok_len = strlen(tok); - - for (i = 0; i < num_commands; i++) - { - if (strequal(commands[i]->name, tok)) - { - matches = 1; - cmd = i; - break; - } - else if (strnequal(commands[i]->name, tok, tok_len)) - { - matches++; - cmd = i; - } - } - - if (matches == 0) - return (-1); - else if (matches == 1) - return (cmd); - else - return (-2); -} - -/**************************************************************************** - turn command line into command argument array -****************************************************************************/ -static BOOL get_cmd_args(char *line) -{ - char *ptr = line; - pstring tok; - cmd_argc = 0; - cmd_argv = NULL; - - /* get the first part of the command */ - if (!next_token_nr(&ptr, tok, NULL, sizeof(tok))) - return False; - - do - { - add_chars_to_array(&cmd_argc, &cmd_argv, tok); - } - while (next_token_nr(NULL, tok, NULL, sizeof(tok))); - - add_chars_to_array(&cmd_argc, &cmd_argv, NULL); - - return True; -} - -/* command options mask */ -static uint32 cmd_set_options = 0xffffffff; - -/**************************************************************************** - process commands from the client -****************************************************************************/ -static uint32 do_command(struct client_info *info, char *line) -{ - NTSTATUS status = 0x0; - int i; - - if (!get_cmd_args(line)) - return False; - - if (cmd_argc == 0) - return False; - - i = process_tok(cmd_argv[0]); - if (i >= 0) - { - int argc = ((int)cmd_argc); - char **argv = cmd_argv; - optind = 0; - - status = commands[i]->fn(info, argc, argv); - } - else if (i == -2) - { - fprintf(out_hnd, "%s: command abbreviation ambiguous\n", - CNV_LANG(cmd_argv[0])); - } - else - { - fprintf(out_hnd, "%s: command not found\n", - CNV_LANG(cmd_argv[0])); - } - - free_char_array(cmd_argc, cmd_argv); - parse_talloc_free(); /* Free up init_XXX memory. */ - - return status; -} - - -/**************************************************************************** - process commands from the client -****************************************************************************/ -static uint32 process(struct client_info *info, char *cmd_str) -{ - NTSTATUS status = 0; - pstring line; - char *cmd = cmd_str; - - if (cmd != NULL) - { - while (cmd[0] != '\0') - { - char *p; - - if ((p = strchr_m(cmd, ';')) == 0) - { - strncpy(line, cmd, 999); - line[1000] = '\0'; - cmd += strlen(cmd); - } - else - { - if (p - cmd > 999) - p = cmd + 999; - strncpy(line, cmd, p - cmd); - line[p - cmd] = '\0'; - cmd = p + 1; - } - - /* input language code to internal one */ - CNV_INPUT(line); - - status = do_command(info, line); - if (status == 0x0) - { - continue; - } - } - } - else - { - while (!feof(stdin)) - { -#ifdef HAVE_LIBREADLINE - char *ret_line; -#endif - pstring pline; - BOOL at_sym = False; - - pline[0] = 0; - if (info->show_prompt) - { - safe_strcat(pline, "[", sizeof(pline) - 1); - if (usr.ntc.domain[0] != 0) - { - safe_strcat(pline, usr.ntc.domain, - sizeof(pline) - 1); - safe_strcat(pline, "\\", sizeof(pline) - 1); - at_sym = True; - } - if (usr.ntc.user_name[0] != 0) - { - safe_strcat(pline, usr.ntc.user_name, - sizeof(pline) - 1); - at_sym = True; - } - if (at_sym) - safe_strcat(pline, "@", sizeof(pline) - 1); - - safe_strcat(pline, cli_info.dest_host, - sizeof(pline) - 1); - safe_strcat(pline, "]$ ", sizeof(pline) - 1); - } -#ifndef HAVE_LIBREADLINE - - /* display a prompt */ - fprintf(out_hnd, "%s", CNV_LANG(pline)); - fflush(out_hnd); - - cli_use_wait_keyboard(); - - /* and get a response */ - if (!fgets(line, 1000, stdin)) - { - break; - } - -#else /* HAVE_LIBREADLINE */ - - if (!(ret_line = readline(pline))) - break; - SAFE_FREE(ret_line); - - /* Copy read line to samba buffer */ - - pstrcpy(line, rl_line_buffer); - - /* Add to history */ - - if (strlen(line) > 0) - add_history(line); -#endif - /* input language code to internal one */ - CNV_INPUT(line); - - /* special case - first char is ! */ - if (*line == '!') - { - system(line + 1); - continue; - } - - fprintf(out_hnd, "%s\n", line); - - status = do_command(info, line); - if (status == 0x0) - { - continue; - } - } - } - return status; -} - -/**************************************************************************** -usage on the program -****************************************************************************/ -static void usage(char *pname) -{ - fprintf(out_hnd, - "Usage: %s [\\server] [password] [-U user] -[W domain] [-l log] ", - pname); - - fprintf(out_hnd, "\nVersion %s\n", VERSION); - fprintf(out_hnd, "\t-d debuglevel set the debuglevel\n"); - fprintf(out_hnd, - "\t-S <\\>server Server to connect to\n"); - fprintf(out_hnd, - "\t-l log basename. Basename for log/debug files\n"); - fprintf(out_hnd, - "\t-n netbios name. Use this name as my netbios name\n"); - fprintf(out_hnd, - "\t-N don't ask for a password\n"); - fprintf(out_hnd, - "\t-m max protocol set the max protocol level\n"); - fprintf(out_hnd, - "\t-I dest IP use this IP to connect to\n"); - fprintf(out_hnd, - "\t-E write messages to stderr instead of stdout\n"); - fprintf(out_hnd, - "\t-A filename file from which to read the authentication credentials\n"); - fprintf(out_hnd, - "\t-P hide prompt (used for shell scripts)\n"); - fprintf(out_hnd, - "\t-U username set the network username\n"); - fprintf(out_hnd, - "\t-U username%%pass set the network username and password\n"); - fprintf(out_hnd, "\t-W domain set the domain name\n"); - fprintf(out_hnd, - "\t-c 'command string' execute semicolon separated commands\n"); - fprintf(out_hnd, - "\t-t terminal code terminal i/o code {sjis|euc|jis7|jis8|junet|hex}\n"); - fprintf(out_hnd, "\n"); -} - -#ifdef HAVE_LIBREADLINE - -/**************************************************************************** -GNU readline completion functions -****************************************************************************/ - -/* Complete an rpcclient command */ - -static char *complete_cmd(char *text, int state) -{ - static int cmd_index; - char *name; - - /* Initialise */ - - if (state == 0) - cmd_index = 0; - - /* Return the next name which partially matches the list of commands */ - - while ((cmd_index < num_commands) - && (strlen(name = commands[cmd_index++]->name) > 0)) - { - if (strncmp(name, text, strlen(text)) == 0) - return strdup(name); - } - - return NULL; -} - -/* Main completion function */ - -static char **completion_fn(char *text, int start, int end) -{ - pstring cmd_partial; - int cmd_index; - int num_words; - - int i; - char lastch = ' '; - - (void)get_cmd_args(rl_line_buffer); - - safe_strcpy(cmd_partial, rl_line_buffer, - MAX(sizeof(cmd_partial), end) - 1); - - /* Complete rpcclient command */ - - if (start == 0) - return completion_matches(text, complete_cmd); - - /* Count # of words in command */ - - num_words = 0; - for (i = 0; i <= end; i++) - { - if ((rl_line_buffer[i] != ' ') && (lastch == ' ')) - num_words++; - lastch = rl_line_buffer[i]; - } - - if (rl_line_buffer[end] == ' ') - num_words++; - - /* Work out which command we are completing for */ - - for (cmd_index = 0; cmd_index < num_commands; cmd_index++) - { - - /* Check each command in array */ - - if (strncmp(rl_line_buffer, commands[cmd_index]->name, - strlen(commands[cmd_index]->name)) == 0) - { - /* Call appropriate completion function */ - - if (num_words == 2 || num_words == 3) - { - char *(*fn) (char *, int); - fn = commands[cmd_index]->compl_args[num_words - 2]; - if (fn != NULL) - return completion_matches(text, fn); - } - } - } - - /* Eeek! */ - return NULL; -} - -/* To avoid filename completion being activated when no valid - completions are found, we assign this stub completion function - to the rl_completion_entry_function variable. */ - -static char *complete_cmd_null(char *text, int state) -{ - return NULL; -} - -#endif /* HAVE_LIBREADLINE */ - -static void set_user_password(struct ntuser_creds *u, - BOOL got_pass, char *password) -{ - /* set the password cache info */ - if (got_pass) - { - if (password == NULL) - { - DEBUG(10, ("set_user_password: NULL pwd\n")); - pwd_set_nullpwd(&u->pwd); - } - else - { - /* generate 16 byte hashes */ - DEBUG(10, ("set_user_password: generate\n")); - if (lp_encrypted_passwords()) - pwd_make_lm_nt_16(&u->pwd, password); - else - pwd_set_cleartext(&u->pwd, password); - } - } - else - { - DEBUG(10, ("set_user_password: read\n")); - pwd_read(&u->pwd, "Enter Password:", True); - } -} - -static uint32 cmd_use(struct client_info *info, int argc, char *argv[]) -{ - int opt; - BOOL net_use = False; - BOOL net_use_add = True; - BOOL force_close = False; - fstring dest_host; - fstring srv_name; - BOOL null_pwd = False; - BOOL got_pwd = False; - pstring password; - - - if (usr_creds != NULL) - copy_nt_creds(&usr.ntc, &usr_creds->ntc); - else - copy_nt_creds(&usr.ntc, NULL); - - pstrcpy(dest_host, cli_info.dest_host); - pstrcpy(usr.ntc.user_name, optarg); - info->reuse = False; - - if (argc <= 1) - { - report(out_hnd, - "net [\\\\Server] [-U user%%pass] [-W domain] [-d] [-f]\n"); - report(out_hnd, " -d Deletes a connection\n"); - report(out_hnd, " -f Forcibly deletes a connection\n"); - report(out_hnd, "net -u Shows all connections\n"); - return 0; - } - - if (argc > 1 && (*argv[1] != '-')) - { - if (strnequal("\\\\", argv[1], 2) || - strnequal("//", argv[1], 2)) - { - pstrcpy(dest_host, argv[1] + 2); - } - argc--; - argv++; - } - - while ((opt = getopt(argc, argv, "udU:W:")) != EOF) - { - switch (opt) - { - case 'u': - { - net_use = True; - break; - } - - case 'U': - { - char *lp; - pstrcpy(usr.ntc.user_name, optarg); - if ((lp = strchr_m(usr.ntc.user_name, '%'))) - { - *lp = 0; - pstrcpy(password, lp + 1); - memset(strchr_m(optarg, '%') + 1, 'X', - strlen(password)); - got_pwd = True; - } - if (usr.ntc.user_name[0] == 0 - && password[0] == 0) - { - null_pwd = True; - } - break; - } - - case 'N': - { - null_pwd = True; - } - case 'W': - { - pstrcpy(usr.ntc.domain, optarg); - break; - } - - case 'd': - { - net_use_add = False; - break; - } - - case 'f': - { - force_close = True; - break; - } - - default: - { - report(out_hnd, - "net -S \\server [-U user%%pass] [-W domain] [-d] [-f]\n"); - report(out_hnd, "net -u\n"); - break; - } - } - } - - if (strnequal("\\\\", dest_host, 2)) - { - fstrcpy(srv_name, dest_host); - } - else - { - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, dest_host); - } - strupper(srv_name); - - if (net_use) - { - int i; - uint32 num_uses; - struct use_info **use; - cli_net_use_enum(&num_uses, &use); - - if (num_uses == 0) - { - report(out_hnd, "No connections\n"); - } - else - { - report(out_hnd, "Connections:\n"); - - for (i = 0; i < num_uses; i++) - { - if (use[i] != NULL && use[i]->connected) - { - report(out_hnd, "Server:\t%s\t",use[i]->srv_name); - report(out_hnd, "Key:\t[%d,%x]\t",use[i]->key.pid, use[i]->key.vuid); - report(out_hnd, "User:\t%s\t", use[i]->user_name); - report(out_hnd, "Domain:\t%s\n", use[i]->domain); - } - } - } - } - else if (net_use_add) - { - BOOL isnew; - if (null_pwd) - set_user_password(&usr.ntc, True, NULL); - else - set_user_password(&usr.ntc, got_pwd, password); - - /* paranoia: destroy the local copy of the password */ - ZERO_STRUCT(password); - - report(out_hnd, "Server:\t%s:\tUser:\t%s\tDomain:\t%s\n", - srv_name, usr.ntc.user_name, usr.ntc.domain); - report(out_hnd, "Connection:\t"); - - if (cli_net_use_add(srv_name, &usr.ntc, info->reuse, &isnew) != NULL) - report(out_hnd, "OK\n"); - else - report(out_hnd, "FAILED\n"); - } - else - { - BOOL closed; - report(out_hnd, "Server:\t%s:\tUser:\t%s\tDomain:\t%s\n", - srv_name, usr.ntc.user_name, usr.ntc.domain); - report(out_hnd, "Connection:\t"); - - if (!cli_net_use_del(srv_name, &usr.ntc, force_close, &closed)) - report(out_hnd, ": Does not exist\n"); - else if (force_close && closed) - report(out_hnd, ": Forcibly terminated\n"); - else if (closed) - report(out_hnd, ": Terminated\n"); - else - report(out_hnd, ": Unlinked\n"); - } - - /* paranoia: destroy the local copy of the password */ - ZERO_STRUCT(password); - - return 0; -} - -/****************************************************************** - allow or disallow automatic connections. rpctorture, because it - does not reestablish connections after sys_fork(), fails unless the - connection is established AFTER the sys_fork() - ******************************************************************/ -static BOOL auto_connect = True; -void cmd_set_no_autoconnect(void) -{ - auto_connect = False; -} - -#define CMD_STR 0x1 -#define CMD_DBF 0x2 -#define CMD_SVC 0x4 -#define CMD_TERM 0x8 -#define CMD_PASS 0x10 -#define CMD_USER 0x20 -#define CMD_NOPW 0x40 -#define CMD_DBLV 0x80 -#define CMD_HELP 0x100 -#define CMD_SOCK 0x200 -#define CMD_IFACE 0x400 -#define CMD_DOM 0x800 -#define CMD_IP 0x1000 -#define CMD_HOST 0x2000 -#define CMD_NAME 0x4000 -#define CMD_DBG 0x8000 -#define CMD_SCOPE 0x10000 -#define CMD_INTER 0x20000 - -static void read_authfile (char *filename, char* username, char* password) -{ - FILE *auth; - fstring buf; - uint16 len = 0; - char *ptr, *val, *param; - - if ((auth=sys_fopen(filename, "r")) == NULL) - { - /* fail if we can't open the credentials file */ - DEBUG(0,("ERROR: Unable to open credentials file!\n")); - return; - } - - while (!feof(auth)) - { - /* get a line from the file */ - if (!fgets (buf, sizeof(buf), auth)) - continue; - - len = strlen(buf); - - /* skip empty lines */ - if ((len) && (buf[len-1]=='\n')) - { - buf[len-1] = '\0'; - len--; - } - if (len == 0) - continue; - - /* break up the line into parameter & value. - will need to eat a little whitespace possibly */ - param = buf; - if (!(ptr = strchr_m(buf, '='))) - continue; - val = ptr+1; - *ptr = '\0'; - - /* eat leading white space */ - while ((*val!='\0') && ((*val==' ') || (*val=='\t'))) - val++; - - if (strwicmp("password", param) == 0) - { - pstrcpy(password, val); - cmd_set_options |= CMD_PASS; - } - else if (strwicmp("username", param) == 0) - { - pstrcpy(username, val); - cmd_set_options |= CMD_USER; - } - - memset(buf, 0, sizeof(buf)); - } - fclose(auth); - - return; -} - -static uint32 cmd_set(CLIENT_INFO *info, int argc, char *argv[]) -{ - BOOL interactive = True; - char *cmd_str = NULL; - int opt; - extern char *optarg; - static pstring servicesf = CONFIGFILE; - pstring term_code; - pstring password; /* local copy only, if one is entered */ - fstring srv_name; - int new_debuglevel = -1; - - password[0] = 0; - usr_creds = &usr; - info->reuse = False; -#ifdef KANJI - pstrcpy(term_code, KANJI); -#else /* KANJI */ - *term_code = 0; -#endif /* KANJI */ - - if (argc > 1 && (*argv[1] != '-')) - { - if (strnequal("\\\\", argv[1], 2) || - strnequal("//", argv[1], 2)) - { - cmd_set_options |= CMD_HOST; - pstrcpy(cli_info.dest_host, argv[1] + 2); - strupper(cli_info.dest_host); - } - argc--; - argv++; - } - - if (argc > 1 && (*argv[1] != '-')) - { - cmd_set_options |= CMD_PASS; - pstrcpy(password, argv[1]); - memset(argv[1], 'X', strlen(argv[1])); - argc--; - argv++; - } - - while ((opt = getopt(argc, argv,"PRs:O:M:S:i:Nn:d:l:hI:EB:U:L:t:m:W:T:D:c:A:")) != EOF) - { - switch (opt) - { - /* reuse connections in the case of a previous authentication */ - case 'R': - { - info->reuse = True; - break; - } - - /* max protocol */ - case 'm': - { - /* FIXME ... max_protocol seems to be funny here */ - - int max_protocol = 0; - max_protocol = interpret_protocol(optarg, max_protocol); - fprintf(stderr, "max protocol not currently supported\n"); - break; - } - - /* socket options */ - case 'O': - { - cmd_set_options |= CMD_SOCK; - pstrcpy(user_socket_options, optarg); - break; - } - - /* define the server to connect to */ - case 'S': - { - cmd_set_options |= CMD_HOST; - pstrcpy(cli_info.dest_host, optarg); - strupper(cli_info.dest_host); - break; - } - - /* username for the connection -- support the - username%password format as well */ - case 'U': - { - char *lp; - cmd_set_options |= CMD_USER; - pstrcpy(usr.ntc.user_name, optarg); - if ((lp = strchr_m(usr.ntc.user_name, '%'))) - { - *lp = 0; - pstrcpy(password, lp + 1); - cmd_set_options |= CMD_PASS; - memset(lp+1, 'X', strlen(password)); - } - break; - } - - /* authfile -- only get the username and password from the file */ - case 'A': - { - read_authfile (optarg, usr.ntc.user_name, password); - break; - } - - /* define the workgroup/domain name */ - case 'W': - { - cmd_set_options |= CMD_DOM; - pstrcpy(usr.ntc.domain, optarg); - break; - } - - /* should we display a command prompt at all */ - case 'P': - { /* optarg == prompt string ? */ - info->show_prompt = False; - break; - } - - /* send to stderr instaed of stdout */ - case 'E': - { - cmd_set_options |= CMD_DBG; - dbf = x_stderr; - break; - } - - /* IP address of destination host */ - case 'I': - { - cmd_set_options |= CMD_IP; - cli_info.dest_ip = *interpret_addr2(optarg); - if (zero_ip(cli_info.dest_ip)) - { - free_connections(); - exit(1); - } - break; - } - - /* define netbios name of client machine we are on */ - case 'n': - { - cmd_set_options |= CMD_NAME; - fstrcpy(global_myname, optarg); - break; - } - - /* do not prompt for a password. Implies anonymous connection - unless the password was passed in username%password form */ - case 'N': - { - cmd_set_options |= CMD_NOPW | CMD_PASS; - break; - } - - /* debug level */ - case 'd': - { - cmd_set_options |= CMD_DBLV; - if (*optarg == 'A') - new_debuglevel = 10000; - else - new_debuglevel = atoi(optarg); - break; - } - - /* log file name */ - case 'l': - { - cmd_set_options |= CMD_INTER; - slprintf(debugf, sizeof(debugf) - 1, "%s.client", optarg); - interactive = False; - break; - } - - /* command string to be executed */ - case 'c': - { - cmd_set_options |= CMD_STR; - cmd_str = optarg; - break; - } - - /* program usage/help screen */ - case 'h': - { - cmd_set_options |= CMD_HELP; - usage(argv[0]); - break; - } - - /* config file to use */ - case 's': - { - cmd_set_options |= CMD_SVC; - pstrcpy(servicesf, optarg); - break; - } - - /* terminal code */ - case 't': - { - cmd_set_options |= CMD_TERM; - pstrcpy(term_code, optarg); - break; - } - - default: - { - cmd_set_options |= CMD_HELP; - usage(argv[0]); - break; - } - } - } - - - if (cmd_set_options & CMD_INTER) - { - setup_logging(debugf, interactive); - if (!interactive) - reopen_logs(); - } - - strupper(global_myname); - fstrcpy(cli_info.myhostname, global_myname); - - if (cmd_set_options & CMD_SVC) - { - if (!lp_load(servicesf, True, False, False)) - { - fprintf(stderr, "Can't load %s - run testparm to debug it\n", - servicesf); - } - - } - - if (new_debuglevel != -1) { - DEBUGLEVEL = new_debuglevel; - } - - if (cmd_set_options & CMD_INTER) - { - load_interfaces(); - } - - DEBUG(10, ("cmd_set: options: %x\n", cmd_set_options)); - - if (cmd_set_options & CMD_HELP) { - return 0; - } - - /* NULL password if specified or is username is empty */ - if ((cmd_set_options & CMD_NOPW) || (strlen(usr.ntc.user_name) == 0)) - set_user_password(&usr.ntc, True, NULL); - else - set_user_password(&usr.ntc, ((cmd_set_options & CMD_PASS) != 0), password); - - /* paranoia: destroy the local copy of the password */ - ZERO_STRUCT(password); - - if (strcmp(cli_info.dest_host, "*") == 0) - { - /* special case - we want the PDC */ - struct in_addr ip; - if (!resolve_srv_name(cli_info.dest_host, cli_info.dest_host, &ip)) { - report(out_hnd, "ERROR: Failed to find the PDC\n"); - return 1; - } - } - - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, cli_info.dest_host); - strupper(srv_name); - - - if (auto_connect) - { - BOOL isnew; - report(out_hnd, "Server:\t%s:\tUser:\t%s\tDomain:\t%s\n", - srv_name, usr.ntc.user_name, usr.ntc.domain); - report(out_hnd, "Connection:\t"); - - if (cli_net_use_add(srv_name, &usr.ntc, info->reuse, &isnew) != NULL) - { - report(out_hnd, "OK\n"); - } - else - { - report(out_hnd, "FAILED\n"); - } - /* ???? --jerry - usr_creds = NULL; */ - } - - if (cmd_str != NULL) - return process(&cli_info, cmd_str); - - return 0; -} - -static void read_user_env(struct ntuser_creds *u) -{ - pstring password; - - password[0] = 0; - - if (getenv("USER")) - { - char *p; - pstrcpy(u->user_name, getenv("USER")); - - /* modification to support userid%passwd syntax in the USER var - 25.Aug.97, jdblair@uab.edu */ - - if ((p = strchr_m(u->user_name, '%'))) - { - *p = 0; - pstrcpy(password, p + 1); - memset(strchr_m(getenv("USER"), '%') + 1, 'X', - strlen(password)); - } - } - - /* modification to support PASSWD environmental var - 25.Aug.97, jdblair@uab.edu */ - if (getenv("PASSWD")) - pstrcpy(password, getenv("PASSWD")); - - if (*u->user_name == 0 && getenv("LOGNAME")) - pstrcpy(u->user_name, getenv("LOGNAME")); - - set_user_password(u, True, password); - - /* paranoia: destroy the local copy of the password */ - ZERO_STRUCT(password); -} - -static void readline_init(void) -{ -#ifdef HAVE_LIBREADLINE - /* Initialise GNU Readline */ rl_readline_name = "rpcclient"; - rl_attempted_completion_function = completion_fn; - rl_completion_entry_function = (Function *) complete_cmd_null; - - /* Initialise history list */ - - using_history(); - -#else - int x; - x = 0; /* stop compiler warnings */ -#endif /* HAVE_LIBREADLINE */ -} - -/**************************************************************************** - main program -****************************************************************************/ -int command_main(int argc, char *argv[]) -{ - NTSTATUS status; - mode_t myumask = 0755; - char progname[255], path[255], *s; - pstring msg; - - DEBUGLEVEL = 2; - - /* add in the internal command set and the various - client RPC groups--spoolss, lsa, etc... */ - add_command_set(general_commands); - - /* usr_creds is a global most recently used set of user credentials - retrieved from the connection list. */ - copy_user_creds(&usr, NULL); - usr_creds = &usr; - usr.ptr_ntc = 1; - - out_hnd = stdout; - - /* retrieve the binary name used when invoking the program - for instances like samedit, etc... */ - strncpy(path, argv[0], 255); - for (s = strtok(path, "/"); s; s = strtok(NULL, "/")) - fstrcpy(progname, s); - - slprintf(debugf, sizeof(debugf) - 1, - "%s/log.%s", LOGFILEBASE, progname); - - /* initialize usr */ - pstrcpy(usr.ntc.domain, ""); - pstrcpy(usr.ntc.user_name, ""); - pstrcpy(cli_info.myhostname, ""); - pstrcpy(cli_info.dest_host, ""); - - /* init client_info struct */ - cli_info.dest_ip.s_addr = 0; - cli_info.show_prompt = True; - ZERO_STRUCT(cli_info.dom.level3_sid); - ZERO_STRUCT(cli_info.dom.level5_sid); - fstrcpy(cli_info.dom.level3_dom, ""); - fstrcpy(cli_info.dom.level5_dom, ""); - - readline_init(); - TimeInit(); - init_connections(); - - myumask = umask(0); - umask(myumask); - - if (!get_myname(global_myname)) - { - fprintf(stderr, "Failed to get my hostname.\n"); - } - - if (argc < 2) - { - usage(argv[0]); - free_connections(); - exit(1); - } - - read_user_env(&usr.ntc); - - cmd_set_options &= ~CMD_HELP; - cmd_set_options &= ~CMD_STR; - cmd_set_options &= ~CMD_NOPW; - cmd_set_options &= ~CMD_USER; - cmd_set_options &= ~CMD_PASS; - - /* parse the command line args - init the first connection if possible - process a command if passed in on the command line */ - status = cmd_set(&cli_info, argc, argv); - - /* Should we exit? Are we done? */ - if (cmd_set_options & (CMD_HELP|CMD_STR)) { - free_connections(); - get_nt_error_msg(status, msg, sizeof(msg)); - - report(out_hnd, "Exit Status: %s\n", msg); - /* unix only has 8 bit error codes - blergh */ - exit(status & 0xFF); - } - - DEBUG(3, ("%s client started (version %s)\n", - timestring(False), VERSION)); - - /* enter shell mode */ - status = process(&cli_info, NULL); - - /* cleanup */ - free_connections(); - free_cmd_set_array(num_commands, commands); - num_commands = 0; - commands = NULL; - - /* report and exit */ - get_nt_error_msg(status, msg, sizeof(msg)); - report(out_hnd, "Exit Status: %s\n", msg); - return status; -} -- cgit