summaryrefslogtreecommitdiffstats
path: root/bin/ls/ls.c
diff options
context:
space:
mode:
Diffstat (limited to 'bin/ls/ls.c')
-rw-r--r--bin/ls/ls.c54
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);
OpenPOWER on IntegriCloud