version 1.78, 2001/11/15 09:48:22 |
version 1.87, 2003/06/29 18:43:33 |
Line 103 const struct kern_target kern_targets[] |
|
Line 103 const struct kern_target kern_targets[] |
|
static int nkern_targets = sizeof(kern_targets) / sizeof(kern_targets[0]); |
static int nkern_targets = sizeof(kern_targets) / sizeof(kern_targets[0]); |
|
|
int kernfs_lookup __P((void *)); |
int kernfs_lookup __P((void *)); |
#define kernfs_create genfs_eopnotsupp_rele |
#define kernfs_create genfs_eopnotsupp |
#define kernfs_mknod genfs_eopnotsupp_rele |
#define kernfs_mknod genfs_eopnotsupp |
#define kernfs_open genfs_nullop |
#define kernfs_open genfs_nullop |
#define kernfs_close genfs_nullop |
#define kernfs_close genfs_nullop |
int kernfs_access __P((void *)); |
int kernfs_access __P((void *)); |
Line 118 int kernfs_write __P((void *)); |
|
Line 118 int kernfs_write __P((void *)); |
|
#define kernfs_revoke genfs_revoke |
#define kernfs_revoke genfs_revoke |
#define kernfs_fsync genfs_nullop |
#define kernfs_fsync genfs_nullop |
#define kernfs_seek genfs_nullop |
#define kernfs_seek genfs_nullop |
#define kernfs_remove genfs_eopnotsupp_rele |
#define kernfs_remove genfs_eopnotsupp |
int kernfs_link __P((void *)); |
int kernfs_link __P((void *)); |
#define kernfs_rename genfs_eopnotsupp_rele |
#define kernfs_rename genfs_eopnotsupp |
#define kernfs_mkdir genfs_eopnotsupp_rele |
#define kernfs_mkdir genfs_eopnotsupp |
#define kernfs_rmdir genfs_eopnotsupp_rele |
#define kernfs_rmdir genfs_eopnotsupp |
int kernfs_symlink __P((void *)); |
int kernfs_symlink __P((void *)); |
int kernfs_readdir __P((void *)); |
int kernfs_readdir __P((void *)); |
#define kernfs_readlink genfs_eopnotsupp |
#define kernfs_readlink genfs_eopnotsupp |
Line 143 int kernfs_pathconf __P((void *)); |
|
Line 143 int kernfs_pathconf __P((void *)); |
|
#define kernfs_truncate genfs_eopnotsupp |
#define kernfs_truncate genfs_eopnotsupp |
#define kernfs_update genfs_nullop |
#define kernfs_update genfs_nullop |
#define kernfs_bwrite genfs_eopnotsupp |
#define kernfs_bwrite genfs_eopnotsupp |
|
#define kernfs_putpages genfs_putpages |
|
|
int kernfs_xread __P((const struct kern_target *, int, char **, int)); |
static int kernfs_xread __P((const struct kern_target *, int, char **, size_t, size_t *)); |
int kernfs_xwrite __P((const struct kern_target *, char *, int)); |
static int kernfs_xwrite __P((const struct kern_target *, char *, size_t)); |
|
|
int (**kernfs_vnodeop_p) __P((void *)); |
int (**kernfs_vnodeop_p) __P((void *)); |
const struct vnodeopv_entry_desc kernfs_vnodeop_entries[] = { |
const struct vnodeopv_entry_desc kernfs_vnodeop_entries[] = { |
Line 191 const struct vnodeopv_entry_desc kernfs_ |
|
Line 192 const struct vnodeopv_entry_desc kernfs_ |
|
{ &vop_truncate_desc, kernfs_truncate }, /* truncate */ |
{ &vop_truncate_desc, kernfs_truncate }, /* truncate */ |
{ &vop_update_desc, kernfs_update }, /* update */ |
{ &vop_update_desc, kernfs_update }, /* update */ |
{ &vop_bwrite_desc, kernfs_bwrite }, /* bwrite */ |
{ &vop_bwrite_desc, kernfs_bwrite }, /* bwrite */ |
|
{ &vop_putpages_desc, kernfs_putpages }, /* putpages */ |
{ NULL, NULL } |
{ NULL, NULL } |
}; |
}; |
const struct vnodeopv_desc kernfs_vnodeop_opv_desc = |
const struct vnodeopv_desc kernfs_vnodeop_opv_desc = |
{ &kernfs_vnodeop_p, kernfs_vnodeop_entries }; |
{ &kernfs_vnodeop_p, kernfs_vnodeop_entries }; |
|
|
int |
static int |
kernfs_xread(kt, off, bufp, len) |
kernfs_xread(kt, off, bufp, len, wrlen) |
const struct kern_target *kt; |
const struct kern_target *kt; |
int off; |
int off; |
char **bufp; |
char **bufp; |
int len; |
size_t len; |
|
size_t *wrlen; |
{ |
{ |
|
|
switch (kt->kt_tag) { |
switch (kt->kt_tag) { |
Line 248 kernfs_xread(kt, off, bufp, len) |
|
Line 251 kernfs_xread(kt, off, bufp, len) |
|
* message buffer header are corrupted, but that'll cause |
* message buffer header are corrupted, but that'll cause |
* the system to die anyway. |
* the system to die anyway. |
*/ |
*/ |
if (off >= msgbufp->msg_bufs) |
if (off >= msgbufp->msg_bufs) { |
|
*wrlen = 0; |
return (0); |
return (0); |
|
} |
n = msgbufp->msg_bufx + off; |
n = msgbufp->msg_bufx + off; |
if (n >= msgbufp->msg_bufs) |
if (n >= msgbufp->msg_bufs) |
n -= msgbufp->msg_bufs; |
n -= msgbufp->msg_bufs; |
len = min(msgbufp->msg_bufs - n, msgbufp->msg_bufs - off); |
len = min(msgbufp->msg_bufs - n, msgbufp->msg_bufs - off); |
*bufp = msgbufp->msg_bufc + n; |
*bufp = msgbufp->msg_bufc + n; |
return (len); |
*wrlen = len; |
|
return (0); |
} |
} |
|
|
case KTT_HOSTNAME: { |
case KTT_HOSTNAME: { |
Line 279 kernfs_xread(kt, off, bufp, len) |
|
Line 285 kernfs_xread(kt, off, bufp, len) |
|
break; |
break; |
|
|
default: |
default: |
|
*wrlen = 0; |
return (0); |
return (0); |
} |
} |
|
|
len = strlen(*bufp); |
len = strlen(*bufp); |
if (len <= off) |
if (len <= off) |
return (0); |
*wrlen = 0; |
*bufp += off; |
else { |
return (len - off); |
*bufp += off; |
|
*wrlen = len - off; |
|
} |
|
return (0); |
} |
} |
|
|
int |
static int |
kernfs_xwrite(kt, buf, len) |
kernfs_xwrite(kt, buf, len) |
const struct kern_target *kt; |
const struct kern_target *kt; |
char *buf; |
char *buf; |
int len; |
size_t len; |
{ |
{ |
|
|
switch (kt->kt_tag) { |
switch (kt->kt_tag) { |
Line 302 kernfs_xwrite(kt, buf, len) |
|
Line 312 kernfs_xwrite(kt, buf, len) |
|
--len; |
--len; |
memcpy(hostname, buf, len); |
memcpy(hostname, buf, len); |
hostname[len] = '\0'; |
hostname[len] = '\0'; |
hostnamelen = len; |
hostnamelen = (size_t) len; |
return (0); |
return (0); |
|
|
default: |
default: |
Line 456 kernfs_getattr(v) |
|
Line 466 kernfs_getattr(v) |
|
} */ *ap = v; |
} */ *ap = v; |
struct vnode *vp = ap->a_vp; |
struct vnode *vp = ap->a_vp; |
struct vattr *vap = ap->a_vap; |
struct vattr *vap = ap->a_vap; |
struct timeval tv; |
|
int error = 0; |
int error = 0; |
char strbuf[KSTRING], *buf; |
char strbuf[KSTRING], *buf; |
|
|
Line 467 kernfs_getattr(v) |
|
Line 476 kernfs_getattr(v) |
|
vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; |
vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; |
vap->va_size = 0; |
vap->va_size = 0; |
vap->va_blocksize = DEV_BSIZE; |
vap->va_blocksize = DEV_BSIZE; |
microtime(&tv); |
/* |
TIMEVAL_TO_TIMESPEC(&tv, &vap->va_atime); |
* Make all times be current TOD. Avoid microtime(9), it's slow. |
vap->va_mtime = vap->va_atime; |
* We don't guard the read from time(9) with splclock(9) since we |
vap->va_ctime = vap->va_ctime; |
* don't actually need to be THAT sure the access is atomic. |
|
*/ |
|
TIMEVAL_TO_TIMESPEC(&time, &vap->va_ctime); |
|
vap->va_atime = vap->va_mtime = vap->va_ctime; |
vap->va_gen = 0; |
vap->va_gen = 0; |
vap->va_flags = 0; |
vap->va_flags = 0; |
vap->va_rdev = 0; |
vap->va_rdev = 0; |
Line 487 kernfs_getattr(v) |
|
Line 499 kernfs_getattr(v) |
|
vap->va_size = DEV_BSIZE; |
vap->va_size = DEV_BSIZE; |
} else { |
} else { |
const struct kern_target *kt = VTOKERN(vp)->kf_kt; |
const struct kern_target *kt = VTOKERN(vp)->kf_kt; |
int nbytes, total; |
size_t nread, total; |
#ifdef KERNFS_DIAGNOSTIC |
#ifdef KERNFS_DIAGNOSTIC |
printf("kernfs_getattr: stat target %s\n", kt->kt_name); |
printf("kernfs_getattr: stat target %s\n", kt->kt_name); |
#endif |
#endif |
Line 496 kernfs_getattr(v) |
|
Line 508 kernfs_getattr(v) |
|
vap->va_nlink = 1; |
vap->va_nlink = 1; |
vap->va_fileid = 1 + (kt - kern_targets); |
vap->va_fileid = 1 + (kt - kern_targets); |
total = 0; |
total = 0; |
while (buf = strbuf, |
do { |
nbytes = kernfs_xread(kt, total, &buf, sizeof(strbuf))) |
buf = strbuf; |
total += nbytes; |
error = kernfs_xread(kt, total, &buf, |
|
sizeof(strbuf), &nread); |
|
total += nread; |
|
} while (error == 0 && nread != 0); |
vap->va_size = total; |
vap->va_size = total; |
} |
} |
|
|
|
|
struct uio *uio = ap->a_uio; |
struct uio *uio = ap->a_uio; |
const struct kern_target *kt; |
const struct kern_target *kt; |
char strbuf[KSTRING], *buf; |
char strbuf[KSTRING], *buf; |
int off, len; |
off_t off; |
|
size_t len; |
int error; |
int error; |
|
|
if (vp->v_type == VDIR) |
if (vp->v_type == VDIR) |
|
|
#endif |
#endif |
|
|
off = uio->uio_offset; |
off = uio->uio_offset; |
#if 0 |
buf = strbuf; |
while (buf = strbuf, |
if ((error = kernfs_xread(kt, off, &buf, sizeof(strbuf), &len)) == 0) |
#else |
error = uiomove(buf, len, uio); |
if (buf = strbuf, |
return (error); |
#endif |
|
len = kernfs_xread(kt, off, &buf, sizeof(strbuf))) { |
|
if ((error = uiomove(buf, len, uio)) != 0) |
|
return (error); |
|
off += len; |
|
} |
|
return (0); |
|
} |
} |
|
|
int |
int |