A component name is a counted string (cn_nameptr, cn_namelen),
not a zero terminated string cn_nameptr. Change the following operations to work with counted strings: v7fs_file_lookup_by_name() v7fs_file_allocate() v7fs_file_deallocate() v7fs_directory_add_entry() v7fs_directory_remove_entry() v7fs_file_rename() v7fs_file_link() v7fs_dirent_filename() Adapt all vnode operations with component names as argument.
This commit is contained in:
parent
5161bf1350
commit
514b0270dd
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: main.c,v 1.1 2011/06/27 11:52:58 uch Exp $ */
|
||||
/* $NetBSD: main.c,v 1.2 2022/02/11 10:55:15 hannken Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2011 The NetBSD Foundation, Inc.
|
||||
|
@ -31,7 +31,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: main.c,v 1.1 2011/06/27 11:52:58 uch Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.2 2022/02/11 10:55:15 hannken Exp $");
|
||||
#endif /* not lint */
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -241,8 +241,8 @@ make_lost_and_found(struct v7fs_self *fs, struct v7fs_inode *p)
|
|||
attr.ctime = attr.mtime = attr.atime = (v7fs_time_t)time(NULL);
|
||||
|
||||
/* If lost+found already exists, returns EEXIST */
|
||||
if (!(error = v7fs_file_allocate
|
||||
(fs, &root_inode, "lost+found", &attr, &ino)))
|
||||
if (!(error = v7fs_file_allocate(fs, &root_inode,
|
||||
"lost+found", strlen("lost+found"), &attr, &ino)))
|
||||
v7fs_superblock_writeback(fs);
|
||||
|
||||
if (error == EEXIST)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pathname.c,v 1.1 2011/06/27 11:52:58 uch Exp $ */
|
||||
/* $NetBSD: pathname.c,v 1.2 2022/02/11 10:55:15 hannken Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2011 The NetBSD Foundation, Inc.
|
||||
|
@ -31,7 +31,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: pathname.c,v 1.1 2011/06/27 11:52:58 uch Exp $");
|
||||
__RCSID("$NetBSD: pathname.c,v 1.2 2022/02/11 10:55:15 hannken Exp $");
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
|
@ -64,7 +64,7 @@ connect_lost_and_found(struct v7fs_self *fs, v7fs_ino_t ino)
|
|||
return FSCK_EXIT_CHECK_FAILED;
|
||||
|
||||
snprintf(name, sizeof(name), "%d", ino);
|
||||
v7fs_directory_add_entry(fs, &lost_and_found, ino, name);
|
||||
v7fs_directory_add_entry(fs, &lost_and_found, ino, name, strlen(name));
|
||||
t = (v7fs_time_t)time(NULL);
|
||||
lost_and_found.mtime = lost_and_found.atime = t;
|
||||
v7fs_inode_writeback(fs, &lost_and_found);
|
||||
|
@ -107,7 +107,7 @@ lookup_child_subr(struct v7fs_self *fs, void *ctx, v7fs_daddr_t blk, size_t sz)
|
|||
pwarn("entry #%d not found.", dir->inode_number);
|
||||
if (reply("REMOVE?"))
|
||||
v7fs_directory_remove_entry(fs, arg->parent,
|
||||
dir->name);
|
||||
dir->name, strlen(dir->name));
|
||||
} else {
|
||||
/* Count child dir. */
|
||||
if (v7fs_inode_isdir(&inode))
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: v7fs_dirent.c,v 1.2 2011/07/18 21:51:49 apb Exp $ */
|
||||
/* $NetBSD: v7fs_dirent.c,v 1.3 2022/02/11 10:55:15 hannken Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2011 The NetBSD Foundation, Inc.
|
||||
|
@ -34,7 +34,7 @@
|
|||
#endif
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: v7fs_dirent.c,v 1.2 2011/07/18 21:51:49 apb Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: v7fs_dirent.c,v 1.3 2022/02/11 10:55:15 hannken Exp $");
|
||||
#if defined _KERNEL_OPT
|
||||
#include "opt_v7fs.h"
|
||||
#endif
|
||||
|
@ -81,9 +81,12 @@ v7fs_dirent_endian_convert(struct v7fs_self *fs, struct v7fs_dirent *dir, int n)
|
|||
|
||||
void
|
||||
v7fs_dirent_filename(char *dst/* size must be V7FS_NAME_MAX + 1 */,
|
||||
const char *src)
|
||||
const char *src, size_t srclen)
|
||||
{
|
||||
|
||||
strncpy(dst, src, V7FS_NAME_MAX);
|
||||
dst[V7FS_NAME_MAX] = '\0';
|
||||
if (srclen > V7FS_NAME_MAX)
|
||||
srclen = V7FS_NAME_MAX;
|
||||
|
||||
memset(dst, 0, V7FS_NAME_MAX + 1);
|
||||
strncpy(dst, src, srclen);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: v7fs_dirent.h,v 1.1 2011/06/27 11:52:24 uch Exp $ */
|
||||
/* $NetBSD: v7fs_dirent.h,v 1.2 2022/02/11 10:55:15 hannken Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2011 The NetBSD Foundation, Inc.
|
||||
|
@ -33,6 +33,6 @@
|
|||
#define _V7FS_DIRENT_H_
|
||||
__BEGIN_DECLS
|
||||
bool v7fs_dirent_endian_convert(struct v7fs_self *, struct v7fs_dirent *, int);
|
||||
void v7fs_dirent_filename(char *, const char *);
|
||||
void v7fs_dirent_filename(char *, const char *, size_t);
|
||||
__END_DECLS
|
||||
#endif /*!_V7FS_DIRENT_H_ */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: v7fs_file.c,v 1.6 2014/12/29 15:28:58 hannken Exp $ */
|
||||
/* $NetBSD: v7fs_file.c,v 1.7 2022/02/11 10:55:15 hannken Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2011 The NetBSD Foundation, Inc.
|
||||
|
@ -34,7 +34,7 @@
|
|||
#endif
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: v7fs_file.c,v 1.6 2014/12/29 15:28:58 hannken Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: v7fs_file.c,v 1.7 2022/02/11 10:55:15 hannken Exp $");
|
||||
#if defined _KERNEL_OPT
|
||||
#include "opt_v7fs.h"
|
||||
#endif
|
||||
|
@ -67,22 +67,14 @@ static int remove_subr(struct v7fs_self *, void *, v7fs_daddr_t, size_t);
|
|||
|
||||
int
|
||||
v7fs_file_lookup_by_name(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
||||
const char *name, v7fs_ino_t *ino)
|
||||
const char *name, size_t namelen, v7fs_ino_t *ino)
|
||||
{
|
||||
char filename[V7FS_NAME_MAX + 1];
|
||||
char *q;
|
||||
int error;
|
||||
size_t len;
|
||||
|
||||
if ((q = strchr(name, '/'))) {
|
||||
/* Zap following path. */
|
||||
len = MIN(V7FS_NAME_MAX, q - name);
|
||||
memcpy(filename, name, len);
|
||||
filename[len] = '\0'; /* '/' -> '\0' */
|
||||
} else {
|
||||
v7fs_dirent_filename(filename, name);
|
||||
}
|
||||
DPRINTF("%s(%s) dir=%d\n", filename, name, parent_dir->inode_number);
|
||||
v7fs_dirent_filename(filename, name, namelen);
|
||||
DPRINTF("%s(%.*s) dir=%d\n", filename, (int)namelen, name,
|
||||
parent_dir->inode_number);
|
||||
|
||||
struct v7fs_lookup_arg lookup_arg = { .name = filename,
|
||||
.inode_number = 0 };
|
||||
|
@ -135,20 +127,17 @@ lookup_subr(struct v7fs_self *fs, void *ctx, v7fs_daddr_t blk, size_t sz)
|
|||
|
||||
int
|
||||
v7fs_file_allocate(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
||||
const char *srcname, struct v7fs_fileattr *attr, v7fs_ino_t *ino)
|
||||
const char *srcname, size_t srclen, struct v7fs_fileattr *attr,
|
||||
v7fs_ino_t *ino)
|
||||
{
|
||||
struct v7fs_inode inode;
|
||||
char filename[V7FS_NAME_MAX + 1];
|
||||
struct v7fs_dirent *dir;
|
||||
int error;
|
||||
|
||||
/* Truncate filename. */
|
||||
v7fs_dirent_filename(filename, srcname);
|
||||
DPRINTF("%s(%s)\n", filename, srcname);
|
||||
|
||||
/* Check filename. */
|
||||
if (v7fs_file_lookup_by_name(fs, parent_dir, filename, ino) == 0) {
|
||||
DPRINTF("%s exists\n", filename);
|
||||
if (v7fs_file_lookup_by_name(fs, parent_dir, srcname, srclen,
|
||||
ino) == 0) {
|
||||
DPRINTF("%.*s exists\n", (int)srclen, srcname);
|
||||
return EEXIST;
|
||||
}
|
||||
|
||||
|
@ -219,7 +208,8 @@ v7fs_file_allocate(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
|||
v7fs_inode_writeback(fs, &inode);
|
||||
|
||||
/* Link this inode to parent directory. */
|
||||
if ((error = v7fs_directory_add_entry(fs, parent_dir, *ino, filename)))
|
||||
if ((error = v7fs_directory_add_entry(fs, parent_dir, *ino, srcname,
|
||||
srclen)))
|
||||
{
|
||||
DPRINTF("can't add dirent.\n");
|
||||
return error;
|
||||
|
@ -230,24 +220,25 @@ v7fs_file_allocate(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
|||
|
||||
int
|
||||
v7fs_file_deallocate(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
||||
const char *name)
|
||||
const char *name, size_t namelen)
|
||||
{
|
||||
v7fs_ino_t ino;
|
||||
struct v7fs_inode inode;
|
||||
int error;
|
||||
|
||||
DPRINTF("%s\n", name);
|
||||
if ((error = v7fs_file_lookup_by_name(fs, parent_dir, name, &ino))) {
|
||||
DPRINTF("%.*s\n", (int)namelen, name);
|
||||
if ((error = v7fs_file_lookup_by_name(fs, parent_dir, name, namelen,
|
||||
&ino))) {
|
||||
DPRINTF("no such a file: %s\n", name);
|
||||
return error;
|
||||
}
|
||||
DPRINTF("%s->#%d\n", name, ino);
|
||||
DPRINTF("%.*s->#%d\n", (int)namelen, name, ino);
|
||||
if ((error = v7fs_inode_load(fs, &inode, ino)))
|
||||
return error;
|
||||
|
||||
if (v7fs_inode_isdir(&inode)) {
|
||||
char filename[V7FS_NAME_MAX + 1];
|
||||
v7fs_dirent_filename(filename, name);
|
||||
v7fs_dirent_filename(filename, name, namelen);
|
||||
/* Check parent */
|
||||
if (strncmp(filename, "..", V7FS_NAME_MAX) == 0) {
|
||||
DPRINTF("can not remove '..'\n");
|
||||
|
@ -266,11 +257,12 @@ v7fs_file_deallocate(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
|||
} else {
|
||||
/* Decrement reference count. */
|
||||
--inode.nlink; /* regular file. */
|
||||
DPRINTF("%s nlink=%d\n", name, inode.nlink);
|
||||
DPRINTF("%.*s nlink=%d\n", (int)namelen, name, inode.nlink);
|
||||
}
|
||||
|
||||
|
||||
if ((error = v7fs_directory_remove_entry(fs, parent_dir, name)))
|
||||
if ((error = v7fs_directory_remove_entry(fs, parent_dir, name,
|
||||
namelen)))
|
||||
return error;
|
||||
DPRINTF("remove dirent\n");
|
||||
|
||||
|
@ -281,7 +273,7 @@ v7fs_file_deallocate(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
|||
|
||||
int
|
||||
v7fs_directory_add_entry(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
||||
v7fs_ino_t ino, const char *srcname)
|
||||
v7fs_ino_t ino, const char *srcname, size_t srclen)
|
||||
{
|
||||
struct v7fs_inode inode;
|
||||
struct v7fs_dirent *dir;
|
||||
|
@ -291,8 +283,8 @@ v7fs_directory_add_entry(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
|||
char filename[V7FS_NAME_MAX + 1];
|
||||
|
||||
/* Truncate filename. */
|
||||
v7fs_dirent_filename(filename, srcname);
|
||||
DPRINTF("%s(%s) %d\n", filename, srcname, ino);
|
||||
v7fs_dirent_filename(filename, srcname, srclen);
|
||||
DPRINTF("%s(%.*s) %d\n", filename, (int)srclen, srcname, ino);
|
||||
|
||||
/* Target inode */
|
||||
if ((error = v7fs_inode_load(fs, &inode, ino)))
|
||||
|
@ -335,9 +327,10 @@ v7fs_directory_add_entry(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
|||
|
||||
int
|
||||
v7fs_directory_remove_entry(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
||||
const char *name)
|
||||
const char *name, size_t namelen)
|
||||
{
|
||||
struct v7fs_inode inode;
|
||||
char filename[V7FS_NAME_MAX + 1];
|
||||
int error;
|
||||
struct v7fs_dirent lastdirent;
|
||||
v7fs_daddr_t lastblk;
|
||||
|
@ -345,6 +338,8 @@ v7fs_directory_remove_entry(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
|||
v7fs_off_t pos;
|
||||
void *buf;
|
||||
|
||||
v7fs_dirent_filename(filename, name, namelen);
|
||||
|
||||
/* Setup replaced entry. */
|
||||
sz = parent_dir->filesize;
|
||||
lastblk = v7fs_datablock_last(fs, parent_dir,
|
||||
|
@ -360,7 +355,7 @@ v7fs_directory_remove_entry(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
|||
V7FS_VAL16(fs, lastdirent.inode_number), lastdirent.name, pos);
|
||||
|
||||
struct v7fs_lookup_arg lookup_arg =
|
||||
{ .name = name, .replace = &lastdirent/*disk endian */ };
|
||||
{ .name = filename, .replace = &lastdirent/*disk endian */ };
|
||||
/* Search entry that removed. replace it to last dirent. */
|
||||
if ((error = v7fs_datablock_foreach(fs, parent_dir, remove_subr,
|
||||
&lookup_arg)) != V7FS_ITERATOR_BREAK)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: v7fs_file.h,v 1.2 2011/07/16 12:35:40 uch Exp $ */
|
||||
/* $NetBSD: v7fs_file.h,v 1.3 2022/02/11 10:55:15 hannken Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2011 The NetBSD Foundation, Inc.
|
||||
|
@ -42,22 +42,23 @@ struct v7fs_lookup_arg {
|
|||
__BEGIN_DECLS
|
||||
/* core */
|
||||
int v7fs_file_lookup_by_name(struct v7fs_self *, struct v7fs_inode *,
|
||||
const char*, v7fs_ino_t *);
|
||||
const char*, size_t, v7fs_ino_t *);
|
||||
int v7fs_file_allocate(struct v7fs_self *, struct v7fs_inode *, const char *,
|
||||
struct v7fs_fileattr *, v7fs_ino_t *);
|
||||
int v7fs_file_deallocate(struct v7fs_self *, struct v7fs_inode *, const char *);
|
||||
size_t, struct v7fs_fileattr *, v7fs_ino_t *);
|
||||
int v7fs_file_deallocate(struct v7fs_self *, struct v7fs_inode *, const char *,
|
||||
size_t);
|
||||
int v7fs_directory_add_entry(struct v7fs_self *,struct v7fs_inode *, v7fs_ino_t,
|
||||
const char *);
|
||||
const char *, size_t);
|
||||
int v7fs_directory_remove_entry(struct v7fs_self *,struct v7fs_inode *,
|
||||
const char *);
|
||||
const char *, size_t);
|
||||
|
||||
/* util */
|
||||
int v7fs_file_rename(struct v7fs_self *, struct v7fs_inode *, const char *,
|
||||
struct v7fs_inode *, const char *);
|
||||
size_t, struct v7fs_inode *, const char *, size_t);
|
||||
int v7fs_directory_replace_entry(struct v7fs_self *, struct v7fs_inode *,
|
||||
const char *, v7fs_ino_t);
|
||||
int v7fs_file_link(struct v7fs_self *, struct v7fs_inode *, struct v7fs_inode *,
|
||||
const char *);
|
||||
const char *, size_t);
|
||||
bool v7fs_file_lookup_by_number(struct v7fs_self *, struct v7fs_inode *,
|
||||
v7fs_ino_t, char *);
|
||||
int v7fs_file_symlink(struct v7fs_self *, struct v7fs_inode *, const char *);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: v7fs_file_util.c,v 1.4 2011/07/30 03:52:04 uch Exp $ */
|
||||
/* $NetBSD: v7fs_file_util.c,v 1.5 2022/02/11 10:55:15 hannken Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2011 The NetBSD Foundation, Inc.
|
||||
|
@ -34,7 +34,7 @@
|
|||
#endif
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: v7fs_file_util.c,v 1.4 2011/07/30 03:52:04 uch Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: v7fs_file_util.c,v 1.5 2022/02/11 10:55:15 hannken Exp $");
|
||||
#ifdef _KERNEL
|
||||
#include <sys/systm.h>
|
||||
#include <sys/param.h>
|
||||
|
@ -67,13 +67,14 @@ static int lookup_parent_from_dir_subr(struct v7fs_self *, void *,
|
|||
|
||||
int
|
||||
v7fs_file_link(struct v7fs_self *fs, struct v7fs_inode *parent_dir,
|
||||
struct v7fs_inode *p, const char *name)
|
||||
struct v7fs_inode *p, const char *name, size_t namelen)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
DPRINTF("%d %d %s\n", parent_dir->inode_number, p->inode_number, name);
|
||||
DPRINTF("%d %d %.*s\n", parent_dir->inode_number, p->inode_number,
|
||||
(int)namelen, name);
|
||||
if ((error = v7fs_directory_add_entry(fs, parent_dir, p->inode_number,
|
||||
name))) {
|
||||
name, namelen))) {
|
||||
DPRINTF("can't add entry");
|
||||
return error;
|
||||
}
|
||||
|
@ -118,7 +119,8 @@ v7fs_file_symlink(struct v7fs_self *fs, struct v7fs_inode *p,
|
|||
|
||||
int
|
||||
v7fs_file_rename(struct v7fs_self *fs, struct v7fs_inode *parent_from,
|
||||
const char *from, struct v7fs_inode *parent_to, const char *to)
|
||||
const char *from, size_t fromlen, struct v7fs_inode *parent_to,
|
||||
const char *to, size_t tolen)
|
||||
{
|
||||
v7fs_ino_t from_ino, to_ino;
|
||||
struct v7fs_inode inode;
|
||||
|
@ -126,20 +128,21 @@ v7fs_file_rename(struct v7fs_self *fs, struct v7fs_inode *parent_from,
|
|||
bool dir_move;
|
||||
|
||||
/* Check source file */
|
||||
if ((error = v7fs_file_lookup_by_name(fs, parent_from, from,
|
||||
if ((error = v7fs_file_lookup_by_name(fs, parent_from, from, fromlen,
|
||||
&from_ino))) {
|
||||
DPRINTF("%s don't exists\n", from);
|
||||
DPRINTF("%.*s don't exists\n", (int)fromlen, from);
|
||||
return error;
|
||||
}
|
||||
v7fs_inode_load(fs, &inode, from_ino);
|
||||
dir_move = v7fs_inode_isdir(&inode);
|
||||
|
||||
/* Check target file */
|
||||
error = v7fs_file_lookup_by_name(fs, parent_to, to, &to_ino);
|
||||
error = v7fs_file_lookup_by_name(fs, parent_to, to, tolen, &to_ino);
|
||||
if (error == 0) { /* found */
|
||||
DPRINTF("%s already exists\n", to);
|
||||
if ((error = v7fs_file_deallocate(fs, parent_to, to))) {
|
||||
DPRINTF("%s can't remove %d\n", to, error);
|
||||
DPRINTF("%.*s already exists\n", (int)tolen, to);
|
||||
if ((error = v7fs_file_deallocate(fs, parent_to, to, tolen))) {
|
||||
DPRINTF("%.*s can't remove %d\n", (int)tolen,
|
||||
to, error);
|
||||
return error;
|
||||
}
|
||||
} else if (error != ENOENT) {
|
||||
|
@ -149,17 +152,19 @@ v7fs_file_rename(struct v7fs_self *fs, struct v7fs_inode *parent_from,
|
|||
/* Check directory hierarchy. t_vnops rename_dir(5) */
|
||||
if (dir_move && (error = can_dirmove(fs, from_ino,
|
||||
parent_to->inode_number))) {
|
||||
DPRINTF("dst '%s' is child dir of '%s'. error=%d\n", to, from,
|
||||
error);
|
||||
DPRINTF("dst '%.*s' is child dir of '%.*s'. error=%d\n",
|
||||
(int)tolen, to, (int)fromlen, from, error);
|
||||
return error;
|
||||
}
|
||||
|
||||
if ((error = v7fs_directory_add_entry(fs, parent_to, from_ino, to))) {
|
||||
if ((error = v7fs_directory_add_entry(fs, parent_to, from_ino, to,
|
||||
tolen))) {
|
||||
DPRINTF("can't add entry");
|
||||
return error;
|
||||
}
|
||||
|
||||
if ((error = v7fs_directory_remove_entry(fs, parent_from, from))) {
|
||||
if ((error = v7fs_directory_remove_entry(fs, parent_from, from,
|
||||
fromlen))) {
|
||||
DPRINTF("can't remove entry");
|
||||
return error;
|
||||
}
|
||||
|
@ -260,7 +265,8 @@ lookup_by_number_subr(struct v7fs_self *fs, void *ctx, v7fs_daddr_t blk,
|
|||
for (i = 0; i < n; i++, dir++) {
|
||||
if (dir->inode_number == p->inode_number) {
|
||||
if (p->buf)
|
||||
v7fs_dirent_filename(p->buf, dir->name);
|
||||
v7fs_dirent_filename(p->buf, dir->name,
|
||||
strlen(dir->name));
|
||||
ret = V7FS_ITERATOR_BREAK;
|
||||
break;
|
||||
}
|
||||
|
@ -330,7 +336,7 @@ lookup_parent_from_dir_subr(struct v7fs_self *fs, void *ctx, v7fs_daddr_t blk,
|
|||
}
|
||||
|
||||
for (i = 0; i < n; i++, dir++) {
|
||||
v7fs_dirent_filename(name, dir->name);
|
||||
v7fs_dirent_filename(name, dir->name, strlen(dir->name));
|
||||
if (strncmp(dir->name, "..", V7FS_NAME_MAX) != 0)
|
||||
continue;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: v7fs_vnops.c,v 1.33 2022/02/01 17:12:24 jakllsch Exp $ */
|
||||
/* $NetBSD: v7fs_vnops.c,v 1.34 2022/02/11 10:55:15 hannken Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2004, 2011 The NetBSD Foundation, Inc.
|
||||
|
@ -30,7 +30,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c,v 1.33 2022/02/01 17:12:24 jakllsch Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c,v 1.34 2022/02/11 10:55:15 hannken Exp $");
|
||||
#if defined _KERNEL_OPT
|
||||
#include "opt_v7fs.h"
|
||||
#endif
|
||||
|
@ -110,7 +110,7 @@ v7fs_lookup(void *v)
|
|||
#ifdef V7FS_VNOPS_DEBUG
|
||||
const char *opname[] = { "LOOKUP", "CREATE", "DELETE", "RENAME" };
|
||||
#endif
|
||||
DPRINTF("'%s' op=%s flags=%d parent=%d %o %dbyte\n", name,
|
||||
DPRINTF("'%.*s' op=%s flags=%d parent=%d %o %dbyte\n", namelen, name,
|
||||
opname[nameiop], cnp->cn_flags, parent->inode_number, parent->mode,
|
||||
parent->filesize);
|
||||
|
||||
|
@ -145,15 +145,18 @@ v7fs_lookup(void *v)
|
|||
}
|
||||
|
||||
/* ".." and regular file. */
|
||||
if ((error = v7fs_file_lookup_by_name(fs, parent, name, &ino))) {
|
||||
if ((error = v7fs_file_lookup_by_name(fs, parent, name, namelen,
|
||||
&ino))) {
|
||||
/* Not found. Tell this entry be able to allocate. */
|
||||
if (((nameiop == CREATE) || (nameiop == RENAME)) && islastcn) {
|
||||
/* Check directory permission to allocate. */
|
||||
if ((error = VOP_ACCESS(dvp, VWRITE, cnp->cn_cred))) {
|
||||
DPRINTF("access denied. (%s)\n", name);
|
||||
DPRINTF("access denied. (%.*s)\n",
|
||||
namelen, name);
|
||||
return error;
|
||||
}
|
||||
DPRINTF("EJUSTRETURN op=%d (%s)\n", nameiop, name);
|
||||
DPRINTF("EJUSTRETURN op=%d (%.*s)\n", nameiop, namelen,
|
||||
name);
|
||||
return EJUSTRETURN;
|
||||
}
|
||||
DPRINTF("lastcn=%d\n", flags & ISLASTCN);
|
||||
|
@ -162,7 +165,7 @@ v7fs_lookup(void *v)
|
|||
|
||||
if ((nameiop == DELETE) && islastcn) {
|
||||
if ((error = VOP_ACCESS(dvp, VWRITE, cnp->cn_cred))) {
|
||||
DPRINTF("access denied. (%s)\n", name);
|
||||
DPRINTF("access denied. (%.*s)\n", namelen, name);
|
||||
return error;
|
||||
}
|
||||
}
|
||||
|
@ -186,7 +189,7 @@ v7fs_lookup(void *v)
|
|||
if (vpp != dvp)
|
||||
VOP_UNLOCK(vpp);
|
||||
*a->a_vpp = vpp;
|
||||
DPRINTF("done.(%s)\n", name);
|
||||
DPRINTF("done.(%.*s)\n", namelen, name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -210,8 +213,8 @@ v7fs_create(void *v)
|
|||
v7fs_ino_t ino;
|
||||
int error = 0;
|
||||
|
||||
DPRINTF("%s parent#%d\n", a->a_cnp->cn_nameptr,
|
||||
parent_node->inode.inode_number);
|
||||
DPRINTF("%.*s parent#%d\n", (int)a->a_cnp->cn_namelen,
|
||||
a->a_cnp->cn_nameptr, parent_node->inode.inode_number);
|
||||
KDASSERT((va->va_type == VREG) || (va->va_type == VSOCK));
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
|
@ -222,7 +225,7 @@ v7fs_create(void *v)
|
|||
|
||||
/* Allocate disk entry. and register its entry to parent directory. */
|
||||
if ((error = v7fs_file_allocate(fs, &parent_node->inode,
|
||||
a->a_cnp->cn_nameptr, &attr, &ino))) {
|
||||
a->a_cnp->cn_nameptr, a->a_cnp->cn_namelen, &attr, &ino))) {
|
||||
DPRINTF("v7fs_file_allocate failed.\n");
|
||||
return error;
|
||||
}
|
||||
|
@ -272,8 +275,8 @@ v7fs_mknod(void *v)
|
|||
v7fs_ino_t ino;
|
||||
int error = 0;
|
||||
|
||||
DPRINTF("%s %06o %lx %d\n", cnp->cn_nameptr, va->va_mode,
|
||||
(long)va->va_rdev, va->va_type);
|
||||
DPRINTF("%.*s %06o %lx %d\n", (int)cnp->cn_namelen, cnp->cn_nameptr,
|
||||
va->va_mode, (long)va->va_rdev, va->va_type);
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.uid = kauth_cred_geteuid(cr);
|
||||
attr.gid = kauth_cred_getegid(cr);
|
||||
|
@ -281,7 +284,7 @@ v7fs_mknod(void *v)
|
|||
attr.device = va->va_rdev;
|
||||
|
||||
if ((error = v7fs_file_allocate(fs, &parent_node->inode,
|
||||
cnp->cn_nameptr, &attr, &ino)))
|
||||
cnp->cn_nameptr, cnp->cn_namelen, &attr, &ino)))
|
||||
return error;
|
||||
/* Sync dirent size change. */
|
||||
uvm_vnp_setsize(dvp, v7fs_inode_filesize(&parent_node->inode));
|
||||
|
@ -698,7 +701,8 @@ v7fs_remove(void *v)
|
|||
struct v7fs_self *fs = v7fsmount->core;
|
||||
int error = 0;
|
||||
|
||||
DPRINTF("delete %s\n", a->a_cnp->cn_nameptr);
|
||||
DPRINTF("delete %.*s\n", (int)a->a_cnp->cn_namelen,
|
||||
a->a_cnp->cn_nameptr);
|
||||
|
||||
if (vp->v_type == VDIR) {
|
||||
error = EPERM;
|
||||
|
@ -706,7 +710,7 @@ v7fs_remove(void *v)
|
|||
}
|
||||
|
||||
if ((error = v7fs_file_deallocate(fs, &parent_node->inode,
|
||||
a->a_cnp->cn_nameptr))) {
|
||||
a->a_cnp->cn_nameptr, a->a_cnp->cn_namelen))) {
|
||||
DPRINTF("v7fs_file_delete failed.\n");
|
||||
goto out;
|
||||
}
|
||||
|
@ -750,7 +754,7 @@ v7fs_link(void *v)
|
|||
VOP_ABORTOP(dvp, cnp);
|
||||
goto unlock;
|
||||
}
|
||||
error = v7fs_file_link(fs, parent, p, cnp->cn_nameptr);
|
||||
error = v7fs_file_link(fs, parent, p, cnp->cn_nameptr, cnp->cn_namelen);
|
||||
/* Sync dirent size change. */
|
||||
uvm_vnp_setsize(dvp, v7fs_inode_filesize(&parent_node->inode));
|
||||
|
||||
|
@ -780,9 +784,12 @@ v7fs_rename(void *v)
|
|||
struct v7fs_self *fs = v7node->v7fsmount->core;
|
||||
const char *from_name = a->a_fcnp->cn_nameptr;
|
||||
const char *to_name = a->a_tcnp->cn_nameptr;
|
||||
size_t from_len = a->a_fcnp->cn_namelen;
|
||||
size_t to_len = a->a_tcnp->cn_namelen;
|
||||
int error;
|
||||
|
||||
DPRINTF("%s->%s %p %p\n", from_name, to_name, fvp, tvp);
|
||||
DPRINTF("%.*s->%.*s %p %p\n", (int)from_len, from_name, (int)to_len,
|
||||
to_name, fvp, tvp);
|
||||
|
||||
if ((fvp->v_mount != tdvp->v_mount) ||
|
||||
(tvp && (fvp->v_mount != tvp->v_mount))) {
|
||||
|
@ -791,8 +798,8 @@ v7fs_rename(void *v)
|
|||
goto out;
|
||||
}
|
||||
// XXXsource file lock?
|
||||
error = v7fs_file_rename(fs, &parent_from->inode, from_name,
|
||||
&parent_to->inode, to_name);
|
||||
error = v7fs_file_rename(fs, &parent_from->inode, from_name, from_len,
|
||||
&parent_to->inode, to_name, to_len);
|
||||
/* 'to file' inode may be changed. (hard-linked and it is cached.)
|
||||
t_vnops rename_reg_nodir */
|
||||
if (error == 0 && tvp) {
|
||||
|
@ -846,7 +853,7 @@ v7fs_mkdir(void *v)
|
|||
attr.mode = va->va_mode | vtype_to_v7fs_mode(va->va_type);
|
||||
|
||||
if ((error = v7fs_file_allocate(fs, &parent_node->inode,
|
||||
cnp->cn_nameptr, &attr, &ino)))
|
||||
cnp->cn_nameptr, cnp->cn_namelen, &attr, &ino)))
|
||||
return error;
|
||||
/* Sync dirent size change. */
|
||||
uvm_vnp_setsize(dvp, v7fs_inode_filesize(&parent_node->inode));
|
||||
|
@ -882,12 +889,13 @@ v7fs_rmdir(void *v)
|
|||
struct v7fs_self *fs = v7fsmount->core;
|
||||
int error = 0;
|
||||
|
||||
DPRINTF("delete %s\n", a->a_cnp->cn_nameptr);
|
||||
DPRINTF("delete %.*s\n", (int)a->a_cnp->cn_namelen,
|
||||
a->a_cnp->cn_nameptr);
|
||||
|
||||
KDASSERT(vp->v_type == VDIR);
|
||||
|
||||
if ((error = v7fs_file_deallocate(fs, &parent_node->inode,
|
||||
a->a_cnp->cn_nameptr))) {
|
||||
a->a_cnp->cn_nameptr, a->a_cnp->cn_namelen))) {
|
||||
DPRINTF("v7fs_directory_deallocate failed.\n");
|
||||
goto out;
|
||||
}
|
||||
|
@ -937,7 +945,7 @@ readdir_subr(struct v7fs_self *fs, void *ctx, v7fs_daddr_t blk, size_t sz)
|
|||
if ((error = v7fs_inode_load(fs, &inode, dir->inode_number)))
|
||||
break;
|
||||
|
||||
v7fs_dirent_filename(filename, dir->name);
|
||||
v7fs_dirent_filename(filename, dir->name, strlen(dir->name));
|
||||
|
||||
DPRINTF("inode=%d name=%s %s\n", dir->inode_number, filename,
|
||||
v7fs_inode_isdir(&inode) ? "DIR" : "FILE");
|
||||
|
@ -1267,6 +1275,7 @@ v7fs_symlink(void *v)
|
|||
const char *from = a->a_target;
|
||||
const char *to = cnp->cn_nameptr;
|
||||
size_t len = strlen(from) + 1;
|
||||
size_t tolen = cnp->cn_namelen;
|
||||
int error = 0;
|
||||
|
||||
if (len > V7FS_BSIZE) { /* limited to 512byte pathname */
|
||||
|
@ -1280,7 +1289,7 @@ v7fs_symlink(void *v)
|
|||
attr.mode = va->va_mode | vtype_to_v7fs_mode(va->va_type);
|
||||
|
||||
if ((error = v7fs_file_allocate
|
||||
(fs, &parent_node->inode, to, &attr, &ino))) {
|
||||
(fs, &parent_node->inode, to, tolen, &attr, &ino))) {
|
||||
return error;
|
||||
}
|
||||
/* Sync dirent size change. */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: v7fs_populate.c,v 1.3 2011/08/10 11:31:49 uch Exp $ */
|
||||
/* $NetBSD: v7fs_populate.c,v 1.4 2022/02/11 10:55:15 hannken Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2011 The NetBSD Foundation, Inc.
|
||||
|
@ -35,7 +35,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(__RCSID) && !defined(__lint)
|
||||
__RCSID("$NetBSD: v7fs_populate.c,v 1.3 2011/08/10 11:31:49 uch Exp $");
|
||||
__RCSID("$NetBSD: v7fs_populate.c,v 1.4 2022/02/11 10:55:15 hannken Exp $");
|
||||
#endif /* !__lint */
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -89,8 +89,8 @@ allocate(struct v7fs_self *fs, struct v7fs_inode *parent_inode, fsnode *node,
|
|||
|
||||
attr_setup(node, &attr);
|
||||
attr.device = dev;
|
||||
if ((error = v7fs_file_allocate(fs, parent_inode, node->name, &attr,
|
||||
&ino))) {
|
||||
if ((error = v7fs_file_allocate(fs, parent_inode, node->name,
|
||||
strlen(node->name), &attr, &ino))) {
|
||||
errno = error;
|
||||
warn("%s", node->name);
|
||||
return error;
|
||||
|
@ -146,7 +146,7 @@ file_copy(struct v7fs_self *fs, struct v7fs_inode *parent_inode, fsnode *node,
|
|||
goto err_exit;
|
||||
}
|
||||
if ((error = v7fs_file_link(fs, parent_inode, &inode,
|
||||
node->name))) {
|
||||
node->name, strlen(node->name)))) {
|
||||
errmsg = "hard link";
|
||||
goto err_exit;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue