Hi all,
I am trying to capture read events on tun0 device on freeBSD 5.5 using
libevent library v1.2. But the event_dispatch() function returns with
an error "Operation not supported by device".

Is /dev/tun0 device supported by libevent 1.2?

Thanks,
Sachin

I have attached my code below:

#include <sys/errno.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/param.h>
#include <sys/linker.h>
#include <sys/module.h>
#include <sys/uio.h>
#include <unistd.h>
#include <net/if.h>
#include <net/if_tun.h>

#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <event.h>

void call_back(int i, short s, void *arg)
{
   printf("In call back\n");
}

int myInit(void)
{
   int unit, fd;
   struct event id;
   char name[FILENAME_MAX];

   fd = open("/dev/tun0", O_RDWR);
   if (fd < 0) {
   }
   else {
       int rc, mode;
       mode = IFF_BROADCAST | IFF_MULTICAST;
       rc = ioctl(fd, TUNSIFMODE, &mode);
       if (rc < 0) {
           fprintf(stderr,
                   "coudn't set tunnel mode to broadcast: %s\n",
                   strerror(errno));
           return rc;
       }
       event_set(&id, fd, EV_READ|EV_PERSIST, call_back,(void *) &fd);
       //rc = event_add(&id, NULL);
       if (rc < 0) {
           fprintf(stderr, "error from tun event_add: %s\n",
           strerror(errno));
           return errno;
       }
       return fd;
   }
}

int main(int argc, char **argv)
{
   struct event timeout;
   struct timeval tv;
   int rv;

   event_init();

   myInit();

   evtimer_set(&timeout, call_back, &timeout);

   timerclear(&tv);
   tv.tv_sec = 1;
   event_add(&timeout, &tv);

   rv = event_dispatch();
   if(rv < 0) {
       fprintf(stderr, "Unexpected exit: %s\n", strerror(errno));
   }
}
_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkey.org/mailman/listinfo/libevent-users

Reply via email to