From acf4f49dac67454438d4e220aab64fa3e53cd5cf Mon Sep 17 00:00:00 2001
From: Jiri Palecek <jirka@debian.(none)>
Date: Fri, 7 Nov 2008 12:36:52 +0100
Subject: [PATCH] Deal with missing syscalls

 This patch handles syscalls which are in the stubs list, by calling
 tst_brkm() when those syscalls are called. For this to work, tests
 including linux_syscall_numbers.h and calling syscall() have to
 define a cleanup function with signature

  static void cleanup(void);

 This patch also adds those functions to tests that lack it
---
 testcases/kernel/include/regen.sh                 |    7 +++++++
 testcases/kernel/syscalls/pwrite/pwrite04.c       |    1 +
 testcases/kernel/syscalls/setgid/setgid01.c       |    4 ++--
 testcases/kernel/syscalls/setgid/setgid02.c       |    4 ++--
 testcases/kernel/syscalls/setgid/setgid03.c       |    4 ++--
 testcases/kernel/syscalls/timerfd/timerfd01.c     |    2 ++
 testcases/kernel/syscalls/utimensat/utimensat01.c |    2 ++
 7 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/testcases/kernel/include/regen.sh b/testcases/kernel/include/regen.sh
index a8f34f4..971b268 100755
--- a/testcases/kernel/include/regen.sh
+++ b/testcases/kernel/include/regen.sh
@@ -22,6 +22,13 @@ cat << EOF > ${output}
 
 #include <sys/syscall.h>
 
+	
+static void cleanup(void);
+
+#define syscall(N, ...) ( \
+	N==0 ? ({tst_brkm(TCONF, cleanup, "Syscall %s not supported on your arch", #N); errno=ENOSYS; -1; }) : \
+	syscall(N, ##__VA_ARGS__) \
+)
 EOF
 
 for arch in `cat order` ; do
diff --git a/testcases/kernel/syscalls/pwrite/pwrite04.c b/testcases/kernel/syscalls/pwrite/pwrite04.c
index b8f9f7e..6df5a70 100644
--- a/testcases/kernel/syscalls/pwrite/pwrite04.c
+++ b/testcases/kernel/syscalls/pwrite/pwrite04.c
@@ -63,6 +63,7 @@ char name[256], fname[256];
 
 void init_buffers(char*[]);
 void l_seek(int, off_t, int, off_t);
+static void cleanup(void);
 
 int main(int ac, char *av[]) 
 {
diff --git a/testcases/kernel/syscalls/setgid/setgid01.c b/testcases/kernel/syscalls/setgid/setgid01.c
index 82f25b2..f09dc82 100644
--- a/testcases/kernel/syscalls/setgid/setgid01.c
+++ b/testcases/kernel/syscalls/setgid/setgid01.c
@@ -115,8 +115,8 @@
 #include "test.h"
 #include "usctest.h"
 
-void setup();
-void cleanup();
+static void setup();
+static void cleanup();
 
 #include "compat_16.h"
 
diff --git a/testcases/kernel/syscalls/setgid/setgid02.c b/testcases/kernel/syscalls/setgid/setgid02.c
index 8fa513a..1561a4b 100644
--- a/testcases/kernel/syscalls/setgid/setgid02.c
+++ b/testcases/kernel/syscalls/setgid/setgid02.c
@@ -58,8 +58,8 @@ char nobody_gid[] = "nobody";
 struct passwd *ltpuser;
 
 
-void setup(void);
-void cleanup(void);
+static void setup(void);
+static void cleanup(void);
 
 #include "compat_16.h"
 
diff --git a/testcases/kernel/syscalls/setgid/setgid03.c b/testcases/kernel/syscalls/setgid/setgid03.c
index 7098b11..f2dc1ba 100644
--- a/testcases/kernel/syscalls/setgid/setgid03.c
+++ b/testcases/kernel/syscalls/setgid/setgid03.c
@@ -56,8 +56,8 @@ char root[] = "root";
 struct passwd *getpwnam(), *ltpuser1pwent, *rootpwent;
 int mygid;
 
-void setup(void);
-void cleanup(void);
+static void setup(void);
+static void cleanup(void);
 
 #include "compat_16.h"
 
diff --git a/testcases/kernel/syscalls/timerfd/timerfd01.c b/testcases/kernel/syscalls/timerfd/timerfd01.c
index da3b6a0..bbc263e 100644
--- a/testcases/kernel/syscalls/timerfd/timerfd01.c
+++ b/testcases/kernel/syscalls/timerfd/timerfd01.c
@@ -46,6 +46,8 @@
 #include "usctest.h"
 #include "linux_syscall_numbers.h"
 
+#define cleanup tst_exit
+
 char *TCID="timerfd01";	/* Test program identifier */
 extern int Tst_count;		/* Test Case counter for tst_* routines */
 
diff --git a/testcases/kernel/syscalls/utimensat/utimensat01.c b/testcases/kernel/syscalls/utimensat/utimensat01.c
index c271f78..973cfa5 100644
--- a/testcases/kernel/syscalls/utimensat/utimensat01.c
+++ b/testcases/kernel/syscalls/utimensat/utimensat01.c
@@ -45,6 +45,8 @@
 #include <test.h>
 #include "linux_syscall_numbers.h"
 
+#define cleanup tst_exit
+
 /* We use EXIT_FAILURE for an expected failure from utimensat()
    (e.g., EACCES and EPERM), and one of the following for unexpected
    failures (i.e., something broke in our test setup). */
-- 
1.6.0.2

Signed-off-by: Jiri Palecek <jpalecek@web.de>
