SCCS-vsn: sys/kern/kern_ktrace.c 8.4
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)kern_ktrace.c 8.3 (Berkeley) %G%
+ * @(#)kern_ktrace.c 8.4 (Berkeley) %G%
*/
#ifdef KTRACE
#include <sys/param.h>
*/
#ifdef KTRACE
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/file.h>
#include <sys/namei.h>
#include <sys/proc.h>
#include <sys/file.h>
#include <sys/namei.h>
#include <sys/malloc.h>
#include <sys/syslog.h>
#include <sys/malloc.h>
#include <sys/syslog.h>
+#include <sys/mount.h>
+#include <sys/syscallargs.h>
+
struct ktr_header *
ktrgetheader(type)
int type;
struct ktr_header *
ktrgetheader(type)
int type;
-ktrsyscall(vp, code, narg, args)
+void
+ktrsyscall(vp, code, argsize, args)
- int code, narg, args[];
+ int code, argsize;
+ register_t args[];
{
struct ktr_header *kth;
struct ktr_syscall *ktp;
{
struct ktr_header *kth;
struct ktr_syscall *ktp;
- register len = sizeof(struct ktr_syscall) + (narg * sizeof(int));
+ register len = sizeof(struct ktr_syscall) + argsize;
struct proc *p = curproc; /* XXX */
struct proc *p = curproc; /* XXX */
+ register_t *argp;
+ int i;
p->p_traceflag |= KTRFAC_ACTIVE;
kth = ktrgetheader(KTR_SYSCALL);
MALLOC(ktp, struct ktr_syscall *, len, M_TEMP, M_WAITOK);
ktp->ktr_code = code;
p->p_traceflag |= KTRFAC_ACTIVE;
kth = ktrgetheader(KTR_SYSCALL);
MALLOC(ktp, struct ktr_syscall *, len, M_TEMP, M_WAITOK);
ktp->ktr_code = code;
- ktp->ktr_narg = narg;
- argp = (int *)((char *)ktp + sizeof(struct ktr_syscall));
- for (i = 0; i < narg; i++)
+ ktp->ktr_argsize = argsize;
+ argp = (register_t *)((char *)ktp + sizeof(struct ktr_syscall));
+ for (i = 0; i < (argsize / sizeof *argp); i++)
*argp++ = args[i];
kth->ktr_buf = (caddr_t)ktp;
kth->ktr_len = len;
*argp++ = args[i];
kth->ktr_buf = (caddr_t)ktp;
kth->ktr_len = len;
p->p_traceflag &= ~KTRFAC_ACTIVE;
}
p->p_traceflag &= ~KTRFAC_ACTIVE;
}
ktrsysret(vp, code, error, retval)
struct vnode *vp;
int code, error, retval;
ktrsysret(vp, code, error, retval)
struct vnode *vp;
int code, error, retval;
p->p_traceflag &= ~KTRFAC_ACTIVE;
}
p->p_traceflag &= ~KTRFAC_ACTIVE;
}
ktrnamei(vp, path)
struct vnode *vp;
char *path;
ktrnamei(vp, path)
struct vnode *vp;
char *path;
p->p_traceflag &= ~KTRFAC_ACTIVE;
}
p->p_traceflag &= ~KTRFAC_ACTIVE;
}
ktrgenio(vp, fd, rw, iov, len, error)
struct vnode *vp;
int fd;
ktrgenio(vp, fd, rw, iov, len, error)
struct vnode *vp;
int fd;
p->p_traceflag &= ~KTRFAC_ACTIVE;
}
p->p_traceflag &= ~KTRFAC_ACTIVE;
}
ktrpsig(vp, sig, action, mask, code)
struct vnode *vp;
int sig;
ktrpsig(vp, sig, action, mask, code)
struct vnode *vp;
int sig;
p->p_traceflag &= ~KTRFAC_ACTIVE;
}
p->p_traceflag &= ~KTRFAC_ACTIVE;
}
ktrcsw(vp, out, user)
struct vnode *vp;
int out, user;
ktrcsw(vp, out, user)
struct vnode *vp;
int out, user;
/*
* ktrace system call
*/
/*
* ktrace system call
*/
-struct ktrace_args {
- char *fname;
- int ops;
- int facs;
- int pid;
-};
ktrace(curp, uap, retval)
struct proc *curp;
ktrace(curp, uap, retval)
struct proc *curp;
- register struct ktrace_args *uap;
- int *retval;
+ register struct ktrace_args /* {
+ syscallarg(char *) fname;
+ syscallarg(int) ops;
+ syscallarg(int) facs;
+ syscallarg(int) pid;
+ } */ *uap;
+ register_t *retval;
{
register struct vnode *vp = NULL;
register struct proc *p;
struct pgrp *pg;
{
register struct vnode *vp = NULL;
register struct proc *p;
struct pgrp *pg;
- int facs = uap->facs & ~KTRFAC_ROOT;
- int ops = KTROP(uap->ops);
- int descend = uap->ops & KTRFLAG_DESCEND;
+ int facs = SCARG(uap, facs) & ~KTRFAC_ROOT;
+ int ops = KTROP(SCARG(uap, ops));
+ int descend = SCARG(uap, ops) & KTRFLAG_DESCEND;
int ret = 0;
int error = 0;
struct nameidata nd;
int ret = 0;
int error = 0;
struct nameidata nd;
/*
* an operation which requires a file argument.
*/
/*
* an operation which requires a file argument.
*/
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, uap->fname, curp);
+ NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, fname),
+ curp);
if (error = vn_open(&nd, FREAD|FWRITE, 0)) {
curp->p_traceflag &= ~KTRFAC_ACTIVE;
return (error);
if (error = vn_open(&nd, FREAD|FWRITE, 0)) {
curp->p_traceflag &= ~KTRFAC_ACTIVE;
return (error);
+ if (SCARG(uap, pid) < 0) {
- pg = pgfind(-uap->pid);
+ pg = pgfind(-SCARG(uap, pid));
if (pg == NULL) {
error = ESRCH;
goto done;
if (pg == NULL) {
error = ESRCH;
goto done;
+ p = pfind(SCARG(uap, pid));
if (p == NULL) {
error = ESRCH;
goto done;
if (p == NULL) {
error = ESRCH;
goto done;