Signed-off-by: Stanislav Kholmanskikh <stanislav.kholmansk...@oracle.com>
---
Hi!

I think that instead of an addition of "the common syscall preparation" to a 
define,
it would be better to implement a wrapper to the rt_sigaction syscall.

Like this one. 

Its basis is a combination of glibc implementations of sigaction() for different
platforms. But it also accepts '-1' for act, oact to check EFAULT errno code 
(glibc implementation doesn't handle such a situtation).

How do you think where the best place is to put this wrapper implementation?

Thank you.

 .../kernel/syscalls/rt_sigaction/rt_sigaction01.c  |   86 ++++++++++++++++---
 1 files changed, 72 insertions(+), 14 deletions(-)

diff --git a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c 
b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c
index 8f18394..8516396 100644
--- a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c
+++ b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c
@@ -60,6 +60,76 @@ char *TCID = "rt_sigaction01";
 int testno;
 int TST_TOTAL = 1;
 
+#define INVAL_SA_PTR ((void *)-1)
+
+/* This is a wrapper for __NR_rt_sigaction syscall.
+ * act/oact values of INVAL_SA_PTR is used to pass
+ * an invalid pointer to syscall(__NR_rt_sigaction).
+ *
+ * Based on glibc/sysdeps/unix/sysv/linux/{...}/sigaction.c
+ */
+static int ltp_rt_sigaction(int signum, const struct sigaction *act,
+                       struct sigaction *oact, size_t sigsetsize)
+{
+       int ret;
+       struct kernel_sigaction kact, koact;
+       struct kernel_sigaction *kact_p = NULL;
+       struct kernel_sigaction *koact_p = NULL;
+
+       if (act == INVAL_SA_PTR) {
+               kact_p = INVAL_SA_PTR;
+       } else if (act) {
+               kact.k_sa_handler = act->sa_handler;
+               memcpy(&kact.sa_mask, &act->sa_mask, sizeof(sigset_t));
+               kact.sa_flags = act->sa_flags;
+               kact.sa_restorer = NULL;
+
+               kact_p = &kact;
+       }
+
+       if (oact == INVAL_SA_PTR)
+               koact_p = INVAL_SA_PTR;
+       else if (oact)
+               koact_p = &koact;
+
+#ifdef __sparc__
+# ifdef __arch64__
+       unsigned long stub = ((unsigned long) &__rt_sigreturn_stub) - 8;
+# else
+       unsigned long stub = ((unsigned long) &__sigreturn_stub) - 8;
+# endif
+#endif
+
+#ifdef __x86_64__
+       sig_initial(signum);
+       kact.sa_flags |= SA_RESTORER;
+       kact.sa_restorer = restore_rt;
+#endif
+
+#ifdef __sparc__
+       ret = ltp_syscall(__NR_rt_sigaction, signum,
+                       kact_p , koact_p,
+                       stub, sigsetsize);
+#else
+       ret = ltp_syscall(__NR_rt_sigaction, signum,
+                       kact_p, koact_p,
+                       sigsetsize);
+#endif
+
+       if (ret >= 0) {
+               if (oact && (oact != INVAL_SA_PTR)) {
+                       oact->sa_handler = koact.k_sa_handler;
+                       memcpy(&oact->sa_mask, &koact.sa_mask,
+                               sizeof(sigset_t));
+                       oact->sa_flags = koact.sa_flags;
+                       oact->sa_restorer = koact.sa_restorer;
+               }
+       }
+
+       return ret;
+}
+
+
 /* Extern Global Functions */
 
/******************************************************************************/
 /*                                                                            
*/
@@ -127,21 +197,14 @@ void handler(int sig)
 
 int set_handler(int sig, int sig_to_mask, int mask_flags)
 {
-#ifdef __x86_64__
-       struct kernel_sigaction sa, oldaction;
-       mask_flags |= SA_RESTORER;
-       sa.sa_restorer = restore_rt;
-       sa.k_sa_handler = (void *)handler;
-#else
        struct sigaction sa, oldaction;
+
        sa.sa_handler = (void *)handler;
-#endif
        sa.sa_flags = mask_flags;
        sigemptyset(&sa.sa_mask);
        sigaddset(&sa.sa_mask, sig);
 
-       return ltp_syscall(__NR_rt_sigaction, sig, &sa, &oldaction, SIGSETSIZE);
-
+       return ltp_rt_sigaction(sig, &sa, &oldaction, SIGSETSIZE);
 }
 
 int main(int ac, char **av)
@@ -163,11 +226,6 @@ int main(int ac, char **av)
                for (testno = 0; testno < TST_TOTAL; ++testno) {
 
                        for (signal = SIGRTMIN; signal <= (SIGRTMAX); signal++) 
{       //signal for 34 to 65
-
-#ifdef __x86_64__
-                               sig_initial(signal);
-#endif
-
                                for (flag = 0;
                                     flag <
                                     (sizeof(test_flags) /
-- 
1.7.1


------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to