version 1.102, 2015/07/19 02:52:35 |
version 1.103, 2015/07/19 04:45:25 |
|
|
static void ktrpsig(struct ktr_psig *); |
static void ktrpsig(struct ktr_psig *); |
static void ktrsyscall(struct ktr_syscall *, size_t); |
static void ktrsyscall(struct ktr_syscall *, size_t); |
static const char *kresolvsysctl(int, const int *); |
static const char *kresolvsysctl(int, const int *); |
static void ktrsysret(struct ktr_sysret *); |
static void ktrsysret(struct ktr_sysret *, size_t); |
static void ktruser(struct ktr_user *, size_t); |
static void ktruser(struct ktr_user *, size_t); |
static void setemul(const char *); |
static void setemul(const char *); |
static void usage(void); |
static void usage(void); |
|
|
ktrsyscall((struct ktr_syscall *)m, ktrlen); |
ktrsyscall((struct ktr_syscall *)m, ktrlen); |
break; |
break; |
case KTR_SYSRET: |
case KTR_SYSRET: |
ktrsysret((struct ktr_sysret *)m); |
ktrsysret((struct ktr_sysret *)m, ktrlen); |
break; |
break; |
case KTR_NAMEI: |
case KTR_NAMEI: |
ktrnamei(m, ktrlen); |
ktrnamei(m, ktrlen); |
|
|
} |
} |
|
|
static void |
static void |
ktrsysret(struct ktr_sysret *ktr) |
ktrsysret(struct ktr_sysret *ktr, size_t ktrlen) |
{ |
{ |
register_t ret = ktr->ktr_retval; |
register_t ret = 0; |
|
long long retll; |
int error = ktr->ktr_error; |
int error = ktr->ktr_error; |
int code = ktr->ktr_code; |
int code = ktr->ktr_code; |
|
|
|
if (ktrlen < sizeof(*ktr)) |
|
errx(1, "sysret length %zu < ktr header length %zu", |
|
ktrlen, sizeof(*ktr)); |
|
ktrlen -= sizeof(*ktr); |
|
if (error == 0) { |
|
if (ktrlen == sizeof(ret)) { |
|
memcpy(&ret, ktr+1, sizeof(ret)); |
|
retll = ret; |
|
} else if (ktrlen == sizeof(retll)) |
|
memcpy(&retll, ktr+1, sizeof(retll)); |
|
else |
|
errx(1, "sysret bogus length %zu", ktrlen); |
|
} |
|
|
if (code >= current->nsysnames || code < 0) |
if (code >= current->nsysnames || code < 0) |
(void)printf("[%d] ", code); |
(void)printf("[%d] ", code); |
else { |
else { |
(void)printf("%s ", current->sysnames[code]); |
(void)printf("%s ", current->sysnames[code]); |
if (ret > 0 && (strcmp(current->sysnames[code], "fork") == 0 || |
if (error == 0 && ret > 0 && |
|
(strcmp(current->sysnames[code], "fork") == 0 || |
strcmp(current->sysnames[code], "vfork") == 0 || |
strcmp(current->sysnames[code], "vfork") == 0 || |
strcmp(current->sysnames[code], "__tfork") == 0 || |
strcmp(current->sysnames[code], "__tfork") == 0 || |
strcmp(current->sysnames[code], "clone") == 0)) |
strcmp(current->sysnames[code], "clone") == 0)) |
|
|
if (error == 0) { |
if (error == 0) { |
if (fancy) { |
if (fancy) { |
switch (current == &emulations[0] ? code : -1) { |
switch (current == &emulations[0] ? code : -1) { |
|
case SYS_lseek: |
|
(void)printf("%lld", retll); |
|
if (retll < 0 || retll > 9) |
|
(void)printf("/%#llx", retll); |
|
break; |
case SYS_sigprocmask: |
case SYS_sigprocmask: |
case SYS_sigpending: |
case SYS_sigpending: |
sigset(ret); |
sigset(ret); |
|
|
} |
} |
} else { |
} else { |
if (decimal) |
if (decimal) |
(void)printf("%ld", (long)ret); |
(void)printf("%lld", retll); |
else |
else |
(void)printf("%#lx", (long)ret); |
(void)printf("%#llx", retll); |
} |
} |
} else if (error == ERESTART) |
} else if (error == ERESTART) |
(void)printf("RESTART"); |
(void)printf("RESTART"); |