153fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler/* 253fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * Copyright (C) 2016 The Android Open Source Project 353fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * 453fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * Licensed under the Apache License, Version 2.0 (the "License"); 553fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * you may not use this file except in compliance with the License. 653fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * You may obtain a copy of the License at 753fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * 853fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * http://www.apache.org/licenses/LICENSE-2.0 953fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * 1053fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * Unless required by applicable law or agreed to in writing, software 1153fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * distributed under the License is distributed on an "AS IS" BASIS, 1253fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1353fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * See the License for the specific language governing permissions and 1453fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler * limitations under the License. 1553fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler */ 1653fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler 1753fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#define LOG_TAG "DEBUG" 1853fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler 1953fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include <dirent.h> 2053fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include <errno.h> 2153fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include <stdio.h> 2253fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include <stdlib.h> 2353fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include <string.h> 2453fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include <sys/types.h> 2553fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include <unistd.h> 2653fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler 2753fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include <string> 2853fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include <utility> 2953fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include <vector> 3053fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler 3153fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include <android-base/file.h> 3230f991f251940be3ed11566fb71139852286f68aMark Salyzyn#include <log/log.h> 3353fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler 3453fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include "open_files_list.h" 3553fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler 3653fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler#include "utility.h" 3753fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler 3853fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhlervoid populate_open_files_list(pid_t pid, OpenFilesList* list) { 3953fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler std::string fd_dir_name = "/proc/" + std::to_string(pid) + "/fd"; 4053fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler std::unique_ptr<DIR, int (*)(DIR*)> dir(opendir(fd_dir_name.c_str()), closedir); 4153fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler if (dir == nullptr) { 4253fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler ALOGE("failed to open directory %s: %s", fd_dir_name.c_str(), strerror(errno)); 4353fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler return; 4453fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler } 4553fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler 4653fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler struct dirent* de; 4753fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler while ((de = readdir(dir.get())) != nullptr) { 4853fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler if (*de->d_name == '.') { 4953fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler continue; 5053fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler } 5153fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler 5253fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler int fd = atoi(de->d_name); 5353fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler std::string path = fd_dir_name + "/" + std::string(de->d_name); 5453fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler std::string target; 5553fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler if (android::base::Readlink(path, &target)) { 5653fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler list->emplace_back(fd, target); 5753fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler } else { 5853fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler ALOGE("failed to readlink %s: %s", path.c_str(), strerror(errno)); 5953fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler list->emplace_back(fd, "???"); 6053fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler } 6153fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler } 6253fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler} 6353fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler 6453fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhlervoid dump_open_files_list_to_log(const OpenFilesList& files, log_t* log, const char* prefix) { 6553fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler for (auto& file : files) { 6653fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler _LOG(log, logtype::OPEN_FILES, "%sfd %i: %s\n", prefix, file.first, file.second.c_str()); 6753fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler } 6853fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler} 6953fb32f05cc17848f239dec6b8c821b7c5124ef4Richard Uhler 70