Change-Id: I82f39aae8264707bdc8eae9e32cfbf650545a0fa --- auditd/auditd.c | 8 ++++++++ auditd/libaudit.c | 25 +++++++++++++++++++++++++ auditd/libaudit.h | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+)
diff --git a/auditd/auditd.c b/auditd/auditd.c index 6a4ecae..beaff51 100644 --- a/auditd/auditd.c +++ b/auditd/auditd.c @@ -19,6 +19,7 @@ #define LOG_TAG "auditd" #include <stdio.h> +#include <stdbool.h> #include <stdlib.h> #include <errno.h> @@ -188,6 +189,13 @@ int main(int argc, char *argv[]) goto err; } + if (audit_set_cmdline_output(audit_fd, false, WAIT_NO) < 0) { + rc = errno; + SLOGE("Failed on audit_set_cmdline_feature with error: %s", strerror(errno)); + goto err; + } + + pfds.fd = audit_fd; pfds.events = POLLIN; diff --git a/auditd/libaudit.c b/auditd/libaudit.c index 06e5557..2771d92 100644 --- a/auditd/libaudit.c +++ b/auditd/libaudit.c @@ -220,6 +220,31 @@ out: return rc; } +int audit_set_cmdline_output(int fd, bool val, rep_wait_t wmode) +{ + int rc; + struct audit_reply rep; + struct audit_features features; + + memset(&features, 0, sizeof(features)); + + features.vers = 1; + features.mask = AUDIT_FEATURE_TO_MASK(AUDIT_FEATURE_CMDLINE_OUTPUT); + features.features |= (val == true) << AUDIT_FEATURE_CMDLINE_OUTPUT; + + rc = audit_send(fd, AUDIT_SET_FEATURE, &features, sizeof(features)); + if (rc < 0) { + SLOGE("Could net set cmdline output for audit events, error: %s", strerror(-rc)); + return rc; + } + + if (wmode != WAIT_NO) { + audit_get_reply(fd, &rep, GET_REPLY_NONBLOCKING, 0); + } + + return 0; +} + int audit_set_pid(int fd, uint32_t pid, rep_wait_t wmode) { int rc; diff --git a/auditd/libaudit.h b/auditd/libaudit.h index fbaa7b9..7fc8138 100644 --- a/auditd/libaudit.h +++ b/auditd/libaudit.h @@ -22,11 +22,30 @@ #include <stdint.h> #include <sys/socket.h> #include <sys/types.h> +#include <stdbool.h> #include <linux/netlink.h> #include <linux/audit.h> #define MAX_AUDIT_MESSAGE_LENGTH 8970 +#define AUDIT_SET_FEATURE 1018 +#define AUDIT_GET_FEATURE 1019 +#define AUDIT_FEATURE_CHANGE 1020 + +struct audit_features { +#define AUDIT_FEATURE_VERSION 1 + __u32 vers; + __u32 mask; + __u32 features; + __u32 lock; +}; + +#define AUDIT_FEATURE_CMDLINE_OUTPUT 0 +#define AUDIT_LAST_FEATURE AUDIT_FEATURE_CMDLINE_OUTPUT + +#define audit_feature_valid(x) ((x) >= 0 && (x) <= AUDIT_LAST_FEATURE) +#define AUDIT_FEATURE_TO_MASK(x) (1 << ((x) & 31)) + typedef enum { GET_REPLY_BLOCKING=0, GET_REPLY_NONBLOCKING @@ -108,4 +127,18 @@ extern int audit_get_reply(int fd, struct audit_reply *rep, reply_t block, */ extern int audit_set_pid(int fd, uint32_t pid, rep_wait_t wmode); +/** + * Turns on (true) or off (false) the cmdline autput of the audit records. + * @param fd + * The fd returned by a call to audit_open() + * @param val + * True for on, flase for off. + * @param wmode + * Whether or not to block on the underlying socket io calls. + * @return + * This function returns 0 on success, -errno on error. + */ +extern int audit_set_cmdline_output(int fd, bool val, rep_wait_t wmode); + + #endif -- 1.7.9.5 -- This message was distributed to subscribers of the seandroid-list mailing list. If you no longer wish to subscribe, send mail to majord...@tycho.nsa.gov with the words "unsubscribe seandroid-list" without quotes as the message.