source: MondoRescue/branches/3.3/mindi-busybox/procps/lsof.c@ 3837

Last change on this file since 3837 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

  • Property svn:eol-style set to native
File size: 2.6 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * Mini lsof implementation for busybox
4 *
5 * Copyright (C) 2012 by Sven Oliver 'SvOlli' Moll <svolli@svolli.de>
6 *
7 * Licensed under GPLv2, see file LICENSE in this source tree.
8 */
9
10//config:config LSOF
11//config: bool "lsof"
12//config: default y
13//config: help
14//config: Show open files in the format of:
15//config: PID <TAB> /path/to/executable <TAB> /path/to/opened/file
16
17//applet:IF_LSOF(APPLET(lsof, BB_DIR_USR_BIN, BB_SUID_DROP))
18
19//kbuild:lib-$(CONFIG_LSOF) += lsof.o
20
21//usage:#define lsof_trivial_usage
22//usage: ""
23//usage:#define lsof_full_usage "\n\n"
24//usage: "Show all open files"
25
26#include "libbb.h"
27
28/*
29 * Examples of "standard" lsof output:
30 *
31 * COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
32 * init 1 root cwd DIR 8,5 4096 2 /
33 * init 1 root rtd DIR 8,5 4096 2 /
34 * init 1 root txt REG 8,5 872400 63408 /app/busybox-1.19.2/busybox
35 * rpc.portm 1064 root mem REG 8,5 43494 47451 /app/glibc-2.11/lib/libnss_files-2.11.so
36 * rpc.portm 1064 root 3u IPv4 2178 UDP *:111
37 * rpc.portm 1064 root 4u IPv4 1244 TCP *:111 (LISTEN)
38 * runsvdir 1116 root 0r CHR 1,3 1214 /dev/null
39 * runsvdir 1116 root 1w CHR 1,3 1214 /dev/null
40 * runsvdir 1116 root 2w CHR 1,3 1214 /dev/null
41 * runsvdir 1116 root 3r DIR 8,6 1560 58359 /.local/var/service
42 * gpm 1128 root 4u unix 0xffff88007c09ccc0 1302 /dev/gpmctl
43 */
44
45int lsof_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
46int lsof_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
47{
48 procps_status_t *proc = NULL;
49
50 while ((proc = procps_scan(proc, PSSCAN_PID|PSSCAN_EXE)) != NULL) {
51 char name[sizeof("/proc/%u/fd/0123456789") + sizeof(int)*3];
52 unsigned baseofs;
53 DIR *d_fd;
54 char *fdlink;
55 struct dirent *entry;
56
57 if (getpid() == proc->pid)
58 continue;
59
60 baseofs = sprintf(name, "/proc/%u/fd/", proc->pid);
61 d_fd = opendir(name);
62 if (d_fd) {
63 while ((entry = readdir(d_fd)) != NULL) {
64 /* Skip entries '.' and '..' (and any hidden file) */
65 if (entry->d_name[0] == '.')
66 continue;
67
68 safe_strncpy(name + baseofs, entry->d_name, 10);
69 if ((fdlink = xmalloc_readlink(name)) != NULL) {
70 printf("%d\t%s\t%s\n", proc->pid, proc->exe, fdlink);
71 free(fdlink);
72 }
73 }
74 closedir(d_fd);
75 }
76 }
77
78 return EXIT_SUCCESS;
79}
Note: See TracBrowser for help on using the repository browser.