2011-02-04 9 views
5

Se ho un sistema POSIX come Linux o Mac OS X, qual è il modo migliore e più portabile per determinare se un percorso è su un filesystem di sola lettura? Posso pensare di 4 modi fuori dalla parte superiore della mia testa:Miglior modo POSIX per determinare se un filesystem è montato sola lettura

  • open(2) un file con O_WRONLY - Si avrebbe bisogno di venire con un nome di file unico e passare anche in O_CREAT e O_EXCL. Se fallisce e hai un errore di EROFS allora sai che è un filesystem di sola lettura. Questo avrebbe il fastidioso effetto collaterale della creazione di un file che non ti interessava, ma potresti immediatamente creare lo unlink(2) dopo averlo creato.

  • statvfs(3) - Uno dei campi della tornata struct statvfs è f_flag, e una delle bandierine è ST_RDONLY per un filesystem in sola lettura. Tuttavia, le specifiche per statvfs(3) chiariscono che le applicazioni non possono dipendere da nessuno dei campi contenenti informazioni valide. Sembrerebbe che ci sia una possibilità decente ST_RDONLY potrebbe non essere impostato per un filesystem di sola lettura.

  • access(2) - Se si conosce il punto di montaggio, è possibile utilizzare access(2) con la bandiera W_OK fino a quando si esegue come un utente che avrebbero accesso in scrittura al punto di montaggio. Cioè, sei root o è stato montato con il tuo UID come parametro di mount. Otterrai un valore di ritorno di -1 e un errno di EROFS.

  • Parsing /etc/mtab o /proc/mounts - Non sembra portatile. Mac OS X sembra non avere nessuno di questi, per esempio. Anche se il sistema aveva /etc/mtab non sono sicuro che i campi siano coerenti tra i sistemi operativi o se le opzioni di montaggio per sola lettura (ro su Linux) sono portatili.

Ci sono altri modi che mi mancano? Se avessi bisogno di sapere se un filesystem è stato montato in sola lettura, come lo faresti?

+1

Sul server mtab, se un file system è montato rw ma passa in seguito, mtab non si aggiornerà./proc/mounts si aggiornerà correttamente. – Ryaner

risposta

1

È inoltre possibile popen il comando mount ed esaminare l'output in cerca del proprio file system e vedere se ha mantenuto il testo " (ro,".

Ma ancora, questo non è necessariamente portatile.

La mia opzione sarebbe di non preoccuparsi se il file system è stato montato solo lettura sola. Basta provare e creare il tuo file e, se fallisce, dire all'utente quale fosse l'errore. E, naturalmente, dare loro la possibilità di salvarlo da qualche altra parte.

Devi davvero fare quel genere di cose comunque poiché, in qualsiasi scenario in cui c'è anche un piccolo spazio tra il test e il fare, potresti trovare i cambiamenti della situazione (probabilmente non al punto di fare un intero file system solo a lettura ma, chissà, forse c'è (o sarà in futuro) un file system che permette questo).

+0

Accetto nel caso generale con la semplice scrittura a causa delle condizioni di gara; questo è il motivo per cui l'accesso (2) è generalmente scoraggiato. Ma nel mio caso specifico ho bisogno di prendere una decisione politica basata interamente sul fatto che la FS sia stata o meno montata in sola lettura; In realtà non mi interessa scrivere un file su FS. –

+0

'' 'mount''' usa' ''/etc/mtab''' che potrebbe non essere corretto se si trova su un filesystem ro. – Willem

2
utime(path, NULL); 

Se avete permanenti di scrittura, quindi che vi darà ROFS o - se consentito - semplicemente aggiornare il mtime sulla directory, che è fondamentalmente innocuo.

+1

Fondamentalmente innocuo tranne forse per, diciamo, ... programmi di backup incrementali? :-) – paxdiablo

Problemi correlati