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