kernel/libroot: add pipe2() from POSIX.1-2024
this adds a parameter to the create_pipe syscall. Adjust strace. Change-Id: I83e9f039eb28c862458654b66c03e2e21a258822 Reviewed-on: https://review.haiku-os.org/c/haiku/+/8513 Reviewed-by: waddlesplash <[email protected]> Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
30179dd326
commit
11cd4af6e1
@@ -341,6 +341,7 @@ extern int fchdir(int fd);
|
|||||||
extern char *getcwd(char *buffer, size_t size);
|
extern char *getcwd(char *buffer, size_t size);
|
||||||
|
|
||||||
extern int pipe(int fildes[2]);
|
extern int pipe(int fildes[2]);
|
||||||
|
extern int pipe2(int fildes[2], int flags);
|
||||||
extern int dup(int fd);
|
extern int dup(int fd);
|
||||||
extern int dup2(int fd1, int fd2);
|
extern int dup2(int fd1, int fd2);
|
||||||
extern int close(int fd);
|
extern int close(int fd);
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ status_t _user_unlink(int fd, const char *path);
|
|||||||
status_t _user_rename(int oldFD, const char *oldpath, int newFD,
|
status_t _user_rename(int oldFD, const char *oldpath, int newFD,
|
||||||
const char *newpath);
|
const char *newpath);
|
||||||
status_t _user_create_fifo(int fd, const char *path, mode_t perms);
|
status_t _user_create_fifo(int fd, const char *path, mode_t perms);
|
||||||
status_t _user_create_pipe(int *fds);
|
status_t _user_create_pipe(int *fds, int flags);
|
||||||
status_t _user_access(int fd, const char *path, int mode,
|
status_t _user_access(int fd, const char *path, int mode,
|
||||||
bool effectiveUserGroup);
|
bool effectiveUserGroup);
|
||||||
ssize_t _user_select(int numfds, fd_set *readSet, fd_set *writeSet,
|
ssize_t _user_select(int numfds, fd_set *readSet, fd_set *writeSet,
|
||||||
|
|||||||
@@ -295,7 +295,7 @@ extern status_t _kern_unlink(int fd, const char *path);
|
|||||||
extern status_t _kern_rename(int oldDir, const char *oldpath, int newDir,
|
extern status_t _kern_rename(int oldDir, const char *oldpath, int newDir,
|
||||||
const char *newpath);
|
const char *newpath);
|
||||||
extern status_t _kern_create_fifo(int fd, const char *path, mode_t perms);
|
extern status_t _kern_create_fifo(int fd, const char *path, mode_t perms);
|
||||||
extern status_t _kern_create_pipe(int *fds);
|
extern status_t _kern_create_pipe(int *fds, int flags);
|
||||||
extern status_t _kern_access(int fd, const char *path, int mode,
|
extern status_t _kern_access(int fd, const char *path, int mode,
|
||||||
bool effectiveUserGroup);
|
bool effectiveUserGroup);
|
||||||
extern ssize_t _kern_select(int numfds, struct fd_set *readSet,
|
extern ssize_t _kern_select(int numfds, struct fd_set *readSet,
|
||||||
|
|||||||
@@ -93,5 +93,10 @@ patch_fcntl()
|
|||||||
fcntl->GetParameter("argument")->SetHandler(
|
fcntl->GetParameter("argument")->SetHandler(
|
||||||
new TypeHandlerSelector(kFcntlTypeHandlers,
|
new TypeHandlerSelector(kFcntlTypeHandlers,
|
||||||
1, TypeHandlerFactory<void *>::Create()));
|
1, TypeHandlerFactory<void *>::Create()));
|
||||||
|
|
||||||
|
Syscall *createPipe = get_syscall("_kern_create_pipe");
|
||||||
|
createPipe->ParameterAt(0)->SetOut(true);
|
||||||
|
createPipe->ParameterAt(0)->SetCount(2);
|
||||||
|
createPipe->GetParameter("flags")->SetHandler(new FlagsTypeHandler(kOpenFlags));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -124,10 +124,6 @@ patch_network()
|
|||||||
shutdown->GetParameter("how")->SetHandler(
|
shutdown->GetParameter("how")->SetHandler(
|
||||||
new EnumTypeHandler(kShutdownHowMap));
|
new EnumTypeHandler(kShutdownHowMap));
|
||||||
|
|
||||||
Syscall *createPipe = get_syscall("_kern_create_pipe");
|
|
||||||
createPipe->ParameterAt(0)->SetOut(true);
|
|
||||||
createPipe->ParameterAt(0)->SetCount(2);
|
|
||||||
|
|
||||||
Syscall *socketPair = get_syscall("_kern_socketpair");
|
Syscall *socketPair = get_syscall("_kern_socketpair");
|
||||||
socketPair->ParameterAt(3)->SetOut(true);
|
socketPair->ParameterAt(3)->SetOut(true);
|
||||||
socketPair->ParameterAt(3)->SetCount(2);
|
socketPair->ParameterAt(3)->SetCount(2);
|
||||||
|
|||||||
@@ -9579,8 +9579,12 @@ _user_create_fifo(int fd, const char* userPath, mode_t perms)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
_user_create_pipe(int* userFDs)
|
_user_create_pipe(int* userFDs, int flags)
|
||||||
{
|
{
|
||||||
|
// check acceptable flags
|
||||||
|
if ((flags & ~(O_NONBLOCK | O_CLOEXEC)) != 0)
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
// rootfs should support creating FIFOs, but let's be sure
|
// rootfs should support creating FIFOs, but let's be sure
|
||||||
if (!HAS_FS_CALL(sRoot, create_special_node))
|
if (!HAS_FS_CALL(sRoot, create_special_node))
|
||||||
return B_UNSUPPORTED;
|
return B_UNSUPPORTED;
|
||||||
@@ -9606,10 +9610,11 @@ _user_create_pipe(int* userFDs)
|
|||||||
// Everything looks good so far. Open two FDs for reading respectively
|
// Everything looks good so far. Open two FDs for reading respectively
|
||||||
// writing, O_NONBLOCK to avoid blocking on open with O_RDONLY
|
// writing, O_NONBLOCK to avoid blocking on open with O_RDONLY
|
||||||
int fds[2];
|
int fds[2];
|
||||||
fds[0] = open_vnode(vnode, O_RDONLY | O_NONBLOCK, false);
|
fds[0] = open_vnode(vnode, O_RDONLY | O_NONBLOCK | flags, false);
|
||||||
fds[1] = open_vnode(vnode, O_WRONLY, false);
|
fds[1] = open_vnode(vnode, O_WRONLY | flags, false);
|
||||||
// Reset O_NONBLOCK
|
// Reset O_NONBLOCK if requested
|
||||||
common_fcntl(fds[0], F_SETFL, 0, false);
|
if ((flags & O_NONBLOCK) == 0)
|
||||||
|
common_fcntl(fds[0], F_SETFL, flags & O_NONBLOCK, false);
|
||||||
|
|
||||||
FDCloser closer0(fds[0], false);
|
FDCloser closer0(fds[0], false);
|
||||||
FDCloser closer1(fds[1], false);
|
FDCloser closer1(fds[1], false);
|
||||||
|
|||||||
@@ -11,9 +11,9 @@
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
pipe(int streams[2])
|
pipe2(int streams[2], int flags)
|
||||||
{
|
{
|
||||||
status_t error = _kern_create_pipe(streams);
|
status_t error = _kern_create_pipe(streams, flags);
|
||||||
if (error != B_OK) {
|
if (error != B_OK) {
|
||||||
__set_errno(error);
|
__set_errno(error);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -21,3 +21,10 @@ pipe(int streams[2])
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
pipe(int streams[2])
|
||||||
|
{
|
||||||
|
return pipe2(streams, 0);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user