diff options
Diffstat (limited to 'shared/nm-udev-aux/nm-udev-utils.c')
| -rw-r--r-- | shared/nm-udev-aux/nm-udev-utils.c | 359 |
1 files changed, 175 insertions, 184 deletions
diff --git a/shared/nm-udev-aux/nm-udev-utils.c b/shared/nm-udev-aux/nm-udev-utils.c index c00dcd33..8131c04e 100644 --- a/shared/nm-udev-aux/nm-udev-utils.c +++ b/shared/nm-udev-aux/nm-udev-utils.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0+ +/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (C) 2017 Red Hat, Inc. */ @@ -10,181 +10,172 @@ #include <libudev.h> struct _NMPUdevClient { - char **subsystems; - GSource *watch_source; - struct udev *udev; - struct udev_monitor *monitor; - NMUdevClientEvent event_handler; - gpointer event_user_data; + char ** subsystems; + GSource * watch_source; + struct udev * udev; + struct udev_monitor *monitor; + NMUdevClientEvent event_handler; + gpointer event_user_data; }; /*****************************************************************************/ gboolean -nm_udev_utils_property_as_boolean (const char *uproperty) +nm_udev_utils_property_as_boolean(const char *uproperty) { - /* taken from g_udev_device_get_property_as_boolean() */ - - if (uproperty) { - if ( strcmp (uproperty, "1") == 0 - || g_ascii_strcasecmp (uproperty, "true") == 0) - return TRUE; - } - return FALSE; + /* taken from g_udev_device_get_property_as_boolean() */ + + if (uproperty) { + if (strcmp(uproperty, "1") == 0 || g_ascii_strcasecmp(uproperty, "true") == 0) + return TRUE; + } + return FALSE; } const char * -nm_udev_utils_property_decode (const char *uproperty, char **to_free) +nm_udev_utils_property_decode(const char *uproperty, char **to_free) { - const char *p; - char *unescaped = NULL; - char *n = NULL; - - if (!uproperty) { - *to_free = NULL; - return NULL; - } - - p = uproperty; - while (*p) { - int a, b; - - if ( p[0] == '\\' - && p[1] == 'x' - && (a = g_ascii_xdigit_value (p[2])) >= 0 - && (b = g_ascii_xdigit_value (p[3])) >= 0 - && (a || b)) { - if (!n) { - gssize l = p - uproperty; - - unescaped = g_malloc (l + strlen (p) + 1 - 3); - memcpy (unescaped, uproperty, l); - n = &unescaped[l]; - } - *n++ = (a << 4) | b; - p += 4; - } else { - if (n) - *n++ = *p; - p++; - } - } - - if (!n) { - *to_free = NULL; - return uproperty; - } - - *n++ = '\0'; - return (*to_free = unescaped); + const char *p; + char * unescaped = NULL; + char * n = NULL; + + if (!uproperty) { + *to_free = NULL; + return NULL; + } + + p = uproperty; + while (*p) { + int a, b; + + if (p[0] == '\\' && p[1] == 'x' && (a = g_ascii_xdigit_value(p[2])) >= 0 + && (b = g_ascii_xdigit_value(p[3])) >= 0 && (a || b)) { + if (!n) { + gssize l = p - uproperty; + + unescaped = g_malloc(l + strlen(p) + 1 - 3); + memcpy(unescaped, uproperty, l); + n = &unescaped[l]; + } + *n++ = (a << 4) | b; + p += 4; + } else { + if (n) + *n++ = *p; + p++; + } + } + + if (!n) { + *to_free = NULL; + return uproperty; + } + + *n++ = '\0'; + return (*to_free = unescaped); } char * -nm_udev_utils_property_decode_cp (const char *uproperty) +nm_udev_utils_property_decode_cp(const char *uproperty) { - char *cpy; + char *cpy; - uproperty = nm_udev_utils_property_decode (uproperty, &cpy); - return cpy ?: g_strdup (uproperty); + uproperty = nm_udev_utils_property_decode(uproperty, &cpy); + return cpy ?: g_strdup(uproperty); } /*****************************************************************************/ static void -_subsystem_split (const char *subsystem_full, - const char **out_subsystem, - const char **out_devtype, - char **to_free) +_subsystem_split(const char * subsystem_full, + const char **out_subsystem, + const char **out_devtype, + char ** to_free) { - char *tmp, *s; - - nm_assert (subsystem_full); - nm_assert (out_subsystem); - nm_assert (out_devtype); - nm_assert (to_free); - - s = strstr (subsystem_full, "/"); - if (s) { - tmp = g_strdup (subsystem_full); - s = &tmp[s - subsystem_full]; - *s = '\0'; - *out_subsystem = tmp; - *out_devtype = &s[1]; - *to_free = tmp; - } else { - *out_subsystem = subsystem_full; - *out_devtype = NULL; - *to_free = NULL; - } + char *tmp, *s; + + nm_assert(subsystem_full); + nm_assert(out_subsystem); + nm_assert(out_devtype); + nm_assert(to_free); + + s = strstr(subsystem_full, "/"); + if (s) { + tmp = g_strdup(subsystem_full); + s = &tmp[s - subsystem_full]; + *s = '\0'; + *out_subsystem = tmp; + *out_devtype = &s[1]; + *to_free = tmp; + } else { + *out_subsystem = subsystem_full; + *out_devtype = NULL; + *to_free = NULL; + } } static struct udev_enumerate * -nm_udev_utils_enumerate (struct udev *uclient, - const char *const*subsystems) +nm_udev_utils_enumerate(struct udev *uclient, const char *const *subsystems) { - struct udev_enumerate *enumerate; - guint n; + struct udev_enumerate *enumerate; + guint n; - enumerate = udev_enumerate_new (uclient); + enumerate = udev_enumerate_new(uclient); - if (subsystems) { - for (n = 0; subsystems[n]; n++) { - const char *subsystem; - const char *devtype; - gs_free char *to_free = NULL; + if (subsystems) { + for (n = 0; subsystems[n]; n++) { + const char * subsystem; + const char * devtype; + gs_free char *to_free = NULL; - _subsystem_split (subsystems[n], &subsystem, &devtype, &to_free); + _subsystem_split(subsystems[n], &subsystem, &devtype, &to_free); - udev_enumerate_add_match_subsystem (enumerate, subsystem); + udev_enumerate_add_match_subsystem(enumerate, subsystem); - if (devtype != NULL) - udev_enumerate_add_match_property (enumerate, "DEVTYPE", devtype); - } - } + if (devtype != NULL) + udev_enumerate_add_match_property(enumerate, "DEVTYPE", devtype); + } + } - return enumerate; + return enumerate; } struct udev * -nm_udev_client_get_udev (NMUdevClient *self) +nm_udev_client_get_udev(NMUdevClient *self) { - g_return_val_if_fail (self, NULL); + g_return_val_if_fail(self, NULL); - return self->udev; + return self->udev; } struct udev_enumerate * -nm_udev_client_enumerate_new (NMUdevClient *self) +nm_udev_client_enumerate_new(NMUdevClient *self) { - g_return_val_if_fail (self, NULL); + g_return_val_if_fail(self, NULL); - return nm_udev_utils_enumerate (self->udev, (const char *const*) self->subsystems); + return nm_udev_utils_enumerate(self->udev, (const char *const *) self->subsystems); } /*****************************************************************************/ static gboolean -monitor_event (int fd, - GIOCondition condition, - gpointer user_data) +monitor_event(int fd, GIOCondition condition, gpointer user_data) { - NMUdevClient *self = user_data; - struct udev_device *udevice; + NMUdevClient * self = user_data; + struct udev_device *udevice; - if (!self->monitor) - goto out; + if (!self->monitor) + goto out; - udevice = udev_monitor_receive_device (self->monitor); - if (udevice == NULL) - goto out; + udevice = udev_monitor_receive_device(self->monitor); + if (udevice == NULL) + goto out; - self->event_handler (self, - udevice, - self->event_user_data); - udev_device_unref (udevice); + self->event_handler(self, udevice, self->event_user_data); + udev_device_unref(udevice); out: - return TRUE; + return TRUE; } /** @@ -199,76 +190,76 @@ out: * Returns: a new NMUdevClient instance. */ NMUdevClient * -nm_udev_client_new (const char *const*subsystems, - NMUdevClientEvent event_handler, - gpointer event_user_data) +nm_udev_client_new(const char *const *subsystems, + NMUdevClientEvent event_handler, + gpointer event_user_data) { - NMUdevClient *self; - guint n; - - self = g_slice_new0 (NMUdevClient); - - self->event_handler = event_handler; - self->event_user_data = event_user_data; - self->subsystems = subsystems && subsystems[0] ? g_strdupv ((char **) subsystems) : NULL; - - self->udev = udev_new (); - if (!self->udev) - goto fail; - - /* connect to event source */ - if (self->event_handler) { - self->monitor = udev_monitor_new_from_netlink (self->udev, "udev"); - if (!self->monitor) - goto fail; - - if (self->subsystems) { - /* install subsystem filters to only wake up for certain events */ - for (n = 0; self->subsystems[n]; n++) { - gs_free char *to_free = NULL; - const char *subsystem; - const char *devtype; - - _subsystem_split (self->subsystems[n], &subsystem, &devtype, &to_free); - udev_monitor_filter_add_match_subsystem_devtype (self->monitor, subsystem, devtype); - } - - /* listen to events, and buffer them */ - udev_monitor_set_receive_buffer_size (self->monitor, 4*1024*1024); - udev_monitor_enable_receiving (self->monitor); - - self->watch_source = nm_g_unix_fd_source_new (udev_monitor_get_fd (self->monitor), - G_IO_IN, - G_PRIORITY_DEFAULT, - monitor_event, - self, - NULL); - g_source_attach (self->watch_source, g_main_context_get_thread_default ()); - } - } - - return self; + NMUdevClient *self; + guint n; + + self = g_slice_new0(NMUdevClient); + + self->event_handler = event_handler; + self->event_user_data = event_user_data; + self->subsystems = subsystems && subsystems[0] ? g_strdupv((char **) subsystems) : NULL; + + self->udev = udev_new(); + if (!self->udev) + goto fail; + + /* connect to event source */ + if (self->event_handler) { + self->monitor = udev_monitor_new_from_netlink(self->udev, "udev"); + if (!self->monitor) + goto fail; + + if (self->subsystems) { + /* install subsystem filters to only wake up for certain events */ + for (n = 0; self->subsystems[n]; n++) { + gs_free char *to_free = NULL; + const char * subsystem; + const char * devtype; + + _subsystem_split(self->subsystems[n], &subsystem, &devtype, &to_free); + udev_monitor_filter_add_match_subsystem_devtype(self->monitor, subsystem, devtype); + } + + /* listen to events, and buffer them */ + udev_monitor_set_receive_buffer_size(self->monitor, 4 * 1024 * 1024); + udev_monitor_enable_receiving(self->monitor); + + self->watch_source = nm_g_unix_fd_source_new(udev_monitor_get_fd(self->monitor), + G_IO_IN, + G_PRIORITY_DEFAULT, + monitor_event, + self, + NULL); + g_source_attach(self->watch_source, g_main_context_get_thread_default()); + } + } + + return self; fail: - return nm_udev_client_unref (self); + return nm_udev_client_unref(self); } NMUdevClient * -nm_udev_client_unref (NMUdevClient *self) +nm_udev_client_unref(NMUdevClient *self) { - if (!self) - return NULL; + if (!self) + return NULL; - nm_clear_g_source_inst (&self->watch_source); + nm_clear_g_source_inst(&self->watch_source); - udev_monitor_unref (self->monitor); - self->monitor = NULL; - udev_unref (self->udev); - self->udev = NULL; + udev_monitor_unref(self->monitor); + self->monitor = NULL; + udev_unref(self->udev); + self->udev = NULL; - g_strfreev (self->subsystems); + g_strfreev(self->subsystems); - g_slice_free (NMUdevClient, self); + g_slice_free(NMUdevClient, self); - return NULL; + return NULL; } |