1 .\" Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
3 .\" The contents of this file constitute Original Code as defined in and
4 .\" are subject to the Apple Public Source License Version 1.1 (the
5 .\" "License"). You may not use this file except in compliance with the
6 .\" License. Please obtain a copy of the License at
7 .\" http://www.apple.com/publicsource and read it before using this file.
9 .\" This Original Code and all software distributed under the License are
10 .\" distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
11 .\" EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
12 .\" INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
13 .\" FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
14 .\" License for the specific language governing rights and limitations
15 .\" under the License.
17 .\" @(#)getdirentriesattr.2
20 .Dt GETDIRENTRIESATTR 2
24 .Nd get file system attributes for multiple directory entries
26 .Fd #include <sys/attr.h>
27 .Fd #include <unistd.h>
31 .Fn getdirentriesattr "int fd" "struct attrlist * attrList" "void * attrBuf" "size_t attrBufSize" "unsigned int * count" "unsigned int * basep" "unsigned int * newState" "unsigned int options"
34 .Fn getdirentriesattr "int fd" "struct attrlist * attrList" "void * attrBuf" "size_t attrBufSize" "unsigned long * count" "unsigned long * basep" "unsigned long * newState" "unsigned long options"
41 function reads directory entries and returns their attributes (that is, metadata).
42 You can think of it as a combination of
47 iterates over the items in a directory like
49 and returns information about each directory entry like
53 returns information about a symbolic link, the information returned is about the link itself, not the target of the link.
55 The function reads directory entries from the directory referenced by the
58 Attributes of those directory entries are placed into the buffer specified by
64 parameter determines what attributes are returned for each entry.
67 parameter contains the number of directory entries requested and returned.
70 parameter returns the directory offset in a manner similar to
74 parameter allows you to check whether the directory has been modified while
78 parameter lets you control specific aspects of the function's behaviour.
83 function is only supported by certain volume format implementations.
84 For maximum compatibility, client programs should use high-level APIs
85 (such as the Carbon File Manager) to access file system attributes.
86 These high-level APIs include logic to emulate file system attributes
87 on volumes that don't support
88 .Fn getdirentriesattr .
95 parameter must be a file descriptor that references a directory that you have opened for reading.
98 .\" attrList parameter
102 parameter is a pointer to an
105 You are responsible for filling out all fields of this structure before calling the function.
106 See the discussion of the
108 function for a detailed description of this structure.
109 To get an attribute you must set the corresponding bit in the appropriate
114 You must not request volume attributes.
117 .\" attrBuf and attrBufSize parameters
123 parameters specify a buffer into which the function places attribute values.
124 The attributes for any given directory entry are grouped together and
125 packed in exactly the same way as they are returned from
127 These groups are then placed into the buffer, one after another.
128 As each group starts with a leading
131 overall length of the group, you can step from one group to the next
132 by simply adding this length to your pointer.
133 The sample code (below) shows how to do this.
134 The initial contents of this buffer are ignored.
141 parameter points to an
146 You should initialise this variable to be the number of directory entries for which
147 you wish to get attributes.
148 On return, this variable contains the number of directory entries whose attributes
149 have been placed into the attribute buffer.
150 This may be smaller than the number that you requested.
156 parameter returns the offset of the last directory entry read, in a
158 .Xr getdirentries 2 .
159 You can use this value to reset a directory iteration to a known position
162 However, since the variable is too small to hold an
166 to get the directory's current position instead of using this parameter.
167 The initial value of the variable is ignored.
170 .\" newState parameter
174 parameter returns a value that changes if the directory has been modified.
175 If you're iterating through the directory by making repeated calls to
176 .Fn getdirentriesattr ,
177 you can compare subsequent values of
179 to determine whether the directory has been modified (and thus restart
180 your iteration at the beginning).
181 The initial value of the variable is ignored.
184 .\" options parameter
188 parameter is a bit set that controls the behaviour of
189 .Fn getdirentriesattr .
190 The following option bits are defined.
192 .Bl -tag -width FSOPT_NOINMEMUPDATE
194 .It FSOPT_NOINMEMUPDATE
196 .Fn getdirentriesattr
197 to return the directory entries from disk rather than taking the extra step of looking
198 at data structures in-memory which may contain changes that haven't been flushed to disk.
200 This option allowed for specific performance optimizations for specific clients on older systems.
201 We currently recommend that clients not set this option and that file system
202 implementations ignore it.
206 It is typical to ask for a combination of common, file, and directory
207 attributes and then use the value of the
209 attribute to parse the resulting attribute buffer.
212 Upon successful completion a value of 0 or 1 is returned.
213 The value 0 indicates that the routine completed successfully.
214 The value 1 indicates that the routine completed successfully and has
215 returned the last entry in the directory.
216 On error, a value of -1 is returned and
218 is set to indicate the error.
221 Not all volumes support
222 .Fn getdirentriesattr .
223 You can test whether a volume supports
224 .Fn getdirentriesattr
227 to get the volume capabilities attribute
228 .Dv ATTR_VOL_CAPABILITIES ,
230 .Dv VOL_CAP_INT_READDIRATTR
235 .Fn getdirentriesattr
236 function has been undocumented for more than two years.
237 In that time a number of volume format implementations have been created without
238 a proper specification for the behaviour of this routine.
239 You may encounter volume format implementations with slightly different
240 behaviour than what is described here.
241 Your program is expected to be tolerant of this variant behaviour.
244 If you're implementing a volume format that supports
245 .Fn getdirentriesattr ,
246 you should be careful to support the behaviour specified by this document.
249 If the directory contains a mount point, then
250 .Dv DIR_MNTSTATUS_MNTPOINT
252 .Dv ATTR_DIR_MOUNTSTATUS
253 for that entry; all other attributes for that entry, however,
254 will be for the underlying file system (as opposed to the mounted
257 should be used to get the attributes for the mount point.
259 .Fn getdirentriesattr
264 The volume does not support
265 .Fn getdirentriesattr .
269 is not a valid file descriptor for a directory open for reading.
275 points to an invalid address.
283 .Dv ATTR_BIT_MAP_COUNT .
286 You requested an invalid attribute.
289 You requested volume attributes.
294 parameter contains an invalid flag.
297 An I/O error occurred while reading from or writing to the file system.
303 The following code lists the contents of a directory using
304 .Fn getdirentriesattr .
305 The listing includes the file type and creator for files.
312 #include <sys/attr.h>
313 #include <sys/errno.h>
315 #include <sys/vnode.h>
320 typedef struct attrlist attrlist_t;
323 struct FInfoAttrBuf {
325 attrreference_t name;
326 fsobj_type_t objType;
329 } __attribute__((aligned(4), packed));
330 typedef struct FInfoAttrBuf FInfoAttrBuf;
338 static int FInfoDemo(const char *dirPath)
347 unsigned int junkBaseP;
348 unsigned int oldState;
349 unsigned int newState;
353 unsigned long junkBaseP;
354 unsigned long oldState;
355 unsigned long newState;
359 FInfoAttrBuf * thisEntry;
360 char attrBuf[kEntriesPerCall * (sizeof(FInfoAttrBuf) + 64)];
363 // attrBuf is big enough for kEntriesPerCall entries, assuming that
364 // the average name length is less than 64.
367 memset(&attrList, 0, sizeof(attrList));
368 attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
369 attrList.commonattr = ATTR_CMN_NAME
372 attrList.dirattr = ATTR_DIR_MOUNTSTATUS;
376 dirFD = open(dirPath, O_RDONLY, 0);
381 oldStateValid = false;
384 count = kEntriesPerCall;
386 err = getdirentriesattr(
405 if (newState != oldState) {
406 printf("*** Directory has changed\en");
411 oldStateValid = true;
414 thisEntry = (FInfoAttrBuf *) attrBuf;
416 for (index = 0; index < count; index++) {
417 switch (thisEntry->objType) {
421 &thisEntry->finderInfo[0],
422 &thisEntry->finderInfo[4]
426 if (thisEntry->dirStatus & DIR_MNTSTATUS_MNTPOINT)
427 printf("mount-point ");
429 printf("directory ");
440 ((char *) &thisEntry->name)
441 + thisEntry->name.attr_dataoffset
444 // Advance to the next entry.
446 thisEntry = (FInfoAttrBuf*)((char*)thisEntry + thisEntry->length);
449 } while ( err == 0 && ! done );
465 .Xr getdirentries 2 ,
470 .Fn getdirentriesattr
471 function call appeared in Darwin 1.3.1 (Mac OS X version 10.0).