"usage: list_param [-F] <param_path1 param_path2 ...>\n"
"List the name of Lustre or LNET parameter from the specified path.\n"
" -F Add '/', '@' or '=' for dirs, symlinks and writeable files,\n"
- "respectively."},
+ "respectively.\n"
+ " -R Recursively list all parameters under the specified path.\n"},
/* Debug commands */
{"==== debugging control ====", jt_noop, 0, "debug"},
int only_path;
int show_path;
int show_type;
+ int recursive;
};
static int listparam_cmdline(int argc, char **argv, struct param_opts *popt)
popt->show_path = 1;
popt->only_path = 1;
popt->show_type = 0;
+ popt->recursive = 0;
- while ((ch = getopt(argc, argv, "F")) != -1) {
+ while ((ch = getopt(argc, argv, "FR")) != -1) {
switch (ch) {
case 'F':
popt->show_type = 1;
break;
+ case 'R':
+ popt->recursive = 1;
+ break;
default:
return -1;
}
glob_t glob_info;
char filename[PATH_MAX + 1]; /* extra 1 byte for file type */
- rc = glob(pattern, GLOB_BRACE, NULL, &glob_info);
+ rc = glob(pattern, GLOB_BRACE | (popt->recursive ? GLOB_MARK : 0),
+ NULL, &glob_info);
if (rc) {
fprintf(stderr, "error: list_param: %s: %s\n",
pattern, globerrstr(rc));
for (i = 0; i < glob_info.gl_pathc; i++) {
char *valuename = NULL;
+ int last;
+ /* Trailing '/' will indicate recursion into directory */
+ last = strlen(glob_info.gl_pathv[i]) - 1;
+
+ /* Remove trailing '/' or it will be converted to '.' */
+ if (last > 0 && glob_info.gl_pathv[i][last] == '/')
+ glob_info.gl_pathv[i][last] = '\0';
+ else
+ last = 0;
strcpy(filename, glob_info.gl_pathv[i]);
valuename = display_name(filename, popt->show_type);
if (valuename)
printf("%s\n", valuename);
+ if (last) {
+ strcpy(filename, glob_info.gl_pathv[i]);
+ strcat(filename, "/*");
+ listparam_display(popt, filename);
+ }
}
globfree(&glob_info);
char *path;
rc = listparam_cmdline(argc, argv, &popt);
- if (rc < 0 || rc >= argc)
+ if (rc == argc && popt.recursive) {
+ rc--; /* we know at least "-R" is a parameter */
+ argv[rc] = "*";
+ } else if (rc < 0 || rc >= argc) {
return CMD_HELP;
+ }
for (i = rc; i < argc; i++) {
path = argv[i];