1 ! Copyright (C) 2009 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien.c-types alien.data alien.destructors alien.syntax
4 classes.struct combinators destructors io.backend io.files
5 io.files.acls.macosx.ffi kernel libc literals locals math.order
6 prettyprint sequences unix unix.ffi unix.groups unix.types
9 IN: io.files.acls.macosx
13 : unix-id>string ( byte-array id-type -- string )
15 { ID_TYPE_UID [ user-name "user:" prepend ] }
16 { ID_TYPE_GID [ group-name "group:" prepend ] }
17 ! [ uuid_string_t <struct> [ mbr_uuid_to_string io-error ] keep ]
20 : acl-error ( n -- ) -1 = [ throw-errno ] when ; inline
22 :: file-acl ( path -- acl_t/f )
26 ACL_TYPE_EXTENDED acl_get_file dup [
28 [ path exists? ] preserve-errno
29 [ drop f ] [ throw-errno ] if
35 : free-acl ( acl -- ) acl_free acl-error ;
39 : get-acl-entry ( acl_t n -- acl_entry_t )
40 f acl_entry_t <ref> [ acl_get_entry ] keep swap -1 = [ drop f ] when ;
42 : first-acl-entry ( acl_t -- acl_entry_t ) ACL_FIRST_ENTRY get-acl-entry ;
43 : next-acl-entry ( acl_t -- acl_entry_t ) ACL_NEXT_ENTRY get-acl-entry ;
44 : last-acl-entry ( acl_t -- acl_entry_t ) ACL_LAST_ENTRY get-acl-entry ;
48 : acl>text ( acl_t -- string ) f acl_to_text ;
50 :: acl-entry-each ( path quot -- )
52 path file-acl &free-acl :> acl
55 acl first-acl-entry void* deref quot call
56 [ acl next-acl-entry dup acl-entry! ]
57 [ acl-entry void* deref quot call ] while
59 ] with-destructors ; inline
61 :: acl-each ( path quot -- )
63 path file-acl &free-acl :> acl
65 acl first-acl-entry drop
67 [ acl next-acl-entry ] [ acl quot call ] while
69 ] with-destructors ; inline
71 : acl-entry-map ( path quot -- seq )
72 collector [ acl-entry-each ] dip ; inline
74 : acl-map ( path quot -- seq )
75 collector [ acl-each ] dip ; inline
77 ERROR: acl-init-failed n ;
79 :: n>new-acl ( n -- acl )
80 n acl_init dup [ n throw-acl-init-failed ] unless ;
82 : new-acl ( -- acl ) 1 n>new-acl ; inline
84 : acl-valid? ( acl -- ? ) acl_valid [ acl-error ] keep 0 = ;
86 ERROR: add-permission-failed permission-set permission ;
88 : add-permission ( acl_permset permission -- )
89 acl_add_perm acl-error ;
91 : acl-entry>permset ( acl_entry_t -- acl_permset )
92 f acl_permset_t <ref> [ acl_get_permset acl-error ] keep ;
94 : filter-strings ( obj strings -- string )
95 [ [ 1 = ] dip f ? ] 2map sift "," join ;
97 : permset>strings ( acl_permset -- strings )
98 acl-perms [ acl_get_perm_np dup acl-error ] with map
99 acl-perm-names filter-strings ;
101 : acl-entry>perm-strings ( acl_entry_t -- strings )
102 acl-entry>permset permset>strings ;
104 : with-new-acl ( quot -- )
105 [ [ new-acl &free-acl ] dip call ] with-destructors ; inline
108 [ acl>text io:write ] acl-each ;
110 : acl-entry>owner-name ( acl-entry -- string )
112 acl_get_qualifier dup acl-error &free-acl
113 0 uid_t <ref> -1 int <ref> [ mbr_uuid_to_id io-error ] 2keep
114 [ uint deref ] bi@ unix-id>string
117 : acl-entry>tag-name ( acl-entry -- string )
118 f acl_tag_t <ref> [ acl_get_tag_type acl-error ] keep
119 uint deref acl_tag_t>string ;
121 : flagset>strings ( flagset -- strings )
122 acl-flags [ acl_get_flag_np dup acl-error ] with map
123 acl-flag-names filter-strings ;
125 : acl-entry>flagset ( acl-entry -- flagset )
126 f acl_flagset_t <ref> [ acl_get_flagset_np acl-error ] keep ;
128 : acl-entry>flag-names ( acl-entry -- strings )
129 acl-entry>flagset flagset>strings ;
132 ! Acl, acl entry, principal, group,
133 ! acl_get_qualifier, acl_get_tag_type, acl_get_flagset_np,
136 ! http://www.google.com/codesearch/p?hl=en#pFm0LxzAWvs/darwinsource/tarballs/apsl/file_cmds-116.10.tar.gz%7CFam4LGNxuqg/file_cmds-116.10/ls/print.c&q=acl_get_permset&d=6