summaryrefslogtreecommitdiff
path: root/src/unistd/dup2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/unistd/dup2.c')
-rw-r--r--src/unistd/dup2.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/unistd/dup2.c b/src/unistd/dup2.c
new file mode 100644
index 00000000..2755fbc7
--- /dev/null
+++ b/src/unistd/dup2.c
@@ -0,0 +1,29 @@
+#include "stddef.h"
+#include "sys/types.h"
+#include <unistd.h>
+#include "fcntl.h"
+#include "limits.h"
+#include "errno.h"
+
+int dup2(int fildes, int fildes2)
+{
+ if (fildes2 < 0 || fildes2 >= _POSIX_OPEN_MAX) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (fildes == fildes2) {
+ return fildes2;
+ }
+
+ if (fcntl(fildes, F_GETFD) == -1) {
+ errno = EBADF;
+ return -1;
+ }
+
+ close(fildes2);
+ return fcntl(fildes, F_DUPFD, fildes2);
+}
+/*
+POSIX(1)
+*/