static int printescapedpath(const FTSENT *p) { int chcnt; if (f_fullpath) { chcnt = printescaped(p->fts_path); chcnt += printescaped("/"); } else chcnt = 0; return chcnt + printescaped(p->fts_name); }
/* * print [inode] [size] name * return # of characters printed, no trailing characters. */ static int printaname(FTSENT *p, int inodefield, int sizefield) { struct stat *sp; int chcnt; char szbuf[5]; sp = p->fts_statp; chcnt = 0; if (f_inode) chcnt += printf("%*lu ", inodefield, (unsigned long)sp->st_ino); if (f_size) { if (f_humanize) { if ((humanize_number(szbuf, sizeof(szbuf), sp->st_size, "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1) err(1, "humanize_number"); chcnt += printf("%*s ", sizefield, szbuf); } else { chcnt += printf("%*llu ", sizefield, (long long)howmany(sp->st_blocks, blocksize)); } } if (f_octal || f_octal_escape) chcnt += safe_print(p->fts_name); else if (f_nonprint) chcnt += printescaped(p->fts_name); else chcnt += printf("%s", p->fts_name); if (f_type || (f_typedir && S_ISDIR(sp->st_mode))) chcnt += printtype(sp->st_mode); return (chcnt); }
static void printlink(FTSENT *p) { int lnklen; char name[MAXPATHLEN + 1], path[MAXPATHLEN + 1]; if (p->fts_level == FTS_ROOTLEVEL) (void)snprintf(name, sizeof(name), "%s", p->fts_name); else (void)snprintf(name, sizeof(name), "%s/%s", p->fts_parent->fts_accpath, p->fts_name); if ((lnklen = readlink(name, path, sizeof(path) - 1)) == -1) { (void)fprintf(stderr, "\nls: %s: %s\n", name, strerror(errno)); return; } path[lnklen] = '\0'; (void)printf(" -> "); if (f_octal || f_octal_escape) (void)safe_print(path); else if (f_nonprint) (void)printescaped(path); else (void)printf("%s", path); }
void printlong(DISPLAY *dp) { struct stat *sp; FTSENT *p; NAMES *np; char buf[20], szbuf[5]; now = time(NULL); printtotal(dp); /* "total: %u\n" */ for (p = dp->list; p; p = p->fts_link) { if (IS_NOPRINT(p)) continue; sp = p->fts_statp; if (f_inode) (void)printf("%*lu ", dp->s_inode, (unsigned long)sp->st_ino); if (f_size) { if (f_humanize) { if ((humanize_number(szbuf, sizeof(szbuf), sp->st_blocks * S_BLKSIZE, "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1) err(1, "humanize_number"); (void)printf("%*s ", dp->s_block, szbuf); } else { (void)printf("%*llu ", dp->s_block, (long long)howmany(sp->st_blocks, blocksize)); } } (void)strmode(sp->st_mode, buf); np = p->fts_pointer; (void)printf("%s %*lu ", buf, dp->s_nlink, (unsigned long)sp->st_nlink); if (!f_grouponly) (void)printf("%-*s ", dp->s_user, np->user); (void)printf("%-*s ", dp->s_group, np->group); if (f_flags) (void)printf("%-*s ", dp->s_flags, np->flags); if (S_ISCHR(sp->st_mode) || S_ISBLK(sp->st_mode)) (void)printf("%*u, %*u ", dp->s_major, major(sp->st_rdev), dp->s_minor, minor(sp->st_rdev)); else if (f_humanize) { if ((humanize_number(szbuf, sizeof(szbuf), sp->st_size, "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1) err(1, "humanize_number"); (void)printf("%*s ", dp->s_size, szbuf); } else { (void)printf("%*llu ", dp->s_size, (long long)sp->st_size); } if (f_accesstime) printtime(sp->st_atime); else if (f_statustime) printtime(sp->st_ctime); else printtime(sp->st_mtime); if (f_octal || f_octal_escape) (void)safe_print(p->fts_name); else if (f_nonprint) (void)printescaped(p->fts_name); else (void)printf("%s", p->fts_name); if (f_type || (f_typedir && S_ISDIR(sp->st_mode))) (void)printtype(sp->st_mode); if (S_ISLNK(sp->st_mode)) printlink(p); (void)putchar('\n'); } }