#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <sys/utsname.h>
#include <errno.h>
#include <stdlib.h>
#include <getopt.h>

void usage(char * progname)
{
	printf("Uzycie: %s [-s|-u LOGIN]\n\n\t-s\t\tWyswietla informacje o systemie.\n\t-u LOGIN\tWyswietla informacje o uzytkowniku LOGIN.\n", progname);
}

void printSystemInfo(void)
{
	struct utsname myUname;

	errno = (int)NULL;
	if (uname(&myUname) != 0)
	{
		perror("Blad uname()");
		exit(1);
	}

	printf("uname(): sysname[]:\t%s\n", myUname.sysname);
	printf("uname(): nodename[]:\t%s\n", myUname.nodename);
	printf("uname(): release[]:\t%s\n", myUname.release);
	printf("uname(): version[]:\t%s\n", myUname.version);
	printf("uname(): machine[]:\t%s\n", myUname.machine);
	#ifdef _GNU_SOURCE
		printf("uname(): domainname[]:\t%s\n", myUname.domainname);
	#endif
}

void printUserInfo(char * login)
{
	struct passwd * myPasswd;
	errno = (int)NULL;
	myPasswd = getpwnam(login);
	if (!myPasswd)
	{
		perror("Blad getpwnam()");
		exit(1);
	}

	printf("UID:\t\t\t%i\n", myPasswd->pw_uid);
	printf("Imie i Nazwisko:\t%s\n", myPasswd->pw_gecos);
}

int main (int argc, char ** argv)
{
	int getoptRet;

	getoptRet = getopt(argc, argv, "su:");
	if ((argc != 3 && argc != 2 ) || getoptRet == -1)
	{
		usage(argv[0]);
		return(1);
	}

	switch (getoptRet)
	{
		case 's':
			printSystemInfo();
			break;
		case 'u':
			printUserInfo(optarg);
			break;
		default:
			usage(argv[0]);
			return(1);
	}
	return(0);
}
