Added vfs_get_cwd() call to get the mount_id and vnode_id of the current
working directory (instead of the full path). Cleanup of some remaining "int" status variables (where it should have been a "status_t"). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13924 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -80,6 +80,7 @@ status_t vfs_get_file_map( void *_vnode, off_t offset, size_t size, struct file_
|
|||||||
status_t vfs_get_fs_node_from_path(mount_id mountID, const char *path, bool kernel, void **_node);
|
status_t vfs_get_fs_node_from_path(mount_id mountID, const char *path, bool kernel, void **_node);
|
||||||
status_t vfs_stat_vnode(void *_vnode, struct stat *stat);
|
status_t vfs_stat_vnode(void *_vnode, struct stat *stat);
|
||||||
status_t vfs_get_vnode_name(void *vnode, char *name, size_t nameSize);
|
status_t vfs_get_vnode_name(void *vnode, char *name, size_t nameSize);
|
||||||
|
status_t vfs_get_cwd(mount_id *_mountID, vnode_id *_vnodeID);
|
||||||
|
|
||||||
/* special module convenience call */
|
/* special module convenience call */
|
||||||
status_t vfs_get_module_path(const char *basePath, const char *moduleName, char *pathBuffer, size_t bufferSize);
|
status_t vfs_get_module_path(const char *basePath, const char *moduleName, char *pathBuffer, size_t bufferSize);
|
||||||
|
|||||||
@@ -2421,6 +2421,26 @@ vfs_put_vnode(void *_vnode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" status_t
|
||||||
|
vfs_get_cwd(mount_id *_mountID, vnode_id *_vnodeID)
|
||||||
|
{
|
||||||
|
// Get current working directory from io context
|
||||||
|
struct io_context *context = get_current_io_context(false);
|
||||||
|
status_t status = B_OK;
|
||||||
|
|
||||||
|
mutex_lock(&context->io_mutex);
|
||||||
|
|
||||||
|
if (context->cwd != NULL) {
|
||||||
|
*_mountID = context->cwd->device;
|
||||||
|
*_vnodeID = context->cwd->id;
|
||||||
|
} else
|
||||||
|
status = B_ERROR;
|
||||||
|
|
||||||
|
mutex_unlock(&context->io_mutex);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" bool
|
extern "C" bool
|
||||||
vfs_can_page(void *_vnode, void *cookie)
|
vfs_can_page(void *_vnode, void *cookie)
|
||||||
{
|
{
|
||||||
@@ -3658,7 +3678,7 @@ common_read_link(int fd, char *path, char *buffer, size_t *_bufferSize,
|
|||||||
bool kernel)
|
bool kernel)
|
||||||
{
|
{
|
||||||
struct vnode *vnode;
|
struct vnode *vnode;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
status = fd_and_path_to_vnode(fd, path, false, &vnode, NULL, kernel);
|
status = fd_and_path_to_vnode(fd, path, false, &vnode, NULL, kernel);
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
@@ -3679,7 +3699,7 @@ static status_t
|
|||||||
common_write_link(char *path, char *toPath, bool kernel)
|
common_write_link(char *path, char *toPath, bool kernel)
|
||||||
{
|
{
|
||||||
struct vnode *vnode;
|
struct vnode *vnode;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
status = path_to_vnode(path, false, &vnode, NULL, kernel);
|
status = path_to_vnode(path, false, &vnode, NULL, kernel);
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
@@ -3703,7 +3723,7 @@ common_create_symlink(int fd, char *path, const char *toPath, int mode,
|
|||||||
// path validity checks have to be in the calling function!
|
// path validity checks have to be in the calling function!
|
||||||
char name[B_FILE_NAME_LENGTH];
|
char name[B_FILE_NAME_LENGTH];
|
||||||
struct vnode *vnode;
|
struct vnode *vnode;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
FUNCTION(("common_create_symlink(fd = %d, path = %s, toPath = %s, mode = %d, kernel = %d)\n", fd, path, toPath, mode, kernel));
|
FUNCTION(("common_create_symlink(fd = %d, path = %s, toPath = %s, mode = %d, kernel = %d)\n", fd, path, toPath, mode, kernel));
|
||||||
|
|
||||||
@@ -3728,7 +3748,7 @@ common_create_link(char *path, char *toPath, bool kernel)
|
|||||||
// path validity checks have to be in the calling function!
|
// path validity checks have to be in the calling function!
|
||||||
char name[B_FILE_NAME_LENGTH];
|
char name[B_FILE_NAME_LENGTH];
|
||||||
struct vnode *directory, *vnode;
|
struct vnode *directory, *vnode;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
FUNCTION(("common_create_link(path = %s, toPath = %s, kernel = %d)\n", path, toPath, kernel));
|
FUNCTION(("common_create_link(path = %s, toPath = %s, kernel = %d)\n", path, toPath, kernel));
|
||||||
|
|
||||||
@@ -3764,7 +3784,7 @@ common_unlink(int fd, char *path, bool kernel)
|
|||||||
{
|
{
|
||||||
char filename[B_FILE_NAME_LENGTH];
|
char filename[B_FILE_NAME_LENGTH];
|
||||||
struct vnode *vnode;
|
struct vnode *vnode;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
FUNCTION(("common_unlink: fd: %d, path '%s', kernel %d\n", fd, path, kernel));
|
FUNCTION(("common_unlink: fd: %d, path '%s', kernel %d\n", fd, path, kernel));
|
||||||
|
|
||||||
@@ -3787,7 +3807,7 @@ static status_t
|
|||||||
common_access(char *path, int mode, bool kernel)
|
common_access(char *path, int mode, bool kernel)
|
||||||
{
|
{
|
||||||
struct vnode *vnode;
|
struct vnode *vnode;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
status = path_to_vnode(path, true, &vnode, NULL, kernel);
|
status = path_to_vnode(path, true, &vnode, NULL, kernel);
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
@@ -3810,7 +3830,7 @@ common_rename(int fd, char *path, int newFD, char *newPath, bool kernel)
|
|||||||
struct vnode *fromVnode, *toVnode;
|
struct vnode *fromVnode, *toVnode;
|
||||||
char fromName[B_FILE_NAME_LENGTH];
|
char fromName[B_FILE_NAME_LENGTH];
|
||||||
char toName[B_FILE_NAME_LENGTH];
|
char toName[B_FILE_NAME_LENGTH];
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
FUNCTION(("common_rename(fd = %d, path = %s, newFD = %d, newPath = %s, kernel = %d)\n", fd, path, newFD, newPath, kernel));
|
FUNCTION(("common_rename(fd = %d, path = %s, newFD = %d, newPath = %s, kernel = %d)\n", fd, path, newFD, newPath, kernel));
|
||||||
|
|
||||||
@@ -3905,7 +3925,7 @@ common_path_write_stat(int fd, char *path, bool traverseLeafLink,
|
|||||||
const struct stat *stat, int statMask, bool kernel)
|
const struct stat *stat, int statMask, bool kernel)
|
||||||
{
|
{
|
||||||
struct vnode *vnode;
|
struct vnode *vnode;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
FUNCTION(("common_write_stat: fd: %d, path '%s', stat %p, stat_mask %d, kernel %d\n", fd, path, stat, statMask, kernel));
|
FUNCTION(("common_write_stat: fd: %d, path '%s', stat %p, stat_mask %d, kernel %d\n", fd, path, stat, statMask, kernel));
|
||||||
|
|
||||||
@@ -4202,7 +4222,7 @@ attr_remove(int fd, const char *name, bool kernel)
|
|||||||
{
|
{
|
||||||
struct file_descriptor *descriptor;
|
struct file_descriptor *descriptor;
|
||||||
struct vnode *vnode;
|
struct vnode *vnode;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
if (name == NULL || *name == '\0')
|
if (name == NULL || *name == '\0')
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
@@ -4229,7 +4249,7 @@ attr_rename(int fromfd, const char *fromName, int tofd, const char *toName, bool
|
|||||||
{
|
{
|
||||||
struct file_descriptor *fromDescriptor, *toDescriptor;
|
struct file_descriptor *fromDescriptor, *toDescriptor;
|
||||||
struct vnode *fromVnode, *toVnode;
|
struct vnode *fromVnode, *toVnode;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
if (fromName == NULL || *fromName == '\0' || toName == NULL || *toName == '\0')
|
if (fromName == NULL || *fromName == '\0' || toName == NULL || *toName == '\0')
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
@@ -5045,7 +5065,7 @@ get_cwd(char *buffer, size_t size, bool kernel)
|
|||||||
{
|
{
|
||||||
// Get current working directory from io context
|
// Get current working directory from io context
|
||||||
struct io_context *context = get_current_io_context(kernel);
|
struct io_context *context = get_current_io_context(kernel);
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
FUNCTION(("vfs_get_cwd: buf %p, size %ld\n", buffer, size));
|
FUNCTION(("vfs_get_cwd: buf %p, size %ld\n", buffer, size));
|
||||||
|
|
||||||
@@ -5068,22 +5088,22 @@ set_cwd(int fd, char *path, bool kernel)
|
|||||||
struct vnode *vnode = NULL;
|
struct vnode *vnode = NULL;
|
||||||
struct vnode *oldDirectory;
|
struct vnode *oldDirectory;
|
||||||
struct stat stat;
|
struct stat stat;
|
||||||
int rc;
|
status_t status;
|
||||||
|
|
||||||
FUNCTION(("set_cwd: path = \'%s\'\n", path));
|
FUNCTION(("set_cwd: path = \'%s\'\n", path));
|
||||||
|
|
||||||
// Get vnode for passed path, and bail if it failed
|
// Get vnode for passed path, and bail if it failed
|
||||||
rc = fd_and_path_to_vnode(fd, path, true, &vnode, NULL, kernel);
|
status = fd_and_path_to_vnode(fd, path, true, &vnode, NULL, kernel);
|
||||||
if (rc < 0)
|
if (status < 0)
|
||||||
return rc;
|
return status;
|
||||||
|
|
||||||
rc = FS_CALL(vnode, read_stat)(vnode->mount->cookie, vnode->private_node, &stat);
|
status = FS_CALL(vnode, read_stat)(vnode->mount->cookie, vnode->private_node, &stat);
|
||||||
if (rc < 0)
|
if (status < 0)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (!S_ISDIR(stat.st_mode)) {
|
if (!S_ISDIR(stat.st_mode)) {
|
||||||
// nope, can't cwd to here
|
// nope, can't cwd to here
|
||||||
rc = B_NOT_A_DIRECTORY;
|
status = B_NOT_A_DIRECTORY;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5104,7 +5124,7 @@ set_cwd(int fd, char *path, bool kernel)
|
|||||||
|
|
||||||
err:
|
err:
|
||||||
put_vnode(vnode);
|
put_vnode(vnode);
|
||||||
return rc;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -5895,7 +5915,7 @@ _user_entry_ref_to_path(dev_t device, ino_t inode, const char *leaf,
|
|||||||
{
|
{
|
||||||
char path[B_PATH_NAME_LENGTH + 1];
|
char path[B_PATH_NAME_LENGTH + 1];
|
||||||
struct vnode *vnode;
|
struct vnode *vnode;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
if (!IS_USER_ADDRESS(userPath))
|
if (!IS_USER_ADDRESS(userPath))
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
@@ -6157,7 +6177,7 @@ status_t
|
|||||||
_user_remove_dir(const char *userPath)
|
_user_remove_dir(const char *userPath)
|
||||||
{
|
{
|
||||||
char path[B_PATH_NAME_LENGTH + 1];
|
char path[B_PATH_NAME_LENGTH + 1];
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
if (!IS_USER_ADDRESS(userPath))
|
if (!IS_USER_ADDRESS(userPath))
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
@@ -6176,7 +6196,7 @@ _user_read_link(int fd, const char *userPath, char *userBuffer, size_t *userBuff
|
|||||||
char path[B_PATH_NAME_LENGTH + 1];
|
char path[B_PATH_NAME_LENGTH + 1];
|
||||||
char buffer[B_PATH_NAME_LENGTH];
|
char buffer[B_PATH_NAME_LENGTH];
|
||||||
size_t bufferSize;
|
size_t bufferSize;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
if (!IS_USER_ADDRESS(userBuffer) || !IS_USER_ADDRESS(userBufferSize)
|
if (!IS_USER_ADDRESS(userBuffer) || !IS_USER_ADDRESS(userBufferSize)
|
||||||
|| user_memcpy(&bufferSize, userBufferSize, sizeof(size_t)) < B_OK)
|
|| user_memcpy(&bufferSize, userBufferSize, sizeof(size_t)) < B_OK)
|
||||||
@@ -6216,7 +6236,7 @@ _user_write_link(const char *userPath, const char *userToPath)
|
|||||||
{
|
{
|
||||||
char path[B_PATH_NAME_LENGTH + 1];
|
char path[B_PATH_NAME_LENGTH + 1];
|
||||||
char toPath[B_PATH_NAME_LENGTH + 1];
|
char toPath[B_PATH_NAME_LENGTH + 1];
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
if (!IS_USER_ADDRESS(userPath)
|
if (!IS_USER_ADDRESS(userPath)
|
||||||
|| !IS_USER_ADDRESS(userToPath))
|
|| !IS_USER_ADDRESS(userToPath))
|
||||||
@@ -6297,7 +6317,7 @@ status_t
|
|||||||
_user_unlink(int fd, const char *userPath)
|
_user_unlink(int fd, const char *userPath)
|
||||||
{
|
{
|
||||||
char path[B_PATH_NAME_LENGTH + 1];
|
char path[B_PATH_NAME_LENGTH + 1];
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
if (!IS_USER_ADDRESS(userPath))
|
if (!IS_USER_ADDRESS(userPath))
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
@@ -6316,7 +6336,7 @@ _user_rename(int oldFD, const char *userOldPath, int newFD,
|
|||||||
{
|
{
|
||||||
char oldPath[B_PATH_NAME_LENGTH + 1];
|
char oldPath[B_PATH_NAME_LENGTH + 1];
|
||||||
char newPath[B_PATH_NAME_LENGTH + 1];
|
char newPath[B_PATH_NAME_LENGTH + 1];
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
if (!IS_USER_ADDRESS(userOldPath) || !IS_USER_ADDRESS(userNewPath))
|
if (!IS_USER_ADDRESS(userOldPath) || !IS_USER_ADDRESS(userNewPath))
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
@@ -6337,7 +6357,7 @@ status_t
|
|||||||
_user_access(const char *userPath, int mode)
|
_user_access(const char *userPath, int mode)
|
||||||
{
|
{
|
||||||
char path[B_PATH_NAME_LENGTH + 1];
|
char path[B_PATH_NAME_LENGTH + 1];
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
if (!IS_USER_ADDRESS(userPath))
|
if (!IS_USER_ADDRESS(userPath))
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
@@ -6355,7 +6375,7 @@ _user_read_stat(int fd, const char *userPath, bool traverseLink,
|
|||||||
struct stat *userStat, size_t statSize)
|
struct stat *userStat, size_t statSize)
|
||||||
{
|
{
|
||||||
struct stat stat;
|
struct stat stat;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
if (statSize > sizeof(struct stat))
|
if (statSize > sizeof(struct stat))
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
@@ -6579,7 +6599,7 @@ status_t
|
|||||||
_user_getcwd(char *userBuffer, size_t size)
|
_user_getcwd(char *userBuffer, size_t size)
|
||||||
{
|
{
|
||||||
char buffer[B_PATH_NAME_LENGTH];
|
char buffer[B_PATH_NAME_LENGTH];
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
PRINT(("user_getcwd: buf %p, %ld\n", userBuffer, size));
|
PRINT(("user_getcwd: buf %p, %ld\n", userBuffer, size));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user