xref: /original-bsd/usr.bin/find/ls.c (revision bccf0789)
1a71df8faSbostic /*
2a71df8faSbostic  * Copyright (c) 1989 The Regents of the University of California.
3a71df8faSbostic  * All rights reserved.
4a71df8faSbostic  *
5793e0bc1Sbostic  * %sccs.include.redist.c%
6a71df8faSbostic  */
7a71df8faSbostic 
8a71df8faSbostic #ifndef lint
9*bccf0789Sbostic static char sccsid[] = "@(#)ls.c	5.6 (Berkeley) 03/09/91";
10a71df8faSbostic #endif /* not lint */
11a71df8faSbostic 
12a71df8faSbostic #include <sys/param.h>
13a71df8faSbostic #include <sys/stat.h>
14*bccf0789Sbostic #include <time.h>
15a71df8faSbostic #include <tzfile.h>
16*bccf0789Sbostic #include <errno.h>
17a71df8faSbostic #include <utmp.h>
18*bccf0789Sbostic #include <unistd.h>
19a71df8faSbostic #include <stdio.h>
20*bccf0789Sbostic #include <string.h>
21a71df8faSbostic 
22a71df8faSbostic /* Derived from the print routines in the ls(1) source code. */
23a71df8faSbostic 
24a71df8faSbostic void
25a71df8faSbostic printlong(name, accpath, sb)
26a71df8faSbostic 	char *name;			/* filename to print */
27a71df8faSbostic 	char *accpath;			/* current valid path to filename */
28a71df8faSbostic 	struct stat *sb;		/* stat buffer */
29a71df8faSbostic {
30*bccf0789Sbostic 	char modep[15], *user_from_uid(), *group_from_gid();
31a71df8faSbostic 
32a71df8faSbostic 	(void)printf("%6lu %4ld ", sb->st_ino, sb->st_blocks);
33067be296Sbostic 	(void)strmode(sb->st_mode, modep);
349083969dSbostic 	(void)printf("%s %3u %-*s %-*s ", modep, sb->st_nlink, UT_NAMESIZE,
35a71df8faSbostic 	    user_from_uid(sb->st_uid, 0), UT_NAMESIZE,
36a71df8faSbostic 	    group_from_gid(sb->st_gid, 0));
37a71df8faSbostic 
38a71df8faSbostic 	if (S_ISCHR(sb->st_mode) || S_ISBLK(sb->st_mode))
39a71df8faSbostic 		(void)printf("%3d, %3d ", major(sb->st_rdev),
40a71df8faSbostic 		    minor(sb->st_rdev));
41a71df8faSbostic 	else
42a71df8faSbostic 		(void)printf("%8ld ", sb->st_size);
43a71df8faSbostic 	printtime(sb->st_mtime);
44a71df8faSbostic 	(void)printf("%s", name);
45a71df8faSbostic 	if (S_ISLNK(sb->st_mode))
46a71df8faSbostic 		printlink(accpath);
47a71df8faSbostic 	(void)putchar('\n');
48a71df8faSbostic }
49a71df8faSbostic 
50a71df8faSbostic printtime(ftime)
51a71df8faSbostic 	time_t ftime;
52a71df8faSbostic {
53a71df8faSbostic 	int i;
54a71df8faSbostic 	char *longstring, *ctime();
55a71df8faSbostic 	time_t time();
56a71df8faSbostic 
57a71df8faSbostic 	longstring = ctime((long *)&ftime);
58a71df8faSbostic 	for (i = 4; i < 11; ++i)
59a71df8faSbostic 		(void)putchar(longstring[i]);
60a71df8faSbostic 
61a71df8faSbostic #define	SIXMONTHS	((DAYSPERNYEAR / 2) * SECSPERDAY)
62a71df8faSbostic 	if (ftime + SIXMONTHS > time((time_t *)NULL))
63a71df8faSbostic 		for (i = 11; i < 16; ++i)
64a71df8faSbostic 			(void)putchar(longstring[i]);
65a71df8faSbostic 	else {
66a71df8faSbostic 		(void)putchar(' ');
67a71df8faSbostic 		for (i = 20; i < 24; ++i)
68a71df8faSbostic 			(void)putchar(longstring[i]);
69a71df8faSbostic 	}
70a71df8faSbostic 	(void)putchar(' ');
71a71df8faSbostic }
72a71df8faSbostic 
73a71df8faSbostic printlink(name)
74a71df8faSbostic 	char *name;
75a71df8faSbostic {
76a71df8faSbostic 	int lnklen;
77*bccf0789Sbostic 	char path[MAXPATHLEN + 1];
78a71df8faSbostic 
79a71df8faSbostic 	if ((lnklen = readlink(name, path, MAXPATHLEN)) == -1) {
80*bccf0789Sbostic 		(void)fprintf(stderr,
81*bccf0789Sbostic 		    "\nfind: %s: %s\n", name, strerror(errno));
82a71df8faSbostic 		return;
83a71df8faSbostic 	}
84a71df8faSbostic 	path[lnklen] = '\0';
85a71df8faSbostic 	(void)printf(" -> %s", path);
86a71df8faSbostic }
87