From 5b57d28ffb6e1ef86b50f7d05d977826eae89bfe Mon Sep 17 00:00:00 2001 From: Kiyoshi Aman Date: Fri, 1 Feb 2019 22:55:37 +0000 Subject: initial population --- usr.bin/id/groups.1 | 59 +++++++++ usr.bin/id/id.1 | 136 +++++++++++++++++++ usr.bin/id/id.c | 370 ++++++++++++++++++++++++++++++++++++++++++++++++++++ usr.bin/id/whoami.1 | 58 ++++++++ 4 files changed, 623 insertions(+) create mode 100644 usr.bin/id/groups.1 create mode 100644 usr.bin/id/id.1 create mode 100644 usr.bin/id/id.c create mode 100644 usr.bin/id/whoami.1 (limited to 'usr.bin/id') diff --git a/usr.bin/id/groups.1 b/usr.bin/id/groups.1 new file mode 100644 index 0000000..684f0d5 --- /dev/null +++ b/usr.bin/id/groups.1 @@ -0,0 +1,59 @@ +.\" $NetBSD: groups.1,v 1.11 2017/07/04 07:00:30 wiz Exp $ +.\" +.\" Copyright (c) 1991, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" from: @(#)groups.1 8.1 (Berkeley) 6/6/93 +.\" +.Dd June 6, 1993 +.Dt GROUPS 1 +.Os +.Sh NAME +.Nm groups +.Nd show group memberships +.Sh SYNOPSIS +.Nm +.Op Ar user +.Sh DESCRIPTION +The +.Nm +utility has been obsoleted by the +.Xr id 1 +utility, and is equivalent to +.Dq Nm id Fl Gn Op Ar user . +The command +.Dq Nm id Fl p +is suggested for normal interactive use. +.Pp +The +.Nm +utility displays the groups to which you (or the optionally specified user) +belong. +.Sh EXIT STATUS +.Ex -std groups +.Sh SEE ALSO +.Xr id 1 diff --git a/usr.bin/id/id.1 b/usr.bin/id/id.1 new file mode 100644 index 0000000..ad66b62 --- /dev/null +++ b/usr.bin/id/id.1 @@ -0,0 +1,136 @@ +.\" $NetBSD: id.1,v 1.14 2017/07/04 07:01:07 wiz Exp $ +.\" +.\" Copyright (c) 1991, 1993, 1994 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" the Institute of Electrical and Electronics Engineers, Inc. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)id.1 8.2 (Berkeley) 5/5/94 +.\" +.Dd May 5, 1994 +.Dt ID 1 +.Os +.Sh NAME +.Nm id +.Nd return user identity +.Sh SYNOPSIS +.Nm +.Op Ar user +.Nm +.Fl G Op Fl n +.Op Ar user +.Nm +.Fl g Op Fl nr +.Op Ar user +.Nm +.Fl p +.Op Ar user +.Nm +.Fl u Op Fl nr +.Op Ar user +.Sh DESCRIPTION +The +.Nm +utility displays the user and group names and numeric IDs, of the +calling process, to the standard output. +If the real and effective IDs are different, both are displayed, +otherwise only the real ID is displayed. +.Pp +If a +.Ar user +(login name or user ID) +is specified, the user and group IDs of that user are displayed. +In this case, the real and effective IDs are assumed to be the same. +.Pp +The options are as follows: +.Bl -tag -width Ds +.It Fl G +Display the different group IDs (effective, real and supplementary) +as white-space separated numbers, in no particular order. +.It Fl g +Display the effective group ID as a number. +.It Fl n +Display the name of the user or group ID for the +.Fl G , +.Fl g +and +.Fl u +options instead of the number. +If any of the ID numbers cannot be mapped into names, the number will be +displayed as usual. +.It Fl p +Make the output human-readable. +If the user name returned by +.Xr getlogin 2 +is different from the login name referenced by the user ID, the name +returned by +.Xr getlogin 2 +is displayed, preceded by the keyword ``login''. +The user ID as a name is displayed, preceded by the keyword ``uid''. +If the effective user ID is different from the real user ID, the real user +ID is displayed as a name, preceded by the keyword ``euid''. +If the effective group ID is different from the real group ID, the real group +ID is displayed as a name, preceded by the keyword ``rgid''. +The list of groups to which the user belongs is then displayed as names, +preceded by the keyword ``groups''. +Each display is on a separate line. +.It Fl r +Display the real ID for the +.Fl g +and +.Fl u +options instead of the effective ID. +.It Fl u +Display the effective user ID as a number. +.El +.Sh EXIT STATUS +.Ex -std id +.Sh SEE ALSO +.Xr who 1 +.Sh STANDARDS +The +.Nm +function is expected to conform to +.St -p1003.2 . +.Sh HISTORY +The +historic +.Xr groups 1 +command is equivalent to +.Dq Nm id Fl Gn Op Ar user . +.Pp +The +historic +.Xr whoami 1 +command is equivalent to +.Dq Nm id Fl un . +.Pp +The +.Nm +command first appeared in +.Bx 4.4 . diff --git a/usr.bin/id/id.c b/usr.bin/id/id.c new file mode 100644 index 0000000..720cc49 --- /dev/null +++ b/usr.bin/id/id.c @@ -0,0 +1,370 @@ +/*- + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +__COPYRIGHT("@(#) Copyright (c) 1991, 1993\ + The Regents of the University of California. All rights reserved."); +#endif /* not lint */ + +#ifndef lint +#if 0 +static char sccsid[] = "@(#)id.c 8.3 (Berkeley) 4/28/95"; +#else +__RCSID("$NetBSD: id.c,v 1.32 2011/09/16 15:39:26 joerg Exp $"); +#endif +#endif /* not lint */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +static void current(void); +static void pretty(struct passwd *); +static void group(struct passwd *, int); +__dead static void usage(void); +static void user(struct passwd *); +static struct passwd *who(char *); + +static int maxgroups; +static gid_t *groups; + +int +main(int argc, char *argv[]) +{ + struct group *gr; + struct passwd *pw; + int ch, id; + int Gflag, gflag, nflag, pflag, rflag, uflag; + const char *opts; + + Gflag = gflag = nflag = pflag = rflag = uflag = 0; + + if (strcmp(getprogname(), "groups") == 0) { + Gflag = 1; + nflag = 1; + opts = ""; + if (argc > 2) + usage(); + } else if (strcmp(getprogname(), "whoami") == 0) { + uflag = 1; + nflag = 1; + opts = ""; + if (argc > 1) + usage(); + } else + opts = "Ggnpru"; + + while ((ch = getopt(argc, argv, opts)) != -1) + switch (ch) { + case 'G': + Gflag = 1; + break; + case 'g': + gflag = 1; + break; + case 'n': + nflag = 1; + break; + case 'p': + pflag = 1; + break; + case 'r': + rflag = 1; + break; + case 'u': + uflag = 1; + break; + case '?': + default: + usage(); + } + argc -= optind; + argv += optind; + + switch (Gflag + gflag + pflag + uflag) { + case 1: + break; + case 0: + if (!nflag && !rflag) + break; + /* FALLTHROUGH */ + default: + usage(); + } + + if (strcmp(opts, "") != 0 && argc > 1) + usage(); + + pw = *argv ? who(*argv) : NULL; + + maxgroups = sysconf(_SC_NGROUPS_MAX); + if ((groups = malloc((maxgroups + 1) * sizeof(gid_t))) == NULL) + err(1, NULL); + + if (gflag) { + id = pw ? pw->pw_gid : rflag ? getgid() : getegid(); + if (nflag && (gr = getgrgid(id))) + (void)printf("%s\n", gr->gr_name); + else + (void)printf("%u\n", id); + goto done; + } + + if (uflag) { + id = pw ? pw->pw_uid : rflag ? getuid() : geteuid(); + if (nflag && (pw = getpwuid(id))) + (void)printf("%s\n", pw->pw_name); + else + (void)printf("%u\n", id); + goto done; + } + + if (Gflag) { + group(pw, nflag); + goto done; + } + + if (pflag) { + pretty(pw); + goto done; + } + + if (pw) + user(pw); + else + current(); +done: + free(groups); + + return 0; +} + +static void +pretty(struct passwd *pw) +{ + struct group *gr; + u_int eid, rid; + char *login; + + if (pw) { + (void)printf("uid\t%s\n", pw->pw_name); + (void)printf("groups\t"); + group(pw, 1); + } else { + if ((login = getlogin()) == NULL) + err(1, "getlogin"); + + pw = getpwuid(rid = getuid()); + if (pw == NULL || strcmp(login, pw->pw_name)) + (void)printf("login\t%s\n", login); + if (pw) + (void)printf("uid\t%s\n", pw->pw_name); + else + (void)printf("uid\t%u\n", rid); + + if ((eid = geteuid()) != rid) { + if ((pw = getpwuid(eid)) != NULL) + (void)printf("euid\t%s\n", pw->pw_name); + else + (void)printf("euid\t%u\n", eid); + } + if ((rid = getgid()) != (eid = getegid())) { + if ((gr = getgrgid(rid)) != NULL) + (void)printf("rgid\t%s\n", gr->gr_name); + else + (void)printf("rgid\t%u\n", rid); + } + (void)printf("groups\t"); + group(NULL, 1); + } +} + +static void +current(void) +{ + struct group *gr; + struct passwd *pw; + gid_t gid, egid, lastid; + uid_t uid, euid; + int cnt, ngroups; + const char *fmt; + + uid = getuid(); + (void)printf("uid=%ju", (uintmax_t)uid); + if ((pw = getpwuid(uid)) != NULL) + (void)printf("(%s)", pw->pw_name); + gid = getgid(); + (void)printf(" gid=%ju", (uintmax_t)gid); + if ((gr = getgrgid(gid)) != NULL) + (void)printf("(%s)", gr->gr_name); + if ((euid = geteuid()) != uid) { + (void)printf(" euid=%ju", (uintmax_t)euid); + if ((pw = getpwuid(euid)) != NULL) + (void)printf("(%s)", pw->pw_name); + } + if ((egid = getegid()) != gid) { + (void)printf(" egid=%ju", (uintmax_t)egid); + if ((gr = getgrgid(egid)) != NULL) + (void)printf("(%s)", gr->gr_name); + } + if ((ngroups = getgroups(maxgroups, groups)) != 0) { + for (fmt = " groups=%ju", lastid = -1, cnt = 0; cnt < ngroups; + fmt = ",%ju", lastid = gid, cnt++) { + gid = groups[cnt]; + if (lastid == gid) + continue; + (void)printf(fmt, (uintmax_t)gid); + if ((gr = getgrgid(gid)) != NULL) + (void)printf("(%s)", gr->gr_name); + } + } + (void)printf("\n"); +} + +static void +user(struct passwd *pw) +{ + struct group *gr; + const char *fmt; + int cnt, id, lastid, ngroups; + gid_t *glist = groups; + + id = pw->pw_uid; + (void)printf("uid=%u(%s)", id, pw->pw_name); + (void)printf(" gid=%lu", (u_long)pw->pw_gid); + if ((gr = getgrgid(pw->pw_gid)) != NULL) + (void)printf("(%s)", gr->gr_name); + ngroups = maxgroups + 1; + if (getgrouplist(pw->pw_name, pw->pw_gid, glist, &ngroups) == -1) { + glist = malloc(ngroups * sizeof(gid_t)); + (void) getgrouplist(pw->pw_name, pw->pw_gid, glist, &ngroups); + } + for (fmt = " groups=%u", lastid = -1, cnt = 0; cnt < ngroups; + fmt=",%u", lastid = id, cnt++) { + id = glist[cnt]; + if (lastid == id) + continue; + (void)printf(fmt, id); + if ((gr = getgrgid(id)) != NULL) + (void)printf("(%s)", gr->gr_name); + } + (void)printf("\n"); + if (glist != groups) + free(glist); +} + +static void +group(struct passwd *pw, int nflag) +{ + struct group *gr; + int cnt, ngroups; + gid_t id, lastid; + const char *fmt; + gid_t *glist = groups; + + if (pw) { + ngroups = maxgroups; + if (getgrouplist(pw->pw_name, pw->pw_gid, glist, &ngroups) + == -1) { + glist = malloc(ngroups * sizeof(gid_t)); + (void) getgrouplist(pw->pw_name, pw->pw_gid, glist, + &ngroups); + } + } else { + glist[0] = getgid(); + ngroups = getgroups(maxgroups, glist + 1) + 1; + } + fmt = nflag ? "%s" : "%u"; + for (lastid = -1, cnt = 0; cnt < ngroups; ++cnt) { + if (lastid == (id = glist[cnt]) || (cnt && id == glist[0])) + continue; + if (nflag) { + if ((gr = getgrgid(id)) != NULL) + (void)printf(fmt, gr->gr_name); + else + (void)printf(*fmt == ' ' ? " %u" : "%u", + id); + fmt = " %s"; + } else { + (void)printf(fmt, id); + fmt = " %u"; + } + lastid = id; + } + (void)printf("\n"); + if (glist != groups) + free(glist); +} + +static struct passwd * +who(char *u) +{ + struct passwd *pw; + long id; + char *ep; + + /* + * Translate user argument into a pw pointer. First, try to + * get it as specified. If that fails, try it as a number. + */ + if ((pw = getpwnam(u)) != NULL) + return pw; + id = strtol(u, &ep, 10); + if (*u && !*ep && (pw = getpwuid(id))) + return pw; + errx(1, "%s: No such user", u); + /* NOTREACHED */ + return NULL; +} + +static void +usage(void) +{ + + if (strcmp(getprogname(), "groups") == 0) { + (void)fprintf(stderr, "usage: groups [user]\n"); + } else if (strcmp(getprogname(), "whoami") == 0) { + (void)fprintf(stderr, "usage: whoami\n"); + } else { + (void)fprintf(stderr, "usage: id [user]\n"); + (void)fprintf(stderr, " id -G [-n] [user]\n"); + (void)fprintf(stderr, " id -g [-nr] [user]\n"); + (void)fprintf(stderr, " id -p [user]\n"); + (void)fprintf(stderr, " id -u [-nr] [user]\n"); + } + exit(1); +} diff --git a/usr.bin/id/whoami.1 b/usr.bin/id/whoami.1 new file mode 100644 index 0000000..53d9405 --- /dev/null +++ b/usr.bin/id/whoami.1 @@ -0,0 +1,58 @@ +.\" $NetBSD: whoami.1,v 1.10 2016/10/02 21:06:18 abhinav Exp $ +.\" +.\" Copyright (c) 1991, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" from: @(#)whoami.1 8.1 (Berkeley) 6/6/93 +.\" $NetBSD: whoami.1,v 1.10 2016/10/02 21:06:18 abhinav Exp $ +.\" +.Dd June 6, 1993 +.Dt WHOAMI 1 +.Os +.Sh NAME +.Nm whoami +.Nd display effective user id +.Sh SYNOPSIS +.Nm +.Sh DESCRIPTION +The +.Nm +utility has been obsoleted by the +.Xr id 1 +utility, and is equivalent to +.Dq Nm id Fl un . +The command +.Dq Nm id Fl p +is suggested for normal interactive use. +.Pp +The +.Nm +utility displays your effective user ID as a name. +.Sh EXIT STATUS +.Ex -std whoami +.Sh SEE ALSO +.Xr id 1 -- cgit v1.2.3-70-g09d2