diff options
| author | Mark Salyzyn <salyzyn@google.com> | 2014-04-07 18:07:36 +0000 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2014-04-07 18:07:36 +0000 |
| commit | 78886a6dfcd574a5afe41bb578e26dc97a759803 (patch) | |
| tree | a0962b2aaf6eff7fd72d9593c5eb3960bf8fb0fa | |
| parent | 7ddea01bbf5470fce61f0d1865cc8c26fdf59dd5 (diff) | |
| parent | ce2a0ecf29fadbd63ea2397b2d87a02b27a2d20f (diff) | |
| download | system_core-78886a6dfcd574a5afe41bb578e26dc97a759803.zip system_core-78886a6dfcd574a5afe41bb578e26dc97a759803.tar.gz system_core-78886a6dfcd574a5afe41bb578e26dc97a759803.tar.bz2 | |
am ce2a0ecf: am ffd72150: am 3e73a99f: Merge "logd: auditd: add logd.auditd.dmesg property"
* commit 'ce2a0ecf29fadbd63ea2397b2d87a02b27a2d20f':
logd: auditd: add logd.auditd.dmesg property
| -rw-r--r-- | logd/LogAudit.cpp | 22 | ||||
| -rw-r--r-- | logd/LogAudit.h | 5 | ||||
| -rw-r--r-- | logd/main.cpp | 10 |
3 files changed, 30 insertions, 7 deletions
diff --git a/logd/LogAudit.cpp b/logd/LogAudit.cpp index cc3e583..ea6eece 100644 --- a/logd/LogAudit.cpp +++ b/logd/LogAudit.cpp @@ -19,15 +19,18 @@ #include <stdarg.h> #include <stdlib.h> #include <sys/klog.h> +#include <sys/uio.h> #include "libaudit.h" #include "LogAudit.h" -LogAudit::LogAudit(LogBuffer *buf, LogReader *reader) +LogAudit::LogAudit(LogBuffer *buf, LogReader *reader, int fdDmsg) : SocketListener(getLogSocket(), false) , logbuf(buf) - , reader(reader) { - logDmsg(); + , reader(reader) + , fdDmesg(-1) { + logDmesg(); + fdDmesg = fdDmsg; } bool LogAudit::onDataAvailable(SocketClient *cli) { @@ -62,6 +65,17 @@ int LogAudit::logPrint(const char *fmt, ...) { return rc; } + if (fdDmesg >= 0) { + struct iovec iov[2]; + + iov[0].iov_base = str; + iov[0].iov_len = strlen(str); + iov[1].iov_base = const_cast<char *>("\n"); + iov[1].iov_len = 1; + + writev(fdDmesg, iov, sizeof(iov) / sizeof(iov[0])); + } + pid_t pid = getpid(); pid_t tid = gettid(); uid_t uid = getuid(); @@ -141,7 +155,7 @@ int LogAudit::logPrint(const char *fmt, ...) { return rc; } -void LogAudit::logDmsg() { +void LogAudit::logDmesg() { int len = klogctl(KLOG_SIZE_BUFFER, NULL, 0); if (len <= 0) { return; diff --git a/logd/LogAudit.h b/logd/LogAudit.h index 3e57eed..111030a 100644 --- a/logd/LogAudit.h +++ b/logd/LogAudit.h @@ -23,16 +23,17 @@ class LogAudit : public SocketListener { LogBuffer *logbuf; LogReader *reader; + int fdDmesg; public: - LogAudit(LogBuffer *buf, LogReader *reader); + LogAudit(LogBuffer *buf, LogReader *reader, int fdDmesg); protected: virtual bool onDataAvailable(SocketClient *cli); private: static int getLogSocket(); - void logDmsg(); + void logDmesg(); int logPrint(const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); }; diff --git a/logd/main.cpp b/logd/main.cpp index 83ec6c0..7346e2f 100644 --- a/logd/main.cpp +++ b/logd/main.cpp @@ -84,6 +84,13 @@ static int drop_privs() { // space logger. Additional transitory per-client threads are created // for each reader once they register. int main() { + int fdDmesg = -1; + char dmesg[PROPERTY_VALUE_MAX]; + property_get("logd.auditd.dmesg", dmesg, "1"); + if (atol(dmesg)) { + fdDmesg = open("/dev/kmsg", O_WRONLY); + } + if (drop_privs() != 0) { return -1; } @@ -136,9 +143,10 @@ int main() { // and LogReader is notified to send updates to connected clients. // failure is an option ... messages are in dmesg (required by standard) - LogAudit *al = new LogAudit(logBuf, reader); + LogAudit *al = new LogAudit(logBuf, reader, fdDmesg); if (al->startListener()) { delete al; + close(fdDmesg); } pause(); |
