}
int
-__vfs_dup_fd(struct v_fd* old, struct v_fd** new)
+vfs_dup_fd(struct v_fd* old, struct v_fd** new)
{
int errno = 0;
struct v_fd* copied = cake_grab(fd_pile);
memcpy(copied, old, sizeof(struct v_fd));
old->file->ref_count++;
+ *new = copied;
+
return errno;
}
-__DEFINE_LXSYSCALL2(int, dup2, int, oldfd, int, newfd)
+int
+vfs_dup2(int oldfd, int newfd)
{
if (newfd == oldfd) {
return newfd;
int errno;
struct v_fd *oldfd_s, *newfd_s;
- if (!GET_FD(oldfd, oldfd_s) || TEST_FD(newfd)) {
+ if (!GET_FD(oldfd, oldfd_s) || !TEST_FD(newfd)) {
errno = EBADF;
goto done;
}
goto done;
}
- if (!(errno = __vfs_dup_fd(oldfd_s, &newfd_s))) {
+ if (!(errno = vfs_dup_fd(oldfd_s, &newfd_s))) {
__current->fdtable->fds[newfd] = newfd_s;
return newfd;
}
return DO_STATUS(errno);
}
+__DEFINE_LXSYSCALL2(int, dup2, int, oldfd, int, newfd)
+{
+ return vfs_dup2(oldfd, newfd);
+}
+
__DEFINE_LXSYSCALL1(int, dup, int, oldfd)
{
int errno, newfd;
if (!GET_FD(oldfd, oldfd_s)) {
errno = EBADF;
} else if (!(errno = vfs_alloc_fdslot(&newfd)) &&
- !(errno = __vfs_dup_fd(oldfd_s, &newfd_s))) {
+ !(errno = vfs_dup_fd(oldfd_s, &newfd_s))) {
__current->fdtable->fds[newfd] = newfd_s;
return newfd;
}