X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=libcfs%2Flibcfs%2Futil%2Fparser.c;h=556e2573a0e079c7f9cb4d57f1352c70c8adef84;hp=f395fa3b431578a725190f673fc7bd925e1e7be6;hb=2b294992edce5af7b79d4300ed3aa1ea6a8db850;hpb=723613a734af240e03d9e8b42afeba442a77142d diff --git a/libcfs/libcfs/util/parser.c b/libcfs/libcfs/util/parser.c index f395fa3..556e257 100644 --- a/libcfs/libcfs/util/parser.c +++ b/libcfs/libcfs/util/parser.c @@ -1,6 +1,8 @@ /* * Copyright (C) 2001 Cluster File Systems, Inc. * + * Copyright (c) 2014, Intel Corporation. + * * This file is part of Lustre, http://www.sf.net/projects/lustre/ * * Lustre is free software; you can redistribute it and/or @@ -18,6 +20,7 @@ * */ +#include #include static command_t * top_level; /* Top level of commands, initialized by @@ -59,21 +62,17 @@ static char * skiptowhitespace(char * s) static int line2args(char *line, char **argv, int maxargs) { - char *arg; - int i = 0; + char *arg; + int i = 0; - arg = strtok(line, " \t"); - if ( arg ) { - argv[i] = arg; - i++; - } else - return 0; + arg = strtok(line, " \t"); + if (arg == NULL || maxargs < 1) + return 0; - while( (arg = strtok(NULL, " \t")) && (i <= maxargs)) { - argv[i] = arg; - i++; - } - return i; + argv[i++] = arg; + while ((arg = strtok(NULL, " \t")) != NULL && i < maxargs) + argv[i++] = arg; + return i; } /* find a command -- return it if unique otherwise print alternatives */ @@ -223,7 +222,7 @@ static char * command_generator(const char * text, int state) } /* probably called by readline */ -static char **command_completion(char * text, int start, int end) +static char **command_completion(const char *text, int start, int end) { command_t * table; char * pos; @@ -286,32 +285,30 @@ int execute_line(char * line) return rc; } -int -noop_fn () -{ - return (0); -} +#ifdef HAVE_LIBREADLINE +static void noop_int_fn(int unused) { } +static void noop_void_fn(void) { } +#endif /* just in case you're ever in an airplane and discover you - forgot to install readline-dev. :) */ -int init_input() + * forgot to install readline-dev. :) */ +static int init_input(void) { - int interactive = isatty (fileno (stdin)); + int interactive = isatty(fileno(stdin)); #ifdef HAVE_LIBREADLINE - using_history(); - stifle_history(HISTORY); + using_history(); + stifle_history(HISTORY); - if (!interactive) - { - rl_prep_term_function = (rl_vintfunc_t *)noop_fn; - rl_deprep_term_function = (rl_voidfunc_t *)noop_fn; - } + if (!interactive) { + rl_prep_term_function = noop_int_fn; + rl_deprep_term_function = noop_void_fn; + } - rl_attempted_completion_function = (CPPFunction *)command_completion; - rl_completion_entry_function = (void *)command_generator; + rl_attempted_completion_function = command_completion; + rl_completion_entry_function = command_generator; #endif - return interactive; + return interactive; } #ifndef HAVE_LIBREADLINE @@ -458,12 +455,20 @@ int Parser_help(int argc, char **argv) return 0; } - line[0]='\0'; - for ( i = 1 ; i < argc ; i++ ) { - if (strlen(argv[i]) > sizeof(line)-strlen(line)-1) + /* Joining command line arguments without space is not critical here + * because of this string is used for search a help topic and assume + * that only one argument will be (the name of topic). For example: + * lst > help ping run + * pingrun: Unknown command. */ + line[0] = '\0'; + for (i = 1; i < argc; i++) { + if (strlen(argv[i]) >= sizeof(line) - strlen(line)) return -E2BIG; - strncat(line, argv[i], sizeof(line)-strlen(line)-1); - } + /* The function strlcat() cannot be used here because of + * this function is used in LNet utils that is not linked + * with libcfs.a. */ + strncat(line, argv[i], sizeof(line) - strlen(line)); + } switch ( process(line, &next, top_level, &result, &prev) ) { case CMD_COMPLETE: @@ -539,18 +544,20 @@ char *Parser_getstr(const char *prompt, const char *deft, char *res, line = readline(theprompt); free(theprompt); - if ( line == NULL || *line == '\0' ) { - strncpy(res, deft, len); - } else { - strncpy(res, line, len); - } - - if ( line ) { - free(line); - return res; - } else { - return NULL; - } + /* The function strlcpy() cannot be used here because of + * this function is used in LNet utils that is not linked + * with libcfs.a. */ + if (line == NULL || *line == '\0') + strncpy(res, deft, len); + else + strncpy(res, line, len); + res[len - 1] = '\0'; + + if (line != NULL) { + free(line); + return res; + } + return NULL; } /* get integer from prompt, loop forever to get it */ @@ -761,3 +768,10 @@ int Parser_quit(int argc, char **argv) done = 1; return 0; } + +int Parser_version(int argc, char **argv) +{ + fprintf(stdout, "%s %s\n", program_invocation_short_name, + LUSTRE_VERSION_STRING); + return 0; +}