From bb33c9f3cf70485e367c3dad22dcf6b14f7c6239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Fri, 9 Nov 2012 17:39:04 +0100 Subject: [PATCH] libports: add dup() to libc Fixes #492. --- libports/include/libc-plugin/plugin.h | 1 + libports/src/lib/libc/file_operations.cc | 14 ++++++++++++++ libports/src/lib/libc/plugin.cc | 1 + 3 files changed, 16 insertions(+) diff --git a/libports/include/libc-plugin/plugin.h b/libports/include/libc-plugin/plugin.h index 7663dc87c1..6d0d184851 100644 --- a/libports/include/libc-plugin/plugin.h +++ b/libports/include/libc-plugin/plugin.h @@ -76,6 +76,7 @@ namespace Libc { virtual int connect(File_descriptor *, const struct ::sockaddr *addr, socklen_t addrlen); + virtual File_descriptor *dup(File_descriptor*); virtual int dup2(File_descriptor *, File_descriptor *new_fd); virtual int execve(char const *filename, char *const argv[], char *const envp[]); diff --git a/libports/src/lib/libc/file_operations.cc b/libports/src/lib/libc/file_operations.cc index 5b66a0c5ab..8d4658cb3c 100644 --- a/libports/src/lib/libc/file_operations.cc +++ b/libports/src/lib/libc/file_operations.cc @@ -320,6 +320,20 @@ extern "C" int _connect(int libc_fd, const struct sockaddr *addr, } +extern "C" int _dup(int libc_fd) +{ + File_descriptor *fd = libc_fd_to_fd(libc_fd, "dup"); + File_descriptor *ret_fd = (fd && fd->plugin) ? fd->plugin->dup(fd) : 0; + return ret_fd ? ret_fd->libc_fd : INVALID_FD; +} + + +extern "C" int dup(int libc_fd) +{ + return _dup(libc_fd); +} + + extern "C" int _dup2(int libc_fd, int new_libc_fd) { File_descriptor *fd = libc_fd_to_fd(libc_fd, "dup2"); diff --git a/libports/src/lib/libc/plugin.cc b/libports/src/lib/libc/plugin.cc index 9642e5c6b8..d9efb9edfe 100644 --- a/libports/src/lib/libc/plugin.cc +++ b/libports/src/lib/libc/plugin.cc @@ -144,6 +144,7 @@ ret_type Plugin::name args \ /* * Functions returning a 'File_descriptor' */ +DUMMY(File_descriptor *, 0, dup, (File_descriptor *)); DUMMY(File_descriptor *, 0, open, (const char *, int)); DUMMY(File_descriptor *, 0, socket, (int, int, int)); DUMMY(File_descriptor *, 0, accept, (File_descriptor *, struct sockaddr *, socklen_t *));