netlink: decode libudev netlink header
* 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>
This commit is contained in:
parent
d94871775a
commit
c9694f85ed
@ -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 \
|
||||
|
4
defs.h
4
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 *);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
65
netlink_kobject_uevent.c
Normal file
65
netlink_kobject_uevent.c
Normal file
@ -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("}");
|
||||
}
|
17
netlink_kobject_uevent.h
Normal file
17
netlink_kobject_uevent.h
Normal file
@ -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 */
|
Loading…
x
Reference in New Issue
Block a user