Есть ли функция C для получения прав доступа к файлу?

Я пишу программу c для запуска в UNIX и пытаюсь использовать команду chmod. Изучив man-страницы, я знаю, что 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 — это тип long для восьмеричного преобразования пользовательского ввода.

Существуют ли какие-либо другие функции, которые могут возвращать биты разрешений для данного файла?

РЕДАКТИРОВАТЬ: отсутствует закрывающая скобка


person trawww    schedule 27.11.2013    source источник
comment
В C нет ничего, чтобы сделать это. Это зависит от реализации.   -  person David Heffernan    schedule 27.11.2013
comment
Поле st_mode функции stat() может помочь...   -  person Sinkingpoint    schedule 27.11.2013
comment
@Quirliom +1 Спасибо, я нашел функцию stat() всего несколько минут назад. Теперь пытаемся выяснить, как получить поле st_mode из структуры stat для передачи в chmod().   -  person trawww    schedule 27.11.2013
comment
@trawww Смотрите мой ответ.   -  person Sinkingpoint    schedule 27.11.2013


Ответы (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, так что это должно быть достаточно просто.

person Sinkingpoint    schedule 27.11.2013
comment
Только что попробовал на своей программе, вроде все работает так, как я хочу. после вызова stat и получения битов я вызываю: chmod(argv[2], bits | octalPermissionBits); и получаю результат, который искал. Спасибо! - person trawww; 27.11.2013

Разрешение можно проверить с помощью 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;
}
person Construidor    schedule 27.11.2013