Thank you for review. I have rewritten my code, but I still have some
problems with NS_GET_NSTYPE parsing without additional argument. And new
tests are not fully tested, because I haven't build kernel yet.

On Thu, Mar 16, 2017 at 9:01 AM, Dmitry V. Levin <l...@altlinux.org> wrote:

> On Wed, Mar 15, 2017 at 03:22:36PM +0700, Nikolay Marchuk wrote:
> > Hello,
> > I have implemented NS_* ioctls. Should I use common ioctlent interface to
> > print them with additional argument or should I print them without it?
>
> Why do you think printing additional arguments makes any sense?
>
> > From f03f6cea9ff2f1ca6fc38c0068844658180c5032 Mon Sep 17 00:00:00 2001
> > From: Marchuk Nikolay <marchuk.nikola...@gmail.com>
> > Date: Wed, 15 Mar 2017 11:59:26 +0700
> > Subject: [PATCH 2/2] Add ioctl namespace entries from Linux 4.11
> >
> > Signed-off-by: Nikolay Marchuk <marchuk.nikola...@gmail.com>
> > ---
> >  Makefile.am           |  1 +
> >  configure.ac          |  1 +
> >  defs.h                |  1 +
> >  ioctl.c               |  4 +++
> >  nsfs.c                | 38 ++++++++++++++++++++++++++++
> >  tests/.gitignore      |  1 +
> >  tests/Makefile.am     |  2 ++
> >  tests/ioctl_nsfs.c    | 70 ++++++++++++++++++++++++++++++
> +++++++++++++++++++++
> >  tests/ioctl_nsfs.test | 13 ++++++++++
> >  xlat/nsfs_types.in    |  6 +++++
> >  10 files changed, 137 insertions(+)
> >  create mode 100644 nsfs.c
> >  create mode 100644 tests/ioctl_nsfs.c
> >  create mode 100755 tests/ioctl_nsfs.test
> >  create mode 100644 xlat/nsfs_types.in
> >
> > diff --git a/Makefile.am b/Makefile.am
> > index c77f463..c673faa 100644
> > --- a/Makefile.am
> > +++ b/Makefile.am
> > @@ -172,6 +172,7 @@ strace_SOURCES =  \
> >       net.c           \
> >       netlink.c       \
> >       nsig.h          \
> > +     nsfs.c      \
>
> This doesn't look nice.
>
> >       numa.c          \
> >       oldstat.c       \
> >       open.c          \
> > diff --git a/configure.ac b/configure.ac
> > index 9e5087b..dc49fdc 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -366,6 +366,7 @@ AC_CHECK_HEADERS(m4_normalize([
> >       linux/ipc.h
> >       linux/mmtimer.h
> >       linux/msg.h
> > +     linux/nsfs.h
> >       linux/perf_event.h
> >       linux/quota.h
> >       linux/seccomp.h
> > diff --git a/defs.h b/defs.h
> > index 793971e..0f3ec14 100644
> > --- a/defs.h
> > +++ b/defs.h
> > @@ -640,6 +640,7 @@ name ## _ioctl(struct tcb *, unsigned int request,
> kernel_ulong_t arg)
> >  DECL_IOCTL(dm);
> >  DECL_IOCTL(file);
> >  DECL_IOCTL(fs_x);
> > +DECL_IOCTL(nsfs);
> >  DECL_IOCTL(ptp);
> >  DECL_IOCTL(scsi);
> >  DECL_IOCTL(term);
> > diff --git a/ioctl.c b/ioctl.c
> > index aa1880f..d972c38 100644
> > --- a/ioctl.c
> > +++ b/ioctl.c
> > @@ -280,6 +280,10 @@ ioctl_decode(struct tcb *tcp)
> >       case 0x94:
> >               return btrfs_ioctl(tcp, code, arg);
> >  #endif
> > +#ifdef HAVE_LINUX_NSFS_H
> > +     case 0xb7:
> > +             return nsfs_ioctl(tcp, code, arg);
> > +#endif
> >  #ifdef HAVE_LINUX_DM_IOCTL_H
> >       case 0xfd:
> >               return dm_ioctl(tcp, code, arg);
> > diff --git a/nsfs.c b/nsfs.c
> > new file mode 100644
> > index 0000000..de98ca9
> > --- /dev/null
> > +++ b/nsfs.c
> > @@ -0,0 +1,38 @@
> > +#include "defs.h"
> > +
> > +#ifdef HAVE_LINUX_NSFS_H
> > +
> > +#include "xlat/nsfs_types.h"
> > +#include <linux/ioctl.h>
> > +#include <linux/nsfs.h>
> > +
> > +/* Definitions for command which have been added later */
> > +#ifndef NS_GET_NSTYPE
> > +#define NS_GET_NSTYPE                _IO(NSIO, 0x3)
> > +#endif
> > +#ifndef NS_GET_OWNER_UID
> > +#define NS_GET_OWNER_UID     _IO(NSIO, 0x4)
> > +#endif
>
> Please indent.
>
> > +
> > +int
> > +nsfs_ioctl(struct tcb * tcp, unsigned int code, kernel_ulong_t arg){
> > +     char *outstr;
> > +     if (entering(tcp) || syserror(tcp))
> > +             return 0;
>
> This way the 3rd argument of ioctl syscall is going to be printed.
>
> > +     switch(code){
> > +             case NS_GET_USERNS:
> > +             case NS_GET_PARENT:
> > +                     return RVAL_DECODED | RVAL_FD;
>
> This way the 3rd argument of ioctl syscall is going to be printed.
>
> I'm not sure you've got the ioctl return code semantics right,
> please read https://sourceforge.net/p/strace/mailman/message/34451172/
>
> I think these 2 operation can (and should) be decoded on entering rather
> than on exiting.
>
> > +             case NS_GET_OWNER_UID:
> > +                     return RVAL_UDECIMAL | RVAL_DECODED;
>
> The semantics of NS_GET_OWNER_UID is different: the uid is written
> to the memory at address "arg", see linux fs/nsfs.c.
>
> > +             case NS_GET_NSTYPE:
> > +                     outstr = xlookup(nsfs_types, tcp->u_rval);
> > +                     if(outstr){
> > +                             tcp->auxstr = outstr;
> > +                             return RVAL_STR | RVAL_DECODED;
> > +                     }
>
> This way the 3rd argument of ioctl syscall is going to be printed.
>
> > +             default:
> > +                     return 0;
> > +     }
> > +}
> > +#endif /* HAVE_LINUX_NSFS_H */
> > diff --git a/tests/.gitignore b/tests/.gitignore
> > index a7754b6..060a391 100644
> > --- a/tests/.gitignore
> > +++ b/tests/.gitignore
> > @@ -121,6 +121,7 @@ ioctl_loop
> >  ioctl_loop-nv
> >  ioctl_loop-v
> >  ioctl_mtd
> > +ioctl_nsfs
> >  ioctl_rtc
> >  ioctl_rtc-v
> >  ioctl_scsi
> > diff --git a/tests/Makefile.am b/tests/Makefile.am
> > index c5c124c..bc0c621 100644
> > --- a/tests/Makefile.am
> > +++ b/tests/Makefile.am
> > @@ -184,6 +184,7 @@ check_PROGRAMS = \
> >       ioctl_loop-nv \
> >       ioctl_loop-v \
> >       ioctl_mtd \
> > +     ioctl_nsfs \
> >       ioctl_rtc \
> >       ioctl_rtc-v \
> >       ioctl_scsi \
> > @@ -593,6 +594,7 @@ DECODER_TESTS = \
> >       ioctl_loop-v.test \
> >       ioctl_loop.test \
> >       ioctl_mtd.test \
> > +     ioctl_nsfs.test \
> >       ioctl_rtc-v.test \
> >       ioctl_rtc.test \
> >       ioctl_scsi.test \
> > diff --git a/tests/ioctl_nsfs.c b/tests/ioctl_nsfs.c
> > new file mode 100644
> > index 0000000..beea729
> > --- /dev/null
> > +++ b/tests/ioctl_nsfs.c
> > @@ -0,0 +1,70 @@
> > +/*
> > + * Check decoding of NS_* commands of ioctl syscall.
> > + *
> > + * Copyright (c) 2017 Nikolay Marchuk <marchuk.nikola...@gmail.com>
> > + * 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 "tests.h"
> > +
> > +#ifdef HAVE_LINUX_NSFS_H
> > +
> > +#include <stdio.h>
> > +#include <sys/ioctl.h>
> > +#include <linux/ioctl.h>
> > +#include <linux/nsfs.h>
> > +
> > +/* Definitions for command which have been added later */
> > +#ifndef NS_GET_NSTYPE
> > +#define NS_GET_NSTYPE                _IO(NSIO, 0x3)
> > +#endif
> > +#ifndef NS_GET_OWNER_UID
> > +#define NS_GET_OWNER_UID     _IO(NSIO, 0x4)
> > +#endif
>
> Please indent.
>
> > +
> > +int
> > +main(void)
> > +{
> > +     static kernel_ulong_t dummy_arg =
> > +             (kernel_ulong_t) 0xbadc0dedda7a1057ULL;
> > +     ioctl(-1, NS_GET_USERNS, dummy_arg);
> > +     printf("ioctl(-1, NS_GET_USERNS, %#lx) = -1 EBADF (%m)\n",
> dummy_arg);
> > +     ioctl(-1, NS_GET_PARENT, dummy_arg);
> > +     printf("ioctl(-1, NS_GET_PARENT, %#lx) = -1 EBADF (%m)\n",
> dummy_arg);
> > +     ioctl(-1, NS_GET_NSTYPE, dummy_arg);
> > +     printf("ioctl(-1, NS_GET_NSTYPE, %#lx) = -1 EBADF (%m)\n",
> dummy_arg);
> > +     ioctl(-1, NS_GET_OWNER_UID, dummy_arg);
> > +     printf("ioctl(-1, NS_GET_OWNER_UID, %#lx) = -1 EBADF (%m)\n",
> dummy_arg);
> > +
> > +     puts("+++ exited with 0 +++");
> > +     return 0;
> > +}
>
> This way you test the generic parser, the most part of your parser (the
> switch) is not going to be covered.  Please add some calls with valid ns
> descriptors, too.
>
> > +
> > +
> > +#else /* !HAVE_LINUX_DM_IOCTL_H */
> > +
> > +SKIP_MAIN_UNDEFINED("HAVE_LINUX_NSFS_H")
> > +
> > +#endif /* HAVE_LINUX_DM_IOCTL_H */
> > \ No newline at end of file
> > diff --git a/tests/ioctl_nsfs.test b/tests/ioctl_nsfs.test
> > new file mode 100755
> > index 0000000..b4604ed
> > --- /dev/null
> > +++ b/tests/ioctl_nsfs.test
> > @@ -0,0 +1,13 @@
> > +#!/bin/sh
> > +
> > +# Check decoding of NS_* ioctls.
> > +
> > +. "${srcdir=.}/init.sh"
> > +
> > +run_prog > /dev/null
> > +run_strace -a16 -eioctl $args > "$EXP"
> > +check_prog grep
> > +grep -v '^ioctl([012],' < "$LOG" > "$OUT"
> > +match_diff "$OUT" "$EXP"
> > +
> > +rm -f "$EXP" "$OUT"
> > \ No newline at end of file
>
> Please add a newline.
>
> > diff --git a/xlat/nsfs_types.in b/xlat/nsfs_types.in
> > new file mode 100644
> > index 0000000..249935e
> > --- /dev/null
> > +++ b/xlat/nsfs_types.in
> > @@ -0,0 +1,6 @@
> > +CLONE_NEWCGROUP      0x02000000
> > +CLONE_NEWUTS 0x04000000
> > +CLONE_NEWIPC 0x08000000
> > +CLONE_NEWUSER        0x10000000
> > +CLONE_NEWPID 0x20000000
> > +CLONE_NEWNET 0x40000000
>
> xlat/setns_types.in looks very similar to this file, do you really need
> it?
>
>
> --
> ldv
>
> ------------------------------------------------------------
> ------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Strace-devel mailing list
> Strace-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/strace-devel
>
>
From 8789c3c73f1ad0b260195a1a3214ff965d6f42d5 Mon Sep 17 00:00:00 2001
From: Marchuk Nikolay <n1kol...@users.noreply.github.com>
Date: Thu, 16 Mar 2017 17:49:25 +0700
Subject: [PATCH 1/2] Add ioctl namespace entries from Linux 4.11

Signed-off-by: Marchuk Nikolay <n1kol...@users.noreply.github.com>
---
 linux/32/ioctls_inc_align16.h | 2 ++
 linux/32/ioctls_inc_align32.h | 2 ++
 linux/32/ioctls_inc_align64.h | 2 ++
 linux/64/ioctls_inc.h         | 2 ++
 linux/x32/ioctls_inc0.h       | 2 ++
 5 files changed, 10 insertions(+)

diff --git a/linux/32/ioctls_inc_align16.h b/linux/32/ioctls_inc_align16.h
index 71c9d18..4e90801 100644
--- a/linux/32/ioctls_inc_align16.h
+++ b/linux/32/ioctls_inc_align16.h
@@ -1455,6 +1455,8 @@
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SET_ALLOC_RANGE", _IOC_WRITE, 0x6e8c, 0x10 },
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SET_SUINFO", _IOC_WRITE, 0x6e8d, 0x18 },
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SYNC", _IOC_READ, 0x6e8a, 0x08 },
+{ "linux/nsfs.h", "NS_GET_NSTYPE", _IOC_NONE, 0xb703, 0x00 },
+{ "linux/nsfs.h", "NS_GET_OWNER_UID", _IOC_NONE, 0xb704, 0x00 },
 { "linux/nsfs.h", "NS_GET_PARENT", _IOC_NONE, 0xb702, 0x00 },
 { "linux/nsfs.h", "NS_GET_USERNS", _IOC_NONE, 0xb701, 0x00 },
 { "linux/nvme_ioctl.h", "NVME_IOCTL_ADMIN_CMD", _IOC_READ|_IOC_WRITE, 0x4e41, 0x48 },
diff --git a/linux/32/ioctls_inc_align32.h b/linux/32/ioctls_inc_align32.h
index 699eb90..4fcada1 100644
--- a/linux/32/ioctls_inc_align32.h
+++ b/linux/32/ioctls_inc_align32.h
@@ -1455,6 +1455,8 @@
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SET_ALLOC_RANGE", _IOC_WRITE, 0x6e8c, 0x10 },
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SET_SUINFO", _IOC_WRITE, 0x6e8d, 0x18 },
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SYNC", _IOC_READ, 0x6e8a, 0x08 },
+{ "linux/nsfs.h", "NS_GET_NSTYPE", _IOC_NONE, 0xb703, 0x00 },
+{ "linux/nsfs.h", "NS_GET_OWNER_UID", _IOC_NONE, 0xb704, 0x00 },
 { "linux/nsfs.h", "NS_GET_PARENT", _IOC_NONE, 0xb702, 0x00 },
 { "linux/nsfs.h", "NS_GET_USERNS", _IOC_NONE, 0xb701, 0x00 },
 { "linux/nvme_ioctl.h", "NVME_IOCTL_ADMIN_CMD", _IOC_READ|_IOC_WRITE, 0x4e41, 0x48 },
diff --git a/linux/32/ioctls_inc_align64.h b/linux/32/ioctls_inc_align64.h
index fcd9d8c..3734082 100644
--- a/linux/32/ioctls_inc_align64.h
+++ b/linux/32/ioctls_inc_align64.h
@@ -1455,6 +1455,8 @@
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SET_ALLOC_RANGE", _IOC_WRITE, 0x6e8c, 0x10 },
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SET_SUINFO", _IOC_WRITE, 0x6e8d, 0x18 },
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SYNC", _IOC_READ, 0x6e8a, 0x08 },
+{ "linux/nsfs.h", "NS_GET_NSTYPE", _IOC_NONE, 0xb703, 0x00 },
+{ "linux/nsfs.h", "NS_GET_OWNER_UID", _IOC_NONE, 0xb704, 0x00 },
 { "linux/nsfs.h", "NS_GET_PARENT", _IOC_NONE, 0xb702, 0x00 },
 { "linux/nsfs.h", "NS_GET_USERNS", _IOC_NONE, 0xb701, 0x00 },
 { "linux/nvme_ioctl.h", "NVME_IOCTL_ADMIN_CMD", _IOC_READ|_IOC_WRITE, 0x4e41, 0x48 },
diff --git a/linux/64/ioctls_inc.h b/linux/64/ioctls_inc.h
index f59fe11..b75abec 100644
--- a/linux/64/ioctls_inc.h
+++ b/linux/64/ioctls_inc.h
@@ -1455,6 +1455,8 @@
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SET_ALLOC_RANGE", _IOC_WRITE, 0x6e8c, 0x10 },
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SET_SUINFO", _IOC_WRITE, 0x6e8d, 0x18 },
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SYNC", _IOC_READ, 0x6e8a, 0x08 },
+{ "linux/nsfs.h", "NS_GET_NSTYPE", _IOC_NONE, 0xb703, 0x00 },
+{ "linux/nsfs.h", "NS_GET_OWNER_UID", _IOC_NONE, 0xb704, 0x00 },
 { "linux/nsfs.h", "NS_GET_PARENT", _IOC_NONE, 0xb702, 0x00 },
 { "linux/nsfs.h", "NS_GET_USERNS", _IOC_NONE, 0xb701, 0x00 },
 { "linux/nvme_ioctl.h", "NVME_IOCTL_ADMIN_CMD", _IOC_READ|_IOC_WRITE, 0x4e41, 0x48 },
diff --git a/linux/x32/ioctls_inc0.h b/linux/x32/ioctls_inc0.h
index 46303d1..81dd21c 100644
--- a/linux/x32/ioctls_inc0.h
+++ b/linux/x32/ioctls_inc0.h
@@ -1455,6 +1455,8 @@
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SET_ALLOC_RANGE", _IOC_WRITE, 0x6e8c, 0x10 },
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SET_SUINFO", _IOC_WRITE, 0x6e8d, 0x18 },
 { "linux/nilfs2_api.h", "NILFS_IOCTL_SYNC", _IOC_READ, 0x6e8a, 0x08 },
+{ "linux/nsfs.h", "NS_GET_NSTYPE", _IOC_NONE, 0xb703, 0x00 },
+{ "linux/nsfs.h", "NS_GET_OWNER_UID", _IOC_NONE, 0xb704, 0x00 },
 { "linux/nsfs.h", "NS_GET_PARENT", _IOC_NONE, 0xb702, 0x00 },
 { "linux/nsfs.h", "NS_GET_USERNS", _IOC_NONE, 0xb701, 0x00 },
 { "linux/nvme_ioctl.h", "NVME_IOCTL_ADMIN_CMD", _IOC_READ|_IOC_WRITE, 0x4e41, 0x48 },
-- 
2.1.4


From c07bcab35a1cfcf077a19e328dece81afeee4f6d Mon Sep 17 00:00:00 2001
From: Marchuk Nikolay <n1kol...@users.noreply.github.com>
Date: Thu, 16 Mar 2017 17:52:21 +0700
Subject: [PATCH 2/2] Implemented parser for NS_* ioctl commands.

Signed-off-by: Marchuk Nikolay <n1kol...@users.noreply.github.com>
---
 Makefile.am           |   1 +
 configure.ac          |   1 +
 defs.h                |   1 +
 ioctl.c               |   4 ++
 nsfs.c                |  85 +++++++++++++++++++++++++++++++++++++
 tests/.gitignore      |   1 +
 tests/Makefile.am     |   2 +
 tests/ioctl_nsfs.c    | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/ioctl_nsfs.test |  13 ++++++
 9 files changed, 222 insertions(+)
 create mode 100644 nsfs.c
 create mode 100644 tests/ioctl_nsfs.c
 create mode 100644 tests/ioctl_nsfs.test

diff --git a/Makefile.am b/Makefile.am
index c77f463..338fb62 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -172,6 +172,7 @@ strace_SOURCES =	\
 	net.c		\
 	netlink.c       \
 	nsig.h		\
+	nsfs.c		\
 	numa.c		\
 	oldstat.c	\
 	open.c		\
diff --git a/configure.ac b/configure.ac
index 9e5087b..dc49fdc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -366,6 +366,7 @@ AC_CHECK_HEADERS(m4_normalize([
 	linux/ipc.h
 	linux/mmtimer.h
 	linux/msg.h
+	linux/nsfs.h
 	linux/perf_event.h
 	linux/quota.h
 	linux/seccomp.h
diff --git a/defs.h b/defs.h
index 793971e..0f3ec14 100644
--- a/defs.h
+++ b/defs.h
@@ -640,6 +640,7 @@ name ## _ioctl(struct tcb *, unsigned int request, kernel_ulong_t arg)
 DECL_IOCTL(dm);
 DECL_IOCTL(file);
 DECL_IOCTL(fs_x);
+DECL_IOCTL(nsfs);
 DECL_IOCTL(ptp);
 DECL_IOCTL(scsi);
 DECL_IOCTL(term);
diff --git a/ioctl.c b/ioctl.c
index aa1880f..d972c38 100644
--- a/ioctl.c
+++ b/ioctl.c
@@ -280,6 +280,10 @@ ioctl_decode(struct tcb *tcp)
 	case 0x94:
 		return btrfs_ioctl(tcp, code, arg);
 #endif
+#ifdef HAVE_LINUX_NSFS_H
+	case 0xb7:
+		return nsfs_ioctl(tcp, code, arg);
+#endif
 #ifdef HAVE_LINUX_DM_IOCTL_H
 	case 0xfd:
 		return dm_ioctl(tcp, code, arg);
diff --git a/nsfs.c b/nsfs.c
new file mode 100644
index 0000000..68c8e46
--- /dev/null
+++ b/nsfs.c
@@ -0,0 +1,85 @@
+/*
+ * Support for decoding of NS_* ioctl commands.
+ *
+ * Copyright (c) 2017 Nikolay Marchuk <marchuk.nikola...@gmail.com>
+ * 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"
+
+#ifdef HAVE_LINUX_NSFS_H
+
+# include "xlat/setns_types.h"
+# include <linux/ioctl.h>
+# include <linux/nsfs.h>
+# include <sys/types.h>
+
+/* Definitions for command which have been added later */
+# ifndef NS_GET_NSTYPE
+#  define NS_GET_NSTYPE		_IO(NSIO, 0x3)
+# endif
+# ifndef NS_GET_OWNER_UID
+#  define NS_GET_OWNER_UID	_IO(NSIO, 0x4)
+# endif
+
+int
+nsfs_ioctl(struct tcb * tcp, unsigned int code, kernel_ulong_t arg){
+	char *outstr;
+	uid_t uid;
+	if(entering(tcp)) {
+		switch(code) {
+			case NS_GET_USERNS:
+			case NS_GET_PARENT:
+				return RVAL_DECODED | (1 + RVAL_FD);
+			case NS_GET_OWNER_UID:
+				if (!umove(tcp, arg, &uid)) {
+					tprintf(", ");
+					printaddr(&uid);
+					return RVAL_DECODED | 1;
+				}
+			default:
+				return 0;
+		}
+	} else {
+		switch(code) {
+			case NS_GET_NSTYPE:
+				if (!syserror(tcp)) {
+					outstr = xlookup(setns_types, tcp->u_rval);
+					if (outstr) {
+						tcp->auxstr = outstr;
+						return RVAL_STR;
+					}
+				}
+				return 0;
+			case NS_GET_OWNER_UID:
+				if (!syserror(tcp) && !umove(tcp, arg, &uid)) {
+					printuid(", uid = ", uid);
+				}
+			default:
+				return 0;
+		}
+	}
+}
+#endif /* HAVE_LINUX_NSFS_H */
diff --git a/tests/.gitignore b/tests/.gitignore
index a7754b6..060a391 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -121,6 +121,7 @@ ioctl_loop
 ioctl_loop-nv
 ioctl_loop-v
 ioctl_mtd
+ioctl_nsfs
 ioctl_rtc
 ioctl_rtc-v
 ioctl_scsi
diff --git a/tests/Makefile.am b/tests/Makefile.am
index c5c124c..bc0c621 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -184,6 +184,7 @@ check_PROGRAMS = \
 	ioctl_loop-nv \
 	ioctl_loop-v \
 	ioctl_mtd \
+	ioctl_nsfs \
 	ioctl_rtc \
 	ioctl_rtc-v \
 	ioctl_scsi \
@@ -593,6 +594,7 @@ DECODER_TESTS = \
 	ioctl_loop-v.test \
 	ioctl_loop.test \
 	ioctl_mtd.test \
+	ioctl_nsfs.test \
 	ioctl_rtc-v.test \
 	ioctl_rtc.test \
 	ioctl_scsi.test \
diff --git a/tests/ioctl_nsfs.c b/tests/ioctl_nsfs.c
new file mode 100644
index 0000000..41fe56f
--- /dev/null
+++ b/tests/ioctl_nsfs.c
@@ -0,0 +1,114 @@
+/*
+ * Check decoding of NS_* commands of ioctl syscall.
+ *
+ * Copyright (c) 2017 Nikolay Marchuk <marchuk.nikola...@gmail.com>
+ * 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 "tests.h"
+
+#ifdef HAVE_LINUX_NSFS_H
+
+# include <fcntl.h>
+# include <linux/ioctl.h>
+# include <linux/nsfs.h>
+# include <sched.h>
+# include <stdio.h>
+# include <stdlib.h>
+# include <sys/ioctl.h>
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <unistd.h>
+
+/* Definitions for command which have been added later */
+# ifndef NS_GET_NSTYPE
+#  define NS_GET_NSTYPE		_IO(NSIO, 0x3)
+# endif
+# ifndef NS_GET_OWNER_UID
+#  define NS_GET_OWNER_UID	_IO(NSIO, 0x4)
+# endif
+
+static void
+test_no_namespace(void)
+{
+	ioctl(-1, NS_GET_USERNS);
+	printf("ioctl(-1, NS_GET_USERNS) = -1 EBADF (%m)\n");
+	ioctl(-1, NS_GET_PARENT);
+	printf("ioctl(-1, NS_GET_PARENT) = -1 EBADF (%m)\n");
+	ioctl(-1, NS_GET_NSTYPE, NULL);
+	printf("ioctl(-1, NS_GET_NSTYPE, 0) = -1 EBADF (%m)\n");
+	ioctl(-1, NS_GET_OWNER_UID, NULL);
+	printf("ioctl(-1, NS_GET_OWNER_UID, NULL) = -1 EBADF (%m)\n");
+}
+
+static void
+test_user_namespace(void)
+{
+	int ns_fd, userns_fd, parent_ns_fd, nstype, rc;
+	uid_t uid;
+	unshare(CLONE_NEWUSER);
+	ns_fd = open("/proc/self/ns/user");
+	
+	userns_fd = ioctl(ns_fd, NS_GET_USERNS);
+	printf("ioctl(%d, NS_GET_USERNS) = %s\n", ns_fd, sprintrc(userns_fd));
+
+	parent_ns_fd = ioctl(userns_fd, NS_GET_PARENT);
+	printf("ioctl(%d, NS_GET_PARENT) = %s\n", userns_fd, sprintrc(parent_ns_fd));
+
+	nstype = ioctl(userns_fd, NS_GET_NSTYPE);
+	if (nstype == CLONE_NEWUSER) {
+		printf("ioctl(%d, NS_GET_NSTYPE, 0) = CLONE_NEWUSER\n", userns_fd);
+	} else {
+		printf("ioctl(%d, NS_GET_NSTYPE, 0) = %s\n", userns_fd, sprintrc(nstype));
+	}
+
+	rc = ioctl(userns_fd, NS_GET_OWNER_UID, &uid);
+	if (rc == -1) {
+		printf("ioctl(%d, NS_GET_OWNER_UID, %p) = %s\n", userns_fd, &uid, sprintrc(rc));
+	} else {
+		printf("ioctl(%d, NS_GET_OWNER_UID, %p, uid = ", userns_fd, &uid);
+		if ((uid_t) -1U == (uid_t) uid)
+			printf("-1) = %s\n", sprintrc(rc));
+		else
+			printf("%u) = %s\n", uid, sprintrc(rc));
+	}
+
+	return 0;
+}
+
+int
+main(void)
+{
+	test_no_namespace();
+	test_user_namespace();
+	puts("+++ exited with 0 +++");
+	return 0;
+}
+
+#else /* !HAVE_LINUX_DM_IOCTL_H */
+
+SKIP_MAIN_UNDEFINED("HAVE_LINUX_NSFS_H")
+
+#endif /* HAVE_LINUX_DM_IOCTL_H */
diff --git a/tests/ioctl_nsfs.test b/tests/ioctl_nsfs.test
new file mode 100644
index 0000000..8fe8da5
--- /dev/null
+++ b/tests/ioctl_nsfs.test
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# Check decoding of NS_* ioctls.
+
+. "${srcdir=.}/init.sh"
+
+run_prog > /dev/null
+run_strace -a16 -eioctl $args > "$EXP"
+check_prog grep
+grep -v '^ioctl([012],' < "$LOG" > "$OUT"
+match_diff "$OUT" "$EXP"
+
+rm -f "$EXP" "$OUT"
-- 
2.1.4

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to