bin/54784: find -ls wastes space

andyf at speednet.com.au andyf at speednet.com.au
Wed Jul 23 08:50:14 PDT 2003


>Number:         54784
>Category:       bin
>Synopsis:       find -ls wastes space
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jul 23 08:50:11 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator:     andyf at speednet.com.au
>Release:        FreeBSD 4.8-RELEASE i386
>Organization:
>Environment:
>Description:
	When using the -ls option of find(1) the username and groupname are
	formatted into a fixed length field of UT_NAMESIZE (MAXLOGNAME on
        -current). This patch does what top(1) does and scans for the long-
	est username, then formats the field to this dynamic value.

	The patches to operater.c fix compile warnings.
>How-To-Repeat:
	find . -ls
>Fix:

diff -u ./extern.h ./new/extern.h
--- ./extern.h	Sun May  6 19:53:22 2001
+++ ./new/extern.h	Thu Jul 24 00:58:54 2003
@@ -111,5 +111,5 @@
 exec_f	f_user;
 
 extern int ftsoptions, isdeprecated, isdepth, isoutput, issort, isxargs;
-extern int mindepth, maxdepth;
+extern int namelength, mindepth, maxdepth;
 extern int regexp_flags;
diff -u ./function.c ./new/function.c
--- ./function.c	Fri Nov 15 21:38:15 2002
+++ ./new/function.c	Thu Jul 24 00:02:45 2003
@@ -49,6 +49,7 @@
 #include <sys/wait.h>
 #include <sys/mount.h>
 #include <sys/timeb.h>
+#include <sys/types.h>
 
 #include <dirent.h>
 #include <err.h>
@@ -926,8 +927,17 @@
 	OPTION *option;
 	char ***argvp;
 {
+	struct passwd *pw;
+
 	ftsoptions &= ~FTS_NOSTAT;
 	isoutput = 1;
+
+	while ((pw = getpwent()) != NULL) {
+	    if (strlen(pw->pw_name) > namelength)
+		namelength = strlen(pw->pw_name);
+	}
+	if (namelength < 8)
+	    namelength = 8;
 
 	return palloc(option);
 }
diff -u ./ls.c ./new/ls.c
--- ./ls.c	Wed Mar 13 05:34:50 2002
+++ ./new/ls.c	Thu Jul 24 00:12:57 2003
@@ -52,6 +52,8 @@
 #include <unistd.h>
 #include <utmp.h>
 
+extern int namelength;
+
 /* Derived from the print routines in the ls(1) source code. */
 
 static void printlink __P((char *));
@@ -67,9 +69,9 @@
 
 	(void)printf("%6lu %4qd ", (u_long) sb->st_ino, sb->st_blocks);
 	(void)strmode(sb->st_mode, modep);
-	(void)printf("%s %3u %-*s %-*s ", modep, sb->st_nlink, UT_NAMESIZE,
-	    user_from_uid(sb->st_uid, 0), UT_NAMESIZE,
-	    group_from_gid(sb->st_gid, 0));
+	(void)printf("%s %3u %-*s %-*s ", modep, sb->st_nlink,
+	    namelength, user_from_uid(sb->st_uid, 0),
+	    namelength, group_from_gid(sb->st_gid, 0));
 
 	if (S_ISCHR(sb->st_mode) || S_ISBLK(sb->st_mode))
 		(void)printf("%3d, %3d ", major(sb->st_rdev),
diff -u ./main.c ./new/main.c
--- ./main.c	Mon Feb 26 07:56:59 2001
+++ ./new/main.c	Thu Jul 24 00:10:57 2003
@@ -74,6 +74,7 @@
 int issort;         		/* do hierarchies in lexicographical order */
 int isxargs;			/* don't permit xargs delimiting chars */
 int mindepth = -1, maxdepth = -1; /* minimum and maximum depth */
+int namelength;			/* longest username */
 int regexp_flags = REG_BASIC;	/* use the "basic" regexp by default*/
 
 static void usage __P((void));
diff -u ./operator.c ./new/operator.c
--- ./operator.c	Sun May  6 19:53:22 2001
+++ ./new/operator.c	Mon Jul 21 22:19:03 2003
@@ -37,7 +37,9 @@
  */
 
 #ifndef lint
+#if 0
 static char sccsid[] = "@(#)operator.c	8.1 (Berkeley) 6/6/93";
+#endif
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -173,7 +175,7 @@
 
 	tail = result = NULL;
 
-	while (next = yanknode(&plan)) {
+	while ((next = yanknode(&plan)) != NULL) {
 		/*
 		 * if we encounter a ( expression ) then look for nots in
 		 * the expr subplan.

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list