* Forgot to add linkat(), this really closes #4928 now.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34289 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2009-11-26 16:30:16 +00:00
parent fb2500da15
commit 486fffdaaf
5 changed files with 30 additions and 14 deletions

View File

@ -134,7 +134,9 @@ extern int pipe(int fildes[2]);
extern int dup(int fd);
extern int dup2(int fd1, int fd2);
extern int close(int fd);
extern int link(const char *name, const char *new_name);
extern int link(const char *toPath, const char *path);
extern int linkat(int toFD, const char *toPath, int pathFD,
const char *path, int flag);
extern int unlink(const char *name);
extern int unlinkat(int fd, const char *path, int flag);
extern int rmdir(const char *path);

View File

@ -190,7 +190,8 @@ status_t _user_read_link(int fd, const char *path, char *buffer,
status_t _user_write_link(const char *path, const char *toPath);
status_t _user_create_symlink(int fd, const char *path, const char *toPath,
int mode);
status_t _user_create_link(const char *path, const char *toPath);
status_t _user_create_link(int pathFD, const char *path, int toFD,
const char *toPath, bool traverseLeafLink);
status_t _user_unlink(int fd, const char *path);
status_t _user_rename(int oldFD, const char *oldpath, int newFD,
const char *newpath);

View File

@ -239,7 +239,8 @@ extern status_t _kern_read_link(int fd, const char *path, char *buffer,
size_t *_bufferSize);
extern status_t _kern_create_symlink(int fd, const char *path,
const char *toPath, int mode);
extern status_t _kern_create_link(const char *path, const char *toPath);
extern status_t _kern_create_link(int pathFD, const char *path, int toFD,
const char *toPath, bool traverseLeafLink);
extern status_t _kern_unlink(int fd, const char *path);
extern status_t _kern_rename(int oldDir, const char *oldpath, int newDir,
const char *newpath);

View File

@ -5995,7 +5995,8 @@ common_create_symlink(int fd, char* path, const char* toPath, int mode,
static status_t
common_create_link(char* path, char* toPath, bool kernel)
common_create_link(int pathFD, char* path, int toFD, char* toPath,
bool traverseLeafLink, bool kernel)
{
// path validity checks have to be in the calling function!
@ -6004,12 +6005,14 @@ common_create_link(char* path, char* toPath, bool kernel)
char name[B_FILE_NAME_LENGTH];
struct vnode* directory;
status_t status = path_to_dir_vnode(path, &directory, name, kernel);
status_t status = fd_and_path_to_dir_vnode(pathFD, path, &directory, name,
kernel);
if (status != B_OK)
return status;
struct vnode* vnode;
status = path_to_vnode(toPath, true, &vnode, NULL, kernel);
status = fd_and_path_to_vnode(toFD, toPath, traverseLeafLink, &vnode, NULL,
kernel);
if (status != B_OK)
goto err;
@ -7992,15 +7995,16 @@ _kern_create_symlink(int fd, const char* path, const char* toPath, int mode)
status_t
_kern_create_link(const char* path, const char* toPath)
_kern_create_link(int pathFD, const char* path, int toFD, const char* toPath,
bool traverseLeafLink)
{
KPath pathBuffer(path, false, B_PATH_NAME_LENGTH + 1);
KPath toPathBuffer(toPath, false, B_PATH_NAME_LENGTH + 1);
if (pathBuffer.InitCheck() != B_OK || toPathBuffer.InitCheck() != B_OK)
return B_NO_MEMORY;
return common_create_link(pathBuffer.LockBuffer(),
toPathBuffer.LockBuffer(), true);
return common_create_link(pathFD, pathBuffer.LockBuffer(), toFD,
toPathBuffer.LockBuffer(), traverseLeafLink, true);
}
@ -8869,7 +8873,8 @@ _user_create_symlink(int fd, const char* userPath, const char* userToPath,
status_t
_user_create_link(const char* userPath, const char* userToPath)
_user_create_link(int pathFD, const char* userPath, int toFD,
const char* userToPath, bool traverseLeafLink)
{
KPath pathBuffer(B_PATH_NAME_LENGTH + 1);
KPath toPathBuffer(B_PATH_NAME_LENGTH + 1);
@ -8889,7 +8894,8 @@ _user_create_link(const char* userPath, const char* userToPath)
if (status != B_OK)
return status;
return common_create_link(path, toPath, false);
return common_create_link(pathFD, path, toFD, toPath, traverseLeafLink,
false);
}

View File

@ -75,8 +75,14 @@ unlinkat(int fd, const char *path, int flag)
int
link(const char *toPath, const char *linkPath)
{
int status = _kern_create_link(linkPath, toPath);
RETURN_AND_SET_ERRNO(status);
RETURN_AND_SET_ERRNO(_kern_create_link(-1, linkPath, -1, toPath, true));
}
int
linkat(int toFD, const char *toPath, int linkFD, const char *linkPath, int flag)
{
RETURN_AND_SET_ERRNO(_kern_create_link(linkFD, linkPath, toFD, toPath,
(flag & AT_SYMLINK_FOLLOW) != 0));
}