[PATCH v4] tests: extend for decoding of udev_monitor_netlink_header

Dmitry V. Levin ldv at altlinux.org
Tue Mar 27 20:49:25 UTC 2018


On Wed, Mar 28, 2018 at 01:44:06AM +0530, Harsha Sharma wrote:
> * tests/netlink_kobject_uevent.c: Add test_nlmsg_type_udev.
> ---
> Changes in v4:
> * invoke sprintrc before first printf call
> * minor fix
> 
> Changes in v3:
> * change format type
> 
> Changes in v2:
> * Add decoding of kernel messages
> * initialize udev_monitor_netlink_header with non-zero values
> * cover case for length exceeding size of structure
> 
>  tests/netlink_kobject_uevent.c | 68 ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 68 insertions(+)
> 
> diff --git a/tests/netlink_kobject_uevent.c b/tests/netlink_kobject_uevent.c
> index cacab5fd..09708e62 100644
> --- a/tests/netlink_kobject_uevent.c
> +++ b/tests/netlink_kobject_uevent.c
> @@ -27,9 +27,75 @@
>   */
>  
>  #include "tests.h"
> +#include <string.h>
>  #include <stdio.h>
>  #include <sys/socket.h>
> +#include <arpa/inet.h>
>  #include "netlink.h"
> +#include "netlink_kobject_uevent.h"
> +
> +static void
> +test_nlmsg_type_udev(const int fd)
> +{
> +	long ret;
> +	const char *err_rc;
> +	unsigned int offset = 8;
> +	struct udev_monitor_netlink_header uh = {
> +		.prefix = "libudev",
> +		.magic = htonl(0xfeedcafe),
> +		.header_size = sizeof(uh),
> +		.properties_off = 40,
> +		.properties_len = 299,
> +		.filter_subsystem_hash = htonl(0xc370b302),
> +		.filter_devtype_hash = htonl(0x10800000),
> +		.filter_tag_bloom_hi = htonl(0x2000400),
> +		.filter_tag_bloom_lo = htonl(0x10800000),
> +	};
> +	unsigned int len = sizeof(uh);
> +	char buf[len + offset];
> +	memcpy(buf, &uh, len);
> +	memcpy(buf + len, "12345678", offset);
> +
> +	ret = sendto(fd, &buf, len + offset, MSG_DONTWAIT, NULL, 0);
> +	err_rc = sprintrc(ret);
> +	printf("sendto(%d, {{prefix=\"%s\", magic=htonl(%#x)"
> +	       ", header_size=%u, properties_off=%u, properties_len=%u"
> +	       ", filter_subsystem_hash=htonl(%#x)"
> +	       ", filter_devtype_hash=htonl(%#x)"
> +	       ", filter_tag_bloom_hi=htonl(%#x)"
> +	       ", filter_tag_bloom_lo=htonl(%#x)}, "
> +	       , fd, uh.prefix,
> +	       ntohl(uh.magic), uh.header_size, uh.properties_off,
> +	       uh.properties_len, ntohl(uh.filter_subsystem_hash),
> +	       ntohl(uh.filter_devtype_hash), ntohl(uh.filter_tag_bloom_hi),
> +	       ntohl(uh.filter_tag_bloom_lo));
> +	print_quoted_memory(buf + len, offset);
> +	printf("}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
> +	       len + offset, err_rc);
> +
> +}
> +
> +static void
> +test_nlmsg_type_kernel(const int fd)
> +{
> +	long ret;
> +	struct udev_monitor_netlink_header uh = {
> +		.prefix = "change@",
> +		.magic = htonl(0xfeedcafe),
> +		.header_size = sizeof(uh),
> +		.properties_off = 10,
> +		.properties_len = 299,
> +		.filter_subsystem_hash = htonl(0xfffffff),
> +		.filter_devtype_hash = htonl(0x10000000),
> +		.filter_tag_bloom_hi = htonl(0x2000400),
> +	};
> +
> +	ret = sendto(fd, &uh, sizeof(uh), MSG_DONTWAIT, NULL, 0);
> +	printf("sendto(%d, ", fd);
> +	print_quoted_memory(&uh, sizeof(uh) - 8);
> +	printf("..., %u, MSG_DONTWAIT, NULL, 0) = %s\n",
> +	       (unsigned) sizeof(uh), sprintrc(ret));

Note that at this point errno may be already clobbered by earlier printf
calls, and sprintrc(ret) may print garbage.  sprintrc has to be invoked
before the first printf call, and its return code saved for future use.


-- 
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20180327/232c4eb2/attachment.bin>


More information about the Strace-devel mailing list