id: Implement -n - ubase - suckless linux base utils | |
git clone git://git.suckless.org/ubase | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit d988f01f0f403e66d4a4597e909932c9989e45d6 | |
parent 91cd388a39c8362713801cd61b5f83ad7bd567be | |
Author: tm512 <[email protected]> | |
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 infor… | |
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()); |