chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
core: unify how we generate the prefix string when dumping unit state
[elogind.git]
/
src
/
libudev
/
libudev-device.c
diff --git
a/src/libudev/libudev-device.c
b/src/libudev/libudev-device.c
index eb43668c56a36098c5602bd8ac7d110758d415cb..f26a4c44b559c55cffff79330dc4e5ce5af085cf 100644
(file)
--- a/
src/libudev/libudev-device.c
+++ b/
src/libudev/libudev-device.c
@@
-36,13
+36,15
@@
#include "libudev.h"
#include "libudev-private.h"
#include "libudev.h"
#include "libudev-private.h"
+static int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode);
+
/**
* SECTION:libudev-device
* @short_description: kernel sys devices
*
* Representation of kernel sys devices. Devices are uniquely identified
* by their syspath, every device has exactly one path in the kernel sys
/**
* SECTION:libudev-device
* @short_description: kernel sys devices
*
* Representation of kernel sys devices. Devices are uniquely identified
* by their syspath, every device has exactly one path in the kernel sys
- * filesystem. Devices usually belong to a kernel subsystem, and
and
have
+ * filesystem. Devices usually belong to a kernel subsystem, and have
* a unique name inside that subsystem.
*/
* a unique name inside that subsystem.
*/
@@
-534,8
+536,10
@@
int udev_device_read_db(struct udev_device *udev_device, const char *dbfile)
f = fopen(dbfile, "re");
if (f == NULL) {
udev_dbg(udev_device->udev, "no db file to read %s: %m\n", dbfile);
f = fopen(dbfile, "re");
if (f == NULL) {
udev_dbg(udev_device->udev, "no db file to read %s: %m\n", dbfile);
- return -
1
;
+ return -
errno
;
}
}
+
+ /* devices with a database entry are initialized */
udev_device->is_initialized = true;
while (fgets(line, sizeof(line), f)) {
udev_device->is_initialized = true;
while (fgets(line, sizeof(line), f)) {
@@
-591,7
+595,7
@@
int udev_device_read_uevent_file(struct udev_device *udev_device)
strscpyl(filename, sizeof(filename), udev_device->syspath, "/uevent", NULL);
f = fopen(filename, "re");
if (f == NULL)
strscpyl(filename, sizeof(filename), udev_device->syspath, "/uevent", NULL);
f = fopen(filename, "re");
if (f == NULL)
- return -
1
;
+ return -
errno
;
udev_device->uevent_loaded = true;
while (fgets(line, sizeof(line), f)) {
udev_device->uevent_loaded = true;
while (fgets(line, sizeof(line), f)) {
@@
-640,12
+644,16
@@
struct udev_device *udev_device_new(struct udev *udev)
struct udev_device *udev_device;
struct udev_list_entry *list_entry;
struct udev_device *udev_device;
struct udev_list_entry *list_entry;
- if (udev == NULL)
+ if (udev == NULL) {
+ errno = EINVAL;
return NULL;
return NULL;
+ }
- udev_device = calloc(1, sizeof(struct udev_device));
- if (udev_device == NULL)
+ udev_device = new0(struct udev_device, 1);
+ if (udev_device == NULL) {
+ errno = ENOMEM;
return NULL;
return NULL;
+ }
udev_device->refcount = 1;
udev_device->udev = udev;
udev_list_init(udev, &udev_device->devlinks_list, true);
udev_device->refcount = 1;
udev_device->udev = udev;
udev_list_init(udev, &udev_device->devlinks_list, true);
@@
-684,22
+692,30
@@
_public_ struct udev_device *udev_device_new_from_syspath(struct udev *udev, con
struct stat statbuf;
struct udev_device *udev_device;
struct stat statbuf;
struct udev_device *udev_device;
- if (udev == NULL)
+ if (udev == NULL) {
+ errno = EINVAL;
return NULL;
return NULL;
- if (syspath == NULL)
+ }
+
+ if (syspath == NULL) {
+ errno = EINVAL;
return NULL;
return NULL;
+ }
/* path starts in sys */
if (!startswith(syspath, "/sys")) {
udev_dbg(udev, "not in sys :%s\n", syspath);
/* path starts in sys */
if (!startswith(syspath, "/sys")) {
udev_dbg(udev, "not in sys :%s\n", syspath);
+ errno = EINVAL;
return NULL;
}
/* path is not a root directory */
subdir = syspath + strlen("/sys");
pos = strrchr(subdir, '/');
return NULL;
}
/* path is not a root directory */
subdir = syspath + strlen("/sys");
pos = strrchr(subdir, '/');
- if (pos == NULL || pos[1] == '\0' || pos < &subdir[2])
+ if (pos == NULL || pos[1] == '\0' || pos < &subdir[2]) {
+ errno = EINVAL;
return NULL;
return NULL;
+ }
/* resolve possible symlink to real path */
strscpy(path, sizeof(path), syspath);
/* resolve possible symlink to real path */
strscpy(path, sizeof(path), syspath);
@@
-753,8
+769,10
@@
_public_ struct udev_device *udev_device_new_from_devnum(struct udev *udev, char
type_str = "block";
else if (type == 'c')
type_str = "char";
type_str = "block";
else if (type == 'c')
type_str = "char";
- else
+ else {
+ errno = EINVAL;
return NULL;
return NULL;
+ }
/* use /sys/dev/{block,char}/<maj>:<min> link */
snprintf(path, sizeof(path), "/sys/dev/%s/%u:%u",
/* use /sys/dev/{block,char}/<maj>:<min> link */
snprintf(path, sizeof(path), "/sys/dev/%s/%u:%u",
@@
-800,13
+818,15
@@
_public_ struct udev_device *udev_device_new_from_device_id(struct udev *udev, c
int ifindex;
ifindex = strtoul(&id[1], NULL, 10);
int ifindex;
ifindex = strtoul(&id[1], NULL, 10);
- if (ifindex <= 0)
+ if (ifindex <= 0) {
+ errno = EINVAL;
return NULL;
return NULL;
+ }
sk = socket(PF_INET, SOCK_DGRAM, 0);
if (sk < 0)
return NULL;
sk = socket(PF_INET, SOCK_DGRAM, 0);
if (sk < 0)
return NULL;
- mem
set(&ifr, 0x00
, sizeof(struct ifreq));
+ mem
zero(&ifr
, sizeof(struct ifreq));
ifr.ifr_ifindex = ifindex;
if (ioctl(sk, SIOCGIFNAME, &ifr) != 0) {
close(sk);
ifr.ifr_ifindex = ifindex;
if (ioctl(sk, SIOCGIFNAME, &ifr) != 0) {
close(sk);
@@
-819,18
+839,24
@@
_public_ struct udev_device *udev_device_new_from_device_id(struct udev *udev, c
return NULL;
if (udev_device_get_ifindex(dev) == ifindex)
return dev;
return NULL;
if (udev_device_get_ifindex(dev) == ifindex)
return dev;
+
+ /* this is racy, so we may end up with the wrong device */
udev_device_unref(dev);
udev_device_unref(dev);
+ errno = ENODEV;
return NULL;
}
case '+':
strscpy(subsys, sizeof(subsys), &id[1]);
sysname = strchr(subsys, ':');
return NULL;
}
case '+':
strscpy(subsys, sizeof(subsys), &id[1]);
sysname = strchr(subsys, ':');
- if (sysname == NULL)
+ if (sysname == NULL) {
+ errno = EINVAL;
return NULL;
return NULL;
+ }
sysname[0] = '\0';
sysname = &sysname[1];
return udev_device_new_from_subsystem_sysname(udev, subsys, sysname);
default:
sysname[0] = '\0';
sysname = &sysname[1];
return udev_device_new_from_subsystem_sysname(udev, subsys, sysname);
default:
+ errno = EINVAL;
return NULL;
}
}
return NULL;
}
}
@@
-894,7
+920,9
@@
_public_ struct udev_device *udev_device_new_from_subsystem_sysname(struct udev
strscpyl(path, sizeof(path), "/sys/bus/", subsys, "/drivers/", driver, NULL);
if (stat(path, &statbuf) == 0)
goto found;
strscpyl(path, sizeof(path), "/sys/bus/", subsys, "/drivers/", driver, NULL);
if (stat(path, &statbuf) == 0)
goto found;
- }
+ } else
+ errno = EINVAL;
+
goto out;
}
goto out;
}
@@
-970,6
+998,8
@@
static struct udev_device *device_new_from_parent(struct udev_device *udev_devic
if (udev_device_parent != NULL)
return udev_device_parent;
}
if (udev_device_parent != NULL)
return udev_device_parent;
}
+
+ errno = ENOENT;
return NULL;
}
return NULL;
}
@@
-980,9
+1010,8
@@
static struct udev_device *device_new_from_parent(struct udev_device *udev_devic
* Find the next parent device, and fill in information from the sys
* device and the udev database entry.
*
* Find the next parent device, and fill in information from the sys
* device and the udev database entry.
*
- * The returned the device is not referenced. It is attached to the
- * child device, and will be cleaned up when the child device
- * is cleaned up.
+ * Returned device is not referenced. It is attached to the child
+ * device, and will be cleaned up when the child device is cleaned up.
*
* It is not necessarily just the upper level directory, empty or not
* recognized sys directories are ignored.
*
* It is not necessarily just the upper level directory, empty or not
* recognized sys directories are ignored.
@@
-994,8
+1023,10
@@
static struct udev_device *device_new_from_parent(struct udev_device *udev_devic
**/
_public_ struct udev_device *udev_device_get_parent(struct udev_device *udev_device)
{
**/
_public_ struct udev_device *udev_device_get_parent(struct udev_device *udev_device)
{
- if (udev_device == NULL)
+ if (udev_device == NULL) {
+ errno = EINVAL;
return NULL;
return NULL;
+ }
if (!udev_device->parent_set) {
udev_device->parent_set = true;
udev_device->parent_device = device_new_from_parent(udev_device);
if (!udev_device->parent_set) {
udev_device->parent_set = true;
udev_device->parent_device = device_new_from_parent(udev_device);
@@
-1016,9
+1047,8
@@
_public_ struct udev_device *udev_device_get_parent(struct udev_device *udev_dev
* If devtype is #NULL, only subsystem is checked, and any devtype will
* match.
*
* If devtype is #NULL, only subsystem is checked, and any devtype will
* match.
*
- * The returned the device is not referenced. It is attached to the
- * child device, and will be cleaned up when the child device
- * is cleaned up.
+ * Returned device is not referenced. It is attached to the child
+ * device, and will be cleaned up when the child device is cleaned up.
*
* It can be called as many times as needed, without caring about
* references.
*
* It can be called as many times as needed, without caring about
* references.
@@
-1029,8
+1059,10
@@
_public_ struct udev_device *udev_device_get_parent_with_subsystem_devtype(struc
{
struct udev_device *parent;
{
struct udev_device *parent;
- if (subsystem == NULL)
+ if (subsystem == NULL) {
+ errno = EINVAL;
return NULL;
return NULL;
+ }
parent = udev_device_get_parent(udev_device);
while (parent != NULL) {
parent = udev_device_get_parent(udev_device);
while (parent != NULL) {
@@
-1047,6
+1079,10
@@
_public_ struct udev_device *udev_device_get_parent_with_subsystem_devtype(struc
}
parent = udev_device_get_parent(parent);
}
}
parent = udev_device_get_parent(parent);
}
+
+ if (!parent)
+ errno = ENOENT;
+
return parent;
}
return parent;
}
@@
-1088,7
+1124,7
@@
_public_ struct udev_device *udev_device_ref(struct udev_device *udev_device)
* Drop a reference of a udev device. If the refcount reaches zero,
* the resources of the device will be released.
*
* Drop a reference of a udev device. If the refcount reaches zero,
* the resources of the device will be released.
*
- * Returns:
the passed udev device if it has still an active reference, or #NULL otherwise.
+ * Returns:
#NULL
**/
_public_ struct udev_device *udev_device_unref(struct udev_device *udev_device)
{
**/
_public_ struct udev_device *udev_device_unref(struct udev_device *udev_device)
{
@@
-1096,7
+1132,7
@@
_public_ struct udev_device *udev_device_unref(struct udev_device *udev_device)
return NULL;
udev_device->refcount--;
if (udev_device->refcount > 0)
return NULL;
udev_device->refcount--;
if (udev_device->refcount > 0)
- return
udev_device
;
+ return
NULL
;
if (udev_device->parent_device != NULL)
udev_device_unref(udev_device->parent_device);
free(udev_device->syspath);
if (udev_device->parent_device != NULL)
udev_device_unref(udev_device->parent_device);
free(udev_device->syspath);
@@
-1339,7
+1375,7
@@
void udev_device_set_usec_initialized(struct udev_device *udev_device, usec_t us
char num[32];
udev_device->usec_initialized = usec_initialized;
char num[32];
udev_device->usec_initialized = usec_initialized;
- snprintf(num, sizeof(num),
"%llu", (unsigned long long)
usec_initialized);
+ snprintf(num, sizeof(num),
USEC_FMT,
usec_initialized);
udev_device_add_property(udev_device, "USEC_INITIALIZED", num);
}
udev_device_add_property(udev_device, "USEC_INITIALIZED", num);
}
@@
-1519,13
+1555,13
@@
static int udev_device_sysattr_list_read(struct udev_device *udev_device)
int num = 0;
if (udev_device == NULL)
int num = 0;
if (udev_device == NULL)
- return -
1
;
+ return -
EINVAL
;
if (udev_device->sysattr_list_read)
return 0;
dir = opendir(udev_device_get_syspath(udev_device));
if (!dir)
if (udev_device->sysattr_list_read)
return 0;
dir = opendir(udev_device_get_syspath(udev_device));
if (!dir)
- return -
1
;
+ return -
errno
;
for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
char path[UTIL_PATH_SIZE];
for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
char path[UTIL_PATH_SIZE];
@@
-1611,7
+1647,7
@@
int udev_device_set_syspath(struct udev_device *udev_device, const char *syspath
return 0;
}
return 0;
}
-int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode)
+
static
int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode)
{
free(udev_device->devnode);
if (devnode[0] != '/') {
{
free(udev_device->devnode);
if (devnode[0] != '/') {