20 #include "posixacladdons.h"
22 #if defined(USE_POSIX_ACL) && !defined(HAVE_NON_POSIX_ACL_EXTENSIONS)
24 #include <kdemacros.h>
29 #include <tqptrlist.h>
31 class SortedEntryList :
public TQPtrList<acl_entry_t>
34 int compareItems( TQPtrCollection::Item i1,
35 TQPtrCollection::Item i2 )
37 acl_entry_t *e1 =
static_cast<acl_entry_t*
>( i1 );
38 acl_entry_t *e2 =
static_cast<acl_entry_t*
>( i2 );
41 uid_t uid1 = 0, uid2 = 0;
43 acl_get_tag_type( *e1, &tag1 );
44 acl_get_tag_type( *e2, &tag2 );
46 if ( tag1 == ACL_USER || tag1 == ACL_GROUP )
47 uid1 = *( (uid_t*) acl_get_qualifier( *e1 ) );
49 if ( tag2 == ACL_USER || tag2 == ACL_GROUP )
50 uid2 = *( (uid_t*) acl_get_qualifier( *e2 ) );
54 else if ( tag1 > tag2 )
59 else if ( uid1 > uid2 )
66 TDE_EXPORT
int acl_cmp(acl_t acl1, acl_t acl2)
71 SortedEntryList entries1, entries2;
72 entries1.setAutoDelete(
true );
73 entries2.setAutoDelete(
true );
76 acl_entry_t *entry =
new acl_entry_t;
77 int ret = acl_get_entry( acl1, ACL_FIRST_ENTRY, entry );
79 entries1.append( entry );
80 entry =
new acl_entry_t;
81 ret = acl_get_entry( acl1, ACL_NEXT_ENTRY, entry );
85 entry =
new acl_entry_t;
86 ret = acl_get_entry( acl2, ACL_FIRST_ENTRY, entry );
88 entries2.append( entry );
89 entry =
new acl_entry_t;
90 ret = acl_get_entry( acl2, ACL_NEXT_ENTRY, entry );
95 if ( entries1.count() != entries2.count() )
103 acl_permset_t permset1, permset2;
104 acl_tag_t tag1, tag2;
106 acl_entry_t *e1, *e2;
108 for ( e1 = entries1.first(), e2 = entries2.first(); e1; e1 = entries1.next(), e2 = entries2.next() ) {
110 if ( acl_get_tag_type( *e1, &tag1 ) != 0 )
return 1;
111 if ( acl_get_tag_type( *e2, &tag2 ) != 0 )
return 1;
112 if ( tag1 != tag2 )
return 1;
115 if ( acl_get_permset( *e1, &permset1 ) != 0 )
return 1;
116 if ( acl_get_permset( *e2, &permset2 ) != 0 )
return 1;
117 if ( *permset1 != *permset2)
return 1;
123 uid1 = *( (uid_t*) acl_get_qualifier( *e1 ) );
124 uid2 = *( (uid_t*) acl_get_qualifier( *e2 ) );
125 if ( uid1 != uid2 )
return 1;
132 TDE_EXPORT acl_t acl_from_mode(mode_t mode)
134 acl_t newACL = acl_init( 3 );
136 acl_permset_t permset;
140 if ( ( error = acl_create_entry( &newACL, &entry ) ) == 0 ) {
142 acl_set_tag_type( entry, ACL_USER_OBJ );
143 acl_get_permset( entry, &permset );
144 acl_clear_perms( permset );
145 if ( mode & S_IRUSR ) acl_add_perm( permset, ACL_READ );
146 if ( mode & S_IWUSR ) acl_add_perm( permset, ACL_WRITE );
147 if ( mode & S_IXUSR ) acl_add_perm( permset, ACL_EXECUTE );
148 acl_set_permset( entry, permset );
151 if ( ( error = acl_create_entry( &newACL, &entry ) ) == 0 ) {
153 acl_set_tag_type( entry, ACL_GROUP_OBJ );
154 acl_get_permset( entry, &permset );
155 acl_clear_perms( permset );
156 if ( mode & S_IRGRP ) acl_add_perm( permset, ACL_READ );
157 if ( mode & S_IWGRP ) acl_add_perm( permset, ACL_WRITE );
158 if ( mode & S_IXGRP ) acl_add_perm( permset, ACL_EXECUTE );
159 acl_set_permset( entry, permset );
162 if ( ( error = acl_create_entry( &newACL, &entry ) ) == 0) {
164 acl_set_tag_type( entry, ACL_OTHER );
165 acl_get_permset( entry, &permset );
166 acl_clear_perms( permset );
167 if ( mode & S_IROTH ) acl_add_perm( permset, ACL_READ );
168 if ( mode & S_IWOTH ) acl_add_perm( permset, ACL_WRITE );
169 if ( mode & S_IXOTH ) acl_add_perm( permset, ACL_EXECUTE );
170 acl_set_permset( entry, permset );
176 acl_free ( &newACL );
183 TDE_EXPORT
int acl_equiv_mode(acl_t acl, mode_t *mode_p)
187 acl_permset_t permset;
194 int ret = acl_get_entry( acl, ACL_FIRST_ENTRY, &entry );
196 acl_get_tag_type( entry, &tag );
197 acl_get_permset( entry, &permset );
201 if ( acl_get_perm( permset, ACL_READ ) ) mode |= S_IRUSR;
202 if ( acl_get_perm( permset, ACL_WRITE ) ) mode |= S_IWUSR;
203 if ( acl_get_perm( permset, ACL_EXECUTE ) ) mode |= S_IXUSR;
207 if ( acl_get_perm( permset, ACL_READ ) ) mode |= S_IRGRP;
208 if ( acl_get_perm( permset, ACL_WRITE ) ) mode |= S_IWGRP;
209 if ( acl_get_perm( permset, ACL_EXECUTE ) ) mode |= S_IXGRP;
213 if ( acl_get_perm( permset, ACL_READ ) ) mode |= S_IROTH;
214 if ( acl_get_perm( permset, ACL_WRITE ) ) mode |= S_IWOTH;
215 if ( acl_get_perm( permset, ACL_EXECUTE ) ) mode |= S_IXOTH;
229 ret = acl_get_entry( acl, ACL_NEXT_ENTRY, &entry );