Ops,
forgot to attach the file....
Ciao,
Tito
On Monday 26 March 2012 00:36:43 Tito wrote:
> On Sunday 25 March 2012 18:47:14 Sven Oliver Moll wrote:
> > Hello!
> >
> > Again another offer for an lsof applet. To make it as small as possible,
> > now
> > all memory is allocated on the stack. If the complete path to an opened file
> > is larger that PATH_MAX, it will get truncated. On my x86_64 box, size(1) of
> > lsof.o reports 573 bytes.
> >
> > Greetings,
> > SvOlli
> >
>
> Hi,
> improved version with malloced/freed memory and better use
> of libbb functions for further size reduction.
>
> scripts/bloat-o-meter busybox_old busybox_unstripped
> function old new delta
> lsof_main 385 290 -95
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-95) Total: -95 bytes
>
> Ciao,
> Tito
>
> int lsof_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
> int lsof_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
> {
> char *fdpath;
> char *exelink;
> char *fdlink;
> char *tmp;
> char *rest = NULL;
> pid_t readpid = 0;
> struct dirent *entry_pid = (struct dirent *)0;
> struct dirent *entry_fd = (struct dirent *)0;
> DIR *d_pid = (DIR*)0;
> DIR *d_fd = (DIR*)0;
>
> d_pid = xopendir("/proc");
> for(;;) {
> entry_pid = readdir(d_pid);
> if(!entry_pid) {
> closedir(d_pid);
> return EXIT_SUCCESS;
> }
> errno = 0;
> readpid = bb_strtoul(entry_pid->d_name, &rest, 10);
> if( (getpid() != readpid) && (!errno) && (!*rest)) {
> tmp = xasprintf("/proc/%s/exe", entry_pid->d_name);
> exelink = xmalloc_readlink(tmp);
> free(tmp);
> fdpath = xasprintf("/proc/%s/fd/", entry_pid->d_name);
> d_fd = opendir(fdpath);
> if(d_fd) {
> for(;;) {
> entry_fd = readdir(d_fd);
> if(!entry_fd) {
> break;
> }
> if(entry_fd->d_type == DT_LNK) {
> tmp = xasprintf("%s/%s",
> fdpath, entry_fd->d_name);
> fdlink = xmalloc_readlink(tmp);
> free(tmp);
> printf("%d\t%s\t%s\n", readpid,
> exelink, fdlink);
> free(fdlink);
> }
> }
> }
> closedir(d_fd);
> free(fdpath);
> free(exelink);
> }
> }
> }
> _______________________________________________
> busybox mailing list
> [email protected]
> http://lists.busybox.net/mailman/listinfo/busybox
>
/* vi: set sw=4 ts=4: */
/*
* Mini lsof implementation for busybox
*
* Copyright (C) 2012 by Sven Oliver 'SvOlli' Moll <[email protected]>
*
* Licensed under GPLv2, see file LICENSE in this source tree.
*/
/* getopt not needed */
//usage:#define lsof_trivial_usage
//usage: ""
//usage:#define lsof_full_usage "\n\n"
//usage: "Show all open files"
#include "libbb.h"
int lsof_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int lsof_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
{
char *fdpath;
char *exelink;
char *fdlink;
char *tmp;
char *rest = NULL;
pid_t readpid = 0;
struct dirent *entry_pid = (struct dirent *)0;
struct dirent *entry_fd = (struct dirent *)0;
DIR *d_pid = (DIR*)0;
DIR *d_fd = (DIR*)0;
d_pid = xopendir("/proc");
for(;;) {
entry_pid = readdir(d_pid);
if(!entry_pid) {
closedir(d_pid);
return EXIT_SUCCESS;
}
errno = 0;
readpid = bb_strtoul(entry_pid->d_name, &rest, 10);
if( (getpid() != readpid) && (!errno) && (!*rest)) {
tmp = xasprintf("/proc/%s/exe", entry_pid->d_name);
exelink = xmalloc_readlink(tmp);
free(tmp);
fdpath = xasprintf("/proc/%s/fd/", entry_pid->d_name);
d_fd = opendir(fdpath);
if(d_fd) {
for(;;) {
entry_fd = readdir(d_fd);
if(!entry_fd) {
break;
}
if(entry_fd->d_type == DT_LNK) {
tmp = xasprintf("%s/%s", fdpath, entry_fd->d_name);
fdlink = xmalloc_readlink(tmp);
free(tmp);
printf("%d\t%s\t%s\n", readpid, exelink, fdlink);
free(fdlink);
}
}
}
closedir(d_fd);
free(fdpath);
free(exelink);
}
}
}
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox