]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/terminal-util: fix output of files without a final newline
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 27 Apr 2018 07:39:53 +0000 (09:39 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 27 Apr 2018 08:06:24 +0000 (10:06 +0200)
If the main config file or one of the drop-ins did not have the final newline,
there would be no seperating empty line (or if this was the last file
displayed, our own output would end without the final newline, possibly running
into the subsequent prompt or such). copy_bytes() does not know anything about
lines, so let's just use a normal loop with read_line() and puts().

src/basic/terminal-util.c

index c2b7cd799eccfa7cc0589e0c88d422607b5d3638..7f18d3d35cf8fc43bb61e6213fd7f4666163a4b9 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "alloc-util.h"
 #include "copy.h"
+#include "def.h"
 #include "env-util.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -1365,10 +1366,11 @@ int terminal_urlify_path(const char *path, const char *text, char **ret) {
 }
 
 static int cat_file(const char *filename, bool newline) {
-        _cleanup_close_ int fd;
+        _cleanup_fclose_ FILE *f = NULL;
+        int r;
 
-        fd = open(filename, O_RDONLY|O_CLOEXEC|O_NOCTTY);
-        if (fd < 0)
+        f = fopen(filename, "re");
+        if (!f)
                 return -errno;
 
         printf("%s%s# %s%s\n",
@@ -1378,7 +1380,19 @@ static int cat_file(const char *filename, bool newline) {
                ansi_normal());
         fflush(stdout);
 
-        return copy_bytes(fd, STDOUT_FILENO, (uint64_t) -1, 0);
+        for (;;) {
+                _cleanup_free_ char *line = NULL;
+
+                r = read_line(f, LONG_LINE_MAX, &line);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to read \"%s\": %m", filename);
+                if (r == 0)
+                        break;
+
+                puts(line);
+        }
+
+        return 0;
 }
 
 int cat_files(const char *file, char **dropins, CatFlags flags) {