What do the types of hotplug event mean?

45 Views Asked by At

I am investigating hotplug events. Here's a tiny program to get and print them:

#define _GNU_SOURCE

#include <errno.h>
#include <memory.h>
#include <net/if.h>
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <linux/rtnetlink.h>
#include <sys/socket.h>
 
void
event_handler(struct nlmsghdr* event)
{
    char* pep = (char*)event;
    unsigned int al = 0;
    unsigned int pending_eoe = 0;

    printf("event at 0x%p\n", (void*)pep);

    while (al = strlen(pep))
    {
        printf("event attribute: %s\n", pep);
        pep = pep + al + 1;
    }
}

int
main()
{
    // set up netlink socket to monitor hotplug events
    int nls = socket(AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);

    if (nls < 0)
    {
        printf("socket failed %s (%s)\n", strerrorname_np(errno), strerror(errno));
        return 1;
    }

    // configure socket
    struct sockaddr_nl  config;
    memset(&config, 0, sizeof(config));
    config.nl_family = AF_NETLINK;
    config.nl_pid    = 0;
    config.nl_groups = 0xffffffff;

    char buffer[16384];     // this isn't always enough!

    if (bind(nls, (struct sockaddr*) &config, sizeof(config)) < 0)
    {
        printf("bind failed %s (%s)\n", strerrorname_np(errno), strerror(errno));
        close(nls);
        return 1;
    }

    // event loop
    //      - make this into a function that can be handed to a thread
    //      - pass the event handler in (hardcoded here)
    int len;
    memset(&buffer, 0, sizeof(buffer));
    struct nlmsghdr* event = (struct nlmsghdr*) buffer;
    while ((len = recv(nls, event, 16384, 0)) > 0)
    {
        printf("Got events (length = %d)\n", len);
        
        event_handler(event);

        memset(&buffer, 0, sizeof(buffer));
        event = (struct nlmsghdr*) buffer;
    }

    close(nls);  // close socket
    return 0;
}

This works, and produces output like this, when I insert a USB drive:

Got events (length = 251)
event at 0x0x7ffd54edc100
event attribute: add@/devices/pci0000:00/0000:00:14.0/usb1/1-11
event attribute: ACTION=add
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11
event attribute: SUBSYSTEM=usb
event attribute: MAJOR=189
event attribute: MINOR=15
event attribute: DEVNAME=bus/usb/001/016
event attribute: DEVTYPE=usb_device
event attribute: PRODUCT=58f/6387/107
event attribute: TYPE=0/0/0
event attribute: BUSNUM=001
event attribute: DEVNUM=016
event attribute: SEQNUM=5478
Got events (length = 283)
event at 0x0x7ffd54edc100
event attribute: add@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0
event attribute: ACTION=add
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0
event attribute: SUBSYSTEM=usb
event attribute: DEVTYPE=usb_interface
event attribute: PRODUCT=58f/6387/107
event attribute: TYPE=0/0/0
event attribute: INTERFACE=8/6/80
event attribute: MODALIAS=usb:v058Fp6387d0107dc00dsc00dp00ic08isc06ip50in00
event attribute: SEQNUM=5479
Got events (length = 131)
event at 0x0x7ffd54edc100
event attribute: add@/devices/virtual/workqueue/scsi_tmf_4
event attribute: ACTION=add
event attribute: DEVPATH=/devices/virtual/workqueue/scsi_tmf_4
event attribute: SUBSYSTEM=workqueue
event attribute: SEQNUM=5480
Got events (length = 184)
event at 0x0x7ffd54edc100
event attribute: add@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4
event attribute: ACTION=add
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4
event attribute: SUBSYSTEM=scsi
event attribute: DEVTYPE=scsi_host
event attribute: SEQNUM=5481
Got events (length = 203)
event at 0x0x7ffd54edc100
event attribute: add@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/scsi_host/host4
event attribute: ACTION=add
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/scsi_host/host4
event attribute: SUBSYSTEM=scsi_host
event attribute: SEQNUM=5482
Got events (length = 304)
event at 0x0x7ffd54edc100
event attribute: bind@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0
event attribute: ACTION=bind
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0
event attribute: SUBSYSTEM=usb
event attribute: DEVTYPE=usb_interface
event attribute: DRIVER=usb-storage
event attribute: PRODUCT=58f/6387/107
event attribute: TYPE=0/0/0
event attribute: INTERFACE=8/6/80
event attribute: MODALIAS=usb:v058Fp6387d0107dc00dsc00dp00ic08isc06ip50in00
event attribute: SEQNUM=5483
Got events (length = 264)
event at 0x0x7ffd54edc100
event attribute: bind@/devices/pci0000:00/0000:00:14.0/usb1/1-11
event attribute: ACTION=bind
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11
event attribute: SUBSYSTEM=usb
event attribute: MAJOR=189
event attribute: MINOR=15
event attribute: DEVNAME=bus/usb/001/016
event attribute: DEVTYPE=usb_device
event attribute: DRIVER=usb
event attribute: PRODUCT=58f/6387/107
event attribute: TYPE=0/0/0
event attribute: BUSNUM=001
event attribute: DEVNUM=016
event attribute: SEQNUM=5484
Got events (length = 159)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 723)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 473)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 192)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 195)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 474)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 724)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 210)
event at 0x0x7ffd54edc100
event attribute: add@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0
event attribute: ACTION=add
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0
event attribute: SUBSYSTEM=scsi
event attribute: DEVTYPE=scsi_target
event attribute: SEQNUM=5485
Got events (length = 247)
event at 0x0x7ffd54edc100
event attribute: add@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0
event attribute: ACTION=add
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0
event attribute: SUBSYSTEM=scsi
event attribute: DEVTYPE=scsi_device
event attribute: MODALIAS=scsi:t-0x00
event attribute: SEQNUM=5486
Got events (length = 253)
event at 0x0x7ffd54edc100
event attribute: add@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/scsi_device/4:0:0:0
event attribute: ACTION=add
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/scsi_device/4:0:0:0
event attribute: SUBSYSTEM=scsi_device
event attribute: SEQNUM=5487
Got events (length = 247)
event at 0x0x7ffd54edc100
event attribute: add@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/scsi_disk/4:0:0:0
event attribute: ACTION=add
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/scsi_disk/4:0:0:0
event attribute: SUBSYSTEM=scsi_disk
event attribute: SEQNUM=5488
Got events (length = 277)
event at 0x0x7ffd54edc100
event attribute: add@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/scsi_generic/sg0
event attribute: ACTION=add
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/scsi_generic/sg0
event attribute: SUBSYSTEM=scsi_generic
event attribute: MAJOR=21
event attribute: MINOR=0
event attribute: DEVNAME=sg0
event attribute: SEQNUM=5489
Got events (length = 267)
event at 0x0x7ffd54edc100
event attribute: add@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0
event attribute: ACTION=add
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0
event attribute: SUBSYSTEM=bsg
event attribute: MAJOR=243
event attribute: MINOR=0
event attribute: DEVNAME=bsg/4:0:0:0
event attribute: SEQNUM=5490
Got events (length = 99)
event at 0x0x7ffd54edc100
event attribute: add@/devices/virtual/bdi/8:0
event attribute: ACTION=add
event attribute: DEVPATH=/devices/virtual/bdi/8:0
event attribute: SUBSYSTEM=bdi
event attribute: SEQNUM=5491
Got events (length = 140)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 206)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 245)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 221)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 217)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 253)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 248)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 279)
event at 0x0x7ffd54edc100
event attribute: add@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/block/sda
event attribute: ACTION=add
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/block/sda
event attribute: SUBSYSTEM=block
event attribute: MAJOR=8
event attribute: MINOR=0
event attribute: DEVNAME=sda
event attribute: DEVTYPE=disk
event attribute: DISKSEQ=35
event attribute: SEQNUM=5492
Got events (length = 303)
event at 0x0x7ffd54edc100
event attribute: add@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/block/sda/sda1
event attribute: ACTION=add
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/block/sda/sda1
event attribute: SUBSYSTEM=block
event attribute: MAJOR=8
event attribute: MINOR=1
event attribute: DEVNAME=sda1
event attribute: DEVTYPE=partition
event attribute: DISKSEQ=35
event attribute: PARTN=1
event attribute: SEQNUM=5493
Got events (length = 259)
event at 0x0x7ffd54edc100
event attribute: bind@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0
event attribute: ACTION=bind
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0
event attribute: SUBSYSTEM=scsi
event attribute: DEVTYPE=scsi_device
event attribute: DRIVER=sd
event attribute: MODALIAS=scsi:t-0x00
event attribute: SEQNUM=5494
Got events (length = 863)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 1305)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 246)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(
Got events (length = 382)
event at 0x0x7ffd54edc100
event attribute: change@/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/block/sda/sda1
event attribute: ACTION=change
event attribute: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/host4/target4:0:0/4:0:0:0/block/sda/sda1
event attribute: SUBSYSTEM=block
event attribute: SYNTH_UUID=939100b0-5fcb-4ebb-9bbf-207a4428e0b7
event attribute: SYNTH_ARG_UDISKSSERIAL=9
event attribute: MAJOR=8
event attribute: MINOR=1
event attribute: DEVNAME=sda1
event attribute: DEVTYPE=partition
event attribute: DISKSEQ=35
event attribute: PARTN=1
event attribute: SEQNUM=5495
Got events (length = 1381)
event at 0x0x7ffd54edc100
event attribute: libudev
event attribute: ����(

So, my questions are simple:

  • I can infer what "add" does.
  • I guess "bind" probably associates a device driver with the device?
  • What is a "libudev" event, what does it mean and how is it structured?
  • What is a "change" event and what does it mean?
  • Is udev interfering with what I am seeing?

Thanks in advance for any information (or pointers thereto) you can provide.

0

There are 0 best solutions below