20 #include "posixacladdons.h"
22 #if defined(USE_POSIX_ACL) && !defined(HAVE_NON_POSIX_ACL_EXTENSIONS)
27 #include <tqptrlist.h>
29 class SortedEntryList :
public TQPtrList<acl_entry_t>
32 int compareItems( TQPtrCollection::Item i1,
33 TQPtrCollection::Item i2 )
35 acl_entry_t *e1 =
static_cast<acl_entry_t*
>( i1 );
36 acl_entry_t *e2 =
static_cast<acl_entry_t*
>( i2 );
39 uid_t uid1 = 0, uid2 = 0;
41 acl_get_tag_type( *e1, &tag1 );
42 acl_get_tag_type( *e2, &tag2 );
44 if ( tag1 == ACL_USER || tag1 == ACL_GROUP )
45 uid1 = *( (uid_t*) acl_get_qualifier( *e1 ) );
47 if ( tag2 == ACL_USER || tag2 == ACL_GROUP )
48 uid2 = *( (uid_t*) acl_get_qualifier( *e2 ) );
52 else if ( tag1 > tag2 )
57 else if ( uid1 > uid2 )
64 int acl_cmp(acl_t acl1, acl_t acl2)
69 SortedEntryList entries1, entries2;
70 entries1.setAutoDelete(
true );
71 entries2.setAutoDelete(
true );
74 acl_entry_t *entry =
new acl_entry_t;
75 int ret = acl_get_entry( acl1, ACL_FIRST_ENTRY, entry );
77 entries1.append( entry );
78 entry =
new acl_entry_t;
79 ret = acl_get_entry( acl1, ACL_NEXT_ENTRY, entry );
83 entry =
new acl_entry_t;
84 ret = acl_get_entry( acl2, ACL_FIRST_ENTRY, entry );
86 entries2.append( entry );
87 entry =
new acl_entry_t;
88 ret = acl_get_entry( acl2, ACL_NEXT_ENTRY, entry );
93 if ( entries1.count() != entries2.count() )
101 acl_permset_t permset1, permset2;
102 acl_tag_t tag1, tag2;
104 acl_entry_t *e1, *e2;
106 for ( e1 = entries1.first(), e2 = entries2.first(); e1; e1 = entries1.next(), e2 = entries2.next() ) {
108 if ( acl_get_tag_type( *e1, &tag1 ) != 0 )
return 1;
109 if ( acl_get_tag_type( *e2, &tag2 ) != 0 )
return 1;
110 if ( tag1 != tag2 )
return 1;
113 if ( acl_get_permset( *e1, &permset1 ) != 0 )
return 1;
114 if ( acl_get_permset( *e2, &permset2 ) != 0 )
return 1;
115 if ( *permset1 != *permset2)
return 1;
121 uid1 = *( (uid_t*) acl_get_qualifier( *e1 ) );
122 uid2 = *( (uid_t*) acl_get_qualifier( *e2 ) );
123 if ( uid1 != uid2 )
return 1;
130 acl_t acl_from_mode(mode_t mode)
132 acl_t newACL = acl_init( 3 );
134 acl_permset_t permset;
138 if ( ( error = acl_create_entry( &newACL, &entry ) ) == 0 ) {
140 acl_set_tag_type( entry, ACL_USER_OBJ );
141 acl_get_permset( entry, &permset );
142 acl_clear_perms( permset );
143 if ( mode & S_IRUSR ) acl_add_perm( permset, ACL_READ );
144 if ( mode & S_IWUSR ) acl_add_perm( permset, ACL_WRITE );
145 if ( mode & S_IXUSR ) acl_add_perm( permset, ACL_EXECUTE );
146 acl_set_permset( entry, permset );
149 if ( ( error = acl_create_entry( &newACL, &entry ) ) == 0 ) {
151 acl_set_tag_type( entry, ACL_GROUP_OBJ );
152 acl_get_permset( entry, &permset );
153 acl_clear_perms( permset );
154 if ( mode & S_IRGRP ) acl_add_perm( permset, ACL_READ );
155 if ( mode & S_IWGRP ) acl_add_perm( permset, ACL_WRITE );
156 if ( mode & S_IXGRP ) acl_add_perm( permset, ACL_EXECUTE );
157 acl_set_permset( entry, permset );
160 if ( ( error = acl_create_entry( &newACL, &entry ) ) == 0) {
162 acl_set_tag_type( entry, ACL_OTHER );
163 acl_get_permset( entry, &permset );
164 acl_clear_perms( permset );
165 if ( mode & S_IROTH ) acl_add_perm( permset, ACL_READ );
166 if ( mode & S_IWOTH ) acl_add_perm( permset, ACL_WRITE );
167 if ( mode & S_IXOTH ) acl_add_perm( permset, ACL_EXECUTE );
168 acl_set_permset( entry, permset );
174 acl_free ( &newACL );
181 int acl_equiv_mode(acl_t acl, mode_t *mode_p)
185 acl_permset_t permset;
192 int ret = acl_get_entry( acl, ACL_FIRST_ENTRY, &entry );
194 acl_get_tag_type( entry, &tag );
195 acl_get_permset( entry, &permset );
199 if ( acl_get_perm( permset, ACL_READ ) ) mode |= S_IRUSR;
200 if ( acl_get_perm( permset, ACL_WRITE ) ) mode |= S_IWUSR;
201 if ( acl_get_perm( permset, ACL_EXECUTE ) ) mode |= S_IXUSR;
205 if ( acl_get_perm( permset, ACL_READ ) ) mode |= S_IRGRP;
206 if ( acl_get_perm( permset, ACL_WRITE ) ) mode |= S_IWGRP;
207 if ( acl_get_perm( permset, ACL_EXECUTE ) ) mode |= S_IXGRP;
211 if ( acl_get_perm( permset, ACL_READ ) ) mode |= S_IROTH;
212 if ( acl_get_perm( permset, ACL_WRITE ) ) mode |= S_IWOTH;
213 if ( acl_get_perm( permset, ACL_EXECUTE ) ) mode |= S_IXOTH;
227 ret = acl_get_entry( acl, ACL_NEXT_ENTRY, &entry );
236 #endif // USE_POSIX_ACL