xref: /original-bsd/usr.bin/find/ls.c (revision 7100ea1c)
1a71df8faSbostic /*
2*7100ea1cSbostic  * Copyright (c) 1989, 1993
3*7100ea1cSbostic  *	The Regents of the University of California.  All rights reserved.
4a71df8faSbostic  *
5793e0bc1Sbostic  * %sccs.include.redist.c%
6a71df8faSbostic  */
7a71df8faSbostic 
8a71df8faSbostic #ifndef lint
9*7100ea1cSbostic static char sccsid[] = "@(#)ls.c	8.1 (Berkeley) 06/06/93";
10a71df8faSbostic #endif /* not lint */
11a71df8faSbostic 
12a71df8faSbostic #include <sys/param.h>
13a71df8faSbostic #include <sys/stat.h>
140ec8e947Sbostic 
150ec8e947Sbostic #include <err.h>
16bccf0789Sbostic #include <errno.h>
17a71df8faSbostic #include <stdio.h>
18bccf0789Sbostic #include <string.h>
190ec8e947Sbostic #include <time.h>
200ec8e947Sbostic #include <tzfile.h>
210ec8e947Sbostic #include <unistd.h>
220ec8e947Sbostic #include <utmp.h>
23a71df8faSbostic 
24a71df8faSbostic /* Derived from the print routines in the ls(1) source code. */
25a71df8faSbostic 
260ec8e947Sbostic static void printlink __P((char *));
270ec8e947Sbostic static void printtime __P((time_t));
280ec8e947Sbostic 
29a71df8faSbostic void
printlong(name,accpath,sb)30a71df8faSbostic printlong(name, accpath, sb)
31a71df8faSbostic 	char *name;			/* filename to print */
32a71df8faSbostic 	char *accpath;			/* current valid path to filename */
33a71df8faSbostic 	struct stat *sb;		/* stat buffer */
34a71df8faSbostic {
35bccf0789Sbostic 	char modep[15], *user_from_uid(), *group_from_gid();
36a71df8faSbostic 
37cca3d8fbSbostic 	(void)printf("%6lu %4qd ", sb->st_ino, sb->st_blocks);
38067be296Sbostic 	(void)strmode(sb->st_mode, modep);
399083969dSbostic 	(void)printf("%s %3u %-*s %-*s ", modep, sb->st_nlink, UT_NAMESIZE,
40a71df8faSbostic 	    user_from_uid(sb->st_uid, 0), UT_NAMESIZE,
41a71df8faSbostic 	    group_from_gid(sb->st_gid, 0));
42a71df8faSbostic 
43a71df8faSbostic 	if (S_ISCHR(sb->st_mode) || S_ISBLK(sb->st_mode))
44a71df8faSbostic 		(void)printf("%3d, %3d ", major(sb->st_rdev),
45a71df8faSbostic 		    minor(sb->st_rdev));
46a71df8faSbostic 	else
47cca3d8fbSbostic 		(void)printf("%8qd ", sb->st_size);
48a71df8faSbostic 	printtime(sb->st_mtime);
49a71df8faSbostic 	(void)printf("%s", name);
50a71df8faSbostic 	if (S_ISLNK(sb->st_mode))
51a71df8faSbostic 		printlink(accpath);
52a71df8faSbostic 	(void)putchar('\n');
53a71df8faSbostic }
54a71df8faSbostic 
550ec8e947Sbostic static void
printtime(ftime)56a71df8faSbostic printtime(ftime)
57a71df8faSbostic 	time_t ftime;
58a71df8faSbostic {
59a71df8faSbostic 	int i;
60a71df8faSbostic 	char *longstring, *ctime();
61a71df8faSbostic 	time_t time();
62a71df8faSbostic 
63a71df8faSbostic 	longstring = ctime((long *)&ftime);
64a71df8faSbostic 	for (i = 4; i < 11; ++i)
65a71df8faSbostic 		(void)putchar(longstring[i]);
66a71df8faSbostic 
67a71df8faSbostic #define	SIXMONTHS	((DAYSPERNYEAR / 2) * SECSPERDAY)
68a71df8faSbostic 	if (ftime + SIXMONTHS > time((time_t *)NULL))
69a71df8faSbostic 		for (i = 11; i < 16; ++i)
70a71df8faSbostic 			(void)putchar(longstring[i]);
71a71df8faSbostic 	else {
72a71df8faSbostic 		(void)putchar(' ');
73a71df8faSbostic 		for (i = 20; i < 24; ++i)
74a71df8faSbostic 			(void)putchar(longstring[i]);
75a71df8faSbostic 	}
76a71df8faSbostic 	(void)putchar(' ');
77a71df8faSbostic }
78a71df8faSbostic 
790ec8e947Sbostic static void
printlink(name)80a71df8faSbostic printlink(name)
81a71df8faSbostic 	char *name;
82a71df8faSbostic {
83a71df8faSbostic 	int lnklen;
84bccf0789Sbostic 	char path[MAXPATHLEN + 1];
85a71df8faSbostic 
86a71df8faSbostic 	if ((lnklen = readlink(name, path, MAXPATHLEN)) == -1) {
870ec8e947Sbostic 		warn("%s", name);
88a71df8faSbostic 		return;
89a71df8faSbostic 	}
90a71df8faSbostic 	path[lnklen] = '\0';
91a71df8faSbostic 	(void)printf(" -> %s", path);
92a71df8faSbostic }
93