Add support for FreeBSD. Patch by Piego Pettenò http://bugs.gentoo.org/93657 --- strace-4.5.11/configure.ac +++ strace-4.5.11/configure.ac @@ -192,16 +192,24 @@ fi AC_CHECK_FUNCS(sigaction strerror strsignal pread sys_siglist _sys_siglist getdents mctl prctl sendmsg inet_ntop if_indextoname) -AC_CHECK_HEADERS([sys/reg.h sys/filio.h sys/acl.h sys/asynch.h sys/door.h stropts.h sys/conf.h sys/stream.h sys/tihdr.h sys/tiuser.h sys/sysconfig.h ioctls.h sys/ioctl.h sys/ptrace.h termio.h linux/ptrace.h asm/reg.h sys/uio.h sys/aio.h poll.h sys/poll.h sys/vfs.h asm/sysmips.h linux/utsname.h sys/nscsys.h mqueue.h sys/epoll.h], [], []) +AC_CHECK_HEADERS([sys/reg.h sys/filio.h sys/acl.h sys/asynch.h sys/door.h stropts.h sys/conf.h sys/stream.h sys/tihdr.h sys/tiuser.h sys/sysconfig.h ioctls.h sys/ioctl.h sys/ptrace.h termio.h linux/ptrace.h asm/reg.h sys/uio.h sys/aio.h poll.h sys/poll.h sys/vfs.h asm/sysmips.h linux/utsname.h sys/nscsys.h mqueue.h sys/epoll.h sys/param.h], [], []) AC_CHECK_HEADERS([linux/icmp.h linux/in6.h linux/netlink.h linux/if_packet.h], [], [], [#include ]) AC_CHECK_HEADERS([asm/sigcontext.h], [], [], [#include ]) -AC_CHECK_HEADERS([netinet/tcp.h netinet/udp.h],,, [#include ]) +AC_CHECK_HEADERS([netinet/tcp.h netinet/udp.h],,, +[#include +#include ]) + +AC_CHECK_HEADERS([sys/mount.h],,, +[#include +#include ]) AC_MP_PROCFS AC_POLLABLE_PROCFS -AC_CHECK_MEMBERS([struct msghdr.msg_control],,, [#include ]) +AC_CHECK_MEMBERS([struct msghdr.msg_control],,, +[#include +#include ]) AC_STRUCT_PR_SYSCALL AC_CHECK_MEMBERS([struct T_conn_res.QUEUE_ptr, @@ -209,6 +217,19 @@ [#include #include ]) +AC_CHECK_MEMBERS([struct fsid.val, + struct fsid.__val],,, +[#include +#ifdef HAVE_SYS_PARAM_H +# include +#endif +#ifdef HAVE_SYS_VFS_H +# include +#endif +#ifdef HAVE_SYS_MOUNT_H +# include +#endif]) + AC_CHECK_TYPES([struct __old_kernel_stat],,, [#include ]) AC_CHECK_TYPES([struct pt_all_user_regs, struct ia64_fpreg],,, --- strace-4.5.11/file.c +++ strace-4.5.11/file.c @@ -200,6 +200,10 @@ #include #endif +#if defined(HAVE_STRUCT_FSID_VAL) && ! defined(HAVE_STRUCT_FSID___VAL) +#define __val val +#endif + /* * This is a really dirty trick but it should always work. Traditional * Unix says r/w/rw are 0/1/2, so we make them true flags 1/2/3 by @@ -2495,6 +2499,8 @@ } +#ifdef LINUX + static const struct xlat advise[] = { { POSIX_FADV_NORMAL, "POSIX_FADV_NORMAL" }, { POSIX_FADV_RANDOM, "POSIX_FADV_RANDOM" }, @@ -2506,7 +2512,6 @@ }; -#ifdef LINUX int sys_fadvise64(tcp) struct tcb *tcp; @@ -2524,7 +2529,6 @@ } return 0; } -#endif int @@ -2545,3 +2549,5 @@ } return 0; } + +#endif --- strace-4.5.11/net.c +++ strace-4.5.11/net.c @@ -1112,6 +1112,7 @@ tprintf("}}"); return; } +#ifdef SCM_CREDENTIALS if (u.cmsg.cmsg_type == SCM_CREDENTIALS && CMSG_LEN(sizeof(struct ucred)) <= u.cmsg.cmsg_len) { struct ucred *uc = (struct ucred *) CMSG_DATA (&u.cmsg); @@ -1119,6 +1120,7 @@ (long)uc->pid, (long)uc->uid, (long)uc->gid); return; } +#endif } tprintf(", ...}"); } --- strace-4.5.11/sock.c +++ strace-4.5.11/sock.c @@ -46,6 +46,7 @@ #endif #endif #include +#include extern const struct xlat addrfams[]; @@ -55,16 +56,26 @@ { IFF_DEBUG, "IFF_DEBUG" }, { IFF_LOOPBACK, "IFF_LOOPBACK" }, { IFF_POINTOPOINT, "IFF_POINTOPOINT" }, +#ifdef IFF_NOTRAILERS { IFF_NOTRAILERS, "IFF_NOTRAILERS" }, +#endif { IFF_RUNNING, "IFF_RUNNING" }, { IFF_NOARP, "IFF_NOARP" }, { IFF_PROMISC, "IFF_PROMISC" }, { IFF_ALLMULTI, "IFF_ALLMULTI" }, +#ifdef IFF_MASTER { IFF_MASTER, "IFF_MASTER" }, +#endif +#ifdef IFF_SLAVE { IFF_SLAVE, "IFF_SLAVE" }, +#endif { IFF_MULTICAST, "IFF_MULTICAST" }, +#ifdef IFF_PORTSEL { IFF_PORTSEL, "IFF_PORTSEL" }, +#endif +#ifdef IFF_AUTOMEDIA { IFF_AUTOMEDIA, "IFF_AUTOMEDIA" }, +#endif { 0, NULL } }; --- strace-4.5.11/strace.c +++ strace-4.5.11/strace.c @@ -617,6 +617,23 @@ cleanup(); exit(1); } +#ifdef FREEBSD + { + int status; + pid_t err; + + do { + err = waitpid(pid, &status, WUNTRACED); + } while (err == -1 && errno == EINTR); + if (err == -1) { + fprintf(stderr, + "waitpid() failed: %s\n", + strerror(errno)); + cleanup(); + exit(1); + } + } +#endif #ifdef USE_PROCFS if (proc_open(tcp, 0) < 0) { fprintf(stderr, "trouble opening proc file\n");