From fad6b54c1c84031291b76644aa9d944ec1dcd091 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sun, 1 Dec 2013 11:40:49 +0000 Subject: [PATCH 2/2] id(1) can handle uid arguments --- id.1 | 6 +++--- id.c | 51 ++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/id.1 b/id.1 index 8252773..6bfa06b 100644 --- a/id.1 +++ b/id.1 @@ -3,10 +3,10 @@ id \- print real and effective user and group IDs .SH SYNOPSIS .B id -.RB [ user ] +.RB [ user | uid ] .SH DESCRIPTION Print user and group information of the calling process to standard output. -If a login name is specified, the user and group information of that user -is displayed. +If a login name or uid is specified, the user and group information of that +user is displayed. .SH SEE ALSO .IR who(1) diff --git a/id.c b/id.c index ce618fd..78fa71d 100644 --- a/id.c +++ b/id.c @@ -7,21 +7,22 @@ #include #include #include +#include #include "util.h" 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 [user]\n", argv0); + eprintf("usage: %s [user | uid]\n", argv0); } int main(int argc, char *argv[]) { - struct passwd *pw; - ARGBEGIN { default: usage(); @@ -30,20 +31,14 @@ main(int argc, char *argv[]) errno = 0; switch (argc) { case 0: - pw = getpwuid(getuid()); - if (errno != 0) - eprintf("getpwuid %d:", getuid()); - else if (!pw) - eprintf("getpwuid %d: no such user\n", getuid()); - user(pw); + userid(getuid()); break; case 1: - pw = getpwnam(argv[0]); - if (errno != 0) - eprintf("getpwnam %s:", argv[0]); - else if (!pw) - eprintf("getpwnam %s: no such user\n", argv[0]); - user(pw); + /* user names can't begin [0-9] */ + if (isdigit(argv[0][0])) + userid(estrtol(argv[0], 0)); + else + usernam(argv[0]); break; default: usage(); @@ -52,6 +47,32 @@ main(int argc, char *argv[]) return EXIT_SUCCESS; } +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); + 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); + user(pw); +} + static void user(struct passwd *pw) { -- 1.7.10.4