10175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn/* 21114f1806521b2a6447b7c68934e4f3c29b60cb5Mark Salyzyn * Copyright (C) 2012-2014 The Android Open Source Project 30175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * 40175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 50175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * you may not use this file except in compliance with the License. 60175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * You may obtain a copy of the License at 70175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * 80175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 90175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * 100175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Unless required by applicable law or agreed to in writing, software 110175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 120175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * See the License for the specific language governing permissions and 140175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * limitations under the License. 150175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn */ 160175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 170175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <arpa/inet.h> 1861e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn#include <ctype.h> 190175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <dirent.h> 200175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <errno.h> 210175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <fcntl.h> 220175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <netinet/in.h> 230175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <stdlib.h> 24501c373916e292764400dbae735f44b33378400fMark Salyzyn#include <string.h> 258daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn#include <sys/prctl.h> 260175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <sys/socket.h> 270175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <sys/types.h> 280175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 2973160acc5cb5236b30327569e6b51dbfe73e4a0fMark Salyzyn#include <string> 3073160acc5cb5236b30327569e6b51dbfe73e4a0fMark Salyzyn 314f71319df011d796a60a43fc1bc68e16fbf7d321Elliott Hughes#include <android-base/stringprintf.h> 32dfc47e86858ea67c72f1df2fdb97094b8e8248f2Mark Salyzyn#include <cutils/sockets.h> 330175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <private/android_filesystem_config.h> 341114f1806521b2a6447b7c68934e4f3c29b60cb5Mark Salyzyn#include <sysutils/SocketClient.h> 350175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 360175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include "CommandListener.h" 371114f1806521b2a6447b7c68934e4f3c29b60cb5Mark Salyzyn#include "LogCommand.h" 38083b037c0740ca00f72429e4457bfdd4b4d4dfa7Mark Salyzyn#include "LogUtils.h" 390175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 40501c373916e292764400dbae735f44b33378400fMark SalyzynCommandListener::CommandListener(LogBuffer* buf, LogReader* /*reader*/, 41501c373916e292764400dbae735f44b33378400fMark Salyzyn LogListener* /*swl*/) 42501c373916e292764400dbae735f44b33378400fMark Salyzyn : FrameworkListener(getLogSocket()) { 430175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn // registerCmd(new ShutdownCmd(buf, writer, swl)); 440175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn registerCmd(new ClearCmd(buf)); 450175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn registerCmd(new GetBufSizeCmd(buf)); 46dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn registerCmd(new SetBufSizeCmd(buf)); 470175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn registerCmd(new GetBufSizeUsedCmd(buf)); 4834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn registerCmd(new GetStatisticsCmd(buf)); 49dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn registerCmd(new SetPruneListCmd(buf)); 50dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn registerCmd(new GetPruneListCmd(buf)); 5161e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn registerCmd(new GetEventTagCmd(buf)); 5211e55cb9c1e5efe553e36f1b5c04ab21883f66e1Mark Salyzyn registerCmd(new ReinitCmd()); 53c8749d510819d0ea565640adfe38ace7669c7325Mark Salyzyn registerCmd(new ExitCmd(this)); 540175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn} 550175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 56501c373916e292764400dbae735f44b33378400fMark SalyzynCommandListener::ShutdownCmd::ShutdownCmd(LogReader* reader, LogListener* swl) 57501c373916e292764400dbae735f44b33378400fMark Salyzyn : LogCommand("shutdown"), mReader(*reader), mSwl(*swl) { 587718778793b106498b931dd708a466cf3a6f6a0fMark Salyzyn} 590175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 60501c373916e292764400dbae735f44b33378400fMark Salyzynint CommandListener::ShutdownCmd::runCommand(SocketClient* /*cli*/, 61501c373916e292764400dbae735f44b33378400fMark Salyzyn int /*argc*/, char** /*argv*/) { 620175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn mSwl.stopListener(); 630175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn mReader.stopListener(); 640175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn exit(0); 650175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn} 660175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 67501c373916e292764400dbae735f44b33378400fMark SalyzynCommandListener::ClearCmd::ClearCmd(LogBuffer* buf) 68501c373916e292764400dbae735f44b33378400fMark Salyzyn : LogCommand("clear"), mBuf(*buf) { 697718778793b106498b931dd708a466cf3a6f6a0fMark Salyzyn} 700175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 718daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzynstatic void setname() { 72e3aeeeeccc260c29ca5907a444f8d746bcc2f8a5Mark Salyzyn static bool name_set; 73e3aeeeeccc260c29ca5907a444f8d746bcc2f8a5Mark Salyzyn if (!name_set) { 74e3aeeeeccc260c29ca5907a444f8d746bcc2f8a5Mark Salyzyn prctl(PR_SET_NAME, "logd.control"); 75e3aeeeeccc260c29ca5907a444f8d746bcc2f8a5Mark Salyzyn name_set = true; 76e3aeeeeccc260c29ca5907a444f8d746bcc2f8a5Mark Salyzyn } 778daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn} 788daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn 79501c373916e292764400dbae735f44b33378400fMark Salyzynint CommandListener::ClearCmd::runCommand(SocketClient* cli, int argc, 80501c373916e292764400dbae735f44b33378400fMark Salyzyn char** argv) { 818daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn setname(); 821a240b47903c0dc3d7f23b609b6520f17f11b953Mark Salyzyn uid_t uid = cli->getUid(); 831a240b47903c0dc3d7f23b609b6520f17f11b953Mark Salyzyn if (clientHasLogCredentials(cli)) { 841a240b47903c0dc3d7f23b609b6520f17f11b953Mark Salyzyn uid = AID_ROOT; 850175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 860175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 870175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn if (argc < 2) { 880175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn cli->sendMsg("Missing Argument"); 890175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return 0; 900175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 910175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 920175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn int id = atoi(argv[1]); 931114f1806521b2a6447b7c68934e4f3c29b60cb5Mark Salyzyn if ((id < LOG_ID_MIN) || (LOG_ID_MAX <= id)) { 940175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn cli->sendMsg("Range Error"); 950175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return 0; 960175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 970175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 98501c373916e292764400dbae735f44b33378400fMark Salyzyn cli->sendMsg(mBuf.clear((log_id_t)id, uid) ? "busy" : "success"); 990175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return 0; 1000175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn} 1010175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 102501c373916e292764400dbae735f44b33378400fMark SalyzynCommandListener::GetBufSizeCmd::GetBufSizeCmd(LogBuffer* buf) 103501c373916e292764400dbae735f44b33378400fMark Salyzyn : LogCommand("getLogSize"), mBuf(*buf) { 1047718778793b106498b931dd708a466cf3a6f6a0fMark Salyzyn} 1050175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 106501c373916e292764400dbae735f44b33378400fMark Salyzynint CommandListener::GetBufSizeCmd::runCommand(SocketClient* cli, int argc, 107501c373916e292764400dbae735f44b33378400fMark Salyzyn char** argv) { 1088daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn setname(); 1090175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn if (argc < 2) { 1100175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn cli->sendMsg("Missing Argument"); 1110175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return 0; 1120175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 1130175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 1140175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn int id = atoi(argv[1]); 1151114f1806521b2a6447b7c68934e4f3c29b60cb5Mark Salyzyn if ((id < LOG_ID_MIN) || (LOG_ID_MAX <= id)) { 1160175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn cli->sendMsg("Range Error"); 1170175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return 0; 1180175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 1190175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 120501c373916e292764400dbae735f44b33378400fMark Salyzyn unsigned long size = mBuf.getSize((log_id_t)id); 1210175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn char buf[512]; 1220175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn snprintf(buf, sizeof(buf), "%lu", size); 1230175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn cli->sendMsg(buf); 1240175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return 0; 1250175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn} 1260175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 127501c373916e292764400dbae735f44b33378400fMark SalyzynCommandListener::SetBufSizeCmd::SetBufSizeCmd(LogBuffer* buf) 128501c373916e292764400dbae735f44b33378400fMark Salyzyn : LogCommand("setLogSize"), mBuf(*buf) { 1297718778793b106498b931dd708a466cf3a6f6a0fMark Salyzyn} 130dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 131501c373916e292764400dbae735f44b33378400fMark Salyzynint CommandListener::SetBufSizeCmd::runCommand(SocketClient* cli, int argc, 132501c373916e292764400dbae735f44b33378400fMark Salyzyn char** argv) { 1338daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn setname(); 134dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn if (!clientHasLogCredentials(cli)) { 135dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn cli->sendMsg("Permission Denied"); 136dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn return 0; 137dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn } 138dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 139dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn if (argc < 3) { 140dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn cli->sendMsg("Missing Argument"); 141dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn return 0; 142dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn } 143dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 144dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn int id = atoi(argv[1]); 145dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn if ((id < LOG_ID_MIN) || (LOG_ID_MAX <= id)) { 146dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn cli->sendMsg("Range Error"); 147dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn return 0; 148dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn } 149dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 150dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn unsigned long size = atol(argv[2]); 151501c373916e292764400dbae735f44b33378400fMark Salyzyn if (mBuf.setSize((log_id_t)id, size)) { 152dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn cli->sendMsg("Range Error"); 153dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn return 0; 154dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn } 155dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 156dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn cli->sendMsg("success"); 157dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn return 0; 158dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn} 159dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 160501c373916e292764400dbae735f44b33378400fMark SalyzynCommandListener::GetBufSizeUsedCmd::GetBufSizeUsedCmd(LogBuffer* buf) 161501c373916e292764400dbae735f44b33378400fMark Salyzyn : LogCommand("getLogSizeUsed"), mBuf(*buf) { 1627718778793b106498b931dd708a466cf3a6f6a0fMark Salyzyn} 1630175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 164501c373916e292764400dbae735f44b33378400fMark Salyzynint CommandListener::GetBufSizeUsedCmd::runCommand(SocketClient* cli, int argc, 165501c373916e292764400dbae735f44b33378400fMark Salyzyn char** argv) { 1668daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn setname(); 1670175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn if (argc < 2) { 1680175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn cli->sendMsg("Missing Argument"); 1690175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return 0; 1700175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 1710175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 1720175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn int id = atoi(argv[1]); 1731114f1806521b2a6447b7c68934e4f3c29b60cb5Mark Salyzyn if ((id < LOG_ID_MIN) || (LOG_ID_MAX <= id)) { 1740175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn cli->sendMsg("Range Error"); 1750175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return 0; 1760175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 1770175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 178501c373916e292764400dbae735f44b33378400fMark Salyzyn unsigned long size = mBuf.getSizeUsed((log_id_t)id); 1790175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn char buf[512]; 1800175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn snprintf(buf, sizeof(buf), "%lu", size); 1810175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn cli->sendMsg(buf); 1820175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return 0; 1830175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn} 18434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 185501c373916e292764400dbae735f44b33378400fMark SalyzynCommandListener::GetStatisticsCmd::GetStatisticsCmd(LogBuffer* buf) 186501c373916e292764400dbae735f44b33378400fMark Salyzyn : LogCommand("getStatistics"), mBuf(*buf) { 1877718778793b106498b931dd708a466cf3a6f6a0fMark Salyzyn} 18834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 189501c373916e292764400dbae735f44b33378400fMark Salyzynstatic std::string package_string(const std::string& str) { 190dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn // Calculate total buffer size prefix, count is the string length w/o nul 191dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn char fmt[32]; 192501c373916e292764400dbae735f44b33378400fMark Salyzyn for (size_t l = str.length(), y = 0, x = 6; y != x; 193501c373916e292764400dbae735f44b33378400fMark Salyzyn y = x, x = strlen(fmt) - 2) { 194dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn snprintf(fmt, sizeof(fmt), "%zu\n%%s\n\f", l + x); 195dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn } 19673160acc5cb5236b30327569e6b51dbfe73e4a0fMark Salyzyn return android::base::StringPrintf(fmt, str.c_str()); 197dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn} 198dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 199501c373916e292764400dbae735f44b33378400fMark Salyzynint CommandListener::GetStatisticsCmd::runCommand(SocketClient* cli, int argc, 200501c373916e292764400dbae735f44b33378400fMark Salyzyn char** argv) { 2018daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn setname(); 20234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn uid_t uid = cli->getUid(); 20334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (clientHasLogCredentials(cli)) { 20434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn uid = AID_ROOT; 20534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 20634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 20734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn unsigned int logMask = -1; 208ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn pid_t pid = 0; 20934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (argc > 1) { 21034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn logMask = 0; 21134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (int i = 1; i < argc; ++i) { 212ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn static const char _pid[] = "pid="; 213ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn if (!strncmp(argv[i], _pid, sizeof(_pid) - 1)) { 214ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn pid = atol(argv[i] + sizeof(_pid) - 1); 215ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn if (pid == 0) { 216ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn cli->sendMsg("PID Error"); 217ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn return 0; 218ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn } 219ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn continue; 220ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn } 221ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn 22234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn int id = atoi(argv[i]); 22334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if ((id < LOG_ID_MIN) || (LOG_ID_MAX <= id)) { 22434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn cli->sendMsg("Range Error"); 22534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return 0; 22634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 22734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn logMask |= 1 << id; 22834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 22934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 23034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 231501c373916e292764400dbae735f44b33378400fMark Salyzyn cli->sendMsg( 232501c373916e292764400dbae735f44b33378400fMark Salyzyn package_string(mBuf.formatStatistics(uid, pid, logMask)).c_str()); 23334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return 0; 23434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 235dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 236501c373916e292764400dbae735f44b33378400fMark SalyzynCommandListener::GetPruneListCmd::GetPruneListCmd(LogBuffer* buf) 237501c373916e292764400dbae735f44b33378400fMark Salyzyn : LogCommand("getPruneList"), mBuf(*buf) { 2387718778793b106498b931dd708a466cf3a6f6a0fMark Salyzyn} 239dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 240501c373916e292764400dbae735f44b33378400fMark Salyzynint CommandListener::GetPruneListCmd::runCommand(SocketClient* cli, 241501c373916e292764400dbae735f44b33378400fMark Salyzyn int /*argc*/, char** /*argv*/) { 2428daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn setname(); 24373160acc5cb5236b30327569e6b51dbfe73e4a0fMark Salyzyn cli->sendMsg(package_string(mBuf.formatPrune()).c_str()); 244dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn return 0; 245dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn} 246dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 247501c373916e292764400dbae735f44b33378400fMark SalyzynCommandListener::SetPruneListCmd::SetPruneListCmd(LogBuffer* buf) 248501c373916e292764400dbae735f44b33378400fMark Salyzyn : LogCommand("setPruneList"), mBuf(*buf) { 2497718778793b106498b931dd708a466cf3a6f6a0fMark Salyzyn} 250dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 251501c373916e292764400dbae735f44b33378400fMark Salyzynint CommandListener::SetPruneListCmd::runCommand(SocketClient* cli, int argc, 252501c373916e292764400dbae735f44b33378400fMark Salyzyn char** argv) { 2538daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn setname(); 254dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn if (!clientHasLogCredentials(cli)) { 255dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn cli->sendMsg("Permission Denied"); 256dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn return 0; 257dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn } 258dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 25973160acc5cb5236b30327569e6b51dbfe73e4a0fMark Salyzyn std::string str; 260dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn for (int i = 1; i < argc; ++i) { 26173160acc5cb5236b30327569e6b51dbfe73e4a0fMark Salyzyn if (str.length()) { 26273160acc5cb5236b30327569e6b51dbfe73e4a0fMark Salyzyn str += " "; 263dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn } 26473160acc5cb5236b30327569e6b51dbfe73e4a0fMark Salyzyn str += argv[i]; 265dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn } 266dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 26773160acc5cb5236b30327569e6b51dbfe73e4a0fMark Salyzyn int ret = mBuf.initPrune(str.c_str()); 268dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 269dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn if (ret) { 270dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn cli->sendMsg("Invalid"); 271dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn return 0; 272dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn } 273dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 274dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn cli->sendMsg("success"); 275dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn 276dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn return 0; 277dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn} 278dfc47e86858ea67c72f1df2fdb97094b8e8248f2Mark Salyzyn 279501c373916e292764400dbae735f44b33378400fMark SalyzynCommandListener::GetEventTagCmd::GetEventTagCmd(LogBuffer* buf) 280501c373916e292764400dbae735f44b33378400fMark Salyzyn : LogCommand("getEventTag"), mBuf(*buf) { 28161e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn} 28261e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn 283501c373916e292764400dbae735f44b33378400fMark Salyzynint CommandListener::GetEventTagCmd::runCommand(SocketClient* cli, int argc, 284501c373916e292764400dbae735f44b33378400fMark Salyzyn char** argv) { 28561e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn setname(); 28661e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn uid_t uid = cli->getUid(); 28761e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn if (clientHasLogCredentials(cli)) { 28861e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn uid = AID_ROOT; 28961e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn } 29061e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn 291501c373916e292764400dbae735f44b33378400fMark Salyzyn const char* name = NULL; 292501c373916e292764400dbae735f44b33378400fMark Salyzyn const char* format = NULL; 293501c373916e292764400dbae735f44b33378400fMark Salyzyn const char* id = NULL; 29461e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn for (int i = 1; i < argc; ++i) { 29561e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn static const char _name[] = "name="; 29661e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn if (!strncmp(argv[i], _name, strlen(_name))) { 29761e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn name = argv[i] + strlen(_name); 29861e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn continue; 29961e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn } 30061e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn 30161e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn static const char _format[] = "format="; 30261e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn if (!strncmp(argv[i], _format, strlen(_format))) { 30361e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn format = argv[i] + strlen(_format); 30461e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn continue; 30561e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn } 306407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn 307407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn static const char _id[] = "id="; 308407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn if (!strncmp(argv[i], _id, strlen(_id))) { 309407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn id = argv[i] + strlen(_id); 310407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn continue; 311407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn } 312407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn } 313407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn 314407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn if (id) { 315407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn if (format || name) { 316407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn cli->sendMsg("can not mix id= with either format= or name="); 317407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn return 0; 318407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn } 319407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn cli->sendMsg(package_string(mBuf.formatEntry(atoi(id), uid)).c_str()); 320407537f798c443a2252fd3bbbd1535f7d6fabc53Mark Salyzyn return 0; 32161e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn } 32261e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn 323501c373916e292764400dbae735f44b33378400fMark Salyzyn cli->sendMsg( 324501c373916e292764400dbae735f44b33378400fMark Salyzyn package_string(mBuf.formatGetEventTag(uid, name, format)).c_str()); 32561e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn 32661e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn return 0; 32761e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn} 32861e9ce6709a12cf39a9471476da3d50339efe466Mark Salyzyn 3297718778793b106498b931dd708a466cf3a6f6a0fMark SalyzynCommandListener::ReinitCmd::ReinitCmd() : LogCommand("reinit") { 3307718778793b106498b931dd708a466cf3a6f6a0fMark Salyzyn} 33111e55cb9c1e5efe553e36f1b5c04ab21883f66e1Mark Salyzyn 332501c373916e292764400dbae735f44b33378400fMark Salyzynint CommandListener::ReinitCmd::runCommand(SocketClient* cli, int /*argc*/, 333501c373916e292764400dbae735f44b33378400fMark Salyzyn char** /*argv*/) { 33411e55cb9c1e5efe553e36f1b5c04ab21883f66e1Mark Salyzyn setname(); 33511e55cb9c1e5efe553e36f1b5c04ab21883f66e1Mark Salyzyn 33611e55cb9c1e5efe553e36f1b5c04ab21883f66e1Mark Salyzyn reinit_signal_handler(SIGHUP); 33711e55cb9c1e5efe553e36f1b5c04ab21883f66e1Mark Salyzyn 33811e55cb9c1e5efe553e36f1b5c04ab21883f66e1Mark Salyzyn cli->sendMsg("success"); 33911e55cb9c1e5efe553e36f1b5c04ab21883f66e1Mark Salyzyn 34011e55cb9c1e5efe553e36f1b5c04ab21883f66e1Mark Salyzyn return 0; 34111e55cb9c1e5efe553e36f1b5c04ab21883f66e1Mark Salyzyn} 34211e55cb9c1e5efe553e36f1b5c04ab21883f66e1Mark Salyzyn 343501c373916e292764400dbae735f44b33378400fMark SalyzynCommandListener::ExitCmd::ExitCmd(CommandListener* parent) 344501c373916e292764400dbae735f44b33378400fMark Salyzyn : LogCommand("EXIT"), mParent(*parent) { 345c8749d510819d0ea565640adfe38ace7669c7325Mark Salyzyn} 346c8749d510819d0ea565640adfe38ace7669c7325Mark Salyzyn 347501c373916e292764400dbae735f44b33378400fMark Salyzynint CommandListener::ExitCmd::runCommand(SocketClient* cli, int /*argc*/, 348501c373916e292764400dbae735f44b33378400fMark Salyzyn char** /*argv*/) { 349c8749d510819d0ea565640adfe38ace7669c7325Mark Salyzyn setname(); 350c8749d510819d0ea565640adfe38ace7669c7325Mark Salyzyn 351c8749d510819d0ea565640adfe38ace7669c7325Mark Salyzyn cli->sendMsg("success"); 352c8749d510819d0ea565640adfe38ace7669c7325Mark Salyzyn release(cli); 353c8749d510819d0ea565640adfe38ace7669c7325Mark Salyzyn 354c8749d510819d0ea565640adfe38ace7669c7325Mark Salyzyn return 0; 355c8749d510819d0ea565640adfe38ace7669c7325Mark Salyzyn} 356c8749d510819d0ea565640adfe38ace7669c7325Mark Salyzyn 357dfc47e86858ea67c72f1df2fdb97094b8e8248f2Mark Salyzynint CommandListener::getLogSocket() { 358dfc47e86858ea67c72f1df2fdb97094b8e8248f2Mark Salyzyn static const char socketName[] = "logd"; 359dfc47e86858ea67c72f1df2fdb97094b8e8248f2Mark Salyzyn int sock = android_get_control_socket(socketName); 360dfc47e86858ea67c72f1df2fdb97094b8e8248f2Mark Salyzyn 361dfc47e86858ea67c72f1df2fdb97094b8e8248f2Mark Salyzyn if (sock < 0) { 362501c373916e292764400dbae735f44b33378400fMark Salyzyn sock = socket_local_server( 363501c373916e292764400dbae735f44b33378400fMark Salyzyn socketName, ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM); 364dfc47e86858ea67c72f1df2fdb97094b8e8248f2Mark Salyzyn } 365dfc47e86858ea67c72f1df2fdb97094b8e8248f2Mark Salyzyn 366dfc47e86858ea67c72f1df2fdb97094b8e8248f2Mark Salyzyn return sock; 367dfc47e86858ea67c72f1df2fdb97094b8e8248f2Mark Salyzyn} 368