/** * gcc events.c -o events -Wall -W -Wextra -lc * * Access to kernel events through Unix socket. **/ #include #include /* calloc (), malloc () */ #include /* strlcpy () */ #include /* close () */ #include #include /* socket (), connect () */ #include /* struct sockaddr_un */ #include #define DEVD_FILE "/var/run/devd.pipe" void devd_init_monitor () { int fd, kq; struct sockaddr_un addr; struct kevent *chlist, evlist; chlist = malloc (sizeof (struct kevent)); fd = socket (PF_LOCAL, SOCK_STREAM, 0); if (fd < 0) fprintf (stderr, "Can't create socket\n"); addr.sun_family = AF_UNIX; strlcpy (addr.sun_path, DEVD_FILE, sizeof (addr.sun_path)); if (connect (fd, (struct sockaddr *) &addr, sizeof (addr)) < 0) { close (fd); fprintf (stderr, "Can't connect to DEVD daemon\n"); } if ((kq = kqueue ()) < 0) { close (fd); fprintf (stderr, "No kernel event queue\n"); } /* Initialise kevent structure */ EV_SET (chlist, fd, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0); /* Infinite loop */ for (;;) { if (kevent (kq, chlist, 1, &evlist, 1, NULL) == 1) { char *buffer = calloc (evlist.data, sizeof (intptr_t)); recv (fd, buffer, evlist.data, 0); fprintf (stdout, "%s", buffer); free (buffer); } } free (chlist); } int main (int argc, char *argv[]) { devd_init_monitor (); return 0; }