commit d453be2ae1fc8fd84578cf5b9c56f6d1664fb3dd
Author: Rob Pilling <[email protected]>
Date:   Sun Dec 1 11:40:49 2013 +0000

    id(1) can handle uid arguments

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 <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]
", argv0);
+       eprintf("usage: %s [user | uid]
", 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
", 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
", 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
", 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
", id);
+       user(pw);
+}
+
 static void
 user(struct passwd *pw)
 {


Reply via email to