/*
* 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
*
*/
+#include <lustre_ver.h>
#include <libcfs/libcfsutil.h>
static command_t * top_level; /* Top level of commands, initialized by
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 */
}
/* 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;
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
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:
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 */
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;
+}