2013-11-27 3 views
4

Я пишу программу c для запуска в UNIX и пытаюсь использовать команду chmod. После консультаций с страницами man, я знаю, что chmod нуждается в двух параметрах. сначала бит разрешения, второй - файл, который нужно изменить. Я хочу взять побитовое ИЛИ текущих битов разрешения файла и те, которые введены пользователем, и передать это chmod(), чтобы изменить разрешения файла.Есть ли функция C для получения прав доступа к файлу?

Я нашел функцию 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] содержит строку трехзначное десятичное число, введенное пользователем, чтобы быть преобразованы в восьмеричные, а затем использовать поскольку биты разрешения должны быть побитовыми OR'ed,

argv [2] - это файл, который изменил его разрешение, также указанное пользователем.

octalPermissionString долго удерживает восьмеричное преобразование пользовательского ввода.

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

EDIT: отсутствует закрывающая скобка

+0

Нет ничего в C, чтобы сделать это. Это конкретная реализация. –

+1

Поле st_mode stat() может помочь ... – Sinkingpoint

+0

@Quirliom +1 Спасибо, я нашел функцию stat() всего несколько минут назад. Теперь, пытаясь выяснить, как получить st_mode-поле из структуры stat, перейти к chmod() – trawww

ответ

5

Биты разрешения могут быть установлены с помощью st_mode поля структуры, возвращаемой функция стата. Отдельные биты могут быть извлечены с помощью константы S_IRUSR (Read пользователя), S_IWUSR (Пользователь запись), S_IRGRP (Группа пользователя) и т.д.

Пример:

struct stat statRes; 
if(stat(file, &statRes) < 0)return 1; 
mode_t bits = statRes.st_mode; 
if((statRes & S_IRUSR) == 0){ 
    //User doesn't have read privilages 
} 

С точки зрения прохождения это Chmod, mode_t это всего лишь typedef из uint_32, поэтому это должно быть достаточно простым.

+0

Просто попробовал в моей программе, и все, кажется, работает так, как я хочу. после вызова stat и извлечения битов я вызываю: 'chmod (argv [2], bits | octalPermissionBits);' , и я получаю вывод, который я искал. Спасибо! – trawww

+1

@trawww Не забудьте принять ответ :) – Sinkingpoint

1

Разрешение может быть проверено с использованием 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; 
} 
Смежные вопросы