diff options
author | Karel Zak | 2014-03-19 13:25:45 +0100 |
---|---|---|
committer | Karel Zak | 2014-04-03 12:29:16 +0200 |
commit | 78a3b0af301b219c501f2c45d4bdcd65aed7f7a6 (patch) | |
tree | 88288eaf5e86c369aa2513b32d79d7d2b2622b02 | |
parent | libsmartcols: add lines (diff) | |
download | kernel-qcow2-util-linux-78a3b0af301b219c501f2c45d4bdcd65aed7f7a6.tar.gz kernel-qcow2-util-linux-78a3b0af301b219c501f2c45d4bdcd65aed7f7a6.tar.xz kernel-qcow2-util-linux-78a3b0af301b219c501f2c45d4bdcd65aed7f7a6.zip |
include/carefulputc: cleanup and add fputs_{quoted,nonblank}()
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | include/carefulputc.h | 45 | ||||
-rw-r--r-- | login-utils/last.c | 2 | ||||
-rw-r--r-- | term-utils/wall.c | 2 | ||||
-rw-r--r-- | term-utils/write.c | 2 |
4 files changed, 45 insertions, 6 deletions
diff --git a/include/carefulputc.h b/include/carefulputc.h index d4d0ee4ea..2273028d1 100644 --- a/include/carefulputc.h +++ b/include/carefulputc.h @@ -1,16 +1,18 @@ -#ifndef _CAREFUULPUTC_H -#define _CAREFUULPUTC_H +#ifndef UTIL_LINUX_CAREFUULPUTC_H +#define UTIL_LINUX_CAREFUULPUTC_H /* putc() for use in write and wall (that sometimes are sgid tty) */ /* Avoid control characters in our locale, and also ASCII control characters. Note that the locale of the recipient is unknown. */ #include <stdio.h> #include <ctype.h> +#include <string.h> +#include <ctype.h> #define iso8859x_iscntrl(c) \ (((c) & 0x7f) < 0x20 || (c) == 0x7f) -static inline int carefulputc(int c, FILE *fp, const char fail) { +static inline int fputc_careful(int c, FILE *fp, const char fail) { int ret; if (c == '\007' || c == '\t' || c == '\r' || c == '\n' || @@ -26,4 +28,41 @@ static inline int carefulputc(int c, FILE *fp, const char fail) { return (ret < 0) ? EOF : 0; } + +static inline void fputs_quoted(const char *data, FILE *out) +{ + const char *p; + + fputc('"', out); + for (p = data; p && *p; p++) { + if ((unsigned char) *p == 0x22 || /* " */ + (unsigned char) *p == 0x5c || /* \ */ + !isprint((unsigned char) *p) || + iscntrl((unsigned char) *p)) { + + fprintf(out, "\\x%02x", (unsigned char) *p); + } else + fputc(*p, out); + } + fputc('"', out); +} + +static inline void fputs_nonblank(const char *data, FILE *out) +{ + const char *p; + + for (p = data; p && *p; p++) { + if (isblank((unsigned char) *p) || + (unsigned char) *p == 0x5c || /* \ */ + !isprint((unsigned char) *p) || + iscntrl((unsigned char) *p)) { + + fprintf(out, "\\x%02x", (unsigned char) *p); + + } else + fputc(*p, out); + } +} + + #endif /* _CAREFUULPUTC_H */ diff --git a/login-utils/last.c b/login-utils/last.c index e4a849776..5122f8e4b 100644 --- a/login-utils/last.c +++ b/login-utils/last.c @@ -528,7 +528,7 @@ static int list(const struct last_control *ctl, struct utmp *p, time_t t, int wh * Print out "final" string safely. */ for (s = final; *s; s++) - carefulputc(*s, stdout, '*'); + fputc_careful(*s, stdout, '*'); if (len < 0 || (size_t)len >= sizeof(final)) putchar('\n'); diff --git a/term-utils/wall.c b/term-utils/wall.c index 20a2891f2..1bae9d652 100644 --- a/term-utils/wall.c +++ b/term-utils/wall.c @@ -284,7 +284,7 @@ static char *makemsg(char *fname, char **mvec, int mvecsz, if (ch == '\t') cnt += (7 - (cnt % 8)); if (ch != '\n') - carefulputc(ch, fp, '^'); + fputc_careful(ch, fp, '^'); } } } diff --git a/term-utils/write.c b/term-utils/write.c index f5ca34108..146f4ba5e 100644 --- a/term-utils/write.c +++ b/term-utils/write.c @@ -373,7 +373,7 @@ void wr_fputs(char *s) { char c; -#define PUTC(c) if (carefulputc(c, stdout, '^') == EOF) \ +#define PUTC(c) if (fputc_careful(c, stdout, '^') == EOF) \ err(EXIT_FAILURE, _("carefulputc failed")); while (*s) { c = *s++; |