X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fsmack-setup.c;h=59f6832bc21feae660a365f8fd9c0907d56683dd;hp=804678d6a6b08d1035ace38ac7238113e288c881;hb=f131770b1465fbf423881f16ba85523a05f846fe;hpb=a4783bd17ad96f55b0fe83a50959da13555292bf diff --git a/src/core/smack-setup.c b/src/core/smack-setup.c index 804678d6a..59f6832bc 100644 --- a/src/core/smack-setup.c +++ b/src/core/smack-setup.c @@ -36,10 +36,14 @@ #include "macro.h" #include "smack-setup.h" #include "util.h" +#include "fileio.h" #include "log.h" #include "label.h" #define SMACK_CONFIG "/etc/smack/accesses.d/" +#define CIPSO_CONFIG "/etc/smack/cipso.d/" + +#ifdef HAVE_SMACK static int write_rules(const char* dstpath, const char* srcdir) { _cleanup_fclose_ FILE *dst = NULL; @@ -52,7 +56,7 @@ static int write_rules(const char* dstpath, const char* srcdir) { dst = fopen(dstpath, "we"); if (!dst) { if (errno != ENOENT) - log_warning("Failed to open %s: %m", dstpath); + log_warning_errno(errno, "Failed to open %s: %m", dstpath); return -errno; /* negative error */ } @@ -60,7 +64,7 @@ static int write_rules(const char* dstpath, const char* srcdir) { dir = opendir(srcdir); if (!dir) { if (errno != ENOENT) - log_warning("Failed to opendir %s: %m", srcdir); + log_warning_errno(errno, "Failed to opendir %s: %m", srcdir); return errno; /* positive on purpose */ } @@ -75,7 +79,7 @@ static int write_rules(const char* dstpath, const char* srcdir) { if (fd < 0) { if (r == 0) r = -errno; - log_warning("Failed to open %s: %m", entry->d_name); + log_warning_errno(errno, "Failed to open %s: %m", entry->d_name); continue; } @@ -83,14 +87,14 @@ static int write_rules(const char* dstpath, const char* srcdir) { if (!policy) { if (r == 0) r = -errno; - close_nointr_nofail(fd); - log_error("Failed to open %s: %m", entry->d_name); + safe_close(fd); + log_error_errno(errno, "Failed to open %s: %m", entry->d_name); continue; } /* load2 write rules in the kernel require a line buffered stream */ FOREACH_LINE(buf, policy, - log_error("Failed to read line from %s: %m", + log_error_errno(errno, "Failed to read line from %s: %m", entry->d_name)) { if (!fputs(buf, dst)) { if (r == 0) @@ -101,7 +105,7 @@ static int write_rules(const char* dstpath, const char* srcdir) { if (fflush(dst)) { if (r == 0) r = -errno; - log_error("Failed to flush writes to %s: %m", dstpath); + log_error_errno(errno, "Failed to flush writes to %s: %m", dstpath); break; } } @@ -110,10 +114,16 @@ static int write_rules(const char* dstpath, const char* srcdir) { return r; } +#endif + +int mac_smack_setup(bool *loaded_policy) { + +#ifdef HAVE_SMACK -int smack_setup(void) { int r; + assert(loaded_policy); + r = write_rules("/sys/fs/smackfs/load2", SMACK_CONFIG); switch(r) { case -ENOENT: @@ -124,10 +134,40 @@ int smack_setup(void) { return 0; case 0: log_info("Successfully loaded Smack policies."); + break; + default: + log_warning("Failed to load Smack access rules: %s, ignoring.", + strerror(abs(r))); + return 0; + } + +#ifdef SMACK_RUN_LABEL + r = write_string_file("/proc/self/attr/current", SMACK_RUN_LABEL); + if (r) + log_warning("Failed to set SMACK label \"%s\" on self: %s", + SMACK_RUN_LABEL, strerror(-r)); +#endif + + r = write_rules("/sys/fs/smackfs/cipso2", CIPSO_CONFIG); + switch(r) { + case -ENOENT: + log_debug("Smack/CIPSO is not enabled in the kernel."); + return 0; + case ENOENT: + log_debug("Smack/CIPSO access rules directory " CIPSO_CONFIG " not found"); return 0; + case 0: + log_info("Successfully loaded Smack/CIPSO policies."); + break; default: - log_warning("Failed to load smack access rules: %s, ignoring.", + log_warning("Failed to load Smack/CIPSO access rules: %s, ignoring.", strerror(abs(r))); return 0; } + + *loaded_policy = true; + +#endif + + return 0; }