umask и chmod неожиданное поведение - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь написать простую программу, которая изменяет права доступа к файлам, используя 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 не смогли установить привилегии, как ожидалось. Что не так?

1 Ответ

1 голос
/ 25 октября 2019

Файлы, которые я создал и протестировал, были созданы в общей папке между хостом Windows и виртуальной машиной Linux. Я запустил программу из Linux, пытаясь изменить привилегии файла, владельцем которого я не являюсь - это хост-машина Windows, и поэтому он не позволяет мне изменять привилегии.

...