From: Sukadev Bhattiprolu <[email protected]>
Date: Mon, 3 May 2010 17:49:32 -0700
Subject: [PATCH 1/1] eclone-2 bug fix

When target-pid is in use, eclone() returns EBUSY, not EAGAIN.  The
test passes now because eclone() correctly fails, but the test case
can do a better job of checking the errno.

Signed-off-by: Sukadev Bhattiprolu <[email protected]>
---
 eclone/eclone-2.c |   49 ++++++++++++++++++++++++-------------------------
 1 files changed, 24 insertions(+), 25 deletions(-)

diff --git a/eclone/eclone-2.c b/eclone/eclone-2.c
index b825ac3..5550e43 100644
--- a/eclone/eclone-2.c
+++ b/eclone/eclone-2.c
@@ -64,14 +64,11 @@ static int do_eclone(int (*child_fn)(void *), void 
*child_arg,
                fflush(stdout);
        }
 
-       if (rc < 0 && errno == EAGAIN) {
-               printf("PASS: Unable to create a process with a pid that is "
-                       "in use\n");
-               exit(0);
-       } else {
-               printf("ERROR: eclone(): rc %d, errno %d\n", rc, errno);
-               return rc;
-       }
+       if (rc < 0)
+               rc = -errno;
+
+       return rc;
+
 }
 
 int main()
@@ -90,27 +87,29 @@ int main()
 
        pid = do_eclone(do_child, CHILD_ARG, flags, nr_pids, pids);
 
-       if (verbose) {
-               printf("[%d, %d]: Parent waiting for %d\n", getpid(),
-                                       gettid(), pid);
+       if (pid == -EBUSY) {
+               printf("PASS: Unable to create a process with a pid that is "
+                       "in use\n");
+               return 0;
+       } else if (pid < 0) {
+               printf("ERROR: eclone(): errno %d\n", pid);
+               return 1;
        }
 
+       printf("[%d, %d]: Parent waiting for %d\n", getpid(), gettid(), pid);
+
        rc = waitpid(pid, &status, __WALL);
-       if (rc < 0) {
-               printf("ERROR: ");
-               verbose = 1;
-       }
 
-       if (verbose) {
-               printf("\twaitpid(): child %d, rc %d, error %d, status 0x%x\n",
-                               getpid(), rc, errno, status);
-               if (rc >=0) {
-                       if (WIFEXITED(status)) {
-                               printf("\t EXITED, %d\n", WEXITSTATUS(status));
-                       } else if (WIFSIGNALED(status)) {
-                               printf("\t SIGNALED, %d\n", WTERMSIG(status));
-                       }
+       printf("\twaitpid(): child %d, rc %d, error %d, status 0x%x\n",
+                       getpid(), rc, errno, status);
+
+       if (rc >=0) {
+               if (WIFEXITED(status)) {
+                       printf("\t EXITED, %d\n", WEXITSTATUS(status));
+               } else if (WIFSIGNALED(status)) {
+                       printf("\t SIGNALED, %d\n", WTERMSIG(status));
                }
        }
-       return 0;
+
+       return 1;
 }
-- 
1.6.6.1

_______________________________________________
Containers mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/containers

_______________________________________________
Devel mailing list
[email protected]
https://openvz.org/mailman/listinfo/devel

Reply via email to