diff options
author | Mark Salyzyn <salyzyn@google.com> | 2014-04-17 23:22:37 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-04-17 23:22:37 +0000 |
commit | 4f7e54f32d256e285c400a0f8cfa56bff9d5a8fa (patch) | |
tree | 6c1a2c608c2cda581c00b10f09e99e13cc0867a6 | |
parent | 2898a4ad5ede1fa3d42b4b2bd54a4b91b61bcc2b (diff) | |
parent | fe545b9cb7188036d5fe8c433c7c87dd1b364c2b (diff) | |
download | system_core-4f7e54f32d256e285c400a0f8cfa56bff9d5a8fa.zip system_core-4f7e54f32d256e285c400a0f8cfa56bff9d5a8fa.tar.gz system_core-4f7e54f32d256e285c400a0f8cfa56bff9d5a8fa.tar.bz2 |
am fe545b9c: am 0516aded: Merge "logd: libsysutils: logd startup outside init environment"
* commit 'fe545b9cb7188036d5fe8c433c7c87dd1b364c2b':
logd: libsysutils: logd startup outside init environment
-rw-r--r-- | include/sysutils/FrameworkListener.h | 1 | ||||
-rw-r--r-- | libsysutils/src/FrameworkListener.cpp | 5 | ||||
-rw-r--r-- | logd/CommandListener.cpp | 16 | ||||
-rw-r--r-- | logd/CommandListener.h | 2 | ||||
-rw-r--r-- | logd/LogListener.cpp | 10 | ||||
-rw-r--r-- | logd/LogReader.cpp | 16 | ||||
-rw-r--r-- | logd/LogReader.h | 2 | ||||
-rw-r--r-- | logd/main.cpp | 29 |
8 files changed, 78 insertions, 3 deletions
diff --git a/include/sysutils/FrameworkListener.h b/include/sysutils/FrameworkListener.h index f1a4b43..18049cd 100644 --- a/include/sysutils/FrameworkListener.h +++ b/include/sysutils/FrameworkListener.h @@ -36,6 +36,7 @@ private: public: FrameworkListener(const char *socketName); FrameworkListener(const char *socketName, bool withSeq); + FrameworkListener(int sock); virtual ~FrameworkListener() {} protected: diff --git a/libsysutils/src/FrameworkListener.cpp b/libsysutils/src/FrameworkListener.cpp index a5ffda2..01ed54e 100644 --- a/libsysutils/src/FrameworkListener.cpp +++ b/libsysutils/src/FrameworkListener.cpp @@ -39,6 +39,11 @@ FrameworkListener::FrameworkListener(const char *socketName) : init(socketName, false); } +FrameworkListener::FrameworkListener(int sock) : + SocketListener(sock, true) { + init(NULL, false); +} + void FrameworkListener::init(const char *socketName UNUSED, bool withSeq) { mCommands = new FrameworkCommandCollection(); errorRate = 0; diff --git a/logd/CommandListener.cpp b/logd/CommandListener.cpp index 0bb233a..a7bf92b 100644 --- a/logd/CommandListener.cpp +++ b/logd/CommandListener.cpp @@ -24,6 +24,7 @@ #include <sys/socket.h> #include <sys/types.h> +#include <cutils/sockets.h> #include <private/android_filesystem_config.h> #include <sysutils/SocketClient.h> @@ -32,7 +33,7 @@ CommandListener::CommandListener(LogBuffer *buf, LogReader * /*reader*/, LogListener * /*swl*/) - : FrameworkListener("logd") + : FrameworkListener(getLogSocket()) , mBuf(*buf) { // registerCmd(new ShutdownCmd(buf, writer, swl)); registerCmd(new ClearCmd(buf)); @@ -283,3 +284,16 @@ int CommandListener::SetPruneListCmd::runCommand(SocketClient *cli, return 0; } + +int CommandListener::getLogSocket() { + static const char socketName[] = "logd"; + int sock = android_get_control_socket(socketName); + + if (sock < 0) { + sock = socket_local_server(socketName, + ANDROID_SOCKET_NAMESPACE_RESERVED, + SOCK_STREAM); + } + + return sock; +} diff --git a/logd/CommandListener.h b/logd/CommandListener.h index 1290519..cd1c306 100644 --- a/logd/CommandListener.h +++ b/logd/CommandListener.h @@ -31,6 +31,8 @@ public: virtual ~CommandListener() {} private: + static int getLogSocket(); + class ShutdownCmd : public LogCommand { LogBuffer &mBuf; LogReader &mReader; diff --git a/logd/LogListener.cpp b/logd/LogListener.cpp index b835b4f..ed5b391 100644 --- a/logd/LogListener.cpp +++ b/logd/LogListener.cpp @@ -107,7 +107,15 @@ bool LogListener::onDataAvailable(SocketClient *cli) { } int LogListener::getLogSocket() { - int sock = android_get_control_socket("logdw"); + static const char socketName[] = "logdw"; + int sock = android_get_control_socket(socketName); + + if (sock < 0) { + sock = socket_local_server(socketName, + ANDROID_SOCKET_NAMESPACE_RESERVED, + SOCK_DGRAM); + } + int on = 1; if (setsockopt(sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)) < 0) { return -1; diff --git a/logd/LogReader.cpp b/logd/LogReader.cpp index 60a3507..51aa2ad 100644 --- a/logd/LogReader.cpp +++ b/logd/LogReader.cpp @@ -17,13 +17,14 @@ #include <ctype.h> #include <poll.h> #include <sys/socket.h> + #include <cutils/sockets.h> #include "LogReader.h" #include "FlushCommand.h" LogReader::LogReader(LogBuffer *logbuf) - : SocketListener("logdr", true) + : SocketListener(getLogSocket(), true) , mLogbuf(*logbuf) { } @@ -167,3 +168,16 @@ void LogReader::doSocketDelete(SocketClient *cli) { } LogTimeEntry::unlock(); } + +int LogReader::getLogSocket() { + static const char socketName[] = "logdr"; + int sock = android_get_control_socket(socketName); + + if (sock < 0) { + sock = socket_local_server(socketName, + ANDROID_SOCKET_NAMESPACE_RESERVED, + SOCK_SEQPACKET); + } + + return sock; +} diff --git a/logd/LogReader.h b/logd/LogReader.h index b267c75..91559a3 100644 --- a/logd/LogReader.h +++ b/logd/LogReader.h @@ -34,6 +34,8 @@ protected: virtual bool onDataAvailable(SocketClient *cli); private: + static int getLogSocket(); + void doSocketDelete(SocketClient *cli); }; diff --git a/logd/main.cpp b/logd/main.cpp index 7346e2f..04eef4a 100644 --- a/logd/main.cpp +++ b/logd/main.cpp @@ -36,6 +36,35 @@ #include "LogListener.h" #include "LogAudit.h" +// +// The service is designed to be run by init, it does not respond well +// to starting up manually. When starting up manually the sockets will +// fail to open typically for one of the following reasons: +// EADDRINUSE if logger is running. +// EACCESS if started without precautions (below) +// +// Here is a cookbook procedure for starting up logd manually assuming +// init is out of the way, pedantically all permissions and selinux +// security is put back in place: +// +// setenforce 0 +// rm /dev/socket/logd* +// chmod 777 /dev/socket +// # here is where you would attach the debugger or valgrind for example +// runcon u:r:logd:s0 /system/bin/logd </dev/null >/dev/null 2>&1 & +// sleep 1 +// chmod 755 /dev/socket +// chown logd.logd /dev/socket/logd* +// restorecon /dev/socket/logd* +// setenforce 1 +// +// If minimalism prevails, typical for debugging and security is not a concern: +// +// setenforce 0 +// chmod 777 /dev/socket +// logd +// + static int drop_privs() { struct sched_param param; memset(¶m, 0, sizeof(param)); |