2011-02-04 14 views
5

Si tengo un sistema POSIX como Linux o Mac OS X, ¿cuál es la mejor y más portátil forma de determinar si una ruta está en un sistema de archivos de solo lectura? No puedo pensar en 4 formas de la parte superior de mi cabeza:Mejor forma POSIX para determinar si un sistema de archivos está montado solo lectura

  • open(2) un archivo con O_WRONLY - Usted tendría que llegar a un nombre de archivo único y además debe pasar en O_CREAT y O_EXCL. Si falla y tiene un error de EROFS, entonces sabrá que es un sistema de archivos de solo lectura. Esto tendría el molesto efecto secundario de crear realmente un archivo que no le interesaba, pero podría unlink(2) inmediatamente después de crearlo.

  • statvfs(3) - Uno de los campos de la struct statvfs devuelto es f_flag, y una de las banderas es ST_RDONLY para un sistema de archivos de sólo lectura. Sin embargo, la especificación para statvfs(3) deja en claro que las aplicaciones no pueden depender de ninguno de los campos que contienen información válida. Parece que hay una posibilidad decente de que ST_RDONLY no esté configurado para un sistema de archivos de solo lectura.

  • access(2) - Si conoce el punto de montaje, puede utilizar access(2) con la bandera W_OK siempre y cuando se está ejecutando como un usuario que tendría acceso de escritura al punto de montaje. Es decir, o usted es root o está montado con su UID como parámetro de montaje. Obtendría un valor de retorno de -1 y un error de EROFS.

  • Análisis /etc/mtab o /proc/mounts - No parece portátil. Mac OS X parece no tener ninguno de estos, por ejemplo. Incluso si el sistema tenía /etc/mtab, no estoy seguro de que los campos sean consistentes entre sistemas operativos o si las opciones de montaje para solo lectura (ro en Linux) son portátiles.

¿Hay otras formas en las que me estoy perdiendo? Si necesitabas saber si un sistema de archivos se montó como de solo lectura, ¿cómo lo harías?

+1

En el mtab uno, si un sistema de archivos está montado en rw pero va ro después, mtab no se actualizará./proc/mounts se actualizará correctamente. – Ryaner

Respuesta

1

También puede popen el comando mount y examinar la salida buscando su sistema de archivos y ver si contiene el texto " (ro,".

Pero, una vez más, eso no es necesariamente portátil.

Mi opción sería no preocuparse por si el sistema de archivos se montó solo con lectura. Simplemente intente crear su archivo y, si falla, decirle al usuario cuál fue el error. Y, por supuesto, les da la opción de guardarlo en otro lugar.

Realmente tiene que hacer ese tipo de cosas ya que, en cualquier escenario donde haya incluso una pequeña diferencia entre probar y hacer, la situación puede cambiar (probablemente no hasta el punto de hacer que todo el sistema de archivos solo lea) pero, quién sabe, tal vez haya (o haya en el futuro) un sistema de archivos que lo permita).

+0

Estoy de acuerdo en el caso general con solo escribir debido a las condiciones de carrera; esta es la razón por la que generalmente se desaconseja el acceso (2). Pero en mi caso específico, necesito tomar una decisión de política basada completamente en si el FS fue montado solo de lectura o no; En realidad, no me importa escribir un archivo en el FS. –

+0

'' 'mount''' utiliza' ''/etc/mtab''' que a su vez puede ser incorrecto si está en un sistema de archivos ro. – Willem

2
utime(path, NULL); 

Si tiene ondulaciones permanentes de escritura, a continuación, que le dará ROFS o - si está permitido - simplemente actualizar el mtime en el directorio, que es básicamente inofensivo.

+1

Básicamente inofensivo excepto tal vez para, digamos, ... programas de respaldo incrementales? :-) – paxdiablo

Cuestiones relacionadas