summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-10-12 20:28:21 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-10-13 17:56:55 -0400
commit1ca208fb4f93e5869704af1812cbff7130a2fc03 (patch)
tree689343b99c76e4d34c625197762de97e8435571d /src/core
parentb506291ff195e03ce793ac925cc2d158f0b452b5 (diff)
Introduce udev object cleanup functions
Diffstat (limited to 'src/core')
-rw-r--r--src/core/umount.c143
1 files changed, 49 insertions, 94 deletions
diff --git a/src/core/umount.c b/src/core/umount.c
index 1e95ad70dd..99dbe27c8f 100644
--- a/src/core/umount.c
+++ b/src/core/umount.c
@@ -27,7 +27,6 @@
#include <unistd.h>
#include <linux/loop.h>
#include <linux/dm-ioctl.h>
-#include <libudev.h>
#include "list.h"
#include "mount-setup.h"
@@ -35,6 +34,8 @@
#include "path-util.h"
#include "util.h"
#include "virt.h"
+#include "libudev.h"
+#include "udev-util.h"
typedef struct MountPoint {
char *path;
@@ -201,145 +202,108 @@ finish:
}
static int loopback_list_get(MountPoint **head) {
- int r;
- struct udev *udev;
- struct udev_enumerate *e = NULL;
+ _cleanup_udev_unref_ struct udev *udev;
+ _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
struct udev_list_entry *item = NULL, *first = NULL;
assert(head);
- if (!(udev = udev_new())) {
- r = -ENOMEM;
- goto finish;
- }
+ udev = udev_new();
+ if (!udev)
+ return -ENOMEM;
- if (!(e = udev_enumerate_new(udev))) {
- r = -ENOMEM;
- goto finish;
- }
+ e = udev_enumerate_new(udev);
+ if (!e)
+ return -ENOMEM;
if (udev_enumerate_add_match_subsystem(e, "block") < 0 ||
udev_enumerate_add_match_sysname(e, "loop*") < 0 ||
- udev_enumerate_add_match_sysattr(e, "loop/backing_file", NULL) < 0) {
- r = -EIO;
- goto finish;
- }
+ udev_enumerate_add_match_sysattr(e, "loop/backing_file", NULL) < 0)
+ return -EIO;
- if (udev_enumerate_scan_devices(e) < 0) {
- r = -EIO;
- goto finish;
- }
+ if (udev_enumerate_scan_devices(e) < 0)
+ return -EIO;
first = udev_enumerate_get_list_entry(e);
udev_list_entry_foreach(item, first) {
MountPoint *lb;
- struct udev_device *d;
+ _cleanup_udev_device_unref_ struct udev_device *d;
char *loop;
const char *dn;
- if (!(d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item)))) {
- r = -ENOMEM;
- goto finish;
- }
+ d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
+ if (!d)
+ return -ENOMEM;
- if (!(dn = udev_device_get_devnode(d))) {
- udev_device_unref(d);
+ dn = udev_device_get_devnode(d);
+ if (!dn)
continue;
- }
loop = strdup(dn);
- udev_device_unref(d);
-
- if (!loop) {
- r = -ENOMEM;
- goto finish;
- }
+ if (!loop)
+ return -ENOMEM;
- if (!(lb = new0(MountPoint, 1))) {
+ lb = new0(MountPoint, 1);
+ if (!lb) {
free(loop);
- r = -ENOMEM;
- goto finish;
+ return -ENOMEM;
}
lb->path = loop;
LIST_PREPEND(MountPoint, mount_point, *head, lb);
}
- r = 0;
-
-finish:
- if (e)
- udev_enumerate_unref(e);
-
- if (udev)
- udev_unref(udev);
-
- return r;
+ return 0;
}
static int dm_list_get(MountPoint **head) {
- int r;
- struct udev *udev;
- struct udev_enumerate *e = NULL;
+ _cleanup_udev_unref_ struct udev *udev;
+ _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
struct udev_list_entry *item = NULL, *first = NULL;
assert(head);
- if (!(udev = udev_new())) {
- r = -ENOMEM;
- goto finish;
- }
+ udev = udev_new();
+ if (!udev)
+ return -ENOMEM;
- if (!(e = udev_enumerate_new(udev))) {
- r = -ENOMEM;
- goto finish;
- }
+ e = udev_enumerate_new(udev);
+ if (!e)
+ return -ENOMEM;
if (udev_enumerate_add_match_subsystem(e, "block") < 0 ||
- udev_enumerate_add_match_sysname(e, "dm-*") < 0) {
- r = -EIO;
- goto finish;
- }
+ udev_enumerate_add_match_sysname(e, "dm-*") < 0)
+ return -EIO;
- if (udev_enumerate_scan_devices(e) < 0) {
- r = -EIO;
- goto finish;
- }
+ if (udev_enumerate_scan_devices(e) < 0)
+ return -EIO;
first = udev_enumerate_get_list_entry(e);
udev_list_entry_foreach(item, first) {
MountPoint *m;
- struct udev_device *d;
+ _cleanup_udev_device_unref_ struct udev_device *d;
dev_t devnum;
char *node;
const char *dn;
- if (!(d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item)))) {
- r = -ENOMEM;
- goto finish;
- }
+ d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
+ if (!d)
+ return -ENOMEM;
devnum = udev_device_get_devnum(d);
dn = udev_device_get_devnode(d);
-
- if (major(devnum) == 0 || !dn) {
- udev_device_unref(d);
+ if (major(devnum) == 0 || !dn)
continue;
- }
node = strdup(dn);
- udev_device_unref(d);
-
- if (!node) {
- r = -ENOMEM;
- goto finish;
- }
+ if (!node)
+ return -ENOMEM;
- if (!(m = new(MountPoint, 1))) {
+ m = new(MountPoint, 1);
+ if (!m) {
free(node);
- r = -ENOMEM;
- goto finish;
+ return -ENOMEM;
}
m->path = node;
@@ -347,16 +311,7 @@ static int dm_list_get(MountPoint **head) {
LIST_PREPEND(MountPoint, mount_point, *head, m);
}
- r = 0;
-
-finish:
- if (e)
- udev_enumerate_unref(e);
-
- if (udev)
- udev_unref(udev);
-
- return r;
+ return 0;
}
static int delete_loopback(const char *device) {