sbase

suckless unix tools
git clone git://git.2f30.org/sbase.git
Log | Files | Refs | README | LICENSE

commit d453be2ae1fc8fd84578cf5b9c56f6d1664fb3dd
parent fd8c3b643864c2e4be9fbb67c39bd5804ddcb245
Author: Rob Pilling <robpilling@gmail.com>
Date:   Sun Dec  1 11:40:49 +0000

id(1) can handle uid arguments

Diffstat:
id.1 | 6+++---
id.c | 51++++++++++++++++++++++++++++++++++++---------------
2 files changed, 39 insertions(+), 18 deletions(-)
diff --git 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 @@ -7,21 +7,22 @@ #include <stdio.h> #include <stdlib.h> #include <limits.h> +#include <ctype.h> #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) {