use readdir() instead of the deprecated readir_r()

readir() is threadsafe on both linux and freebsd anyway.
The rationale behind the readdir_r() deprecation is in the glibc manual:
https://www.gnu.org/software/libc/manual/html_node/Reading_002fClosing-Directory.html

This fixes the following warning with recent glibc:

linux.c: In function ‘list_ports’:
linux.c:197:2: warning: ‘readdir_r’ is deprecated [-Wdeprecated-declarations]
  while (!readdir_r(dir, &entry, &result) && result) {
  ^~~~~
This commit is contained in:
Aurelien Jacobs 2016-10-14 23:50:08 +02:00
parent b2359c5c99
commit df3b70a888
2 changed files with 16 additions and 17 deletions

View File

@ -325,8 +325,7 @@ SP_PRIV enum sp_return get_port_details(struct sp_port *port)
SP_PRIV enum sp_return list_ports(struct sp_port ***list) SP_PRIV enum sp_return list_ports(struct sp_port ***list)
{ {
DIR *dir; DIR *dir;
struct dirent entry; struct dirent *entry;
struct dirent *result;
struct termios tios; struct termios tios;
char name[PATH_MAX]; char name[PATH_MAX];
int fd, ret; int fd, ret;
@ -336,20 +335,20 @@ SP_PRIV enum sp_return list_ports(struct sp_port ***list)
RETURN_FAIL("Could not open dir /dev"); RETURN_FAIL("Could not open dir /dev");
DEBUG("Iterating over results"); DEBUG("Iterating over results");
while (!readdir_r(dir, &entry, &result) && result) { while ((entry = readdir(dir))) {
ret = SP_OK; ret = SP_OK;
if (entry.d_type != DT_CHR) if (entry->d_type != DT_CHR)
continue; continue;
if (strncmp(entry.d_name, "cuaU", 4) != 0) if (strncmp(entry->d_name, "cuaU", 4) != 0)
if (strncmp(entry.d_name, "cuau", 4) != 0) if (strncmp(entry->d_name, "cuau", 4) != 0)
if (strncmp(entry.d_name, "cuad", 4) != 0) if (strncmp(entry->d_name, "cuad", 4) != 0)
continue; continue;
if (strend(entry.d_name, ".init")) if (strend(entry->d_name, ".init"))
continue; continue;
if (strend(entry.d_name, ".lock")) if (strend(entry->d_name, ".lock"))
continue; continue;
snprintf(name, sizeof(name), "/dev/%s", entry.d_name); snprintf(name, sizeof(name), "/dev/%s", entry->d_name);
DEBUG_FMT("Found device %s", name); DEBUG_FMT("Found device %s", name);
/* Check that we can open tty/cua device in rw mode - we need that. */ /* Check that we can open tty/cua device in rw mode - we need that. */
@ -370,7 +369,7 @@ SP_PRIV enum sp_return list_ports(struct sp_port ***list)
continue; continue;
DEBUG_FMT("Found port %s", name); DEBUG_FMT("Found port %s", name);
DBG("%s: %s\n", __func__, entry.d_name); DBG("%s: %s\n", __func__, entry->d_name);
*list = list_append(*list, name); *list = list_append(*list, name);
if (!*list) { if (!*list) {

12
linux.c
View File

@ -178,12 +178,12 @@ SP_PRIV enum sp_return get_port_details(struct sp_port *port)
SP_PRIV enum sp_return list_ports(struct sp_port ***list) SP_PRIV enum sp_return list_ports(struct sp_port ***list)
{ {
char name[PATH_MAX], target[PATH_MAX]; char name[PATH_MAX], target[PATH_MAX];
struct dirent entry, *result; struct dirent *entry;
#ifdef HAVE_STRUCT_SERIAL_STRUCT #ifdef HAVE_STRUCT_SERIAL_STRUCT
struct serial_struct serial_info; struct serial_struct serial_info;
int ioctl_result; int ioctl_result;
#endif #endif
char buf[sizeof(entry.d_name) + 23]; char buf[sizeof(entry->d_name) + 23];
int len, fd; int len, fd;
DIR *dir; DIR *dir;
int ret = SP_OK; int ret = SP_OK;
@ -194,19 +194,19 @@ SP_PRIV enum sp_return list_ports(struct sp_port ***list)
RETURN_FAIL("Could not open /sys/class/tty"); RETURN_FAIL("Could not open /sys/class/tty");
DEBUG("Iterating over results"); DEBUG("Iterating over results");
while (!readdir_r(dir, &entry, &result) && result) { while ((entry = readdir(dir))) {
snprintf(buf, sizeof(buf), "/sys/class/tty/%s", entry.d_name); snprintf(buf, sizeof(buf), "/sys/class/tty/%s", entry->d_name);
if (lstat(buf, &statbuf) == -1) if (lstat(buf, &statbuf) == -1)
continue; continue;
if (!S_ISLNK(statbuf.st_mode)) if (!S_ISLNK(statbuf.st_mode))
snprintf(buf, sizeof(buf), "/sys/class/tty/%s/device", entry.d_name); snprintf(buf, sizeof(buf), "/sys/class/tty/%s/device", entry->d_name);
len = readlink(buf, target, sizeof(target)); len = readlink(buf, target, sizeof(target));
if (len <= 0 || len >= (int)(sizeof(target) - 1)) if (len <= 0 || len >= (int)(sizeof(target) - 1))
continue; continue;
target[len] = 0; target[len] = 0;
if (strstr(target, "virtual")) if (strstr(target, "virtual"))
continue; continue;
snprintf(name, sizeof(name), "/dev/%s", entry.d_name); snprintf(name, sizeof(name), "/dev/%s", entry->d_name);
DEBUG_FMT("Found device %s", name); DEBUG_FMT("Found device %s", name);
if (strstr(target, "serial8250")) { if (strstr(target, "serial8250")) {
/* /*