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*0ec8e947Sbostic static char sccsid[] = "@(#)ls.c 5.8 (Berkeley) 05/01/93"; 10a71df8faSbostic #endif /* not lint */ 11a71df8faSbostic 12a71df8faSbostic #include <sys/param.h> 13a71df8faSbostic #include <sys/stat.h> 14*0ec8e947Sbostic 15*0ec8e947Sbostic #include <err.h> 16bccf0789Sbostic #include <errno.h> 17a71df8faSbostic #include <stdio.h> 18bccf0789Sbostic #include <string.h> 19*0ec8e947Sbostic #include <time.h> 20*0ec8e947Sbostic #include <tzfile.h> 21*0ec8e947Sbostic #include <unistd.h> 22*0ec8e947Sbostic #include <utmp.h> 23a71df8faSbostic 24a71df8faSbostic /* Derived from the print routines in the ls(1) source code. */ 25a71df8faSbostic 26*0ec8e947Sbostic static void printlink __P((char *)); 27*0ec8e947Sbostic static void printtime __P((time_t)); 28*0ec8e947Sbostic 29a71df8faSbostic void 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 55*0ec8e947Sbostic static void 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 79*0ec8e947Sbostic static void 80a71df8faSbostic printlink(name) 81a71df8faSbostic char *name; 82a71df8faSbostic { 83a71df8faSbostic int lnklen; 84bccf0789Sbostic char path[MAXPATHLEN + 1]; 85a71df8faSbostic 86a71df8faSbostic if ((lnklen = readlink(name, path, MAXPATHLEN)) == -1) { 87*0ec8e947Sbostic warn("%s", name); 88a71df8faSbostic return; 89a71df8faSbostic } 90a71df8faSbostic path[lnklen] = '\0'; 91a71df8faSbostic (void)printf(" -> %s", path); 92a71df8faSbostic } 93