version 1.50, 2011/06/02 16:19:13 |
version 1.51, 2011/06/20 17:54:48 |
|
|
#include <sys/ktrace.h> |
#include <sys/ktrace.h> |
#include <sys/ioctl.h> |
#include <sys/ioctl.h> |
#include <sys/ptrace.h> |
#include <sys/ptrace.h> |
|
#include <sys/socket.h> |
#include <sys/sysctl.h> |
#include <sys/sysctl.h> |
#define _KERNEL |
#define _KERNEL |
#include <sys/errno.h> |
#include <sys/errno.h> |
|
|
|
|
#include "ktrace.h" |
#include "ktrace.h" |
#include "kdump.h" |
#include "kdump.h" |
|
#include "kdump_subr.h" |
#include "extern.h" |
#include "extern.h" |
|
|
int timestamp, decimal, iohex, fancy = 1, tail, maxdata; |
int timestamp, decimal, iohex, fancy = 1, tail, maxdata; |
|
|
printf(")"); |
printf(")"); |
} |
} |
|
|
|
#define print_number(i, n, c) do { \ |
|
if (c) \ |
|
(void)putchar(c); \ |
|
if (decimal) \ |
|
(void)printf("%ld", (long)*i); \ |
|
else \ |
|
(void)printf("%#lx", (long)*i); \ |
|
i++; \ |
|
n--; \ |
|
c = ','; \ |
|
} while (0); |
|
|
static void |
static void |
ktrsyscall(struct ktr_syscall *ktr) |
ktrsyscall(struct ktr_syscall *ktr) |
{ |
{ |
int argsize = ktr->ktr_argsize; |
int narg = ktr->ktr_argsize / sizeof(register_t); |
register_t *ap; |
register_t *ap; |
|
|
if (ktr->ktr_code >= current->nsysnames || ktr->ktr_code < 0) |
if (ktr->ktr_code >= current->nsysnames || ktr->ktr_code < 0) |
|
|
(void)printf("%s", current->sysnames[ktr->ktr_code]); |
(void)printf("%s", current->sysnames[ktr->ktr_code]); |
ap = (register_t *)((char *)ktr + sizeof(struct ktr_syscall)); |
ap = (register_t *)((char *)ktr + sizeof(struct ktr_syscall)); |
(void)putchar('('); |
(void)putchar('('); |
if (argsize) { |
if (narg) { |
char c = '\0'; |
char c = '\0'; |
if (fancy) { |
if (fancy) { |
if (ktr->ktr_code == SYS_ioctl) { |
switch (ktr->ktr_code) { |
|
case SYS_ioctl: { |
const char *cp; |
const char *cp; |
|
|
if (decimal) |
if (decimal) |
|
|
else |
else |
(void)printf("%#lx", (long)*ap); |
(void)printf("%#lx", (long)*ap); |
ap++; |
ap++; |
argsize -= sizeof(register_t); |
narg--; |
if ((cp = ioctlname(*ap)) != NULL) |
if ((cp = ioctlname(*ap)) != NULL) |
(void)printf(",%s", cp); |
(void)printf(",%s", cp); |
else |
else |
ioctldecode(*ap); |
ioctldecode(*ap); |
c = ','; |
c = ','; |
ap++; |
ap++; |
argsize -= sizeof(register_t); |
narg--; |
} else if (ktr->ktr_code == SYS___sysctl) { |
break; |
|
} |
|
case SYS___sysctl: { |
int *np, n; |
int *np, n; |
|
|
n = ap[1]; |
n = ap[1]; |
|
|
|
|
c = ','; |
c = ','; |
ap += 2; |
ap += 2; |
argsize -= 2 * sizeof(register_t); |
narg -= 2; |
} else if (ktr->ktr_code == SYS_ptrace) { |
break; |
|
} |
|
case SYS_ptrace: |
if (*ap >= 0 && *ap < |
if (*ap >= 0 && *ap < |
sizeof(ptrace_ops) / sizeof(ptrace_ops[0])) |
sizeof(ptrace_ops) / sizeof(ptrace_ops[0])) |
(void)printf("%s", ptrace_ops[*ap]); |
(void)printf("%s", ptrace_ops[*ap]); |
|
|
} |
} |
c = ','; |
c = ','; |
ap++; |
ap++; |
argsize -= sizeof(register_t); |
narg--; |
|
break; |
|
case SYS_access: |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
accessmodename((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_chmod: |
|
case SYS_fchmod: |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
modename((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_fcntl: { |
|
int cmd; |
|
int arg; |
|
print_number(ap, narg, c); |
|
cmd = *ap; |
|
arg = *++ap; |
|
(void)putchar(','); |
|
fcntlcmdname(cmd, arg, decimal); |
|
ap++; |
|
narg -= 2; |
|
break; |
} |
} |
|
case SYS_flock: |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
flockname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_getrlimit: |
|
case SYS_setrlimit: |
|
rlimitname((int)*ap); |
|
ap++; |
|
narg--; |
|
c = ','; |
|
break; |
|
case SYS_getsockopt: |
|
case SYS_setsockopt: |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
sockoptlevelname((int)*ap, decimal); |
|
if ((int)*ap == SOL_SOCKET) { |
|
ap++; |
|
narg--; |
|
(void)putchar(','); |
|
sockoptname((int)*ap); |
|
} |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_kill: |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
signame((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_lseek: |
|
print_number(ap, narg, c); |
|
/* skip padding */ |
|
ap++; |
|
narg--; |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
whencename((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_madvise: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
madvisebehavname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_minherit: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
minheritname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_mlockall: |
|
mlockallname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_mmap: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
mmapprotname((int)*ap); |
|
(void)putchar(','); |
|
ap++; |
|
narg--; |
|
mmapflagsname((int)*ap); |
|
ap++; |
|
narg--; |
|
print_number(ap, narg, c); |
|
/* skip padding */ |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_mprotect: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
mmapprotname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_mquery: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
mmapprotname((int)*ap); |
|
ap++; |
|
narg--; |
|
(void)putchar(','); |
|
mmapflagsname((int)*ap); |
|
ap++; |
|
narg--; |
|
print_number(ap, narg, c); |
|
/* skip padding */ |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_msync: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
msyncflagsname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_msgctl: |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
shmctlname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_open: { |
|
int flags; |
|
int mode; |
|
print_number(ap, narg, c); |
|
flags = *ap; |
|
mode = *++ap; |
|
(void)putchar(','); |
|
flagsandmodename(flags, mode, decimal); |
|
ap++; |
|
narg -= 2; |
|
break; |
|
} |
|
case SYS_pread: |
|
case SYS_preadv: |
|
case SYS_pwrite: |
|
case SYS_pwritev: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
/* skip padding */ |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_recvmsg: |
|
case SYS_sendmsg: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
sendrecvflagsname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_recvfrom: |
|
case SYS_sendto: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
sendrecvflagsname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS___semctl: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
semctlname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_semget: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
semgetname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_shmat: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
shmatname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_shmctl: |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
shmctlname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_sigaction: |
|
signame((int)*ap); |
|
ap++; |
|
narg--; |
|
c = ','; |
|
break; |
|
case SYS_sigprocmask: |
|
sigprocmaskhowname((int)*ap); |
|
ap++; |
|
narg--; |
|
c = ','; |
|
break; |
|
case SYS_socket: { |
|
int sockdomain = (int)*ap; |
|
sockdomainname(sockdomain); |
|
ap++; |
|
narg--; |
|
(void)putchar(','); |
|
socktypename((int)*ap); |
|
ap++; |
|
narg--; |
|
if (sockdomain == PF_INET || |
|
sockdomain == PF_INET6) { |
|
(void)putchar(','); |
|
sockipprotoname((int)*ap); |
|
ap++; |
|
narg--; |
|
} |
|
c = ','; |
|
break; |
|
} |
|
case SYS_socketpair: |
|
sockdomainname((int)*ap); |
|
ap++; |
|
narg--; |
|
(void)putchar(','); |
|
socktypename((int)*ap); |
|
ap++; |
|
narg--; |
|
c = ','; |
|
break; |
|
case SYS_truncate: |
|
case SYS_ftruncate: |
|
print_number(ap, narg, c); |
|
/* skip padding */ |
|
ap++; |
|
narg--; |
|
break; |
|
case SYS_wait4: |
|
print_number(ap, narg, c); |
|
print_number(ap, narg, c); |
|
(void)putchar(','); |
|
wait4optname((int)*ap); |
|
ap++; |
|
narg--; |
|
break; |
|
} |
} |
} |
while (argsize) { |
while (narg) { |
if (c) |
if (c) |
putchar(c); |
putchar(c); |
if (decimal) |
if (decimal) |
|
|
(void)printf("%#lx", (long)*ap); |
(void)printf("%#lx", (long)*ap); |
c = ','; |
c = ','; |
ap++; |
ap++; |
argsize -= sizeof(register_t); |
narg--; |
} |
} |
} |
} |
(void)printf(")\n"); |
(void)printf(")\n"); |
|
|
fprintf(stderr, "usage: %s " |
fprintf(stderr, "usage: %s " |
"[-dlnRTXx] [-e emulation] [-f file] [-m maxdata] [-p pid]\n" |
"[-dlnRTXx] [-e emulation] [-f file] [-m maxdata] [-p pid]\n" |
"%*s[-t [ceinsw]]\n", |
"%*s[-t [ceinsw]]\n", |
__progname, sizeof("usage: ") + strlen(__progname), ""); |
__progname, (int)(sizeof("usage: ") + strlen(__progname)), ""); |
exit(1); |
exit(1); |
} |
} |
|
|