On Mon, May 18, 2015 at 03:12:24PM -0600, Todd C. Miller wrote:
> This adds "id -c" to display a user's login class.  If no user is
> specified, it looks up the passwd entry based on the real uid and
> displays the corresponding login class.
> 
> This is similar to "id -c" in FreeBSD (but they keep the login class
> in the kernel).
> 
>  - todd
> 
> Index: usr.bin/id/id.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/id/id.1,v
> retrieving revision 1.17
> diff -u -p -u -r1.17 id.1
> --- usr.bin/id/id.1   3 Sep 2010 11:09:29 -0000       1.17
> +++ usr.bin/id/id.1   18 May 2015 16:47:46 -0000
> @@ -43,6 +43,9 @@
>  .Nm id
>  .Op Ar user
>  .Nm id
> +.Fl c
> +.Op Ar user
> +.Nm id
>  .Fl G Op Fl n
>  .Op Ar user
>  .Nm id
> @@ -70,6 +73,9 @@ In this case, the real and effective IDs
>  .Pp
>  The options are as follows:
>  .Bl -tag -width Ds
> +.It Fl c
> +Display the login class of the real user ID or the specified
> +.Ar user .
>  .It Fl G
>  Display the different group IDs (effective, real and supplementary)
>  as whitespace separated numbers, in no particular order.
> Index: usr.bin/id/id.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/id/id.c,v
> retrieving revision 1.22
> diff -u -p -u -r1.22 id.c
> --- usr.bin/id/id.c   16 Jan 2015 06:40:08 -0000      1.22
> +++ usr.bin/id/id.c   18 May 2015 21:10:13 -0000
> @@ -38,6 +38,7 @@
>  #include <string.h>
>  #include <unistd.h>
>  #include <limits.h>
> +#include <login_cap.h>
>  
>  void current(void);
>  void pretty(struct passwd *);
> @@ -52,12 +53,12 @@ main(int argc, char *argv[])
>  {
>       struct group *gr;
>       struct passwd *pw;
> -     int Gflag, ch, gflag, nflag, pflag, rflag, uflag;
> +     int ch, cflag, Gflag, gflag, nflag, pflag, rflag, uflag;
>       uid_t uid;
>       gid_t gid;
>       const char *opts;
>  
> -     Gflag = gflag = nflag = pflag = rflag = uflag = 0;
> +     cflag = Gflag = gflag = nflag = pflag = rflag = uflag = 0;
>  
>       if (strcmp(getprogname(), "groups") == 0) {
>               Gflag = 1;
> @@ -72,10 +73,13 @@ main(int argc, char *argv[])
>               if (argc > 1)
>                       usage();
>       } else
> -             opts = "Ggnpru";
> +             opts = "cGgnpru";
>  
>       while ((ch = getopt(argc, argv, opts)) != -1)
>               switch(ch) {
> +             case 'c':
> +                     cflag = 1;
> +                     break;
>               case 'G':
>                       Gflag = 1;
>                       break;
> @@ -101,7 +105,7 @@ main(int argc, char *argv[])
>       argc -= optind;
>       argv += optind;
>  
> -     switch (Gflag + gflag + pflag + uflag) {
> +     switch (cflag + Gflag + gflag + pflag + uflag) {
>       case 1:
>               break;
>       case 0:
> @@ -117,6 +121,16 @@ main(int argc, char *argv[])
>  
>       pw = *argv ? who(*argv) : NULL;
>  
> +     if (cflag) {
> +             if (pw == NULL)
> +                     pw = getpwuid(getuid());
> +             if (pw != NULL && pw->pw_class != NULL && *pw->pw_class != '\0')
> +                     (void)printf("%s\n", pw->pw_class);
> +             else
> +                     (void)printf("%s\n", LOGIN_DEFCLASS);
> +             exit(0);
> +     }
> +
>       if (gflag) {
>               gid = pw ? pw->pw_gid : rflag ? getgid() : getegid();
>               if (nflag && (gr = getgrgid(gid)))
> @@ -325,6 +339,7 @@ usage(void)
>               (void)fprintf(stderr, "usage: whoami\n");
>       } else {
>               (void)fprintf(stderr, "usage: id [user]\n");
> +             (void)fprintf(stderr, "       id -c [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");
Since I asked for it, I obviously approve of this change.

Reply via email to