Author: gotar                        Date: Sun Jan 15 13:47:04 2012 GMT
Module: packages                      Tag: HEAD
---- Log message:
- working set for udevless systems

---- Files affected:
packages/systemd:
   fetch_devices.c (NONE -> 1.1)  (NEW), udev-fake.service (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/systemd/fetch_devices.c
diff -u /dev/null packages/systemd/fetch_devices.c:1.1
--- /dev/null   Sun Jan 15 14:47:04 2012
+++ packages/systemd/fetch_devices.c    Sun Jan 15 14:46:59 2012
@@ -0,0 +1,110 @@
+#define _GNU_SOURCE
+#include <libudev.h>
+#include <linux/netlink.h>
+#include <netinet/in.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifndef SOCK_CLOEXEC
+#define SOCK_CLOEXEC 0
+#endif
+
+#define        MONITOR_BUF_SIZE        4096
+#define UDEV_MONITOR_MAGIC     0xfeedcafe
+struct udev_monitor_netlink_header {
+       /* "libudev" prefix to distinguish libudev and kernel messages */
+       char prefix[8];
+       /*
+        * magic to protect against daemon <-> library message format mismatch
+        * used in the kernel from socket filter rules; needs to be stored in 
network order
+        */
+       unsigned int magic;
+       /* total length of header structure known to the sender */
+       unsigned int header_size;
+       /* properties string buffer */
+       unsigned int properties_off;
+       unsigned int properties_len;
+       /*
+        * hashes of primary device properties strings, to let libudev 
subscribers
+        * use in-kernel socket filters; values need to be stored in network 
order
+        */
+       unsigned int filter_subsystem_hash;
+       unsigned int filter_devtype_hash;
+       unsigned int filter_tag_bloom_hi;
+       unsigned int filter_tag_bloom_lo;
+};
+
+int main() {
+       int sock=socket(PF_NETLINK, SOCK_RAW|SOCK_CLOEXEC|SOCK_NONBLOCK, 
NETLINK_KOBJECT_UEVENT);
+       struct msghdr msg;
+       struct iovec iov[2];
+       char val[MONITOR_BUF_SIZE];
+       ssize_t i;
+       struct udev_monitor_netlink_header nlh;
+       struct udev *udev;
+       struct udev_enumerate *enumerate;
+       struct udev_list_entry *devices, *dev_list_entry;
+       struct udev_device *dev;
+       struct sockaddr_nl dst;
+
+       memset(&dst, 0 ,sizeof(dst));
+       dst.nl_family= AF_NETLINK;
+       dst.nl_pad=0;
+       dst.nl_pid=1;
+       dst.nl_groups=2;
+
+       memset(&msg,0,sizeof(msg));
+       msg.msg_iov = iov;
+       msg.msg_iovlen = 2;
+       msg.msg_name = &dst;
+       msg.msg_namelen = sizeof(dst);
+
+       memset(&nlh, 0, sizeof(nlh));
+       memcpy(nlh.prefix, "libudev", 8);
+       nlh.magic = htonl(UDEV_MONITOR_MAGIC);
+       nlh.header_size = sizeof(nlh);
+       iov[0].iov_base = &nlh;
+       iov[0].iov_len = sizeof(nlh);
+       nlh.properties_off = iov[0].iov_len;
+       nlh.filter_tag_bloom_hi = htonl(0xffffffff);
+       nlh.filter_tag_bloom_lo = htonl(0xffffffff);
+       
+       udev = udev_new();
+       enumerate = udev_enumerate_new(udev);
+//     udev_enumerate_add_match_subsystem(enumerate, "block");
+       udev_enumerate_scan_devices(enumerate);
+       devices = udev_enumerate_get_list_entry(enumerate);
+       udev_list_entry_foreach(dev_list_entry, devices) {
+               const char *path;
+               path = udev_list_entry_get_name(dev_list_entry);
+               dev = udev_device_new_from_syspath(udev, path);
+               if(udev_device_get_devnum(dev)==0) continue;
+               char *tmp;
+               int l;
+               i=0;
+               l=asprintf(&tmp,"ACTION=add");                                  
strcpy(val+i,tmp); i+=l+1; free(tmp);
+               l=asprintf(&tmp,"DEVNAME=%s",udev_device_get_devnode(dev));     
strcpy(val+i,tmp); i+=l+1; free(tmp);
+               l=asprintf(&tmp,"DEVPATH=%s",udev_device_get_devpath(dev));     
strcpy(val+i,tmp); i+=l+1; free(tmp);
+               l=asprintf(&tmp,"DEVTYPE=%s",udev_device_get_devtype(dev));     
strcpy(val+i,tmp); i+=l+1; free(tmp);
+               l=asprintf(&tmp,"MAJOR=%u",major(udev_device_get_devnum(dev))); 
strcpy(val+i,tmp); i+=l+1; free(tmp);
+               l=asprintf(&tmp,"MINOR=%u",minor(udev_device_get_devnum(dev))); 
strcpy(val+i,tmp); i+=l+1; free(tmp);
+               l=asprintf(&tmp,"SEQNUM=%lld",udev_device_get_seqnum(dev));     
strcpy(val+i,tmp); i+=l+1; free(tmp);
+               l=asprintf(&tmp,"SUBSYSTEM=%s",udev_device_get_subsystem(dev)); 
strcpy(val+i,tmp); i+=l+1; free(tmp);
+               l=asprintf(&tmp,"TAGS=:systemd:");                              
strcpy(val+i,tmp); i+=l+1; free(tmp);
+               l=asprintf(&tmp,"UDEV_LOG=%u",udev_get_log_priority(udev));     
strcpy(val+i,tmp); i+=l+1; free(tmp);
+               
l=asprintf(&tmp,"USEC_INITIALIZED=%lld",udev_device_get_usec_since_initialized(dev));
 strcpy(val+i,tmp); i+=l+1; free(tmp);
+               udev_device_unref(dev);
+               iov[1].iov_base = val;
+               iov[1].iov_len = i;
+               nlh.properties_len = i;
+               sendmsg(sock, &msg, 0);
+       }
+       udev_enumerate_unref(enumerate);
+       udev_unref(udev);
+
+       close(sock);
+       return EXIT_SUCCESS;
+}

================================================================
Index: packages/systemd/udev-fake.service
diff -u /dev/null packages/systemd/udev-fake.service:1.1
--- /dev/null   Sun Jan 15 14:47:04 2012
+++ packages/systemd/udev-fake.service  Sun Jan 15 14:46:59 2012
@@ -0,0 +1,8 @@
+[Unit]
+Description=non-udev Coldplug all Devices
+DefaultDependencies=no
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/root/fetch_devices
================================================================
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to