packages: systemd/fetch_devices.c (NEW), systemd/udev-fake.service (NEW) - ...
gotar
gotar at pld-linux.org
Sun Jan 15 14:47:04 CET 2012
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
================================================================
More information about the pld-cvs-commit
mailing list