Add in-source version of std::filesystem::permissions

pull/673/head
Michael 5 years ago
parent 59e8a7316f
commit 80d1e4aef9
No known key found for this signature in database
GPG Key ID: 2D51757B47E2434C

@ -246,14 +246,7 @@ else()
set(LIBTUNTAP_SRC ${LIBTUNTAP_SRC_BASE})
endif()
if(NOT WIN32)
add_subdirectory(vendor)
endif()
set(LIBS ${MALLOC_LIB} ${FS_LIB})
if(NOT WIN32)
set(LIBS ${LIBS} uv)
endif()
set(LIBS ${MALLOC_LIB} ${FS_LIB} ${UV_LIB})
add_subdirectory(crypto)
add_subdirectory(libutp)
@ -289,7 +282,7 @@ if(SHADOW)
set(LOKINET_SHADOW_LIBS ${SHARED_LIB})
add_shadow_plugin(${LOKINET_SHADOW} ${EXE_SRC})
target_link_libraries(${LOKINET_SHADOW} ${LOKINET_SHADOW_LIBS})
target_include_directories(${LOKINET_SHADOW} PUBLIC ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/llarp ${PROJECT_SOURCE_DIR}/crypto/include ${PROJECT_SOURCE_DIR}/vendor/cppbackport-master/lib)
target_include_directories(${LOKINET_SHADOW} PUBLIC ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/llarp ${PROJECT_SOURCE_DIR}/crypto/include)
else()
if(NOT WIN32)
add_executable(${EXE} ${EXE_SRC})

@ -1,11 +1,16 @@
add_definitions(-DUNIX)
add_definitions(-DPOSIX)
if (STATIC_LINK_RUNTIME)
find_library(UV_LIB NAMES libuv.a)
else()
find_library(UV_LIB NAMES uv)
endif()
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(FS_LIB stdc++fs)
get_filename_component(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-linux.c ABSOLUTE)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Android")
set(FS_LIB stdc++fs)
get_filename_component(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-linux.c ABSOLUTE)
elseif (${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
@ -13,10 +18,18 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
elseif (${CMAKE_SYSTEM_NAME} MATCHES "NetBSD")
set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-netbsd.c ${TT_ROOT}/tuntap-unix-bsd.c)
elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR ${CMAKE_SYSTEM_NAME} MATCHES "DragonFly")
set(FS_LIB c++experimental)
find_library(FS_LIB NAMES c++experimental)
set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-freebsd.c ${TT_ROOT}/tuntap-unix-bsd.c)
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(FS_LIB stdc++fs)
find_library(FS_LIB NAMES stdc++fs c++experimental stdc++fs)
if(FS_LIB STREQUAL FS_LIB-NOTFOUND)
add_subdirectory(vendor)
include_directories("${CMAKE_CURRENT_LIST_DIR}/../vendor/cppbackport-master/lib")
add_definitions(-DLOKINET_USE_CPPBACKPORT)
set(FS_LIB cppbackport)
endif()
set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-darwin.c ${TT_ROOT}/tuntap-unix-bsd.c)
elseif (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-sunos.c)
@ -30,4 +43,3 @@ set(EXE_LIBS ${STATIC_LIB} libutp)
if(RELEASE_MOTTO)
add_definitions(-DLLARP_RELEASE_MOTTO="${RELEASE_MOTTO}")
endif()

@ -1,7 +1,7 @@
FROM alpine:latest as builder
FROM alpine:edge as builder
RUN apk update && \
apk add build-base cmake git libcap-dev curl ninja bash binutils-gold
apk add build-base cmake git libcap-dev libcap-static libuv-dev libuv-static curl ninja bash binutils-gold
WORKDIR /src/
COPY . /src/

@ -56,7 +56,7 @@ target_link_libraries_system(${UTIL_LIB} absl::synchronization absl::hash absl::
# cut back on fluff
if (NOT WIN32)
target_link_libraries_system(${UTIL_LIB} absl::optional absl::variant absl::strings cppbackport)
target_link_libraries_system(${UTIL_LIB} absl::optional absl::variant absl::strings)
endif(NOT WIN32)
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
@ -102,7 +102,7 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
add_import_library(rt)
target_link_libraries(${PLATFORM_LIB} PUBLIC rt)
else()
add_import_library(rt)
add_import_library(cap)
target_link_libraries(${PLATFORM_LIB} PUBLIC cap)
endif()
endif()

@ -296,11 +296,11 @@ llarp_ensure_client_config(std::ofstream &f, std::string basepath)
// write snapp-example.ini
const std::string snappExample_fpath = basepath + "snapp-example.ini";
{
auto f = llarp::util::OpenFileStream< std::ofstream >(snappExample_fpath,
std::ios::binary);
if(!f)
auto stream = llarp::util::OpenFileStream< std::ofstream >(
snappExample_fpath, std::ios::binary);
if(!stream)
return false;
auto &example_f = f.value();
auto &example_f = stream.value();
if(example_f.is_open())
{
// pick ip

@ -5,6 +5,57 @@
#include <system_error>
#include <util/logger.hpp>
namespace cpp17
{
namespace filesystem
{
#ifdef LOKINET_USE_CPPBACKPORT
const fs::perms active_bits(fs::perms::all | fs::perms::set_uid
| fs::perms::set_gid | fs::perms::sticky_bit);
inline mode_t
mode_cast(fs::perms prms)
{
return prms & active_bits;
}
void
permissions(const fs::path& p, fs::perms prms, std::error_code& ec)
{
std::error_code local_ec;
// OS X <10.10, iOS <8.0 and some other platforms don't support
// fchmodat(). Solaris (SunPro and gcc) only support fchmodat() on
// Solaris 11 and higher, and a runtime check is too much trouble. Linux
// does not support permissions on symbolic links and has no plans to
// support them in the future. The chmod() code is thus more practical,
// rather than always hitting ENOTSUP when sending in
// AT_SYMLINK_NO_FOLLOW.
// - See the 3rd paragraph of
// "Symbolic link ownership, permissions, and timestamps" at:
// "http://man7.org/linux/man-pages/man7/symlink.7.html"
// - See the fchmodat() Linux man page:
// "http://man7.org/linux/man-pages/man2/fchmodat.2.html"
#if defined(AT_FDCWD) && defined(AT_SYMLINK_NOFOLLOW) \
&& !(defined(__SUNPRO_CC) || defined(__sun) || defined(sun)) \
&& !(defined(linux) || defined(__linux) || defined(__linux__)) \
&& !(defined(__MAC_OS_X_VERSION_MIN_REQUIRED) \
&& __MAC_OS_X_VERSION_MIN_REQUIRED < 101000) \
&& !(defined(__IPHONE_OS_VERSION_MIN_REQUIRED) \
&& __IPHONE_OS_VERSION_MIN_REQUIRED < 80000) \
&& !(defined(__QNX__) && (_NTO_VERSION <= 700))
if(::fchmodat(AT_FDCWD, p.c_str(), mode_cast(prms), 0))
#else // fallback if fchmodat() not supported
if(::chmod(p.c_str(), mode_cast(prms)))
#endif
{
const int err = errno;
ec.assign(err, std::generic_category());
}
}
#endif
} // namespace filesystem
} // namespace cpp17
namespace llarp
{
namespace util
@ -21,26 +72,25 @@ namespace llarp
EnsurePrivateFile(fs::path pathname)
{
const auto str = pathname.string();
errno = 0;
errno = 0;
error_code_t ec = errno_error();
if(fs::exists(pathname, ec)) // file exists
{
auto st = fs::status(pathname, ec);
if(ec)
return ec;
auto st = fs::status(pathname);
auto perms = st.permissions();
if((perms & fs::perms::others_exec) != fs::perms::none)
perms ^= fs::perms::others_exec;
if((perms & fs::perms::others_write) != fs::perms::none)
perms ^= fs::perms::others_write;
if((perms & fs::perms::others_write) != fs::perms::none)
perms ^= fs::perms::others_write;
if((perms & fs::perms::group_read) != fs::perms::none)
perms ^= fs::perms::group_read;
if((perms & fs::perms::others_read) != fs::perms::none)
perms ^= fs::perms::others_read;
perms = perms ^ fs::perms::others_exec;
if((perms & fs::perms::others_write) != fs::perms::none)
perms = perms ^ fs::perms::others_write;
if((perms & fs::perms::others_write) != fs::perms::none)
perms = perms ^ fs::perms::others_write;
if((perms & fs::perms::group_read) != fs::perms::none)
perms = perms ^ fs::perms::group_read;
if((perms & fs::perms::others_read) != fs::perms::none)
perms = perms ^ fs::perms::others_read;
if((perms & fs::perms::owner_exec) != fs::perms::none)
perms ^= fs::perms::owner_exec;
perms = perms ^ fs::perms::owner_exec;
fs::permissions(pathname, perms, ec);
if(ec)
llarp::LogError("failed to set permissions on ", pathname);
@ -60,4 +110,4 @@ namespace llarp
return ec;
}
} // namespace util
} // namespace llarp
} // namespace llarp

@ -8,8 +8,13 @@
#define PATH_SEP "/"
#endif
#ifndef LOKINET_USE_CPPBACKPORT
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
#else
#include <filesystem.h>
namespace fs = cpp17::filesystem;
#endif
#ifndef _MSC_VER
#include <dirent.h>

Loading…
Cancel
Save