You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by id...@apache.org on 2014/10/28 20:23:42 UTC
[6/8] git commit: Remove Linux namespace functions from stout.
Remove Linux namespace functions from stout.
This code was moved to linux/ in an earlier commit.
Review: https://reviews.apache.org/r/27092
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/691510a5
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/691510a5
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/691510a5
Branch: refs/heads/master
Commit: 691510a5629c25d2772b6147c957bbb1ecca4d78
Parents: 0342113
Author: Ian Downes <id...@twitter.com>
Authored: Fri Oct 17 16:00:28 2014 -0700
Committer: Ian Downes <id...@twitter.com>
Committed: Tue Oct 28 12:04:16 2014 -0700
----------------------------------------------------------------------
3rdparty/libprocess/3rdparty/Makefile.am | 1 -
3rdparty/libprocess/3rdparty/stout/Makefile.am | 1 -
.../3rdparty/stout/include/Makefile.am | 1 -
.../3rdparty/stout/include/stout/os/setns.hpp | 203 -------------------
.../3rdparty/stout/tests/os/setns_tests.cpp | 58 ------
5 files changed, 264 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/691510a5/3rdparty/libprocess/3rdparty/Makefile.am
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/Makefile.am b/3rdparty/libprocess/3rdparty/Makefile.am
index e933c1c..0dc2871 100644
--- a/3rdparty/libprocess/3rdparty/Makefile.am
+++ b/3rdparty/libprocess/3rdparty/Makefile.am
@@ -180,7 +180,6 @@ stout_tests_SOURCES = \
if OS_LINUX
stout_tests_SOURCES += $(STOUT)/tests/proc_tests.cpp
- stout_tests_SOURCES += $(STOUT)/tests/os/setns_tests.cpp
endif
stout_tests_CPPFLAGS = \
http://git-wip-us.apache.org/repos/asf/mesos/blob/691510a5/3rdparty/libprocess/3rdparty/stout/Makefile.am
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/Makefile.am b/3rdparty/libprocess/3rdparty/stout/Makefile.am
index e0a7838..7aac3fd 100644
--- a/3rdparty/libprocess/3rdparty/stout/Makefile.am
+++ b/3rdparty/libprocess/3rdparty/stout/Makefile.am
@@ -31,7 +31,6 @@ EXTRA_DIST = \
tests/option_tests.cpp \
tests/os_tests.cpp \
tests/os/sendfile_tests.cpp \
- tests/os/setns_tests.cpp \
tests/os/signals_tests.cpp \
tests/proc_tests.cpp \
tests/protobuf_tests.cpp \
http://git-wip-us.apache.org/repos/asf/mesos/blob/691510a5/3rdparty/libprocess/3rdparty/stout/include/Makefile.am
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/Makefile.am b/3rdparty/libprocess/3rdparty/stout/include/Makefile.am
index 3048e84..00a4edd 100644
--- a/3rdparty/libprocess/3rdparty/stout/include/Makefile.am
+++ b/3rdparty/libprocess/3rdparty/stout/include/Makefile.am
@@ -50,7 +50,6 @@ nobase_include_HEADERS = \
stout/os/process.hpp \
stout/os/read.hpp \
stout/os/sendfile.hpp \
- stout/os/setns.hpp \
stout/os/shell.hpp \
stout/os/signals.hpp \
stout/os/permissions.hpp \
http://git-wip-us.apache.org/repos/asf/mesos/blob/691510a5/3rdparty/libprocess/3rdparty/stout/include/stout/os/setns.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/setns.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/setns.hpp
deleted file mode 100644
index 5278996..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/setns.hpp
+++ /dev/null
@@ -1,203 +0,0 @@
-/**
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __STOUT_OS_SETNS_HPP__
-#define __STOUT_OS_SETNS_HPP__
-
-// This file contains Linux-only OS utilities.
-#ifndef __linux__
-#error "stout/os/setns.hpp is only available on Linux systems."
-#endif
-
-#include <sched.h>
-#include <unistd.h>
-
-#include <sys/syscall.h>
-
-#include <set>
-#include <string>
-
-#include <stout/error.hpp>
-#include <stout/hashmap.hpp>
-#include <stout/nothing.hpp>
-#include <stout/os.hpp>
-#include <stout/path.hpp>
-#include <stout/proc.hpp>
-#include <stout/stringify.hpp>
-#include <stout/try.hpp>
-
-#include <stout/os/exists.hpp>
-#include <stout/os/ls.hpp>
-
-namespace os {
-
-// Returns all the supported namespaces by the kernel.
-inline std::set<std::string> namespaces()
-{
- std::set<std::string> result;
- Try<std::list<std::string> > entries = os::ls("/proc/self/ns");
- if (entries.isSome()) {
- foreach (const std::string& entry, entries.get()) {
- result.insert(entry);
- }
- }
- return result;
-}
-
-
-// Returns the nstype (e.g., CLONE_NEWNET, CLONE_NEWNS, etc.) for the
-// given namespace which will be used when calling ::setns.
-inline Try<int> nstype(const std::string& ns)
-{
- hashmap<std::string, int> nstypes;
-
-#ifdef CLONE_NEWNS
- nstypes["mnt"] = CLONE_NEWNS;
-#else
- nstypes["mnt"] = 0x00020000;
-#endif
-
-#ifdef CLONE_NEWUTS
- nstypes["uts"] = CLONE_NEWUTS;
-#else
- nstypes["uts"] = 0x04000000;
-#endif
-
-#ifdef CLONE_NEWIPC
- nstypes["ipc"] = CLONE_NEWIPC;
-#else
- nstypes["ipc"] = 0x08000000;
-#endif
-
-#ifdef CLONE_NEWNET
- nstypes["net"] = CLONE_NEWNET;
-#else
- nstypes["net"] = 0x40000000;
-#endif
-
-#ifdef CLONE_NEWUSER
- nstypes["user"] = CLONE_NEWUSER;
-#else
- nstypes["user"] = 0x10000000;
-#endif
-
-#ifdef CLONE_NEWPID
- nstypes["pid"] = CLONE_NEWPID;
-#else
- nstypes["pid"] = 0x20000000;
-#endif
-
- if (!nstypes.contains(ns)) {
- return Error("Unknown namespace '" + ns + "'");
- }
-
- return nstypes[ns];
-}
-
-
-// Re-associate the calling process with the specified namespace. The
-// path refers to one of the corresponding namespace entries in the
-// /proc/[pid]/ns/ directory (or bind mounted elsewhere). We do not
-// allow a process with multiple threads to call this function because
-// it will lead to some weird situations where different threads of a
-// process are in different namespaces.
-inline Try<Nothing> setns(const std::string& path, const std::string& ns)
-{
- // Return error if there're multiple threads in the calling process.
- Try<std::set<pid_t> > threads = proc::threads(::getpid());
- if (threads.isError()) {
- return Error(
- "Failed to get the threads of the current process: " +
- threads.error());
- } else if (threads.get().size() > 1) {
- return Error("Multiple threads exist in the current process");
- }
-
- if (os::namespaces().count(ns) == 0) {
- return Error("Namespace '" + ns + "' is not supported");
- }
-
- // Currently, we don't support pid namespace as its semantics is
- // different from other namespaces (instead of re-associating the
- // calling thread, it re-associates the *children* of the calling
- // thread with the specified namespace).
- if (ns == "pid") {
- return Error("Pid namespace is not supported");
- }
-
-#ifdef O_CLOEXEC
- Try<int> fd = os::open(path, O_RDONLY | O_CLOEXEC);
-#else
- Try<int> fd = os::open(path, O_RDONLY);
-#endif
-
- if (fd.isError()) {
- return Error("Failed to open '" + path + "': " + fd.error());
- }
-
-#ifndef O_CLOEXEC
- Try<Nothing> cloexec = os::cloexec(fd.get());
- if (cloexec.isError()) {
- os::close(fd.get());
- return Error("Failed to cloexec: " + cloexec.error());
- }
-#endif
-
- Try<int> nstype = os::nstype(ns);
- if (nstype.isError()) {
- return Error(nstype.error());
- }
-
-#ifdef SYS_setns
- int ret = ::syscall(SYS_setns, fd.get(), nstype.get());
-#elif __x86_64__
- // A workaround for those hosts that have an old glibc (older than
- // 2.14) but have a new kernel. The magic number '308' here is the
- // syscall number for 'setns' on x86_64 architecture.
- int ret = ::syscall(308, fd.get(), nstype.get());
-#else
-#error "setns is not available"
-#endif
-
- if (ret == -1) {
- // Save the errno as it might be overwritten by 'os::close' below.
- ErrnoError error;
- os::close(fd.get());
- return error;
- }
-
- os::close(fd.get());
- return Nothing();
-}
-
-
-// Re-associate the calling process with the specified namespace. The
-// pid specifies the process whose namespace we will associate.
-inline Try<Nothing> setns(pid_t pid, const std::string& ns)
-{
- if (!os::exists(pid)) {
- return Error("Pid " + stringify(pid) + " does not exist");
- }
-
- std::string path = path::join("/proc", stringify(pid), "ns", ns);
- if (!os::exists(path)) {
- return Error("Namespace '" + ns + "' is not supported");
- }
-
- return os::setns(path, ns);
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_SETNS_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/691510a5/3rdparty/libprocess/3rdparty/stout/tests/os/setns_tests.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/tests/os/setns_tests.cpp b/3rdparty/libprocess/3rdparty/stout/tests/os/setns_tests.cpp
deleted file mode 100644
index ad8e37a..0000000
--- a/3rdparty/libprocess/3rdparty/stout/tests/os/setns_tests.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <pthread.h>
-#include <unistd.h>
-
-#include <vector>
-
-#include <gtest/gtest.h>
-
-#include <stout/gtest.hpp>
-#include <stout/os.hpp>
-
-#include <stout/os/setns.hpp>
-
-using std::set;
-using std::string;
-
-
-static void* child(void* arg)
-{
- // Newly created threads have PTHREAD_CANCEL_ENABLE and
- // PTHREAD_CANCEL_DEFERRED so they can be cancelled.
- while (true) { os::sleep(Seconds(1)); }
-
- return NULL;
-}
-
-
-TEST(OsSetnsTest, setns)
-{
- Result<string> user = os::user();
- ASSERT_SOME(user);
-
- if (user.get() != "root") {
- return;
- }
-
- // Get all the available namespaces.
- set<string> namespaces = os::namespaces();
-
- foreach (const string& ns, namespaces) {
- if (ns == "pid") {
- EXPECT_ERROR(os::setns(::getpid(), ns));
- } else {
- EXPECT_SOME(os::setns(::getpid(), ns));
- }
- }
-
- // Do not allow multi-threaded environment.
- pthread_t pthread;
- ASSERT_EQ(0, pthread_create(&pthread, NULL, child, NULL));
-
- foreach (const string& ns, namespaces) {
- EXPECT_ERROR(os::setns(::getpid(), ns));
- }
-
- // Terminate the threads.
- EXPECT_EQ(0, pthread_cancel(pthread));
- EXPECT_EQ(0, pthread_join(pthread, NULL));
-}