You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
2.1 KiB

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. static char *argv0 = "./cpu-sleep";
  6. static char *cpu_file_template = "/sys/devices/system/cpu/cpu%d/online";
  7. static int cpu_min = 1;
  8. static int cpu_max = 3;
  9. void print_usage()
  10. {
  11. printf("usage: %s COMMAND\n", argv0);
  12. printf(" COMMAND = {get, enable, disable}\n");
  13. printf(" get ... prints the current sleep state: 'enabled' or 'disabled'\n");
  14. printf(" enable ... enables sleep mode\n");
  15. printf(" disable ... disables sleep mode\n");
  16. }
  17. void print_usage_and_fail()
  18. {
  19. print_usage();
  20. exit(EXIT_FAILURE);
  21. }
  22. void command_get()
  23. {
  24. char filename[256];
  25. sprintf(filename, cpu_file_template, 1);
  26. FILE *fp = fopen(filename, "r");
  27. if (fp == NULL) {
  28. fprintf(stderr, "Cannot open file '%s' for reading.\n", filename);
  29. exit(EXIT_FAILURE);
  30. }
  31. int buffer_length = 8;
  32. char buffer[buffer_length];
  33. fgets(buffer, buffer_length, fp);
  34. fclose(fp);
  35. if (strcmp(buffer, "1\n") == 0) {
  36. printf("disabled\n");
  37. } else {
  38. printf("enabled\n");
  39. }
  40. }
  41. void command_set(int value)
  42. {
  43. if (setuid(0)) {
  44. fprintf(stderr, "Cannot set root permissions via setuid(0).\n");
  45. exit(EXIT_FAILURE);
  46. }
  47. for (int cpu = cpu_min; cpu <= cpu_max; cpu++) {
  48. char filename[256];
  49. sprintf(filename, cpu_file_template, cpu);
  50. FILE *fp = fopen(filename, "w+");
  51. if (fp == NULL) {
  52. fprintf(stderr, "Cannot open file '%s' for writing.\n", filename);
  53. exit(EXIT_FAILURE);
  54. }
  55. fprintf(fp, "%d\n", value);
  56. fclose(fp);
  57. }
  58. }
  59. int main(int argc, char *argv[])
  60. {
  61. if (argc < 1) {
  62. print_usage_and_fail();
  63. }
  64. argv0 = argv[0];
  65. if (argc != 2) {
  66. print_usage_and_fail();
  67. }
  68. char *command = argv[1];
  69. if (strcmp(command, "get") == 0) {
  70. command_get();
  71. } else if (strcmp(command, "enable") == 0) {
  72. command_set(0);
  73. } else if (strcmp(command, "disable") == 0) {
  74. command_set(1);
  75. } else {
  76. print_usage_and_fail();
  77. }
  78. exit(EXIT_SUCCESS);
  79. }