| /* lsm.h - header file for lib directory |
| * |
| * Copyright 2015 Rob Landley <rob@landley.net> |
| */ |
| |
| #include <sys/xattr.h> |
| |
| #if CFG_TOYBOX_SELINUX |
| #include <selinux/selinux.h> |
| #else |
| #define is_selinux_enabled() 0 |
| #define setfscreatecon(...) (-1) |
| #define getcon(...) (-1) |
| #define getfilecon(...) (-1) |
| #define lgetfilecon(...) (-1) |
| #define fgetfilecon(...) (-1) |
| #define setfilecon(...) (-1) |
| #define lsetfilecon(...) (-1) |
| #define fsetfilecon(...) (-1) |
| #endif |
| |
| #if CFG_TOYBOX_SMACK |
| #include <sys/smack.h> |
| #include <linux/xattr.h> |
| #else |
| #ifndef XATTR_NAME_SMACK |
| #define XATTR_NAME_SMACK 0 |
| #endif |
| //ssize_t fgetxattr (int fd, char *name, void *value, size_t size); |
| #define smack_smackfs_path(...) (-1) |
| #define smack_new_label_from_self(...) (-1) |
| #define smack_new_label_from_path(...) (-1) |
| #define smack_new_label_from_file(...) (-1) |
| #define smack_set_label_for_self(...) (-1) |
| #define smack_set_label_for_path(...) (-1) |
| #define smack_set_label_for_file(...) (-1) |
| #endif |
| |
| // This turns into "return 0" when no LSM and lets code optimize out. |
| static inline int lsm_enabled(void) |
| { |
| if (CFG_TOYBOX_SMACK) return !!smack_smackfs_path(); |
| else return is_selinux_enabled() == 1; |
| } |
| |
| static inline char *lsm_name(void) |
| { |
| if (CFG_TOYBOX_SMACK) return "Smack"; |
| if (CFG_TOYBOX_SELINUX) return "SELinux"; |
| |
| return "LSM"; |
| } |
| |
| // Fetch this process's lsm context |
| static inline char *lsm_context(void) |
| { |
| int ok = 0; |
| char *result; |
| |
| if (CFG_TOYBOX_SMACK) ok = smack_new_label_from_self(&result) > 0; |
| else ok = getcon(&result) == 0; |
| |
| return ok ? result : strdup("?"); |
| } |
| |
| // Set default label to apply to newly created stuff (NULL to clear it) |
| static inline int lsm_set_create(char *context) |
| { |
| if (CFG_TOYBOX_SMACK) return smack_set_label_for_self(context); |
| else return setfscreatecon(context); |
| } |
| |
| // Label a file, following symlinks |
| static inline int lsm_set_context(char *filename, char *context) |
| { |
| if (CFG_TOYBOX_SMACK) |
| return smack_set_label_for_path(filename, XATTR_NAME_SMACK, 1, context); |
| else return setfilecon(filename, context); |
| } |
| |
| // Label a file, don't follow symlinks |
| static inline int lsm_lset_context(char *filename, char *context) |
| { |
| if (CFG_TOYBOX_SMACK) |
| return smack_set_label_for_path(filename, XATTR_NAME_SMACK, 0, context); |
| else return lsetfilecon(filename, context); |
| } |
| |
| // Label a file by filehandle |
| static inline int lsm_fset_context(int file, char *context) |
| { |
| if (CFG_TOYBOX_SMACK) |
| return smack_set_label_for_file(file, XATTR_NAME_SMACK, context); |
| else return fsetfilecon(file, context); |
| } |
| |
| // returns -1 in case of error or else the length of the context */ |
| // context can be NULL to get the length only */ |
| static inline int lsm_get_context(char *filename, char **context) |
| { |
| if (CFG_TOYBOX_SMACK) |
| return smack_new_label_from_path(filename, XATTR_NAME_SMACK, 1, context); |
| else return getfilecon(filename, context); |
| } |
| |
| static inline int lsm_lget_context(char *filename, char **context) |
| { |
| if (CFG_TOYBOX_SMACK) |
| return smack_new_label_from_path(filename, XATTR_NAME_SMACK, 0, context); |
| else return lgetfilecon(filename, context); |
| } |
| |
| static inline int lsm_fget_context(int file, char **context) |
| { |
| if (CFG_TOYBOX_SMACK) |
| return smack_new_label_from_file(file, XATTR_NAME_SMACK, context); |
| return fgetfilecon(file, context); |
| } |