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