Prevent scriptlets from clobbering pacman.log because they don't end
their outputs with a newline.
---
 lib/libalpm/util.c | 40 ++++++++++++++++++++++++++--------------
 1 file changed, 26 insertions(+), 14 deletions(-)

diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index 033058a..3b4f4e0 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -555,23 +555,35 @@ int _alpm_run_chroot(alpm_handle_t *handle, const char 
*cmd, char *const argv[])
                exit(1);
        } else {
                /* this code runs for the parent only (wait on the child) */
-               int status;
-               FILE *pipe_file;
+               int status, need_newline = 0;
 
                CLOSE(pipefd[1]);
-               pipe_file = fdopen(pipefd[0], "r");
-               if(pipe_file == NULL) {
-                       CLOSE(pipefd[0]);
-                       retval = 1;
-               } else {
-                       while(!feof(pipe_file)) {
-                               char line[PATH_MAX];
-                               if(fgets(line, PATH_MAX, pipe_file) == NULL)
-                                       break;
-                               alpm_logaction(handle, "%s", line);
-                               EVENT(handle, ALPM_EVENT_SCRIPTLET_INFO, line, 
NULL);
+               for(;;) {
+                       char line[BUFSIZ];
+                       int nbytes_r = read(pipefd[0], line, BUFSIZ);
+
+                       if(nbytes_r == 0) {
+                               break;
+                       } else if(nbytes_r == -1) {
+                               if (errno != EINTR) {
+                                       _alpm_log(handle, ALPM_LOG_ERROR, 
_("call to read failed (%s)\n"), strerror(errno));
+                                       CLOSE(pipefd[0]);
+                                       retval = 1;
+                                       goto cleanup;
+                               }
+                               continue;
                        }
-                       fclose(pipe_file);
+
+                       /* we'll need to manually add a newline if the read 
data doesn't end with one already */
+                       need_newline = (line[nbytes_r - 1] != '\n');
+
+                       alpm_logaction(handle, "%s", line);
+                       EVENT(handle, ALPM_EVENT_SCRIPTLET_INFO, line, NULL);
+               }
+               CLOSE(pipefd[0]);
+
+               if (need_newline) {
+                       alpm_logaction(handle, "\n");
                }
 
                while(waitpid(pid, &status, 0) == -1) {
-- 
1.8.0.2


Reply via email to