diff options
Diffstat (limited to 'src/libsystemd/sd-device/sd-device.c')
| -rw-r--r-- | src/libsystemd/sd-device/sd-device.c | 81 | 
1 files changed, 45 insertions, 36 deletions
| diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index 7cea5a0746..9633e46ce0 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -19,26 +19,31 @@  ***/  #include <ctype.h> -#include <sys/types.h>  #include <net/if.h> +#include <sys/types.h> -#include "util.h" -#include "macro.h" -#include "path-util.h" -#include "strxcpyx.h" +#include "sd-device.h" + +#include "alloc-util.h" +#include "device-internal.h" +#include "device-private.h" +#include "device-util.h" +#include "fd-util.h"  #include "fileio.h" +#include "fs-util.h"  #include "hashmap.h" +#include "macro.h" +#include "parse-util.h" +#include "path-util.h"  #include "set.h" +#include "stat-util.h" +#include "string-util.h"  #include "strv.h" - -#include "sd-device.h" - -#include "device-util.h" -#include "device-private.h" -#include "device-internal.h" +#include "strxcpyx.h" +#include "util.h"  int device_new_aux(sd_device **ret) { -        _cleanup_device_unref_ sd_device *device = NULL; +        _cleanup_(sd_device_unrefp) sd_device *device = NULL;          assert(ret); @@ -169,11 +174,10 @@ int device_set_syspath(sd_device *device, const char *_syspath, bool verify) {                                          /* the device does not exist (any more?) */                                          return -ENODEV; -                                log_debug("sd-device: could not canonicalize '%s': %m", _syspath); -                                return -errno; +                                return log_debug_errno(errno, "sd-device: could not canonicalize '%s': %m", _syspath);                          }                  } else if (r < 0) { -                        log_debug("sd-device: could not get target of '%s': %s", _syspath, strerror(-r)); +                        log_debug_errno(r, "sd-device: could not get target of '%s': %m", _syspath);                          return r;                  } @@ -218,7 +222,7 @@ int device_set_syspath(sd_device *device, const char *_syspath, bool verify) {  }  _public_ int sd_device_new_from_syspath(sd_device **ret, const char *syspath) { -        _cleanup_device_unref_ sd_device *device = NULL; +        _cleanup_(sd_device_unrefp) sd_device *device = NULL;          int r;          assert_return(ret, -EINVAL); @@ -296,15 +300,27 @@ _public_ int sd_device_new_from_subsystem_sysname(sd_device **ret, const char *s                  } else                          return -EINVAL;          } else { -                syspath = strjoina("/sys/subsystem/", subsystem, "/devices/", sysname); +                char *name; +                size_t len = 0; + +                /* translate sysname back to sysfs filename */ +                name = strdupa(sysname); +                while (name[len] != '\0') { +                        if (name[len] == '/') +                                name[len] = '!'; + +                        len ++; +                } + +                syspath = strjoina("/sys/subsystem/", subsystem, "/devices/", name);                  if (access(syspath, F_OK) >= 0)                          return sd_device_new_from_syspath(ret, syspath); -                syspath = strjoina("/sys/bus/", subsystem, "/devices/", sysname); +                syspath = strjoina("/sys/bus/", subsystem, "/devices/", name);                  if (access(syspath, F_OK) >= 0)                          return sd_device_new_from_syspath(ret, syspath); -                syspath = strjoina("/sys/class/", subsystem, "/", sysname); +                syspath = strjoina("/sys/class/", subsystem, "/", name);                  if (access(syspath, F_OK) >= 0)                          return sd_device_new_from_syspath(ret, syspath);          } @@ -340,13 +356,10 @@ int device_set_ifindex(sd_device *device, const char *_ifindex) {          assert(device);          assert(_ifindex); -        r = safe_atoi(_ifindex, &ifindex); +        r = parse_ifindex(_ifindex, &ifindex);          if (r < 0)                  return r; -        if (ifindex <= 0) -                return -EINVAL; -          r = device_add_property_internal(device, "IFINDEX", _ifindex);          if (r < 0)                  return r; @@ -481,7 +494,7 @@ static int handle_uevent_line(sd_device *device, const char *key, const char *va  int device_read_uevent_file(sd_device *device) {          _cleanup_free_ char *uevent = NULL; -        const char *syspath, *key, *value, *major = NULL, *minor = NULL; +        const char *syspath, *key = NULL, *value = NULL, *major = NULL, *minor = NULL;          char *path;          size_t uevent_len;          unsigned i; @@ -516,7 +529,7 @@ int device_read_uevent_file(sd_device *device) {                  /* some devices may not have uevent files, see set_syspath() */                  return 0;          else if (r < 0) { -                log_debug("sd-device: failed to read uevent file '%s': %s", path, strerror(-r)); +                log_debug_errno(r, "sd-device: failed to read uevent file '%s': %m", path);                  return r;          } @@ -555,7 +568,7 @@ int device_read_uevent_file(sd_device *device) {                                  r = handle_uevent_line(device, key, value, &major, &minor);                                  if (r < 0) -                                        log_debug("sd-device: failed to handle uevent entry '%s=%s': %s", key, value, strerror(-r)); +                                        log_debug_errno(r, "sd-device: failed to handle uevent entry '%s=%s': %m", key, value);                                  state = PRE_KEY;                          } @@ -569,7 +582,7 @@ int device_read_uevent_file(sd_device *device) {          if (major) {                  r = device_set_devnum(device, major, minor);                  if (r < 0) -                        log_debug("sd-device: could not set 'MAJOR=%s' or 'MINOR=%s' from '%s': %s", major, minor, path, strerror(-r)); +                        log_debug_errno(r, "sd-device: could not set 'MAJOR=%s' or 'MINOR=%s' from '%s': %m", major, minor, path);          }          return 0; @@ -611,16 +624,14 @@ _public_ int sd_device_new_from_device_id(sd_device **ret, const char *id) {          }          case 'n':          { -                _cleanup_device_unref_ sd_device *device = NULL; +                _cleanup_(sd_device_unrefp) sd_device *device = NULL;                  _cleanup_close_ int sk = -1;                  struct ifreq ifr = {};                  int ifindex; -                r = safe_atoi(&id[1], &ifr.ifr_ifindex); +                r = parse_ifindex(&id[1], &ifr.ifr_ifindex);                  if (r < 0)                          return r; -                else if (ifr.ifr_ifindex <= 0) -                        return -EINVAL;                  sk = socket(PF_INET, SOCK_DGRAM, 0);                  if (sk < 0) @@ -1271,10 +1282,8 @@ int device_read_db_aux(sd_device *device, bool force) {          if (r < 0) {                  if (r == -ENOENT)                          return 0; -                else { -                        log_debug("sd-device: failed to read db '%s': %s", path, strerror(-r)); -                        return r; -                } +                else +                        return log_debug_errno(r, "sd-device: failed to read db '%s': %m", path);          }          /* devices with a database entry are initialized */ @@ -1318,7 +1327,7 @@ int device_read_db_aux(sd_device *device, bool force) {                                  db[i] = '\0';                                  r = handle_db_line(device, key, value);                                  if (r < 0) -                                        log_debug("sd-device: failed to handle db entry '%c:%s': %s", key, value, strerror(-r)); +                                        log_debug_errno(r, "sd-device: failed to handle db entry '%c:%s': %m", key, value);                                  state = PRE_KEY;                          } | 
