chiark / gitweb /
libudev: device - use DEVMODE from kernel as the default mode
[elogind.git] / libudev / libudev-device.c
index dd0224ae4b43e025d3aca6da3409f6fbd9eef555..d57a9eb59717c2c6fd692979e0fafe2e98d6c1a1 100644 (file)
@@ -51,6 +51,7 @@ struct udev_device {
        char *sysname;
        const char *sysnum;
        char *devnode;
+       mode_t devnode_mode;
        char *subsystem;
        char *devtype;
        char *driver;
@@ -69,7 +70,6 @@ struct udev_device {
        struct udev_list_node tags_list;
        unsigned long long int seqnum;
        unsigned long long int usec_initialized;
-       int event_timeout;
        int timeout;
        int devlink_priority;
        int refcount;
@@ -89,6 +89,7 @@ struct udev_device {
        bool uevent_loaded;
        bool is_initialized;
        bool sysattr_list_read;
+       bool db_persist;
 };
 
 struct udev_list_entry *udev_device_add_property(struct udev_device *udev_device, const char *key, const char *value)
@@ -103,7 +104,7 @@ struct udev_list_entry *udev_device_add_property(struct udev_device *udev_device
                        udev_list_entry_delete(list_entry);
                return NULL;
        }
-       return udev_list_entry_add(udev_device->udev, &udev_device->properties_list, key, value, 1, 0);
+       return udev_list_entry_add(udev_device->udev, &udev_device->properties_list, key, value, UDEV_LIST_UNIQUE);
 }
 
 static struct udev_list_entry *udev_device_add_property_from_string(struct udev_device *udev_device, const char *property)
@@ -199,6 +200,8 @@ void udev_device_add_property_from_string_parse(struct udev_device *udev_device,
                udev_device_set_timeout(udev_device, strtoull(&property[8], NULL, 10));
        } else if (strncmp(property, "IFINDEX=", 8) == 0) {
                udev_device_set_ifindex(udev_device, strtoull(&property[8], NULL, 10));
+       } else if (strncmp(property, "DEVMODE=", 8) == 0) {
+               udev_device_set_devnode_mode(udev_device, strtoul(&property[8], NULL, 8));
        } else {
                udev_device_add_property_from_string(udev_device, property);
        }
@@ -254,7 +257,7 @@ int udev_device_read_db(struct udev_device *udev_device, const char *dbfile)
                id = udev_device_get_id_filename(udev_device);
                if (id == NULL)
                        return -1;
-               util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev_device->udev), "/.run/udev/db3/", id, NULL);
+               util_strscpyl(filename, sizeof(filename), udev_get_run_path(udev_device->udev), "/data/", id, NULL);
                dbfile = filename;
        }
 
@@ -289,7 +292,7 @@ int udev_device_read_db(struct udev_device *udev_device, const char *dbfile)
                        break;
                case 'E':
                        entry = udev_device_add_property_from_string(udev_device, val);
-                       udev_list_entry_set_flags(entry, 1);
+                       udev_list_entry_set_num(entry, true);
                        break;
                case 'G':
                        udev_device_add_tag(udev_device, val);
@@ -343,6 +346,8 @@ int udev_device_read_uevent_file(struct udev_device *udev_device)
                        udev_device_set_ifindex(udev_device, strtoull(&line[8], NULL, 10));
                else if (strncmp(line, "DEVNAME=", 8) == 0)
                        udev_device_set_knodename(udev_device, &line[8]);
+               else if (strncmp(line, "DEVMODE=", 8) == 0)
+                       udev_device->devnode_mode = strtoul(&line[8], NULL, 8);
 
                udev_device_add_property_from_string(udev_device, line);
        }
@@ -375,7 +380,7 @@ struct udev_device *udev_device_new(struct udev *udev)
        udev_list_init(&udev_device->sysattr_value_list);
        udev_list_init(&udev_device->sysattr_list);
        udev_list_init(&udev_device->tags_list);
-       udev_device->event_timeout = -1;
+       udev_device->timeout = -1;
        udev_device->watch_handle = -1;
        /* copy global properties */
        udev_list_entry_foreach(list_entry, udev_get_properties_list_entry(udev))
@@ -930,6 +935,13 @@ const char *udev_device_get_devnode(struct udev_device *udev_device)
        return udev_device->devnode;
 }
 
+mode_t udev_device_get_devnode_mode(struct udev_device *udev_device)
+{
+       if (!udev_device->info_loaded)
+               udev_device_read_uevent_file(udev_device);
+       return udev_device->devnode_mode;
+}
+
 /**
  * udev_device_get_subsystem:
  * @udev_device: udev device
@@ -1163,7 +1175,7 @@ unsigned long long int udev_device_get_usec_since_initialized(struct udev_device
                udev_device_read_db(udev_device, NULL);
        if (udev_device->usec_initialized == 0)
                return 0;
-       now = usec_monotonic();
+       now = now_usec();
        if (now == 0)
                return 0;
        return now - udev_device->usec_initialized;
@@ -1216,7 +1228,7 @@ const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const
        util_strscpyl(path, sizeof(path), udev_device_get_syspath(udev_device), "/", sysattr, NULL);
        if (lstat(path, &statbuf) != 0) {
                dbg(udev_device->udev, "no attribute '%s', keep negative entry\n", path);
-               udev_list_entry_add(udev_device->udev, &udev_device->sysattr_value_list, sysattr, NULL, 0, 0);
+               udev_list_entry_add(udev_device->udev, &udev_device->sysattr_value_list, sysattr, NULL, 0);
                goto out;
        }
 
@@ -1240,7 +1252,7 @@ const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const
                if (pos != NULL) {
                        pos = &pos[1];
                        dbg(udev_device->udev, "cache '%s' with link value '%s'\n", sysattr, pos);
-                       list_entry = udev_list_entry_add(udev_device->udev, &udev_device->sysattr_value_list, sysattr, pos, 0, 0);
+                       list_entry = udev_list_entry_add(udev_device->udev, &udev_device->sysattr_value_list, sysattr, pos, 0);
                        val = udev_list_entry_get_value(list_entry);
                }
 
@@ -1272,7 +1284,7 @@ const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const
        value[size] = '\0';
        util_remove_trailing_chars(value, '\n');
        dbg(udev_device->udev, "'%s' has attribute value '%s'\n", path, value);
-       list_entry = udev_list_entry_add(udev_device->udev, &udev_device->sysattr_value_list, sysattr, value, 0, 0);
+       list_entry = udev_list_entry_add(udev_device->udev, &udev_device->sysattr_value_list, sysattr, value, 0);
        val = udev_list_entry_get_value(list_entry);
 out:
        return val;
@@ -1311,7 +1323,7 @@ static int udev_device_sysattr_list_read(struct udev_device *udev_device)
                        continue;
 
                udev_list_entry_add(udev_device->udev, &udev_device->sysattr_list,
-                                   dent->d_name, NULL, 0, 0);
+                                   dent->d_name, NULL, 0);
                num++;
        }
 
@@ -1414,16 +1426,26 @@ int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode
        return 0;
 }
 
+int udev_device_set_devnode_mode(struct udev_device *udev_device, mode_t mode)
+{
+       char num[32];
+
+       udev_device->devnode_mode = mode;
+       snprintf(num, sizeof(num), "%#o", mode);
+       udev_device_add_property(udev_device, "DEVMODE", num);
+       return 0;
+}
+
 int udev_device_add_devlink(struct udev_device *udev_device, const char *devlink, int unique)
 {
        struct udev_list_entry *list_entry;
 
        udev_device->devlinks_uptodate = false;
-       list_entry = udev_list_entry_add(udev_device->udev, &udev_device->devlinks_list, devlink, NULL, 1, 0);
+       list_entry = udev_list_entry_add(udev_device->udev, &udev_device->devlinks_list, devlink, NULL, UDEV_LIST_UNIQUE);
        if (list_entry == NULL)
                return -ENOMEM;
        if (unique)
-               udev_list_entry_set_flags(list_entry, 1);
+               udev_list_entry_set_num(list_entry, true);
        return 0;
 }
 
@@ -1491,7 +1513,7 @@ int udev_device_add_tag(struct udev_device *udev_device, const char *tag)
        if (strchr(tag, ':') != NULL || strchr(tag, ' ') != NULL)
                return -EINVAL;
        udev_device->tags_uptodate = false;
-       if (udev_list_entry_add(udev_device->udev, &udev_device->tags_list, tag, NULL, 1, 0) != NULL)
+       if (udev_list_entry_add(udev_device->udev, &udev_device->tags_list, tag, NULL, UDEV_LIST_UNIQUE) != NULL)
                return 0;
        return -ENOMEM;
 }
@@ -1688,23 +1710,11 @@ int udev_device_get_timeout(struct udev_device *udev_device)
 }
 
 int udev_device_set_timeout(struct udev_device *udev_device, int timeout)
-{
-       udev_device->timeout = timeout;
-       return 0;
-}
-int udev_device_get_event_timeout(struct udev_device *udev_device)
-{
-       if (!udev_device->info_loaded)
-               udev_device_read_db(udev_device, NULL);
-       return udev_device->event_timeout;
-}
-
-int udev_device_set_event_timeout(struct udev_device *udev_device, int event_timeout)
 {
        char num[32];
 
-       udev_device->event_timeout = event_timeout;
-       snprintf(num, sizeof(num), "%u", event_timeout);
+       udev_device->timeout = timeout;
+       snprintf(num, sizeof(num), "%u", timeout);
        udev_device_add_property(udev_device, "TIMEOUT", num);
        return 0;
 }
@@ -1774,3 +1784,13 @@ int udev_device_set_ifindex(struct udev_device *udev_device, int ifindex)
        udev_device_add_property(udev_device, "IFINDEX", num);
        return 0;
 }
+
+bool udev_device_get_db_persist(struct udev_device *udev_device)
+{
+       return udev_device->db_persist;
+}
+
+void udev_device_set_db_persist(struct udev_device *udev_device)
+{
+       udev_device->db_persist = true;
+}