chiark / gitweb /
libudev: monitor - cache result of monitor send buffer
[elogind.git] / udev / lib / libudev-monitor.c
index 9f139170421bc21f75956a40e62bd92cd32f3c16..f70bdb2d03b7ee5dc1b490dbf0c4f2d2a20c3840 100644 (file)
@@ -380,43 +380,15 @@ struct udev_device *udev_monitor_receive_device(struct udev_monitor *udev_monito
 
 int udev_monitor_send_device(struct udev_monitor *udev_monitor, struct udev_device *udev_device)
 {
-       const char *action;
-       struct udev_list_entry *list_entry;
-       char buf[4096];
-       size_t bufpos;
-       size_t len;
+       const char *buf;
+       ssize_t len;
        ssize_t count;
 
-       action = udev_device_get_action(udev_device);
-       if (action == NULL)
-               return -EINVAL;
-
-       bufpos = util_strlcpy(buf, action, sizeof(buf));
-       len = util_strlcpy(&buf[bufpos], "@", sizeof(buf)-bufpos);
-       if (len >= sizeof(buf)-bufpos)
+       len = udev_device_get_properties_monitor_buf(udev_device, &buf);
+       if (len < 32)
                return -1;
-       bufpos += len;
-       len = util_strlcpy(&buf[bufpos], udev_device_get_devpath(udev_device), sizeof(buf)-bufpos);
-       if (len+1 >= sizeof(buf)-bufpos)
-               return -1;
-       bufpos += len+1;
-       udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(udev_device)) {
-               len = util_strlcpy(&buf[bufpos], udev_list_entry_get_name(list_entry), sizeof(buf)-bufpos);
-               if (len >= sizeof(buf)-bufpos)
-                       return -1;
-               bufpos += len;
-               len = util_strlcpy(&buf[bufpos], "=", sizeof(buf)-bufpos);
-               if (len >= sizeof(buf)-bufpos)
-                       return -1;
-               bufpos += len;
-               len = util_strlcpy(&buf[bufpos], udev_list_entry_get_value(list_entry), sizeof(buf)-bufpos);
-               if (len+1 >= sizeof(buf)-bufpos)
-                       return -1;
-               bufpos += len+1;
-       }
-
        count = sendto(udev_monitor->sock,
-                      &buf, bufpos, 0,
+                      buf, len, 0,
                       (struct sockaddr *)&udev_monitor->sun, udev_monitor->addrlen);
        info(udev_monitor->udev, "passed %zi bytes to monitor %p, \n", count, udev_monitor);
        return count;