]> git.proxmox.com Git - mirror_lxc.git/blobdiff - src/tests/lxc_raw_clone.c
github: Update for main branch
[mirror_lxc.git] / src / tests / lxc_raw_clone.c
index 2eadf98e7ef7d91cdb75bcfb5af5fa027c26810d..1225d023d6b081c08f4acb05bb9fdbde1e2bec46 100644 (file)
@@ -21,8 +21,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#define _GNU_SOURCE
-#define __STDC_FORMAT_MACROS
+#include "config.h"
+
 #include <errno.h>
 #include <fcntl.h>
 #include <inttypes.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 
+#include "cgroups/cgroup_utils.h"
 #include "lxctest.h"
 #include "namespace.h"
+#include "process_utils.h"
 #include "utils.h"
 
 int main(int argc, char *argv[])
@@ -47,42 +49,42 @@ int main(int argc, char *argv[])
        pid_t pid;
        int flags = 0;
 
-       pid = lxc_raw_clone(CLONE_PARENT_SETTID);
+       pid = lxc_raw_clone(CLONE_PARENT_SETTID, NULL);
        if (pid >= 0 || pid != -EINVAL) {
                lxc_error("%s\n", "Calling lxc_raw_clone(CLONE_PARENT_SETTID) "
                                  "should not be possible");
                exit(EXIT_FAILURE);
        }
 
-       pid = lxc_raw_clone(CLONE_CHILD_SETTID);
+       pid = lxc_raw_clone(CLONE_CHILD_SETTID, NULL);
        if (pid >= 0 || pid != -EINVAL) {
                lxc_error("%s\n", "Calling lxc_raw_clone(CLONE_CHILD_SETTID) "
                                  "should not be possible");
                exit(EXIT_FAILURE);
        }
 
-       pid = lxc_raw_clone(CLONE_CHILD_CLEARTID);
+       pid = lxc_raw_clone(CLONE_CHILD_CLEARTID, NULL);
        if (pid >= 0 || pid != -EINVAL) {
                lxc_error("%s\n", "Calling lxc_raw_clone(CLONE_CHILD_CLEARTID) "
                                  "should not be possible");
                exit(EXIT_FAILURE);
        }
 
-       pid = lxc_raw_clone(CLONE_SETTLS);
+       pid = lxc_raw_clone(CLONE_SETTLS, NULL);
        if (pid >= 0 || pid != -EINVAL) {
                lxc_error("%s\n", "Calling lxc_raw_clone(CLONE_SETTLS) should "
                                  "not be possible");
                exit(EXIT_FAILURE);
        }
 
-       pid = lxc_raw_clone(CLONE_VM);
+       pid = lxc_raw_clone(CLONE_VM, NULL);
        if (pid >= 0 || pid != -EINVAL) {
                lxc_error("%s\n", "Calling lxc_raw_clone(CLONE_VM) should "
                          "not be possible");
                exit(EXIT_FAILURE);
        }
 
-       pid = lxc_raw_clone(0);
+       pid = lxc_raw_clone(0, NULL);
        if (pid < 0) {
                lxc_error("%s\n", "Failed to call lxc_raw_clone(0)");
                exit(EXIT_FAILURE);
@@ -99,7 +101,7 @@ int main(int argc, char *argv[])
                exit(EXIT_FAILURE);
        }
 
-       pid = lxc_raw_clone(0);
+       pid = lxc_raw_clone(0, NULL);
        if (pid < 0) {
                lxc_error("%s\n", "Failed to call lxc_raw_clone(0)");
                exit(EXIT_FAILURE);
@@ -116,9 +118,17 @@ int main(int argc, char *argv[])
                exit(EXIT_FAILURE);
        }
 
-       pid = lxc_raw_clone(CLONE_NEWUSER | CLONE_NEWCGROUP | CLONE_NEWNS |
-                           CLONE_NEWIPC | CLONE_NEWNET | CLONE_NEWIPC |
-                           CLONE_NEWPID | CLONE_NEWUTS);
+       flags |= CLONE_NEWUSER;
+       if (cgns_supported())
+               flags |= CLONE_NEWCGROUP;
+       flags |= CLONE_NEWNS;
+       flags |= CLONE_NEWIPC;
+       flags |= CLONE_NEWNET;
+       flags |= CLONE_NEWIPC;
+       flags |= CLONE_NEWPID;
+       flags |= CLONE_NEWUTS;
+
+       pid = lxc_raw_clone(flags, NULL);
        if (pid < 0) {
                lxc_error("%s\n", "Failed to call lxc_raw_clone(CLONE_NEWUSER "
                                  "| CLONE_NEWCGROUP | CLONE_NEWNS | "
@@ -138,16 +148,7 @@ int main(int argc, char *argv[])
                exit(EXIT_FAILURE);
        }
 
-       flags |= CLONE_NEWUSER;
-       if (cgns_supported())
-               flags |= CLONE_NEWCGROUP;
-       flags |= CLONE_NEWNS;
-       flags |= CLONE_NEWIPC;
-       flags |= CLONE_NEWNET;
-       flags |= CLONE_NEWIPC;
-       flags |= CLONE_NEWPID;
-       flags |= CLONE_NEWUTS;
-       pid = lxc_raw_clone(flags);
+       pid = lxc_raw_clone(flags, NULL);
        if (pid < 0) {
                lxc_error("%s\n", "Failed to call lxc_raw_clone(CLONE_NEWUSER "
                                  "| CLONE_NEWCGROUP | CLONE_NEWNS | "
@@ -165,9 +166,77 @@ int main(int argc, char *argv[])
        status = wait_for_pid(pid);
        if (status == 0) {
                lxc_error("%s\n", "Failed to retrieve correct exit status");
+               exit(EXIT_FAILURE);
+       }
+
+       pid = lxc_raw_clone(CLONE_VFORK, NULL);
+       if (pid < 0) {
+               lxc_error("%s\n", "Failed to call lxc_raw_clone(CLONE_VFORK);");
+               exit(EXIT_FAILURE);
+       }
+
+       if (pid == 0) {
+               lxc_error("%s\n", "Child will exit(EXIT_SUCCESS)");
+               exit(EXIT_SUCCESS);
+       }
+
+       status = wait_for_pid(pid);
+       if (status != 0) {
+               lxc_error("%s\n", "Failed to retrieve correct exit status");
+               exit(EXIT_FAILURE);
+       }
+
+       pid = lxc_raw_clone(CLONE_VFORK, NULL);
+       if (pid < 0) {
+               lxc_error("%s\n", "Failed to call lxc_raw_clone(CLONE_VFORK);");
+               exit(EXIT_FAILURE);
+       }
+
+       if (pid == 0) {
+               lxc_error("%s\n", "Child will exit(EXIT_FAILURE)");
+               exit(EXIT_FAILURE);
+       }
+
+       status = wait_for_pid(pid);
+       if (status == 0) {
+               lxc_error("%s\n", "Failed to retrieve correct exit status");
+               exit(EXIT_FAILURE);
+       }
+
+       pid = lxc_raw_clone(CLONE_FILES, NULL);
+       if (pid < 0) {
+               lxc_error("%s\n", "Failed to call lxc_raw_clone(CLONE_FILES);");
+               exit(EXIT_FAILURE);
+       }
+
+       if (pid == 0) {
+               lxc_error("%s\n", "Child will exit(EXIT_SUCCESS)");
                exit(EXIT_SUCCESS);
        }
 
+       status = wait_for_pid(pid);
+       if (status != 0) {
+               lxc_error("%s\n", "Failed to retrieve correct exit status");
+               exit(EXIT_FAILURE);
+       }
+
+       pid = lxc_raw_clone(CLONE_FILES, NULL);
+       if (pid < 0) {
+               lxc_error("%s\n", "Failed to call lxc_raw_clone(CLONE_FILES);");
+               exit(EXIT_FAILURE);
+       }
+
+       if (pid == 0) {
+               lxc_error("%s\n", "Child will exit(EXIT_FAILURE)");
+               exit(EXIT_FAILURE);
+       }
+
+       status = wait_for_pid(pid);
+       if (status == 0) {
+               lxc_error("%s\n", "Failed to retrieve correct exit status");
+               exit(EXIT_FAILURE);
+       }
+
        lxc_debug("%s\n", "All lxc_raw_clone() tests successful");
        exit(EXIT_SUCCESS);
 }