commit d988f01f0f403e66d4a4597e909932c9989e45d6
parent 91cd388a39c8362713801cd61b5f83ad7bd567be
Author: tm512 <elykdav@gmail.com>
Date: Sun, 26 Apr 2015 10:38:41 +0100
id: Implement -n
Diffstat:
M | id.1 | | | 9 | +++++---- |
M | id.c | | | 45 | +++++++++++++++++++++++++++++++++++++++------ |
2 files changed, 44 insertions(+), 10 deletions(-)
diff --git a/id.1 b/id.1
@@ -1,4 +1,4 @@
-.Dd February 2, 2015
+.Dd April 24, 2015
.Dt ID 1
.Os ubase
.Sh NAME
@@ -6,9 +6,8 @@
.Nd print real and effective user and group IDs
.Sh SYNOPSIS
.Nm
-.Op Fl g
-.Op Fl u
-.Op Fl G
+.Op Fl n
+.Op Fl g | u | G
.Op Ar user | uid
.Sh DESCRIPTION
.Nm
@@ -17,6 +16,8 @@ If a login name or uid is specified, the user and group information of that
user is displayed.
.Sh OPTIONS
.Bl -tag -width Ds
+.It Fl n
+Print names instead of ID numbers, for -g, -u, and -G.
.It Fl g
Print only the effective group ID.
.It Fl u
diff --git a/id.c b/id.c
@@ -17,12 +17,16 @@ static void user(struct passwd *pw);
static void userid(uid_t id);
static void usernam(const char *nam);
+static int gflag = 0;
+static int uflag = 0;
static int Gflag = 0;
+static int nflag = 0;
static void
groupid(struct passwd *pw)
{
gid_t gid, groups[NGROUPS_MAX];
+ struct group *gr;
int ngroups;
int i;
@@ -30,7 +34,13 @@ groupid(struct passwd *pw)
getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups);
for (i = 0; i < ngroups; i++) {
gid = groups[i];
- printf("%u", gid);
+ if (nflag) {
+ if (!(gr = getgrgid(gid)))
+ eprintf("getgrgid:");
+ printf("%s", gr->gr_name);
+ } else
+ printf("%u", gid);
+
if (i < ngroups - 1)
putchar(' ');
}
@@ -45,6 +55,22 @@ user(struct passwd *pw)
int ngroups;
int i;
+ if (uflag) {
+ if (nflag)
+ printf("%s\n", pw->pw_name);
+ else
+ printf("%u\n", pw->pw_uid);
+ return;
+ } else if (gflag) {
+ if (nflag) {
+ if (!(gr = getgrgid(pw->pw_gid)))
+ eprintf("getgrgid:");
+ printf("%s\n", gr->gr_name);
+ } else
+ printf("%u\n", pw->pw_gid);
+ return;
+ }
+
printf("uid=%u(%s)", pw->pw_uid, pw->pw_name);
printf(" gid=%u", pw->pw_gid);
if (!(gr = getgrgid(pw->pw_gid)))
@@ -104,7 +130,7 @@ userid(uid_t id)
static void
usage(void)
{
- eprintf("usage: %s [-g] [-u] [-G] [user | uid]\n", argv0);
+ eprintf("usage: %s [-n] [-g | -u | -G] [user | uid]\n", argv0);
}
int
@@ -112,18 +138,25 @@ main(int argc, char *argv[])
{
ARGBEGIN {
case 'g':
- printf("%d\n", getegid());
- return 0;
+ gflag = 1;
+ break;
case 'u':
- printf("%d\n", geteuid());
- return 0;
+ uflag = 1;
+ break;
case 'G':
Gflag = 1;
break;
+ case 'n':
+ nflag = 1;
+ break;
default:
usage();
} ARGEND;
+ /* ensure that only one of -g, -u, or -G was specified */
+ if (gflag + uflag + Gflag > 1)
+ usage();
+
switch (argc) {
case 0:
userid(getuid());