Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 May 2009 06:55:15 +0000 (UTC)
From:      Xin LI <delphij@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r193019 - in stable/7/lib/libc: . gen string
Message-ID:  <200905290655.n4T6tFmH062675@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: delphij
Date: Fri May 29 06:55:15 2009
New Revision: 193019
URL: http://svn.freebsd.org/changeset/base/193019

Log:
  MFC r178253 and r178256:
  
  Implement fdopendir(3) by splitting __opendir2() into two parts, the upper
  part deals with the usual __opendir2() calls, and the rest part with an
  interface translator to expose fdopendir(3) functionality.  Manual page was
  obtained from kib@'s work for *at(2) system calls.

Modified:
  stable/7/lib/libc/   (props changed)
  stable/7/lib/libc/gen/Makefile.inc
  stable/7/lib/libc/gen/Symbol.map
  stable/7/lib/libc/gen/directory.3
  stable/7/lib/libc/gen/opendir.c
  stable/7/lib/libc/string/ffsll.c   (props changed)
  stable/7/lib/libc/string/flsll.c   (props changed)

Modified: stable/7/lib/libc/gen/Makefile.inc
==============================================================================
--- stable/7/lib/libc/gen/Makefile.inc	Fri May 29 06:41:23 2009	(r193018)
+++ stable/7/lib/libc/gen/Makefile.inc	Fri May 29 06:55:15 2009	(r193019)
@@ -71,6 +71,7 @@ MLINKS+=arc4random.3 arc4random_addrando
 MLINKS+=ctermid.3 ctermid_r.3
 MLINKS+=devname.3 devname_r.3
 MLINKS+=directory.3 closedir.3 directory.3 dirfd.3 directory.3 opendir.3 \
+	directory.3 fdopendir.3 \
 	directory.3 readdir.3 directory.3 readdir_r.3 directory.3 rewinddir.3 \
 	directory.3 seekdir.3 directory.3 telldir.3
 MLINKS+=dlopen.3 dlclose.3 dlopen.3 dlerror.3 dlopen.3 dlfunc.3 \

Modified: stable/7/lib/libc/gen/Symbol.map
==============================================================================
--- stable/7/lib/libc/gen/Symbol.map	Fri May 29 06:41:23 2009	(r193018)
+++ stable/7/lib/libc/gen/Symbol.map	Fri May 29 06:55:15 2009	(r193019)
@@ -336,6 +336,10 @@ FBSD_1.0 {
 	wordfree;
 };
 
+FBSD_1.1 {
+	fdopendir;
+};
+
 FBSDprivate_1.0 {
 	/* needed by thread libraries */
 	__thr_jtable;

Modified: stable/7/lib/libc/gen/directory.3
==============================================================================
--- stable/7/lib/libc/gen/directory.3	Fri May 29 06:41:23 2009	(r193018)
+++ stable/7/lib/libc/gen/directory.3	Fri May 29 06:55:15 2009	(r193019)
@@ -28,11 +28,12 @@
 .\"     @(#)directory.3	8.1 (Berkeley) 6/4/93
 .\" $FreeBSD$
 .\"
-.Dd June 4, 1993
+.Dd April 16, 2008
 .Dt DIRECTORY 3
 .Os
 .Sh NAME
 .Nm opendir ,
+.Nm fdopendir ,
 .Nm readdir ,
 .Nm readdir_r ,
 .Nm telldir ,
@@ -48,6 +49,8 @@
 .In dirent.h
 .Ft DIR *
 .Fn opendir "const char *filename"
+.Ft DIR *
+.Fn fdopendir "int fd"
 .Ft struct dirent *
 .Fn readdir "DIR *dirp"
 .Ft int
@@ -84,6 +87,36 @@ cannot be accessed, or if it cannot
 enough memory to hold the whole thing.
 .Pp
 The
+.Fn fdopendir
+function is equivalent to the
+.Fn opendir
+function except that the directory is specified by a file descriptor
+.Fa fd
+rather than by a name.
+The file offset associated with the file descriptor at the time of the call
+determines which entries are returned.
+.Pp
+Upon successful return from
+.Fn fdopendir ,
+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
+.Fn closedir ,
+.Fn readdir ,
+.Fn readdir_r ,
+or
+.Fn rewinddir ,
+the behavior is undefined.
+Upon calling
+.Fn closedir
+the file descriptor is closed.
+The
+.Dv FD_CLOEXEC
+flag is set on the file descriptor by a successful call to
+.Fn fdopendir .
+.Pp
+The
 .Fn readdir
 function
 returns a pointer to the next directory entry.
@@ -202,3 +235,7 @@ and
 .Fn dirfd
 functions appeared in
 .Bx 4.2 .
+The
+.Fn fdopendir
+function appeared in
+.Fx 8.0 .

Modified: stable/7/lib/libc/gen/opendir.c
==============================================================================
--- stable/7/lib/libc/gen/opendir.c	Fri May 29 06:41:23 2009	(r193018)
+++ stable/7/lib/libc/gen/opendir.c	Fri May 29 06:55:15 2009	(r193019)
@@ -1,4 +1,4 @@
-/*
+/*-
  * Copyright (c) 1983, 1993
  *	The Regents of the University of California.  All rights reserved.
  *
@@ -47,32 +47,38 @@ __FBSDID("$FreeBSD$");
 #include "un-namespace.h"
 
 #include "telldir.h"
+
+static DIR * __opendir_common(int, const char *, int);
+
 /*
  * Open a directory.
  */
 DIR *
-opendir(name)
-	const char *name;
+opendir(const char *name)
 {
 
 	return (__opendir2(name, DTF_HIDEW|DTF_NODUP));
 }
 
+/*
+ * Open a directory with existing file descriptor.
+ */
 DIR *
-__opendir2(name, flags)
-	const char *name;
-	int flags;
+fdopendir(int fd)
+{
+
+	return (__opendir_common(fd, NULL, DTF_HIDEW|DTF_NODUP));
+}
+
+DIR *
+__opendir2(const char *name, int flags)
 {
-	DIR *dirp;
 	int fd;
-	int incr;
-	int saved_errno;
-	int unionstack;
 	struct stat statb;
 
 	/*
 	 * stat() before _open() because opening of special files may be
-	 * harmful.  _fstat() after open because the file may have changed.
+	 * harmful.
 	 */
 	if (stat(name, &statb) != 0)
 		return (NULL);
@@ -82,7 +88,24 @@ __opendir2(name, flags)
 	}
 	if ((fd = _open(name, O_RDONLY | O_NONBLOCK)) == -1)
 		return (NULL);
+
+	return __opendir_common(fd, name, flags);
+}
+
+/*
+ * Common routine for opendir(3), __opendir2(3) and fdopendir(3).
+ */
+static DIR *
+__opendir_common(int fd, const char *name, int flags)
+{
+	DIR *dirp;
+	int incr;
+	int saved_errno;
+	int unionstack;
+	struct stat statb;
+
 	dirp = NULL;
+	/* _fstat() the open handler because the file may have changed.  */
 	if (_fstat(fd, &statb) != 0)
 		goto fail;
 	if (!S_ISDIR(statb.st_mode)) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905290655.n4T6tFmH062675>