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"         },

Reply via email to