]>
git.saurik.com Git - apple/file_cmds.git/blob - ls/print.c
1 /* $NetBSD: print.c,v 1.22 1998/07/28 05:15:47 mycroft Exp $ */
4 * Copyright (c) 1989, 1993, 1994
5 * The Regents of the University of California. All rights reserved.
7 * This code is derived from software contributed to Berkeley by
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the University of
21 * California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 #include <sys/cdefs.h>
42 static char sccsid
[] = "@(#)print.c 8.5 (Berkeley) 7/28/94";
44 __RCSID("$NetBSD: print.c,v 1.22 1998/07/28 05:15:47 mycroft Exp $");
48 #include <sys/param.h>
67 static int printaname
__P((FTSENT
*, int, int));
68 static void printlink
__P((FTSENT
*));
69 static void printtime
__P((time_t));
70 static int printtype
__P((u_int
));
74 #define IS_NOPRINT(p) ((p)->fts_number == NO_PRINT)
82 for (p
= dp
->list
; p
; p
= p
->fts_link
) {
85 (void)printaname(p
, dp
->s_inode
, dp
->s_block
);
98 char nbuf
[MAXPATHLEN
+ 1], *name
;
102 if (dp
->list
->fts_level
!= FTS_ROOTLEVEL
&& (f_longform
|| f_size
))
103 (void)printf("total %qu\n",
104 (long long)(howmany(dp
->btotal
, blocksize
)));
106 for (p
= dp
->list
; p
; p
= p
->fts_link
) {
111 (void)printf("%*u ", dp
->s_inode
, sp
->st_ino
);
113 (void)printf("%*qu ", dp
->s_block
,
114 (long long)howmany(sp
->st_blocks
, blocksize
));
115 (void)strmode(sp
->st_mode
, buf
);
117 (void)printf("%s %*u %-*s %-*s ", buf
, dp
->s_nlink
,
118 sp
->st_nlink
, dp
->s_user
, np
->user
, dp
->s_group
,
121 (void)printf("%-*s ", dp
->s_flags
, np
->flags
);
122 if (S_ISCHR(sp
->st_mode
) || S_ISBLK(sp
->st_mode
))
123 (void)printf("%*u, %*u ",
124 dp
->s_major
, major(sp
->st_rdev
), dp
->s_minor
,
127 (void)printf("%*qu ", dp
->s_size
,
128 (long long)sp
->st_size
);
130 printtime(sp
->st_atime
);
131 else if (f_statustime
)
132 printtime(sp
->st_ctime
);
134 printtime(sp
->st_mtime
);
136 prcopy(p
->fts_name
, nbuf
, p
->fts_namelen
+1);
140 (void)printf("%s", name
);
142 (void)printtype(sp
->st_mode
);
143 if (S_ISLNK(sp
->st_mode
))
153 extern int termwidth
;
154 static FTSENT
**array
;
155 static int lastentries
= -1;
157 int base
, chcnt
, col
, colwidth
, num
;
158 int numcols
, numrows
, row
;
160 colwidth
= dp
->maxlen
;
162 colwidth
+= dp
->s_inode
+ 1;
164 colwidth
+= dp
->s_block
+ 1;
170 if (termwidth
< 2 * colwidth
) {
176 * Have to do random access in the linked list -- build a table
179 if (dp
->entries
> lastentries
) {
180 lastentries
= dp
->entries
;
182 realloc(array
, dp
->entries
* sizeof(FTSENT
*))) == NULL
) {
187 for (p
= dp
->list
, num
= 0; p
; p
= p
->fts_link
)
188 if (p
->fts_number
!= NO_PRINT
)
191 numcols
= termwidth
/ colwidth
;
192 colwidth
= termwidth
/ numcols
; /* spread out if possible */
193 numrows
= num
/ numcols
;
197 if (dp
->list
->fts_level
!= FTS_ROOTLEVEL
&& (f_longform
|| f_size
))
198 (void)printf("total %qu\n",
199 (long long)(howmany(dp
->btotal
, blocksize
)));
200 for (row
= 0; row
< numrows
; ++row
) {
201 for (base
= row
, chcnt
= col
= 0; col
< numcols
; ++col
) {
202 chcnt
= printaname(array
[base
], dp
->s_inode
,
204 if ((base
+= numrows
) >= num
)
206 while (chcnt
++ < colwidth
)
217 extern int termwidth
;
219 int chcnt
, col
, colwidth
;
222 colwidth
= dp
->maxlen
;
224 colwidth
+= dp
->s_inode
+ 1;
226 colwidth
+= dp
->s_block
+ 1;
232 if (termwidth
< 2 * colwidth
) {
237 numcols
= termwidth
/ colwidth
;
238 colwidth
= termwidth
/ numcols
; /* spread out if possible */
240 if (dp
->list
->fts_level
!= FTS_ROOTLEVEL
&& (f_longform
|| f_size
))
241 (void)printf("total %qu\n",
242 (long long)(howmany(dp
->btotal
, blocksize
)));
244 for (p
= dp
->list
; p
; p
= p
->fts_link
) {
247 if (col
>= numcols
) {
251 chcnt
= printaname(p
, dp
->s_inode
, dp
->s_block
);
252 while (chcnt
++ < colwidth
)
260 * print [inode] [size] name
261 * return # of characters printed, no trailing characters.
264 printaname(p
, inodefield
, sizefield
)
266 int sizefield
, inodefield
;
270 char nbuf
[MAXPATHLEN
+ 1], *name
;
275 chcnt
+= printf("%*u ", inodefield
, sp
->st_ino
);
277 chcnt
+= printf("%*qu ", sizefield
,
278 (long long)howmany(sp
->st_blocks
, blocksize
));
280 prcopy(p
->fts_name
, nbuf
, p
->fts_namelen
+1);
284 chcnt
+= printf("%s", name
);
286 chcnt
+= printtype(sp
->st_mode
);
297 longstring
= ctime(&ftime
);
298 for (i
= 4; i
< 11; ++i
)
299 (void)putchar(longstring
[i
]);
301 #define SIXMONTHS ((DAYSPERNYEAR / 2) * SECSPERDAY)
303 for (i
= 11; i
< 24; i
++)
304 (void)putchar(longstring
[i
]);
305 else if (ftime
+ SIXMONTHS
> now
&& ftime
- SIXMONTHS
< now
)
306 for (i
= 11; i
< 16; ++i
)
307 (void)putchar(longstring
[i
]);
310 for (i
= 20; i
< 24; ++i
)
311 (void)putchar(longstring
[i
]);
320 switch (mode
& S_IFMT
) {
337 if (mode
& (S_IXUSR
| S_IXGRP
| S_IXOTH
)) {
349 char name
[MAXPATHLEN
+ 1], path
[MAXPATHLEN
+ 1];
351 if (p
->fts_level
== FTS_ROOTLEVEL
)
352 (void)snprintf(name
, sizeof(name
), "%s", p
->fts_name
);
354 (void)snprintf(name
, sizeof(name
),
355 "%s/%s", p
->fts_parent
->fts_accpath
, p
->fts_name
);
356 prcopy(name
, name
, strlen(name
));
357 if ((lnklen
= readlink(name
, path
, sizeof(path
) - 1)) == -1) {
358 (void)fprintf(stderr
, "\nls: %s: %s\n", name
, strerror(errno
));
362 (void)printf(" -> %s", path
);