From: Marcus Comstedt Date: Fri, 4 Jul 2014 09:55:04 +0000 (+0200) Subject: Don't use readlinkat if it does not exist X-Git-Tag: libserialport-0.1.1~120 X-Git-Url: https://sigrok.org/gitweb/?p=libserialport.git;a=commitdiff_plain;h=5bd33b7c8be499b970192d144409bec7072fc701 Don't use readlinkat if it does not exist This fixes bug #377. --- diff --git a/configure.ac b/configure.ac index 857e4ba..22c47ce 100644 --- a/configure.ac +++ b/configure.ac @@ -119,6 +119,9 @@ AC_CHECK_MEMBERS([struct termios.c_ispeed, struct termios.c_ospeed], AC_CHECK_MEMBERS([struct termios2.c_ispeed, struct termios2.c_ospeed], [AC_DEFINE(HAVE_TERMIOS2_SPEED, 1)], [], [[#include ]]) +# Check for readlinkat. +AC_CHECK_FUNC([readlinkat], [AC_DEFINE(HAVE_READLINKAT, 1)], []) + saved="$CFLAGS"; CFLAGS="$CFLAGS -Werror" AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ __attribute__((visibility("hidden"))) void foo(void) { } diff --git a/linux.c b/linux.c index 9274e36..d70a45f 100644 --- a/linux.c +++ b/linux.c @@ -161,6 +161,9 @@ SP_PRIV enum sp_return list_ports(struct sp_port ***list) char name[PATH_MAX], target[PATH_MAX]; struct dirent entry, *result; struct serial_struct serial_info; +#ifndef HAVE_READLINKAT + char buf[sizeof(entry.d_name) + 16]; +#endif int len, fd, ioctl_result; DIR *dir; int ret = SP_OK; @@ -171,7 +174,12 @@ SP_PRIV enum sp_return list_ports(struct sp_port ***list) DEBUG("Iterating over results"); while (!readdir_r(dir, &entry, &result) && result) { +#ifdef HAVE_READLINKAT len = readlinkat(dirfd(dir), entry.d_name, target, sizeof(target)); +#else + snprintf(buf, sizeof(buf), "/sys/class/tty/%s", entry.d_name); + len = readlink(buf, target, sizeof(target)); +#endif if (len <= 0 || len >= (int) sizeof(target)-1) continue; target[len] = 0;