diff options
author | Lennart Poettering <lennart@poettering.net> | 2020-04-13 11:20:59 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2020-04-13 11:27:07 +0200 |
commit | 609ae0f59619619efe6db07e34f73a237e7f332b (patch) | |
tree | 0fa85c6de0d549d49d92aff3a362e1462303825c /src | |
parent | fileio: fileno() can realistically return -1 (diff) | |
download | systemd-609ae0f59619619efe6db07e34f73a237e7f332b.tar.xz systemd-609ae0f59619619efe6db07e34f73a237e7f332b.zip |
fileio: optionally allow telling read_line_full() whether we are processing a tty or not
Diffstat (limited to 'src')
-rw-r--r-- | src/basic/fileio.c | 10 | ||||
-rw-r--r-- | src/basic/fileio.h | 4 |
2 files changed, 8 insertions, 6 deletions
diff --git a/src/basic/fileio.c b/src/basic/fileio.c index 387b3253b5..463a8596f5 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -1009,7 +1009,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, funlockfile); int read_line_full(FILE *f, size_t limit, ReadLineFlags flags, char **ret) { size_t n = 0, allocated = 0, count = 0; _cleanup_free_ char *buffer = NULL; - int r, tty = -1; + int r; assert(f); @@ -1088,17 +1088,17 @@ int read_line_full(FILE *f, size_t limit, ReadLineFlags flags, char **ret) { * \n as the single EOL marker, so there is no need to wait. We check * this condition last to avoid isatty() check if not necessary. */ - if (tty < 0) { + if ((flags & (READ_LINE_IS_A_TTY|READ_LINE_NOT_A_TTY)) == 0) { int fd; fd = fileno(f); if (fd < 0) /* Maybe an fmemopen() stream? Handle this gracefully, * and don't call isatty() on an invalid fd */ - tty = false; + flags |= READ_LINE_NOT_A_TTY; else - tty = isatty(fd); + flags |= isatty(fd) ? READ_LINE_IS_A_TTY : READ_LINE_NOT_A_TTY; } - if (tty > 0) + if (FLAGS_SET(flags, READ_LINE_IS_A_TTY)) break; } diff --git a/src/basic/fileio.h b/src/basic/fileio.h index 58daabaa8f..e6062121a3 100644 --- a/src/basic/fileio.h +++ b/src/basic/fileio.h @@ -88,7 +88,9 @@ int read_timestamp_file(const char *fn, usec_t *ret); int fputs_with_space(FILE *f, const char *s, const char *separator, bool *space); typedef enum ReadLineFlags { - READ_LINE_ONLY_NUL = 1 << 0, + READ_LINE_ONLY_NUL = 1 << 0, + READ_LINE_IS_A_TTY = 1 << 1, + READ_LINE_NOT_A_TTY = 1 << 2, } ReadLineFlags; int read_line_full(FILE *f, size_t limit, ReadLineFlags flags, char **ret); |