Properly use union semun as argument of semctl.

* tests/ipc_sem.c (main): Properly use union semun as argument of
semctl.  Don't handle EFAULT specially.
* tests/ipc_sem.test: Revert last change.
---
 tests/ipc_sem.c    | 24 ++++++++++++++++--------
 tests/ipc_sem.test | 19 ++++---------------
 2 files changed, 20 insertions(+), 23 deletions(-)

diff --git a/tests/ipc_sem.c b/tests/ipc_sem.c
index eddddd4..9373482 100644
--- a/tests/ipc_sem.c
+++ b/tests/ipc_sem.c
@@ -2,10 +2,19 @@
 #include <errno.h>
 #include <sys/sem.h>
 
+union semun {
+       int              val;    /* Value for SETVAL */
+       struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
+       unsigned short  *array;  /* Array for GETALL, SETALL */
+       struct seminfo  *__buf;  /* Buffer for IPC_INFO
+                                   (Linux-specific) */
+};
+
 int
 main(void)
 {
        int rc, id;
+       union semun un;
        struct semid_ds ds;
        struct seminfo info;
 
@@ -14,16 +23,19 @@ main(void)
                return 77;
        printf("semget\\(IPC_PRIVATE, 1, 0600\\) += %d\n", id);
 
-       if (semctl(id, 0, IPC_STAT, &ds))
+       un.buf = &ds;
+       if (semctl(id, 0, IPC_STAT, un))
                goto fail;
        printf("semctl\\(%d, 0, IPC_STAT, %p\\) += 0\n", id, &ds);
 
-       int max = semctl(0, 0, SEM_INFO, &info);
+       un.__buf = &info;
+       int max = semctl(0, 0, SEM_INFO, un);
        if (max < 0)
                goto fail;
        printf("semctl\\(0, 0, SEM_INFO, %p\\) += %d\n", &info, max);
 
-       rc = semctl(id, 0, SEM_STAT, &ds);
+       un.buf = &ds;
+       rc = semctl(id, 0, SEM_STAT, un);
        if (rc != id) {
                /*
                 * In linux < v2.6.24-rc1 the first argument must be
@@ -44,10 +56,6 @@ done:
        return rc;
 
 fail:
-       /*
-        * If the kernel failed, SKIP the test.  We want to ignore
-        * such failures as they're out of scope for this project.
-        */
-       rc = errno == EFAULT ? 77 : 1;
+       rc = 1;
        goto done;
 }
diff --git a/tests/ipc_sem.test b/tests/ipc_sem.test
index f448b66..b8fa545 100755
--- a/tests/ipc_sem.test
+++ b/tests/ipc_sem.test
@@ -8,23 +8,12 @@ check_prog grep
 
 OUT="$LOG.out"
 
-./ipc_sem > "$OUT" || {
-       case $? in
-       77)
-               rm -f "$OUT"
+./ipc_sem > /dev/null || {
+       if [ $? -eq 77 ]; then
                framework_skip_ 'ipc semget/semctl syscalls do not behave as 
expected'
-               ;;
-       99)
-               cat "$OUT"
-               rm -f "$OUT"
-               framework_failure_ 'broken kernel detected'
-               ;;
-       *)
-               cat "$OUT"
-               rm -f "$OUT"
+       else
                fail_ 'ipc_sem failed'
-               ;;
-       esac
+       fi
 }
 
 args='-eipc ./ipc_sem'
-- 
2.3.3


-- 
Andreas Schwab, SUSE Labs, sch...@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to