devd output parsen in C

unull

Nervensäge
Hallo,

ich schreibe mir gerade (als kleine Fingeruebung) einen Daemon in C, der
Code:
/var/run/devd.pipe

ausliest und beim Einstecken eines USB-Sticks mir via libnotify einen Desktop-Notification geben soll. Soweit klappt alles, aber ich habe durchaus Probleme aus dem ganzen devd-Output die relevanten Schnippsel rauszufischen. Der Output sieht bei mir so aus beispielsweise:
Code:
!system=USB subsystem=INTERFACE type=ATTACH ugen=ugen1.6 cdev=ugen1.6 vendor=0x090c product=0x1000 devclass=0x00 devsubclass=0x00 sernum="9112000000033304" release=0x3000 mode=host interface=0 endpoints=2 intclass=0x08 intsubclass=0x06 intprotocol=0x50
+umass0 at bus=2 hubaddr=5 port=1 devaddr=6 interface=0 vendor=0x090c product=0x1000 devclass=0x00 devsubclass=0x00 sernum="9112000000033304" release=0x3000 mode=host intclass=0x08 intsubclass=0x06 intprotocol=0x50  on uhub3
!system=DEVFS subsystem=CDEV type=CREATE cdev=pass3
!system=DEVFS subsystem=CDEV type=CREATE cdev=da0
!system=DEVFS subsystem=CDEV type=CREATE cdev=da0a
!system=DEVFS subsystem=CDEV type=CREATE cdev=ufsid/4f02c2fe6b8b4567
!system=DEVFS subsystem=CDEV type=CREATE cdev=ufs/FreeBSD_Install

Eigentlich wuerde mich erstmal nur die Zeile mit da0a interessieren. Der ganze Output wird zeilenweise vom Socket eingelesen.

Hat jemand Ideen?

PS: Ich weiss, dass es in Perl/Shell/Ruby/Python einfacher wäre :)
 
Ich habs ohne regex gemacht:

Code:
#define  SUBSYSTEM              "subsystem=CMBAT"
#define  BATTERY_EVENT          "notify=0x80"

while (!feof(sockin)) {
    /* Read a single devd event */
    if (fscanf(sockin, "%s %s %s %s", sys, subsys, type, notify) != 4)
      break; /* Not a battery event */
    /* Get the new charge level. */
    if (strncmp(subsys, SUBSYSTEM, sizeof(subsys)) == 0 &&
         strncmp(notify, BATTERY_EVENT, sizeof(notify)) == 0) {
      get_sysctls(&sc);
[...]
    }
}
 
Ich habs ohne regex gemacht:

Code:
#define  SUBSYSTEM              "subsystem=CMBAT"
#define  BATTERY_EVENT          "notify=0x80"

while (!feof(sockin)) {
    /* Read a single devd event */
    if (fscanf(sockin, "%s %s %s %s", sys, subsys, type, notify) != 4)
      break; /* Not a battery event */
    /* Get the new charge level. */
    if (strncmp(subsys, SUBSYSTEM, sizeof(subsys)) == 0 &&
         strncmp(notify, BATTERY_EVENT, sizeof(notify)) == 0) {
      get_sysctls(&sc);
[...]
    }
}

Danke, ich probiers mal aus!

EDIT: Das bringt mir so leider auch nichts. Ich hab gestern wohl etwas voreilig gepostet. Das Problem ist ja, dass der String nicht immer gleich ist, es kann ja durchaus "da1s1", "da2s1" etc sein.
 
Zuletzt bearbeitet:
Zurück
Oben