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

Reply via email to