summaryrefslogtreecommitdiffstats
path: root/man-pages-posix-2017/man3p/fdopendir.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man-pages-posix-2017/man3p/fdopendir.3p')
-rw-r--r--man-pages-posix-2017/man3p/fdopendir.3p316
1 files changed, 316 insertions, 0 deletions
diff --git a/man-pages-posix-2017/man3p/fdopendir.3p b/man-pages-posix-2017/man3p/fdopendir.3p
new file mode 100644
index 0000000..e8ecbad
--- /dev/null
+++ b/man-pages-posix-2017/man3p/fdopendir.3p
@@ -0,0 +1,316 @@
+'\" et
+.TH FDOPENDIR "3P" 2017 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\"
+.SH PROLOG
+This manual page is part of the POSIX Programmer's Manual.
+The Linux implementation of this interface may differ (consult
+the corresponding Linux manual page for details of Linux behavior),
+or the interface may not be implemented on Linux.
+.\"
+.SH NAME
+fdopendir, opendir
+\(em open directory associated with file descriptor
+.SH SYNOPSIS
+.LP
+.nf
+#include <dirent.h>
+.P
+DIR *fdopendir(int \fIfd\fP);
+DIR *opendir(const char *\fIdirname\fP);
+.fi
+.SH DESCRIPTION
+The
+\fIfdopendir\fR()
+function shall be equivalent to the
+\fIopendir\fR()
+function except that the directory is specified by a file descriptor
+rather than by a name. The file offset associated with the file
+descriptor at the time of the call determines which entries are
+returned.
+.P
+Upon successful return from
+\fIfdopendir\fR(),
+the file descriptor is under the control of the system, and if any
+attempt is made to close the file descriptor, or to modify the state of
+the associated description, other than by means of
+\fIclosedir\fR(),
+\fIreaddir\fR(),
+\fIreaddir_r\fR(),
+\fIrewinddir\fR(),
+or
+\fIseekdir\fR(),
+the behavior is undefined. Upon calling
+\fIclosedir\fR()
+the file descriptor shall be closed.
+.P
+It is unspecified whether the FD_CLOEXEC flag will be set on the file
+descriptor by a successful call to
+\fIfdopendir\fR().
+.P
+The
+\fIopendir\fR()
+function shall open a directory stream corresponding to the directory
+named by the
+.IR dirname
+argument. The directory stream is positioned at the first entry. If
+the type
+.BR DIR
+is implemented using a file descriptor, applications shall only be
+able to open up to a total of
+{OPEN_MAX}
+files and directories.
+.P
+If the type
+.BR DIR
+is implemented using a file descriptor, the descriptor shall be
+obtained as if the O_DIRECTORY flag was passed to
+\fIopen\fR().
+.SH "RETURN VALUE"
+Upon successful completion, these functions shall return
+a pointer to an object of type
+.BR DIR .
+Otherwise, these functions shall return a null pointer and set
+.IR errno
+to indicate the error.
+.SH ERRORS
+The
+\fIfdopendir\fR()
+function shall fail if:
+.TP
+.BR EBADF
+The
+.IR fd
+argument is not a valid file descriptor open for reading.
+.TP
+.BR ENOTDIR
+The descriptor
+.IR fd
+is not associated with a directory.
+.P
+The
+\fIopendir\fR()
+function shall fail if:
+.TP
+.BR EACCES
+Search permission is denied for the component of the path prefix of
+.IR dirname
+or read permission is denied for
+.IR dirname .
+.TP
+.BR ELOOP
+A loop exists in symbolic links encountered during resolution of the
+.IR dirname
+argument.
+.TP
+.BR ENAMETOOLONG
+.br
+The length of a component of a pathname is longer than
+{NAME_MAX}.
+.TP
+.BR ENOENT
+A component of
+.IR dirname
+does not name an existing directory or
+.IR dirname
+is an empty string.
+.TP
+.BR ENOTDIR
+A component of
+.IR dirname
+names an existing file that is neither a directory nor a symbolic link
+to a directory.
+.br
+.P
+The
+\fIopendir\fR()
+function may fail if:
+.TP
+.BR ELOOP
+More than
+{SYMLOOP_MAX}
+symbolic links were encountered during resolution of the
+.IR dirname
+argument.
+.TP
+.BR EMFILE
+All file descriptors available to the process are currently open.
+.TP
+.BR ENAMETOOLONG
+.br
+The length of a pathname exceeds
+{PATH_MAX},
+or pathname resolution of a symbolic link produced an intermediate
+result with a length that exceeds
+{PATH_MAX}.
+.TP
+.BR ENFILE
+Too many files are currently open in the system.
+.LP
+.IR "The following sections are informative."
+.SH EXAMPLES
+.SS "Open a Directory Stream"
+.P
+The following program fragment demonstrates how the
+\fIopendir\fR()
+function is used.
+.sp
+.RS 4
+.nf
+
+#include <dirent.h>
+\&...
+ DIR *dir;
+ struct dirent *dp;
+\&...
+ if ((dir = opendir (".")) == NULL) {
+ perror ("Cannot open .");
+ exit (1);
+ }
+.P
+ while ((dp = readdir (dir)) != NULL) {
+\&...
+.fi
+.P
+.RE
+.SS "Find And Open a File"
+.P
+The following program searches through a given directory looking
+for files whose name does not begin with a dot and whose size is
+larger than 1 MiB.
+.sp
+.RS 4
+.nf
+
+#include <stdio.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+.P
+int
+main(int argc, char *argv[])
+{
+ struct stat statbuf;
+ DIR *d;
+ struct dirent *dp;
+ int dfd, ffd;
+.P
+ if ((d = fdopendir((dfd = open("./tmp", O_RDONLY)))) == NULL) {
+ fprintf(stderr, "Cannot open ./tmp directory\en");
+ exit(1);
+ }
+ while ((dp = readdir(d)) != NULL) {
+ if (dp->d_name[0] == \(aq.\(aq)
+ continue;
+ /* there is a possible race condition here as the file
+ * could be renamed between the readdir and the open */
+ if ((ffd = openat(dfd, dp->d_name, O_RDONLY)) == -1) {
+ perror(dp->d_name);
+ continue;
+ }
+ if (fstat(ffd, &statbuf) == 0 && statbuf.st_size > (1024*1024)) {
+ /* found it ... */
+ printf("%s: %jdK\en", dp->d_name,
+ (intmax_t)(statbuf.st_size / 1024));
+ }
+ close(ffd);
+ }
+ closedir(d); // note this implicitly closes dfd
+ return 0;
+}
+.fi
+.P
+.RE
+.SH "APPLICATION USAGE"
+The
+\fIopendir\fR()
+function should be used in conjunction with
+\fIreaddir\fR(),
+\fIclosedir\fR(),
+and
+\fIrewinddir\fR()
+to examine the contents of the directory (see the EXAMPLES section in
+.IR "\fIreaddir\fR\^(\|)").
+This method is recommended for portability.
+.SH RATIONALE
+The purpose of the
+\fIfdopendir\fR()
+function is to enable opening files in directories other than the
+current working directory without exposure to race conditions. Any part
+of the path of a file could be changed in parallel to a call to
+\fIopendir\fR(),
+resulting in unspecified behavior.
+.P
+Based on historical implementations, the rules about file descriptors
+apply to directory streams as well. However, this volume of POSIX.1\(hy2017 does not
+mandate that the directory stream be implemented using file
+descriptors. The description of
+\fIclosedir\fR()
+clarifies that if a file descriptor is used for the directory stream,
+it is mandatory that
+\fIclosedir\fR()
+deallocate the file descriptor. When a file descriptor is used to
+implement the directory stream, it behaves as if the FD_CLOEXEC
+had been set for the file descriptor.
+.P
+The directory entries for dot
+and dot-dot
+are optional. This volume of POSIX.1\(hy2017 does not provide a way to test
+.IR "a priori"
+for their existence because an application that is portable must be
+written to look for (and usually ignore) those entries. Writing code
+that presumes that they are the first two entries does not always work,
+as many implementations permit them to be other than the first two
+entries, with a ``normal'' entry preceding them. There is negligible
+value in providing a way to determine what the implementation does
+because the code to deal with dot and dot-dot must be written in any
+case and because such a flag would add to the list of those flags
+(which has proven in itself to be objectionable) and might be abused.
+.P
+Since the structure and buffer allocation, if any, for directory
+operations are defined by the implementation, this volume of POSIX.1\(hy2017 imposes no
+portability requirements for erroneous program constructs, erroneous
+data, or the use of unspecified values such as the use or referencing
+of a
+.IR dirp
+value or a
+.BR dirent
+structure value after a directory stream has been closed or after a
+\fIfork\fR()
+or one of the
+.IR exec
+function calls.
+.SH "FUTURE DIRECTIONS"
+None.
+.SH "SEE ALSO"
+.IR "\fIclosedir\fR\^(\|)",
+.IR "\fIdirfd\fR\^(\|)",
+.IR "\fIfstatat\fR\^(\|)",
+.IR "\fIopen\fR\^(\|)",
+.IR "\fIreaddir\fR\^(\|)",
+.IR "\fIrewinddir\fR\^(\|)",
+.IR "\fIsymlink\fR\^(\|)"
+.P
+The Base Definitions volume of POSIX.1\(hy2017,
+.IR "\fB<dirent.h>\fP",
+.IR "\fB<sys_types.h>\fP"
+.\"
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1-2017, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 7, 2018 Edition,
+Copyright (C) 2018 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group.
+In the event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .
+.PP
+Any typographical or formatting errors that appear
+in this page are most likely
+to have been introduced during the conversion of the source files to
+man page format. To report such errors, see
+https://www.kernel.org/doc/man-pages/reporting_bugs.html .