sbase

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

commit 17338bfbb881d7944b6ac975c97941fee6036d1c
parent 795ffe490d24a6e85b7717f9ad6ec7b29469500e
Author: sin <sin@2f30.org>
Date:   Thu, 27 Feb 2014 14:26:22 +0000

id(1) is not portable - move it to ubase

Diffstat:
Makefile | 1-
id.1 | 18------------------
id.c | 132-------------------------------------------------------------------------------
3 files changed, 0 insertions(+), 151 deletions(-)

diff --git a/Makefile b/Makefile @@ -50,7 +50,6 @@ SRC = \ grep.c \ head.c \ hostname.c \ - id.c \ kill.c \ ln.c \ ls.c \ diff --git a/id.1 b/id.1 @@ -1,18 +0,0 @@ -.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 @@ -1,132 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include <sys/types.h> -#include <errno.h> -#include <unistd.h> -#include <pwd.h> -#include <grp.h> -#include <stdio.h> -#include <stdlib.h> -#include <limits.h> -#include <ctype.h> -#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'); -}