summaryrefslogtreecommitdiff
path: root/modules/language/python/module/stat.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/module/stat.scm')
-rw-r--r--modules/language/python/module/stat.scm99
1 files changed, 89 insertions, 10 deletions
diff --git a/modules/language/python/module/stat.scm b/modules/language/python/module/stat.scm
index cb314b7..a430562 100644
--- a/modules/language/python/module/stat.scm
+++ b/modules/language/python/module/stat.scm
@@ -1,10 +1,29 @@
(define-module (language python module stat)
- #:export ())
+ #:export (ST_MODE ST_INO ST_DEV ST_NLINK ST_UID ST_GID ST_SIZE ST_ATIME
+ ST_MTIME ST_CTIME S_ISUID S_ISGID S_ENFMT S_ISVTX S_IREAD
+ S_IWRITE S_IEXEC S_IRWXU S_IRUSR S_IWUSR S_IXUSR S_IRGRP
+ S_IWGRP S_IXGRP S_IRWXG S_IROTH S_IWOTH S_IXOTH S_IRWXO
+ S_IFDIR S_IFREG S_IFLNK S_IFCHR S_IFBLK S_IFIFO S_IFSOC
+ UF_NODUMP UF_IMMUTABLE UF_APPEND UF_OPAQUE UF_NOUNLINK
+ UF_COMPRESSED UF_HIDDEN SF_ARCHIVED SF_IMMUTABLE SF_APPEND
+ SF_NOUNLINK SF_SNAPSHOT S_ISDIR S_ISREG S_ISLNK S_ISCHR
+ S_ISBLK S_ISFIFO S_ISSOCK S_IMODE S_IFMT
+ filemode))
+(define ST_MODE 0)
+(define ST_INO 1)
+(define ST_DEV 2)
+(define ST_NLINK 3)
+(define ST_UID 4)
+(define ST_GID 5)
+(define ST_SIZE 6)
+(define ST_ATIME 7)
+(define ST_MTIME 8)
+(define ST_CTIME 9)
(define S_ISUID #o04000)
(define S_ISGID #o02000)
-(define S_ENFMT "error")
+(define S_ENFMT S_ISGID)
(define S_ISVTX #o01000)
(define S_IREAD #o00400)
(define S_IWRITE #o00200)
@@ -22,17 +41,77 @@
(define S_IXOTH #o00001)
(define S_IRWXO (logior S_IXOTH S_IWOTH S_IROTH))
+;;Internal
+(define SS_IFMT #o170000)
+
+
(define S_IFDIR #o040000)
-(define S_IFMT #o170000)
(define S_IFREG #o100000)
(define S_IFLNK #o120000)
(define S_IFCHR #o020000)
(define S_IFBLK #o060000)
(define S_IFIFO #o010000)
-
-(define (is-dir? x) (= (logand x S_IFMT) S_IFDIR))
-(define (is-reg? x) (= (logand x S_IFMT) S_IFREG))
-(define (is-lnk? x) (= (logand x S_IFMT) S_IFLNK))
-(define (is-chr? x) (= (logand x S_IFMT) S_IFCHR))
-(define (is-blk? x) (= (logand x S_IFMT) S_IFBLK))
-(define (is-fif? x) (= (logand x S_IFMT) S_IFIFO))
+(define S_IFSOCK #o140000)
+
+(define (S_ISDIR x) (= (logand x SS_IFMT) S_IFDIR))
+(define (S_ISREG x) (= (logand x SS_IFMT) S_IFREG))
+(define (S_ISLNK x) (= (logand x SS_IFMT) S_IFLNK))
+(define (S_ISCHR x) (= (logand x SS_IFMT) S_IFCHR))
+(define (S_ISBLK x) (= (logand x SS_IFMT) S_IFBLK))
+(define (S_ISFIFO x) (= (logand x SS_IFMT) S_IFIFO))
+(define (S_ISSOCK x) (= (logand x SS_IFMT) S_IFSOCK))
+(define (S_IMODE x) (logand x #o7777))
+(define (S_IFMT x) (logand x SS_IFMT))
+
+(define UF_NODUMP #x00000001)
+(define UF_IMMUTABLE #x00000002)
+(define UF_APPEND #x00000004)
+(define UF_OPAQUE #x00000008)
+(define UF_NOUNLINK #x00000010)
+(define UF_COMPRESSED #x00000020)
+(define UF_HIDDEN #x00008000)
+(define SF_ARCHIVED #x00010000)
+(define SF_IMMUTABLE #x00020000)
+(define SF_APPEND #x00040000)
+(define SF_NOUNLINK #x00100000)
+(define SF_SNAPSHOT #x00200000)
+
+(define _filemode_table
+ `(((,S_IFLNK "l")
+ (,S_IFREG "-")
+ (,S_IFBLK "b")
+ (,S_IFDIR "d")
+ (,S_IFCHR "c")
+ (,S_IFIFO "p"))
+
+ ((,S_IRUSR "r"))
+ ((,S_IWUSR "w"))
+ ((,(logior S_IXUSR S_ISUID) "s")
+ (,S_ISUID "S")
+ (,S_IXUSR "x"))
+
+ ((,S_IRGRP "r"))
+ ((,S_IWGRP "w"))
+ ((,(logior S_IXGRP S_ISGID) "s")
+ (,S_ISGID "S")
+ (,S_IXGRP "x"))
+
+ ((,S_IROTH "r"),)
+ ((,S_IWOTH "w"),)
+ ((,(logior S_IXOTH S_ISVTX) "t")
+ (,S_ISVTX "T")
+ (,S_IXOTH "x"))))
+
+(define (filemode mode)
+ """Convert a file's mode to a string of the form '-rwxrwxrwx'."""
+ (define perm (py-list))
+
+ (for ((table : _filemode_table)) ()
+ (for ((bit char : table)) ()
+ (if (= (logand mode bit) bit)
+ (pylist-append! perm char)
+ (break))
+ #:final
+ (pylist-append! perm "-")))
+
+ (py-string-join "" perm))