Я пытаюсь написать простую программу, которая изменяет права доступа к файлам, используя umask и chmod системные вызовы, но права доступа к файлам не изменяются должным образом.
Этовот что я пробовал:
- Установить umask на 0;
- Если файл не существует, он создается open системный вызов с использованием флага O_CREAT, а затем для привилегий устанавливается значение mode , передаваемое аргументом командной строки;
- Если файл уже существует, измените его привилегии с помощью chmod системный вызов.
#define _XOPEN_SOURCE 700
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define check_error(expr, userMsg) \
do { \
if (!(expr)) { \
perror(userMsg); \
exit(EXIT_FAILURE); \
} \
} while(0)
int main(int argc, char** argv)
{
check_error(3 == argc, "use: ./umask path mode");
mode_t oldUmask = umask(0);
long mode = strtol(argv[2], NULL, 8);
int fd = open(argv[1], O_WRONLY|O_CREAT|O_EXCL, mode);
if (-1 == fd) {
if (EEXIST == errno) {
printf("[file already exists]\n");
check_error(-1 != chmod(argv[1], mode), "chmod failed");
} else {
perror("open failed");
exit(EXIT_FAILURE);
}
} else {
close(fd);
}
umask(oldUmask);
exit(EXIT_SUCCESS);
}
После компиляции я попытался:
./umask 1.txt 0744
Ожидаемые привилегии будут -rwxr - r--, но после
ls -l
Я получаю:
-rwxrwxrwx 1 root root 0 окт 19 14:06 1.txt
Опять же, после
./umask 1.txt 0744
на этот раз я ожидал, что chmod внутренне изменит права на существующий файл,но после перечисления я получаю то же самое:
[file already exists]
-rwxrwxrwx 1 root root 0 окт 19 14:06 1.txt
Обе umask и chmod не смогли установить привилегии, как ожидалось. Что не так?