• 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 
31 class SortedEntryList : public TQPtrList<acl_entry_t>
32 {
33 protected:
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 
66 KDE_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 
132 KDE_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 
183 KDE_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
  •     tdecore
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  • tdeioslave
  •   http
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeio/tdeio by doxygen 1.8.8
This website is maintained by Timothy Pearson.