| /*** |
| This file is part of systemd. |
| |
| Copyright 2008-2012 Kay Sievers <kay@vrfy.org> |
| Copyright 2015 Tom Gundersen <teg@jklm.no> |
| |
| systemd is free software; you can redistribute it and/or modify it |
| under the terms of the GNU Lesser General Public License as published by |
| the Free Software Foundation; either version 2.1 of the License, or |
| (at your option) any later version. |
| |
| systemd is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public License |
| along with systemd; If not, see <http://www.gnu.org/licenses/>. |
| ***/ |
| |
| #include "libudev.h" |
| #include "libudev-private.h" |
| #include "libudev-device-internal.h" |
| |
| #include "device-private.h" |
| |
| int udev_device_tag_index(struct udev_device *udev_device, struct udev_device *udev_device_old, bool add) { |
| sd_device *device_old = NULL; |
| int r; |
| |
| assert(udev_device); |
| |
| if (udev_device_old) |
| device_old = udev_device_old->device; |
| |
| r = device_tag_index(udev_device->device, device_old, add); |
| if (r < 0) |
| return r; |
| |
| return 0; |
| } |
| |
| int udev_device_update_db(struct udev_device *udev_device) { |
| int r; |
| |
| assert(udev_device); |
| |
| r = device_update_db(udev_device->device); |
| if (r < 0) |
| return r; |
| |
| return 0; |
| } |
| |
| int udev_device_delete_db(struct udev_device *udev_device) { |
| int r; |
| |
| assert(udev_device); |
| |
| r = device_delete_db(udev_device->device); |
| if (r < 0) |
| return r; |
| |
| return 0; |
| } |
| |
| int udev_device_get_ifindex(struct udev_device *udev_device) { |
| int r, ifindex; |
| |
| assert(udev_device); |
| |
| r = sd_device_get_ifindex(udev_device->device, &ifindex); |
| if (r < 0) |
| return r; |
| |
| return ifindex; |
| } |
| |
| const char *udev_device_get_devpath_old(struct udev_device *udev_device) { |
| const char *devpath_old = NULL; |
| int r; |
| |
| assert(udev_device); |
| |
| r = sd_device_get_property_value(udev_device->device, "DEVPATH_OLD", &devpath_old); |
| if (r < 0 && r != -ENOENT) { |
| errno = -r; |
| return NULL; |
| } |
| |
| return devpath_old; |
| } |
| |
| mode_t udev_device_get_devnode_mode(struct udev_device *udev_device) { |
| mode_t mode; |
| int r; |
| |
| assert(udev_device); |
| |
| r = device_get_devnode_mode(udev_device->device, &mode); |
| if (r < 0) { |
| errno = -r; |
| return 0; |
| } |
| |
| return mode; |
| } |
| |
| uid_t udev_device_get_devnode_uid(struct udev_device *udev_device) { |
| uid_t uid; |
| int r; |
| |
| assert(udev_device); |
| |
| r = device_get_devnode_uid(udev_device->device, &uid); |
| if (r < 0) { |
| errno = -r; |
| return 0; |
| } |
| |
| return uid; |
| } |
| |
| gid_t udev_device_get_devnode_gid(struct udev_device *udev_device) { |
| gid_t gid; |
| int r; |
| |
| assert(udev_device); |
| |
| r = device_get_devnode_gid(udev_device->device, &gid); |
| if (r < 0) { |
| errno = -r; |
| return 0; |
| } |
| |
| return gid; |
| } |
| |
| void udev_device_ensure_usec_initialized(struct udev_device *udev_device, struct udev_device *udev_device_old) { |
| sd_device *device_old = NULL; |
| |
| assert(udev_device); |
| |
| if (udev_device_old) |
| device_old = udev_device_old->device; |
| |
| device_ensure_usec_initialized(udev_device->device, device_old); |
| } |
| |
| char **udev_device_get_properties_envp(struct udev_device *udev_device) { |
| char **envp; |
| int r; |
| |
| assert(udev_device); |
| |
| r = device_get_properties_strv(udev_device->device, &envp); |
| if (r < 0) { |
| errno = -r; |
| return NULL; |
| } |
| |
| return envp; |
| } |
| |
| ssize_t udev_device_get_properties_monitor_buf(struct udev_device *udev_device, const char **buf) { |
| const char *nulstr; |
| size_t len; |
| int r; |
| |
| assert(udev_device); |
| assert(buf); |
| |
| r = device_get_properties_nulstr(udev_device->device, (const uint8_t **)&nulstr, &len); |
| if (r < 0) |
| return r; |
| |
| *buf = nulstr; |
| |
| return len; |
| } |
| |
| int udev_device_get_devlink_priority(struct udev_device *udev_device) { |
| int priority, r; |
| |
| assert(udev_device); |
| |
| r = device_get_devlink_priority(udev_device->device, &priority); |
| if (r < 0) |
| return r; |
| |
| return priority; |
| } |
| |
| int udev_device_get_watch_handle(struct udev_device *udev_device) { |
| int handle, r; |
| |
| assert(udev_device); |
| |
| r = device_get_watch_handle(udev_device->device, &handle); |
| if (r < 0) |
| return r; |
| |
| return handle; |
| } |
| |
| void udev_device_set_is_initialized(struct udev_device *udev_device) { |
| assert(udev_device); |
| |
| device_set_is_initialized(udev_device->device); |
| } |
| |
| int udev_device_rename(struct udev_device *udev_device, const char *name) { |
| int r; |
| |
| assert(udev_device); |
| |
| r = device_rename(udev_device->device, name); |
| if (r < 0) |
| return r; |
| |
| return 0; |
| } |
| |
| struct udev_device *udev_device_shallow_clone(struct udev_device *old_device) { |
| struct udev_device *device; |
| int r; |
| |
| assert(old_device); |
| |
| device = udev_device_new(old_device->udev); |
| if (!device) |
| return NULL; |
| |
| r = device_shallow_clone(old_device->device, &device->device); |
| if (r < 0) { |
| udev_device_unref(device); |
| errno = -r; |
| return NULL; |
| } |
| |
| return device; |
| } |
| |
| struct udev_device *udev_device_clone_with_db(struct udev_device *udev_device_old) { |
| struct udev_device *udev_device; |
| int r; |
| |
| assert(udev_device_old); |
| |
| udev_device = udev_device_new(udev_device_old->udev); |
| if (!udev_device) |
| return NULL; |
| |
| r = device_clone_with_db(udev_device_old->device, &udev_device->device); |
| if (r < 0) { |
| udev_device_unref(udev_device); |
| errno = -r; |
| return NULL; |
| } |
| |
| return udev_device; |
| } |
| |
| struct udev_device *udev_device_new_from_nulstr(struct udev *udev, char *nulstr, ssize_t buflen) { |
| struct udev_device *device; |
| int r; |
| |
| device = udev_device_new(udev); |
| if (!device) |
| return NULL; |
| |
| r = device_new_from_nulstr(&device->device, (uint8_t*)nulstr, buflen); |
| if (r < 0) { |
| udev_device_unref(device); |
| errno = -r; |
| return NULL; |
| } |
| |
| return device; |
| } |
| |
| struct udev_device *udev_device_new_from_synthetic_event(struct udev *udev, const char *syspath, const char *action) { |
| struct udev_device *device; |
| int r; |
| |
| device = udev_device_new(udev); |
| if (!device) |
| return NULL; |
| |
| r = device_new_from_synthetic_event(&device->device, syspath, action); |
| if (r < 0) { |
| udev_device_unref(device); |
| errno = -r; |
| return NULL; |
| } |
| |
| return device; |
| } |
| |
| int udev_device_copy_properties(struct udev_device *udev_device_dst, struct udev_device *udev_device_src) { |
| int r; |
| |
| assert(udev_device_dst); |
| assert(udev_device_src); |
| |
| r = device_copy_properties(udev_device_dst->device, udev_device_src->device); |
| if (r < 0) |
| return r; |
| |
| return 0; |
| } |
| |
| const char *udev_device_get_id_filename(struct udev_device *udev_device) { |
| const char *filename; |
| int r; |
| |
| assert(udev_device); |
| |
| r = device_get_id_filename(udev_device->device, &filename); |
| if (r < 0) { |
| errno = -r; |
| return NULL; |
| } |
| |
| return filename; |
| } |
| |
| int udev_device_set_watch_handle(struct udev_device *udev_device, int handle) { |
| |
| assert(udev_device); |
| |
| device_set_watch_handle(udev_device->device, handle); |
| |
| return 0; |
| } |
| |
| void udev_device_set_db_persist(struct udev_device *udev_device) { |
| assert(udev_device); |
| |
| device_set_db_persist(udev_device->device); |
| } |
| |
| int udev_device_set_devlink_priority(struct udev_device *udev_device, int priority) { |
| assert(udev_device); |
| |
| device_set_devlink_priority(udev_device->device, priority); |
| |
| return 0; |
| } |
| |
| int udev_device_add_devlink(struct udev_device *udev_device, const char *devlink) { |
| int r; |
| |
| assert(udev_device); |
| |
| r = device_add_devlink(udev_device->device, devlink); |
| if (r < 0) |
| return r; |
| |
| return 0; |
| } |
| |
| int udev_device_add_property(struct udev_device *udev_device, const char *property, const char *value) { |
| int r; |
| |
| assert(udev_device); |
| |
| r = device_add_property(udev_device->device, property, value); |
| if (r < 0) |
| return r; |
| |
| return 0; |
| } |
| |
| int udev_device_add_tag(struct udev_device *udev_device, const char *tag) { |
| int r; |
| |
| assert(udev_device); |
| |
| r = device_add_tag(udev_device->device, tag); |
| if (r < 0) |
| return r; |
| |
| return 0; |
| } |
| |
| void udev_device_remove_tag(struct udev_device *udev_device, const char *tag) { |
| assert(udev_device); |
| |
| device_remove_tag(udev_device->device, tag); |
| } |
| |
| void udev_device_cleanup_tags_list(struct udev_device *udev_device) { |
| assert(udev_device); |
| |
| device_cleanup_tags(udev_device->device); |
| } |
| |
| void udev_device_cleanup_devlinks_list(struct udev_device *udev_device) { |
| assert(udev_device); |
| |
| device_cleanup_devlinks(udev_device->device); |
| } |
| |
| void udev_device_set_info_loaded(struct udev_device *udev_device) { |
| assert(udev_device); |
| |
| device_seal(udev_device->device); |
| } |
| |
| void udev_device_read_db(struct udev_device *udev_device) { |
| assert(udev_device); |
| |
| device_read_db_force(udev_device->device); |
| } |