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