From a455b5dd6ddc2cf49c52967f8cf00fd98a954b41 Mon Sep 17 00:00:00 2001 From: assar Date: Tue, 4 Jul 2000 23:09:23 +0000 Subject: make sure we do not write out non-printable characters in file names and symbolic links (by default) PR: bin/19354 Reviewed by: silence on -current --- bin/ls/extern.h | 6 +++--- bin/ls/ls.c | 2 -- bin/ls/ls.h | 1 + bin/ls/print.c | 28 +++++++++++++++++++--------- bin/ls/util.c | 24 +++++++++++++----------- 5 files changed, 36 insertions(+), 25 deletions(-) (limited to 'bin') diff --git a/bin/ls/extern.h b/bin/ls/extern.h index 4b27be6..31e2ced 100644 --- a/bin/ls/extern.h +++ b/bin/ls/extern.h @@ -43,13 +43,13 @@ int revnamecmp __P((const FTSENT *, const FTSENT *)); int statcmp __P((const FTSENT *, const FTSENT *)); int revstatcmp __P((const FTSENT *, const FTSENT *)); -void prcopy __P((char *, char *, int)); void printcol __P((DISPLAY *)); void printlong __P((DISPLAY *)); void printscol __P((DISPLAY *)); void usage __P((void)); -int len_octal __P((char *, int)); -int prn_octal __P((char *)); +int len_octal __P((const char *, int)); +int prn_octal __P((const char *)); +int prn_printable __P((const char *)); #ifdef COLORLS void parsecolors __P((char *cs)); void colorquit __P((int)); diff --git a/bin/ls/ls.c b/bin/ls/ls.c index 69b8d77..4b48ef9 100644 --- a/bin/ls/ls.c +++ b/bin/ls/ls.c @@ -566,8 +566,6 @@ display(p, list) continue; } } - if (f_nonprint) - prcopy(cur->fts_name, cur->fts_name, cur->fts_namelen); if (cur->fts_namelen > maxlen) maxlen = cur->fts_namelen; if (f_octal || f_octal_escape) { diff --git a/bin/ls/ls.h b/bin/ls/ls.h index 3da163d..3f929e7 100644 --- a/bin/ls/ls.h +++ b/bin/ls/ls.h @@ -48,6 +48,7 @@ extern int f_inode; /* print inode */ extern int f_longform; /* long listing format */ extern int f_octal; /* print unprintables in octal */ extern int f_octal_escape; /* like f_octal but use C escapes if possible */ +extern int f_nonprint; /* show unprintables as ? */ extern int f_sectime; /* print the real time for all files */ extern int f_size; /* list size in short listing */ extern int f_statustime; /* use time of last mode change */ diff --git a/bin/ls/print.c b/bin/ls/print.c index 736754a..a407283 100644 --- a/bin/ls/print.c +++ b/bin/ls/print.c @@ -112,6 +112,21 @@ printscol(dp) } } +/* + * print name in current style + */ +static int +printname(name) + const char *name; +{ + if (f_octal || f_octal_escape) + return prn_octal(name); + else if (f_nonprint) + return prn_printable(name); + else + return printf("%s", name); +} + void printlong(dp) DISPLAY *dp; @@ -166,8 +181,7 @@ printlong(dp) if (f_color) color_printed = colortype(sp->st_mode); #endif - if (f_octal || f_octal_escape) (void)prn_octal(p->fts_name); - else (void)printf("%s", p->fts_name); + (void)printname(p->fts_name); #ifdef COLORLS if (f_color && color_printed) endcolor(0); @@ -278,8 +292,7 @@ printaname(p, inodefield, sizefield) if (f_color) color_printed = colortype(sp->st_mode); #endif - chcnt += (f_octal || f_octal_escape) ? prn_octal(p->fts_name) - : printf("%s", p->fts_name); + chcnt += printname(p->fts_name); #ifdef COLORLS if (f_color && color_printed) endcolor(0); @@ -494,9 +507,6 @@ printlink(p) return; } path[lnklen] = '\0'; - if (f_octal || f_octal_escape) { - (void)printf(" -> "); - (void)prn_octal(path); - } - else (void)printf(" -> %s", path); + (void)printf(" -> "); + printname(path); } diff --git a/bin/ls/util.c b/bin/ls/util.c index 7239d97..1f839c5 100644 --- a/bin/ls/util.c +++ b/bin/ls/util.c @@ -56,17 +56,19 @@ static const char rcsid[] = #include "ls.h" #include "extern.h" -void -prcopy(src, dest, len) - char *src, *dest; - int len; +int +prn_printable(s) + const char *s; { - unsigned char ch; + unsigned char c; + int n; - while (len--) { - ch = *src++; - *dest++ = isprint(ch) ? ch : '?'; - } + for (n = 0; (c = *s) != '\0'; ++s, ++n) + if (isprint(c)) + putchar(c); + else + putchar('?'); + return n; } /* @@ -84,7 +86,7 @@ prcopy(src, dest, len) int len_octal(s, len) - char *s; + const char *s; int len; { int r = 0; @@ -96,7 +98,7 @@ len_octal(s, len) int prn_octal(s) - char *s; + const char *s; { unsigned char ch; int len = 0; -- cgit v1.1