[PATCH] lsof reworked

Tito farmatito at tiscali.it
Sun Mar 25 22:36:43 UTC 2012


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);
		}
	}
}


More information about the busybox mailing list