#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <pwd.h>
#include <grp.h>

int main(int argc, char *argv[]) {
int i;
struct stat buf;
char *desc_str;
struct passwd *userinfo;
struct group *groupinfo;

for (i = 1; i < argc; i++) {
	printf("%s: ", argv[i]);
	if (lstat(argv[i], &buf) == -1) {
		puts(strerror(errno));
		continue;
	}
	else if (S_ISREG(buf.st_mode)) desc_str = "-";
	else if (S_ISDIR(buf.st_mode)) desc_str = "d";
	else if (S_ISCHR(buf.st_mode)) desc_str = "c";
	else if (S_ISBLK(buf.st_mode)) desc_str = "b";
	else if (S_ISFIFO(buf.st_mode)) desc_str = "p";
	else if (S_ISLNK(buf.st_mode)) desc_str = "l";
#ifdef S_ISSOCK
	else if (S_ISSOCK(buf.st_mode)) desc_str = "s";
#endif
	else desc_str = "u"; /* u for unknown */
	printf("%s", desc_str);

	/* user perms */
	if (buf.st_mode & S_IRUSR)
		putchar('r');
	else 
		putchar('-');
	if (buf.st_mode & S_IWUSR)
		putchar('w');
	else 
		putchar('-');
	if (buf.st_mode & S_ISUID)
		putchar('s');
	else if (buf.st_mode & S_IXUSR)
		putchar('x');
	else
		putchar('-');

	/* group perms */
	if (buf.st_mode & S_IRGRP)
		putchar('r');
	else 
		putchar('-');
	if (buf.st_mode & S_IWGRP)
		putchar('w');
	else 
		putchar('-');
	if (buf.st_mode & S_ISGID)
		putchar('s');
	else if (buf.st_mode & S_IXGRP)
		putchar('x');
	else
		putchar('-');

	/* other perms */
	if (buf.st_mode & S_IROTH)
		putchar('r');
	else 
		putchar('-');
	if (buf.st_mode & S_IWOTH)
		putchar('w');
	else 
		putchar('-');
	if (buf.st_mode & S_ISVTX)
		putchar('t');
	else if (buf.st_mode & S_IXGRP)
		putchar('x');
	else
		putchar('-');
	
	printf("\t%ld", buf.st_size);

        userinfo = getpwuid(buf.st_uid);
        groupinfo = getgrgid(buf.st_gid);
        if (userinfo != NULL)
		printf("\t%s", (userinfo->pw_name));
	else
		printf("\t%ld", (long)(buf.st_uid));

        if (groupinfo != NULL)
		printf("\t%s", (groupinfo->gr_name));
	else
		printf("\t%ld", (long)(buf.st_gid));
	putchar('\n');

	
}
return 0;
}
