18b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root/* 28b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * Copyright (c) 2010, The Android Open Source Project 38b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * All rights reserved. 48b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * 58b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * Redistribution and use in source and binary forms, with or without 68b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * modification, are permitted provided that the following conditions 78b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * are met: 88b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * * Redistributions of source code must retain the above copyright 98b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * notice, this list of conditions and the following disclaimer. 108b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * * Redistributions in binary form must reproduce the above copyright 118b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * notice, this list of conditions and the following disclaimer in 128b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * the documentation and/or other materials provided with the 138b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * distribution. 148b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * * Neither the name of Google, Inc. nor the names of its contributors 158b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * may be used to endorse or promote products derived from this 168b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * software without specific prior written permission. 178b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * 188b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 198b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 208b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 218b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 228b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 238b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 248b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 258b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 268b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 278b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 288b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 298b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root * SUCH DAMAGE. 308b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root */ 318b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 328b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root#include <dirent.h> 338b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root#include <errno.h> 348b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root#include <fcntl.h> 358b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root#include <libgen.h> 368b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root#include <stdio.h> 378b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root#include <stdlib.h> 388b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root#include <unistd.h> 398b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 40f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown#include <pwd.h> 41f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown#include <sys/stat.h> 42f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown 438b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root#define BUF_MAX 1024 44f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown#define CMD_DISPLAY_MAX (9 + 1) 45f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown#define USER_DISPLAY_MAX (10 + 1) 468b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 478b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Rootstruct pid_info_t { 488b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root pid_t pid; 49f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown char user[USER_DISPLAY_MAX]; 508b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 518b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root char cmdline[CMD_DISPLAY_MAX]; 528b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 538b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root char path[PATH_MAX]; 548b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root ssize_t parent_length; 558b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root}; 568b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 578b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Rootvoid print_header() 588b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root{ 598b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root printf("%-9s %5s %10s %4s %9s %18s %9s %10s %s\n", 608b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root "COMMAND", 618b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root "PID", 628b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root "USER", 638b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root "FD", 648b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root "TYPE", 658b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root "DEVICE", 668b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root "SIZE/OFF", 678b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root "NODE", 688b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root "NAME"); 698b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root} 708b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 718b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Rootvoid print_type(char *type, struct pid_info_t* info) 728b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root{ 738b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root static ssize_t link_dest_size; 748b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root static char link_dest[PATH_MAX]; 758b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 768b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root strncat(info->path, type, sizeof(info->path)); 778b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root if ((link_dest_size = readlink(info->path, link_dest, sizeof(link_dest)-1)) < 0) { 788b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root if (errno == ENOENT) 798b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root goto out; 808b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 818b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root snprintf(link_dest, sizeof(link_dest), "%s (readlink: %s)", info->path, strerror(errno)); 828b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root } else { 838b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root link_dest[link_dest_size] = '\0'; 848b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root } 858b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 868b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root // Things that are just the root filesystem are uninteresting (we already know) 878b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root if (!strcmp(link_dest, "/")) 888b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root goto out; 898b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 90f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown printf("%-9s %5d %10s %4s %9s %18s %9s %10s %s\n", 91f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown info->cmdline, info->pid, info->user, type, 928b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root "???", "???", "???", "???", link_dest); 938b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 948b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Rootout: 958b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root info->path[info->parent_length] = '\0'; 968b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root} 978b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 988b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root// Prints out all file that have been memory mapped 998b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Rootvoid print_maps(struct pid_info_t* info) 1008b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root{ 1018b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root FILE *maps; 1028b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root char buffer[PATH_MAX + 100]; 1038b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1048b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root size_t offset; 1058b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root int major, minor; 1068b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root char device[10]; 1078b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root long int inode; 1088b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root char file[PATH_MAX]; 1098b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1108b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root strncat(info->path, "maps", sizeof(info->path)); 1118b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1128b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root maps = fopen(info->path, "r"); 1138b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root if (!maps) 1148b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root goto out; 1158b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1168b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root while (fscanf(maps, "%*x-%*x %*s %zx %5s %ld %s\n", &offset, device, &inode, 1178b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root file) == 4) { 1188b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root // We don't care about non-file maps 1198b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root if (inode == 0 || !strcmp(device, "00:00")) 1208b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root continue; 1218b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 122f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown printf("%-9s %5d %10s %4s %9s %18s %9zd %10ld %s\n", 123f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown info->cmdline, info->pid, info->user, "mem", 1248b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root "???", device, offset, inode, file); 1258b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root } 1268b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1278b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root fclose(maps); 1288b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1298b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Rootout: 1308b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root info->path[info->parent_length] = '\0'; 1318b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root} 1328b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1338b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root// Prints out all open file descriptors 1348b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Rootvoid print_fds(struct pid_info_t* info) 1358b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root{ 1368b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root static char* fd_path = "fd/"; 1378b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root strncat(info->path, fd_path, sizeof(info->path)); 1388b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1398b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root int previous_length = info->parent_length; 1408b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root info->parent_length += strlen(fd_path); 1418b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1428b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root DIR *dir = opendir(info->path); 1438b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root if (dir == NULL) { 1448b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root char msg[BUF_MAX]; 1458b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root snprintf(msg, sizeof(msg), "%s (opendir: %s)", info->path, strerror(errno)); 146f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown printf("%-9s %5d %10s %4s %9s %18s %9s %10s %s\n", 147f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown info->cmdline, info->pid, info->user, "FDS", 1488b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root "", "", "", "", msg); 1498b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root goto out; 1508b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root } 1518b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1528b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root struct dirent* de; 1538b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root while ((de = readdir(dir))) { 1548b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) 1558b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root continue; 1568b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1578b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root print_type(de->d_name, info); 1588b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root } 1598b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root closedir(dir); 1608b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1618b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Rootout: 1628b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root info->parent_length = previous_length; 1638b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root info->path[info->parent_length] = '\0'; 1648b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root} 1658b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 1668b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Rootvoid lsof_dumpinfo(pid_t pid) 1678b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root{ 1688b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root int fd; 1698b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root struct pid_info_t info; 170f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown struct stat pidstat; 171f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown struct passwd *pw; 1728b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 173f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown info.pid = pid; 1748b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root snprintf(info.path, sizeof(info.path), "/proc/%d/", pid); 1758b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root info.parent_length = strlen(info.path); 1768b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 177f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown // Get the UID by calling stat on the proc/pid directory. 178f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown if (!stat(info.path, &pidstat)) { 179f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown pw = getpwuid(pidstat.st_uid); 180f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown if (pw) { 181b953fc284983ac8eac9174bcfffedd18cb48ac7eKenny Root strlcpy(info.user, pw->pw_name, sizeof(info.user)); 182f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown } else { 183f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown snprintf(info.user, USER_DISPLAY_MAX, "%d", (int)pidstat.st_uid); 184f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown } 185f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown } else { 186f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown strcpy(info.user, "???"); 187f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown } 188f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown 1898b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root // Read the command line information; each argument is terminated with NULL. 1908b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root strncat(info.path, "cmdline", sizeof(info.path)); 1918b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root fd = open(info.path, O_RDONLY); 1928b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root if (fd < 0) { 1938b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root fprintf(stderr, "Couldn't read %s\n", info.path); 1948b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root return; 1958b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root } 196b953fc284983ac8eac9174bcfffedd18cb48ac7eKenny Root 1978b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root char cmdline[PATH_MAX]; 198b953fc284983ac8eac9174bcfffedd18cb48ac7eKenny Root int numRead = read(fd, cmdline, sizeof(cmdline) - 1); 199b953fc284983ac8eac9174bcfffedd18cb48ac7eKenny Root close(fd); 200b953fc284983ac8eac9174bcfffedd18cb48ac7eKenny Root 201b953fc284983ac8eac9174bcfffedd18cb48ac7eKenny Root if (numRead < 0) { 2028b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root fprintf(stderr, "Error reading cmdline: %s: %s\n", info.path, strerror(errno)); 2038b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root return; 2048b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root } 205b953fc284983ac8eac9174bcfffedd18cb48ac7eKenny Root 206b953fc284983ac8eac9174bcfffedd18cb48ac7eKenny Root cmdline[numRead] = '\0'; 2078b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 2088b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root // We only want the basename of the cmdline 209b953fc284983ac8eac9174bcfffedd18cb48ac7eKenny Root strlcpy(info.cmdline, basename(cmdline), sizeof(info.cmdline)); 2108b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 2118b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root // Read each of these symlinks 2128b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root print_type("cwd", &info); 2138b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root print_type("exe", &info); 2148b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root print_type("root", &info); 2158b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 2168b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root print_fds(&info); 2178b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root print_maps(&info); 2188b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root} 2198b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 2208b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Rootint lsof_main(int argc, char *argv[]) 2218b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root{ 222794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood long int pid = 0; 223794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood char* endptr; 224794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood if (argc == 2) { 225794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood pid = strtol(argv[1], &endptr, 10); 2268b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root } 2278b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 2288b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root print_header(); 2298b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 230794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood if (pid) { 2318b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root lsof_dumpinfo(pid); 232794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood } else { 233794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood DIR *dir = opendir("/proc"); 234794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood if (dir == NULL) { 235794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood fprintf(stderr, "Couldn't open /proc\n"); 236794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood return -1; 237794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood } 238794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood 239794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood struct dirent* de; 240794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood while ((de = readdir(dir))) { 241794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) 242794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood continue; 243794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood 244794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood // Only inspect directories that are PID numbers 245f96993eb4e09d183259fda7eca35a32974345ff8Jeff Brown pid = strtol(de->d_name, &endptr, 10); 246794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood if (*endptr != '\0') 247794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood continue; 248794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood 249794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood lsof_dumpinfo(pid); 250794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood } 251794cc3fdd32e713145a2aa55c7a34c91d2a8fa5fMike Lockwood closedir(dir); 2528b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root } 2538b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root 2548b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root return 0; 2558b9b105bc7bf6428591d55462b3e727ba7504b29Kenny Root} 256