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