From: Kay Sievers Date: Fri, 9 Nov 2012 11:37:40 +0000 (+0100) Subject: udev: net_id - add builtin to retrieve data for network devices X-Git-Tag: v196~118 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=a660c63c551b88136ac6176855b5907cc533e848 udev: net_id - add builtin to retrieve data for network devices --- diff --git a/Makefile.am b/Makefile.am index 2898602dc..6e07a169c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1861,6 +1861,7 @@ libudev_core_la_SOURCES = \ src/udev/udev-builtin-hwdb.c \ src/udev/udev-builtin-input_id.c \ src/udev/udev-builtin-kmod.c \ + src/udev/udev-builtin-net_id.c \ src/udev/udev-builtin-path_id.c \ src/udev/udev-builtin-usb_id.c \ src/libsystemd-daemon/sd-daemon.c diff --git a/rules/75-net-description.rules b/rules/75-net-description.rules index b127757d0..fe9fca14d 100644 --- a/rules/75-net-description.rules +++ b/rules/75-net-description.rules @@ -3,12 +3,12 @@ ACTION=="remove", GOTO="net_end" SUBSYSTEM!="net", GOTO="net_end" -SUBSYSTEMS=="usb", ENV{ID_MODEL}=="", IMPORT{builtin}="usb_id" -SUBSYSTEMS=="usb", IMPORT{builtin}="hwdb --subsystem=usb" -SUBSYSTEMS=="usb", ATTRS{idVendor}!="", ATTRS{idProduct}!="", ENV{ID_VENDOR_ID}="$attr{idVendor}", ENV{ID_MODEL_ID}="$attr{idProduct}" +IMPORT{builtin}="net_id" +SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb" SUBSYSTEMS=="usb", GOTO="net_end" -IMPORT{builtin}="hwdb" SUBSYSTEMS=="pci", ENV{ID_BUS}="pci", ENV{ID_VENDOR_ID}="$attr{vendor}", ENV{ID_MODEL_ID}="$attr{device}" +IMPORT{builtin}="hwdb" + LABEL="net_end" diff --git a/rules/75-tty-description.rules b/rules/75-tty-description.rules index bfa6de39e..83083d93e 100644 --- a/rules/75-tty-description.rules +++ b/rules/75-tty-description.rules @@ -3,13 +3,11 @@ ACTION=="remove", GOTO="tty_end" SUBSYSTEM!="tty", GOTO="tty_end" -SUBSYSTEMS=="usb", ENV{ID_MODEL}=="", IMPORT{builtin}="usb_id" -SUBSYSTEMS=="usb", IMPORT{builtin}="hwdb --subsystem=usb" -SUBSYSTEMS=="usb", ATTRS{idVendor}!="", ATTRS{idProduct}!="", ENV{ID_VENDOR_ID}="$attr{idVendor}", ENV{ID_MODEL_ID}="$attr{idProduct}" +SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb" SUBSYSTEMS=="usb", GOTO="tty_end" -SUBSYSTEMS=="pci", IMPORT{builtin}="hwdb --subsystem=usb" SUBSYSTEMS=="pci", ENV{ID_BUS}="pci", ENV{ID_VENDOR_ID}="$attr{vendor}", ENV{ID_MODEL_ID}="$attr{device}" +IMPORT{builtin}="hwdb" LABEL="tty_end" diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c new file mode 100644 index 000000000..eff455277 --- /dev/null +++ b/src/udev/udev-builtin-net_id.c @@ -0,0 +1,55 @@ +/*** + This file is part of systemd. + + Copyright 2012 Kay Sievers + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see . +***/ + +#include +#include +#include +#include +#include +#include + +#include "udev.h" + +/* IEEE Organizationally Unique Identifier */ +static int lookup_OUI(struct udev_device *dev, bool test) { + const char *addr; + unsigned int a1, a2, a3; + char oui[16]; + + addr = udev_device_get_sysattr_value(dev, "address"); + if (!addr) + return -ENOENT; + + if (sscanf(addr, "%x:%x:%x:", &a1, &a2, &a3) != 3) + return -EINVAL; + + snprintf(oui, sizeof(oui), "OUI:%X%X%X", a1, a2, a3); + return udev_builtin_hwdb_lookup(dev, oui, test); +} + +static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool test) { + lookup_OUI(dev, test); + return EXIT_SUCCESS; +} + +const struct udev_builtin udev_builtin_net_id = { + .name = "net_id", + .cmd = builtin_net_id, + .help = "network device properties", +}; diff --git a/src/udev/udev-builtin.c b/src/udev/udev-builtin.c index de426a379..ee81b2d71 100644 --- a/src/udev/udev-builtin.c +++ b/src/udev/udev-builtin.c @@ -36,6 +36,7 @@ static const struct udev_builtin *builtins[] = { [UDEV_BUILTIN_HWDB] = &udev_builtin_hwdb, [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id, [UDEV_BUILTIN_KMOD] = &udev_builtin_kmod, + [UDEV_BUILTIN_NET_ID] = &udev_builtin_net_id, [UDEV_BUILTIN_PATH_ID] = &udev_builtin_path_id, [UDEV_BUILTIN_USB_ID] = &udev_builtin_usb_id, #ifdef HAVE_ACL diff --git a/src/udev/udev.h b/src/udev/udev.h index a361c653f..b0bd4d196 100644 --- a/src/udev/udev.h +++ b/src/udev/udev.h @@ -140,6 +140,7 @@ enum udev_builtin_cmd { UDEV_BUILTIN_HWDB, UDEV_BUILTIN_INPUT_ID, UDEV_BUILTIN_KMOD, + UDEV_BUILTIN_NET_ID, UDEV_BUILTIN_PATH_ID, UDEV_BUILTIN_USB_ID, #ifdef HAVE_ACL @@ -162,6 +163,7 @@ extern const struct udev_builtin udev_builtin_firmware; extern const struct udev_builtin udev_builtin_hwdb; extern const struct udev_builtin udev_builtin_input_id; extern const struct udev_builtin udev_builtin_kmod; +extern const struct udev_builtin udev_builtin_net_id; extern const struct udev_builtin udev_builtin_path_id; extern const struct udev_builtin udev_builtin_usb_id; extern const struct udev_builtin udev_builtin_uaccess;