2012-04-13 12 views
6

Próbuję napisać prosty program C, który tworzy katalogi (klon mkdir.). To, co mam tak daleko:Jak utworzyć katalog z prawymi uprawnieniami za pomocą C na Posix

#include <stdlib.h> 
#include <sys/stat.h> // mkdir 
#include <stdio.h> // perror 

mode_t getumask() 
{ 
    mode_t mask = umask(0); 
    umask (mask); 
    return mask; 
} 

int main(int argc, const char *argv[]) 
{ 
    mode_t mask = getumask(); 
    printf("%i",mask); 

    if (mkdir("trial",mask) == -1) { 
     perror(argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    return 0; 
} 

Kod ten tworzy katalog z d--------- ale chcę, aby go utworzyć z drwxr-xr-x jak mkdir zrobić? Co ja tu robię źle?

Edit: Jest to roztwór roboczy dla mnie:

int main(int argc, const char *argv[]) 
{ 
    if (mkdir("trial",0777) == -1) { 
     perror(argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    return 0; 
} 

Ustawienie odpowiednie uprawnienia zgodnie z umask jest obsługiwana automatycznie. Tak więc musiałem tylko wywołać mkdir z pełnymi uprawnieniami, a to zostanie posiekane zgodnie z aktualną umask.

+0

Co wytwarza wydruk diagnostyczny? Może działać lepiej, jeśli dodasz znak nowej linii po '% i', i będzie łatwiejszy do odczytania, jeśli użyjesz'% o' lub '% .4o' zamiast'% i'. Ponadto wydaje się, że brakuje '#include ', który deklaruje ['umask()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/umask.html) i ['mkdir()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html). –

+0

Powoduje 22 z% 4o. – yasar

Odpowiedz

0

Jak mówi Eric, umask jest dopełnieniem rzeczywistej trybie zgody dostać. Dlatego zamiast przekazać samą maskę do mkdir(), należy przekazać 0777-mask do mkdir().

+0

Dzięki, naprawdę chciałem dodać umask, aby uzyskać poprawne pozwolenie. Zmieniłem jednak maskę 0777 na 0777 i ~ maskę. :) – yasar

+0

Nie potrzebuję bezpośrednio używać umask, ponieważ wygląda na to, że mkdir już to robi. Zatem użycie 0777 daje w wyniku katalog 'drwxr-xr-x', gdy moja umask ma wartość 022 – yasar

7

Wygląda na to, że nie rozumiesz, do czego służy umask. Ustawia/pobiera tworzenia tryb plik maskę procesu, który z kolei jest wykorzystywany do kolei off bitów w trybie plik podany w zaproszeniach jak mkdir, tak (pseduo-code):

real_mode = requested_mode & ~umask 

Więc w Twój kod, ponieważ przekazujesz wartość samej umask, kończysz na określaniu uprawnień jako zero, co jest dokładnie tym, co widzisz.

Zamiast tego, należy określić uprawnienia, które mają w zaproszeniu do mkdir, tak:

mkdir("trial", 0755) 
+3

Myślę, że yasar11732 chce włączyć ustawienia umask bieżącego użytkownika, a nie kodowania twardego "0755". Tylko moje przypuszczenie. –

+1

Zwykle nie ma potrzeby mieszania z umask użytkownika w aplikacji; libc robi to już dla ciebie w 'mkdir()'. Więc kodowanie 0755 lub 0775 jest całkowicie w porządku. –

+4

Co się stanie, jeśli 'umask 0'? Hardcoding 0755 sprawi, że będzie 0755 zamiast pożądanego 0777. Może kodowanie 0777 jest bardziej poprawne, jak skomentował yasar11732, ale nie jest szkodliwe dla '0777 & ~ mask'. –

Powiązane problemy