/* ---- System call definition and support ---- */
#define FLOCATE_CREATE_EMPTY 1
+#define FLOCATE_CREATE_ONLY 2
int
vfs_getfd(int fd, struct v_fd** fd_s)
}
errno = vfs_walk(*fdir, name.value, file, NULL, 0);
- if (errno != ENOENT || !(options & FLOCATE_CREATE_EMPTY)) {
+
+ if (errno != ENOENT && (options & FLOCATE_CREATE_ONLY)) {
+ return EEXIST;
+ }
+
+ if (errno != ENOENT ||
+ !(options & (FLOCATE_CREATE_EMPTY | FLOCATE_CREATE_ONLY))) {
return errno;
}
size_t cpy_size = MIN(dnode->name.len, size - len);
strncpy(buf + len, dnode->name.value, cpy_size);
- len += cpy_size + !!cpy_size;
+ len += cpy_size;
return len;
}
link_target)
{
int errno;
- struct v_dnode* dnode;
- if ((errno = vfs_walk_proc(pathname, &dnode, NULL, 0))) {
+ struct v_dnode *dnode, *file;
+ if ((errno = __vfs_try_locate_file(
+ pathname, &dnode, &file, FLOCATE_CREATE_ONLY))) {
goto done;
}
- if (errno = vfs_check_writable(dnode)) {
+ if (errno = vfs_check_writable(file)) {
goto done;
}
- if (!dnode->inode->ops->set_symlink) {
+ if (!file->inode->ops->set_symlink) {
errno = ENOTSUP;
goto done;
}
- lock_inode(dnode->inode);
+ lock_inode(file->inode);
- errno = dnode->inode->ops->set_symlink(dnode->inode, link_target);
+ errno = file->inode->ops->set_symlink(file->inode, link_target);
- unlock_inode(dnode->inode);
+ unlock_inode(file->inode);
done:
return DO_STATUS(errno);