/* * Display all the sysctl settings */ static int sysctl_display_all(const char *path) { int retval = 0; DIR *dp; struct dirent *de; char *tmpdir; struct stat ts; dp = opendir(path); if (!dp) { return EXIT_FAILURE; } while ((de = readdir(dp)) != NULL) { tmpdir = concat_subpath_file(path, de->d_name); if (tmpdir == NULL) continue; /* . or .. */ if (stat(tmpdir, &ts) != 0) { bb_perror_msg(tmpdir); } else if (S_ISDIR(ts.st_mode)) { retval |= sysctl_display_all(tmpdir); } else { retval |= sysctl_read_setting(tmpdir + strlen_PROC_SYS); } free(tmpdir); } /* end while */ closedir(dp); return retval; } /* end sysctl_display_all() */
int sysctl_main(int argc ATTRIBUTE_UNUSED, char **argv) { int retval; int opt; opt = getopt32(argv, "+neAapw"); /* '+' - stop on first non-option */ argv += optind; opt ^= (FLAG_SHOW_KEYS | FLAG_SHOW_KEY_ERRORS); option_mask32 ^= (FLAG_SHOW_KEYS | FLAG_SHOW_KEY_ERRORS); if (opt & (FLAG_TABLE_FORMAT | FLAG_SHOW_ALL)) return sysctl_display_all(PROC_SYS); if (opt & FLAG_PRELOAD_FILE) return sysctl_preload_file_and_exit(*argv ? *argv : ETC_SYSCTL_CONF); retval = 0; while (*argv) { if (opt & FLAG_WRITE) retval |= sysctl_write_setting(*argv); else retval |= sysctl_read_setting(*argv); argv++; } return retval; } /* end sysctl_main() */
/* * Display all the sysctl settings * */ int sysctl_display_all(const char *path, int output, int show_table) { int retval = 0; int retval2; DIR *dp; struct dirent *de; char *tmpdir; struct stat ts; if (!(dp = opendir(path))) { bb_perror_msg(ERR_OPENING_DIR, path); retval = -1; } else { while ((de = readdir(dp)) != NULL) { tmpdir = concat_subpath_file(path, de->d_name); if(tmpdir == NULL) continue; if ((retval2 = stat(tmpdir, &ts)) != 0) bb_perror_msg(tmpdir); else { if (S_ISDIR(ts.st_mode)) { sysctl_display_all(tmpdir, output, show_table); } else retval |= sysctl_read_setting(tmpdir + bb_strlen(PROC_PATH), output); } free(tmpdir); } /* end while */ closedir(dp); } return retval; } /* end sysctl_display_all() */
int sysctl_main(int argc, char **argv) { int retval = 0; int output = 1; int write_mode = 0; int switches_allowed = 1; if (argc < 2) bb_show_usage(); argv++; for (; argv && *argv && **argv; argv++) { if (switches_allowed && **argv == '-') { /* we have a switch */ switch ((*argv)[1]) { case 'n': output = 0; break; case 'w': write_mode = 1; switches_allowed = 0; break; case 'p': argv++; return sysctl_preload_file(((argv && *argv && **argv) ? *argv : DEFAULT_PRELOAD), output); case 'a': case 'A': switches_allowed = 0; return sysctl_display_all(PROC_PATH, output, ((*argv)[1] == 'a') ? 0 : 1); case 'h': case '?': bb_show_usage(); default: bb_error_msg(ERR_UNKNOWN_PARAMETER, *argv); bb_show_usage(); } } else { switches_allowed = 0; if (write_mode) retval = sysctl_write_setting(*argv, output); else sysctl_read_setting(*argv, output); } } return retval; } /* end sysctl_main() */