summaryrefslogtreecommitdiff
path: root/modules/language/python/module/stat.scm
blob: a430562608844ee16868a104e682d5712109623f (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
(define-module (language python module stat)
  #: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  S_ISGID)
(define S_ISVTX  #o01000)
(define S_IREAD  #o00400)
(define S_IWRITE #o00200)
(define S_IEXEC  #o00100)
(define S_IRWXU  (logior S_IEXEC S_IWRITE S_IREAD))
(define S_IRUSR  S_IREAD)
(define S_IWUSR  S_IWRITE)
(define S_IXUSR  S_IEXEC)
(define S_IRGRP  #o00040)
(define S_IWGRP  #o00020)
(define S_IXGRP  #o00010)
(define S_IRWXG  (logior S_IXGRP S_IWGRP S_IRGRP))
(define S_IROTH  #o00004)
(define S_IWOTH  #o00002)
(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_IFREG   #o100000)
(define S_IFLNK   #o120000)
(define S_IFCHR   #o020000)
(define S_IFBLK   #o060000)
(define S_IFIFO   #o010000)
(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))