sbase

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

commit cd592c9f23ba822f506775c3bbd8d2185a089161
parent bb39bc9596a73f18b98fb6188b54661b357a4127
Author: sin <sin@2f30.org>
Date:   Wed Aug  7 13:40:21 +0100

Add initial support for id(1)

Diffstat:
Makefile | 1+
id.1 | 8++++++++
id.c | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 79 insertions(+), 0 deletions(-)
diff --git a/Makefile b/Makefile @@ -46,6 +46,7 @@ SRC = \ fold.c \ grep.c \ head.c \ + id.c \ kill.c \ ln.c \ ls.c \ diff --git a/id.1 b/id.1 @@ -0,0 +1,8 @@ +.TH ID 1 sbase\-VERSION +.SH NAME +id \- print real and effective user and group IDs +.SH DESCRIPTION +.B id +Print user and group information for the current user. +.SH SEE ALSO +.IR who(1) diff --git a/id.c b/id.c @@ -0,0 +1,70 @@ +/* See LICENSE file for copyright and license details. */ +#include <sys/types.h> +#include <unistd.h> +#include <pwd.h> +#include <grp.h> +#include <stdio.h> +#include <limits.h> +#include "util.h" + +static void +usage(void) +{ + eprintf("usage: %s\n", argv0); +} + +int +main(int argc, char *argv[]) +{ + struct passwd *pw; + struct group *gr; + uid_t uid, euid; + gid_t gid, egid, groups[NGROUPS_MAX]; + int ngroups; + int i; + + ARGBEGIN { + default: + usage(); + } ARGEND; + + /* Print uid/euid info */ + uid = getuid(); + printf("uid=%u", uid); + if (!(pw = getpwuid(uid))) + eprintf("getpwuid:"); + printf("(%s)", pw->pw_name); + if ((euid = geteuid()) != uid) { + printf(" euid=%u", euid); + if (!(pw = getpwuid(euid))) + eprintf("getpwuid:"); + printf("(%s)", pw->pw_name); + } + + /* Print gid/egid info */ + gid = getgid(); + printf(" gid=%u", gid); + if (!(gr = getgrgid(gid))) + eprintf("getgrgid:"); + printf("(%s)", gr->gr_name); + if ((egid = getegid()) != gid) { + printf(" egid=%u", egid); + if (!(gr = getgrgid(egid))) + eprintf("getgrgid:"); + printf("(%s)", gr->gr_name); + } + + /* Print groups */ + ngroups = getgroups(NGROUPS_MAX, groups); + if (ngroups < 0) + eprintf("getgroups:"); + 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'); + return 0; +}