Subject: Re: NetBSD/systrace error: EINVAL
To: Seth Kurtzberg <seth@cql.com>
From: Kristaps Johnson <kristaps@gradient-enterprises.com>
List: tech-misc
Date: 07/04/2006 09:08:11
No, it returns with success.  I just re-ran with:

$ sudo ./a.out 161
a.out: read: /dev/systrace: Invalid argument

In this case `161' was a shell session (I hit enter in it).


> I don't see a check of the return value of the open() call.  Could it be 
> -1 (invalid)?
>
> On Mon, 3 Jul 2006 17:52:08 -0400 (EDT)
> Kristaps Johnson <kristaps@gradient-enterprises.com> wrote:
>
>>
>> Hello all!
>>
>> I wonder if somebody can help me with a strange error I receive under
>> systrace on NetBSD.  I've included a sample programme below with
>> error-checking stripped in non-applicable areas.  The "sys/systrace.h"
>> header file is current from CVS. Overall system NetBSD 3.0, GENERIC.  I'm
>> trying to port sysjail (sysjail.bsd.lv) to NetBSD and this is keeping me
>> hard up.  Suggestions?
>>
>> Note that this works fine with the OpenBSD systrace (3.9), which adds to
>> the mystification.
>>
>> The "strange error" is EINVAL: Invalid argument.
>>
>> The below is run as "./a.out 5123", where 5123 is a process doing things (I
>> have a script looping echo -n '.').
>>
>>
>> #include <sys/ioctl.h>
>> #include <sys/param.h>
>> #include <sys/types.h>
>> #include <sys/wait.h>
>> #ifdef __NetBSD__
>> # include <sys/systrace.h>
>> #elif __OpenBSD__
>> # include <dev/systrace.h>
>> #endif
>>
>> #include <err.h>
>> #include <errno.h>
>> #include <fcntl.h>
>> #include <poll.h>
>> #include <stdio.h>
>> #include <stdlib.h>
>> #include <string.h>
>> #include <unistd.h>
>>
>> int
>> main(int argc, const char *argv[])
>> {
>>          struct str_message msg;
>>          struct systrace_policy pol;
>>          struct pollfd pfd;
>>          int fd, ofd;
>>          pid_t cpid;
>>
>>          cpid = atoi(argv[1]);
>>
>>          ofd = open("/dev/systrace", O_RDWR | O_NONBLOCK, 0);
>> #ifdef __OpenBSD__
>>          ioctl(ofd, STRIOCCLONE, &fd);
>>          close(ofd);
>> #elif __NetBSD__
>>          fd = ofd;
>> #endif
>>          fcntl(fd, F_SETFD, FD_CLOEXEC);
>>
>>          memset(&pol, 0, sizeof(pol));
>>          pol.strp_op = SYSTR_POLICY_NEW;
>>          pol.strp_num = -1;
>>          pol.strp_maxents = 512;
>>
>>          ioctl(fd, STRIOCPOLICY, &pol);
>>          ioctl(fd, STRIOCATTACH, &cpid);
>>
>>          memset(&pfd, 0, sizeof(pfd));
>>          pfd.fd = fd;
>>          pfd.events = POLLIN;
>>
>>          poll(&pfd, 1, -1);
>>
>>          /* RETURNS AN ERROR:
>>           * read: /dev/systrace: Invalid argument */
>>          if (read(fd, &msg, sizeof(struct str_message))
>>                          != sizeof(struct str_message)) {
>>                  err(1, "read: /dev/systrace");
>>          }
>>
>>          return(0);
>> }
>>
>>
>

/--
   Kristaps Johnson, Chief Technology Officer
   Gradient Enterprises Inc.