If I have a POSIX system like Linux or Mac OS X, what's the best and most portable way to determine if a path is on a read-only filesystem? I can think of 4 ways off the top of my head:
open(2)
a file with O_WRONLY
- You would need to come up with a unique filename and also pass in O_CREAT
and O_EXCL
. If it fails and you have an errno of EROFS
then you know it's a read-only filesystem. This would have the annoying side effect of actually creating a file you didn't care about, but you could unlink(2)
it immediately after creating it.
statvfs(3)
- One of the fields of the returned struct statvfs
is f_flag
, and one of the flags is ST_RDONLY
for a read-only filesystem. However, the spec for statvfs(3)
makes it clear that applications cannot depend on any of the fields containing valid information. It would seem there's a decent possibility ST_RDONLY
might not be set for a read-only filesystem.
access(2)
- If you know the mount point, you can use access(2)
with the W_OK
flag as long as you are running as a user who would have write access to the mountpoint. Ie, either you are root or it was mounted with your UID as a mount parameter. You would get a return value of -1 and an errno of EROFS
.
Parsing /etc/mtab
or /proc/mounts
- Doesn't seem portable. Mac OS X seems to have neither of these, for example. Even if the system did have /etc/mtab
I'm not sure the fields are consistent between OSes or if the mount options for read-only (ro
on Linux) are portable.
Are there other ways I'm missing? If you needed to know if a filesystem was mounted read-only, how would you do it?
You could also popen
the command mount
and examine the output looking for your file system and seeing if it held the text " (ro,"
.
But again, that's not necessarily portable.
My option would be to not worry about whether the file system was mounted read only at all. Just try and create your file and, if it fails, tell the user what the error was. And, of course, give them the option of saving it somewhere else.
You really have to do that sort of thing anyway since, in any scenario where there's even a small gap between testing and doing, you may find the situation changes (probably not to the extent of making an entire file system read only but, who knows, maybe there is (or will be in the future) a file system that allows this).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With