From 03e5611d147993d14dbf2e96c316aa4115108984 Mon Sep 17 00:00:00 2001 From: Romuald Conty Date: Sun, 2 Dec 2012 18:49:51 +0100 Subject: [PATCH] New feature: search in a directory for devices configuration files. --- NEWS | 2 + configure.ac | 1 + contrib/Makefile.am | 1 + contrib/libnfc/Makefile.am | 4 ++ contrib/libnfc/arygon.conf.sample | 3 ++ contrib/libnfc/pn532_uart_on_rpi.conf.sample | 5 ++ contrib/libnfc/pn532_via_uart2usb.conf.sample | 3 ++ libnfc.conf.sample | 3 +- libnfc/conf.c | 47 ++++++++++--------- libnfc/nfc-device.c | 6 +-- 10 files changed, 49 insertions(+), 26 deletions(-) create mode 100644 contrib/libnfc/Makefile.am create mode 100644 contrib/libnfc/arygon.conf.sample create mode 100644 contrib/libnfc/pn532_uart_on_rpi.conf.sample create mode 100644 contrib/libnfc/pn532_via_uart2usb.conf.sample diff --git a/NEWS b/NEWS index dfb37e3..f73ff2b 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,8 @@ Configuration: - "device.name" and "device.connstring" to define a user device, this is the recommended method if user have a not-easily detectable device (ie. serial ones). + Its also possible to define devices using dedicated configuration files and + put them into device search directory (/etc/nfc/devices.d under GNU/Linux). API Changes: diff --git a/configure.ac b/configure.ac index 95ccaa1..084bf94 100644 --- a/configure.ac +++ b/configure.ac @@ -147,6 +147,7 @@ AC_CONFIG_FILES([ cmake/modules/Makefile contrib/Makefile contrib/devd/Makefile + contrib/libnfc/Makefile contrib/linux/Makefile contrib/udev/Makefile contrib/win32/Makefile diff --git a/contrib/Makefile.am b/contrib/Makefile.am index 61b683e..8915c4c 100644 --- a/contrib/Makefile.am +++ b/contrib/Makefile.am @@ -1,5 +1,6 @@ SUBDIRS = \ devd \ + libnfc \ linux \ udev \ win32 diff --git a/contrib/libnfc/Makefile.am b/contrib/libnfc/Makefile.am new file mode 100644 index 0000000..249f7a1 --- /dev/null +++ b/contrib/libnfc/Makefile.am @@ -0,0 +1,4 @@ +EXTRA_DIST = \ + pn532_via_uart2usb.conf.sample \ + arygon.conf.sample \ + pn532_uart_on_rpi.conf.sample diff --git a/contrib/libnfc/arygon.conf.sample b/contrib/libnfc/arygon.conf.sample new file mode 100644 index 0000000..e4e6c5f --- /dev/null +++ b/contrib/libnfc/arygon.conf.sample @@ -0,0 +1,3 @@ +## Typical configuration file for Arygon/IDentive device (with Arygon-MCU on board) +name = "IDentive" +connstring = arygon:/dev/ttyS0 diff --git a/contrib/libnfc/pn532_uart_on_rpi.conf.sample b/contrib/libnfc/pn532_uart_on_rpi.conf.sample new file mode 100644 index 0000000..9773590 --- /dev/null +++ b/contrib/libnfc/pn532_uart_on_rpi.conf.sample @@ -0,0 +1,5 @@ +## Typical configuration file for PN532 device on R-Pi connected using UART +## Note: to use UART port on R-Pi, you have to disable linux serial console: +## http://learn.adafruit.com/adafruit-nfc-rfid-on-raspberry-pi/freeing-uart-on-the-pi +name = "PN532 board" +connstring = pn532_uart:/dev/ttyAMA0 diff --git a/contrib/libnfc/pn532_via_uart2usb.conf.sample b/contrib/libnfc/pn532_via_uart2usb.conf.sample new file mode 100644 index 0000000..50f5e3a --- /dev/null +++ b/contrib/libnfc/pn532_via_uart2usb.conf.sample @@ -0,0 +1,3 @@ +## Typical configuration file for PN532 board (ie. microbuilder.eu / Adafruit) device +name = "Adafruit PN532 board" +connstring = pn532_uart:/dev/ttyUSB0 diff --git a/libnfc.conf.sample b/libnfc.conf.sample index 691e310..fdc44cb 100644 --- a/libnfc.conf.sample +++ b/libnfc.conf.sample @@ -1,10 +1,11 @@ # Allow device auto-detection (default: true) -# Note: if this auto-detection is disable, user have to set manually a device +# Note: if this auto-detection is disabled, user have to set manually a device # configuration using file or environnement variable #allow_autoscan = true # Allow intrusive auto-detection (default: false) # Warning: intrusive auto-detection can seriously disturb other devices +# This option is not recommended, user should prefers to add manually its device. #allow_intrusive_autoscan = false # Set log level (default: error) diff --git a/libnfc/conf.c b/libnfc/conf.c index 1e93f09..d3ff9d3 100644 --- a/libnfc/conf.c +++ b/libnfc/conf.c @@ -119,36 +119,39 @@ conf_keyvalue_device(void *data, const char* key, const char* value) conf_keyvalue_context(data, newkey, value); } -void -conf_load(nfc_context *context) +static void +conf_devices_load(const char *dirname, nfc_context *context) { - conf_parse_file(LIBNFC_CONFFILE, conf_keyvalue_context, context); -} - -/* -int -main(int argc, char *argv[]) -{ - DIR *d = opendir(LIBNFC_DEVICECONFDIR); + DIR *d = opendir(dirname); if (!d) { perror ("opendir"); } else { struct dirent* de; - while (de = readdir(d)) { + while ((de = readdir(d))) { if (de->d_name[0]!='.') { - printf ("\t%s\n", de->d_name); - char filename[BUFSIZ] = LIBNFC_DEVICECONFDIR"/"; - strcat (filename, de->d_name); - struct stat s; - if (stat(filename, &s) == -1) { - perror("stat"); - continue; - } - if(S_ISREG(s.st_mode)) { - nfc_open_from_file (filename); + const size_t filename_len = strlen(de->d_name); + const size_t extension_len = strlen(".conf"); + if ((filename_len > extension_len) && (strncmp(".conf", de->d_name + (filename_len-extension_len), extension_len) == 0)) { + char filename[BUFSIZ] = LIBNFC_DEVICECONFDIR"/"; + strcat (filename, de->d_name); + struct stat s; + if (stat(filename, &s) == -1) { + perror("stat"); + continue; + } + if(S_ISREG(s.st_mode)) { + conf_parse_file (filename, conf_keyvalue_device, context); + } } } } } } -*/ + +void +conf_load(nfc_context *context) +{ + conf_parse_file(LIBNFC_CONFFILE, conf_keyvalue_context, context); + conf_devices_load(LIBNFC_DEVICECONFDIR, context); +} + diff --git a/libnfc/nfc-device.c b/libnfc/nfc-device.c index 138c3d1..76c29f1 100644 --- a/libnfc/nfc-device.c +++ b/libnfc/nfc-device.c @@ -19,9 +19,9 @@ */ /** -* @file nfc-device.c -* @brief Provide internal function to manipulate nfc_device type -*/ + * @file nfc-device.c + * @brief Provide internal function to manipulate nfc_device type + */ #include #include