[PATCH] tests/mknod.c: add workaround for ppc bug in travis

Ákos Uzonyi uzonyi.akos at gmail.com
Tue Aug 25 12:54:13 UTC 2020


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;
diff --git a/tests/tests.h b/tests/tests.h
index 66c7f0e6..ad7abec3 100644
--- a/tests/tests.h
+++ b/tests/tests.h
@@ -267,6 +267,14 @@ void check_overflowgid(const int);
 /* Translate errno to its name. */
 const char *errno2name(void);
 
+/**
+ * Prints errno name and description with a leading space
+ * and a trailing newline.
+ *
+ * (using the format string: " %s (%m)\n")
+ */
+void print_errno(void);
+
 /* Translate signal number to its name. */
 const char *signal2name(int);
 
-- 
2.28.0



More information about the Strace-devel mailing list