Может читать, но не писать файл proc в C - PullRequest
0 голосов
/ 11 июля 2019

Я пишу программу на C для изменения яркости экрана, так как xbacklight не работает в моих обстоятельствах.Решение должно быть собственным C (без функции system ()), потому что программа должна быть исполняемой как обычный пользователь через setuid.Вызов внешних команд оболочки или сценариев заставляет ядро ​​игнорировать этот бит.

Чтение proc-файла, управляющего яркостью, работает нормально, но запись в него с использованием C не дает результата, даже если я запускаю программу от имени root.Вызов fprintf возвращает -130, что указывает на ошибку.В качестве проверки работоспособности я включил работающее решение, используя system () в качестве комментария.

[...]
const char* brightness = "/sys/class/backlight/intel_backlight/brightness";
f = fopen(brightness, (!strncmp(argv[1], "get", 3)) ? "r" : "rw");
[...]

int get_brightness() {
  int buff;
  fscanf(f, "%d", &buff);
  return buff;
}

int set(int i) {
  i = MAX(0, MIN(255, i));
  fprintf(f, "%d", i);
  printf("%d", i);
  //char *cmd = (char*) malloc(59 *sizeof(char));
  //snprintf(cmd, 59, "echo %d > %s", i, brightness);
  //system(cmd);
  //free(cmd);
}

1 Ответ

1 голос
/ 11 июля 2019
f = fopen(brightness, (!strncmp(argv[1], "get", 3)) ? "r" : "rw");

"rw" не является допустимым аргументом для аргумента mode fopen(3).Чтобы открыть файл в режиме чтения / записи с помощью fopen(3), вы должны использовать "r+".

Использование "rw" - неопределенное поведение - в Linux / glibc оно будет обрабатываться как один "r", файл будет открыт в режиме только для чтения, и printf -> write не удастся выполнить.

Как правило, не очень разумно использовать буферизованный ввод / вывод с такими крошечными файлами.,Вы должны изучить dprintf(3), если вам нужно записать отформатированные данные в файловый дескриптор.

Кроме того, я бы просто использовал список фиксированных значений в программе setuid вместо проверки аргументов ипозаботиться о том, чтобы проверочный код сам по себе не стал пассивом и т. д.

...