X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=linux.c;h=dbff4c4459282a376e2035c6e3f005474939d9a4;hb=7890cef6cf4f8496888f2a86593f9eff55244456;hp=730ba9d0433caa2d2b79f089ce236fc8fd2e856a;hpb=48a4076f692ffe34026c37815580a32b2f70592b;p=libserialport.git diff --git a/linux.c b/linux.c index 730ba9d..dbff4c4 100644 --- a/linux.c +++ b/linux.c @@ -20,7 +20,7 @@ #include "libserialport.h" #include "libserialport_internal.h" -enum sp_return get_port_details(struct sp_port *port) +SP_PRIV enum sp_return get_port_details(struct sp_port *port) { /* Description limited to 127 char, anything longer would not be user friendly anyway */ @@ -35,12 +35,12 @@ enum sp_return get_port_details(struct sp_port *port) int i, count; if (strncmp(port->name, "/dev/", 5)) - RETURN_ERROR(SP_ERR_ARG, "Device name not recognized (%s)", port->name); + RETURN_ERROR(SP_ERR_ARG, "Device name not recognized."); snprintf(file_name, sizeof(file_name), "/sys/class/tty/%s", dev); count = readlink(file_name, file_name, sizeof(file_name)); if (count <= 0 || count >= (int) sizeof(file_name)-1) - RETURN_ERROR(SP_ERR_ARG, "Device not found (%s)", port->name); + RETURN_ERROR(SP_ERR_ARG, "Device not found."); file_name[count] = 0; if (strstr(file_name, "bluetooth")) port->transport = SP_TRANSPORT_BLUETOOTH; @@ -156,12 +156,18 @@ enum sp_return get_port_details(struct sp_port *port) RETURN_OK(); } -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]; struct dirent entry, *result; +#ifdef HAVE_SERIAL_STRUCT struct serial_struct serial_info; - int len, fd, ioctl_result; + int ioctl_result; +#endif +#ifndef HAVE_READLINKAT + char buf[sizeof(entry.d_name) + 16]; +#endif + int len, fd; DIR *dir; int ret = SP_OK; @@ -171,14 +177,19 @@ 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; if (strstr(target, "virtual")) continue; snprintf(name, sizeof(name), "/dev/%s", entry.d_name); - DEBUG("Found device %s", name); + DEBUG_FMT("Found device %s", name); if (strstr(target, "serial8250")) { /* The serial8250 driver has a hardcoded number of ports. * The only way to tell which actually exist on a given system @@ -188,8 +199,11 @@ enum sp_return list_ports(struct sp_port ***list) DEBUG("open failed, skipping"); continue; } +#ifdef HAVE_SERIAL_STRUCT ioctl_result = ioctl(fd, TIOCGSERIAL, &serial_info); +#endif close(fd); +#ifdef HAVE_SERIAL_STRUCT if (ioctl_result != 0) { DEBUG("ioctl failed, skipping"); continue; @@ -198,8 +212,9 @@ enum sp_return list_ports(struct sp_port ***list) DEBUG("port type is unknown, skipping"); continue; } +#endif } - DEBUG("Found port %s", name); + DEBUG_FMT("Found port %s", name); *list = list_append(*list, name); if (!list) { SET_ERROR(ret, SP_ERR_MEM, "list append failed");