]> granicus.if.org Git - strace/commitdiff
tests: enhance nlattr_unix_diag_msg test
authorDmitry V. Levin <ldv@altlinux.org>
Sat, 1 Jul 2017 00:05:39 +0000 (00:05 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sat, 1 Jul 2017 00:05:39 +0000 (00:05 +0000)
* tests/nlattr_unix_diag_msg.c: Include "test_nlattr.h".
(test_unix_diag_vfs, test_unix_diag_icons, test_unix_diag_rqlen):
Remove.
(init_unix_diag_msg): Add const qualifier to arguments and variables.
(print_unix_diag_msg, print_uint): New functions.
(main): Use them and macros from test_nlattr.h file.

tests/nlattr_unix_diag_msg.c

index 80b0b7d3024d142c66c25943a8e0fb13708b1e75..59444c458bbe844f172a236f3c02eb7cb9ae65a5 100644 (file)
  */
 
 #include "tests.h"
-#include "netlink.h"
 
 #include <stdio.h>
 #include <string.h>
 #include <stdint.h>
-#include <sys/socket.h>
+#include <sys/sysmacros.h>
 #include <netinet/tcp.h>
-#include <linux/rtnetlink.h>
+#include "test_nlattr.h"
 #include <linux/sock_diag.h>
 #include <linux/unix_diag.h>
 
 static void
-init_unix_diag_msg(struct nlmsghdr *nlh, unsigned int msg_len)
+init_unix_diag_msg(struct nlmsghdr *const nlh, const unsigned int msg_len)
 {
-       struct unix_diag_msg *msg;
-
        SET_STRUCT(struct nlmsghdr, nlh,
                .nlmsg_len = msg_len,
                .nlmsg_type = SOCK_DIAG_BY_FAMILY,
                .nlmsg_flags = NLM_F_DUMP
        );
 
-       msg = NLMSG_DATA(nlh);
+       struct unix_diag_msg *const msg = NLMSG_DATA(nlh);
        SET_STRUCT(struct unix_diag_msg, msg,
                .udiag_family = AF_UNIX,
                .udiag_type = SOCK_STREAM,
-               .udiag_state = TCP_FIN_WAIT1
+               .udiag_state = TCP_ESTABLISHED
        );
 }
 
 static void
-test_unix_diag_vfs(const int fd)
+print_unix_diag_msg(const unsigned int msg_len)
 {
-       const int hdrlen = sizeof(struct unix_diag_msg);
-       struct nlmsghdr *nlh;
-       struct nlattr *nla;
-       unsigned int nla_len;
-       unsigned int msg_len;
-       void *const nlh0 = tail_alloc(NLMSG_SPACE(hdrlen));
-       long rc;
-
-       /* len < sizeof(struct unix_diag_vfs) */
-       nla_len = NLA_HDRLEN + 2;
-       msg_len = NLMSG_SPACE(hdrlen) + nla_len;
-       nlh = nlh0 - nla_len;
-       init_unix_diag_msg(nlh, msg_len);
-
-       nla = NLMSG_ATTR(nlh, hdrlen);
-       SET_STRUCT(struct nlattr, nla,
-               .nla_len = nla_len,
-               .nla_type = UNIX_DIAG_VFS
-       );
-       memcpy(RTA_DATA(nla), "12", 2);
-
-       rc = sendto(fd, nlh, msg_len, MSG_DONTWAIT, NULL, 0);
-
-       printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
-              ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
-              ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
-              ", udiag_ino=0, udiag_cookie=[0, 0]}, {{nla_len=%u"
-              ", nla_type=UNIX_DIAG_VFS}, \"12\"}}"
-              ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
-              fd, msg_len, nla_len, msg_len, sprintrc(rc));
-
-       /* short read of unix_diag_vfs */
-       nla_len = NLA_HDRLEN + sizeof(struct unix_diag_vfs);
-       msg_len = NLMSG_SPACE(hdrlen) + nla_len;
-       nlh = nlh0 - (nla_len - 1);
-       init_unix_diag_msg(nlh, msg_len);
-
-       nla = NLMSG_ATTR(nlh, hdrlen);
-       SET_STRUCT(struct nlattr, nla,
-               .nla_len = nla_len,
-               .nla_type = UNIX_DIAG_VFS
-       );
-
-       rc = sendto(fd, nlh, msg_len, MSG_DONTWAIT, NULL, 0);
-
-       printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
-              ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
-              ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
-              ", udiag_ino=0, udiag_cookie=[0, 0]}, {{nla_len=%u"
-              ", nla_type=UNIX_DIAG_VFS}, %p}}"
-              ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
-              fd, msg_len, nla_len, RTA_DATA(nla), msg_len, sprintrc(rc));
-
-       /* unix_diag_vfs */
-       nla_len = NLA_HDRLEN + sizeof(struct unix_diag_vfs);
-       msg_len = NLMSG_SPACE(hdrlen) + nla_len;
-       nlh = nlh0 - nla_len;
-       init_unix_diag_msg(nlh, msg_len);
-
-       nla = NLMSG_ATTR(nlh, hdrlen);
-       SET_STRUCT(struct nlattr, nla,
-               .nla_len = nla_len,
-               .nla_type = UNIX_DIAG_VFS
-       );
-       static const struct unix_diag_vfs uv = {
-               .udiag_vfs_dev = 0xabcddafa,
-               .udiag_vfs_ino = 0xbafabcda
-       };
-       memcpy(RTA_DATA(nla), &uv, sizeof(uv));
-
-       rc = sendto(fd, nlh, msg_len, MSG_DONTWAIT, NULL, 0);
-
-       printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
+       printf("{len=%u, type=SOCK_DIAG_BY_FAMILY"
               ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
-              ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
-              ", udiag_ino=0, udiag_cookie=[0, 0]}, {{nla_len=%u"
-              ", nla_type=UNIX_DIAG_VFS}, {udiag_vfs_dev=makedev(%u, %u)"
-              ", udiag_vfs_ino=%u}}}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
-              fd, msg_len, nla_len, major(uv.udiag_vfs_dev),
-              minor(uv.udiag_vfs_dev), uv.udiag_vfs_ino,
-              msg_len, sprintrc(rc));
+              ", udiag_type=SOCK_STREAM, udiag_state=TCP_ESTABLISHED"
+              ", udiag_ino=0, udiag_cookie=[0, 0]}",
+              msg_len);
 }
 
 static void
-test_unix_diag_icons(const int fd)
+print_uint(const unsigned int *p)
 {
-       const int hdrlen = sizeof(struct unix_diag_msg);
-       struct nlmsghdr *nlh;
-       struct nlattr *nla;
-       unsigned int nla_len;
-       unsigned int msg_len;
-       void *const nlh0 = tail_alloc(NLMSG_SPACE(hdrlen));
-       long rc;
-
-       /* len < sizeof(uint32_t) */
-       nla_len = NLA_HDRLEN + 2;
-       msg_len = NLMSG_SPACE(hdrlen) + nla_len;
-       nlh = nlh0 - nla_len;
-       init_unix_diag_msg(nlh, msg_len);
-
-       nla = NLMSG_ATTR(nlh, hdrlen);
-       SET_STRUCT(struct nlattr, nla,
-               .nla_len = nla_len,
-               .nla_type = UNIX_DIAG_ICONS
-       );
-       memcpy(RTA_DATA(nla), "12", 2);
-
-       rc = sendto(fd, nlh, msg_len, MSG_DONTWAIT, NULL, 0);
-
-       printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
-              ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
-              ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
-              ", udiag_ino=0, udiag_cookie=[0, 0]}, {{nla_len=%u"
-              ", nla_type=UNIX_DIAG_ICONS}, \"12\"}}, %u"
-              ", MSG_DONTWAIT, NULL, 0) = %s\n",
-              fd, msg_len, nla_len, msg_len, sprintrc(rc));
-
-       /* len == sizeof(uint32_t) * 2 - 1 */
-       nla_len = NLA_HDRLEN + sizeof(uint32_t) * 2 - 1;
-       msg_len = NLMSG_SPACE(hdrlen) + nla_len;
-       nlh = nlh0 - nla_len;
-       init_unix_diag_msg(nlh, msg_len);
-
-       nla = NLMSG_ATTR(nlh, hdrlen);
-       SET_STRUCT(struct nlattr, nla,
-               .nla_len = nla_len,
-               .nla_type = UNIX_DIAG_ICONS
-       );
-       static const uint32_t inode[] = { 0xadbcadbc, 0xfabdcdac };
-       memcpy(RTA_DATA(nla), inode, sizeof(inode[0]));
-
-       rc = sendto(fd, nlh, msg_len, MSG_DONTWAIT, NULL, 0);
-
-       printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
-              ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
-              ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
-              ", udiag_ino=0, udiag_cookie=[0, 0]}, {{nla_len=%u"
-              ", nla_type=UNIX_DIAG_ICONS}, [%u]}}, %u"
-              ", MSG_DONTWAIT, NULL, 0) = %s\n",
-              fd, msg_len, nla_len, inode[0], msg_len, sprintrc(rc));
-
-       /* len == sizeof(uint32_t) * 2 */
-       nla_len = NLA_HDRLEN + sizeof(uint32_t) * 2;
-       msg_len = NLMSG_SPACE(hdrlen) + nla_len;
-       nlh = nlh0 - nla_len;
-       init_unix_diag_msg(nlh, msg_len);
-
-       nla = NLMSG_ATTR(nlh, hdrlen);
-       SET_STRUCT(struct nlattr, nla,
-               .nla_len = nla_len,
-               .nla_type = UNIX_DIAG_ICONS
-       );
-       memcpy(RTA_DATA(nla), inode, sizeof(inode));
-
-       rc = sendto(fd, nlh, msg_len, MSG_DONTWAIT, NULL, 0);
-
-       printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
-              ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
-              ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
-              ", udiag_ino=0, udiag_cookie=[0, 0]}, {{nla_len=%u"
-              ", nla_type=UNIX_DIAG_ICONS}, [%u, %u]}}, %u"
-              ", MSG_DONTWAIT, NULL, 0) = %s\n",
-              fd, msg_len, nla_len,
-              inode[0], inode[1], msg_len, sprintrc(rc));
+       printf("%u", *p);
 }
 
-static void
-test_unix_diag_rqlen(const int fd)
+int
+main(void)
 {
-       const int hdrlen = sizeof(struct unix_diag_msg);
-       struct nlmsghdr *nlh;
-       struct nlattr *nla;
-       unsigned int nla_len;
-       unsigned int msg_len;
-       void *const nlh0 = tail_alloc(NLMSG_SPACE(hdrlen));
-       long rc;
-
-       /* len < sizeof(struct unix_diag_rqlen) */
-       nla_len = NLA_HDRLEN + 2;
-       msg_len = NLMSG_SPACE(hdrlen) + nla_len;
-       nlh = nlh0 - nla_len;
-       init_unix_diag_msg(nlh, msg_len);
-
-       nla = NLMSG_ATTR(nlh, hdrlen);
-       SET_STRUCT(struct nlattr, nla,
-               .nla_len = nla_len,
-               .nla_type = UNIX_DIAG_RQLEN
-       );
-       memcpy(RTA_DATA(nla), "12", 2);
-
-       rc = sendto(fd, nlh, msg_len, MSG_DONTWAIT, NULL, 0);
-
-       printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
-              ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
-              ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
-              ", udiag_ino=0, udiag_cookie=[0, 0]}, {{nla_len=%u"
-              ", nla_type=UNIX_DIAG_RQLEN}, \"12\"}}"
-              ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
-              fd, msg_len, nla_len, msg_len, sprintrc(rc));
-
-       /* short read of unix_diag_rqlen */
-       nla_len = NLA_HDRLEN + sizeof(struct unix_diag_rqlen);
-       msg_len = NLMSG_SPACE(hdrlen) + nla_len;
-       nlh = nlh0 - (nla_len - 1);
-       init_unix_diag_msg(nlh, msg_len);
-
-       nla = NLMSG_ATTR(nlh, hdrlen);
-       SET_STRUCT(struct nlattr, nla,
-               .nla_len = nla_len,
-               .nla_type = UNIX_DIAG_RQLEN
-       );
+       skip_if_unavailable("/proc/self/fd/");
 
-       rc = sendto(fd, nlh, msg_len, MSG_DONTWAIT, NULL, 0);
+       const int fd = create_nl_socket(NETLINK_SOCK_DIAG);
+       const unsigned int hdrlen = sizeof(struct unix_diag_msg);
+       void *const nlh0 = tail_alloc(NLMSG_SPACE(hdrlen));
 
-       printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
-              ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
-              ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
-              ", udiag_ino=0, udiag_cookie=[0, 0]}, {{nla_len=%u"
-              ", nla_type=UNIX_DIAG_RQLEN}, %p}}"
-              ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
-              fd, msg_len, nla_len, RTA_DATA(nla),
-              msg_len, sprintrc(rc));
+#define DEFAULT_STRLEN 32
+       static char pattern[DEFAULT_STRLEN];
+       fill_memory_ex(pattern, sizeof(pattern), 'a', 'z' - 'a' + 1);
 
-       /* unix_diag_rqlen */
-       nla_len = NLA_HDRLEN + sizeof(struct unix_diag_rqlen);
-       msg_len = NLMSG_SPACE(hdrlen) + nla_len;
-       nlh = nlh0 - nla_len;
-       init_unix_diag_msg(nlh, msg_len);
+       static const struct unix_diag_vfs uv = {
+               .udiag_vfs_dev = 0xabcddafa,
+               .udiag_vfs_ino = 0xbafabcda
+       };
+       TEST_NLATTR_OBJECT(fd, nlh0, hdrlen,
+                          init_unix_diag_msg, print_unix_diag_msg,
+                          UNIX_DIAG_VFS, pattern, uv,
+                          printf("{udiag_vfs_dev=makedev(%u, %u)",
+                                 major(uv.udiag_vfs_dev),
+                                 minor(uv.udiag_vfs_dev));
+                          PRINT_FIELD_U(", ", uv, udiag_vfs_ino);
+                          printf("}"));
 
-       nla = NLMSG_ATTR(nlh, hdrlen);
-       SET_STRUCT(struct nlattr, nla,
-               .nla_len = nla_len,
-               .nla_type = UNIX_DIAG_RQLEN
-       );
        static const struct unix_diag_rqlen rql = {
                .udiag_rqueue = 0xfabdcdad,
                .udiag_wqueue = 0xbacdadcf
        };
-       memcpy(RTA_DATA(nla), &rql, sizeof(rql));
-
-       rc = sendto(fd, nlh, msg_len, MSG_DONTWAIT, NULL, 0);
+       TEST_NLATTR_OBJECT(fd, nlh0, hdrlen,
+                          init_unix_diag_msg, print_unix_diag_msg,
+                          UNIX_DIAG_RQLEN, pattern, rql,
+                          PRINT_FIELD_U("{", rql, udiag_rqueue);
+                          PRINT_FIELD_U(", ", rql, udiag_wqueue);
+                          printf("}"));
 
-       printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
-              ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
-              ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
-              ", udiag_ino=0, udiag_cookie=[0, 0]}, {{nla_len=%u"
-              ", nla_type=UNIX_DIAG_RQLEN}, {udiag_rqueue=%u"
-              ", udiag_wqueue=%u}}}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
-              fd, msg_len, nla_len, rql.udiag_rqueue,
-              rql.udiag_wqueue, msg_len, sprintrc(rc));
-}
-
-int main(void)
-{
-       skip_if_unavailable("/proc/self/fd/");
-
-       int fd = create_nl_socket(NETLINK_SOCK_DIAG);
-
-       test_unix_diag_vfs(fd);
-       test_unix_diag_icons(fd);
-       test_unix_diag_rqlen(fd);
-
-       printf("+++ exited with 0 +++\n");
+       static const uint32_t inode[] = { 0xadbcadbc, 0xfabdcdac };
+       TEST_NLATTR_ARRAY(fd, nlh0, hdrlen,
+                         init_unix_diag_msg, print_unix_diag_msg,
+                         UNIX_DIAG_ICONS, pattern, inode, print_uint);
 
+       puts("+++ exited with 0 +++");
        return 0;
 }