kernel/libroot: add dup3() from POSIX.1-2024

this adds a parameter to the dup2 syscall. Adjust strace.

Change-Id: Icc2d0e054365865d38e5d596843a47c95100ca59
Reviewed-on: https://review.haiku-os.org/c/haiku/+/8514
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
This commit is contained in:
Jérôme Duval 2024-10-30 15:38:41 +01:00 committed by waddlesplash
parent 11cd4af6e1
commit 966076b273
6 changed files with 23 additions and 9 deletions

View File

@ -344,6 +344,7 @@ extern int pipe(int fildes[2]);
extern int pipe2(int fildes[2], int flags);
extern int dup(int fd);
extern int dup2(int fd1, int fd2);
extern int dup3(int fd1, int fd2, int flags);
extern int close(int fd);
extern int link(const char *toPath, const char *path);
extern int linkat(int toFD, const char *toPath, int pathFD,

View File

@ -250,7 +250,7 @@ ssize_t _user_read_dir(int fd, struct dirent *buffer, size_t bufferSize,
status_t _user_rewind_dir(int fd);
status_t _user_close(int fd);
int _user_dup(int fd);
int _user_dup2(int ofd, int nfd);
int _user_dup2(int ofd, int nfd, int flags);
status_t _user_lock_node(int fd);
status_t _user_unlock_node(int fd);
status_t _user_preallocate(int fd, off_t offset, off_t length);

View File

@ -349,7 +349,7 @@ extern status_t _kern_write_stat(int fd, const char *path,
size_t statSize, int statMask);
extern status_t _kern_close(int fd);
extern int _kern_dup(int fd);
extern int _kern_dup2(int ofd, int nfd);
extern int _kern_dup2(int ofd, int nfd, int flags);
extern status_t _kern_lock_node(int fd);
extern status_t _kern_unlock_node(int fd);
extern status_t _kern_get_next_fd_info(team_id team, uint32 *_cookie,

View File

@ -98,5 +98,9 @@ patch_fcntl()
createPipe->ParameterAt(0)->SetOut(true);
createPipe->ParameterAt(0)->SetCount(2);
createPipe->GetParameter("flags")->SetHandler(new FlagsTypeHandler(kOpenFlags));
Syscall *dup2 = get_syscall("_kern_dup2");
dup2->GetParameter("flags")->SetHandler(new FlagsTypeHandler(kOpenFlags));
}

View File

@ -373,7 +373,7 @@ dup_fd(int fd, bool kernel)
We do dup2() directly to be thread-safe.
*/
static int
dup2_fd(int oldfd, int newfd, bool kernel)
dup2_fd(int oldfd, int newfd, int flags, bool kernel)
{
struct file_descriptor* evicted = NULL;
struct io_context* context;
@ -383,6 +383,8 @@ dup2_fd(int oldfd, int newfd, bool kernel)
// quick check
if (oldfd < 0 || newfd < 0)
return B_FILE_ERROR;
if ((flags & ~O_CLOEXEC) != 0)
return B_BAD_VALUE;
// Get current I/O context and lock it
context = get_current_io_context(kernel);
@ -418,7 +420,7 @@ dup2_fd(int oldfd, int newfd, bool kernel)
deselect_select_infos(evicted, selectInfos, true);
}
fd_set_close_on_exec(context, newfd, false);
fd_set_close_on_exec(context, newfd, (flags & O_CLOEXEC) != 0);
mutex_unlock(&context->io_mutex);
@ -1014,9 +1016,9 @@ _user_dup(int fd)
int
_user_dup2(int ofd, int nfd)
_user_dup2(int ofd, int nfd, int flags)
{
return dup2_fd(ofd, nfd, false);
return dup2_fd(ofd, nfd, flags, false);
}
@ -1206,8 +1208,8 @@ _kern_dup(int fd)
int
_kern_dup2(int ofd, int nfd)
_kern_dup2(int ofd, int nfd, int flags)
{
return dup2_fd(ofd, nfd, true);
return dup2_fd(ofd, nfd, flags, true);
}

View File

@ -22,5 +22,12 @@ dup(int fd)
int
dup2(int oldFD, int newFD)
{
RETURN_AND_SET_ERRNO(_kern_dup2(oldFD, newFD));
return dup3(oldFD, newFD, 0);
}
int
dup3(int oldFD, int newFD, int flags)
{
RETURN_AND_SET_ERRNO(_kern_dup2(oldFD, newFD, flags));
}