typedef unsigned short int sa_family_t;
#define __KERNEL_STRICT_NAMES
#include <sys/types.h>
#include <linux/netlink.h>
#include <sys/socket.h> 
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

//From a uevent patch for hal
#define HOTPLUG_BUFFER_SIZE             1024
#define HOTPLUG_NUM_ENVP                32
#define OBJECT_SIZE                     512

#ifndef NETLINK_KOBJECT_UEVENT
#error Your kernel headers are too old, and do not define NETLINK_KOBJECT_UEVENT. You need Linux 2.6.10 or higher for KOBJECT_UEVENT support.
#endif

int main(int argc, char **argv, char **envp) {
        //Start listening
        int fd;
        struct sockaddr_nl ksnl;
        memset(&ksnl, 0x00, sizeof(struct sockaddr_nl));
        ksnl.nl_family=AF_NETLINK;
        ksnl.nl_pid=getpid();
        ksnl.nl_groups=0xffffffff;
        fd=socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
        if (fd==-1) {
                printf("Couldn't open kobject-uevent netlink socket");
                perror("");
                exit(1);
        }
        if (bind(fd, (struct sockaddr *) &ksnl, sizeof(struct sockaddr_nl))<0) {
                fprintf (stderr, "Error binding to netlink socket");
                close(fd);
                exit(1);
        }

        while(1) {
                char buffer[HOTPLUG_BUFFER_SIZE + OBJECT_SIZE];
                int buflen;
                buflen=recv(fd, &buffer, sizeof(buffer), 0);
                if (buflen<0) {
                        exit(1);
                }
                printf("%s\n", buffer);
                char *pos = buffer + strlen(buffer);
                char *end = buffer + buflen;
                while(pos < end) {
                    int l = strlen(pos);
                    printf("\t%s\n", pos);
                    pos += l+1;
                }
        }

}
