]> sigrok.org Git - libserialport.git/commitdiff
Canonicalize symlinks in portnames
authorStefan Tauner <redacted>
Sun, 21 May 2017 21:42:06 +0000 (23:42 +0200)
committerUwe Hermann <redacted>
Wed, 13 Sep 2017 17:27:50 +0000 (19:27 +0200)
This allows users to supply symlinks created e.g. by udev rules instead
of the actual device names.

configure.ac
libserialport_internal.h
serialport.c

index 19ab3aa30e64d9610ef3db048b70e28b41ac75d6..3e19f41493bddb604b014e687fea0bc3ee3aa345 100644 (file)
@@ -126,6 +126,9 @@ AC_CHECK_DECLS([BOTHER],,, [[#include <linux/termios.h>]])
 # Check for serial_struct.
 AC_CHECK_TYPES([struct serial_struct],,, [[#include <linux/serial.h>]])
 
+# Check for realpath().
+AC_CHECK_FUNC([realpath], [AC_DEFINE(HAVE_REALPATH, 1, [realpath is available.])], [])
+
 AC_CACHE_CHECK([for visibility control], [sp_cv_visibility_control], [
        sp_saved_CFLAGS=$CFLAGS
        CFLAGS="$CFLAGS -Werror"
index 308b20b34a5e069aad428f9b7719c3edb36c517b..83f0090bb5f0b7438c2ce013d9bc1a579042fcc5 100644 (file)
@@ -23,7 +23,7 @@
 
 
 #ifdef __linux__
-/* For timeradd, timersub, timercmp. */
+/* For timeradd, timersub, timercmp, realpath. */
 #define _BSD_SOURCE 1 /* for glibc < 2.19 */
 #define _DEFAULT_SOURCE 1 /* for glibc >= 2.20 */
 #endif
index d271478250f8588e0bfe03651b25f492a3d8523e..db2aa43ca0ba98442b042b80ce99e85eb034064c 100644 (file)
@@ -75,6 +75,20 @@ SP_API enum sp_return sp_get_port_by_name(const char *portname, struct sp_port *
 
        DEBUG_FMT("Building structure for port %s", portname);
 
+#if !defined(_WIN32) && defined(HAVE_REALPATH)
+       /*
+        * get_port_details() below tries to be too smart and figure out
+        * some transport properties from the port name which breaks with
+        * symlinks. Therefore we canonicalize the portname first.
+        */
+       char pathbuf[PATH_MAX + 1];
+       char *res = realpath(portname, pathbuf);
+       if (!res)
+               RETURN_ERROR(SP_ERR_ARG, "Could not retrieve realpath behind port name");
+
+       portname = pathbuf;
+#endif
+
        if (!(port = malloc(sizeof(struct sp_port))))
                RETURN_ERROR(SP_ERR_MEM, "Port structure malloc failed");