#define _GNU_SOURCE             /* for program_invocation_short_name */

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

void usage(void);

int
main(int argc, char *argv[])
{
    struct passwd *passwd;

    if (argc != 3)
        usage();

    if (strcmp(argv[1], "name") == 0)
        passwd = getpwnam(argv[2]);
    else if (strcmp(argv[1], "id") == 0)
        passwd = getpwuid(atoi(argv[2]));
    else
        usage();

    if (passwd != NULL) {
        printf("pw_name  =%s\n", passwd->pw_name);
        printf("pw_passwd=%s\n", passwd->pw_passwd);
        printf("pw_uid   =%ld\n", (long) passwd->pw_uid);
        printf("pw_gid   =%ld\n", (long) passwd->pw_gid);
        printf("pw_gecos =%s\n", passwd->pw_gecos);
        printf("pw_dir   =%s\n", passwd->pw_dir);
        printf("pw_shell =%s\n", passwd->pw_shell);
    }
    else {
        errx(EXIT_FAILURE, "getpwnam: error or user not found");
    }

    exit(EXIT_SUCCESS);
}

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