You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ka...@apache.org on 2016/05/11 22:24:59 UTC
[37/50] [abbrv] mesos git commit: Moved stout from
libprocess/3rdparty/ to 3rdparty/.
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/bootid.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/bootid.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/bootid.hpp
deleted file mode 100644
index 7ea5e46..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/bootid.hpp
+++ /dev/null
@@ -1,59 +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_POSIX_BOOTID_HPP__
-#define __STOUT_OS_POSIX_BOOTID_HPP__
-
-#include <string>
-
-#include <sys/time.h>
-
-#include <stout/error.hpp>
-#include <stout/stringify.hpp>
-#include <stout/strings.hpp>
-#include <stout/try.hpp>
-
-#include <stout/os/read.hpp>
-#if defined(__APPLE__) || defined(__FreeBSD__)
-#include <stout/os/sysctl.hpp>
-#endif // __APPLE__ || __FreeBSD__
-
-
-namespace os {
-
-inline Try<std::string> bootId()
-{
-#ifdef __linux__
- Try<std::string> read = os::read("/proc/sys/kernel/random/boot_id");
- if (read.isError()) {
- return read;
- }
- return strings::trim(read.get());
-#elif defined(__APPLE__) || defined(__FreeBSD__)
- // For OS X, we use the boot time in seconds as a unique boot id.
- // Although imperfect, this works quite well in practice. NOTE: we can't use
- // milliseconds here instead of seconds because the relatively high
- // imprecision of millisecond resolution would cause `bootId` to return a
- // different number nearly every time it was called.
- Try<timeval> boot_time = os::sysctl(CTL_KERN, KERN_BOOTTIME).time();
- if (boot_time.isError()) {
- return Error(boot_time.error());
- }
- return stringify(boot_time.get().tv_sec);
-#else
- return Error("Not implemented");
-#endif
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_BOOTID_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/chown.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/chown.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/chown.hpp
deleted file mode 100644
index 6068409..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/chown.hpp
+++ /dev/null
@@ -1,72 +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_POSIX_CHOWN_HPP__
-#define __STOUT_OS_POSIX_CHOWN_HPP__
-
-#include <sys/types.h>
-#include <pwd.h>
-
-#include <stout/error.hpp>
-#include <stout/nothing.hpp>
-#include <stout/try.hpp>
-
-#include <stout/os/shell.hpp>
-
-namespace os {
-
-inline Try<Nothing> chown(
- uid_t uid,
- gid_t gid,
- const std::string& path,
- bool recursive)
-{
- if (recursive) {
- // TODO(bmahler): Consider walking the file tree instead. We would need
- // to be careful to not miss dotfiles.
- std::string command =
- "chown -R " + stringify(uid) + ':' + stringify(gid) + " '" + path + "'";
-
- int status = os::system(command);
- if (status != 0) {
- return ErrnoError(
- "Failed to execute '" + command +
- "' (exit status: " + stringify(status) + ")");
- }
- } else {
- if (::chown(path.c_str(), uid, gid) < 0) {
- return ErrnoError();
- }
- }
-
- return Nothing();
-}
-
-
-// Changes the specified path's user and group ownership to that of
-// the specified user.
-inline Try<Nothing> chown(
- const std::string& user,
- const std::string& path,
- bool recursive = true)
-{
- passwd* passwd;
- if ((passwd = ::getpwnam(user.c_str())) == NULL) {
- return ErrnoError("Failed to get user information for '" + user + "'");
- }
-
- return chown(passwd->pw_uid, passwd->pw_gid, path, recursive);
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_CHOWN_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/chroot.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/chroot.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/chroot.hpp
deleted file mode 100644
index 1309c52..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/chroot.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you 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_POSIX_CHROOT_HPP__
-#define __STOUT_OS_POSIX_CHROOT_HPP__
-
-#include <string>
-
-#include <stout/error.hpp>
-#include <stout/nothing.hpp>
-#include <stout/try.hpp>
-
-namespace os {
-
-inline Try<Nothing> chroot(const std::string& directory)
-{
- if (::chroot(directory.c_str()) < 0) {
- return ErrnoError();
- }
-
- return Nothing();
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_CHROOT_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/close.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/close.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/close.hpp
deleted file mode 100644
index 695b232..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/close.hpp
+++ /dev/null
@@ -1,35 +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_POSIX_CLOSE_HPP__
-#define __STOUT_OS_POSIX_CLOSE_HPP__
-
-#include <unistd.h>
-
-#include <stout/error.hpp>
-#include <stout/nothing.hpp>
-#include <stout/try.hpp>
-
-namespace os {
-
-inline Try<Nothing> close(int fd)
-{
- if (::close(fd) != 0) {
- return ErrnoError();
- }
-
- return Nothing();
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_CLOSE_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/direntsize.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/direntsize.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/direntsize.hpp
deleted file mode 100644
index 9d8f72e..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/direntsize.hpp
+++ /dev/null
@@ -1,42 +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_POSIX_DIRENTSIZE_HPP__
-#define __STOUT_OS_POSIX_DIRENTSIZE_HPP__
-
-#include <dirent.h>
-#include <unistd.h>
-
-
-namespace os {
-
-inline size_t dirent_size(DIR* dir)
-{
- // Calculate the size for a "directory entry".
- long name_max = fpathconf(dirfd(dir), _PC_NAME_MAX);
-
- // If we don't get a valid size, check NAME_MAX, but fall back on
- // 255 in the worst case ... Danger, Will Robinson!
- if (name_max == -1) {
- name_max = (NAME_MAX > 255) ? NAME_MAX : 255;
- }
-
- size_t name_end = (size_t) offsetof(dirent, d_name) + name_max + 1;
-
- size_t size = (name_end > sizeof(dirent) ? name_end : sizeof(dirent));
-
- return size;
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_DIRENTSIZE_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/exists.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/exists.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/exists.hpp
deleted file mode 100644
index 59ece35..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/exists.hpp
+++ /dev/null
@@ -1,55 +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_POSIX_EXISTS_HPP__
-#define __STOUT_OS_POSIX_EXISTS_HPP__
-
-#include <errno.h>
-#include <signal.h>
-
-#include <sys/stat.h>
-
-#include <string>
-
-namespace os {
-
-
-inline bool exists(const std::string& path)
-{
- struct stat s;
-
- if (::lstat(path.c_str(), &s) < 0) {
- return false;
- }
- return true;
-}
-
-
-// Determine if the process identified by pid exists.
-// NOTE: Zombie processes have a pid and therefore exist. See os::process(pid)
-// to get details of a process.
-inline bool exists(pid_t pid)
-{
- // The special signal 0 is used to check if the process exists; see kill(2).
- // If the current user does not have permission to signal pid, but it does
- // exist, then ::kill will return -1 and set errno == EPERM.
- if (::kill(pid, 0) == 0 || errno == EPERM) {
- return true;
- }
-
- return false;
-}
-
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_EXISTS_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/fcntl.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/fcntl.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/fcntl.hpp
deleted file mode 100644
index daaca0d..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/fcntl.hpp
+++ /dev/null
@@ -1,84 +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_POSIX_FCNTL_HPP__
-#define __STOUT_OS_POSIX_FCNTL_HPP__
-
-#include <fcntl.h>
-
-#include <stout/error.hpp>
-#include <stout/nothing.hpp>
-#include <stout/try.hpp>
-
-
-// TODO(jieyu): Consider introducing a general os::fcntl function
-// which allows us to get/set multiple flags in one call.
-namespace os {
-
-inline Try<Nothing> cloexec(int fd)
-{
- int flags = ::fcntl(fd, F_GETFD);
-
- if (flags == -1) {
- return ErrnoError();
- }
-
- if (::fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) {
- return ErrnoError();
- }
-
- return Nothing();
-}
-
-
-inline Try<bool> isCloexec(int fd)
-{
- int flags = ::fcntl(fd, F_GETFD);
-
- if (flags == -1) {
- return ErrnoError();
- }
-
- return (flags & FD_CLOEXEC) != 0;
-}
-
-
-inline Try<Nothing> nonblock(int fd)
-{
- int flags = ::fcntl(fd, F_GETFL);
-
- if (flags == -1) {
- return ErrnoError();
- }
-
- if (::fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
- return ErrnoError();
- }
-
- return Nothing();
-}
-
-
-inline Try<bool> isNonblock(int fd)
-{
- int flags = ::fcntl(fd, F_GETFL);
-
- if (flags == -1) {
- return ErrnoError();
- }
-
- return (flags & O_NONBLOCK) != 0;
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_FCNTL_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/fork.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/fork.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/fork.hpp
deleted file mode 100644
index 695fe66..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/fork.hpp
+++ /dev/null
@@ -1,451 +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_POSIX_FORK_HPP__
-#define __STOUT_OS_POSIX_FORK_HPP__
-
-#include <fcntl.h>
-#include <unistd.h>
-
-#include <sys/mman.h>
-#ifdef __FreeBSD__
-#include <sys/stat.h>
-#endif // __FreeBSD__
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include <atomic>
-#include <list>
-#include <memory>
-#include <set>
-#include <string>
-
-#include <stout/abort.hpp>
-#include <stout/error.hpp>
-#include <stout/exit.hpp>
-#include <stout/foreach.hpp>
-#include <stout/os/strerror.hpp>
-#include <stout/stringify.hpp>
-#include <stout/try.hpp>
-
-#include <stout/os/close.hpp>
-#include <stout/os/ftruncate.hpp>
-#include <stout/os/process.hpp>
-
-
-// Abstractions around forking process trees. You can declare a
-// process tree "template" using 'Fork', 'Exec', and 'Wait'. For
-// example, to describe a simple "fork/exec" you can do:
-//
-// Fork f = Fork(Exec("sleep 10));
-//
-// The command passed to an 'Exec' is run via 'sh -c'. You can
-// construct more complicated templates via nesting, for example:
-//
-// Fork f =
-// Fork(None(),
-// Fork(Exec("echo 'grandchild 1'")),
-// Fork(None(),
-// Fork(Exec("echo 'great-grandchild'")),
-// Exec("echo 'grandchild 2'"))
-// Exec("echo 'child'"));
-//
-// Note that the first argument to 'Fork' here is an optional function
-// that can be invoked before forking any more children or executing a
-// command. THIS FUNCTION SHOULD BE ASYNC SIGNAL SAFE.
-//
-// To wait for children, you can use 'Wait' instead of 'Exec', for
-// example:
-//
-// Fork f =
-// Fork(None(),
-// Fork(Exec("echo 'grandchild 1'")),
-// Fork(Exec("echo 'grandchild 2'")),
-// Wait());
-//
-// You can also omit either an 'Exec' or a 'Wait' and the forked
-// process will just 'exit(0)'. For example, the following will cause
-// to processes to get reparented by 'init'.
-//
-// Fork f =
-// Fork(None(),
-// Fork(Exec("echo 'grandchild 1'")),
-// Fork(Exec("echo 'grandchild 2'")));
-//
-// A template can be instantiated by invoking the 'Fork' as a
-// functor. For example, using any of the templates above we can do:
-//
-// Try<ProcessTree> tree = f();
-//
-// It's important to note that the process tree returned represents
-// the instant in time after the forking has completed but before
-// 'Exec', 'Wait' or 'exit(0)' has occurred (i.e., the process tree
-// will be complete).
-
-namespace os {
-
-// Forward declaration.
-inline Result<Process> process(pid_t);
-
-
-struct Exec
-{
- Exec(const std::string& _command)
- : command(_command) {}
-
- const std::string command;
-};
-
-
-struct Wait {};
-
-
-struct Fork
-{
- // -+- parent.
- Fork(const Option<void(*)()>& _function,
- const Exec& _exec)
- : function(_function),
- exec(_exec) {}
-
- Fork(const Exec& _exec) : exec(_exec) {}
-
- // -+- parent
- // \--- child.
- Fork(const Option<void(*)()>& _function,
- const Fork& fork1)
- : function(_function)
- {
- children.push_back(fork1);
- }
-
- Fork(const Option<void(*)()>& _function,
- const Fork& fork1,
- const Exec& _exec)
- : function(_function),
- exec(_exec)
- {
- children.push_back(fork1);
- }
-
- Fork(const Option<void(*)()>& _function,
- const Fork& fork1,
- const Wait& _wait)
- : function(_function),
- wait(_wait)
- {
- children.push_back(fork1);
- }
-
-
- // -+- parent
- // |--- child
- // \--- child.
- Fork(const Option<void(*)()>& _function,
- const Fork& fork1,
- const Fork& fork2)
- : function(_function)
- {
- children.push_back(fork1);
- children.push_back(fork2);
- }
-
- Fork(const Option<void(*)()>& _function,
- const Fork& fork1,
- const Fork& fork2,
- const Exec& _exec)
- : function(_function),
- exec(_exec)
- {
- children.push_back(fork1);
- children.push_back(fork2);
- }
-
- Fork(const Option<void(*)()>& _function,
- const Fork& fork1,
- const Fork& fork2,
- const Wait& _wait)
- : function(_function),
- wait(_wait)
- {
- children.push_back(fork1);
- children.push_back(fork2);
- }
-
-
- // -+- parent
- // |--- child
- // |--- child
- // \--- child.
- Fork(const Option<void(*)()>& _function,
- const Fork& fork1,
- const Fork& fork2,
- const Fork& fork3)
- : function(_function)
- {
- children.push_back(fork1);
- children.push_back(fork2);
- children.push_back(fork3);
- }
-
- Fork(const Option<void(*)()>& _function,
- const Fork& fork1,
- const Fork& fork2,
- const Fork& fork3,
- const Exec& _exec)
- : function(_function),
- exec(_exec)
- {
- children.push_back(fork1);
- children.push_back(fork2);
- children.push_back(fork3);
- }
-
- Fork(const Option<void(*)()>& _function,
- const Fork& fork1,
- const Fork& fork2,
- const Fork& fork3,
- const Wait& _wait)
- : function(_function),
- wait(_wait)
- {
- children.push_back(fork1);
- children.push_back(fork2);
- children.push_back(fork3);
- }
-
-private:
- // Represents the "tree" of descendants where each node has a
- // pointer (into shared memory) from which we can read the
- // descendants process information as well as a vector of children.
- struct Tree
- {
- // NOTE: This struct is stored in shared memory and thus cannot
- // hold any pointers to heap allocated memory.
- struct Memory {
- pid_t pid;
- pid_t parent;
- pid_t group;
- pid_t session;
-
- std::atomic_bool set; // Has this been initialized?
- };
-
- std::shared_ptr<Memory> memory;
- std::vector<Tree> children;
- };
-
- // We use shared memory to "share" the pids of forked descendants.
- // The benefit of shared memory over pipes is that each forked
- // process can read its descendants' pids leading to a simpler
- // implementation (with pipes, only one reader can ever read the
- // value from the pipe, forcing much more complicated coordination).
- //
- // Shared memory works like a file (in memory) that gets deleted by
- // "unlinking" it, but it won't get completely deleted until all
- // open file descriptors referencing it have been closed. Each
- // forked process has the shared memory mapped into it as well as an
- // open file descriptor, both of which should get cleaned up
- // automagically when the process exits, but we use a special
- // "deleter" (in combination with shared_ptr) in order to clean this
- // stuff up when we are actually finished using the shared memory.
- struct SharedMemoryDeleter
- {
- SharedMemoryDeleter(int _fd) : fd(_fd) {}
-
- void operator()(Tree::Memory* process) const
- {
- if (munmap(process, sizeof(Tree::Memory)) == -1) {
- ABORT(std::string("Failed to unmap memory: ") + os::strerror(errno));
- }
- if (::close(fd) == -1) {
- ABORT(std::string("Failed to close shared memory file descriptor: ") +
- os::strerror(errno));
- }
- }
-
- const int fd;
- };
-
- // Constructs a Tree (see above) from this fork template.
- Try<Tree> prepare() const
- {
- static std::atomic_int forks(0);
-
- // Each "instance" of an instantiated Fork needs a unique name for
- // creating shared memory.
- int instance = forks.fetch_add(1);
-
- std::string name =
- "/stout-forks-" + stringify(getpid()) + stringify(instance);
-
- int fd = shm_open(name.c_str(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
-
- if (fd == -1) {
- return ErrnoError("Failed to open a shared memory object");
- }
-
- Try<Nothing> truncated = ftruncate(fd, sizeof(Tree::Memory));
- if (truncated.isError()) {
- return Error(
- "Failed to set size of shared memory object: " + truncated.error());
- }
-
- void* memory = mmap(
- NULL,
- sizeof(Tree::Memory),
- PROT_READ | PROT_WRITE, MAP_SHARED,
- fd,
- 0);
-
- if (memory == MAP_FAILED) {
- return ErrnoError("Failed to map shared memory object");
- }
-
- if (shm_unlink(name.c_str()) == -1) {
- return ErrnoError("Failed to unlink shared memory object");
- }
-
- SharedMemoryDeleter deleter(fd);
-
- Tree tree;
- tree.memory = std::shared_ptr<Tree::Memory>((Tree::Memory*)memory, deleter);
- tree.memory->set.store(false);
-
- for (size_t i = 0; i < children.size(); i++) {
- Try<Tree> tree_ = children[i].prepare();
- if (tree_.isError()) {
- return Error(tree_.error());
- }
- tree.children.push_back(tree_.get());
- }
-
- return tree;
- }
-
- // Performs the fork, executes the function, recursively
- // instantiates any children, and then executes/waits/exits.
- pid_t instantiate(const Tree& tree) const
- {
- pid_t pid = ::fork();
- if (pid > 0) {
- return pid;
- }
-
- // Set the basic process information.
- Tree::Memory process;
- process.pid = getpid();
- process.parent = getppid();
- process.group = getpgid(0);
- process.session = getsid(0);
- process.set.store(true);
-
- // Copy it into shared memory.
- memcpy(tree.memory.get(), &process, sizeof(Tree::Memory));
-
- // Execute the function, if any.
- if (function.isSome()) {
- function.get()();
- }
-
- // Fork the children, if any.
- CHECK(children.size() == tree.children.size());
- std::set<pid_t> pids;
- for (size_t i = 0; i < children.size(); i++) {
- pids.insert(children[i].instantiate(tree.children[i]));
- }
-
- // Execute or wait.
- if (exec.isSome()) {
- // Execute the command (via '/bin/sh -c command').
- const char* command = exec.get().command.c_str();
- execlp("sh", "sh", "-c", command, (char*) NULL);
- EXIT(EXIT_FAILURE)
- << "Failed to execute '" << command << "': " << os::strerror(errno);
- } else if (wait.isSome()) {
- foreach (pid_t pid, pids) {
- // TODO(benh): Check for signal interruption or other errors.
- waitpid(pid, NULL, 0);
- }
- }
-
- exit(0);
- return -1;
- }
-
- // Waits for all of the descendant processes in the tree to update
- // their pids and constructs a ProcessTree using the Tree::Memory
- // information from shared memory.
- static Try<ProcessTree> coordinate(const Tree& tree)
- {
- // Wait for the forked process.
- // TODO(benh): Don't wait forever?
- while (!tree.memory->set.load());
-
- // All processes in the returned ProcessTree will have the
- // command-line of the top level process, since we construct the
- // tree using post-fork pre-exec information. So, we'll grab the
- // command of the current process here.
- Result<Process> self = os::process(getpid());
-
- Process process = Process(
- tree.memory->pid,
- tree.memory->parent,
- tree.memory->group,
- tree.memory->session,
- None(),
- None(),
- None(),
- self.isSome() ? self.get().command : "",
- false);
-
- std::list<ProcessTree> children;
- for (size_t i = 0; i < tree.children.size(); i++) {
- Try<ProcessTree> child = coordinate(tree.children[i]);
- if (child.isError()) {
- return Error(child.error());
- }
- children.push_back(child.get());
- }
-
- return ProcessTree(process, children);
- }
-
-public:
- // Prepares and instantiates the process tree.
- Try<ProcessTree> operator()() const
- {
- Try<Tree> tree = prepare();
-
- if (tree.isError()) {
- return Error(tree.error());
- }
-
- Try<pid_t> pid = instantiate(tree.get());
-
- if (pid.isError()) {
- return Error(pid.error());
- }
-
- return coordinate(tree.get());
- }
-
-private:
- Option<void(*)()> function;
- Option<const Exec> exec;
- Option<const Wait> wait;
- std::vector<Fork> children;
-};
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_FORK_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/ftruncate.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/ftruncate.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/ftruncate.hpp
deleted file mode 100644
index 98c4467..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/ftruncate.hpp
+++ /dev/null
@@ -1,39 +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_POSIX_FTRUNCATE_HPP__
-#define __STOUT_OS_POSIX_FTRUNCATE_HPP__
-
-#include <sys/types.h>
-
-#include <stout/error.hpp>
-#include <stout/nothing.hpp>
-#include <stout/stringify.hpp>
-#include <stout/try.hpp>
-
-
-namespace os {
-
-inline Try<Nothing> ftruncate(int fd, off_t length)
-{
- if (::ftruncate(fd, length) != 0) {
- return ErrnoError(
- "Failed to truncate file at file descriptor '" + stringify(fd) + "' to " +
- stringify(length) + " bytes.");
- }
-
- return Nothing();
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_FTRUNCATE_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/killtree.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/killtree.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/killtree.hpp
deleted file mode 100644
index 8ba21de..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/killtree.hpp
+++ /dev/null
@@ -1,226 +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_POSIX_KILLTREE_HPP__
-#define __STOUT_OS_POSIX_KILLTREE_HPP__
-
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <list>
-#include <queue>
-#include <set>
-
-#include <stout/check.hpp>
-#include <stout/os.hpp>
-
-#include <stout/os/pstree.hpp>
-
-
-namespace os {
-
-// Forward declarations from os.hpp.
-inline std::set<pid_t> children(pid_t, const std::list<Process>&, bool);
-inline Result<Process> process(pid_t);
-inline Option<Process> process(pid_t, const std::list<Process>&);
-inline Try<std::list<Process>> processes();
-inline Try<std::list<ProcessTree>> pstrees(
- const std::set<pid_t>&,
- const std::list<Process>&);
-
-
-// Sends a signal to a process tree rooted at the specified pid.
-// If groups is true, this also sends the signal to all encountered
-// process groups.
-// If sessions is true, this also sends the signal to all encountered
-// process sessions.
-// Note that processes of the group and session of the parent of the
-// root process is not included unless they are part of the root
-// process tree.
-// Note that if the process 'pid' has exited we'll signal the process
-// tree(s) rooted at pids in the group or session led by the process
-// if groups = true or sessions = true, respectively.
-// Returns the process trees that were succesfully or unsuccessfully
-// signaled. Note that the process trees can be stringified.
-// TODO(benh): Allow excluding the root pid from stopping, killing,
-// and continuing so as to provide a means for expressing "kill all of
-// my children". This is non-trivial because of the current
-// implementation.
-inline Try<std::list<ProcessTree>> killtree(
- pid_t pid,
- int signal,
- bool groups = false,
- bool sessions = false)
-{
- Try<std::list<Process>> processes = os::processes();
-
- if (processes.isError()) {
- return Error(processes.error());
- }
-
- Result<Process> process = os::process(pid, processes.get());
-
- std::queue<pid_t> queue;
-
- // If the root process has already terminated we'll add in any pids
- // that are in the process group originally led by pid or in the
- // session originally led by pid, if instructed.
- if (process.isNone()) {
- foreach (const Process& _process, processes.get()) {
- if (groups && _process.group == pid) {
- queue.push(_process.pid);
- } else if (sessions &&
- _process.session.isSome() &&
- _process.session.get() == pid) {
- queue.push(_process.pid);
- }
- }
-
- // Root process is not running and no processes found in the
- // process group or session so nothing we can do.
- if (queue.empty()) {
- return std::list<ProcessTree>();
- }
- } else {
- // Start the traversal from pid as the root.
- queue.push(pid);
- }
-
- struct {
- std::set<pid_t> pids;
- std::set<pid_t> groups;
- std::set<pid_t> sessions;
- std::list<Process> processes;
- } visited;
-
- // If we are following groups and/or sessions then we try and make
- // the group and session of the parent process "already visited" so
- // that we don't kill "up the tree". This can only be done if the
- // process is present.
- if (process.isSome() && (groups || sessions)) {
- Option<Process> parent =
- os::process(process.get().parent, processes.get());
-
- if (parent.isSome()) {
- if (groups) {
- visited.groups.insert(parent.get().group);
- }
- if (sessions && parent.get().session.isSome()) {
- visited.sessions.insert(parent.get().session.get());
- }
- }
- }
-
- while (!queue.empty()) {
- pid_t pid = queue.front();
- queue.pop();
-
- if (visited.pids.count(pid) != 0) {
- continue;
- }
-
- // Make sure this process still exists.
- process = os::process(pid);
-
- if (process.isError()) {
- return Error(process.error());
- } else if (process.isNone()) {
- continue;
- }
-
- // Stop the process to keep it from forking while we are killing
- // it since a forked child might get re-parented by init and
- // become impossible to find.
- kill(pid, SIGSTOP);
-
- visited.pids.insert(pid);
- visited.processes.push_back(process.get());
-
- // Now refresh the process list knowing that the current process
- // can't fork any more children (since it's stopped).
- processes = os::processes();
-
- if (processes.isError()) {
- return Error(processes.error());
- }
-
- // Enqueue the children for visiting.
- foreach (pid_t child, os::children(pid, processes.get(), false)) {
- queue.push(child);
- }
-
- // Now "visit" the group and/or session of the current process.
- if (groups) {
- pid_t group = process.get().group;
- if (visited.groups.count(group) == 0) {
- foreach (const Process& process, processes.get()) {
- if (process.group == group) {
- queue.push(process.pid);
- }
- }
- visited.groups.insert(group);
- }
- }
-
- // If we do not have a session for the process, it's likely
- // because the process is a zombie on OS X. This implies it has
- // not been reaped and thus is located somewhere in the tree we
- // are trying to kill. Therefore, we should discover it from our
- // tree traversal, or through its group (which is always present).
- if (sessions && process.get().session.isSome()) {
- pid_t session = process.get().session.get();
- if (visited.sessions.count(session) == 0) {
- foreach (const Process& process, processes.get()) {
- if (process.session.isSome() && process.session.get() == session) {
- queue.push(process.pid);
- }
- }
- visited.sessions.insert(session);
- }
- }
- }
-
- // Now that all processes are stopped, we send the signal.
- foreach (pid_t pid, visited.pids) {
- kill(pid, signal);
- }
-
- // There is a concern that even though some process is stopped,
- // sending a signal to any of it's children may cause a SIGCLD to
- // be delivered to it which wakes it up (or any other signal maybe
- // delivered). However, from the Open Group standards on "Signal
- // Concepts":
- //
- // "While a process is stopped, any additional signals that are
- // sent to the process shall not be delivered until the process
- // is continued, except SIGKILL which always terminates the
- // receiving process."
- //
- // In practice, this is not what has been witnessed. Rather, a
- // process that has been stopped will respond to SIGTERM, SIGINT,
- // etc. That being said, we still continue the process below in the
- // event that it doesn't terminate from the sending signal but it
- // also doesn't get continued (as per the specifications above).
-
- // Try and continue the processes in case the signal is
- // non-terminating but doesn't continue the process.
- foreach (pid_t pid, visited.pids) {
- kill(pid, SIGCONT);
- }
-
- // Return the process trees representing the visited pids.
- return pstrees(visited.pids, visited.processes);
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_KILLTREE_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/mkdtemp.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/mkdtemp.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/mkdtemp.hpp
deleted file mode 100644
index bbfbb8a..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/mkdtemp.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you 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_POSIX_MKDTEMP_HPP__
-#define __STOUT_OS_POSIX_MKDTEMP_HPP__
-
-#include <stout/try.hpp>
-
-
-namespace os {
-
-// Creates a temporary directory using the specified path
-// template. The template may be any path with _6_ `Xs' appended to
-// it, for example /tmp/temp.XXXXXX. The trailing `Xs' are replaced
-// with a unique alphanumeric combination.
-inline Try<std::string> mkdtemp(const std::string& path = "/tmp/XXXXXX")
-{
- char* temp = new char[path.size() + 1];
- if (::mkdtemp(::strcpy(temp, path.c_str())) != NULL) {
- std::string result(temp);
- delete[] temp;
- return result;
- } else {
- delete[] temp;
- return ErrnoError();
- }
-}
-
-} // namespace os {
-
-
-#endif // __STOUT_OS_POSIX_MKDTEMP_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/pagesize.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/pagesize.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/pagesize.hpp
deleted file mode 100644
index f3ae69a..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/pagesize.hpp
+++ /dev/null
@@ -1,30 +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_POSIX_PAGESIZE_HPP__
-#define __STOUT_OS_POSIX_PAGESIZE_HPP__
-
-#include <unistd.h>
-
-
-namespace os {
-
-// The alternative `getpagesize()` does not exist when enforcing
-// strict POSIX compliance.
-inline int pagesize()
-{
- return sysconf(_SC_PAGESIZE);
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_PAGESIZE_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/read.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/read.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/read.hpp
deleted file mode 100644
index b6185de..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/read.hpp
+++ /dev/null
@@ -1,29 +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_POSIX_READ_HPP__
-#define __STOUT_OS_POSIX_READ_HPP__
-
-#include <errno.h>
-#include <unistd.h>
-
-
-namespace os {
-
-// Compatibility function. On POSIX, this function is trivial, but on Windows,
-// we have to check whether the file descriptor is a socket or a file to read
-// from it.
-using ::read;
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_READ_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/rename.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/rename.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/rename.hpp
deleted file mode 100644
index 9cff6db..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/rename.hpp
+++ /dev/null
@@ -1,38 +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_POSIX_RENAME_HPP__
-#define __STOUT_OS_POSIX_RENAME_HPP__
-
-#include <stdio.h>
-
-#include <string>
-
-#include <stout/error.hpp>
-#include <stout/nothing.hpp>
-#include <stout/try.hpp>
-
-
-namespace os {
-
-inline Try<Nothing> rename(const std::string& from, const std::string& to)
-{
- if (::rename(from.c_str(), to.c_str()) != 0) {
- return ErrnoError();
- }
-
- return Nothing();
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_RENAME_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/rm.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/rm.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/rm.hpp
deleted file mode 100644
index b1ec881..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/rm.hpp
+++ /dev/null
@@ -1,37 +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_POSIX_RM_HPP__
-#define __STOUT_OS_POSIX_RM_HPP__
-
-#include <stdio.h>
-
-#include <string>
-
-#include <stout/error.hpp>
-#include <stout/nothing.hpp>
-#include <stout/try.hpp>
-
-
-namespace os {
-
-inline Try<Nothing> rm(const std::string& path)
-{
- if (::remove(path.c_str()) != 0) {
- return ErrnoError();
- }
-
- return Nothing();
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_RM_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/rmdir.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/rmdir.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/rmdir.hpp
deleted file mode 100644
index a6d3b57..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/rmdir.hpp
+++ /dev/null
@@ -1,116 +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_POSIX_RMDIR_HPP__
-#define __STOUT_OS_POSIX_RMDIR_HPP__
-
-#include <fts.h>
-#include <unistd.h>
-#include <string>
-
-#include <stout/error.hpp>
-#include <stout/nothing.hpp>
-#include <stout/try.hpp>
-
-#include <stout/os/exists.hpp>
-
-
-namespace os {
-
-// By default, recursively deletes a directory akin to: 'rm -r'. If
-// `recursive` is false, it deletes a directory akin to: 'rmdir'. In
-// recursive mode, `removeRoot` can be set to false to enable removing
-// all the files and directories beneath the given root directory, but
-// not the root directory itself.
-// Note that this function expects an absolute path.
-#ifndef __sun // FTS is not available on Solaris.
-inline Try<Nothing> rmdir(
- const std::string& directory,
- bool recursive = true,
- bool removeRoot = true)
-{
- if (!recursive) {
- if (::rmdir(directory.c_str()) < 0) {
- return ErrnoError();
- }
- } else {
- // NOTE: `fts_open` will not always return `NULL` if the path does not
- // exist. We manually induce an error here to indicate that we can't remove
- // a directory that does not exist.
- if (!os::exists(directory)) {
- errno = ENOENT;
- return ErrnoError();
- }
-
- char* paths[] = {const_cast<char*>(directory.c_str()), NULL};
-
- // Using `FTS_PHYSICAL` here because we need `FTSENT` for the
- // symbolic link in the directory and not the target it links to.
- FTS* tree = fts_open(paths, (FTS_NOCHDIR | FTS_PHYSICAL), NULL);
- if (tree == NULL) {
- return ErrnoError();
- }
-
- FTSENT* node;
- while ((node = fts_read(tree)) != NULL) {
- switch (node->fts_info) {
- case FTS_DP:
- // Don't remove the root of the traversal of `removeRoot`
- // is false.
- if (!removeRoot && node->fts_level == FTS_ROOTLEVEL) {
- continue;
- }
-
- if (::rmdir(node->fts_path) < 0 && errno != ENOENT) {
- Error error = ErrnoError();
- fts_close(tree);
- return error;
- }
- break;
- // `FTS_DEFAULT` would include any file type which is not
- // explicitly described by any of the other `fts_info` values.
- case FTS_DEFAULT:
- case FTS_F:
- case FTS_SL:
- // `FTS_SLNONE` should never be the case as we don't set
- // `FTS_COMFOLLOW` or `FTS_LOGICAL`. Adding here for completion.
- case FTS_SLNONE:
- if (::unlink(node->fts_path) < 0 && errno != ENOENT) {
- Error error = ErrnoError();
- fts_close(tree);
- return error;
- }
- break;
- default:
- break;
- }
- }
-
- if (errno != 0) {
- Error error = ErrnoError();
- fts_close(tree);
- return error;
- }
-
- if (fts_close(tree) < 0) {
- return ErrnoError();
- }
- }
-
- return Nothing();
-}
-#endif // __sun
-
-} // namespace os {
-
-
-#endif // __STOUT_OS_POSIX_RMDIR_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/sendfile.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/sendfile.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/sendfile.hpp
deleted file mode 100644
index c2806fa..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/sendfile.hpp
+++ /dev/null
@@ -1,86 +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_POSIX_SENDFILE_HPP__
-#define __STOUT_OS_POSIX_SENDFILE_HPP__
-
-#include <errno.h>
-
-#if defined(__linux__) || defined(__sun)
-#include <sys/sendfile.h>
-#endif
-#if defined(__APPLE__) || defined(__FreeBSD__)
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/uio.h>
-#endif // __APPLE__ || __FreeBSD__
-
-#include <stout/os/signals.hpp>
-#include <stout/unreachable.hpp>
-
-#include <stout/error.hpp>
-#include <stout/try.hpp>
-
-namespace os {
-
-// Returns the amount of bytes written from the input file
-// descriptor to the output socket. On error,
-// `Try<ssize_t, SocketError>` contains the error.
-// NOTE: The following limitations exist because of the OS X
-// implementation of sendfile:
-// 1. s must be a stream oriented socket descriptor.
-// 2. fd must be a regular file descriptor.
-inline Try<ssize_t, SocketError> sendfile(
- int s, int fd, off_t offset, size_t length)
-{
-#if defined(__linux__) || defined(__sun)
- SUPPRESS (SIGPIPE) {
- // This will set errno to EPIPE if a SIGPIPE occurs.
- ssize_t sent = ::sendfile(s, fd, &offset, length);
- if (sent < 0) {
- return SocketError();
- }
-
- return sent;
- }
- UNREACHABLE();
-#elif defined __APPLE__
- // On OS X, sendfile does not need to have SIGPIPE suppressed.
- off_t _length = static_cast<off_t>(length);
-
- if (::sendfile(fd, s, offset, &_length, NULL, 0) < 0) {
- if (errno == EAGAIN && _length > 0) {
- return _length;
- }
- return SocketError();
- }
-
- return _length;
-#elif defined __FreeBSD__
- off_t _length = 0;
-
- SUPPRESS (SIGPIPE) {
- if (::sendfile(fd, s, offset, length, NULL, &_length, 0) < 0) {
- if (errno == EAGAIN && length > 0) {
- return _length;
- }
- return SocketError();
- }
- }
-
- return _length;
-#endif
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_SENDFILE_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/shell.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/shell.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/shell.hpp
deleted file mode 100644
index b786d47..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/shell.hpp
+++ /dev/null
@@ -1,156 +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_POSIX_SHELL_HPP__
-#define __STOUT_OS_POSIX_SHELL_HPP__
-
-#include <stdarg.h> // For va_list, va_start, etc.
-#include <stdio.h> // For ferror, fgets, FILE, pclose, popen.
-
-#include <sys/wait.h> // For waitpid.
-
-#include <ostream>
-#include <string>
-
-#include <glog/logging.h>
-
-#include <stout/error.hpp>
-#include <stout/format.hpp>
-#include <stout/try.hpp>
-
-
-namespace os {
-
-namespace Shell {
-
- // Canonical constants used as platform-dependent args to `exec` calls.
- // `name` is the command name, `arg0` is the first argument received
- // by the callee, usually the command name and `arg1` is the second
- // command argument received by the callee.
-
- constexpr const char* name = "sh";
- constexpr const char* arg0 = "sh";
- constexpr const char* arg1 = "-c";
-
-} // namespace Shell {
-
-/**
- * Runs a shell command with optional arguments.
- *
- * This assumes that a successful execution will result in the exit code
- * for the command to be `EXIT_SUCCESS`; in this case, the contents
- * of the `Try` will be the contents of `stdout`.
- *
- * If the exit code is non-zero or the process was signaled, we will
- * return an appropriate error message; but *not* `stderr`.
- *
- * If the caller needs to examine the contents of `stderr` it should
- * be redirected to `stdout` (using, e.g., "2>&1 || true" in the command
- * string). The `|| true` is required to obtain a success exit
- * code in case of errors, and still obtain `stderr`, as piped to
- * `stdout`.
- *
- * @param fmt the formatting string that contains the command to execute
- * in the underlying shell.
- * @param t optional arguments for `fmt`.
- *
- * @return the output from running the specified command with the shell; or
- * an error message if the command's exit code is non-zero.
- */
-template <typename... T>
-Try<std::string> shell(const std::string& fmt, const T&... t)
-{
- const Try<std::string> command = strings::internal::format(fmt, t...);
- if (command.isError()) {
- return Error(command.error());
- }
-
- FILE* file;
- std::ostringstream stdout;
-
- if ((file = popen(command.get().c_str(), "r")) == NULL) {
- return Error("Failed to run '" + command.get() + "'");
- }
-
- char line[1024];
- // NOTE(vinod): Ideally the if and while loops should be interchanged. But
- // we get a broken pipe error if we don't read the output and simply close.
- while (fgets(line, sizeof(line), file) != NULL) {
- stdout << line;
- }
-
- if (ferror(file) != 0) {
- pclose(file); // Ignoring result since we already have an error.
- return Error("Error reading output of '" + command.get() + "'");
- }
-
- int status;
- if ((status = pclose(file)) == -1) {
- return Error("Failed to get status of '" + command.get() + "'");
- }
-
- if (WIFSIGNALED(status)) {
- return Error(
- "Running '" + command.get() + "' was interrupted by signal '" +
- strsignal(WTERMSIG(status)) + "'");
- } else if ((WEXITSTATUS(status) != EXIT_SUCCESS)) {
- LOG(ERROR) << "Command '" << command.get()
- << "' failed; this is the output:\n" << stdout.str();
- return Error(
- "Failed to execute '" + command.get() + "'; the command was either "
- "not found or exited with a non-zero exit status: " +
- stringify(WEXITSTATUS(status)));
- }
-
- return stdout.str();
-}
-
-
-// Executes a command by calling "/bin/sh -c <command>", and returns
-// after the command has been completed. Returns 0 if succeeds, and
-// return -1 on error (e.g., fork/exec/waitpid failed). This function
-// is async signal safe. We return int instead of returning a Try
-// because Try involves 'new', which is not async signal safe.
-inline int system(const std::string& command)
-{
- pid_t pid = ::fork();
-
- if (pid == -1) {
- return -1;
- } else if (pid == 0) {
- // In child process.
- ::execlp(
- Shell::name, Shell::arg0, Shell::arg1, command.c_str(), (char*)NULL);
- ::exit(127);
- } else {
- // In parent process.
- int status;
- while (::waitpid(pid, &status, 0) == -1) {
- if (errno != EINTR) {
- return -1;
- }
- }
-
- return status;
- }
-}
-
-
-template<typename... T>
-inline int execlp(const char* file, T... t)
-{
- return ::execlp(file, t...);
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_SHELL_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/signals.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/signals.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/signals.hpp
deleted file mode 100644
index f46f591..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/signals.hpp
+++ /dev/null
@@ -1,188 +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_POSIX_SIGNALS_HPP__
-#define __STOUT_OS_POSIX_SIGNALS_HPP__
-
-#include <errno.h>
-#include <pthread.h>
-#include <signal.h>
-#include <string.h>
-#include <unistd.h>
-
-
-namespace os {
-
-namespace signals {
-
-// Installs the given signal handler.
-inline int install(int signal, void(*handler)(int))
-{
- struct sigaction action;
- memset(&action, 0, sizeof(action));
- sigemptyset(&action.sa_mask);
- action.sa_handler = handler;
- return sigaction(signal, &action, NULL);
-}
-
-
-// Resets the signal handler to the default handler of the signal.
-inline int reset(int signal)
-{
- struct sigaction action;
- memset(&action, 0, sizeof(action));
- sigemptyset(&action.sa_mask);
- action.sa_handler = SIG_DFL;
- return sigaction(signal, &action, NULL);
-}
-
-
-// Returns true iff the signal is pending.
-inline bool pending(int signal)
-{
- sigset_t set;
- sigemptyset(&set);
- sigpending(&set);
- return sigismember(&set, signal);
-}
-
-
-// Returns true if the signal has been blocked, or false if the
-// signal was already blocked.
-inline bool block(int signal)
-{
- sigset_t set;
- sigemptyset(&set);
- sigaddset(&set, signal);
-
- sigset_t oldset;
- sigemptyset(&oldset);
-
- // We ignore errors here as the only documented one is
- // EINVAL due to a bad value of the SIG_* argument.
- pthread_sigmask(SIG_BLOCK, &set, &oldset);
-
- return !sigismember(&oldset, signal);
-}
-
-
-// Returns true if the signal has been unblocked, or false if the
-// signal was not previously blocked.
-inline bool unblock(int signal)
-{
- sigset_t set;
- sigemptyset(&set);
- sigaddset(&set, signal);
-
- sigset_t oldset;
- sigemptyset(&oldset);
-
- pthread_sigmask(SIG_UNBLOCK, &set, &oldset);
-
- return sigismember(&oldset, signal);
-}
-
-namespace internal {
-
-// Suppresses a signal on the current thread for the lifetime of
-// the Suppressor. The signal *must* be synchronous and delivered
-// per-thread. The suppression occurs only on the thread of
-// execution of the Suppressor.
-struct Suppressor
-{
- Suppressor(int _signal)
- : signal(_signal), pending(false), unblock(false)
- {
- // Check to see if the signal is already reported as pending.
- // If pending, it means the thread already blocks the signal!
- // Therefore, any new instances of the signal will also be
- // blocked and merged with the pending one since there is no
- // queuing for signals.
- pending = signals::pending(signal);
-
- if (!pending) {
- // Block the signal for this thread only. If already blocked,
- // there's no need to unblock it.
- unblock = signals::block(signal);
- }
- }
-
- ~Suppressor()
- {
- // We want to preserve errno when the Suppressor drops out of
- // scope. Otherwise, one needs to potentially store errno when
- // using the suppress() macro.
- int _errno = errno;
-
- // If the signal has become pending after we blocked it, we
- // need to clear it before unblocking it.
- if (!pending && signals::pending(signal)) {
- // It is possible that in between having observed the pending
- // signal with sigpending() and clearing it with sigwait(),
- // the signal was delivered to another thread before we were
- // able to clear it here. This can happen if the signal was
- // generated for the whole process (e.g. a kill was issued).
- // See 2.4.1 here:
- // http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html
- // To handle the above scenario, one can either:
- // 1. Use sigtimedwait() with a timeout of 0, to ensure we
- // don't block forever. However, this only works on Linux
- // and we may still swallow the signal intended for the
- // process.
- // 2. After seeing the pending signal, signal ourselves with
- // pthread_kill prior to calling sigwait(). This can still
- // swallow the signal intended for the process.
- // We chose to use the latter technique as it works on all
- // POSIX systems and is less likely to swallow process signals,
- // provided the thread signal and process signal are not merged.
-
- // Delivering on this thread an extra time will require an extra sigwait
- // call on FreeBSD, so we skip it.
-#ifndef __FreeBSD__
- pthread_kill(pthread_self(), signal);
-#endif
-
- sigset_t mask;
- sigemptyset(&mask);
- sigaddset(&mask, signal);
-
- int result;
- do {
- int _ignored;
- result = sigwait(&mask, &_ignored);
- } while (result == -1 && errno == EINTR);
- }
-
- // Unblock the signal (only if we were the ones to block it).
- if (unblock) {
- signals::unblock(signal);
- }
-
- // Restore errno.
- errno = _errno;
- }
-
- // Needed for the suppress() macro.
- operator bool() { return true; }
-private:
- const int signal;
- bool pending; // Whether the signal is already pending.
- bool unblock; // Whether to unblock the signal on destruction.
-};
-
-} // namespace internal {
-
-} // namespace signals {
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_SIGNALS_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/socket.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/socket.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/socket.hpp
deleted file mode 100644
index ab5f62a..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/socket.hpp
+++ /dev/null
@@ -1,58 +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_POSIX_SOCKET_HPP__
-#define __STOUT_OS_POSIX_SOCKET_HPP__
-
-#include <unistd.h>
-
-#include <sys/socket.h>
-#include <sys/stat.h>
-
-namespace net {
-
-// The error indicates the last socket operation has been
-// interupted, the operation can be restarted imediately.
-inline bool is_restartable_error(int error)
-{
- return (error == EINTR);
-}
-
-
-// The error indicates the last socket function on a non-blocking socket
-// cannot be completed. This is a temporary condition and the caller can
-// retry the operation later.
-inline bool is_retryable_error(int error)
-{
- return (error == EWOULDBLOCK || error == EAGAIN);
-}
-
-
-inline bool is_inprogress_error(int error)
-{
- return (error == EINPROGRESS);
-}
-
-
-inline bool is_socket(int fd)
-{
- struct stat statbuf;
- if (fstat(fd, &statbuf) < 0) {
- return false;
- }
-
- return S_ISSOCK(statbuf.st_mode) != 0;
-}
-
-} // namespace net {
-
-#endif // __STOUT_OS_POSIX_SOCKET_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/stat.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/stat.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/stat.hpp
deleted file mode 100644
index 32fa426..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/stat.hpp
+++ /dev/null
@@ -1,175 +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_POSIX_STAT_HPP__
-#define __STOUT_OS_POSIX_STAT_HPP__
-
-#include <sys/stat.h>
-#include <sys/statvfs.h>
-
-#include <string>
-
-#include <stout/bytes.hpp>
-#include <stout/try.hpp>
-#include <stout/unreachable.hpp>
-
-
-namespace os {
-
-namespace stat {
-
-inline bool isdir(const std::string& path)
-{
- struct stat s;
-
- if (::stat(path.c_str(), &s) < 0) {
- return false;
- }
-
- return S_ISDIR(s.st_mode);
-}
-
-
-inline bool isfile(const std::string& path)
-{
- struct stat s;
-
- if (::stat(path.c_str(), &s) < 0) {
- return false;
- }
-
- return S_ISREG(s.st_mode);
-}
-
-
-inline bool islink(const std::string& path)
-{
- struct stat s;
-
- if (::lstat(path.c_str(), &s) < 0) {
- return false;
- }
-
- return S_ISLNK(s.st_mode);
-}
-
-
-// Describes the different semantics supported for the implementation
-// of `size` defined below.
-enum FollowSymlink
-{
- DO_NOT_FOLLOW_SYMLINK,
- FOLLOW_SYMLINK
-};
-
-
-// Returns the size in Bytes of a given file system entry. When
-// applied to a symbolic link with `follow` set to
-// `DO_NOT_FOLLOW_SYMLINK`, this will return the length of the entry
-// name (strlen).
-inline Try<Bytes> size(
- const std::string& path,
- const FollowSymlink follow = FOLLOW_SYMLINK)
-{
- struct stat s;
-
- switch (follow) {
- case DO_NOT_FOLLOW_SYMLINK: {
- if (::lstat(path.c_str(), &s) < 0) {
- return ErrnoError("Error invoking lstat for '" + path + "'");
- } else {
- return Bytes(s.st_size);
- }
- break;
- }
- case FOLLOW_SYMLINK: {
- if (::stat(path.c_str(), &s) < 0) {
- return ErrnoError("Error invoking stat for '" + path + "'");
- } else {
- return Bytes(s.st_size);
- }
- break;
- }
- }
-
- UNREACHABLE();
-}
-
-
-inline Try<long> mtime(const std::string& path)
-{
- struct stat s;
-
- if (::lstat(path.c_str(), &s) < 0) {
- return ErrnoError("Error invoking stat for '" + path + "'");
- }
-
- return s.st_mtime;
-}
-
-
-inline Try<mode_t> mode(const std::string& path)
-{
- struct stat s;
-
- if (::stat(path.c_str(), &s) < 0) {
- return ErrnoError("Error invoking stat for '" + path + "'");
- }
-
- return s.st_mode;
-}
-
-
-inline Try<dev_t> dev(const std::string& path)
-{
- struct stat s;
-
- if (::stat(path.c_str(), &s) < 0) {
- return ErrnoError("Error invoking stat for '" + path + "'");
- }
-
- return s.st_dev;
-}
-
-
-inline Try<dev_t> rdev(const std::string& path)
-{
- struct stat s;
-
- if (::stat(path.c_str(), &s) < 0) {
- return ErrnoError("Error invoking stat for '" + path + "'");
- }
-
- if (!S_ISCHR(s.st_mode) && !S_ISBLK(s.st_mode)) {
- return Error("Not a special file: " + path);
- }
-
- return s.st_rdev;
-}
-
-
-inline Try<ino_t> inode(const std::string& path)
-{
- struct stat s;
-
- if (::stat(path.c_str(), &s) < 0) {
- return ErrnoError("Error invoking stat for '" + path + "'");
- }
-
- return s.st_ino;
-}
-
-} // namespace stat {
-
-} // namespace os {
-
-#endif // __STOUT_OS_STAT_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/su.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/su.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/su.hpp
deleted file mode 100644
index 43e91d6..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/su.hpp
+++ /dev/null
@@ -1,216 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you 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_POSIX_SU_HPP__
-#define __STOUT_OS_POSIX_SU_HPP__
-
-#include <string>
-
-#include <grp.h>
-#include <pwd.h>
-
-#include <stout/error.hpp>
-#include <stout/nothing.hpp>
-#include <stout/try.hpp>
-#include <stout/unreachable.hpp>
-
-namespace os {
-
-inline Result<uid_t> getuid(const Option<std::string>& user = None())
-{
- if (user.isNone()) {
- return ::getuid();
- }
-
- struct passwd passwd;
- struct passwd* result = NULL;
-
- int size = sysconf(_SC_GETPW_R_SIZE_MAX);
- if (size == -1) {
- // Initial value for buffer size.
- size = 1024;
- }
-
- while (true) {
- char* buffer = new char[size];
-
- if (getpwnam_r(user.get().c_str(), &passwd, buffer, size, &result) == 0) {
- // The usual interpretation of POSIX is that getpwnam_r will
- // return 0 but set result == NULL if the user is not found.
- if (result == NULL) {
- delete[] buffer;
- return None();
- }
-
- uid_t uid = passwd.pw_uid;
- delete[] buffer;
- return uid;
- } else {
- // RHEL7 (and possibly other systems) will return non-zero and
- // set one of the following errors for "The given name or uid
- // was not found." See 'man getpwnam_r'. We only check for the
- // errors explicitly listed, and do not consider the ellipsis.
- if (errno == ENOENT ||
- errno == ESRCH ||
- errno == EBADF ||
- errno == EPERM) {
- delete[] buffer;
- return None();
- }
-
- if (errno != ERANGE) {
- delete[] buffer;
- return ErrnoError("Failed to get username information");
- }
- // getpwnam_r set ERANGE so try again with a larger buffer.
- size *= 2;
- delete[] buffer;
- }
- }
-
- UNREACHABLE();
-}
-
-
-inline Result<gid_t> getgid(const Option<std::string>& user = None())
-{
- if (user.isNone()) {
- return ::getgid();
- }
-
- struct passwd passwd;
- struct passwd* result = NULL;
-
- int size = sysconf(_SC_GETPW_R_SIZE_MAX);
- if (size == -1) {
- // Initial value for buffer size.
- size = 1024;
- }
-
- while (true) {
- char* buffer = new char[size];
-
- if (getpwnam_r(user.get().c_str(), &passwd, buffer, size, &result) == 0) {
- // The usual interpretation of POSIX is that getpwnam_r will
- // return 0 but set result == NULL if the group is not found.
- if (result == NULL) {
- delete[] buffer;
- return None();
- }
-
- gid_t gid = passwd.pw_gid;
- delete[] buffer;
- return gid;
- } else {
- // RHEL7 (and possibly other systems) will return non-zero and
- // set one of the following errors for "The given name or uid
- // was not found." See 'man getpwnam_r'. We only check for the
- // errors explicitly listed, and do not consider the ellipsis.
- if (errno == ENOENT ||
- errno == ESRCH ||
- errno == EBADF ||
- errno == EPERM) {
- delete[] buffer;
- return None();
- }
-
- if (errno != ERANGE) {
- delete[] buffer;
- return ErrnoError("Failed to get username information");
- }
- // getpwnam_r set ERANGE so try again with a larger buffer.
- size *= 2;
- delete[] buffer;
- }
- }
-
- UNREACHABLE();
-}
-
-
-inline Result<std::string> user(Option<uid_t> uid = None())
-{
- if (uid.isNone()) {
- uid = ::getuid();
- }
-
- int size = sysconf(_SC_GETPW_R_SIZE_MAX);
- if (size == -1) {
- // Initial value for buffer size.
- size = 1024;
- }
-
- struct passwd passwd;
- struct passwd* result = NULL;
-
- while (true) {
- char* buffer = new char[size];
-
- if (getpwuid_r(uid.get(), &passwd, buffer, size, &result) == 0) {
- // getpwuid_r will return 0 but set result == NULL if the uid is
- // not found.
- if (result == NULL) {
- delete[] buffer;
- return None();
- }
-
- std::string user(passwd.pw_name);
- delete[] buffer;
- return user;
- } else {
- if (errno != ERANGE) {
- delete[] buffer;
- return ErrnoError();
- }
-
- // getpwuid_r set ERANGE so try again with a larger buffer.
- size *= 2;
- delete[] buffer;
- }
- }
-}
-
-inline Try<Nothing> su(const std::string& user)
-{
- Result<gid_t> gid = os::getgid(user);
- if (gid.isError() || gid.isNone()) {
- return Error("Failed to getgid: " +
- (gid.isError() ? gid.error() : "unknown user"));
- } else if (::setgid(gid.get())) {
- return ErrnoError("Failed to set gid");
- }
-
- // Set the supplementary group list. We ignore EPERM because
- // performing a no-op call (switching to same group) still
- // requires being privileged, unlike 'setgid' and 'setuid'.
- if (::initgroups(user.c_str(), gid.get()) == -1 && errno != EPERM) {
- return ErrnoError("Failed to set supplementary groups");
- }
-
- Result<uid_t> uid = os::getuid(user);
- if (uid.isError() || uid.isNone()) {
- return Error("Failed to getuid: " +
- (uid.isError() ? uid.error() : "unknown user"));
- } else if (::setuid(uid.get())) {
- return ErrnoError("Failed to setuid");
- }
-
- return Nothing();
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_POSIX_SU_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/write.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/write.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/write.hpp
deleted file mode 100644
index fcc9bb6..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/posix/write.hpp
+++ /dev/null
@@ -1,30 +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_POSIX_WRITE_HPP__
-#define __STOUT_OS_POSIX_WRITE_HPP__
-
-#include <errno.h>
-#include <unistd.h>
-
-
-namespace os {
-
-// Compatibility function. On POSIX, this function is trivial, but on Windows,
-// we have to check whether the file descriptor is a socket or a file to write
-// to it.
-using ::write;
-
-} // namespace os {
-
-
-#endif // __STOUT_OS_POSIX_READ_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/process.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/process.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/process.hpp
deleted file mode 100644
index a91a9d4..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/process.hpp
+++ /dev/null
@@ -1,177 +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_PROCESS_HPP__
-#define __STOUT_OS_PROCESS_HPP__
-
-#include <sys/types.h> // For pid_t.
-
-#include <list>
-#include <ostream>
-#include <sstream>
-#include <string>
-
-#include <stout/bytes.hpp>
-#include <stout/duration.hpp>
-#include <stout/none.hpp>
-#include <stout/option.hpp>
-#include <stout/strings.hpp>
-
-
-namespace os {
-
-struct Process
-{
- Process(pid_t _pid,
- pid_t _parent,
- pid_t _group,
- const Option<pid_t>& _session,
- const Option<Bytes>& _rss,
- const Option<Duration>& _utime,
- const Option<Duration>& _stime,
- const std::string& _command,
- bool _zombie)
- : pid(_pid),
- parent(_parent),
- group(_group),
- session(_session),
- rss(_rss),
- utime(_utime),
- stime(_stime),
- command(_command),
- zombie(_zombie) {}
-
- const pid_t pid;
- const pid_t parent;
- const pid_t group;
- const Option<pid_t> session;
- const Option<Bytes> rss;
- const Option<Duration> utime;
- const Option<Duration> stime;
- const std::string command;
- const bool zombie;
-
- // TODO(bmahler): Add additional data as needed.
-
- bool operator<(const Process& p) const { return pid < p.pid; }
- bool operator<=(const Process& p) const { return pid <= p.pid; }
- bool operator>(const Process& p) const { return pid > p.pid; }
- bool operator>=(const Process& p) const { return pid >= p.pid; }
- bool operator==(const Process& p) const { return pid == p.pid; }
- bool operator!=(const Process& p) const { return pid != p.pid; }
-};
-
-
-class ProcessTree
-{
-public:
- // Returns a process subtree rooted at the specified PID, or none if
- // the specified pid could not be found in this process tree.
- Option<ProcessTree> find(pid_t pid) const
- {
- if (process.pid == pid) {
- return *this;
- }
-
- foreach (const ProcessTree& tree, children) {
- Option<ProcessTree> option = tree.find(pid);
- if (option.isSome()) {
- return option;
- }
- }
-
- return None();
- }
-
- // Checks if the specified pid is contained in this process tree.
- bool contains(pid_t pid) const
- {
- return find(pid).isSome();
- }
-
- operator Process() const
- {
- return process;
- }
-
- operator pid_t() const
- {
- return process.pid;
- }
-
- const Process process;
- const std::list<ProcessTree> children;
-
-private:
- friend struct Fork;
- friend Try<ProcessTree> pstree(pid_t, const std::list<Process>&);
-
- ProcessTree(
- const Process& _process,
- const std::list<ProcessTree>& _children)
- : process(_process),
- children(_children) {}
-};
-
-
-inline std::ostream& operator<<(std::ostream& stream, const ProcessTree& tree)
-{
- if (tree.children.empty()) {
- stream << "--- " << tree.process.pid << " ";
- if (tree.process.zombie) {
- stream << "(" << tree.process.command << ")";
- } else {
- stream << tree.process.command;
- }
- } else {
- stream << "-+- " << tree.process.pid << " ";
- if (tree.process.zombie) {
- stream << "(" << tree.process.command << ")";
- } else {
- stream << tree.process.command;
- }
- size_t size = tree.children.size();
- foreach (const ProcessTree& child, tree.children) {
- std::ostringstream out;
- out << child;
- stream << "\n";
- if (--size != 0) {
- stream << " |" << strings::replace(out.str(), "\n", "\n |");
- } else {
- stream << " \\" << strings::replace(out.str(), "\n", "\n ");
- }
- }
- }
- return stream;
-}
-
-} // namespace os {
-
-
-// An overload of stringify for printing a list of process trees
-// (since printing a process tree is rather particular).
-inline std::string stringify(const std::list<os::ProcessTree>& list)
-{
- std::ostringstream out;
- out << "[ " << std::endl;
- std::list<os::ProcessTree>::const_iterator iterator = list.begin();
- while (iterator != list.end()) {
- out << stringify(*iterator);
- if (++iterator != list.end()) {
- out << std::endl << std::endl;
- }
- }
- out << std::endl << "]";
- return out.str();
-}
-
-#endif // __STOUT_OS_PROCESS_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/c235f7c1/3rdparty/libprocess/3rdparty/stout/include/stout/os/pstree.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/pstree.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/pstree.hpp
deleted file mode 100644
index fe382a1..0000000
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/pstree.hpp
+++ /dev/null
@@ -1,131 +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_PSTREE_HPP__
-#define __STOUT_OS_PSTREE_HPP__
-
-#include <list>
-#include <set>
-
-#include <stout/error.hpp>
-#include <stout/foreach.hpp>
-#include <stout/none.hpp>
-#include <stout/option.hpp>
-#include <stout/stringify.hpp>
-#include <stout/try.hpp>
-
-#include <stout/os/process.hpp>
-
-
-namespace os {
-
-// Forward declaration.
-inline Try<std::list<Process>> processes();
-
-
-// Returns a process tree rooted at the specified pid using the
-// specified list of processes (or an error if one occurs).
-inline Try<ProcessTree> pstree(
- pid_t pid,
- const std::list<Process>& processes)
-{
- std::list<ProcessTree> children;
- foreach (const Process& process, processes) {
- if (process.parent == pid) {
- Try<ProcessTree> tree = pstree(process.pid, processes);
- if (tree.isError()) {
- return Error(tree.error());
- }
- children.push_back(tree.get());
- }
- }
-
- foreach (const Process& process, processes) {
- if (process.pid == pid) {
- return ProcessTree(process, children);
- }
- }
-
- return Error("No process found at " + stringify(pid));
-}
-
-
-// Returns a process tree for the specified pid (or all processes if
-// pid is none or the current process if pid is 0).
-inline Try<ProcessTree> pstree(Option<pid_t> pid = None())
-{
- if (pid.isNone()) {
- pid = 1;
- } else if (pid.get() == 0) {
- pid = getpid();
- }
-
- const Try<std::list<Process>> processes = os::processes();
-
- if (processes.isError()) {
- return Error(processes.error());
- }
-
- return pstree(pid.get(), processes.get());
-}
-
-
-// Returns the minimum list of process trees that include all of the
-// specified pids using the specified list of processes.
-inline Try<std::list<ProcessTree>> pstrees(
- const std::set<pid_t>& pids,
- const std::list<Process>& processes)
-{
- std::list<ProcessTree> trees;
-
- foreach (pid_t pid, pids) {
- // First, check if the pid is already connected to one of the
- // process trees we've constructed.
- bool disconnected = true;
- foreach (const ProcessTree& tree, trees) {
- if (tree.contains(pid)) {
- disconnected = false;
- break;
- }
- }
-
- if (disconnected) {
- Try<ProcessTree> tree = pstree(pid, processes);
- if (tree.isError()) {
- return Error(tree.error());
- }
-
- // Now see if any of the existing process trees are actually
- // contained within the process tree we just created and only
- // include the disjoint process trees.
- // C++11:
- // trees = trees.filter([](const ProcessTree& t) {
- // return tree.get().contains(t);
- // });
- std::list<ProcessTree> trees_ = trees;
- trees.clear();
- foreach (const ProcessTree& t, trees_) {
- if (tree.get().contains(t.process.pid)) {
- continue;
- }
- trees.push_back(t);
- }
- trees.push_back(tree.get());
- }
- }
-
- return trees;
-}
-
-} // namespace os {
-
-#endif // __STOUT_OS_PSTREE_HPP__