From c7a0c0f9e1e24078d289aae9f7a10ff62af9a537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 5 Oct 2004 13:24:12 +0000 Subject: [PATCH] Added set_flags() support where needed. devfs now uses the ioctl() mechanism via B_SET_(NON)BLOCKING_IO to notify the device about any access mode changes. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9199 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kernel/core/fs/bootfs.c | 1 + src/kernel/core/fs/devfs.cpp | 17 +++++++++++++++++ src/kernel/core/fs/pipefs.cpp | 11 +++++++++++ src/kernel/core/fs/rootfs.c | 1 + 4 files changed, 30 insertions(+) diff --git a/src/kernel/core/fs/bootfs.c b/src/kernel/core/fs/bootfs.c index 6d57b3a817..c8e6b2d2e0 100755 --- a/src/kernel/core/fs/bootfs.c +++ b/src/kernel/core/fs/bootfs.c @@ -977,6 +977,7 @@ file_system_info gBootFileSystem = { /* common */ &bootfs_ioctl, + NULL, // set_flags &bootfs_fsync, NULL, // read_link diff --git a/src/kernel/core/fs/devfs.cpp b/src/kernel/core/fs/devfs.cpp index 216491991f..aae04344f6 100644 --- a/src/kernel/core/fs/devfs.cpp +++ b/src/kernel/core/fs/devfs.cpp @@ -1138,6 +1138,22 @@ devfs_ioctl(fs_volume _fs, fs_vnode _vnode, fs_cookie _cookie, ulong op, void *b } +static status_t +devfs_set_flags(fs_volume _fs, fs_vnode _vnode, fs_cookie _cookie, int flags) +{ + struct devfs_vnode *vnode = (struct devfs_vnode *)_vnode; + struct devfs_cookie *cookie = (struct devfs_cookie *)_cookie; + + // we need to pass the O_NONBLOCK flag to the underlying device + + if (!S_ISCHR(vnode->stream.type)) + return B_NOT_ALLOWED; + + return vnode->stream.u.dev.info->control(cookie->u.dev.dcookie, flags & O_NONBLOCK ? + B_SET_NONBLOCKING_IO : B_SET_BLOCKING_IO, NULL, 0); +} + + static bool devfs_can_page(fs_volume _fs, fs_vnode _vnode, fs_cookie cookie) { @@ -1360,6 +1376,7 @@ file_system_info gDeviceFileSystem = { /* common */ &devfs_ioctl, + &devfs_set_flags, &devfs_fsync, NULL, // read_link diff --git a/src/kernel/core/fs/pipefs.cpp b/src/kernel/core/fs/pipefs.cpp index 93792badc3..b85baa4d30 100644 --- a/src/kernel/core/fs/pipefs.cpp +++ b/src/kernel/core/fs/pipefs.cpp @@ -1289,6 +1289,16 @@ pipefs_ioctl(fs_volume _volume, fs_vnode _vnode, fs_cookie _cookie, ulong op, } +static status_t +pipefs_set_flags(fs_volume _volume, fs_vnode _vnode, fs_cookie _cookie, int flags) +{ + file_cookie *cookie = (file_cookie *)_cookie; + + cookie->open_mode = (cookie->open_mode & ~(O_APPEND | O_NONBLOCK)) | flags; + return B_OK; +} + + static bool pipefs_can_page(fs_volume _volume, fs_vnode _v, fs_cookie cookie) { @@ -1432,6 +1442,7 @@ file_system_info gPipeFileSystem = { /* common */ &pipefs_ioctl, + &pipefs_set_flags, &pipefs_fsync, NULL, // fs_read_link() diff --git a/src/kernel/core/fs/rootfs.c b/src/kernel/core/fs/rootfs.c index 79e986f28a..3095ba9bef 100755 --- a/src/kernel/core/fs/rootfs.c +++ b/src/kernel/core/fs/rootfs.c @@ -1021,6 +1021,7 @@ file_system_info gRootFileSystem = { /* common */ &rootfs_ioctl, + NULL, // fs_set_flags() &rootfs_fsync, &rootfs_read_link,