summaryrefslogtreecommitdiff
path: root/sdn.cpp
diff options
context:
space:
mode:
authorPřemysl Janouch <p.janouch@gmail.com>2017-07-14 21:49:32 +0200
committerPřemysl Janouch <p.janouch@gmail.com>2017-07-14 21:49:32 +0200
commitfb73fc8292d507e9d6f368da5f2c2ac3e3f85e45 (patch)
tree7dd42214e222460e9ca4e3261309a2133bff3926 /sdn.cpp
parent8c658475b44eeb1a4e4867d203c73563eb029e8f (diff)
downloadsdn-fb73fc8292d507e9d6f368da5f2c2ac3e3f85e45.tar.gz
sdn-fb73fc8292d507e9d6f368da5f2c2ac3e3f85e45.tar.xz
sdn-fb73fc8292d507e9d6f368da5f2c2ac3e3f85e45.zip
Mark files that make use of POSIX ACLs
Diffstat (limited to 'sdn.cpp')
-rw-r--r--sdn.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/sdn.cpp b/sdn.cpp
index c9cf895..05577e3 100644
--- a/sdn.cpp
+++ b/sdn.cpp
@@ -26,15 +26,18 @@
#include <cstdlib>
#include <fstream>
-#include <ncurses.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/inotify.h>
+#include <sys/acl.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>
+#include <acl/libacl.h>
+#include <ncurses.h>
+
// 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))