From: Wichert Akkerman Date: Thu, 10 Aug 2000 02:14:04 +0000 (+0000) Subject: test/clone.c: minor fixup X-Git-Tag: v4.5.18~1116 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=16a03d2e97415afe6cf34172a0aea97a95a0b160;p=strace test/clone.c: minor fixup Another bunch of patches from John Hughes merged: signal.c: + SVR4 printcontext(): sigset_t != sigset_t* + getcontext returns a value, so print on exit of syscall + add UC_FP to ucontext_flags for OS writers that can't spell + sys_signal(): special case SIG_{ERR,DFL,IGN} + decode_subcall(): only do subcall range checking when needed bunch of UnixWare updates aclocal.m4, acconfig.h, configure.in: add test for long long type --- diff --git a/ChangeLog b/ChangeLog index 2e0a8947..b6c9cd0c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2000-08-09 Wichert Akkerman + + * test/clone.c: minor fixup + * Another bunch of patches from John Hughes merged: + * signal.c: + + SVR4 printcontext(): sigset_t != sigset_t* + + getcontext returns a value, so print on exit of syscall + + add UC_FP to ucontext_flags for OS writers that can't spell + + sys_signal(): special case SIG_{ERR,DFL,IGN} + + decode_subcall(): only do subcall range checking when needed + * bunch of UnixWare updates + * aclocal.m4, acconfig.h, configure.in: add test for long long type + 2000-07-04 Wichert Akkerman * net.c: add SOL_PACKET and SOL_RAW socket options, update diff --git a/acconfig.h b/acconfig.h index 0adf5489..2a711d90 100644 --- a/acconfig.h +++ b/acconfig.h @@ -71,3 +71,6 @@ /* Define if stat64 is available in asm/stat.h. */ #undef HAVE_STAT64 + +/* Define if yor compilers know abuot long long */ +#undef HAVE_LONG_LONG diff --git a/aclocal.m4 b/aclocal.m4 index f665a41b..6854e87f 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -299,3 +299,18 @@ then AC_DEFINE(HAVE_STAT64) fi ]) + +dnl ### A macro to determine whether we have long long +AC_DEFUN(AC_LONG_LONG, +[AC_MSG_CHECKING(for long long) +AC_CACHE_VAL(ac_cv_type_long_long, +[AC_TRY_COMPILE([], +[long long x = 20;], +ac_cv_type_long_long=yes, +ac_cv_type_long_long=no)]) +AC_MSG_RESULT($ac_cv_type_long_long) +if test "$ac_cv_type_long_long" = yes +then + AC_DEFINE(HAVE_LONG_LONG) +fi +]) diff --git a/configure.in b/configure.in index 75a1a191..c59e5834 100644 --- a/configure.in +++ b/configure.in @@ -143,6 +143,7 @@ AC_TYPE_GETGROUPS AC_HEADER_MAJOR AC_SIG_ATOMIC_T AC_STAT64 +AC_LONG_LONG if test x$OPSYS != xLINUX; then AC_CHECK_LIB(nsl, main) fi diff --git a/defs.h b/defs.h index f4d4c48d..906d62e2 100644 --- a/defs.h +++ b/defs.h @@ -158,7 +158,7 @@ extern int mp_ioctl (int f, int c, void *a, int s); #define IOCTL_STATUS(t) \ pread (t->pfd_stat, &t->status, sizeof t->status, 0) #define IOCTL_WSTOP(t) \ - (IOCTL (t->pfd, PCWSTOP, NULL) < 0 ? -1 : \ + (IOCTL (t->pfd, PCWSTOP, (char *)NULL) < 0 ? -1 : \ IOCTL_STATUS (t)) #define PR_WHY pr_lwp.pr_why #define PR_WHAT pr_lwp.pr_what @@ -194,6 +194,9 @@ struct tcb { long u_arg[MAX_ARGS]; /* System call arguments */ int u_error; /* Error code */ long u_rval; /* (first) return value */ +#ifdef HAVE_LONG_LONG + long long u_lrval; /* long long return value */ +#endif FILE *outf; /* Output file for this process */ const char *auxstr; /* Auxiliary info from syscall (see RVAL_STR) */ struct timeval stime; /* System time usage as of last process wait */ @@ -266,6 +269,8 @@ struct xlat { #define RVAL_HEX 001 /* hex format */ #define RVAL_OCTAL 002 /* octal format */ #define RVAL_UDECIMAL 003 /* unsigned decimal format */ +#define RVAL_LDECIMAL 004 /* long long format */ + /* Maybe add long long hex, octal, unsigned */ #define RVAL_MASK 007 /* mask for these values */ #define RVAL_STR 010 /* Print `auxstr' field after return val */ diff --git a/file.c b/file.c index ac512b19..e285c587 100644 --- a/file.c +++ b/file.c @@ -1741,3 +1741,20 @@ struct tcb *tcp; } #endif /* HAVE_SYS_ASYNCH_H */ + +#if UNIXWARE >= 7 +int +sys_lseek64 (tcp) +struct tcb *tcp; +{ + if (entering(tcp)) { + long long offset = * (long long *) & tcp->u_arg [1]; + if (tcp->u_arg[3] == SEEK_SET) + tprintf("%ld, %llu, ", tcp->u_arg[0], offset); + else + tprintf("%ld, %lld, ", tcp->u_arg[0], offset); + printxval(whence, tcp->u_arg[3], "SEEK_???"); + } + return RVAL_LDECIMAL; +} +#endif diff --git a/net.c b/net.c index 2a20f875..db88c6d6 100644 --- a/net.c +++ b/net.c @@ -72,6 +72,10 @@ #define PF_UNSPEC AF_UNSPEC #endif +#if UNIXWARE >= 7 +#define HAVE_SENDMSG 1 /* HACK - *FIXME* */ +#endif + #ifdef LINUX /* Under Linux these are enums so we can't test for them with ifdef. */ #define IPPROTO_EGP IPPROTO_EGP @@ -476,6 +480,7 @@ static struct xlat icmpfilterflags[] = { }; #endif /* SOL_RAW */ + void printsock(tcp, addr, addrlen) struct tcb *tcp; @@ -1164,3 +1169,157 @@ struct tcb *tcp; } return 0; } + +#if UNIXWARE >= 7 + +static struct xlat sock_version[] = { + { __NETLIB_UW211_SVR4, "UW211_SVR4" }, + { __NETLIB_UW211_XPG4, "UW211_XPG4" }, + { __NETLIB_GEMINI_SVR4, "GEMINI_SVR4" }, + { __NETLIB_GEMINI_XPG4, "GEMINI_XPG4" }, + { __NETLIB_FP1_SVR4, "FP1_SVR4" }, + { __NETLIB_FP1_XPG4, "FP1_XPG4" }, + { 0, NULL }, +}; + + +int +netlib_call(tcp, func) +struct tcb *tcp; +int (*func) (); +{ + if (entering(tcp)) { + int i; + printxval (sock_version, tcp->u_arg[0], "__NETLIB_???"); + tprintf(", "); + --tcp->u_nargs; + for (i = 0; i < tcp->u_nargs; i++) + tcp->u_arg[i] = tcp->u_arg[i + 1]; + return func (tcp); + + } + + return func (tcp); +} + +int +sys_xsocket(tcp) +struct tcb *tcp; +{ + return netlib_call (tcp, sys_socket); +} + +int +sys_xsocketpair(tcp) +struct tcb *tcp; +{ + return netlib_call (tcp, sys_socketpair); +} + +int +sys_xbind(tcp) +struct tcb *tcp; +{ + return netlib_call (tcp, sys_bind); +} + +int +sys_xconnect(tcp) +struct tcb *tcp; +{ + return netlib_call (tcp, sys_connect); +} + +int +sys_xlisten(tcp) +struct tcb *tcp; +{ + return netlib_call (tcp, sys_listen); +} + +int +sys_xaccept(tcp) +struct tcb *tcp; +{ + return netlib_call (tcp, sys_accept); +} + +int +sys_xsendmsg(tcp) +struct tcb *tcp; +{ + return netlib_call (tcp, sys_sendmsg); +} + +int +sys_xrecvmsg(tcp) +struct tcb *tcp; +{ + return netlib_call (tcp, sys_recvmsg); +} + +int +sys_xgetsockaddr(tcp) +struct tcb *tcp; +{ + if (entering(tcp)) { + printxval (sock_version, tcp->u_arg[0], "__NETLIB_???"); + tprintf(", "); + if (tcp->u_arg[1] == 0) { + tprintf ("LOCALNAME, "); + } + else if (tcp->u_arg[1] == 1) { + tprintf ("REMOTENAME, "); + } + else { + tprintf ("%ld, ", tcp->u_arg [1]); + } + tprintf ("%ld, ", tcp->u_arg [2]); + } + else { + if (tcp->u_arg[3] == 0 || syserror(tcp)) { + tprintf("%#lx", tcp->u_arg[3]); + } else { + printsock(tcp, tcp->u_arg[3], tcp->u_arg[4]); + } + tprintf(", "); + printnum(tcp, tcp->u_arg[4], "%lu"); + } + + return 0; + +} + +#if 0 + +int +sys_xsetsockaddr(tcp) +struct tcb *tcp; +{ + return netlib_call (tcp, sys_setsockaddr); +} + +#endif + +int +sys_xgetsockopt(tcp) +struct tcb *tcp; +{ + return netlib_call (tcp, sys_getsockopt); +} + +int +sys_xsetsockopt(tcp) +struct tcb *tcp; +{ + return netlib_call (tcp, sys_setsockopt); +} + +int +sys_xshutdown(tcp) +struct tcb *tcp; +{ + return netlib_call (tcp, sys_shutdown); +} + +#endif diff --git a/signal.c b/signal.c index b786edf9..90ac5fe8 100644 --- a/signal.c +++ b/signal.c @@ -665,6 +665,7 @@ struct tcb *tcp; { if (entering(tcp)) { printsignal(tcp->u_arg[0]); + tprintf(", "); switch (tcp->u_arg[1]) { case (int) SIG_ERR: tprintf("SIG_ERR"); @@ -690,6 +691,29 @@ struct tcb *tcp; #endif /* !SVR4 */ tprintf("%#lx", tcp->u_arg[1]); } + return 0; + } + else { + switch (tcp->u_rval) { + case (int) SIG_ERR: + tcp->auxstr = "SIG_ERR"; break; + case (int) SIG_DFL: + tcp->auxstr = "SIG_DFL"; break; + case (int) SIG_IGN: + tcp->auxstr = "SIG_IGN"; break; + default: + tcp->auxstr = NULL; + } + return RVAL_HEX | RVAL_STR; + } +} + +int +sys_sighold(tcp) +struct tcb *tcp; +{ + if (entering(tcp)) { + printsignal(tcp->u_arg[0]); } return 0; } @@ -1020,8 +1044,10 @@ struct tcb *tcp; { ucontext_t uc; - if (entering(tcp)) { - if (!tcp->u_arg[0]) + if (exiting(tcp)) { + if (tcp->u_error) + tprintf("%#lx", tcp->u_arg[0]); + else if (!tcp->u_arg[0]) tprintf("NULL"); else if (umove(tcp, tcp->u_arg[0], &uc) < 0) tprintf("{...}"); diff --git a/strace.c b/strace.c index 4a468778..f96eaa04 100644 --- a/strace.c +++ b/strace.c @@ -660,7 +660,7 @@ int attaching; } } /* Stop the process so that we own the stop. */ - if (IOCTL(tcp->pfd, PIOCSTOP, NULL) < 0) { + if (IOCTL(tcp->pfd, PIOCSTOP, (char *)NULL) < 0) { perror("strace: PIOCSTOP"); return -1; } diff --git a/svr4/dummy.h b/svr4/dummy.h index 61e3e85b..e026c6f1 100644 --- a/svr4/dummy.h +++ b/svr4/dummy.h @@ -125,12 +125,6 @@ #define sys_timer_settime printargs #define sys_timer_gettime printargs #define sys_timer_getoverrun printargs -#define sys_signal printargs -#define sys_sigset printargs -#define sys_sighold printargs -#define sys_sigrelse printargs -#define sys_sigignore printargs -#define sys_sigpause printargs #define sys_msgctl printargs #define sys_msgget printargs #define sys_msgrcv printargs @@ -148,6 +142,7 @@ #define sys_sysfs1 printargs #define sys_sysfs2 printargs #define sys_sysfs3 printargs +#define sys_xsetsockaddr printargs /* like another call */ #define sys_lchown sys_chown @@ -165,6 +160,10 @@ #define sys_BSDgetpgrp sys_getpgrp #define sys_BSDsetpgrp sys_setpgrp #define sys_waitsys sys_waitid +#define sys_sigset sys_signal +#define sys_sigrelse sys_sighold +#define sys_sigignore sys_sighold +#define sys_sigpause sys_sighold /* printargs does the right thing */ #define sys_sync printargs diff --git a/svr4/syscall.h b/svr4/syscall.h index f663cb26..a6c347f0 100644 --- a/svr4/syscall.h +++ b/svr4/syscall.h @@ -301,6 +301,27 @@ extern int sys_aclipc(); #ifdef HAVE_SYS_DOOR_H extern int sys_door(); #endif +#if UNIXWARE >= 2 +extern int sys_truncate(); +extern int sys_ftruncate(); +extern int sys_getksym (); +#endif +#if UNIXWARE >= 7 +extern int sys_lseek64 (); +extern int sys_xsocket (); +extern int sys_xsocketpair (); +extern int sys_xbind (); +extern int sys_xconnect (); +extern int sys_xlisten (); +extern int sys_xaccept (); +extern int sys_xrecvmsg (); +extern int sys_xsendmsg (); +extern int sys_xgetsockaddr (); +extern int sys_xsetsockaddr (); +extern int sys_xgetsockopt (); +extern int sys_xsetsockopt (); +extern int sys_xshutdown (); +#endif #endif /* !MIPS */ #ifdef MIPS diff --git a/svr4/syscallent.h b/svr4/syscallent.h index 429f3e09..723c2160 100644 --- a/svr4/syscallent.h +++ b/svr4/syscallent.h @@ -409,10 +409,10 @@ { -1, 0, printargs, "unblock" }, /* 186 */ { -1, 0, printargs, "cancelblock" }, /* 187 */ { -1, 0, printargs, "SYS_188" }, /* 188 */ - { -1, 0, sys_pread, "pread" }, /* 189 */ - { -1, 0, sys_pwrite, "pwrite" }, /* 190 */ - { -1, 0, printargs, "truncate" }, /* 191 */ - { -1, 0, printargs, "ftruncate" }, /* 192 */ + { -1, TF, sys_pread, "pread" }, /* 189 */ + { -1, TF, sys_pwrite, "pwrite" }, /* 190 */ + { -1, TF, sys_truncate, "truncate" }, /* 191 */ + { -1, TF, sys_ftruncate, "ftruncate" }, /* 192 */ { -1, 0, printargs, "lwpkill" }, /* 193 */ { -1, 0, printargs, "sigwait" }, /* 194 */ { -1, 0, printargs, "fork1" }, /* 195 */ @@ -422,7 +422,7 @@ { -1, 0, printargs, "modpath" }, /* 199 */ { -1, 0, printargs, "modstat" }, /* 200 */ { -1, 0, printargs, "modadm" }, /* 201 */ - { -1, 0, printargs, "getksym" }, /* 202 */ + { -1, 0, sys_getksym, "getksym" }, /* 202 */ { -1, 0, printargs, "lwpsuspend" }, /* 203 */ { -1, 0, printargs, "lwpcontinue" }, /* 204 */ { -1, 0, printargs, "priocntllst" }, /* 205 */ @@ -519,6 +519,41 @@ { -1, 0, printargs, "SYS_213" }, /* 213 */ { -1, 0, printargs, "SYS_214" }, /* 214 */ { -1, 0, printargs, "SYS_215" }, /* 215 */ +#if UNIXWARE >= 7 + { -1, 0, printargs, "fstatvfs64" }, /* 216 */ + { -1, 0, printargs, "statvfs64" }, /* 217 */ + { -1, 0, printargs, "ftruncate64" }, /* 218 */ + { -1, 0, printargs, "truncate64" }, /* 219 */ + { -1, 0, printargs, "getrlimit64" }, /* 220 */ + { -1, 0, printargs, "setrlimit64" }, /* 221 */ + { -1, TF, sys_lseek64, "lseek64" }, /* 222 */ + { -1, 0, printargs, "mmap64" }, /* 223 */ + { -1, 0, printargs, "pread64" }, /* 224 */ + { -1, 0, printargs, "pwrite64" }, /* 225 */ + { -1, 0, printargs, "creat64" }, /* 226 */ + { -1, 0, printargs, "dshmsys" }, /* 227 */ + { -1, 0, printargs, "invlpg" }, /* 228 */ + { -1, 0, printargs, "rfork1" }, /* 229 */ + { -1, 0, printargs, "rforkall" }, /* 230 */ + { -1, 0, printargs, "rexecve" }, /* 231 */ + { -1, 0, printargs, "migrate" }, /* 232 */ + { -1, 0, printargs, "kill3" }, /* 233 */ + { -1, 0, printargs, "ssisys" }, /* 234 */ + { -1, TN, sys_xaccept, "xaccept" }, /* 235 */ + { -1, TN, sys_xbind, "xbind" }, /* 236 */ + { -1, TN, sys_xbind, "xbindresport" }, /* 237 */ + { -1, TN, sys_xconnect, "xconnect" }, /* 238 */ + { -1, TN, sys_xgetsockaddr, "xgetsockaddr" }, /* 239 */ + { -1, TN, sys_xgetsockopt, "xgetsockopt" }, /* 240 */ + { -1, TN, sys_xlisten, "xlisten" }, /* 241 */ + { -1, TN, sys_xrecvmsg, "xrecvmsg" }, /* 242 */ + { -1, TN, sys_xsendmsg, "xsendmsg" }, /* 243 */ + { -1, TN, sys_xsetsockaddr, "xsetsockaddr" }, /* 244 */ + { -1, TN, sys_xsetsockopt, "xsetsockopt" }, /* 245 */ + { -1, TN, sys_xshutdown, "xshutdown" }, /* 246 */ + { -1, TN, sys_xsocket, "xsocket" }, /* 247 */ + { -1, TN, sys_xsocketpair, "xsocketpair" }, /* 248 */ +#else { -1, 0, printargs, "SYS_216" }, /* 216 */ { -1, 0, printargs, "SYS_217" }, /* 217 */ { -1, 0, printargs, "SYS_218" }, /* 218 */ @@ -552,6 +587,7 @@ { -1, 0, printargs, "SYS_246" }, /* 246 */ { -1, 0, printargs, "SYS_247" }, /* 247 */ { -1, 0, printargs, "SYS_248" }, /* 248 */ +#endif { -1, 0, printargs, "SYS_249" }, /* 249 */ { -1, 0, printargs, "SYS_250" }, /* 250 */ #endif /* !MIPS */ diff --git a/syscall.c b/syscall.c index 29a805e3..96424460 100644 --- a/syscall.c +++ b/syscall.c @@ -464,11 +464,10 @@ int nsubcalls; enum subcall_style style; { int i, addr, mask, arg; - - if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= nsubcalls) - return; switch (style) { case shift_style: + if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= nsubcalls) + return; tcp->scno = subcall + tcp->u_arg[0]; if (sysent[tcp->scno].nargs != -1) tcp->u_nargs = sysent[tcp->scno].nargs; @@ -478,6 +477,8 @@ enum subcall_style style; tcp->u_arg[i] = tcp->u_arg[i + 1]; break; case deref_style: + if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= nsubcalls) + return; tcp->scno = subcall + tcp->u_arg[0]; addr = tcp->u_arg[1]; for (i = 0; i < sysent[tcp->scno].nargs; i++) { @@ -490,9 +491,11 @@ enum subcall_style style; break; case mask_style: mask = (tcp->u_arg[0] >> 8) & 0xff; - tcp->u_arg[0] &= 0xff; for (i = 0; mask; i++) mask >>= 1; + if (i >= nsubcalls) + return; + tcp->u_arg[0] &= 0xff; tcp->scno = subcall + i; if (sysent[tcp->scno].nargs != -1) tcp->u_nargs = sysent[tcp->scno].nargs; @@ -500,7 +503,10 @@ enum subcall_style style; case door_style: /* * Oh, yuck. The call code is the *sixth* argument. + * (don't you mean the *last* argument? - JH) */ + if (tcp->u_arg[5] < 0 || tcp->u_arg[5] >= nsubcalls) + return; tcp->scno = subcall + tcp->u_arg[5]; if (sysent[tcp->scno].nargs != -1) tcp->u_nargs = sysent[tcp->scno].nargs; @@ -1029,6 +1035,11 @@ struct tcb *tcp; } else { tcp->u_rval = tcp->status.PR_REG[EAX]; +#ifdef HAVE_LONG_LONG + tcp->u_lrval = + ((unsigned long long) tcp->status.PR_REG[EDX] << 32) + + tcp->status.PR_REG[EAX]; +#endif u_error = 0; } #endif /* I386 */ @@ -1337,6 +1348,12 @@ struct tcb *tcp; case RVAL_DECIMAL: tprintf("= %ld", tcp->u_rval); break; +#ifdef HAVE_LONG_LONG + case RVAL_LDECIMAL: + tprintf ("= %lld", tcp->u_lrval); + break; + /* LHEX, LOCTAL, LUDECIMAL... */ +#endif default: fprintf(stderr, "invalid rval format\n"); diff --git a/system.c b/system.c index 218e1379..f16b711c 100644 --- a/system.c +++ b/system.c @@ -1903,3 +1903,48 @@ struct tcb *tcp; } #endif + +#if UNIXWARE >= 2 + +#include +#include + +static struct xlat ksym_flags[] = { + { STT_NOTYPE, "STT_NOTYPE" }, + { STT_FUNC, "STT_FUNC" }, + { STT_OBJECT, "STT_OBJECT" }, + { 0, NULL }, +}; + +int +sys_getksym(tcp) +struct tcb *tcp; +{ + if (entering (tcp)) { + printstr(tcp, tcp->u_arg[0], -1); + tprintf(", "); + } + else { + if (syserror(tcp)) { + tprintf("%#lx, %#lx", + tcp->u_arg[1], tcp->u_arg[2]); + } + else { + int val; + printnum (tcp, tcp->u_arg[1], "%#lx"); + tprintf(", "); + if (umove(tcp, tcp->u_arg[2], &val) < 0) { + tprintf("%#lx", tcp->u_arg[2]); + } + else { + tprintf("["); + printxval (ksym_flags, val, "STT_???"); + tprintf("]"); + } + } + } + + return 0; +} + +#endif diff --git a/test/clone.c b/test/clone.c index 4fb66130..1395b6b9 100644 --- a/test/clone.c +++ b/test/clone.c @@ -10,7 +10,7 @@ int main() { char stack[4096]; - if (clone(child, stack+4000, CLONE_VM|CLONE_FS|CLONE_FILES, NULL) == 0) + if (clone(child, stack+4000, CLONE_VM|CLONE_FS|CLONE_FILES, NULL) != 0) write(1, "original\n", 9); exit(0); }