Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 May 2001 17:37:44 +0300
From:      Peter Pentchev <roam@orbitel.bg>
To:        Jamie Heckford <heckfordj@psi-domain.co.uk>
Cc:        Sean Winn <sean@gothic.net.au>, freebsd-hackers@freebsd.org
Subject:   Re: bin/27205: Listing all users in the passwd file
Message-ID:  <20010509173744.F645@ringworld.oblivion.bg>
In-Reply-To: <20010509105612.A4112@storm.psi-domain.co.uk>; from heckfordj@psi-domain.co.uk on Wed, May 09, 2001 at 10:56:12AM %2B0100
References:  <20010508153202.9C4B5402EC6@rafiu.psi-domain.co.uk> <5.1.0.14.2.20010509171743.03e700c0@mail.gothic.net.au> <20010509105612.A4112@storm.psi-domain.co.uk>

next in thread | previous in thread | raw e-mail | index | archive | help
I'd think id(1) would be a more proper place, as it already knows how to
format various passwd(5) and group(5) information.

How about the attached patch?  (and I'm probably starting another of those
bikesheds as to whether new options should be added to existing utilities..)

G'luck,
Peter

-- 
This sentence contains exactly threee erors.

On Wed, May 09, 2001 at 10:56:12AM +0100, Jamie Heckford wrote:
> Good points, glad to see the usual FreeBSD approach of allowing
> only the best into the code ;)
> 
> Some sort of wrapper makes perfect sense for the sendmail option -
> I did think of this, but your right, it is best to assume the
> "user-friendly" approach
> and not give users tweaking to do out of the box.
> 
> Could be a possibilty of adding it as a switch / option to pw(8), with
> NIS capabilities? (Rewritten in C of course) Would this be deemed useful
> and anyone happy to review a patch?
[snip]
> > >
> > >I discovered the following awk script that prints out all users on the
> > system
> > >(from /etc/passwd). (Courtesy of sendmail.org)
> > >
> > >awk -F: '$3 > 100 { print $1 }' /etc/passwd
> > >
> > >Which will print out a list of all users in the passwd file wuth a UID
> > greater
> > >than 100.
> > >
> > >Could this be turned into a command such as "userlist", and/or would it
> > be
> > >deemed usefull?
> > 
> > Not particularly, as it doesn't work with NIS, and won't work with 
> > nsswitch.conf.
> > 
> > A small perl script or C program using getpwent() in a loop is more 
> > effective, as it takes into account both NIS and nsswitch.conf

Index: src/usr.bin/id/id.1
===================================================================
RCS file: /home/ncvs/src/usr.bin/id/id.1,v
retrieving revision 1.9
diff -u -r1.9 id.1
--- src/usr.bin/id/id.1	2000/11/20 19:20:48	1.9
+++ src/usr.bin/id/id.1	2001/05/09 14:33:53
@@ -43,21 +43,28 @@
 .Nd return user identity
 .Sh SYNOPSIS
 .Nm
+.Op Fl a
 .Op Ar user
 .Nm
-.Fl G Op Fl n
+.Fl G Op Fl an
 .Op Ar user
 .Nm
 .Fl P
+.Op Fl a
 .Op Ar user
 .Nm
-.Fl g Op Fl nr
+.Fl g
+.Op Fl a | Fl r
+.Op Fl n
 .Op Ar user
 .Nm
 .Fl p
+.Op Fl a
 .Op Ar user
 .Nm
-.Fl u Op Fl nr
+.Fl u
+.Op Fl a | Fl r
+.Op Fl n
 .Op Ar user
 .Sh DESCRIPTION
 The
@@ -80,6 +87,10 @@
 as white-space separated numbers, in no particular order.
 .It Fl P
 Display the id as a password file entry.
+.It Fl a
+Display information about all system users, not just about the calling process.
+This flag cannot be used together with
+.Fl r .
 .It Fl g
 Display the effective group ID as a number.
 .It Fl n
@@ -118,6 +129,8 @@
 and
 .Fl u
 options instead of the effective ID.
+This flag cannot be used together with
+.Fl a .
 .It Fl u
 Display the effective user ID as a number.
 .El
Index: src/usr.bin/id/id.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/id/id.c,v
retrieving revision 1.12
diff -u -r1.12 id.c
--- src/usr.bin/id/id.c	1999/09/06 20:07:12	1.12
+++ src/usr.bin/id/id.c	2001/05/09 14:33:53
@@ -55,6 +55,9 @@
 #include <string.h>
 #include <unistd.h>
 
+int	Gflag, Pflag, aflag, gflag, id, nflag, pflag, rflag, uflag;
+
+int	id_doit __P((struct passwd *));
 void	current __P((void));
 void	pline __P((struct passwd *));
 void	pretty __P((struct passwd *));
@@ -69,12 +72,10 @@
 	int argc;
 	char *argv[];
 {
-	struct group *gr;
 	struct passwd *pw;
-	int Gflag, Pflag, ch, gflag, id, nflag, pflag, rflag, uflag;
+	int ch;
 
-	Gflag = Pflag = gflag = nflag = pflag = rflag = uflag = 0;
-	while ((ch = getopt(argc, argv, "PGgnpru")) != -1)
+	while ((ch = getopt(argc, argv, "PGagnpru")) != -1)
 		switch(ch) {
 		case 'G':
 			Gflag = 1;
@@ -82,6 +83,9 @@
 		case 'P':
 			Pflag = 1;
 			break;
+		case 'a':
+			aflag = 1;
+			break;
 		case 'g':
 			gflag = 1;
 			break;
@@ -104,6 +108,9 @@
 	argc -= optind;
 	argv += optind;
 
+	if (aflag && (rflag || (argc != 0)))
+		usage();
+
 	switch(Gflag + Pflag + gflag + pflag + uflag) {
 	case 1:
 		break;
@@ -115,7 +122,20 @@
 		usage();
 	}
 
-	pw = *argv ? who(*argv) : NULL;
+	if (!aflag) {
+		pw = *argv ? who(*argv) : NULL;
+		id_doit(pw);
+	} else {
+		while ((pw = getpwent()) != NULL)
+			id_doit(pw);
+	}
+}
+
+int
+id_doit(pw)
+	struct passwd *pw;
+{
+	struct group *gr;
 
 	if (gflag) {
 		id = pw ? pw->pw_gid : rflag ? getgid() : getegid();
@@ -123,7 +143,7 @@
 			(void)printf("%s\n", gr->gr_name);
 		else
 			(void)printf("%u\n", id);
-		exit(0);
+		return (0);
 	}
 
 	if (uflag) {
@@ -132,29 +152,29 @@
 			(void)printf("%s\n", pw->pw_name);
 		else
 			(void)printf("%u\n", id);
-		exit(0);
+		return (0);
 	}
 
 	if (Gflag) {
 		group(pw, nflag);
-		exit(0);
+		return (0);
 	}
 
 	if (Pflag) {
 		pline(pw);
-		exit(0);
+		return (0);
 	}
 
 	if (pflag) {
 		pretty(pw);
-		exit(0);
+		return (0);
 	}
 
 	if (pw)
 		user(pw);
-	else
+	else if (!aflag)
 		current();
-	exit(0);
+	return (0);
 }
 
 void

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010509173744.F645>