* Added _kern_create_pipe() syscall, creating a pipe as an entryless
FIFO. Reimplemented pipe() to use it. * pipefs is no longer mounted. Will remove the superfluous code soon. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24823 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -179,6 +179,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(const char *path, mode_t perms);
|
extern status_t _kern_create_fifo(const char *path, mode_t perms);
|
||||||
|
extern status_t _kern_create_pipe(int *fds);
|
||||||
extern status_t _kern_access(const char *path, int mode);
|
extern status_t _kern_access(const char *path, int mode);
|
||||||
extern ssize_t _kern_select(int numfds, struct fd_set *readSet,
|
extern ssize_t _kern_select(int numfds, struct fd_set *readSet,
|
||||||
struct fd_set *writeSet, struct fd_set *errorSet,
|
struct fd_set *writeSet, struct fd_set *errorSet,
|
||||||
|
|||||||
@@ -172,6 +172,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(const char *path, mode_t perms);
|
status_t _user_create_fifo(const char *path, mode_t perms);
|
||||||
|
status_t _user_create_pipe(int *fds);
|
||||||
status_t _user_access(const char *path, int mode);
|
status_t _user_access(const char *path, int mode);
|
||||||
ssize_t _user_select(int numfds, fd_set *readSet, fd_set *writeSet, fd_set *errorSet,
|
ssize_t _user_select(int numfds, fd_set *readSet, fd_set *writeSet, fd_set *errorSet,
|
||||||
bigtime_t timeout, const sigset_t *sigMask);
|
bigtime_t timeout, const sigset_t *sigMask);
|
||||||
|
|||||||
@@ -8186,6 +8186,60 @@ _user_create_fifo(const char *userPath, mode_t perms)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
_user_create_pipe(int *userFDs)
|
||||||
|
{
|
||||||
|
// rootfs should support creating FIFOs, but let's be sure
|
||||||
|
if (!HAS_FS_CALL(sRoot, create_special_node))
|
||||||
|
return B_UNSUPPORTED;
|
||||||
|
|
||||||
|
// create the node -- the FIFO sub node is set up automatically
|
||||||
|
fs_vnode superVnode;
|
||||||
|
ino_t nodeID;
|
||||||
|
status_t status = FS_CALL(sRoot, create_special_node, NULL, NULL,
|
||||||
|
S_IFIFO | S_IRUSR | S_IWUSR, 0, &superVnode, &nodeID);
|
||||||
|
if (status != B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
// We've got one reference to the node and need another one.
|
||||||
|
struct vnode* vnode;
|
||||||
|
status = get_vnode(sRoot->mount->id, nodeID, &vnode, true, false);
|
||||||
|
if (status != B_OK) {
|
||||||
|
// that should not happen
|
||||||
|
dprintf("_user_create_pipe(): Failed to lookup vnode (%ld, %lld)\n",
|
||||||
|
sRoot->mount->id, sRoot->id);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Everything looks good so far. Open two FDs for reading respectively
|
||||||
|
// writing.
|
||||||
|
int fds[2];
|
||||||
|
fds[0] = open_vnode(vnode, O_RDONLY, false);
|
||||||
|
fds[1] = open_vnode(vnode, O_WRONLY, false);
|
||||||
|
|
||||||
|
FDCloser closer0(fds[0], false);
|
||||||
|
FDCloser closer1(fds[1], false);
|
||||||
|
|
||||||
|
status = (fds[0] >= 0 ? (fds[1] >= 0 ? B_OK : fds[1]) : fds[0]);
|
||||||
|
|
||||||
|
// copy FDs to userland
|
||||||
|
if (status == B_OK) {
|
||||||
|
if (!IS_USER_ADDRESS(userFDs)
|
||||||
|
|| user_memcpy(userFDs, fds, sizeof(fds)) != B_OK) {
|
||||||
|
status = B_BAD_ADDRESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep FDs, if everything went fine
|
||||||
|
if (status == B_OK) {
|
||||||
|
closer0.Detach();
|
||||||
|
closer1.Detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
_user_access(const char *userPath, int mode)
|
_user_access(const char *userPath, int mode)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -453,12 +453,6 @@ vfs_bootstrap_file_systems(void)
|
|||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
panic("error mounting devfs\n");
|
panic("error mounting devfs\n");
|
||||||
|
|
||||||
// bootstrap the pipefs
|
|
||||||
_kern_create_dir(-1, "/pipe", 0755);
|
|
||||||
status = _kern_mount("/pipe", NULL, "pipefs", 0, NULL, 0);
|
|
||||||
if (status < B_OK)
|
|
||||||
panic("error mounting pipefs\n");
|
|
||||||
|
|
||||||
// create directory for the boot volume
|
// create directory for the boot volume
|
||||||
_kern_create_dir(-1, "/boot", 0755);
|
_kern_create_dir(-1, "/boot", 0755);
|
||||||
|
|
||||||
|
|||||||
@@ -1,34 +1,20 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2003-2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
* Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <OS.h>
|
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdio.h>
|
#include <syscalls.h>
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
pipe(int streams[2])
|
pipe(int streams[2])
|
||||||
{
|
{
|
||||||
bigtime_t timestamp = system_time();
|
status_t error = _kern_create_pipe(streams);
|
||||||
char pipeName[64];
|
if (error != B_OK) {
|
||||||
|
errno = error;
|
||||||
while (system_time() <= timestamp) // ensure we get an unused timestamp
|
|
||||||
;
|
|
||||||
|
|
||||||
sprintf(pipeName, "/pipe/%03lx-%Ld", find_thread(NULL), system_time());
|
|
||||||
|
|
||||||
streams[0] = open(pipeName, O_CREAT | O_RDONLY, 0777);
|
|
||||||
if (streams[0] < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
streams[1] = open(pipeName, O_WRONLY);
|
|
||||||
if (streams[1] < 0) {
|
|
||||||
close(streams[0]);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user