]>
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
);