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,