diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-08-05 22:23:35 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-08-05 22:23:35 -0700 |
commit | 303103f9a2fa0837a4613a5ad57f7f1ca2f1d61b (patch) | |
tree | f8ec6aec551383a49e1f3497ca2f040c418daf8c /share | |
parent | ad8319e7f8f09d328e37374fe0e71c64782fd9aa (diff) | |
download | txr-303103f9a2fa0837a4613a5ad57f7f1ca2f1d61b.tar.gz txr-303103f9a2fa0837a4613a5ad57f7f1ca2f1d61b.tar.bz2 txr-303103f9a2fa0837a4613a5ad57f7f1ca2f1d61b.zip |
New filesystem object testing functions.
* lisplib.c (path_test_set_entries, path_test_instantiate):
New static functions.
(dlt_register): Registered new functions to dl_table.
* txr.1: Documented new functions.
* share/txr/stdlib/path-test.tl: New file.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/path-test.tl | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/share/txr/stdlib/path-test.tl b/share/txr/stdlib/path-test.tl new file mode 100644 index 00000000..1ca8d940 --- /dev/null +++ b/share/txr/stdlib/path-test.tl @@ -0,0 +1,98 @@ +(defun sys:do-path-test (statfun path testfun) + [testfun (if (stringp path) (ignerr [statfun path]) path)]) + +(defmacro sys:path-test ((var statfun path) . body) + ^[sys:do-path-test ,statfun ,path + (lambda (,var) (when ,var ,*body))]) + +(defun sys:path-test-mode (statfun path mask) + (sys:path-test (s statfun path) + (let ((m (prop s :mode))) + (if (plusp (logand m mask)) t)))) + +(defun path-exists-p (path) + (sys:path-test (s stat path) t)) + +(defun path-file-p (path) + [sys:path-test-mode stat path s-ifreg]) + +(defun path-dir-p (path) + [sys:path-test-mode stat path s-ifdir]) + +(defun path-symlink-p (path) + [sys:path-test-mode lstat path s-iflnk]) + +(defun path-blkdev-p (path) + [sys:path-test-mode stat path s-ifblk]) + +(defun path-chrdev-p (path) + [sys:path-test-mode stat path s-ifchr]) + +(defun path-sock-p (path) + [sys:path-test-mode stat path s-ifsock]) + +(defun path-pipe-p (path) + [sys:path-test-mode stat path s-ififo]) + +(defun path-setgid-p (path) + [sys:path-test-mode stat path s-isgid]) + +(defun path-setuid-p (path) + [sys:path-test-mode stat path s-isuid]) + +(defun path-sticky-p (path) + [sys:path-test-mode stat path s-isvtx]) + +(defun path-mine-p (path) + (sys:path-test (s stat path) + (let ((u (prop s :uid))) + (= u (geteuid))))) + +(defun path-my-group-p (path) + (sys:path-test (s stat path) + (let ((g (prop s :gid))) + (or (= g (getegid)) + (find g (getgroups)))))) + +(defun sys:path-access (path umask gmask omask) + (sys:path-test (s stat path) + (let ((m (prop s :mode)) + (euid (geteuid))) + (cond + ((zerop euid) (or (zerop (logior umask s-ixusr)) + (plusp (logand m (logior umask gmask omask))))) + ((= euid (prop s :uid)) (plusp (logand m umask))) + ((let ((g (prop s :gid))) + (or (= g (getegid)) + (find g (getgroups)))) + (plusp (logand m gmask))) + (t (plusp (logand m omask))))))) + +(defun path-executable-to-me-p (path) + (sys:path-access path s-ixusr s-ixgrp s-ixoth)) + +(defun path-writable-to-me-p (path) + (sys:path-access path s-iwusr s-iwgrp s-iwoth)) + +(defmacro sys:path-examine ((var statfun path) . body) + ^[sys:do-path-test ,statfun ,path + (lambda (,var) ,*body)]) + +(defun path-newer (path-0 path-1) + (sys:path-examine (s0 stat path-0) + (sys:path-examine (s1 stat path-1) + (and s0 (or (not s1) + (> (prop s0 :mtime) + (prop s1 :mtime))))))) + +(defun path-older (path-0 path-1) + (path-newer path-1 path-0)) + +(defun path-same-object (path-0 path-1) + (sys:path-examine (s0 stat path-0) + (sys:path-examine (s1 stat path-1) + (and s0 s1 + (eql (prop s0 :dev) + (prop s1 :dev)) + (eql (prop s0 :ino) + (prop s1 :ino)))))) |