Re: NetBSD/systrace error: EINVAL

Seth Kurtzberg <[email protected]>
Newsgroups gmane.os.netbsd.devel.general
Organization CQL
Message-ID <[email protected]>
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);
> }
> 
>
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.