示例#1
0
文件: sysfs-show.c 项目: cee1/systemd
int show_sysfs(const char *seat, const char *prefix, unsigned n_columns) {
        struct udev *udev;
        struct udev_list_entry *first = NULL;
        struct udev_enumerate *e;
        int r;

        if (n_columns <= 0)
                n_columns = columns();

        if (!prefix)
                prefix = "";

        if (isempty(seat))
                seat = "seat0";

        udev = udev_new();
        if (!udev)
                return -ENOMEM;

        e = udev_enumerate_new(udev);
        if (!e) {
                r = -ENOMEM;
                goto finish;
        }

        if (!streq(seat, "seat0"))
                r = udev_enumerate_add_match_tag(e, seat);
        else
                r = udev_enumerate_add_match_tag(e, "seat");

        if (r < 0)
                goto finish;

        r = udev_enumerate_scan_devices(e);
        if (r < 0)
                goto finish;

        first = udev_enumerate_get_list_entry(e);
        if (first)
                show_sysfs_one(udev, seat, &first, "/", prefix, n_columns);

finish:
        if (e)
                udev_enumerate_unref(e);

        if (udev)
                udev_unref(udev);

        return r;
}
示例#2
0
/* add or remove a ACL for a given uid from all matching devices */
static void apply_acl_to_devices(uid_t uid, int add)
{
	struct udev *udev;
	struct udev_enumerate *enumerate;
	struct udev_list_entry *list_entry;

	/* iterate over all devices tagged with ACL_SET */
	udev = udev_new();
	enumerate = udev_enumerate_new(udev);
	udev_enumerate_add_match_tag(enumerate, "udev-acl");
	udev_enumerate_scan_devices(enumerate);
	udev_list_entry_foreach(list_entry, udev_enumerate_get_list_entry(enumerate)) {
		struct udev_device *device;
		const char *node;

		device = udev_device_new_from_syspath(udev_enumerate_get_udev(enumerate),
						      udev_list_entry_get_name(list_entry));
		if (device == NULL)
			continue;
		node = udev_device_get_devnode(device);
		if (node == NULL) {
			udev_device_unref(device);
			continue;
		}
		set_facl(node, uid, add);
		udev_device_unref(device);
	}
	udev_enumerate_unref(enumerate);
	udev_unref(udev);
}
示例#3
0
int show_sysfs(const char *seat, const char *prefix, unsigned n_columns) {
        _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
        _cleanup_udev_unref_ struct udev *udev = NULL;
        struct udev_list_entry *first = NULL;
        int r;

        if (n_columns <= 0)
                n_columns = columns();

        if (!prefix)
                prefix = "";

        if (isempty(seat))
                seat = "seat0";

        udev = udev_new();
        if (!udev)
                return -ENOMEM;

        e = udev_enumerate_new(udev);
        if (!e)
                return -ENOMEM;

        if (!streq(seat, "seat0"))
                r = udev_enumerate_add_match_tag(e, seat);
        else
                r = udev_enumerate_add_match_tag(e, "seat");
        if (r < 0)
                return r;

        r = udev_enumerate_add_match_is_initialized(e);
        if (r < 0)
                return r;

        r = udev_enumerate_scan_devices(e);
        if (r < 0)
                return r;

        first = udev_enumerate_get_list_entry(e);
        if (first)
                show_sysfs_one(udev, seat, &first, "/", prefix, n_columns);
        else
                printf("%s%s%s\n", prefix, draw_special_char(DRAW_TREE_RIGHT), "(none)");

        return r;
}
示例#4
0
文件: logind.c 项目: abbradar/systemd
static int manager_enumerate_devices(Manager *m) {
        struct udev_list_entry *item = NULL, *first = NULL;
        _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
        int r;

        assert(m);

        /* Loads devices from udev and creates seats for them as
         * necessary */

        e = udev_enumerate_new(m->udev);
        if (!e)
                return -ENOMEM;

        r = udev_enumerate_add_match_tag(e, "master-of-seat");
        if (r < 0)
                return r;

        r = udev_enumerate_add_match_is_initialized(e);
        if (r < 0)
                return r;

        r = udev_enumerate_scan_devices(e);
        if (r < 0)
                return r;

        first = udev_enumerate_get_list_entry(e);
        udev_list_entry_foreach(item, first) {
                _cleanup_udev_device_unref_ struct udev_device *d = NULL;
                int k;

                d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item));
                if (!d)
                        return -ENOMEM;

                k = manager_process_seat_device(m, d);
                if (k < 0)
                        r = k;
        }
int devnode_acl_all(struct udev *udev,
                    const char *seat,
                    bool flush,
                    bool del, uid_t old_uid,
                    bool add, uid_t new_uid) {

    _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
    struct udev_list_entry *item = NULL, *first = NULL;
    _cleanup_set_free_free_ Set *nodes = NULL;
    _cleanup_closedir_ DIR *dir = NULL;
    struct dirent *dent;
    Iterator i;
    char *n;
    int r;

    assert(udev);

    nodes = set_new(&string_hash_ops);
    if (!nodes)
        return -ENOMEM;

    e = udev_enumerate_new(udev);
    if (!e)
        return -ENOMEM;

    if (isempty(seat))
        seat = "seat0";

    /* We can only match by one tag in libudev. We choose
     * "uaccess" for that. If we could match for two tags here we
     * could add the seat name as second match tag, but this would
     * be hardly optimizable in libudev, and hence checking the
     * second tag manually in our loop is a good solution. */
    r = udev_enumerate_add_match_tag(e, "uaccess");
    if (r < 0)
        return r;

    r = udev_enumerate_add_match_is_initialized(e);
    if (r < 0)
        return r;

    r = udev_enumerate_scan_devices(e);
    if (r < 0)
        return r;

    first = udev_enumerate_get_list_entry(e);
    udev_list_entry_foreach(item, first) {
        _cleanup_udev_device_unref_ struct udev_device *d = NULL;
        const char *node, *sn;

        d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
        if (!d)
            return -ENOMEM;

        sn = udev_device_get_property_value(d, "ID_SEAT");
        if (isempty(sn))
            sn = "seat0";

        if (!streq(seat, sn))
            continue;

        node = udev_device_get_devnode(d);
        /* In case people mistag devices with nodes, we need to ignore this */
        if (!node)
            continue;

        n = strdup(node);
        if (!n)
            return -ENOMEM;

        log_debug("Found udev node %s for seat %s", n, seat);
        r = set_consume(nodes, n);
        if (r < 0)
            return r;
    }
示例#6
0
int devnode_acl_all(struct udev *udev,
                    const char *seat,
                    bool flush,
                    bool del, uid_t old_uid,
                    bool add, uid_t new_uid) {

        struct udev_list_entry *item = NULL, *first = NULL;
        struct udev_enumerate *e;
        int r;

        assert(udev);

        if (isempty(seat))
                seat = "seat0";

        e = udev_enumerate_new(udev);
        if (!e)
                return -ENOMEM;

        /* We can only match by one tag in libudev. We choose
         * "uaccess" for that. If we could match for two tags here we
         * could add the seat name as second match tag, but this would
         * be hardly optimizable in libudev, and hence checking the
         * second tag manually in our loop is a good solution. */

        r = udev_enumerate_add_match_tag(e, "uaccess");
        if (r < 0)
                goto finish;

        r = udev_enumerate_scan_devices(e);
        if (r < 0)
                goto finish;

        first = udev_enumerate_get_list_entry(e);
        udev_list_entry_foreach(item, first) {
                struct udev_device *d;
                const char *node, *sn;

                d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
                if (!d) {
                        r = -ENOMEM;
                        goto finish;
                }

                sn = udev_device_get_property_value(d, "ID_SEAT");
                if (isempty(sn))
                        sn = "seat0";

                if (!streq(seat, sn)) {
                        udev_device_unref(d);
                        continue;
                }

                node = udev_device_get_devnode(d);
                if (!node) {
                        /* In case people mistag devices with nodes, we need to ignore this */
                        udev_device_unref(d);
                        continue;
                }

                log_debug("Fixing up %s for seat %s...", node, sn);

                r = devnode_acl(node, flush, del, old_uid, add, new_uid);
                udev_device_unref(d);

                if (r < 0)
                        goto finish;
        }

finish:
        if (e)
                udev_enumerate_unref(e);

        return r;
}