+2009-08-23 Bruno Haible <bruno@clisp.org>
+
+ * lib/dup3.c (dup3): Test only once whether the system actually exists.
+ * lib/pipe2.c (pipe2): Likewise.
+ Suggested by Eric Blake.
+
2009-08-23 Bruno Haible <bruno@clisp.org>
Tolerate declared but missing dup3 syscall.
/* Try the system call first, if it exists. (We may be running with a glibc
that has the function but with an older kernel that lacks it.) */
{
- int result = dup3 (oldfd, newfd, flags);
- if (!(result < 0 && errno == ENOSYS))
- return result;
+ /* Cache the information whether the system call really exists. */
+ static int have_dup3_really; /* 0 = unknown, 1 = yes, -1 = no */
+ if (have_dup3_really >= 0)
+ {
+ int result = dup3 (oldfd, newfd, flags);
+ if (!(result < 0 && errno == ENOSYS))
+ {
+ have_dup3_really = 1;
+ return result;
+ }
+ have_dup3_really = -1;
+ }
}
#endif
/* Try the system call first, if it exists. (We may be running with a glibc
that has the function but with an older kernel that lacks it.) */
{
- int result = pipe2 (fd, flags);
- if (!(result < 0 && errno == ENOSYS))
- return result;
+ /* Cache the information whether the system call really exists. */
+ static int have_pipe2_really; /* 0 = unknown, 1 = yes, -1 = no */
+ if (have_pipe2_really >= 0)
+ {
+ int result = pipe2 (fd, flags);
+ if (!(result < 0 && errno == ENOSYS))
+ {
+ have_pipe2_really = 1;
+ return result;
+ }
+ have_pipe2_really = -1;
+ }
}
#endif