From 02e0a1de08e9f5a9ffff983c1f9ddce8bbd2ed7c Mon Sep 17 00:00:00 2001 From: sin Date: Thu, 27 Feb 2014 14:27:28 +0000 Subject: [PATCH] Import id(1) from sbase --- Makefile | 1 + id.1 | 18 ++++++++ id.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 id.1 create mode 100644 id.c diff --git a/Makefile b/Makefile index 63d4aae..dccfe4f 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,7 @@ SRC = \ free.c \ getty.c \ halt.c \ + id.c \ insmod.c \ lsmod.c \ lsusb.c \ diff --git a/id.1 b/id.1 new file mode 100644 index 0000000..967022c --- /dev/null +++ b/id.1 @@ -0,0 +1,18 @@ +.TH ID 1 sbase\-VERSION +.SH NAME +id \- print real and effective user and group IDs +.SH SYNOPSIS +.B id +.RB [ -G ] +.RB [ user | uid ] +.SH DESCRIPTION +Print user and group information of the calling process to standard output. +If a login name or uid is specified, the user and group information of that +user is displayed. +.SH OPTIONS +.TP +.B \-G +Display group information as whitespace separated numbers, in no particular +order. +.SH SEE ALSO +.IR who(1) diff --git a/id.c b/id.c new file mode 100644 index 0000000..225c254 --- /dev/null +++ b/id.c @@ -0,0 +1,132 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +static void groupid(struct passwd *pw); +static void user(struct passwd *pw); +static void userid(uid_t id); +static void usernam(const char *nam); + +static void +usage(void) +{ + eprintf("usage: %s [-G] [user | uid]\n", argv0); +} + +static int Gflag = 0; + +int +main(int argc, char *argv[]) +{ + ARGBEGIN { + case 'G': + Gflag = 1; + break; + default: + usage(); + } ARGEND; + + errno = 0; + switch (argc) { + case 0: + userid(getuid()); + break; + case 1: + /* user names can't begin [0-9] */ + if (isdigit(argv[0][0])) + userid(estrtol(argv[0], 0)); + else + usernam(argv[0]); + break; + default: + usage(); + } + + return EXIT_SUCCESS; +} + +static void +groupid(struct passwd *pw) +{ + gid_t gid, groups[NGROUPS_MAX]; + int ngroups; + int i; + + ngroups = NGROUPS_MAX; + getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); + for (i = 0; i < ngroups; i++) { + gid = groups[i]; + printf("%u", gid); + if (i < ngroups - 1) + putchar(' '); + } + putchar('\n'); +} + +static void +usernam(const char *nam) +{ + struct passwd *pw; + + errno = 0; + pw = getpwnam(nam); + if (errno != 0) + eprintf("getpwnam %s:", nam); + else if (!pw) + eprintf("getpwnam %s: no such user\n", nam); + if (Gflag) + groupid(pw); + else + user(pw); +} + +static void +userid(uid_t id) +{ + struct passwd *pw; + + errno = 0; + pw = getpwuid(id); + if (errno != 0) + eprintf("getpwuid %d:", id); + else if (!pw) + eprintf("getpwuid %d: no such user\n", id); + if (Gflag) + groupid(pw); + else + user(pw); +} + +static void +user(struct passwd *pw) +{ + struct group *gr; + gid_t gid, groups[NGROUPS_MAX]; + int ngroups; + int i; + + printf("uid=%u(%s)", pw->pw_uid, pw->pw_name); + printf(" gid=%u", pw->pw_gid); + if (!(gr = getgrgid(pw->pw_gid))) + eprintf("getgrgid:"); + printf("(%s)", gr->gr_name); + + ngroups = NGROUPS_MAX; + getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); + for (i = 0; i < ngroups; i++) { + gid = groups[i]; + printf("%s%u", !i ? " groups=" : ",", gid); + if (!(gr = getgrgid(gid))) + eprintf("getgrgid:"); + printf("(%s)", gr->gr_name); + } + putchar('\n'); +}