LogStatistics.cpp revision 7718778793b106498b931dd708a466cf3a6f6a0f
134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn/*
234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Copyright (C) 2014 The Android Open Source Project
334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *
434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * you may not use this file except in compliance with the License.
634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * You may obtain a copy of the License at
734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *
834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *
1034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Unless required by applicable law or agreed to in writing, software
1134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
1234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * See the License for the specific language governing permissions and
1434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * limitations under the License.
1534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn */
1634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
1797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn#include <algorithm> // std::max
189a03863e88da99ba010342c874252089dd771f7fMark Salyzyn#include <fcntl.h>
1997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn#include <stdio.h>
2097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn#include <string.h>
2197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn#include <unistd.h>
2234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
2334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <log/logger.h>
2434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <private/android_filesystem_config.h>
2534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <utils/String8.h>
2634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
2734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include "LogStatistics.h"
2834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
297718778793b106498b931dd708a466cf3a6f6a0fMark SalyzynLogStatistics::LogStatistics() : enable(false) {
3097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    log_id_for_each(id) {
3197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        mSizes[id] = 0;
3297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        mElements[id] = 0;
3397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        mSizesTotal[id] = 0;
3497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        mElementsTotal[id] = 0;
3534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
3634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
3734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
38720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzynnamespace android {
39720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
4097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn// caller must own and free character string
4181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzynchar *pidToName(pid_t pid) {
429a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    char *retval = NULL;
43ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn    if (pid == 0) { // special case from auditd/klogd for kernel
44ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn        retval = strdup("logd");
4597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    } else {
469a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        char buffer[512];
479a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        snprintf(buffer, sizeof(buffer), "/proc/%u/cmdline", pid);
489a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        int fd = open(buffer, O_RDONLY);
499a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        if (fd >= 0) {
509a03863e88da99ba010342c874252089dd771f7fMark Salyzyn            ssize_t ret = read(fd, buffer, sizeof(buffer));
519a03863e88da99ba010342c874252089dd771f7fMark Salyzyn            if (ret > 0) {
529a03863e88da99ba010342c874252089dd771f7fMark Salyzyn                buffer[sizeof(buffer)-1] = '\0';
539a03863e88da99ba010342c874252089dd771f7fMark Salyzyn                // frameworks intermediate state
549a03863e88da99ba010342c874252089dd771f7fMark Salyzyn                if (strcmp(buffer, "<pre-initialized>")) {
559a03863e88da99ba010342c874252089dd771f7fMark Salyzyn                    retval = strdup(buffer);
569a03863e88da99ba010342c874252089dd771f7fMark Salyzyn                }
579a03863e88da99ba010342c874252089dd771f7fMark Salyzyn            }
589a03863e88da99ba010342c874252089dd771f7fMark Salyzyn            close(fd);
599a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        }
609a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    }
619a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    return retval;
629a03863e88da99ba010342c874252089dd771f7fMark Salyzyn}
639a03863e88da99ba010342c874252089dd771f7fMark Salyzyn
64720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn}
65720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
6697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzynvoid LogStatistics::add(LogBufferElement *e) {
6797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    log_id_t log_id = e->getLogId();
6897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    unsigned short size = e->getMsgLen();
6997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    mSizes[log_id] += size;
7097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    ++mElements[log_id];
7134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
7297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    mSizesTotal[log_id] += size;
7397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    ++mElementsTotal[log_id];
74720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
75ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn    if (log_id == LOG_ID_KERNEL) {
76ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn        return;
77ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn    }
78ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn
79ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn    uidTable[log_id].add(e->getUid(), e);
80ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn
81720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    if (!enable) {
82720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        return;
83720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    }
84720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
8581b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    pidTable.add(e->getPid(), e);
86344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
87344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn    uint32_t tag = e->getTag();
88344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn    if (tag) {
89344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn        tagTable.add(tag, e);
90344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn    }
9134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
9234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
9397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzynvoid LogStatistics::subtract(LogBufferElement *e) {
9497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    log_id_t log_id = e->getLogId();
9597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    unsigned short size = e->getMsgLen();
9697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    mSizes[log_id] -= size;
9797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    --mElements[log_id];
9834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
99ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn    if (log_id == LOG_ID_KERNEL) {
100ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn        return;
101ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn    }
102ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn
10381b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    uidTable[log_id].subtract(e->getUid(), e);
10434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
105720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    if (!enable) {
106720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        return;
10734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
10834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
10981b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    pidTable.subtract(e->getPid(), e);
110344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
111344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn    uint32_t tag = e->getTag();
112344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn    if (tag) {
113344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn        tagTable.subtract(tag, e);
114344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn    }
115c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn}
116c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn
117ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn// Atomically set an entry to drop
118ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn// entry->setDropped(1) must follow this call, caller should do this explicitly.
119ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzynvoid LogStatistics::drop(LogBufferElement *e) {
120ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    log_id_t log_id = e->getLogId();
121ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    unsigned short size = e->getMsgLen();
122ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    mSizes[log_id] -= size;
123ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn
12481b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    uidTable[log_id].drop(e->getUid(), e);
125ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn
126ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    if (!enable) {
127ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn        return;
128ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    }
129ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn
13081b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    pidTable.drop(e->getPid(), e);
131ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn}
132ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn
13397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn// caller must own and free character string
13497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzynchar *LogStatistics::uidToName(uid_t uid) {
13597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    // Local hard coded favourites
13697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    if (uid == AID_LOGD) {
13797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        return strdup("auditd");
13834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
13934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
14097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    // Android hard coded
14197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    const struct android_id_info *info = android_ids;
14234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
14397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    for (size_t i = 0; i < android_id_count; ++i) {
14497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        if (info->aid == uid) {
14597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            return strdup(info->name);
14634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
14797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        ++info;
14834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
14934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
15008739ba71fc1f2659149be760405d622e5b68f06Mark Salyzyn    // Parse /data/system/packages.list
151023f51f360472f6bb9bad495e55cdb32b5411bc5Mark Salyzyn    uid_t userId = uid % AID_USER;
152023f51f360472f6bb9bad495e55cdb32b5411bc5Mark Salyzyn    char *name = android::uidToName(userId);
153023f51f360472f6bb9bad495e55cdb32b5411bc5Mark Salyzyn    if (!name && (userId > (AID_SHARED_GID_START - AID_APP))) {
154023f51f360472f6bb9bad495e55cdb32b5411bc5Mark Salyzyn        name = android::uidToName(userId - (AID_SHARED_GID_START - AID_APP));
155023f51f360472f6bb9bad495e55cdb32b5411bc5Mark Salyzyn    }
15608739ba71fc1f2659149be760405d622e5b68f06Mark Salyzyn    if (name) {
15708739ba71fc1f2659149be760405d622e5b68f06Mark Salyzyn        return name;
15808739ba71fc1f2659149be760405d622e5b68f06Mark Salyzyn    }
159720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
160720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    // report uid -> pid(s) -> pidToName if unique
161720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    ssize_t index = -1;
162720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    while ((index = pidTable.next(index)) != -1) {
163720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        const PidEntry &entry = pidTable.entryAt(index);
164720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
165720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        if (entry.getUid() == uid) {
166720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            const char *n = entry.getName();
167720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
168720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            if (n) {
169720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                if (!name) {
170720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                    name = strdup(n);
171720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                } else if (strcmp(name, n)) {
172720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                    free(name);
173023f51f360472f6bb9bad495e55cdb32b5411bc5Mark Salyzyn                    name = NULL;
174023f51f360472f6bb9bad495e55cdb32b5411bc5Mark Salyzyn                    break;
175720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                }
176720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            }
177720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        }
178720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    }
179720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
18097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    // No one
181720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    return name;
18234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
18334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
18497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzynstatic void format_line(android::String8 &output,
185ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn        android::String8 &name, android::String8 &size, android::String8 &pruned) {
186ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    static const size_t pruned_len = 6;
187ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    static const size_t total_len = 70 + pruned_len;
188ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn
189ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    ssize_t drop_len = std::max(pruned.length() + 1, pruned_len);
190ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    ssize_t size_len = std::max(size.length() + 1,
191ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                                total_len - name.length() - drop_len - 1);
192ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn
193ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    if (pruned.length()) {
194ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn        output.appendFormat("%s%*s%*s\n", name.string(),
195ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                                          (int)size_len, size.string(),
196ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                                          (int)drop_len, pruned.string());
197ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    } else {
198ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn        output.appendFormat("%s%*s\n", name.string(),
199ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                                       (int)size_len, size.string());
200ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn    }
20134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
20234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
20397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzynvoid LogStatistics::format(char **buf, uid_t uid, unsigned int logMask) {
2049a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    static const unsigned short spaces_total = 19;
20534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
20634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (*buf) {
207239605ef64d34ced82c97870e3f3f5c4145be58cGreg Hackmann        free(*buf);
20834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        *buf = NULL;
20934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
21034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
21197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    // Report on total logging, current and for all time
21297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn
21397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    android::String8 output("size/num");
21434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t oldLength;
21597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    short spaces = 1;
21634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
21797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    log_id_for_each(id) {
21897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        if (!(logMask & (1 << id))) {
219c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            continue;
220c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        }
22197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        oldLength = output.length();
222c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        if (spaces < 0) {
223c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            spaces = 0;
224c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        }
22597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        output.appendFormat("%*s%s", spaces, "", android_log_id_to_name(id));
22697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        spaces += spaces_total + oldLength - output.length();
22797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    }
228c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn
22997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    spaces = 4;
23097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    output.appendFormat("\nTotal");
231c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn
23297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    log_id_for_each(id) {
23397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        if (!(logMask & (1 << id))) {
23497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            continue;
23534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
23697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        oldLength = output.length();
23797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        if (spaces < 0) {
23897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            spaces = 0;
239e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        }
24097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        output.appendFormat("%*s%zu/%zu", spaces, "",
24197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn                            sizesTotal(id), elementsTotal(id));
24297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        spaces += spaces_total + oldLength - output.length();
24334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
24434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
24597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    spaces = 6;
24697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    output.appendFormat("\nNow");
24734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
24897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    log_id_for_each(id) {
24997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        if (!(logMask & (1 << id))) {
25034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            continue;
25134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
25234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
25397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        size_t els = elements(id);
25434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (els) {
25597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            oldLength = output.length();
256e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            if (spaces < 0) {
257e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                spaces = 0;
258e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            }
25997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            output.appendFormat("%*s%zu/%zu", spaces, "", sizes(id), els);
26097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            spaces -= output.length() - oldLength;
26134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
26234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        spaces += spaces_total;
26334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
26434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
26597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    // Report on Chattiest
2668e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
26797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    // Chattiest by application (UID)
268720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    static const size_t maximum_sorted_entries = 32;
26997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    log_id_for_each(id) {
27097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        if (!(logMask & (1 << id))) {
2718e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            continue;
2728e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        }
2738e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
274720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        bool headerPrinted = false;
275720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        std::unique_ptr<const UidEntry *[]> sorted = sort(maximum_sorted_entries, id);
276720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        ssize_t index = -1;
277720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        while ((index = uidTable_t::next(index, sorted, maximum_sorted_entries)) >= 0) {
27897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            const UidEntry *entry = sorted[index];
27997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            uid_t u = entry->getKey();
28097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            if ((uid != AID_ROOT) && (u != uid)) {
28134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                continue;
28234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
28334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
284720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            if (!headerPrinted) {
2855720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                output.appendFormat("\n\n");
2865720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                android::String8 name("");
28797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn                if (uid == AID_ROOT) {
2885720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                    name.appendFormat(
2895720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                        "Chattiest UIDs in %s log buffer:",
29097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn                        android_log_id_to_name(id));
29197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn                } else {
2925720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                    name.appendFormat(
2935720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                        "Logging for your UID in %s log buffer:",
29497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn                        android_log_id_to_name(id));
295e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                }
296ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                android::String8 size("Size");
297ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                android::String8 pruned("Pruned");
298ae769238391f7f9fa5c03a436d5f1fd73130e6bdMark Salyzyn                if (!worstUidEnabledForLogid(id)) {
299ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                    pruned.setTo("");
300ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                }
301ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                format_line(output, name, size, pruned);
3025720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn
3035720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                name.setTo("UID   PACKAGE");
3045720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                size.setTo("BYTES");
3055720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                pruned.setTo("LINES");
3065720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                if (!worstUidEnabledForLogid(id)) {
3075720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                    pruned.setTo("");
3085720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                }
3095720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                format_line(output, name, size, pruned);
3105720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn
311720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                headerPrinted = true;
31234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
31334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
31497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            android::String8 name("");
31597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            name.appendFormat("%u", u);
31697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            char *n = uidToName(u);
31797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            if (n) {
31897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn                name.appendFormat("%*s%s", (int)std::max(6 - name.length(), (size_t)1), "", n);
31997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn                free(n);
32034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
32134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
32297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            android::String8 size("");
323720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            size.appendFormat("%zu", entry->getSizes());
32434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
325ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn            android::String8 pruned("");
326ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn            size_t dropped = entry->getDropped();
327ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn            if (dropped) {
328ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                pruned.appendFormat("%zu", dropped);
329ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn            }
330ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn
331ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn            format_line(output, name, size, pruned);
33234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
333720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    }
33497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn
335720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    if (enable) {
33681b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn        // Pid table
337720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        bool headerPrinted = false;
338720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        std::unique_ptr<const PidEntry *[]> sorted = pidTable.sort(maximum_sorted_entries);
339720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        ssize_t index = -1;
340720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        while ((index = pidTable.next(index, sorted, maximum_sorted_entries)) >= 0) {
341720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            const PidEntry *entry = sorted[index];
342720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            uid_t u = entry->getUid();
343720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            if ((uid != AID_ROOT) && (u != uid)) {
344720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                continue;
345720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            }
346720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
347720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            if (!headerPrinted) {
3485720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                output.appendFormat("\n\n");
3495720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                android::String8 name("");
350720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                if (uid == AID_ROOT) {
3515720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                    name.appendFormat("Chattiest PIDs:");
352720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                } else {
3535720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                    name.appendFormat("Logging for this PID:");
354720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                }
355720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                android::String8 size("Size");
356ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                android::String8 pruned("Pruned");
357ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                format_line(output, name, size, pruned);
3585720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn
3595720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                name.setTo("  PID/UID   COMMAND LINE");
3605720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                size.setTo("BYTES");
3615720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                pruned.setTo("LINES");
3625720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn                format_line(output, name, size, pruned);
3635720d2c168f17afb57eefb6ed762a120a24c8ecbMark Salyzyn
364720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                headerPrinted = true;
365720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            }
366720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
367720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            android::String8 name("");
368720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            name.appendFormat("%5u/%u", entry->getKey(), u);
369720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            const char *n = entry->getName();
370720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            if (n) {
371720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                name.appendFormat("%*s%s", (int)std::max(12 - name.length(), (size_t)1), "", n);
372720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            } else {
373720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                char *un = uidToName(u);
374720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                if (un) {
375720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                    name.appendFormat("%*s%s", (int)std::max(12 - name.length(), (size_t)1), "", un);
376720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                    free(un);
377720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn                }
378720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            }
379720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
380720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            android::String8 size("");
381720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn            size.appendFormat("%zu", entry->getSizes());
382720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
383ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn            android::String8 pruned("");
384ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn            size_t dropped = entry->getDropped();
385ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn            if (dropped) {
386ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn                pruned.appendFormat("%zu", dropped);
387ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn            }
388ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn
389ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn            format_line(output, name, size, pruned);
390720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn        }
39134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
39234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
393344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn    if (enable && (logMask & (1 << LOG_ID_EVENTS))) {
394344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn        // Tag table
395344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn        bool headerPrinted = false;
396344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn        std::unique_ptr<const TagEntry *[]> sorted = tagTable.sort(maximum_sorted_entries);
397344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn        ssize_t index = -1;
398344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn        while ((index = tagTable.next(index, sorted, maximum_sorted_entries)) >= 0) {
399344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            const TagEntry *entry = sorted[index];
400344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            uid_t u = entry->getUid();
401344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            if ((uid != AID_ROOT) && (u != uid)) {
402344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn                continue;
403344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            }
404344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
405344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            android::String8 pruned("");
406344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
407344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            if (!headerPrinted) {
408344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn                output.appendFormat("\n\n");
409344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn                android::String8 name("Chattiest events log buffer TAGs:");
410344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn                android::String8 size("Size");
411344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn                format_line(output, name, size, pruned);
412344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
413344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn                name.setTo("    TAG/UID   TAGNAME");
414344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn                size.setTo("BYTES");
415344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn                format_line(output, name, size, pruned);
416344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
417344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn                headerPrinted = true;
418344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            }
419344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
420344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            android::String8 name("");
421344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            if (u == (uid_t)-1) {
422344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn                name.appendFormat("%7u", entry->getKey());
423344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            } else {
424344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn                name.appendFormat("%7u/%u", entry->getKey(), u);
425344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            }
426344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            const char *n = entry->getName();
427344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            if (n) {
428344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn                name.appendFormat("%*s%s", (int)std::max(14 - name.length(), (size_t)1), "", n);
429344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            }
430344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
431344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            android::String8 size("");
432344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            size.appendFormat("%zu", entry->getSizes());
433344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
434344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn            format_line(output, name, size, pruned);
435344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn        }
436344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn    }
437344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
43897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    *buf = strdup(output.string());
43934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
4404ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn
441720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzynnamespace android {
442720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
443720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzynuid_t pidToUid(pid_t pid) {
44497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    char buffer[512];
44597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    snprintf(buffer, sizeof(buffer), "/proc/%u/status", pid);
44697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    FILE *fp = fopen(buffer, "r");
44797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    if (fp) {
44897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        while (fgets(buffer, sizeof(buffer), fp)) {
44997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn            int uid;
450c32afdf913f082235b1e66f5a57678c7f0723129Mark Salyzyn            if (sscanf(buffer, "Uid: %d", &uid) == 1) {
45197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn                fclose(fp);
45297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn                return uid;
4534ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn            }
4544ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn        }
45597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn        fclose(fp);
4564ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn    }
457e3aeeeeccc260c29ca5907a444f8d746bcc2f8a5Mark Salyzyn    return AID_LOGD; // associate this with the logger
4584ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn}
459720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
460720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn}
461720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
462720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzynuid_t LogStatistics::pidToUid(pid_t pid) {
46381b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    return pidTable.entryAt(pidTable.add(pid)).getUid();
464720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn}
465720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
466720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn// caller must free character string
467720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzynchar *LogStatistics::pidToName(pid_t pid) {
46881b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    const char *name = pidTable.entryAt(pidTable.add(pid)).getName();
46981b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    if (!name) {
47081b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn        return NULL;
471720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    }
47281b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    return strdup(name);
473720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn}
474