diff options
Diffstat (limited to 'bin/ls/ls.c')
-rw-r--r-- | bin/ls/ls.c | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/bin/ls/ls.c b/bin/ls/ls.c index 74276c1..926d2bc 100644 --- a/bin/ls/ls.c +++ b/bin/ls/ls.c @@ -66,6 +66,7 @@ __FBSDID("$FreeBSD$"); #include <termcap.h> #include <signal.h> #endif +#include <libxo/xo.h> #include "ls.h" #include "extern.h" @@ -185,6 +186,12 @@ main(int argc, char *argv[]) fts_options = FTS_PHYSICAL; if (getenv("LS_SAMESORT")) f_samesort = 1; + + argc = xo_parse_args(argc, argv); + if (argc < 0) + return (1); + xo_set_flags(NULL, XOF_COLUMNS); + while ((ch = getopt(argc, argv, "1ABCD:FGHILPRSTUWXZabcdfghiklmnopqrstuwxy,")) != -1) { switch (ch) { @@ -381,7 +388,7 @@ main(int argc, char *argv[]) f_color = 1; } #else - warnx("color support not compiled in"); + xo_warnx("color support not compiled in"); #endif /*COLORLS*/ #ifdef COLORLS @@ -479,10 +486,13 @@ main(int argc, char *argv[]) else printfcn = printcol; + xo_open_container("file-information"); if (argc) traverse(argc, argv, fts_options); else traverse(1, dotav, fts_options); + xo_close_container("file-information"); + xo_finish(); exit(rval); } @@ -500,10 +510,11 @@ traverse(int argc, char *argv[], int options) FTS *ftsp; FTSENT *p, *chp; int ch_options; + int first = 1; if ((ftsp = fts_open(argv, options, f_nosort ? NULL : mastercmp)) == NULL) - err(1, "fts_open"); + xo_err(1, "fts_open"); /* * We ignore errors from fts_children here since they will be @@ -525,11 +536,11 @@ traverse(int argc, char *argv[], int options) while ((p = fts_read(ftsp)) != NULL) switch (p->fts_info) { case FTS_DC: - warnx("%s: directory causes a cycle", p->fts_name); + xo_warnx("%s: directory causes a cycle", p->fts_name); break; case FTS_DNR: case FTS_ERR: - warnx("%s: %s", p->fts_path, strerror(p->fts_errno)); + xo_warnx("%s: %s", p->fts_path, strerror(p->fts_errno)); rval = 1; break; case FTS_D: @@ -537,31 +548,40 @@ traverse(int argc, char *argv[], int options) p->fts_name[0] == '.' && !f_listdot) break; + if (first) { + first = 0; + xo_open_list("directory"); + } + xo_open_instance("directory"); + /* * If already output something, put out a newline as * a separator. If multiple arguments, precede each * directory with its name. */ if (output) { - putchar('\n'); - (void)printname(p->fts_path); - puts(":"); + xo_emit("\n"); + (void)printname("path", p->fts_path); + xo_emit(":\n"); } else if (argc > 1) { - (void)printname(p->fts_path); - puts(":"); + (void)printname("path", p->fts_path); + xo_emit(":\n"); output = 1; } chp = fts_children(ftsp, ch_options); display(p, chp, options); + xo_close_instance("directory"); if (!f_recursive && chp != NULL) (void)fts_set(ftsp, p, FTS_SKIP); break; default: break; } + if (!first) + xo_close_list("directory"); if (errno) - err(1, "fts_read"); + xo_err(1, "fts_read"); } /* @@ -608,7 +628,7 @@ display(const FTSENT *p, FTSENT *list, int options) /* Fill-in "::" as "0:0:0" for the sake of scanf. */ jinitmax = malloc(strlen(initmax) * 2 + 2); if (jinitmax == NULL) - err(1, "malloc"); + xo_err(1, "malloc"); initmax2 = jinitmax; if (*initmax == ':') strcpy(initmax2, "0:"), initmax2 += 2; @@ -679,7 +699,7 @@ display(const FTSENT *p, FTSENT *list, int options) flags = NULL; for (cur = list, entries = 0; cur; cur = cur->fts_link) { if (cur->fts_info == FTS_ERR || cur->fts_info == FTS_NS) { - warnx("%s: %s", + xo_warnx("%s: %s", cur->fts_name, strerror(cur->fts_errno)); cur->fts_number = NO_PRINT; rval = 1; @@ -745,7 +765,7 @@ display(const FTSENT *p, FTSENT *list, int options) flags = strdup("-"); } if (flags == NULL) - err(1, "fflagstostr"); + xo_err(1, "fflagstostr"); flen = strlen(flags); if (flen > (size_t)maxflags) maxflags = flen; @@ -759,7 +779,7 @@ display(const FTSENT *p, FTSENT *list, int options) error = mac_prepare_file_label(&label); if (error == -1) { - warn("MAC label for %s/%s", + xo_warn("MAC label for %s/%s", cur->fts_parent->fts_path, cur->fts_name); goto label_out; @@ -780,7 +800,7 @@ display(const FTSENT *p, FTSENT *list, int options) error = mac_get_link(name, label); if (error == -1) { - warn("MAC label for %s/%s", + xo_warn("MAC label for %s/%s", cur->fts_parent->fts_path, cur->fts_name); mac_free(label); @@ -790,7 +810,7 @@ display(const FTSENT *p, FTSENT *list, int options) error = mac_to_text(label, &labelstr); if (error == -1) { - warn("MAC label for %s/%s", + xo_warn("MAC label for %s/%s", cur->fts_parent->fts_path, cur->fts_name); mac_free(label); @@ -808,7 +828,7 @@ label_out: if ((np = malloc(sizeof(NAMES) + labelstrlen + ulen + glen + flen + 4)) == NULL) - err(1, "malloc"); + xo_err(1, "malloc"); np->user = &np->data[0]; (void)strcpy(np->user, user); |