#include <sys/uio.h>
#include <sys/syslimits.h>
#include <sys/signal.h>
#include <sys/time.h>
#define KTROP_SET 0
#define KTROP_CLEAR 1
#define KTROP_CLEARFILE 2
#define KTROP(o) ((o)&3)
#define KTRFLAG_DESCEND 4
struct ktr_header {
uint ktr_type;
pid_t ktr_pid;
pid_t ktr_tid;
struct timespec ktr_time;
char ktr_comm[_MAXCOMLEN];
size_t ktr_len;
};
#define KTR_START 0x4b545200
#define KTR_SYSCALL 1
struct ktr_syscall {
int ktr_code;
int ktr_argsize;
};
#define KTR_SYSRET 2
struct ktr_sysret {
int ktr_code;
int ktr_error;
};
#define KTR_NAMEI 3
#define KTR_GENIO 4
struct ktr_genio {
int ktr_fd;
enum uio_rw ktr_rw;
};
#define KTR_PSIG 5
struct ktr_psig {
int signo;
sig_t action;
int mask;
int code;
siginfo_t si;
};
#define KTR_STRUCT 8
struct sockaddr;
struct stat;
#define KTR_USER 9
#define KTR_USER_MAXIDLEN 20
#define KTR_USER_MAXLEN 2048
struct ktr_user {
char ktr_id[KTR_USER_MAXIDLEN];
};
#define KTR_EXECARGS 10
#define KTR_EXECENV 11
#define KTR_PLEDGE 12
struct ktr_pledge {
int error;
int syscall;
uint64_t code;
};
#define KTR_PINSYSCALL 13
struct ktr_pinsyscall {
int error;
int syscall;
vaddr_t addr;
};
#define KTRFAC_MASK 0x00ffffff
#define KTRFAC_SYSCALL (1<<KTR_SYSCALL)
#define KTRFAC_SYSRET (1<<KTR_SYSRET)
#define KTRFAC_NAMEI (1<<KTR_NAMEI)
#define KTRFAC_GENIO (1<<KTR_GENIO)
#define KTRFAC_PSIG (1<<KTR_PSIG)
#define KTRFAC_STRUCT (1<<KTR_STRUCT)
#define KTRFAC_USER (1<<KTR_USER)
#define KTRFAC_EXECARGS (1<<KTR_EXECARGS)
#define KTRFAC_EXECENV (1<<KTR_EXECENV)
#define KTRFAC_PLEDGE (1<<KTR_PLEDGE)
#define KTRFAC_PINSYSCALL (1<<KTR_PINSYSCALL)
#define KTRFAC_ROOT 0x80000000U
#define KTRFAC_INHERIT 0x40000000
#ifndef _KERNEL
#include <sys/cdefs.h>
__BEGIN_DECLS
int ktrace(const char *, int, int, pid_t);
int utrace(const char *, const void *, size_t);
__END_DECLS
#else
#define KTRPOINT(p, type) \
((p)->p_p->ps_traceflag & (1<<(type)) && ((p)->p_flag & P_INKTR) == 0)
void ktrgenio(struct proc *, int, enum uio_rw, struct iovec *, ssize_t);
void ktrnamei(struct proc *, char *);
void ktrpsig(struct proc *, int, sig_t, int, int, siginfo_t *);
void ktrsyscall(struct proc *, register_t, size_t, register_t []);
void ktrsysret(struct proc *, register_t, int, const register_t [2]);
int ktruser(struct proc *, const char *, const void *, size_t);
void ktrexec(struct proc *, int, const char *, ssize_t);
void ktrpledge(struct proc *, int, uint64_t, int);
void ktrpinsyscall(struct proc *, int, int, vaddr_t);
void ktrcleartrace(struct process *);
void ktrsettrace(struct process *, int, struct vnode *, struct ucred *);
void ktrstruct(struct proc *, const char *, const void *, size_t);
#define ktrabstimespec(p, s) \
ktrstruct(p, "abstimespec", s, sizeof(struct timespec))
#define ktrabstimeval(p, s) \
ktrstruct(p, "abstimeval", s, sizeof(struct timeval))
#define ktrcmsghdr(p, s, l) \
ktrstruct(p, "cmsghdr", s, l)
#define ktrfds(p, s, c) \
ktrstruct(p, "fds", s, (c) * sizeof(int))
#define ktrfdset(p, s, l) \
ktrstruct(p, "fdset", s, l)
#define ktrflock(p, s) \
ktrstruct(p, "flock", s, sizeof(struct flock))
#define ktriovec(p, s, c) \
ktrstruct(p, "iovec", s, (c) * sizeof(struct iovec))
#define ktritimerval(p, s) \
ktrstruct(p, "itimerval", s, sizeof(struct itimerval))
#define ktrevent(p, s, c) \
ktrstruct(p, "kevent", s, (c) * sizeof(struct kevent))
#define ktrmmsghdr(p, s) \
ktrstruct(p, "mmsghdr", s, sizeof(struct mmsghdr))
#define ktrmsghdr(p, s) \
ktrstruct(p, "msghdr", s, sizeof(struct msghdr))
#define ktrpollfd(p, s, c) \
ktrstruct(p, "pollfd", s, (c) * sizeof(struct pollfd))
#define ktrquota(p, s) \
ktrstruct(p, "quota", s, sizeof(struct dqblk))
#define ktrreltimespec(p, s) \
ktrstruct(p, "reltimespec", s, sizeof(struct timespec))
#define ktrreltimeval(p, s) \
ktrstruct(p, "reltimeval", s, sizeof(struct timeval))
#define ktrrlimit(p, s) \
ktrstruct(p, "rlimit", s, sizeof(struct rlimit))
#define ktrrusage(p, s) \
ktrstruct(p, "rusage", s, sizeof(struct rusage))
#define ktrsigaction(p, s) \
ktrstruct(p, "sigaction", s, sizeof(struct sigaction))
#define ktrsiginfo(p, s) \
ktrstruct(p, "siginfo", s, sizeof(siginfo_t))
#define ktrsockaddr(p, s, l) \
ktrstruct(p, "sockaddr", s, l)
#define ktrstat(p, s) \
ktrstruct(p, "stat", s, sizeof(struct stat))
#endif