Re: NetBSD/systrace error: EINVAL

Kristaps Johnson <[email protected]>
Newsgroups gmane.os.netbsd.devel.general
Message-ID <[email protected]>
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 <[email protected]> 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.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.