diff --git a/include/sysutils/FrameworkListener.h b/include/sysutils/FrameworkListener.h index f1a4b43f8..18049cd41 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 a5ffda230..01ed54e31 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 0bb233ac7..a7bf92bb1 100644 --- a/logd/CommandListener.cpp +++ b/logd/CommandListener.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -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 12905199f..cd1c306ba 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 b835b4f07..ed5b39156 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 60a350780..51aa2ad2b 100644 --- a/logd/LogReader.cpp +++ b/logd/LogReader.cpp @@ -17,13 +17,14 @@ #include #include #include + #include #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 b267c75d2..91559a335 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 7346e2fa9..04eef4a3f 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 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));