[PATCH] tests/mknod.c: add workaround for ppc bug in travis
Dmitry V. Levin
ldv at altlinux.org
Tue Aug 25 13:00:14 UTC 2020
On Tue, Aug 25, 2020 at 02:54:13PM +0200, Ákos Uzonyi wrote:
> On ppc travis builds syscall(mknod) sometimes does not fail with EEXISTS
> as expected, but returns successfully.
>
> A new print_errno function is added, which handles the case when errno
> is 0.
>
> * tests/errno2name.c (print_errno): New function.
> * tests/defs.h (errno2name.c): New function declaration.
> * tests/mknod.c (call_mknod): set errno to 0 before syscall.
> (main): Use print_errno for printing errno.
> ---
> tests/errno2name.c | 9 +++++++++
> tests/mknod.c | 42 ++++++++++++++++++++++++++----------------
> tests/tests.h | 8 ++++++++
> 3 files changed, 43 insertions(+), 16 deletions(-)
>
> diff --git a/tests/errno2name.c b/tests/errno2name.c
> index 56340d75..103ea08d 100644
> --- a/tests/errno2name.c
> +++ b/tests/errno2name.c
> @@ -8,6 +8,15 @@
>
> #include "tests.h"
> #include <errno.h>
> +#include <stdio.h>
> +
> +void
> +print_errno(void)
> +{
> + if (errno)
> + printf(" %s (%m)", errno2name());
> + puts("");
> +}
>
> #define CASE(x) case x: return #x
>
> diff --git a/tests/mknod.c b/tests/mknod.c
> index 44c6f028..03cb8ef2 100644
> --- a/tests/mknod.c
> +++ b/tests/mknod.c
> @@ -10,6 +10,7 @@
>
> #ifdef __NR_mknod
>
> +# include <errno.h>
> # include <stdio.h>
> # include <sys/stat.h>
> # include <sys/sysmacros.h>
> @@ -20,6 +21,7 @@ static const char *sample;
> static long
> call_mknod(unsigned short mode, unsigned long dev)
> {
> + errno = 0;
> unsigned long lmode = (unsigned long) 0xffffffffffff0000ULL | mode;
> return syscall(__NR_mknod, sample, lmode, dev);
> }
> @@ -31,44 +33,52 @@ main(int ac, char **av)
> sample = av[0];
>
> long rc = call_mknod(0, dev);
> - printf("mknod(\"%s\", 000) = %ld %s (%m)\n",
> - sample, rc, errno2name());
> + printf("mknod(\"%s\", 000) = %ld",
> + sample, rc);
> + print_errno();
>
> rc = call_mknod(0xffff, dev);
> - printf("mknod(\"%s\", %#03ho) = %ld %s (%m)\n",
> - sample, (unsigned short) -1, rc, errno2name());
> + printf("mknod(\"%s\", %#03ho) = %ld",
> + sample, (unsigned short) -1, rc);
> + print_errno();
>
> rc = call_mknod(S_IFREG, 0);
> - printf("mknod(\"%s\", S_IFREG|000) = %ld %s (%m)\n",
> - sample, rc, errno2name());
> + printf("mknod(\"%s\", S_IFREG|000) = %ld",
> + sample, rc);
> + print_errno();
>
> rc = call_mknod(S_IFDIR | 06, 0);
> - printf("mknod(\"%s\", S_IFDIR|006) = %ld %s (%m)\n",
> - sample, rc, errno2name());
> + printf("mknod(\"%s\", S_IFDIR|006) = %ld",
> + sample, rc);
> + print_errno();
>
> rc = call_mknod(S_IFLNK | 060, 0);
> - printf("mknod(\"%s\", S_IFLNK|060) = %ld %s (%m)\n",
> - sample, rc, errno2name());
> + printf("mknod(\"%s\", S_IFLNK|060) = %ld",
> + sample, rc);
> + print_errno();
>
> rc = call_mknod(S_IFIFO | 0600, 0);
> - printf("mknod(\"%s\", S_IFIFO|0600) = %ld %s (%m)\n",
> - sample, rc, errno2name());
> + printf("mknod(\"%s\", S_IFIFO|0600) = %ld",
> + sample, rc);
> + print_errno();
>
> dev = (unsigned long) 0xdeadbeef00000000ULL | makedev(1, 7);
>
> rc = call_mknod(S_IFCHR | 024, dev);
> - printf("mknod(\"%s\", S_IFCHR|024, makedev(0x1, 0x7)) = %ld %s (%m)\n",
> - sample, rc, errno2name());
> + printf("mknod(\"%s\", S_IFCHR|024, makedev(0x1, 0x7)) = %ld",
> + sample, rc);
> + print_errno();
>
> const unsigned short mode = (0xffff & ~S_IFMT) | S_IFBLK;
> dev = (unsigned long) 0xdeadbeefbadc0dedULL;
>
> rc = call_mknod(mode, dev);
> printf("mknod(\"%s\", S_IFBLK|S_ISUID|S_ISGID|S_ISVTX|%#03ho"
> - ", makedev(%#x, %#x)) = %ld %s (%m)\n",
> + ", makedev(%#x, %#x)) = %ld",
> sample, (short) (mode & ~(S_IFMT|S_ISUID|S_ISGID|S_ISVTX)),
> major((unsigned) dev), minor((unsigned) dev),
> - rc, errno2name());
> + rc);
> + print_errno();
>
> puts("+++ exited with 0 +++");
> return 0;
We already have (and use) sprintrc, could it be useful here, too?
--
ldv
More information about the Strace-devel
mailing list