1/* 2 * Copyright (c) 1989, 1993, 1994 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Michael Fischbein. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 25 unchanged lines hidden (view full) --- 34 * SUCH DAMAGE. 35 */ 36 37#ifndef lint 38#if 0 39static char sccsid[] = "@(#)print.c 8.4 (Berkeley) 4/17/94"; 40#else 41static const char rcsid[] = |
42 "$FreeBSD: head/bin/ls/print.c 88586 2001-12-28 18:43:32Z joe $"; |
43#endif 44#endif /* not lint */ 45 46#include <sys/param.h> 47#include <sys/stat.h> 48 49#include <err.h> 50#include <errno.h> --- 24 unchanged lines hidden (view full) --- 75static int colortype __P((mode_t)); 76#endif 77 78#define IS_NOPRINT(p) ((p)->fts_number == NO_PRINT) 79 80#ifdef COLORLS 81/* Most of these are taken from <sys/stat.h> */ 82typedef enum Colors { |
83 C_DIR, /* directory */ 84 C_LNK, /* symbolic link */ 85 C_SOCK, /* socket */ 86 C_FIFO, /* pipe */ 87 C_EXEC, /* executable */ 88 C_BLK, /* block special */ 89 C_CHR, /* character special */ 90 C_SUID, /* setuid executable */ 91 C_SGID, /* setgid executable */ 92 C_WSDIR, /* directory writeble to others, with sticky bit */ 93 C_WDIR, /* directory writeble to others, without sticky bit */ 94 C_NUMCOLORS /* just a place-holder */ 95} Colors; |
96 97char *defcolors = "exfxcxdxbxegedabagacad"; 98 99/* colors for file types */ 100static struct { |
101 int num[2]; 102 int bold; |
103} colors[C_NUMCOLORS]; 104 105#endif 106 107void 108printscol(dp) |
109 DISPLAY *dp; |
110{ |
111 FTSENT *p; |
112 113 for (p = dp->list; p; p = p->fts_link) { 114 if (IS_NOPRINT(p)) 115 continue; 116 (void)printaname(p, dp->s_inode, dp->s_block); 117 (void)putchar('\n'); 118 } 119} --- 13 unchanged lines hidden (view full) --- 133 return printf("%s", name); 134} 135 136void 137printlong(dp) 138 DISPLAY *dp; 139{ 140 struct stat *sp; |
141 FTSENT *p; 142 NAMES *np; 143 char buf[20]; |
144#ifdef COLORLS |
145 int color_printed = 0; |
146#endif 147 148 if (dp->list->fts_level != FTS_ROOTLEVEL && (f_longform || f_size)) 149 (void)printf("total %lu\n", howmany(dp->btotal, blocksize)); 150 151 for (p = dp->list; p; p = p->fts_link) { 152 if (IS_NOPRINT(p)) 153 continue; --- 45 unchanged lines hidden (view full) --- 199 if (S_ISLNK(sp->st_mode)) 200 printlink(p); 201 (void)putchar('\n'); 202 } 203} 204 205void 206printcol(dp) |
207 DISPLAY *dp; |
208{ 209 extern int termwidth; 210 static FTSENT **array; 211 static int lastentries = -1; |
212 FTSENT *p; 213 int base; 214 int chcnt; 215 int cnt; 216 int col; 217 int colwidth; 218 int endcol; 219 int num; 220 int numcols; 221 int numrows; 222 int row; 223 int tabwidth; |
224 225 if (f_notabs) 226 tabwidth = 1; 227 else 228 tabwidth = 8; 229 230 /* 231 * Have to do random access in the linked list -- build a table --- 51 unchanged lines hidden (view full) --- 283} 284 285/* 286 * print [inode] [size] name 287 * return # of characters printed, no trailing characters. 288 */ 289static int 290printaname(p, inodefield, sizefield) |
291 FTSENT *p; 292 u_long inodefield; 293 u_long sizefield; |
294{ 295 struct stat *sp; |
296 int chcnt; |
297#ifdef COLORLS |
298 int color_printed = 0; |
299#endif 300 301 sp = p->fts_statp; 302 chcnt = 0; 303 if (f_inode) 304 chcnt += printf("%*lu ", (int)inodefield, (u_long)sp->st_ino); 305 if (f_size) 306 chcnt += printf("%*qd ", --- 9 unchanged lines hidden (view full) --- 316#endif 317 if (f_type) 318 chcnt += printtype(sp->st_mode); 319 return (chcnt); 320} 321 322static void 323printtime(ftime) |
324 time_t ftime; |
325{ |
326 char longstring[80]; 327 static time_t now; 328 const char *format; 329 static int d_first = -1; |
330 331 if (d_first < 0) 332 d_first = (*nl_langinfo(D_MD_ORDER) == 'd'); 333 if (now == 0) 334 now = time(NULL); 335 336#define SIXMONTHS ((365 / 2) * 86400) 337 if (f_sectime) --- 6 unchanged lines hidden (view full) --- 344 /* mmm dd yyyy || dd mmm yyyy */ 345 format = d_first ? "%e %b %Y " : "%b %e %Y "; 346 strftime(longstring, sizeof(longstring), format, localtime(&ftime)); 347 fputs(longstring, stdout); 348} 349 350static int 351printtype(mode) |
352 u_int mode; |
353{ 354 switch (mode & S_IFMT) { 355 case S_IFDIR: 356 (void)putchar('/'); 357 return (1); 358 case S_IFIFO: 359 (void)putchar('|'); 360 return (1); --- 12 unchanged lines hidden (view full) --- 373 return (1); 374 } 375 return (0); 376} 377 378#ifdef COLORLS 379static int 380putch(c) |
381 int c; |
382{ 383 (void) putchar(c); 384 return 0; 385} 386 387static int 388writech(c) |
389 int c; |
390{ |
391 char tmp = c; |
392 393 (void) write(STDOUT_FILENO, &tmp, 1); 394 return 0; 395} 396 397static void 398printcolor(c) |
399 Colors c; |
400{ |
401 char *ansiseq; |
402 403 if (colors[c].bold) 404 tputs(enter_bold, 1, putch); 405 406 if (colors[c].num[0] != -1) { 407 ansiseq = tgoto(ansi_fgcol, 0, colors[c].num[0]); 408 if (ansiseq) 409 tputs(ansiseq, 1, putch); 410 } 411 412 if (colors[c].num[1] != -1) { 413 ansiseq = tgoto(ansi_bgcol, 0, colors[c].num[1]); 414 if (ansiseq) 415 tputs(ansiseq, 1, putch); 416 } 417} 418 419static void 420endcolor(sig) |
421 int sig; |
422{ 423 tputs(ansi_coloff, 1, sig ? writech : putch); 424 tputs(attrs_off, 1, sig ? writech : putch); 425} 426 427static int 428colortype(mode) |
429 mode_t mode; |
430{ 431 switch(mode & S_IFMT) { 432 case S_IFDIR: 433 if (mode & S_IWOTH) 434 if (mode & S_ISTXT) 435 printcolor(C_WSDIR); 436 else 437 printcolor(C_WDIR); --- 25 unchanged lines hidden (view full) --- 463 printcolor(C_EXEC); 464 return(1); 465 } 466 return(0); 467} 468 469void 470parsecolors(cs) |
471 char *cs; |
472{ |
473 int i; 474 int j; 475 int len; 476 char c[2]; 477 short legacy_warn = 0; |
478 |
479 if (cs == NULL) 480 cs = ""; /* LSCOLORS not set */ |
481 len = strlen(cs); 482 for (i = 0 ; i < C_NUMCOLORS ; i++) { 483 colors[i].bold = 0; 484 |
485 if (len <= 2 * i) { 486 c[0] = defcolors[2 * i]; 487 c[1] = defcolors[2 * i + 1]; |
488 } 489 else { |
490 c[0] = cs[2 * i]; 491 c[1] = cs[2 * i + 1]; |
492 } 493 for (j = 0 ; j < 2 ; j++) { 494 /* Legacy colours used 0-7 */ 495 if (c[j] >= '0' && c[j] <= '7') { 496 colors[i].num[j] = c[j] - '0'; 497 if (!legacy_warn) { 498 fprintf(stderr, 499 "warn: colors are now defined " --- 15 unchanged lines hidden (view full) --- 515 colors[i].num[j] = -1; 516 } 517 } 518 } 519} 520 521void 522colorquit(sig) |
523 int sig; |
524{ 525 endcolor(sig); 526 527 (void) signal(sig, SIG_DFL); 528 (void) kill(getpid(), sig); 529} 530#endif /*COLORLS*/ 531 532static void 533printlink(p) |
534 FTSENT *p; |
535{ |
536 int lnklen; 537 char name[MAXPATHLEN + 1]; 538 char path[MAXPATHLEN + 1]; |
539 540 if (p->fts_level == FTS_ROOTLEVEL) 541 (void)snprintf(name, sizeof(name), "%s", p->fts_name); 542 else 543 (void)snprintf(name, sizeof(name), 544 "%s/%s", p->fts_parent->fts_accpath, p->fts_name); 545 if ((lnklen = readlink(name, path, sizeof(path) - 1)) == -1) { 546 (void)fprintf(stderr, "\nls: %s: %s\n", name, strerror(errno)); 547 return; 548 } 549 path[lnklen] = '\0'; 550 (void)printf(" -> "); 551 printname(path); 552} |