• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdeio/tdeio
 

tdeio/tdeio

  • tdeio
  • tdeio
posixacladdons.cpp
1/***************************************************************************
2 * Copyright (C) 2005 by Markus Brueffer <markus@brueffer.de> *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU Library General Public License as *
6 * published by the Free Software Foundation; either version 2 of the *
7 * License, or (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
18 ***************************************************************************/
19
20#include "posixacladdons.h"
21
22#if defined(USE_POSIX_ACL) && !defined(HAVE_NON_POSIX_ACL_EXTENSIONS)
23
24#include <kdemacros.h>
25
26#include <errno.h>
27#include <sys/stat.h>
28
29#include <tqptrlist.h>
30
31class SortedEntryList : public TQPtrList<acl_entry_t>
32{
33protected:
34 int compareItems( TQPtrCollection::Item i1,
35 TQPtrCollection::Item i2 )
36 {
37 acl_entry_t *e1 = static_cast<acl_entry_t*>( i1 );
38 acl_entry_t *e2 = static_cast<acl_entry_t*>( i2 );
39
40 acl_tag_t tag1, tag2;
41 uid_t uid1 = 0, uid2 = 0;
42
43 acl_get_tag_type( *e1, &tag1 );
44 acl_get_tag_type( *e2, &tag2 );
45
46 if ( tag1 == ACL_USER || tag1 == ACL_GROUP )
47 uid1 = *( (uid_t*) acl_get_qualifier( *e1 ) );
48
49 if ( tag2 == ACL_USER || tag2 == ACL_GROUP )
50 uid2 = *( (uid_t*) acl_get_qualifier( *e2 ) );
51
52 if ( tag1 < tag2 )
53 return -1;
54 else if ( tag1 > tag2 )
55 return 1;
56
57 if ( uid1 < uid2 )
58 return -1;
59 else if ( uid1 > uid2 )
60 return 1;
61
62 return 0;
63 }
64};
65
66KDE_EXPORT int acl_cmp(acl_t acl1, acl_t acl2)
67{
68 if ( !acl1 || !acl2 )
69 return -1;
70
71 SortedEntryList entries1, entries2;
72 entries1.setAutoDelete( true );
73 entries2.setAutoDelete( true );
74
75 /* Add ACL entries to vectors */
76 acl_entry_t *entry = new acl_entry_t;
77 int ret = acl_get_entry( acl1, ACL_FIRST_ENTRY, entry );
78 while( ret == 1 ) {
79 entries1.append( entry );
80 entry = new acl_entry_t;
81 ret = acl_get_entry( acl1, ACL_NEXT_ENTRY, entry );
82 }
83 delete entry;
84
85 entry = new acl_entry_t;
86 ret = acl_get_entry( acl2, ACL_FIRST_ENTRY, entry );
87 while ( ret == 1 ) {
88 entries2.append( entry );
89 entry = new acl_entry_t;
90 ret = acl_get_entry( acl2, ACL_NEXT_ENTRY, entry );
91 }
92 delete entry;
93
94 /* If the entry count differs, we are done */
95 if ( entries1.count() != entries2.count() )
96 return 1;
97
98 /* Sort vectors */
99 entries1.sort();
100 entries2.sort();
101
102 /* Compare all entries */
103 acl_permset_t permset1, permset2;
104 acl_tag_t tag1, tag2;
105 uid_t uid1, uid2;
106 acl_entry_t *e1, *e2;
107
108 for ( e1 = entries1.first(), e2 = entries2.first(); e1; e1 = entries1.next(), e2 = entries2.next() ) {
109 /* Compare tag */
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;
113
114 /* Compare permissions */
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;
118
119 /* Compare uid */
120 switch( tag1 ) {
121 case ACL_USER:
122 case ACL_GROUP:
123 uid1 = *( (uid_t*) acl_get_qualifier( *e1 ) );
124 uid2 = *( (uid_t*) acl_get_qualifier( *e2 ) );
125 if ( uid1 != uid2 ) return 1;
126 }
127 }
128
129 return 0;
130}
131
132KDE_EXPORT acl_t acl_from_mode(mode_t mode)
133{
134 acl_t newACL = acl_init( 3 );
135 acl_entry_t entry;
136 acl_permset_t permset;
137 int error = 0;
138
139 /* Add owner entry */
140 if ( ( error = acl_create_entry( &newACL, &entry ) ) == 0 ) {
141 /* Set owner permissions */
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 );
149
150 /* Add group entry */
151 if ( ( error = acl_create_entry( &newACL, &entry ) ) == 0 ) {
152 /* Set group permissions */
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 );
160
161 /* Add other entry */
162 if ( ( error = acl_create_entry( &newACL, &entry ) ) == 0) {
163 /* Set other permissions */
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 );
171 }
172 }
173 }
174
175 if ( error ) {
176 acl_free ( &newACL );
177 return NULL;
178 }
179
180 return newACL;
181}
182
183KDE_EXPORT int acl_equiv_mode(acl_t acl, mode_t *mode_p)
184{
185 acl_entry_t entry;
186 acl_tag_t tag;
187 acl_permset_t permset;
188 mode_t mode = 0;
189 int notEquiv = 0;
190
191 if ( !acl )
192 return -1;
193
194 int ret = acl_get_entry( acl, ACL_FIRST_ENTRY, &entry );
195 while ( ret == 1 ) {
196 acl_get_tag_type( entry, &tag );
197 acl_get_permset( entry, &permset );
198
199 switch( tag ) {
200 case ACL_USER_OBJ:
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;
204 break;
205
206 case ACL_GROUP_OBJ:
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;
210 break;
211
212 case ACL_OTHER:
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;
216 break;
217
218 case ACL_USER:
219 case ACL_GROUP:
220 case ACL_MASK:
221 notEquiv = 1;
222 break;
223
224 default:
225 errno = EINVAL;
226 return -1;
227 }
228
229 ret = acl_get_entry( acl, ACL_NEXT_ENTRY, &entry );
230 }
231
232 if (mode_p)
233 *mode_p = mode;
234
235 return notEquiv;
236}
237
238#endif // USE_POSIX_ACL

tdeio/tdeio

Skip menu "tdeio/tdeio"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

tdeio/tdeio

Skip menu "tdeio/tdeio"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeio/tdeio by doxygen 1.9.4
This website is maintained by Timothy Pearson.