version 1.26, 2015/10/09 01:37:07 |
version 1.27, 2017/05/30 15:07:01 |
|
|
* SUCH DAMAGE. |
* SUCH DAMAGE. |
*/ |
*/ |
|
|
|
#include <sys/types.h> |
|
#include <sys/socket.h> /* getrtable() lives here */ |
|
|
#include <err.h> |
#include <err.h> |
#include <errno.h> |
#include <errno.h> |
#include <grp.h> |
#include <grp.h> |
|
|
{ |
{ |
struct group *gr; |
struct group *gr; |
struct passwd *pw; |
struct passwd *pw; |
int ch, cflag, Gflag, gflag, nflag, pflag, rflag, uflag; |
int ch, cflag, Gflag, gflag, nflag, pflag, Rflag, rflag, uflag; |
uid_t uid; |
uid_t uid; |
gid_t gid; |
gid_t gid; |
const char *opts; |
const char *opts; |
|
|
if (pledge("stdio getpw", NULL) == -1) |
if (pledge("stdio getpw", NULL) == -1) |
err(1, "pledge"); |
err(1, "pledge"); |
|
|
cflag = Gflag = gflag = nflag = pflag = rflag = uflag = 0; |
cflag = Gflag = gflag = nflag = pflag = Rflag = rflag = uflag = 0; |
|
|
if (strcmp(getprogname(), "groups") == 0) { |
if (strcmp(getprogname(), "groups") == 0) { |
Gflag = 1; |
Gflag = 1; |
|
|
if (argc > 1) |
if (argc > 1) |
usage(); |
usage(); |
} else |
} else |
opts = "cGgnpru"; |
opts = "cGgnpRru"; |
|
|
while ((ch = getopt(argc, argv, opts)) != -1) |
while ((ch = getopt(argc, argv, opts)) != -1) |
switch(ch) { |
switch(ch) { |
|
|
case 'p': |
case 'p': |
pflag = 1; |
pflag = 1; |
break; |
break; |
|
case 'R': |
|
Rflag = 1; |
|
break; |
case 'r': |
case 'r': |
rflag = 1; |
rflag = 1; |
break; |
break; |
|
|
argc -= optind; |
argc -= optind; |
argv += optind; |
argv += optind; |
|
|
switch (cflag + Gflag + gflag + pflag + uflag) { |
switch (cflag + Gflag + gflag + pflag + Rflag + uflag) { |
case 1: |
case 1: |
break; |
break; |
case 0: |
case 0: |
|
|
|
|
if (strcmp(opts, "") != 0 && argc > 1) |
if (strcmp(opts, "") != 0 && argc > 1) |
usage(); |
usage(); |
|
|
|
if (Rflag) { |
|
printf("%d\n", getrtable()); |
|
exit(0); |
|
} |
|
|
pw = *argv ? who(*argv) : NULL; |
pw = *argv ? who(*argv) : NULL; |
|
|