diff --git a/CMakeLists.txt b/CMakeLists.txt index 03f03c2..2429e2e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ pkg_check_modules (NCURSESW QUIET ncursesw) add_executable (${PROJECT_NAME} ${PROJECT_NAME}.cpp) target_include_directories (${PROJECT_NAME} PUBLIC ${NCURSESW_INCLUDE_DIRS}) -target_link_libraries (${PROJECT_NAME} PUBLIC ${NCURSESW_LIBRARIES}) +target_link_libraries (${PROJECT_NAME} PUBLIC ${NCURSESW_LIBRARIES} acl) target_compile_features (${PROJECT_NAME} PUBLIC cxx_std_14) target_compile_definitions (${PROJECT_NAME} PUBLIC -DPROJECT_NAME=\"${PROJECT_NAME}\" -DPROJECT_VERSION=\"${version}\") diff --git a/Makefile b/Makefile index de28c23..84ead83 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ CXXFLAGS = -g -std=c++14 -Wall -Wextra -pedantic -static-libstdc++ all: sdn %: %.cpp CMakeLists.txt - $(CXX) $(CXXFLAGS) $< -o $@ `pkg-config --libs --cflags ncursesw` \ + $(CXX) $(CXXFLAGS) $< -o $@ `pkg-config --libs --cflags ncursesw` -lacl \ `sed -ne 's/^project (\([^ )]*\).*/-DPROJECT_NAME="\1"/p' \ -e 's/^set (version \([^ )]*\).*/-DPROJECT_VERSION="\1"/p' CMakeLists.txt` clean: diff --git a/sdn.cpp b/sdn.cpp index c9cf895..05577e3 100644 --- a/sdn.cpp +++ b/sdn.cpp @@ -26,15 +26,18 @@ #include #include -#include #include #include #include #include +#include #include #include #include +#include +#include + // Unicode is complex enough already and we might make assumptions #ifndef __STDC_ISO_10646__ #error Unicode required for wchar_t @@ -288,7 +291,15 @@ static struct { fun make_row (const string &filename, const struct stat &info) -> row { row r; - r.cols[row::MODES] = apply_attrs (decode_mode (info.st_mode), 0); + auto mode = decode_mode (info.st_mode); + if (auto acl = acl_get_file (filename.c_str (), ACL_TYPE_ACCESS)) { + mode_t m; + // This is a Linux-only extension + if (!acl_equiv_mode (acl, &m) && (m ^ info.st_mode) & 0777) + mode += L"+"; + acl_free (acl); + } + r.cols[row::MODES] = apply_attrs (mode, 0); auto user = to_wstring (info.st_uid); if (auto u = getpwuid (info.st_uid))