diff options
author | Luke Leighton <lkcl@samba.org> | 1999-11-22 19:02:39 +0000 |
---|---|---|
committer | Luke Leighton <lkcl@samba.org> | 1999-11-22 19:02:39 +0000 |
commit | aa12f3e0e922f42318b71c601cba08a6c96ff486 (patch) | |
tree | f062d83dcd5080ef3a1ff975608959c59247ed9e /source3/rpcclient/rpcclient.c | |
parent | 32b9508d066f002e778873edc19266a6d897f922 (diff) | |
download | samba-aa12f3e0e922f42318b71c601cba08a6c96ff486.tar.gz samba-aa12f3e0e922f42318b71c601cba08a6c96ff486.tar.bz2 samba-aa12f3e0e922f42318b71c601cba08a6c96ff486.zip |
okay :) all cmd_() functions now take int argc, char **argv :) that
means that some commands need more work, as they still use next_token(),
the use of which i wish to avoid.
plus, i was getting fed up of the poor command-line processing in some
of these commands. i'm starting to need getopt() in them, especially
in samsetuser.
WARNING: only cmd_samr has been modded to use getopt() so far! reg
commands won't work, esp.
(This used to be commit 9a1efa03c8bb86c9b7e73f102a9d48fb6a57a523)
Diffstat (limited to 'source3/rpcclient/rpcclient.c')
-rw-r--r-- | source3/rpcclient/rpcclient.c | 87 |
1 files changed, 41 insertions, 46 deletions
diff --git a/source3/rpcclient/rpcclient.c b/source3/rpcclient/rpcclient.c index 7e246b1bfc..4888e720b1 100644 --- a/source3/rpcclient/rpcclient.c +++ b/source3/rpcclient/rpcclient.c @@ -43,14 +43,16 @@ extern int DEBUGLEVEL; #define CNV_INPUT(s) unix2dos_format(s,True) static int process_tok(fstring tok); -static void cmd_help(struct client_info *info); -static void cmd_quit(struct client_info *info); +static void cmd_help(struct client_info *info, int argc, char *argv[]); +static void cmd_quit(struct client_info *info, int argc, char *argv[]); static struct cli_state smbcli; struct cli_state *smb_cli = &smbcli; static struct client_info cli_info; +static char **cmd_argv = NULL; +static uint32 cmd_argc = 0; FILE *out_hnd; @@ -113,7 +115,7 @@ static void rpcclient_stop(void) struct { char *name; - void (*fn)(struct client_info*); + void (*fn)(struct client_info*, int, char*[]); char *description; char compl_args[2]; } @@ -605,7 +607,7 @@ commands[] = /**************************************************************************** do a (presumably graceful) quit... ****************************************************************************/ -static void cmd_quit(struct client_info *info) +static void cmd_quit(struct client_info *info, int argc, char *argv[]) { rpcclient_stop(); #ifdef MEM_MAN @@ -623,14 +625,13 @@ static void cmd_quit(struct client_info *info) /**************************************************************************** help ****************************************************************************/ -static void cmd_help(struct client_info *info) +static void cmd_help(struct client_info *info, int argc, char *argv[]) { int i=0,j; - fstring buf; - if (next_token(NULL,buf,NULL, sizeof(buf))) + if (argc > 1) { - if ((i = process_tok(buf)) >= 0) + if ((i = process_tok(argv[1])) >= 0) fprintf(out_hnd, "HELP %s:\n\t%s\n\n",commands[i].name,commands[i].description); } else @@ -648,7 +649,7 @@ static void cmd_help(struct client_info *info) lookup a command string in the list of commands, including abbreviations ******************************************************************/ -static int process_tok(fstring tok) +static int process_tok(char *tok) { int i = 0, matches = 0; int cmd=0; @@ -681,13 +682,33 @@ static int process_tok(fstring tok) /**************************************************************************** process commands from the client ****************************************************************************/ -static void do_command(struct client_info *info, char *tok, char *line) +static BOOL do_command(struct client_info *info, char *line) { int i; + char *ptr = line; + pstring tok; - if ((i = process_tok(tok)) >= 0) + /* get the first part of the command */ + if (!next_token(&ptr,tok,NULL, sizeof(tok))) { - commands[i].fn(info); + return False; + } + + do + { + add_chars_to_array(&cmd_argc, &cmd_argv, tok); + + } while (next_token(NULL, tok, NULL, sizeof(tok))); + + if (cmd_argc == 0) + { + return False; + } + + if ((i = process_tok(cmd_argv[0])) >= 0) + { + optind = -1; + commands[i].fn(info, (uint32)cmd_argc, cmd_argv); } else if (i == -2) { @@ -697,6 +718,12 @@ static void do_command(struct client_info *info, char *tok, char *line) { fprintf(out_hnd, "%s: command not found\n", CNV_LANG(tok)); } + + free_char_array(cmd_argc, cmd_argv); + cmd_argc = 0; + cmd_argv = NULL; + + return True; } #ifndef HAVE_LIBREADLINE @@ -741,7 +768,6 @@ static BOOL process( struct client_info *info, char *cmd_str) if (cmd[0] != '\0') while (cmd[0] != '\0') { char *p; - fstring tok; if ((p = strchr(cmd, ';')) == 0) { @@ -760,20 +786,13 @@ static BOOL process( struct client_info *info, char *cmd_str) /* input language code to internal one */ CNV_INPUT (line); - /* get the first part of the command */ - { - char *ptr = line; - if (!next_token(&ptr,tok,NULL, sizeof(tok))) continue; - } - - do_command(info, tok, line); + if (!do_command(info, line)) continue; } else while (!feof(stdin)) { #ifdef HAVE_LIBREADLINE pstring promptline; #endif - fstring tok; #ifndef HAVE_LIBREADLINE @@ -831,13 +850,7 @@ static BOOL process( struct client_info *info, char *cmd_str) fprintf(out_hnd, "%s\n", line); - /* get the first part of the command */ - { - char *ptr = line; - if (!next_token(&ptr,tok,NULL, sizeof(tok))) continue; - } - - do_command(info, tok, line); + if (!do_command(info, line)) continue; } return(True); @@ -920,9 +933,6 @@ static void reg_val_list(const char *full_name, add_chars_to_array(®_list_len, ®_name, name); } -static char **cmd_argv; -static uint32 cmd_argc; - static char *complete_regenum(char *text, int state) { pstring full_keyname; @@ -1248,27 +1258,16 @@ static char *complete_cmd(char *text, int state) static char **completion_fn(char *text, int start, int end) { - pstring tmp; pstring cmd_partial; int cmd_index; int num_words; - char *ptr = cmd_partial; int i; char lastch = ' '; - free_char_array(cmd_argc, cmd_argv); - cmd_argc = 0; - cmd_argv = NULL; - safe_strcpy(cmd_partial, rl_line_buffer, MAX(sizeof(cmd_partial),end)-1); - if (next_token(&ptr, tmp, NULL, sizeof(tmp))) - { - add_chars_to_array(&cmd_argc, &cmd_argv, tmp); - } - /* Complete rpcclient command */ if (start == 0) @@ -1282,10 +1281,6 @@ static char **completion_fn(char *text, int start, int end) for (i = 0; i <= end; i++) { if ((rl_line_buffer[i] != ' ') && (lastch == ' ')) { - if (next_token(NULL, tmp, NULL, sizeof(tmp))) - { - add_chars_to_array(&cmd_argc, &cmd_argv, tmp); - } num_words++; } lastch = rl_line_buffer[i]; |