# Umask

umask è un comando della shell testuale dei sistemi operativi Unix e Unix-like, e più in generale dei sistemi POSIX, che permette di suggerire ai programmi avviati successivamente quali permessi negare al momento della creazione di nuovi file e directory. Ha effetto solo per i programmi avviati successivamente ad umask, e solo se avviati dalla stessa shell, differendo da chmod sia perché quest'ultimo modifica i permessi successivamente alla creazione dei file o directory, sia perché i permessi forniti con chmod sono quelli effettivi e non quelli negati.
umask è anche il nome di una chiamata di sistema definita dallo standard POSIX che modifica un omonimo attributo dei processi (precisamente del process control block), il quale mantiene il valore corrente di tale suggerimento, e che viene ereditato dai processi figli. Di fatto, il comando umask della shell, che è interno alla shell stessa e non è un programma esterno, agisce semplicemente invocando tale chiamata di sistema per modificare il valore corrente della maschera del processo della shell; il nuovo valore viene poi ereditato dai comandi avviati in seguito dalla stessa shell (ma non, ad esempio, dai comandi avviati in precedenza o avviati da altre shell).
Il comando e la chiamata di sistema umask modificano solo il comportamento predefinito dei programmi, i quali mantengono la possibilità tecnica di aggirare il suggerimento, ad esempio cambiando il valore dell'impostazione corrente o modificando esplicitamente i permessi dei nuovi file e/o directory create. È possibile negare solo permessi standard di lettura, scrittura ed esecuzione, e non altri tipi di permessi.

## Il comando umask
### Sintassi

La sintassi generale del comando umask è:
    umask [-p] [-S] [maschera]
dove la maschera può essere:
* un numero da uno a quattro cifre in base otto secondo la rappresentazione ottale dei permessi che indica i permessi che si desidera negare;
* una stringa secondo la rappresentazione simbolica dei permessi che indica l'insieme dei permessi che possono essere concessi.
Lanciando il comando senza specificare un parametro maschera viene mostrato sullo standard output il valore corrente. Se si desidera lasciare invariati i propri permessi, negandoli completamente agli utenti del gruppo e a tutti gli altri utenti, si usi:
    umask 077
Notare che i permessi di ogni file o directory creati dipendono sia dai permessi richiesti dal programma che li ha creati che dall'impostazione data tramite umask.

### Opzioni

L'opzione -S mostra il valore corrente dei permessi effettivi espresso in notazione simbolica (ad esempio u=rwx,g=rx,o=rx invece di 022)
L'opzione -p mostra il valore di negazione dei permessi corrente impostato da umask (ad esempio 022)
Valori comunemente usati per umask sono:
* 002 per impedire la scrittura agli utenti che non sono proprietari del file e che non fanno nemmeno parte del gruppo assegnato al file
* 022 per impedire la scrittura a utenti diversi dal proprietario (valore di default)
* 044 per impedire la lettura a utenti diversi dal proprietario
* 077 per impedire lettura, scrittura ed esecuzione a utenti diversi dal proprietario

## Tabella dei permessi di umask

| Ottale | Permessi negati | Permessi consentiti | Binario |
| 0 | --- | rwx | 000 |
| 1 | --x | rw- | 001 |
| 2 | -w- | r-x | 010 |
| 3 | -wx | r-- | 011 |
| 4 | r-- | -wx | 100 |
| 5 | r-x | -w- | 101 |
| 6 | rw- | --x | 110 |
| 7 | rwx | --- | 111 |

### Esempi

Imposta il valore di umask a 0147 e tramite il comando touch crea un nuovo file vuoto (che normalmente avrebbe i permessi 0666, o -rw-rw-rw-); il nuovo file ha permessi ottali 0620, in quanto 0666 & ~0147 = 0620:
    $ umask 147
    $ touch prova
    $ ls -l prova
    -rw--w---- 1 matteo matteo 0 27 mag 22:27 prova
Seguendo l'esempio sopra è possibile osservare la differenza con il comando chmod eseguito successivamente:
    $ chmod 147 prova
    $ ls -l prova
    ---xr--rwx 1 matteo matteo 0 27 mag 22:27 prova
Imposta il valore di umask a 0147 e tramite il comando mkdir crea una nuova directory (che normalmente avrebbe i permessi 0777, o drwxrwxrwx); la nuova directory ha permessi ottali 0630, in quanto 0777 & ~0147 = 0630:
    $ umask 147
    $ mkdir nuova_directory
    $ ls -ld nuova_directory
    drw--wx--- 2 matteo matteo 48 27 mag 22:34 nuova_directory

## La chiamata di sistema umask

La chiamata di sistema umask è dichiarata nello header file sys/stat.h:
Il tipo mode_t è un tipo opaco (solitamente un tipo numerico intero) che rappresenta dei permessi d'accesso. Il parametro cmask indica i permessi che si vuole negare. A tal fine sono considerati solo i permessi di lettura, scrittura ed esecuzione relativi alle classi di permessi utente, gruppo e altri. I restanti permessi, come set User ID, set Group ID e sticky non sono considerati.

### Valore di ritorno

Il valore di ritorno è il valore precedente di umask.