1.\" Copyright (c) 1983, 1991, 1993 2.\" The Regents of the University of California. All rights reserved. 3.\" 4.\" Redistribution and use in source and binary forms, with or without 5.\" modification, are permitted provided that the following conditions 6.\" are met: 7.\" 1. Redistributions of source code must retain the above copyright 8.\" notice, this list of conditions and the following disclaimer. 9.\" 2. Redistributions in binary form must reproduce the above copyright 10.\" notice, this list of conditions and the following disclaimer in the 11.\" documentation and/or other materials provided with the distribution. 12.\" 3. Neither the name of the University nor the names of its contributors 13.\" may be used to endorse or promote products derived from this software 14.\" without specific prior written permission. 15.\" 16.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 17.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 20.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26.\" SUCH DAMAGE. 27.\" 28.\" @(#)directory.3 8.1 (Berkeley) 6/4/93 29.\" $FreeBSD$ 30.\" 31.Dd April 30, 2019 32.Dt DIRECTORY 3 33.Os 34.Sh NAME 35.Nm opendir , 36.Nm fdopendir , 37.Nm readdir , 38.Nm readdir_r , 39.Nm telldir , 40.Nm seekdir , 41.Nm rewinddir , 42.Nm closedir , 43.Nm fdclosedir , 44.Nm dirfd 45.Nd directory operations 46.Sh LIBRARY 47.Lb libc 48.Sh SYNOPSIS 49.In dirent.h 50.Ft DIR * 51.Fn opendir "const char *filename" 52.Ft DIR * 53.Fn fdopendir "int fd" 54.Ft struct dirent * 55.Fn readdir "DIR *dirp" 56.Ft int 57.Fn readdir_r "DIR *dirp" "struct dirent *entry" "struct dirent **result" 58.Ft long 59.Fn telldir "DIR *dirp" 60.Ft void 61.Fn seekdir "DIR *dirp" "long loc" 62.Ft void 63.Fn rewinddir "DIR *dirp" 64.Ft int 65.Fn closedir "DIR *dirp" 66.Ft int 67.Fn fdclosedir "DIR *dirp" 68.Ft int 69.Fn dirfd "DIR *dirp" 70.Sh DESCRIPTION 71.Bf -symbolic 72The 73.Fn readdir_r 74interface is deprecated 75because it cannot be used correctly unless 76.Brq Va NAME_MAX 77is a fixed value. 78.Ef 79.Pp 80The 81.Fn opendir 82function 83opens the directory named by 84.Fa filename , 85associates a 86.Em directory stream 87with it 88and 89returns a pointer to be used to identify the 90.Em directory stream 91in subsequent operations. 92The pointer 93.Dv NULL 94is returned if 95.Fa filename 96cannot be accessed, or if it cannot 97.Xr malloc 3 98enough memory to hold the whole thing. 99.Pp 100The 101.Fn fdopendir 102function is equivalent to the 103.Fn opendir 104function except that the directory is specified by a file descriptor 105.Fa fd 106rather than by a name. 107The file offset associated with the file descriptor at the time of the call 108determines which entries are returned. 109.Pp 110Upon successful return from 111.Fn fdopendir , 112the file descriptor is under the control of the system, 113and if any attempt is made to close the file descriptor, 114or to modify the state of the associated description other than by means 115of 116.Fn closedir , 117.Fn readdir , 118.Fn readdir_r , 119or 120.Fn rewinddir , 121the behavior is undefined. 122Upon calling 123.Fn closedir 124the file descriptor is closed. 125The 126.Dv FD_CLOEXEC 127flag is set on the file descriptor by a successful call to 128.Fn fdopendir . 129.Pp 130The 131.Fn readdir 132function 133returns a pointer to the next directory entry. 134The directory entry remains valid until the next call to 135.Fn readdir 136or 137.Fn closedir 138on the same 139.Em directory stream . 140The function returns 141.Dv NULL 142upon reaching the end of the directory or on error. 143In the event of an error, 144.Va errno 145may be set to any of the values documented for the 146.Xr getdirentries 2 147system call. 148.Pp 149The 150.Fn readdir_r 151function 152provides the same functionality as 153.Fn readdir , 154but the caller must provide a directory 155.Fa entry 156buffer to store the results in. 157The buffer must be large enough for a 158.Vt struct dirent 159with a 160.Va d_name 161array with 162.Brq Va NAME_MAX 163+ 1 elements. 164If the read succeeds, 165.Fa result 166is pointed at the 167.Fa entry ; 168upon reaching the end of the directory 169.Fa result 170is set to 171.Dv NULL . 172The 173.Fn readdir_r 174function 175returns 0 on success or an error number to indicate failure. 176.Pp 177The 178.Fn telldir 179function 180returns a token representing the current location associated with the named 181.Em directory stream . 182Values returned by 183.Fn telldir 184are good only for the lifetime of the 185.Dv DIR 186pointer, 187.Fa dirp , 188from which they are derived. 189If the directory is closed and then 190reopened, prior values returned by 191.Fn telldir 192will no longer be valid. 193Values returned by 194.Fn telldir 195are also invalidated by a call to 196.Fn rewinddir . 197.Pp 198The 199.Fn seekdir 200function 201sets the position of the next 202.Fn readdir 203operation on the 204.Em directory stream . 205The new position reverts to the one associated with the 206.Em directory stream 207when the 208.Fn telldir 209operation was performed. 210.Pp 211The 212.Fn rewinddir 213function 214resets the position of the named 215.Em directory stream 216to the beginning of the directory. 217.Pp 218The 219.Fn closedir 220function 221closes the named 222.Em directory stream 223and frees the structure associated with the 224.Fa dirp 225pointer, 226returning 0 on success. 227On failure, \-1 is returned and the global variable 228.Va errno 229is set to indicate the error. 230.Pp 231The 232.Fn fdclosedir 233function is equivalent to the 234.Fn closedir 235function except that this function returns directory file descriptor instead of 236closing it. 237.Pp 238The 239.Fn dirfd 240function 241returns the integer file descriptor associated with the named 242.Em directory stream , 243see 244.Xr open 2 . 245.Pp 246Sample code which searches a directory for entry ``name'' is: 247.Bd -literal -offset indent 248dirp = opendir("."); 249if (dirp == NULL) 250 return (ERROR); 251len = strlen(name); 252while ((dp = readdir(dirp)) != NULL) { 253 if (dp->d_namlen == len && strcmp(dp->d_name, name) == 0) { 254 (void)closedir(dirp); 255 return (FOUND); 256 } 257} 258(void)closedir(dirp); 259return (NOT_FOUND); 260.Ed 261.Sh SEE ALSO 262.Xr close 2 , 263.Xr lseek 2 , 264.Xr open 2 , 265.Xr read 2 , 266.Xr dir 5 267.Sh STANDARDS 268The 269.Fn closedir , 270.Fn dirfd , 271.Fn fdopendir , 272.Fn opendir , 273.Fn readdir , 274.Fn readdir_r , 275.Fn rewinddir , 276.Fn seekdir 277and 278.Fn telldir 279functions are expected to conform to 280.St -p1003.1-2008 . 281The 282.Fn fdclosedir 283function and the 284.Fa d_off , 285.Fa d_reclen 286and 287.Fa d_type 288fields of 289.Vt struct dirent 290are non-standard, and should not be used in portable programs. 291.Sh HISTORY 292The 293.Fn opendir , 294.Fn readdir , 295.Fn telldir , 296.Fn seekdir , 297.Fn rewinddir , 298.Fn closedir , 299and 300.Fn dirfd 301functions appeared in 302.Bx 4.2 . 303The 304.Fn fdopendir 305function appeared in 306.Fx 8.0 . 307.Fn fdclosedir 308function appeared in 309.Fx 10.0 . 310.Sh BUGS 311The behaviour of 312.Fn telldir 313and 314.Fn seekdir 315is likely to be wrong if there are parallel unlinks happening 316and the directory is larger than one page. 317There is code to ensure that a 318.Fn seekdir 319to the location given by a 320.Fn telldir 321immediately before the last 322.Fn readdir 323will always set the correct location to return the same value as that last 324.Fn readdir 325performed. 326This is enough for some applications which want to 327"push back the last entry read", e.g., Samba. 328Seeks back to any other location, 329other than the beginning of the directory, 330may result in unexpected behaviour if deletes are present. 331It is hoped that this situation will be resolved with changes to 332.Fn getdirentries 333and the VFS. 334