From fb73fc8292d507e9d6f368da5f2c2ac3e3f85e45 Mon Sep 17 00:00:00 2001
From: Přemysl Janouch
Date: Fri, 14 Jul 2017 21:49:32 +0200
Subject: Mark files that make use of POSIX ACLs
---
CMakeLists.txt | 2 +-
Makefile | 2 +-
sdn.cpp | 15 +++++++++++++--
3 files changed, 15 insertions(+), 4 deletions(-)
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))
--
cgit v1.2.3-70-g09d2