Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F136979293
D11690.id31066.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D11690.id31066.diff
View Options
Index: lib/libutil/Makefile
===================================================================
--- lib/libutil/Makefile
+++ lib/libutil/Makefile
@@ -35,6 +35,7 @@
property.3 pty.3 quotafile.3 realhostname.3 realhostname_sa.3 \
_secure_path.3 trimdomain.3 uucplock.3 pw_util.3
MAN+= login.conf.5
+MLINKS+=flopen.3 flopenat.3
MLINKS+=kld.3 kld_isloaded.3 kld.3 kld_load.3
MLINKS+=login_auth.3 auth_cat.3 login_auth.3 auth_checknologin.3
MLINKS+=login_cap.3 login_close.3 login_cap.3 login_getcapbool.3 \
Index: lib/libutil/flopen.3
===================================================================
--- lib/libutil/flopen.3
+++ lib/libutil/flopen.3
@@ -25,11 +25,11 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 6, 2009
+.Dd July 21, 2017
.Dt FLOPEN 3
.Os
.Sh NAME
-.Nm flopen
+.Nm flopen , flopenat
.Nd "Reliably open and lock a file"
.Sh LIBRARY
.Lb libutil
@@ -40,6 +40,10 @@
.Fn flopen "const char *path" "int flags"
.Ft int
.Fn flopen "const char *path" "int flags" "mode_t mode"
+.Ft int
+.Fn flopenat "int fd" "const char *path" "int flags"
+.Ft int
+.Fn flopenat "int fd" "const char *path" "int flags" "mode_t mode"
.Sh DESCRIPTION
The
.Fn flopen
@@ -79,6 +83,18 @@
.Va flags
includes
.Dv O_CREAT .
+.Pp
+The
+.Fn flopenat
+function is equivalent to the
+.Fn flopen
+function except in the case where the
+.Fa path
+specifies a relative path.
+In this case the file to be opened is determined relative to the directory
+associated with the file descriptor
+.Fa fd
+instead of the current working directory.
.Sh RETURN VALUES
If successful,
.Fn flopen
Index: lib/libutil/flopen.c
===================================================================
--- lib/libutil/flopen.c
+++ lib/libutil/flopen.c
@@ -45,25 +45,11 @@
* code's apparent simplicity; there would be no need for this function if it
* was easy to get right.
*/
-int
-flopen(const char *path, int flags, ...)
+static int
+flopenatm(int dirfd, const char *path, int flags, mode_t mode)
{
int fd, operation, serrno, trunc;
struct stat sb, fsb;
- mode_t mode;
-
-#ifdef O_EXLOCK
- flags &= ~O_EXLOCK;
-#endif
-
- mode = 0;
- if (flags & O_CREAT) {
- va_list ap;
-
- va_start(ap, flags);
- mode = (mode_t)va_arg(ap, int); /* mode_t promoted to int */
- va_end(ap);
- }
operation = LOCK_EX;
if (flags & O_NONBLOCK)
@@ -73,7 +59,7 @@
flags &= ~O_TRUNC;
for (;;) {
- if ((fd = open(path, flags, mode)) == -1)
+ if ((fd = openat(dirfd, path, flags, mode)) == -1)
/* non-existent or no access */
return (-1);
if (flock(fd, operation) == -1) {
@@ -83,7 +69,7 @@
errno = serrno;
return (-1);
}
- if (stat(path, &sb) == -1) {
+ if (fstatat(dirfd, path, &sb, 0) == -1) {
/* disappeared from under our feet */
(void)close(fd);
continue;
@@ -123,3 +109,45 @@
return (fd);
}
}
+
+int
+flopen(const char *path, int flags, ...)
+{
+ mode_t mode;
+
+#ifdef O_EXLOCK
+ flags &= ~O_EXLOCK;
+#endif
+
+ mode = 0;
+ if (flags & O_CREAT) {
+ va_list ap;
+
+ va_start(ap, flags);
+ mode = (mode_t)va_arg(ap, int); /* mode_t promoted to int */
+ va_end(ap);
+ }
+
+ return (flopenatm(AT_FDCWD, path, flags, mode));
+}
+
+int
+flopenat(int dirfd, const char *path, int flags, ...)
+{
+ mode_t mode;
+
+#ifdef O_EXLOCK
+ flags &= ~O_EXLOCK;
+#endif
+
+ mode = 0;
+ if (flags & O_CREAT) {
+ va_list ap;
+
+ va_start(ap, flags);
+ mode = (mode_t)va_arg(ap, int); /* mode_t promoted to int */
+ va_end(ap);
+ }
+
+ return (flopenatm(dirfd, path, flags, mode));
+}
Index: lib/libutil/libutil.h
===================================================================
--- lib/libutil/libutil.h
+++ lib/libutil/libutil.h
@@ -93,6 +93,7 @@
int extattr_namespace_to_string(int _attrnamespace, char **_string);
int extattr_string_to_namespace(const char *_string, int *_attrnamespace);
int flopen(const char *_path, int _flags, ...);
+int flopenat(int dirfd, const char *path, int flags, ...);
int forkpty(int *_amaster, char *_name,
struct termios *_termp, struct winsize *_winp);
void hexdump(const void *_ptr, int _length, const char *_hdr, int _flags);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 21, 9:48 PM (20 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25801447
Default Alt Text
D11690.id31066.diff (4 KB)
Attached To
Mode
D11690: Introduce flopenat(3) function.
Attached
Detach File
Event Timeline
Log In to Comment