* do the l-variations of syscalls, since some nodes are symlinks

* truncate only regular files to set size
* do the chmod()-dance for cache flush to now write-protected files
  until I can think of a nicer way to solve this
This commit is contained in:
pooka 2007-01-11 14:59:35 +00:00
parent fa26351488
commit b599bb507d
1 changed files with 38 additions and 13 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: null.c,v 1.1 2007/01/11 01:01:55 pooka Exp $ */
/* $NetBSD: null.c,v 1.2 2007/01/11 14:59:35 pooka Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@ -30,7 +30,7 @@
#include <sys/cdefs.h>
#if !defined(lint)
__RCSID("$NetBSD: null.c,v 1.1 2007/01/11 01:01:55 pooka Exp $");
__RCSID("$NetBSD: null.c,v 1.2 2007/01/11 14:59:35 pooka Exp $");
#endif /* !lint */
/*
@ -64,17 +64,17 @@ pathcmp(struct puffs_node *pn, void *arg)
* set attributes to what is specified. XXX: no rollback in case of failure
*/
static int
processvattr(const char *path, const struct vattr *va)
processvattr(const char *path, const struct vattr *va, int regular)
{
struct timeval tv[2];
/* XXX: -1 == PUFFS_VNOVAL, but shouldn't trust that */
if (va->va_uid != (unsigned)-1 || va->va_gid != (unsigned)-1)
if (chown(path, va->va_uid, va->va_gid) == -1)
if (lchown(path, va->va_uid, va->va_gid) == -1)
return errno;
if (va->va_mode != (unsigned)PUFFS_VNOVAL)
if (chmod(path, va->va_mode) == -1)
if (lchmod(path, va->va_mode) == -1)
return errno;
/* sloppy */
@ -87,7 +87,7 @@ processvattr(const char *path, const struct vattr *va)
return errno;
}
if (va->va_type == VREG && va->va_size != (unsigned)PUFFS_VNOVAL)
if (regular && va->va_size != (u_quad_t)PUFFS_VNOVAL)
if (truncate(path, (off_t)va->va_size) == -1)
return errno;
@ -194,7 +194,7 @@ puffs_null_node_create(struct puffs_cc *pcc, void *opc, void **newnode,
if (fd == -1)
return errno;
close(fd);
if ((rv = processvattr(pcn->pcn_fullpath, va)) != 0) {
if ((rv = processvattr(pcn->pcn_fullpath, va, 1)) != 0) {
unlink(pcn->pcn_fullpath);
return rv;
}
@ -222,7 +222,7 @@ puffs_null_node_mknod(struct puffs_cc *pcc, void *opc, void **newnode,
if (mknod(pcn->pcn_fullpath, va->va_mode, va->va_rdev) == -1)
return errno;
if ((rv = processvattr(pcn->pcn_fullpath, va)) != 0) {
if ((rv = processvattr(pcn->pcn_fullpath, va, 0)) != 0) {
unlink(pcn->pcn_fullpath);
return rv;
}
@ -261,7 +261,7 @@ puffs_null_node_setattr(struct puffs_cc *pcc, void *opc,
struct puffs_node *pn = opc;
int rv;
rv = processvattr(pn->pn_path, va);
rv = processvattr(pn->pn_path, va, pn->pn_va.va_type == VREG);
if (rv)
return rv;
@ -321,7 +321,7 @@ puffs_null_node_mkdir(struct puffs_cc *pcc, void *opc, void **newnode,
if (mkdir(pcn->pcn_fullpath, va->va_mode) == -1)
return errno;
if ((rv = processvattr(pcn->pcn_fullpath, va)) != 0) {
if ((rv = processvattr(pcn->pcn_fullpath, va, 0)) != 0) {
unlink(pcn->pcn_fullpath);
return rv;
}
@ -363,7 +363,7 @@ puffs_null_node_symlink(struct puffs_cc *pcc, void *opc, void **newnode,
if (symlink(linkname, pcn->pcn_fullpath) == -1)
return errno;
if ((rv = processvattr(pcn->pcn_fullpath, va)) != 0) {
if ((rv = processvattr(pcn->pcn_fullpath, va, 0)) != 0) {
unlink(pcn->pcn_fullpath);
return rv;
}
@ -491,8 +491,33 @@ puffs_null_node_write(struct puffs_cc *pcc, void *opc, uint8_t *buf,
rv = 0;
fd = open(pn->pn_path, O_WRONLY);
if (fd == -1)
return errno;
if (fd == -1) {
/*
* XXXkludge: try again with better perms. need to fix
* this better somehow
*/
if (errno == EACCES) {
struct stat sb;
mode_t origmode;
int sverr = 0;
if (stat(pn->pn_path, &sb) == -1)
return errno;
origmode = sb.st_mode & ALLPERMS;
if (chmod(pn->pn_path, 0200) == -1)
return errno;
fd = open(pn->pn_path, O_WRONLY);
if (fd == -1)
sverr = errno;
chmod(pn->pn_path, origmode);
if (sverr)
return sverr;
} else
return errno;
}
off = lseek(fd, offset, SEEK_SET);
if (off == -1) {
rv = errno;