#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <errno.h>
#include <grp.h>
#include <string.h>

int
main(int argc, char *argv[])
{
    struct group *group;
    void usage(void);

    if (argc != 3)
        usage();

    if (strcmp(argv[1], "name") == 0)
        group = getgrnam(argv[2]);
    else if (strcmp(argv[1], "id") == 0)
        group = getgrgid(atoi(argv[2]));
    else
        usage();

    if (group != NULL) {
        printf("gr_name  =%s\n", group->gr_name);
        printf("gr_passwd=%s\n", group->gr_passwd);
        printf("gr_gid   =%ld\n", (long) group->gr_gid);
        printf("gr_mem   =");

        if (*group->gr_mem)
            for (char **p = group->gr_mem; *p != NULL; p++)
                printf("%s%s", *p, *(p + 1) != NULL ? "," : "\n");
        else
            printf("\n");

    } else {
        if (errno)
            err(EXIT_FAILURE, "%s", argv[1]);
        else
            errx(EXIT_FAILURE, "%s=%s: user not found", argv[1], argv[2]);
    }

    exit(EXIT_SUCCESS);
}

void
usage(void)
{
    errx(EXIT_FAILURE, "usage: %s {name|id} group_name|group_id",
            program_invocation_short_name);
}
