2012-04-13 12 views
6

Sto provando a scrivere un semplice programma C che crea directory (un clone mkdir). Questo è quello che ho finora:Come creare la directory con i permissoni giusti usando C su 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; 
} 

Questo codice crea directory con d--------- ma lo voglio creare con drwxr-xr-x come mkdir fare? Cosa sto facendo di sbagliato qui?

Edit: Questa è la soluzione di lavoro per me:

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

Impostazione permessi giusti in base al umask viene gestito automaticamente. Quindi ho solo bisogno di chiamare mkdir con permessi completi, e questo viene tagliato in base alla umask corrente.

+0

Cosa produce la stampa diagnostica? Potrebbe funzionare meglio se si aggiungesse una nuova riga dopo '% i', e sarebbe più facilmente leggibile se si usasse'% o' o '% .4o' invece di'% i'. Inoltre, sembra che manchi '#include ' che dichiara ['umask()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/umask.html) e ['mkdir()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html). –

+0

Produce 22 con% 4o. – yasar

risposta

0

Come dice Eric, umask è il complemento della modalità di autorizzazione reale si ottiene. Quindi, anziché passare la maschera stessa a mkdir(), è necessario passare 0777-mask a mkdir().

+0

Grazie, volevo davvero incorporare umask per ottenere il permesso corretto. Ho cambiato 0777-mask in 0777 e ~ mask però. :) – yasar

+0

In realtà non ho bisogno di usare direttamente umask, dal momento che sembra che mkdir lo faccia già. Quindi usando 0777 si ottiene una directory con 'drwxr-xr-x' quando la mia umask è 022 – yasar

7

Sembra che tu stia fraintendendo il motivo per cui è utilizzato umask. Essa stabilisce/recupera la maschera del processo di creazione di modalità file, che a sua volta viene utilizzato per spegnere bit in modalità file specificato nelle chiamate come mkdir, come questo (pseduo-code):

real_mode = requested_mode & ~umask 

Quindi, in il tuo codice, dato che passi il valore della umask stessa, finisci per specificare le autorizzazioni come zero, che è esattamente ciò che vedi.

Invece, si dovrebbe specificare le autorizzazioni che si desidera nella chiamata a mkdir, in questo modo:

mkdir("trial", 0755) 
+3

Penso che yasar11732 voglia incorporare l'impostazione umask dell'utente corrente, non la codifica hard '0755'. Solo la mia ipotesi. –

+1

Normalmente non è necessario fare confusione con umask dell'utente in un'applicazione; la libc lo fa già per te in 'mkdir()'. Così hardcoding 0755 o 0775 è perfettamente a posto. –

+4

Cosa succede se umask 0'? Hardcoding 0755 lo renderà 0755 invece del desiderato 0777. Forse l'hardcoding 0777 è più corretto, come commentato da yasar11732, ma non è dannoso per '0777 & ~ mask'. –