/** * Checks whether the device is a keyboard. * * @param syspath The /sys/ path with or without the /sys/ * @return If true, the device is a keyboard */ EAPI Eina_Bool eeze_udev_syspath_is_kbd(const char *syspath) { _udev_device *device = NULL; Eina_Bool kbd = EINA_FALSE; const char *test = NULL; if (!syspath) return EINA_FALSE; if (!(device = _new_device(syspath))) return EINA_FALSE; #ifdef OLD_UDEV_RRRRRRRRRRRRRR kbd = _walk_parents_test_attr(device, "bInterfaceProtocol", "01"); if (!kbd) { test = udev_device_get_property_value(device, "ID_CLASS"); if ((test) && (!strcmp(test, "kbd"))) kbd = EINA_TRUE; } #else test = udev_device_get_property_value(device, "ID_INPUT_KEYBOARD"); if (test && (test[0] == '1')) kbd = EINA_TRUE; #endif udev_device_unref(device); return kbd; }
EAPI Eina_List * eeze_udev_syspath_get_parents(const char *syspath) { _udev_device *child, *parent, *device; const char *path; Eina_List *devlist = NULL; if (!syspath) return NULL; if (!(device = _new_device(syspath))) return NULL; if (!(parent = udev_device_get_parent(device))) return NULL; for (; parent; child = parent, parent = udev_device_get_parent(child)) { path = udev_device_get_syspath(parent); devlist = eina_list_append(devlist, eina_stringshare_add(path)); } udev_device_unref(device); return devlist; }
/** * Walks up the device chain starting at @p syspath, * checking each device for @p sysattr with (optional) @p value. * * @param syspath The /sys/ path of the device to start at, with or without the /sys/ * @param sysattr The attribute to find * @param value OPTIONAL: The value that @p sysattr should have, or NULL * * @return If the sysattr (with value) is found, returns TRUE. Else, false. */ EAPI Eina_Bool eeze_udev_walk_check_sysattr(const char *syspath, const char *sysattr, const char *value) { _udev_device *device, *child, *parent; Eina_Bool ret = EINA_FALSE; const char *test = NULL; if (!udev) return EINA_FALSE; if (!(device = _new_device(syspath))) return EINA_FALSE; for (parent = device; parent; child = parent, parent = udev_device_get_parent(child)) { if (!(test = udev_device_get_sysattr_value(parent, sysattr))) continue; if ((value && (!strcmp(test, value))) || (!value)) { ret = EINA_TRUE; break; } } udev_device_unref(device); return ret; }
/** * Checks whether the device is a mouse. * * @param syspath The /sys/ path with or without the /sys/ * @return If true, the device is a mouse */ EAPI Eina_Bool eeze_udev_syspath_is_mouse(const char *syspath) { _udev_device *device = NULL; Eina_Bool mouse = EINA_FALSE; const char *test = NULL; if (!syspath) return EINA_FALSE; if (!(device = _new_device(syspath))) return EINA_FALSE; #ifdef OLD_UDEV_RRRRRRRRRRRRRR mouse = _walk_parents_test_attr(device, "bInterfaceProtocol", "02"); if (!mouse) { test = udev_device_get_property_value(device, "ID_CLASS"); if ((test) && (!strcmp(test, "mouse"))) mouse = EINA_TRUE; } #else test = udev_device_get_property_value(device, "ID_INPUT_MOUSE"); if (test && (test[0] == '1')) mouse = EINA_TRUE; #endif udev_device_unref(device); return mouse; }
/** * Walks up the device chain starting at @p syspath, * checking each device for @p sysattr, and returns the value if found. * * @param syspath The /sys/ path of the device to start at, with or without the /sys/ * @param sysattr The attribute to find * * @return The stringshared value of @p sysattr if found, or NULL */ EAPI const char * eeze_udev_walk_get_sysattr(const char *syspath, const char *sysattr) { _udev_device *device, *child, *parent; const char *test = NULL; if (!syspath) return NULL; if (!(device = _new_device(syspath))) return NULL; for (parent = device; parent; child = parent, parent = udev_device_get_parent(child)) { if ((test = udev_device_get_sysattr_value(parent, sysattr))) { test = eina_stringshare_add(test); udev_device_unref(device); return test; } } udev_device_unref(device); return NULL; }
EAPI const char * eeze_udev_syspath_get_subsystem(const char *syspath) { _udev_device *device; const char *subsystem; if (!syspath) return NULL; if (!(device = _new_device(syspath))) return NULL; subsystem = eina_stringshare_add(udev_device_get_property_value(device, "SUBSYSTEM")); udev_device_unref(device); return subsystem; }
EAPI Eina_Stringshare * eeze_udev_syspath_get_parent_filtered(const char *syspath, const char *subsystem, const char *devtype) { _udev_device *device, *parent; Eina_Stringshare *ret = NULL; EINA_SAFETY_ON_NULL_RETURN_VAL(syspath, NULL); if (!(device = _new_device(syspath))) return NULL; parent = udev_device_get_parent_with_subsystem_devtype(device, subsystem, devtype); if (parent) ret = eina_stringshare_add(udev_device_get_syspath(parent)); udev_device_unref(device); return ret; }
EAPI const char * eeze_udev_syspath_get_parent(const char *syspath) { _udev_device *device, *parent; const char *ret; if (!syspath) return NULL; if (!(device = _new_device(syspath))) return NULL; parent = udev_device_get_parent(device); ret = eina_stringshare_add(udev_device_get_syspath(parent)); udev_device_unref(device); return ret; }
/** * @brief Create a new net object * @param name The name of the underlying device (eth0, br1, etc) * @return A newly allocated net object, or NULL on failure * * This function creates a new net object based on @p name. * Only the most minimal lookups are performed at creation in order * to save memory. */ Eeze_Net * eeze_net_new(const char *name) { const char *syspath = NULL; const char *idx; _udev_enumerate *en; _udev_list_entry *devs, *cur; _udev_device *device = NULL; Eeze_Net *net; net = eina_hash_find(eeze_nets, name); if (net) { EINA_REFCOUNT_REF(net); return net; } en = udev_enumerate_new(udev); udev_enumerate_add_match_sysname(en, name); udev_enumerate_add_match_subsystem(en, "net"); udev_enumerate_scan_devices(en); devs = udev_enumerate_get_list_entry(en); udev_list_entry_foreach(cur, devs) { const char *devname, *test; devname = udev_list_entry_get_name(cur); test = strrchr(devname, '/'); if (strcmp(++test, name)) continue; device = _new_device(devname); syspath = eina_stringshare_add(name); break; } if (!device) return NULL; net = calloc(1, sizeof(Eeze_Net)); if (!net) return NULL; EINA_REFCOUNT_INIT(net); net->device = device; net->syspath = syspath; net->name = eina_stringshare_add(name); idx = udev_device_get_sysattr_value(net->device, "ifindex"); net->index = atoi(idx); eina_hash_add(eeze_nets, name, net); udev_enumerate_unref(en); return net; }
/** * Get the property value of a device from the /sys/ path. * * @param syspath The /sys/ path with or without the /sys/ * @param property The property to get; full list of these is a FIXME * @return A stringshared char* with the property or NULL on failure */ EAPI const char * eeze_udev_syspath_get_property(const char *syspath, const char *property) { _udev_device *device; const char *value = NULL, *test; if (!syspath || !property) return NULL; if (!(device = _new_device(syspath))) return NULL; if ((test = udev_device_get_property_value(device, property))) value = eina_stringshare_add(test); udev_device_unref(device); return value; }
EAPI Eina_Bool eeze_udev_syspath_check_property(const char *syspath, const char *property, const char *value) { _udev_device *device; const char *test; Eina_Bool ret = EINA_FALSE; if (!syspath || !property || !value) return EINA_FALSE; if (!(device = _new_device(syspath))) return EINA_FALSE; if ((test = udev_device_get_property_value(device, property))) ret = !strcmp(test, value); udev_device_unref(device); return ret; }
EAPI Eina_List * eeze_udev_syspath_get_sysattr_list(const char *syspath) { _udev_device *device; _udev_list_entry *devs, *cur; Eina_List *syslist = NULL; if (!syspath) return NULL; if (!(device = _new_device(syspath))) return NULL; devs = udev_device_get_sysattr_list_entry(device); udev_list_entry_foreach(cur, devs) { syslist = eina_list_append(syslist, eina_stringshare_add(udev_list_entry_get_name(cur))); }
EAPI const char * eeze_udev_syspath_get_devname(const char *syspath) { _udev_device *device; const char *name = NULL; if (!syspath) return NULL; if (!(device = _new_device(syspath))) return NULL; if (!(name = udev_device_get_sysname(device))) return NULL; name = eina_stringshare_add(name); udev_device_unref(device); return name; }
EAPI Eina_Bool eeze_udev_syspath_check_sysattr(const char *syspath, const char *sysattr, const char *value) { _udev_device *device; const char *test; Eina_Bool ret = EINA_FALSE; if (!syspath || !sysattr || !value) return EINA_FALSE; if (!(device = _new_device(syspath))) return EINA_FALSE; if ((test = udev_device_get_sysattr_value(device, sysattr))) ret = !strcmp(test, value); udev_device_unref(device); return ret; }
EAPI Eina_Bool eeze_udev_syspath_is_mouse(const char *syspath) { _udev_device *device = NULL; Eina_Bool mouse = EINA_FALSE; const char *test = NULL; if (!syspath) return EINA_FALSE; if (!(device = _new_device(syspath))) return EINA_FALSE; test = udev_device_get_property_value(device, "ID_INPUT_MOUSE"); if (test && (test[0] == '1')) mouse = EINA_TRUE; udev_device_unref(device); return mouse; }
EAPI Eina_Bool eeze_udev_syspath_is_touchpad(const char *syspath) { _udev_device *device = NULL; Eina_Bool touchpad = EINA_FALSE; const char *test; if (!syspath) return EINA_FALSE; if (!(device = _new_device(syspath))) return EINA_FALSE; test = udev_device_get_property_value(device, "ID_INPUT_TOUCHPAD"); if (test && (test[0] == '1')) touchpad = EINA_TRUE; udev_device_unref(device); return touchpad; }
EAPI Eina_Bool eeze_udev_syspath_is_joystick(const char *syspath) { _udev_device *device = NULL; Eina_Bool joystick = EINA_FALSE; const char *test; if (!syspath) return EINA_FALSE; if (!(device = _new_device(syspath))) return EINA_FALSE; test = udev_device_get_property_value(device, "ID_INPUT_JOYSTICK"); if (test && (test[0] == '1')) joystick = EINA_TRUE; udev_device_unref(device); return joystick; }
EAPI Eina_Bool eeze_udev_syspath_is_kbd(const char *syspath) { _udev_device *device = NULL; Eina_Bool kbd = EINA_FALSE; const char *test = NULL; if (!syspath) return EINA_FALSE; if (!(device = _new_device(syspath))) return EINA_FALSE; test = udev_device_get_property_value(device, "ID_INPUT_KEYBOARD"); if (test && (test[0] == '1')) kbd = EINA_TRUE; udev_device_unref(device); return kbd; }
/** * Checks whether the device is a touchpad. * * @param syspath The /sys/ path with or without the /sys/ * @return If true, the device is a touchpad */ EAPI Eina_Bool eeze_udev_syspath_is_touchpad(const char *syspath) { _udev_device *device = NULL; Eina_Bool touchpad = EINA_FALSE; if (!syspath) return EINA_FALSE; if (!(device = _new_device(syspath))) return EINA_FALSE; #ifdef OLD_UDEV_RRRRRRRRRRRRRR touchpad = _walk_parents_test_attr(device, "resolution", NULL); #else const char *test; test = udev_device_get_property_value(device, "ID_INPUT_TOUCHPAD"); if (test && (test[0] == '1')) touchpad = EINA_TRUE; #endif udev_device_unref(device); return touchpad; }
EAPI Eina_Bool eeze_udev_syspath_set_sysattr(const char *syspath, const char *sysattr, double value) { _udev_device *device; char val[16]; Eina_Bool ret = EINA_FALSE; int test; if (!syspath || !sysattr) return EINA_FALSE; if (!(device = _new_device(syspath))) return EINA_FALSE; sprintf(val, "%f", value); test = udev_device_set_sysattr_value(device, sysattr, val); if (test == 0) ret = EINA_TRUE; udev_device_unref(device); return ret; }