Package: strace Version: 4.5.17+cvs080723-2 Severity: wishlist User: debian-...@lists.debian.org Usertags: kfreebsd
An unfinished patch (initially made by Bruno Haible) to support GNU/kFreeBSD in strace is available. I'm attaching it. It is severely out of sync and hackish. I file this bug to keep track of it. -- System Information: Debian Release: 5.0.3 APT prefers stable APT policy: (500, 'stable') Architecture: amd64 (x86_64) Kernel: Linux 2.6.26-libre2-2-amd64 (SMP w/2 CPU cores) Locale: LANG=ca_AD.UTF-8, LC_CTYPE=ca_AD.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages strace depends on: ii libc6 2.7-18 GNU C Library: Shared libraries strace recommends no packages. strace suggests no packages. -- no debconf information
Status: can't merge untill we cleanup all the insanity I added to this patch. diff -ur strace-4.4.old/configure strace-4.4/configure --- strace-4.4.old/configure 2001-10-01 06:23:03.000000000 +0200 +++ strace-4.4/configure 2004-05-30 22:03:07.000000000 +0200 @@ -651,7 +651,7 @@ irix[56]*) opsys=svr4 ;; -freebsd*) +freebsd*|kfreebsd*-gnu) opsys=freebsd ;; *) diff -ur strace-4.4.old/configure.in strace-4.4/configure.in --- strace-4.4.old/configure.in 2001-10-01 06:23:00.000000000 +0200 +++ strace-4.4/configure.in 2004-05-30 22:03:07.000000000 +0200 @@ -22,7 +22,7 @@ irix[56]*) opsys=svr4 ;; -freebsd*) +freebsd*|kfreebsd*-gnu) opsys=freebsd ;; *) diff -ur strace-4.4.old/debian/control strace-4.4/debian/control --- strace-4.4.old/debian/control 2001-09-21 23:52:53.000000000 +0200 +++ strace-4.4/debian/control 2004-05-30 22:03:24.000000000 +0200 @@ -2,11 +2,10 @@ Section: devel Priority: standard Maintainer: Wichert Akkerman <wakke...@debian.org> -Build-Depends: libc6-dev (>= 2.2.2-1) [!alpha !ia64], libc6.1-dev (>= 2.2.2-1) [alpha ia64] Standards-Version: 3.5.2 Package: strace -Architecture: alpha arm hppa i386 ia64 m68k mips mipsel powerpc s390 sh sparc +Architecture: alpha arm hppa i386 ia64 m68k mips mipsel powerpc s390 sh sparc kfreebsd-i386 Depends: ${shlibs:Depends} Description: A system call tracer. strace is a system call tracer, i.e. a debugging tool which prints out diff -ur strace-4.4.old/freebsd/i386/syscall.h strace-4.4/freebsd/i386/syscall.h --- strace-4.4.old/freebsd/i386/syscall.h 2001-03-13 00:29:09.000000000 +0100 +++ strace-4.4/freebsd/i386/syscall.h 2004-05-30 22:03:07.000000000 +0200 @@ -197,7 +197,7 @@ #define sys_clock_getres printargs #define sys_nanosleep printargs #define sys_minherit printargs -#define sys_rfork printargs +int sys_rfork(); #define sys_openbsd_poll printargs #define sys_issetugid printargs #define sys_lchown printargs diff -ur strace-4.4.old/freebsd/i386/syscallent.h strace-4.4/freebsd/i386/syscallent.h --- strace-4.4.old/freebsd/i386/syscallent.h 2001-03-13 00:29:09.000000000 +0100 +++ strace-4.4/freebsd/i386/syscallent.h 2004-05-30 22:03:07.000000000 +0200 @@ -253,7 +253,7 @@ { -1, 0, printargs, "SYS_248" }, /* 248 */ { -1, 0, printargs, "SYS_249" }, /* 249 */ { 3, 0, sys_minherit, "minherit" }, /* 250 */ - { 1, 0, sys_rfork, "rfork" }, /* 251 */ + { 1, TP, sys_rfork, "rfork" }, /* 251 */ { 3, 0, sys_openbsd_poll, "openbsd_poll" }, /* 252 */ { 1, 0, sys_issetugid, "issetugid" }, /* 253 */ { 3, TF, sys_lchown, "lchown" }, /* 254 */ diff -ur strace-4.4.old/freebsd/syscalls.cat strace-4.4/freebsd/syscalls.cat --- strace-4.4.old/freebsd/syscalls.cat 2000-09-01 23:03:06.000000000 +0200 +++ strace-4.4/freebsd/syscalls.cat 2004-05-30 22:03:07.000000000 +0200 @@ -134,6 +134,7 @@ fork1 TP owait TP owait3 TP +rfork TP vfork TP wait TP wait4 TP diff -ur strace-4.4.old/freebsd/syscalls.print strace-4.4/freebsd/syscalls.print --- strace-4.4.old/freebsd/syscalls.print 2001-03-13 00:29:09.000000000 +0100 +++ strace-4.4/freebsd/syscalls.print 2004-05-30 22:03:07.000000000 +0200 @@ -127,6 +127,7 @@ recvfrom recvmsg rename +rfork rmdir sbrk select diff -ur strace-4.4.old/io.c strace-4.4/io.c --- strace-4.4.old/io.c 2001-07-14 00:07:45.000000000 +0200 +++ strace-4.4/io.c 2004-05-30 22:03:07.000000000 +0200 @@ -203,9 +203,9 @@ } else { off_t offset; - if (!tcp->u_arg[5]) +// if (!tcp->u_arg[5]) tprintf(", NULL"); - else { +/* else { struct sf_hdtr hdtr; if (umove(tcp, tcp->u_arg[5], &hdtr) < 0) @@ -217,7 +217,7 @@ tprint_iov(tcp, hdtr.trl_cnt, hdtr.trailers); tprintf(", %u }", hdtr.hdr_cnt); } - } + }*/ if (!tcp->u_arg[6]) tprintf(", NULL"); else if (umove(tcp, tcp->u_arg[6], &offset) < 0) diff -ur strace-4.4.old/process.c strace-4.4/process.c --- strace-4.4.old/process.c 2001-09-21 23:50:35.000000000 +0200 +++ strace-4.4/process.c 2004-05-30 22:03:07.000000000 +0200 @@ -366,7 +366,7 @@ return 0; } -#if UNIXWARE > 2 +#if UNIXWARE > 2 || defined(FREEBSD) int sys_rfork(tcp) @@ -391,6 +391,7 @@ struct tcb *tcp; { struct tcb *tcpchild; + int pid; if (exiting(tcp)) { if (getrval2(tcp)) @@ -406,12 +407,22 @@ tcp->flags |= TCB_FOLLOWFORK; if (syserror(tcp)) return 0; + pid = tcp->u_rval; if ((tcpchild = alloctcb(tcp->u_rval)) == NULL) { fprintf(stderr, "sys_fork: tcb table full\n"); return 0; } - if (proc_open(tcpchild, 2) < 0) - droptcb(tcpchild); + if (proc_open(tcpchild, 2) < 0) { + fprintf(stderr, "Too late?\n"); + droptcb(tcpchild); + return 0; + } + + tcpchild->flags |= TCB_ATTACHED; + newoutf(tcpchild); + tcp->nchildren++; + if (!qflag) + fprintf(stderr, "Process %d attached\n", pid); } return 0; } diff -ur strace-4.4.old/strace.c strace-4.4/strace.c --- strace-4.4.old/strace.c 2001-08-03 13:43:35.000000000 +0200 +++ strace-4.4/strace.c 2004-05-30 22:03:07.000000000 +0200 @@ -46,6 +46,9 @@ #ifdef USE_PROCFS #include <poll.h> +#ifndef INFTIM +#define INFTIM (-1) +#endif #endif #ifdef SVR4 diff -ur strace-4.4.old/syscall.c strace-4.4/syscall.c --- strace-4.4.old/syscall.c 2001-09-21 23:50:35.000000000 +0200 +++ strace-4.4/syscall.c 2004-05-30 22:03:07.000000000 +0200 @@ -446,6 +446,9 @@ const struct subcall subcalls_table[] = { { SYS_shmsys, 5, { SYS_shmat, SYS_shmctl, SYS_shmdt, SYS_shmget, SYS_shmctl } }, +#ifndef SYS___semctl +#define SYS___semctl SYS_semctl +#endif #ifdef SYS_semconfig { SYS_semsys, 4, { SYS___semctl, SYS_semget, SYS_semop, SYS_semconfig } }, #else @@ -597,6 +600,9 @@ #ifdef SYS_forkall case SYS_forkall: #endif +#ifdef SYS_rfork + case SYS_rfork: +#endif #ifdef SYS_rfork1 case SYS_rfork1: #endif @@ -878,10 +884,14 @@ return -1; } switch (regs.r_eax) { +#ifdef SYS_syscall case SYS_syscall: +#endif +#ifdef SYS___sycall case SYS___syscall: pread(tcp->pfd, &scno, sizeof(scno), regs.r_esp + sizeof(int)); break; +#endif default: scno = regs.r_eax; break; @@ -1413,14 +1423,18 @@ if (tcp->u_nargs > MAX_ARGS) tcp->u_nargs = MAX_ARGS; switch(regs.r_eax) { +#ifdef SYS___syscall case SYS___syscall: pread(tcp->pfd, &tcp->u_arg, tcp->u_nargs * sizeof(unsigned long), regs.r_esp + sizeof(int) + sizeof(quad_t)); break; +#endif +#ifdef SYS_syscall case SYS_syscall: pread(tcp->pfd, &tcp->u_arg, tcp->u_nargs * sizeof(unsigned long), regs.r_esp + 2 * sizeof(int)); break; +#endif default: pread(tcp->pfd, &tcp->u_arg, tcp->u_nargs * sizeof(unsigned long), regs.r_esp + sizeof(int)); @@ -1533,17 +1547,15 @@ #endif /* LINUX */ default: tprintf("= -1 "); - if (u_error < nerrnos && u_error < sys_nerr) + if (u_error < nerrnos) tprintf("%s (%s)", errnoent[u_error], - sys_errlist[u_error]); + strerror (u_error)); else if (u_error < nerrnos) tprintf("%s (errno %ld)", errnoent[u_error], u_error); - else if (u_error < sys_nerr) - tprintf("ERRNO_%ld (%s)", u_error, - sys_errlist[u_error]); else - tprintf("E??? (errno %ld)", u_error); + tprintf("ERRNO_%ld (%s)", u_error, + strerror (u_error)); break; } } diff -ur strace-4.4.old/term.c strace-4.4/term.c --- strace-4.4.old/term.c 2000-09-04 02:07:38.000000000 +0200 +++ strace-4.4/term.c 2004-05-30 22:03:07.000000000 +0200 @@ -39,6 +39,8 @@ #include <sys/filio.h> #endif +#include <sys/ttycom.h> + static struct xlat tcxonc_options[] = { { TCOOFF, "TCOOFF" }, { TCOON, "TCOON" },