Signed-off-by: Xiaoguang Wang <wangxg.f...@cn.fujitsu.com>
---
 testcases/kernel/syscalls/setpgid/setpgid01.c | 54 ++++++++++++++++++++++++++-
 1 file changed, 52 insertions(+), 2 deletions(-)

diff --git a/testcases/kernel/syscalls/setpgid/setpgid01.c 
b/testcases/kernel/syscalls/setpgid/setpgid01.c
index 700e573..00e895b 100644
--- a/testcases/kernel/syscalls/setpgid/setpgid01.c
+++ b/testcases/kernel/syscalls/setpgid/setpgid01.c
@@ -36,12 +36,14 @@
  * Description:
  * Verify that:
  *   1. Basic functionality test for setpgid(2).
+ *   2. Check functioning of setpgid(2) with pid = 0 and pgid = 0.
  */
 
 #include <errno.h>
 #include <string.h>
 #include <signal.h>
 #include <stdlib.h>
+#include <sys/wait.h>
 #include "test.h"
 #include "usctest.h"
 
@@ -51,7 +53,8 @@ static void cleanup(void);
 char *TCID = "setpgid01";
 
 static void setpgid_test1(void);
-static void (*testfunc[])(void) = { setpgid_test1};
+static void setpgid_test2(void);
+static void (*testfunc[])(void) = { setpgid_test1, setpgid_test2};
 int TST_TOTAL = ARRAY_SIZE(testfunc);
 
 int main(int ac, char **av)
@@ -91,9 +94,56 @@ static void setpgid_test1(void)
        }
 }
 
+static int wait4child(pid_t child)
+{
+       int status;
+
+       if (waitpid(child, &status, 0) == -1)
+               tst_resm(TBROK|TERRNO, "waitpid");
+       if (WIFEXITED(status))
+               return WEXITSTATUS(status);
+       else
+               return status;
+}
+
+static void setpgid_test2(void)
+{
+       int ret;
+       pid_t pgid, pid;
+
+       pid = FORK_OR_VFORK();
+       if (pid == -1)
+               tst_brkm(TBROK | TERRNO, cleanup, "fork()");
+
+       if (pid != 0) {
+               ret = wait4child(pid);
+       } else {
+               pid = getpid();
+               TEST(setpgid(0, 0));
+               pgid = getpgrp();
+               if (TEST_RETURN == -1) {
+                       fprintf(stderr, "setpgid(0, 0) fails in "
+                               "child process: %s\n", strerror(TEST_ERRNO));
+                       exit(1);
+               } else if (pgid != pid) {
+                       fprintf(stderr, "setpgid(0, 0) fails to make PGID"
+                               "equal to PID\n");
+                       exit(1);
+               } else {
+                       exit(0);
+               }
+       }
+
+       if (ret == 0)
+               tst_resm(TPASS, "test setpgid(0, 0) success");
+       else
+               tst_resm(TFAIL, "test setpgid(0, 0) fail");
+}
+
+
 static void setup(void)
 {
-       tst_sig(NOFORK, DEF_HANDLER, cleanup);
+       tst_sig(FORK, DEF_HANDLER, cleanup);
 
        TEST_PAUSE;
 }
-- 
1.8.2.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