aboutsummaryrefslogtreecommitdiffstats
path: root/src/sys/unix.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2018-05-14 17:22:50 -0400
committerJesse Luehrs <doy@tozt.net>2018-05-14 17:22:50 -0400
commit3888214fe87b27be5d5423a5c80eb4f17958b9d2 (patch)
tree1097c89800e7db663f8b8bbd65a3b4457d37156a /src/sys/unix.rs
parent4c29fe2213473b175dbb7672561cba3375419a41 (diff)
downloadfancy-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.rs34
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)
+}