sysctl.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <dirent.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <fcntl.h>
  7. #include <AK/AKString.h>
  8. #include <AK/StringBuilder.h>
  9. #include <AK/Vector.h>
  10. #include <LibCore/CArgsParser.h>
  11. #include <LibCore/CDirIterator.h>
  12. #include <LibCore/CFile.h>
  13. static String read_var(const String& name)
  14. {
  15. StringBuilder builder;
  16. builder.append("/proc/sys/");
  17. builder.append(name);
  18. auto path = builder.to_string();
  19. CFile f(path);
  20. if (!f.open(CIODevice::ReadOnly)) {
  21. fprintf(stderr, "open: %s", f.error_string());
  22. exit(1);
  23. }
  24. const auto& b = f.read_all();
  25. if (f.error() < 0) {
  26. fprintf(stderr, "read: %s", f.error_string());
  27. exit(1);
  28. }
  29. return String((const char*)b.pointer(), b.size(), Chomp);
  30. }
  31. static void write_var(const String& name, const String& value)
  32. {
  33. StringBuilder builder;
  34. builder.append("/proc/sys/");
  35. builder.append(name);
  36. auto path = builder.to_string();
  37. CFile f(path);
  38. if (!f.open(CIODevice::WriteOnly)) {
  39. fprintf(stderr, "open: %s", f.error_string());
  40. exit(1);
  41. }
  42. f.write(value.view());
  43. if (f.error() < 0) {
  44. fprintf(stderr, "write: %s", f.error_string());
  45. exit(1);
  46. }
  47. }
  48. static int handle_show_all()
  49. {
  50. CDirIterator di("/proc/sys", CDirIterator::SkipDots);
  51. if (di.has_error()) {
  52. fprintf(stderr, "CDirIterator: %s\n", di.error_string());
  53. return 1;
  54. }
  55. char pathbuf[PATH_MAX];
  56. while (di.has_next()) {
  57. String variable_name = di.next_path();
  58. printf("%s = %s\n", variable_name.characters(), read_var(variable_name).characters());
  59. }
  60. return 0;
  61. }
  62. static int handle_var(const String& var)
  63. {
  64. String spec(var.characters(), Chomp);
  65. auto parts = spec.split('=');
  66. String variable_name = parts[0];
  67. bool is_write = parts.size() > 1;
  68. if (!is_write) {
  69. printf("%s = %s\n", variable_name.characters(), read_var(variable_name).characters());
  70. return 0;
  71. }
  72. printf("%s = %s", variable_name.characters(), read_var(variable_name).characters());
  73. write_var(variable_name, parts[1]);
  74. printf(" -> %s\n", read_var(variable_name).characters());
  75. return 0;
  76. }
  77. int main(int argc, char** argv)
  78. {
  79. CArgsParser args_parser("sysctl");
  80. args_parser.add_arg("a", "show all variables");
  81. args_parser.add_single_value("variable=[value]");
  82. CArgsParserResult args = args_parser.parse(argc, (const char**)argv);
  83. if (args.is_present("a")) {
  84. return handle_show_all();
  85. } else if (args.get_single_values().size() != 1) {
  86. args_parser.print_usage();
  87. return 0;
  88. }
  89. Vector<String> values = args.get_single_values();
  90. return handle_var(values[0]);
  91. }