diff options
author | Jesse Luehrs <doy@tozt.net> | 2018-05-14 17:22:50 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2018-05-14 17:22:50 -0400 |
commit | 3888214fe87b27be5d5423a5c80eb4f17958b9d2 (patch) | |
tree | 1097c89800e7db663f8b8bbd65a3b4457d37156a /src/sys/unix.rs | |
parent | 4c29fe2213473b175dbb7672561cba3375419a41 (diff) | |
download | fancy-prompt-3888214fe87b27be5d5423a5c80eb4f17958b9d2.tar.gz fancy-prompt-3888214fe87b27be5d5423a5c80eb4f17958b9d2.zip |
factor out os-specific calls
also use the unix form instead of linux to hopefully fix osx
Diffstat (limited to 'src/sys/unix.rs')
-rw-r--r-- | src/sys/unix.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/sys/unix.rs b/src/sys/unix.rs new file mode 100644 index 0000000..0f433b3 --- /dev/null +++ b/src/sys/unix.rs @@ -0,0 +1,34 @@ +use users; +use std; + +use std::os::unix::fs::MetadataExt; +use std::os::unix::fs::PermissionsExt; + +pub fn path_writable(path: &std::path::Path) -> super::PathWritability { + std::fs::metadata(path) + .map(|stat| { + // XXX there really has to be a better option here + let euid = users::get_effective_uid(); + let egid = users::get_effective_gid(); + let file_uid = stat.uid(); + let file_gid = stat.gid(); + let file_mode = stat.permissions().mode(); + + if euid == 0 { + super::PathWritability::Writable + } + else if (file_uid == euid) && (file_mode & 0o200 != 0) { + super::PathWritability::Writable + } + else if (file_gid == egid) && (file_mode & 0o020 != 0) { + super::PathWritability::Writable + } + else if file_mode & 0o002 != 0 { + super::PathWritability::Writable + } + else { + super::PathWritability::NotWritable + } + }) + .unwrap_or(super::PathWritability::NotExist) +} |