* Fixed reversed handling of O_NOTRAVERSE in attr_open(), and attr_create().

* Added support for O_NOFOLLOW for those two as well.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42619 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2011-08-10 20:53:06 +00:00
parent 3d01f69f9e
commit 33272012fb

View File

@ -1,6 +1,6 @@
/*
* Copyright 2005-2011, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2002-2010, Axel Dörfler, axeld@pinc-software.de.
* Copyright 2002-2011, Axel Dörfler, axeld@pinc-software.de.
* Distributed under the terms of the MIT License.
*
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
@ -5308,7 +5308,7 @@ file_open_entry_ref(dev_t mountID, ino_t directoryID, const char* name,
FUNCTION(("file_open_entry_ref(ref = (%ld, %Ld, %s), openMode = %d)\n",
mountID, directoryID, name, openMode));
bool traverse = ((openMode & (O_NOTRAVERSE | O_NOFOLLOW)) == 0);
bool traverse = (openMode & (O_NOTRAVERSE | O_NOFOLLOW)) == 0;
// get the vnode matching the entry_ref
struct vnode* vnode;
@ -5337,7 +5337,7 @@ file_open_entry_ref(dev_t mountID, ino_t directoryID, const char* name,
static int
file_open(int fd, char* path, int openMode, bool kernel)
{
bool traverse = ((openMode & (O_NOTRAVERSE | O_NOFOLLOW)) == 0);
bool traverse = (openMode & (O_NOTRAVERSE | O_NOFOLLOW)) == 0;
FUNCTION(("file_open: fd: %d, entry path = '%s', omode %d, kernel %d\n",
fd, path, openMode, kernel));
@ -6396,12 +6396,18 @@ attr_create(int fd, char* path, const char* name, uint32 type,
if (name == NULL || *name == '\0')
return B_BAD_VALUE;
bool traverse = (openMode & (O_NOTRAVERSE | O_NOFOLLOW)) == 0;
struct vnode* vnode;
status_t status = fd_and_path_to_vnode(fd, path,
(openMode & O_NOTRAVERSE) != 0, &vnode, NULL, kernel);
status_t status = fd_and_path_to_vnode(fd, path, traverse, &vnode, NULL,
kernel);
if (status != B_OK)
return status;
if ((openMode & O_NOFOLLOW) != 0 && S_ISLNK(vnode->Type())) {
status = B_LINK_LIMIT;
goto err;
}
if (!HAS_FS_CALL(vnode, create_attr)) {
status = B_READ_ONLY_DEVICE;
goto err;
@ -6436,12 +6442,18 @@ attr_open(int fd, char* path, const char* name, int openMode, bool kernel)
if (name == NULL || *name == '\0')
return B_BAD_VALUE;
bool traverse = (openMode & (O_NOTRAVERSE | O_NOFOLLOW)) == 0;
struct vnode* vnode;
status_t status = fd_and_path_to_vnode(fd, path,
(openMode & O_NOTRAVERSE) != 0, &vnode, NULL, kernel);
status_t status = fd_and_path_to_vnode(fd, path, traverse, &vnode, NULL,
kernel);
if (status != B_OK)
return status;
if ((openMode & O_NOFOLLOW) != 0 && S_ISLNK(vnode->Type())) {
status = B_LINK_LIMIT;
goto err;
}
if (!HAS_FS_CALL(vnode, open_attr)) {
status = B_NOT_SUPPORTED;
goto err;