]> granicus.if.org Git - strace/commitdiff
netlink: decode libudev netlink header
authorHarsha Sharma <harshasharmaiitr@gmail.com>
Sat, 3 Mar 2018 11:11:43 +0000 (16:41 +0530)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 11 Apr 2018 22:01:37 +0000 (22:01 +0000)
* defs.h (decode_netlink_kobject_uevent): New prototype.
* netlink.c (decode_netlink): Decode family kobject_uevent.
* netlink_kobject_uevent.h: New file.
* netlink_kobject_uevent.c: Likewise.
* Makefile.am (strace_SOURCES): Add them.

Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
Signed-off-by: Harsha Sharma <harshasharmaiitr@gmail.com>
Makefile.am
defs.h
netlink.c
netlink_kobject_uevent.c [new file with mode: 0644]
netlink_kobject_uevent.h [new file with mode: 0644]

index 133e9c2def648db2a455df4411e33a035429b42b..488bcc2e753baa6bf84e12b68a52e47ef6868b91 100644 (file)
@@ -204,6 +204,8 @@ strace_SOURCES =    \
        netlink.c       \
        netlink.h       \
        netlink_crypto.c \
+       netlink_kobject_uevent.c \
+       netlink_kobject_uevent.h \
        netlink_sock_diag.h \
        netlink_inet_diag.c \
        netlink_netfilter.c \
diff --git a/defs.h b/defs.h
index 28285c931451713a700c15834d492c1b8f6a55ce..12c76f38e2bc1cb255f9855e4c96e83b08983f1c 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -744,6 +744,10 @@ DECL_NETLINK(route);
 DECL_NETLINK(selinux);
 DECL_NETLINK(sock_diag);
 
+extern void
+decode_netlink_kobject_uevent(struct tcb *, kernel_ulong_t addr,
+                             kernel_ulong_t len);
+
 extern int ts_nz(const struct timespec *);
 extern int ts_cmp(const struct timespec *, const struct timespec *);
 extern double ts_float(const struct timespec *);
index b5855f6030e68aff3c32b8207e45c54018ad2208..c9abb4c8eb1da7af2f7a4459387c27b7b7197648 100644 (file)
--- a/netlink.c
+++ b/netlink.c
@@ -631,7 +631,7 @@ decode_netlink(struct tcb *const tcp,
        const int family = get_fd_nl_family(tcp, fd);
 
        if (family == NETLINK_KOBJECT_UEVENT) {
-               printstrn(tcp, addr, len);
+               decode_netlink_kobject_uevent(tcp, addr, len);
                return;
        }
 
diff --git a/netlink_kobject_uevent.c b/netlink_kobject_uevent.c
new file mode 100644 (file)
index 0000000..35f305a
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2018 Harsha Sharma <harshasharmaiitr@gmail.com>
+ * Copyright (c) 2018 The strace developers.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "defs.h"
+#include "print_fields.h"
+#include "netlink_kobject_uevent.h"
+
+#include <arpa/inet.h>
+
+void
+decode_netlink_kobject_uevent(struct tcb *tcp, kernel_ulong_t addr,
+                             kernel_ulong_t len)
+{
+       struct udev_monitor_netlink_header uh;
+       const char *prefix = "libudev";
+       unsigned int offset = sizeof(uh);
+
+       if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
+           !addr || len < offset || umove(tcp, addr, &uh) ||
+           strcmp(uh.prefix, prefix) != 0) {
+               printstrn(tcp, addr, len);
+               return;
+       }
+
+       PRINT_FIELD_CSTRING("{{", uh, prefix);
+       tprintf(", magic=htonl(%#x)", ntohl(uh.magic));
+       PRINT_FIELD_U(", ", uh, header_size);
+       PRINT_FIELD_U(", ", uh, properties_off);
+       PRINT_FIELD_U(", ", uh, properties_len);
+       tprintf(", filter_subsystem_hash=htonl(%#x)", ntohl(uh.filter_subsystem_hash));
+       tprintf(", filter_devtype_hash=htonl(%#x)", ntohl(uh.filter_devtype_hash));
+       tprintf(", filter_tag_bloom_hi=htonl(%#x)", ntohl(uh.filter_tag_bloom_hi));
+       tprintf(", filter_tag_bloom_lo=htonl(%#x)", ntohl(uh.filter_tag_bloom_lo));
+       tprints("}");
+       if (len > offset) {
+               tprints(", ");
+               printstrn(tcp, addr + offset, len - offset);
+       }
+       tprints("}");
+}
diff --git a/netlink_kobject_uevent.h b/netlink_kobject_uevent.h
new file mode 100644 (file)
index 0000000..5ac57ca
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef STRACE_NETLINK_KOBJECT_UEVENT_H
+#define STRACE_NETLINK_KOBJECT_UEVENT_H
+
+struct udev_monitor_netlink_header {
+       /* "libudev" prefix to distinguish libudev and kernel messages */
+       char prefix[8];
+       unsigned int magic;
+       unsigned int header_size;
+       unsigned int properties_off;
+       unsigned int properties_len;
+       unsigned int filter_subsystem_hash;
+       unsigned int filter_devtype_hash;
+       unsigned int filter_tag_bloom_hi;
+       unsigned int filter_tag_bloom_lo;
+};
+
+#endif /* !STRACE_NETLINK_KOBJECT_UEVENT_H */