sbase-ls_-lq.diff: respect -q flag when using -l flag
sbase-ls_-qR.diff: respect -q flag when printing directory headings with -R flag
From da7bfffbe6d9f02421899b42b410301ad5718c54 Mon Sep 17 00:00:00 2001
From: Evan Gates <[email protected]>
Date: Wed, 5 Oct 2016 10:57:38 -0700
Subject: [PATCH] fix ls -lq to respect -q flag
---
ls.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ls.c b/ls.c
index b5c4b00..7c80d56 100644
--- a/ls.c
+++ b/ls.c
@@ -207,7 +207,7 @@ output(const struct entry *ent)
printf("%10s ", humansize(ent->size));
else
printf("%10lu ", (unsigned long)ent->size);
- printf("%s %s%s", buf, ent->name, indicator(ent->mode));
+ printf("%s %s%s", buf, name, indicator(ent->mode));
if (S_ISLNK(ent->mode)) {
if ((len = readlink(ent->name, buf, sizeof(buf) - 1)) < 0)
eprintf("readlink %s:", ent->name);
--
2.10.0
From c23b1d3e881a3799527274e5cd43f47ddb6803bd Mon Sep 17 00:00:00 2001
From: Evan Gates <[email protected]>
Date: Wed, 5 Oct 2016 14:43:30 -0700
Subject: [PATCH] respect -q when printing directory names with -R
break out the non printable character to ? code into a makeprint()
function so it can be used both in output() and lsdir()
---
ls.c | 56 +++++++++++++++++++++++++++++++-------------------------
1 file changed, 31 insertions(+), 25 deletions(-)
diff --git a/ls.c b/ls.c
index b5c4b00..139014e 100644
--- a/ls.c
+++ b/ls.c
@@ -113,6 +113,27 @@ indicator(mode_t mode)
return "";
}
+static char *
+makeprint(char *name)
+{
+ char *c, *u, *print = emalloc(strlen(name) + 1);
+ Rune r;
+ size_t l;
+
+ for (c = print, u = name; *u; u += l) {
+ l = chartorune(&r, u);
+ if (isprintrune(r)) {
+ memcpy(c, u, l);
+ c += l;
+ } else {
+ *c++ = '?';
+ }
+ }
+ *c = '\0';
+
+ return print;
+}
+
static void
output(const struct entry *ent)
{
@@ -120,28 +141,9 @@ output(const struct entry *ent)
struct passwd *pw;
struct tm *tm;
ssize_t len;
- size_t l;
- char *name, *c, *u, *fmt, buf[BUFSIZ],
- pwname[_SC_LOGIN_NAME_MAX], grname[_SC_LOGIN_NAME_MAX],
- mode[] = "----------";
- Rune r;
-
- if (qflag) {
- name = emalloc(strlen(ent->name) + 1);
-
- for (c = name, u = ent->name; *u; u += l) {
- l = chartorune(&r, u);
- if (isprintrune(r)) {
- memcpy(c, u, l);
- c += l;
- } else {
- *c++ = '?';
- }
- }
- *c = '\0';
- } else {
- name = ent->name;
- }
+ char *fmt, buf[BUFSIZ], pwname[_SC_LOGIN_NAME_MAX],
+ grname[_SC_LOGIN_NAME_MAX], mode[] = "----------",
+ *name = qflag ? makeprint(ent->name) : ent->name;
if (iflag)
printf("%lu ", (unsigned long)ent->ino);
@@ -250,12 +252,12 @@ lsdir(const char *path, const struct entry *dir)
struct entry *ent, *ents = NULL;
struct dirent *d;
size_t i, n = 0;
- char prefix[PATH_MAX];
+ char prefix[PATH_MAX], *name = qflag ? makeprint(dir->name) : dir->name;
if (!(dp = opendir(dir->name))) {
ret = 1;
weprintf("opendir %s%s:", path, dir->name);
- return;
+ goto cleanup;
}
if (chdir(dir->name) < 0)
eprintf("chdir %s:", dir->name);
@@ -279,7 +281,7 @@ lsdir(const char *path, const struct entry *dir)
qsort(ents, n, sizeof(*ents), entcmp);
if (path[0] || showdirs)
- printf("%s%s:\n", path, dir->name);
+ printf("%s%s:\n", path, name);
for (i = 0; i < n; i++)
output(&ents[i]);
@@ -303,6 +305,10 @@ lsdir(const char *path, const struct entry *dir)
for (i = 0; i < n; ++i)
free(ents[i].name);
free(ents);
+
+cleanup:
+ if (qflag)
+ free(name);
}
static int
--
2.10.0