* Copyright (c) 1989 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
static char sccsid
[] = "@(#)print.c 5.2 (Berkeley) %G%";
LS
*stats
; /* the statted, sorted directory */
extern int (*lengthfcn
)();
long blocks
; /* sum of blocks in longform listing */
int i
; /* subscript to stats */
int maxlen
; /* length of longest name string */
int colwidth
; /* width of a printing column */
int numcols
; /* number of columns */
int collength
; /* lines in longest column */
int base
; /* subscript for leftmost column */
int offset
; /* delta from base to next column */
int chcnt
; /* character count printed */
for (entry
= 0; entry
< num
; ++entry
) {
(void)printaname(&stats
[entry
]);
for (i
= 0, blocks
= 0; i
< num
; ++i
)
blocks
+= stats
[i
].lstat
.st_blocks
;
(void)printf("total %ld\n", blocks
/ 2);
for (i
= 0; i
< num
; ++i
) {
(void)printf("%6lu ", stats
[i
].lstat
.st_ino
);
stats
[i
].lstat
.st_blocks
/ 2);
printperms(stats
[i
].lstat
.st_mode
);
(void)printf("%3d ", stats
[i
].lstat
.st_nlink
);
printowner(stats
[i
].lstat
.st_uid
);
printgrp(stats
[i
].lstat
.st_gid
);
if (S_ISCHR(stats
[i
].lstat
.st_mode
) ||
S_ISBLK(stats
[i
].lstat
.st_mode
))
major(stats
[i
].lstat
.st_rdev
),
minor(stats
[i
].lstat
.st_rdev
));
(void)printf("%8ld ", stats
[i
].lstat
.st_size
);
printtime(stats
[i
].lstat
.st_atime
);
printtime(stats
[i
].lstat
.st_ctime
);
printtime(stats
[i
].lstat
.st_mtime
);
(void)printf("%s", stats
[i
].name
);
(void)printtype(stats
[i
].lstat
.st_mode
);
if (S_ISLNK(stats
[i
].lstat
.st_mode
))
printlink(stats
[i
].name
);
* assume tabs every 8 columns WARNING: bad code (hard coded
/* figure out max width */
for (i
= 0; i
< num
; ++i
) {
if (maxlen
< lengthfcn(stats
[i
].name
))
maxlen
= lengthfcn(stats
[i
].name
);
/* add fudge factors to max name length */
/* one tab after maxlen */
colwidth
= (maxlen
+ 9) & ~0x7;
numcols
= (80 + colwidth
- maxlen
) / colwidth
;
collength
= (int)((float)num
/ (float)numcols
+ 0.999);
for (base
= 0; base
< collength
; base
++) {
for (offset
= 0, i
= 0; i
< numcols
; ++i
, offset
+= collength
) {
if (base
+ offset
>= num
)
chcnt
= printaname(&stats
[base
+ offset
]);
if (base
+ offset
+ collength
< num
) {
while (chcnt
+ 8 < colwidth
) {
chcnt
= (chcnt
+ 8) & ~0x7;
(void)printaname(&stats
[base
+ offset
]);
* print [inode] [size] name
* return # of characters printed, no trailing characters
chcnt
+= printf("%5lu ", entry
->lstat
.st_ino
);
chcnt
+= printf("%4ld ", entry
->lstat
.st_blocks
/ 2);
chcnt
+= printf("%s", entry
->name
);
chcnt
+= printtype(entry
->lstat
.st_mode
);
* print group and user name
struct group
*groupentry
;
if ((groupentry
= getgrgid((int)gid
)) == NULL
) {
/* can't find group, print out number instead */
(void)printf("%-9u ", gid
);
(void)printf("%-9s", groupentry
->gr_name
);
(void)getgrent(); /* to rewind group file */
if ((pwentry
= getpwuid((int)uid
)) == NULL
) {
/* can't find owner, print out number instead */
(void)printf("%-9u ", uid
);
(void)printf("%-9s", pwentry
->pw_name
);
char *longstring
, *ctime();
longstring
= ctime((long *)&ftime
);
(void)putchar(longstring
[i
]);
#define SIXMONTHS ((DAYSPERNYEAR / 2) * SECSPERDAY)
if (ftime
+ SIXMONTHS
> time((time_t *)NULL
))
for (i
= 11; i
< 16; ++i
)
(void)putchar(longstring
[i
]);
for (i
= 20; i
< 24; ++i
)
(void)putchar(longstring
[i
]);
* do the permissions printing, passed the mode
case S_IFDIR
: /* directory */
case S_IFCHR
: /* character special */
case S_IFBLK
: /* block special */
case S_IFREG
: /* regular */
case S_IFLNK
: /* symbolic link */
case S_IFSOCK
: /* socket */
switch (mode
& (S_IXUSR
| S_ISUID
)) {
switch (mode
& (S_IXGRP
| S_ISGID
)) {
switch (mode
& (S_IXOTH
| S_ISVTX
)) {
if (mode
& (S_IXUSR
| S_IXGRP
| S_IXOTH
)) {
char path
[MAXPATHLEN
+ 1], *strerror();
if ((lnklen
= readlink(name
, path
, MAXPATHLEN
)) == -1) {
(void)fprintf(stderr
, "\nls: %s: %s\n", name
, strerror(errno
));
(void)printf(" -> %s", path
);