]> gitweb.factorcode.org Git - factor.git/blob - basis/unix/groups/groups.factor
initial comit of groups, users, and utmpx
[factor.git] / basis / unix / groups / groups.factor
1 ! Copyright (C) 2008 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien alien.c-types alien.strings io.encodings.utf8
4 io.unix.backend kernel math sequences splitting unix strings
5 combinators.short-circuit byte-arrays combinators qualified
6 accessors math.parser fry assocs namespaces continuations ;
7 IN: unix.groups
8
9 QUALIFIED: grouping
10
11 TUPLE: group id name passwd members ;
12
13 SYMBOL: group-cache
14
15 GENERIC: group-struct ( obj -- group )
16
17 <PRIVATE
18
19 : group-members ( group-struct -- seq )
20     group-gr_mem
21     [ dup { [ ] [ *void* ] } 1&& ]
22     [
23         dup *void* utf8 alien>string
24         [ alien-address "char**" heap-size + <alien> ] dip
25     ] [ ] produce nip ;
26
27 : (group-struct) ( id -- group-struct id group-struct byte-array length void* )
28     "group" <c-object> tuck 1024
29     [ <byte-array> ] keep f <void*> ;
30
31 M: integer group-struct ( id -- group )
32     (group-struct) getgrgid_r io-error ;
33
34 M: string group-struct ( string -- group )
35     (group-struct) getgrnam_r 0 = [ (io-error) ] unless ;
36
37 : group-struct>group ( group-struct -- group )
38     [ \ group new ] dip
39     {
40         [ group-gr_name >>name ]
41         [ group-gr_passwd >>passwd ]
42         [ group-gr_gid >>id ]
43         [ group-members >>members ]
44     } cleave ;
45
46 PRIVATE>
47
48 : group-name ( id -- string )
49     dup group-cache get [
50         at
51     ] [
52         group-struct group-gr_name
53     ] if*
54     [ nip ] [ number>string ] if* ;
55
56 : group-id ( string -- id )
57     group-struct group-gr_gid ;
58
59 <PRIVATE
60
61 : >groups ( byte-array n -- groups )
62     [ 4 grouping:group ] dip head-slice [ *uint group-name ] map ;
63
64 PRIVATE>
65
66 : user-groups ( string -- seq )
67     #! first group is -1337, legacy unix code
68     -1337 NGROUPS_MAX [ 4 * <byte-array> ] keep
69     <int> [ getgrouplist io-error ] 2keep
70     [ 4 tail-slice ] [ *int 1- ] bi* >groups ;
71
72 : all-groups ( -- seq )
73     [ getgrent dup ] [ group-struct>group ] [ drop ] produce ;
74
75 : with-group-cache ( quot -- )
76     all-groups [ [ id>> ] keep ] H{ } map>assoc
77     group-cache rot with-variable ; inline
78
79 : real-group-id ( -- id )
80     getgid ; inline
81
82 : real-group-name ( -- string )
83     real-group-id group-name ; inline
84
85 : effective-group-id ( -- string )
86     getegid ; inline
87
88 : effective-group-name ( -- string )
89     effective-group-id group-name ; inline
90
91 GENERIC: set-real-group ( obj -- )
92
93 GENERIC: set-effective-group ( obj -- )
94
95 : with-real-group ( string/id quot -- )
96     '[ _ set-real-group @ ]
97     real-group-id '[ _ set-real-group ] [ ] cleanup ; inline
98
99 : with-effective-group ( string/id quot -- )
100     '[ _ set-effective-group @ ]
101     effective-group-id '[ _ set-effective-group ] [ ] cleanup ; inline
102
103 <PRIVATE
104
105 : (set-real-group) ( id -- )
106     setgid io-error ; inline
107
108 : (set-effective-group) ( id -- )
109     setegid io-error ; inline
110
111 PRIVATE>
112     
113 M: string set-real-group ( string -- )
114     group-id (set-real-group) ;
115
116 M: integer set-real-group ( id -- )
117     (set-real-group) ;
118
119 M: integer set-effective-group ( id -- )    
120     (set-effective-group) ;
121
122 M: string set-effective-group ( string -- )
123     group-id (set-effective-group) ;