lxcpp: Removed Namespace enum 75/49475/8
authorJan Olszak <j.olszak@samsung.com>
Tue, 13 Oct 2015 15:20:41 +0000 (17:20 +0200)
committerJan Olszak <j.olszak@samsung.com>
Wed, 14 Oct 2015 12:08:18 +0000 (14:08 +0200)
[Feature]       Regular Linux CLONE_* flags should be used
                instead of the removed enum
[Cause]         N/A
[Solution]      N/A
[Verification]  Build, install and run tests

Change-Id: I29921d1387da76fb50b269f0e92ebb592cf51751

libs/lxcpp/attach/attach-config.hpp
libs/lxcpp/container-config.hpp
libs/lxcpp/container-impl.cpp
libs/lxcpp/container-impl.hpp
libs/lxcpp/container.hpp
libs/lxcpp/namespace.cpp
libs/lxcpp/namespace.hpp
libs/lxcpp/process.cpp
libs/lxcpp/process.hpp
tests/unit_tests/lxcpp/ut-namespace.cpp
tests/unit_tests/lxcpp/ut-process.cpp

index 94e2626..beb425f 100644 (file)
@@ -45,7 +45,7 @@ struct AttachConfig {
     pid_t initPid;
 
     /// Namespaces to which we'll attach
-    std::vector<Namespace> namespaces;
+    int namespaces;
 
     /// User ID to set
     uid_t uid;
@@ -75,7 +75,7 @@ struct AttachConfig {
 
     AttachConfig(const std::vector<std::string>& argv,
                  const pid_t initPid,
-                 const std::vector<Namespace>& namespaces,
+                 const int namespaces,
                  const uid_t uid,
                  const gid_t gid,
                  const std::vector<gid_t>& supplementaryGids,
@@ -98,7 +98,6 @@ struct AttachConfig {
 
     CONFIG_REGISTER
     (
-        //TODO: Uncomment and fix cstring serialization
         argv,
         initPid,
         namespaces,
index 9990bdc..4fbf86d 100644 (file)
@@ -113,7 +113,7 @@ struct ContainerConfig {
      * Namespace types used to create the container
      *
      * Set: setNamespaces()
-     * Get: none
+     * Get: getNamespaces()
      */
     int mNamespaces;
 
index 09b165f..84f9b44 100644 (file)
@@ -151,6 +151,12 @@ void ContainerImpl::setNamespaces(const int namespaces)
     mConfig.mNamespaces = namespaces;
 }
 
+
+int ContainerImpl::getNamespaces() const
+{
+    return mConfig.mNamespaces;
+}
+
 void ContainerImpl::start()
 {
     // TODO: check config consistency and completeness somehow
@@ -209,11 +215,6 @@ void ContainerImpl::console()
     console.execute();
 }
 
-const std::vector<Namespace>& ContainerImpl::getNamespaces() const
-{
-    return mNamespaces;
-}
-
 void ContainerImpl::addInterfaceConfig(const std::string& hostif,
                                        const std::string& zoneif,
                                        InterfaceType type,
index 4b560f1..d3db492 100644 (file)
@@ -55,8 +55,8 @@ public:
 
     void setTerminalCount(const unsigned int count);
 
-    const std::vector<Namespace>& getNamespaces() const;
     void setNamespaces(const int namespaces);
+    int getNamespaces() const;
 
     // Execution actions
     void start();
@@ -98,9 +98,6 @@ public:
 
 private:
     ContainerConfig mConfig;
-
-    // TODO: convert to ContainerConfig struct
-    std::vector<Namespace> mNamespaces;
 };
 
 } // namespace lxcpp
index 2ca3a10..096463b 100644 (file)
@@ -63,7 +63,9 @@ public:
                            const std::string &arg = "") = 0;
 
     virtual void setTerminalCount(const unsigned int count) = 0;
+
     virtual void setNamespaces(const int namespaces) = 0;
+    virtual int getNamespaces() const = 0;
 
     // Execution actions
     virtual void start() = 0;
index 0ee8c88..57c8649 100644 (file)
 #include "lxcpp/exception.hpp"
 #include "logger/logger.hpp"
 
-#include <numeric>
-#include <functional>
-
 namespace lxcpp {
 
-Namespace operator|(const Namespace a, const Namespace b)
-{
-    return static_cast<Namespace>(static_cast<std::underlying_type<Namespace>::type>(a) |
-                                  static_cast<std::underlying_type<Namespace>::type>(b));
-}
-
-std::string toString(const Namespace ns)
+std::string nsToString(const int ns)
 {
     switch(ns) {
-    case Namespace::USER:
+    case CLONE_NEWUSER:
         return "user";
-    case Namespace::MNT:
+    case CLONE_NEWNS:
         return "mnt";
-    case Namespace::PID:
+    case CLONE_NEWPID:
         return "pid";
-    case Namespace::UTS:
+    case CLONE_NEWUTS:
         return "uts";
-    case Namespace::IPC:
+    case CLONE_NEWIPC:
         return "ipc";
-    case Namespace::NET:
+    case CLONE_NEWNET:
         return "net";
     default:
         const std::string msg = "Bad namespace passed to the function";
@@ -58,28 +49,14 @@ std::string toString(const Namespace ns)
     }
 }
 
-int toFlag(const std::vector<Namespace>& namespaces)
-{
-    Namespace flag = std::accumulate(namespaces.begin(),
-                                     namespaces.end(),
-                                     static_cast<Namespace>(0),
-                                     std::bit_or<Namespace>());
-    return static_cast<int>(flag);
-}
-
-int toFlag(const Namespace ns)
-{
-    return static_cast<int>(ns);
-}
-
 std::string getNsPath(const pid_t pid)
 {
     return "/proc/" + std::to_string(pid) + "/ns";
 }
 
-std::string getPath(const pid_t pid, const Namespace ns)
+std::string getPath(const pid_t pid, const int ns)
 {
-    return getNsPath(pid) + "/" + toString(ns);
+    return getNsPath(pid) + "/" + nsToString(ns);
 }
 
 } // namespace lxcpp
index be6d033..91a4c9e 100644 (file)
 
 #include <sched.h>
 #include <string>
-#include <vector>
 
 namespace lxcpp {
 
-enum class Namespace : int {
-    USER = CLONE_NEWUSER,
-    MNT = CLONE_NEWNS,
-    PID = CLONE_NEWPID,
-    UTS = CLONE_NEWUTS,
-    IPC = CLONE_NEWIPC,
-    NET = CLONE_NEWNET
-};
-
-Namespace operator |(const Namespace a, const Namespace b);
-
-std::string toString(const Namespace ns);
+std::string nsToString(const int ns);
 
 std::string getNsPath(const pid_t pid);
 
-std::string getPath(const pid_t pid, const Namespace ns);
-
-int toFlag(const Namespace ns);
-
-int toFlag(const std::vector<Namespace>& namespaces);
+std::string getPath(const pid_t pid, const int ns);
 
 } // namespace lxcpp
 
index 204dec2..6d2e6d8 100644 (file)
@@ -34,6 +34,8 @@
 #include <sys/wait.h>
 #include <fcntl.h>
 
+#include <array>
+
 namespace lxcpp {
 
 pid_t fork()
@@ -69,40 +71,44 @@ pid_t clone(int (*function)(void *),
     return pid;
 }
 
-pid_t clone(int (*function)(void *),
-            void *args,
-            const std::vector<Namespace>& namespaces,
-            const int additionalFlags)
-{
-    return clone(function, args, toFlag(namespaces) | additionalFlags);
-}
-
-void setns(const pid_t pid, const std::vector<Namespace>& namespaces)
+void setns(const pid_t pid, int requestedNamespaces)
 {
     int dirFD = utils::open(getNsPath(pid), O_DIRECTORY | O_CLOEXEC);
 
+    static const std::array<int, 6> NAMESPACES {{
+            CLONE_NEWUSER, CLONE_NEWNS, CLONE_NEWPID, CLONE_NEWUTS, CLONE_NEWIPC, CLONE_NEWNET
+        }};
+
     // Open FDs connected with the requested namespaces
-    std::vector<int> fds(namespaces.size(), -1);
-    for(size_t i = 0; i < namespaces.size(); ++i) {
-        fds[i] = ::openat(dirFD,
-                          toString(namespaces[i]).c_str(),
+    std::vector<int> fds;
+    for(const int ns: NAMESPACES) {
+        if (!(ns & requestedNamespaces)) {
+            // This namespace wasn't requested
+            continue;
+        }
+
+        int fd = ::openat(dirFD,
+                          nsToString(ns).c_str(),
                           O_RDONLY | O_CLOEXEC);
-        if(fds[i] < 0) {
+        if(fd < 0) {
             const std::string msg = "openat() failed: " + utils::getSystemErrorMessage();
 
-            for (size_t j = 0; j < i; ++j) {
-                utils::close(fds[j]);
+            // Cleanup file descriptors
+            for (const int d: fds) {
+                utils::close(d);
             }
             utils::close(dirFD);
 
             LOGE(msg);
             throw ProcessSetupException(msg);
         }
+
+        fds.push_back(fd);
     }
 
-    // Setns for every namespace
+    // Setns to every requested namespace
     for(size_t i = 0; i < fds.size(); ++i) {
-        if(-1 == ::setns(fds[i], toFlag(namespaces[i]))) {
+        if(-1 == ::setns(fds[i], 0 /* we're sure it's a fd of the right namespace*/)) {
             const std::string msg = "setns() failed: " + utils::getSystemErrorMessage();
 
             for (size_t j = i; j < fds.size(); ++j) {
@@ -148,9 +154,9 @@ int waitpid(const pid_t pid)
     throw ProcessSetupException(msg);
 }
 
-void unshare(const Namespace ns)
+void unshare(const int ns)
 {
-    if(-1 == ::unshare(toFlag(ns))) {
+    if(-1 == ::unshare(ns)) {
         const std::string msg = "unshare() failed: " + utils::getSystemErrorMessage();
         LOGE(msg);
         throw ProcessSetupException(msg);
index 75c1e4f..2b33e4e 100644 (file)
@@ -37,17 +37,11 @@ pid_t clone(int (*function)(void *),
             void *args,
             const int flags);
 
-pid_t clone(int (*function)(void *),
-            void *args,
-            const std::vector<Namespace>& namespaces,
-            const int additionalFlags = 0);
-
-void setns(const pid_t pid,
-           const std::vector<Namespace>& namespaces);
+void setns(const pid_t pid, const int namespaces);
 
 int waitpid(const pid_t pid);
 
-void unshare(const Namespace ns);
+void unshare(const int ns);
 
 void execve(const std::vector<std::string>& argv);
 
index 9e10e81..ba715c9 100644 (file)
@@ -43,22 +43,15 @@ BOOST_FIXTURE_TEST_SUITE(LxcppNamespaceSuite, Fixture)
 
 using namespace lxcpp;
 
-const std::array<Namespace, 6> NAMESPACES  {{
-        Namespace::USER,
-        Namespace::MNT,
-        Namespace::PID,
-        Namespace::UTS,
-        Namespace::IPC,
-        Namespace::NET
+static const std::array<int, 6> NAMESPACES {{
+        CLONE_NEWUSER,
+        CLONE_NEWNS,
+        CLONE_NEWPID,
+        CLONE_NEWUTS,
+        CLONE_NEWIPC,
+        CLONE_NEWNET
     }};
 
-BOOST_AUTO_TEST_CASE(OR)
-{
-    Namespace a = Namespace::USER;
-    Namespace b = Namespace::MNT;
-    BOOST_CHECK_EQUAL(CLONE_NEWUSER | CLONE_NEWNS, static_cast<int>(a | b));
-}
-
 BOOST_AUTO_TEST_CASE(GetPath)
 {
     for(const auto ns: NAMESPACES) {
@@ -69,7 +62,7 @@ BOOST_AUTO_TEST_CASE(GetPath)
 BOOST_AUTO_TEST_CASE(ToString)
 {
     for(const auto ns: NAMESPACES) {
-        toString(ns);
+        nsToString(ns);
     }
 }
 
index 662dd82..6ec5ff0 100644 (file)
@@ -42,7 +42,7 @@ struct Fixture {
     ~Fixture() {}
 };
 
-int clonefn(void* /*args*/) {
+int clonefn(void*) {
     return 0;
 }
 
@@ -52,19 +52,12 @@ BOOST_FIXTURE_TEST_SUITE(LxcppProcessSuite, Fixture)
 
 using namespace lxcpp;
 
-const std::vector<Namespace> NAMESPACES  {{
-        Namespace::USER,
-        Namespace::MNT,
-        Namespace::PID,
-        Namespace::UTS,
-        Namespace::IPC,
-        Namespace::NET
-    }};
-
 BOOST_AUTO_TEST_CASE(Clone)
 {
-    BOOST_CHECK_NO_THROW(lxcpp::clone(clonefn, nullptr, NAMESPACES));
-    BOOST_CHECK_NO_THROW(lxcpp::clone(clonefn, nullptr, {Namespace::MNT}));
+    BOOST_CHECK_NO_THROW(lxcpp::clone(clonefn,
+                                      nullptr,
+                                      CLONE_NEWUSER | CLONE_NEWNS | CLONE_NEWPID | CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWNET));
+    BOOST_CHECK_NO_THROW(lxcpp::clone(clonefn, nullptr, CLONE_NEWNS));
 }
 
 BOOST_AUTO_TEST_CASE(Setns)
@@ -75,12 +68,8 @@ BOOST_AUTO_TEST_CASE(Setns)
     pid_t pid = lxcpp::fork();
     if (pid == 0) {
         try {
-            lxcpp::setns(::getpid(), {Namespace::MNT,
-                                      Namespace::PID,
-                                      Namespace::UTS,
-                                      Namespace::IPC,
-                                      Namespace::NET
-                                     });
+            lxcpp::setns(::getpid(),
+                         CLONE_NEWNS | CLONE_NEWPID | CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWNET);
             ::_exit(TEST_PASSED);
         } catch(...) {
             ::_exit(ERROR);
@@ -100,7 +89,7 @@ BOOST_AUTO_TEST_CASE(SetnsUserNamespace)
     pid_t pid = lxcpp::fork();
     if (pid == 0) {
         try {
-            lxcpp::setns(::getpid(), {Namespace::USER});
+            lxcpp::setns(::getpid(), CLONE_NEWUSER);
             ::_exit(ERROR);
         } catch(ProcessSetupException) {
             ::_exit(TEST_PASSED);