*
* Copyright (C) 2008 Kay Sievers <kay.sievers@vrfy.org>
*
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * This library 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.
*/
#include <stdio.h>
int devlink_priority;
int refcount;
dev_t devnum;
+ int watch_handle;
unsigned int parent_set:1;
unsigned int subsystem_set:1;
unsigned int devtype_set:1;
case 'E':
udev_device_add_property_from_string(udev_device, val);
break;
+ case 'W':
+ udev_device_set_watch_handle(udev_device, atoi(val));
+ break;
}
}
fclose(f);
udev_list_init(&udev_device->properties_list);
udev_list_init(&udev_device->sysattr_list);
udev_device->event_timeout = -1;
+ udev_device->watch_handle = -1;
/* copy global properties */
udev_list_entry_foreach(list_entry, udev_get_properties_list_entry(udev))
udev_device_add_property(udev_device,
/* path is not a root directory */
subdir = &syspath[len+1];
pos = strrchr(subdir, '/');
- if (pos == NULL || pos < &subdir[2]) {
+ if (pos == NULL || pos[1] == '\0' || pos < &subdir[2]) {
dbg(udev, "not a subdir :%s\n", syspath);
return NULL;
}
{
struct udev_list_entry *list_entry;
char path[UTIL_PATH_SIZE];
- char value[UTIL_NAME_SIZE];
+ char value[4096];
struct stat statbuf;
int fd;
ssize_t size;
return udev_device_add_property(udev_device, name, val);
}
+const char *udev_device_get_property_value(struct udev_device *udev_device, const char *key)
+{
+ struct udev_list_entry *list_entry;
+
+ if (udev_device == NULL)
+ return NULL;
+ if (key == NULL)
+ return NULL;
+
+ list_entry = udev_device_get_properties_list_entry(udev_device);
+ list_entry = udev_list_entry_get_by_name(list_entry, key);
+ return udev_list_entry_get_value(list_entry);
+}
+
#define ENVP_SIZE 128
#define MONITOR_BUF_SIZE 4096
static int update_envp_monitor_buf(struct udev_device *udev_device)
{
- const char *action;
struct udev_list_entry *list_entry;
size_t bufpos;
size_t len;
if (udev_device->envp == NULL)
return -ENOMEM;
- /* header <action>@<devpath> */
- action = udev_device_get_action(udev_device);
- if (action == NULL)
- return -EINVAL;
- bufpos = util_strlcpy(udev_device->monitor_buf, action, MONITOR_BUF_SIZE);
- len = util_strlcpy(&udev_device->monitor_buf[bufpos], "@", MONITOR_BUF_SIZE-bufpos);
- if (len >= MONITOR_BUF_SIZE-bufpos)
- return -EINVAL;
- bufpos += len;
- len = util_strlcpy(&udev_device->monitor_buf[bufpos],
- udev_device_get_devpath(udev_device),
- MONITOR_BUF_SIZE-bufpos);
- if (len+1 >= MONITOR_BUF_SIZE-bufpos)
- return -EINVAL;
- bufpos += len+1;
-
i = 0;
+ bufpos = 0;
udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(udev_device)) {
/* add string to envp array */
udev_device->envp[i++] = &udev_device->monitor_buf[bufpos];
udev_device->ignore_remove = ignore;
return 0;
}
+
+int udev_device_get_watch_handle(struct udev_device *udev_device)
+{
+ if (!udev_device->info_loaded)
+ device_load_info(udev_device);
+ return udev_device->watch_handle;
+}
+
+int udev_device_set_watch_handle(struct udev_device *udev_device, int handle)
+{
+ udev_device->watch_handle = handle;
+ return 0;
+}