Существует ли функция C для получения прав доступа к файлу?
Я пишу AC-программу для запуска в UNIX и пытаюсь использовать команду chmod. Изучив справочные страницы, я знаю, что chmod нужны два параметра. во-первых, это биты прав доступа, во-вторых, это файл, который нужно изменить. Я хочу взять побитовое ИЛИ текущих битов разрешений файла и введенных пользователем, и передать их в chmod(), чтобы изменить права доступа к файлу.
Я нашел access()
функция, но я не могу понять, как использовать его, чтобы получить биты разрешения указанного файла.
Что у меня сейчас есть:
octalPermissionString = strtol(argv[1], (char**)NULL, 8);
if(chmod(argv[2], octalPermissionString | (access(argv[2], octalPermissionString)) < 0) {
fprintf(stderr, "Permissions of file %s were not changed.\n");
}
где:
argv [1] содержит строку из трехзначного десятичного числа, введенную пользователем для преобразования в восьмеричное значение и последующего использования в качестве битов разрешения для побитового ИЛИ,
argv [2] - это файл, для которого изменено его разрешение, также указанное пользователем.
octalPermissionString - это длинная строка для хранения восьмеричного преобразования пользовательского ввода.
Есть ли другие функции, которые могут возвращать биты прав доступа для данного файла?
РЕДАКТИРОВАТЬ: отсутствует закрывающая скобка
2 ответа
Биты разрешений могут быть установлены с использованием поля st_mode структуры, возвращаемой функцией stat. Отдельные биты могут быть извлечены с использованием констант S_IRUSR (чтение пользователя), S_IWUSR (запись пользователя), S_IRGRP (чтение группы) и т. Д.
Пример:
struct stat statRes;
if(stat(file, &statRes) < 0)return 1;
mode_t bits = statRes.st_mode;
if((bits & S_IRUSR) == 0){
//User doesn't have read privilages
}
С точки зрения передачи этого в chmod, mode_t - это просто typedef для uint_32, так что это должно быть достаточно просто.
Разрешение можно проверить с помощью stat(2), извлекая информацию из флагов S_*. Вот функция, использующая stat(2):
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
int getChmod(const char *path){
struct stat ret;
if (stat(path, &ret) == -1) {
return -1;
}
return (ret.st_mode & S_IRUSR)|(ret.st_mode & S_IWUSR)|(ret.st_mode & S_IXUSR)|/*owner*/
(ret.st_mode & S_IRGRP)|(ret.st_mode & S_IWGRP)|(ret.st_mode & S_IXGRP)|/*group*/
(ret.st_mode & S_IROTH)|(ret.st_mode & S_IWOTH)|(ret.st_mode & S_IXOTH);/*other*/
}
int main(){
printf("%0X\n",getChmod("/etc/passwd"));
return 0;
}