From d2d52eedded3b6592e02cedefd631a240f65c938 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Tue, 15 Oct 2019 16:00:29 -0400 Subject: [PATCH] reworked gapbuf_save --- src/lib/gapbuf.c | 28 ++++++++++++++++++---------- src/lib/job.c | 7 +++++++ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/lib/gapbuf.c b/src/lib/gapbuf.c index 03c93af..869e692 100644 --- a/src/lib/gapbuf.c +++ b/src/lib/gapbuf.c @@ -88,20 +88,28 @@ void gapbuf_init(GapBuf* buf) buf->gapend = buf->bufend; } +static long writefd(int fd, char* data, long towrite) +{ + long nwrite = 0;; + while (towrite && ((nwrite = write(fd, data, towrite)) > 0)) + { + data += nwrite; + towrite -= nwrite; + } + return nwrite; +} + long gapbuf_save(GapBuf* buf, char* path) { - char* wptr; - long fd, nwrite = 0, towrite = 0; + long fd; + long nwrite; if (path && (fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0644)) >= 0) { - /* write the chunk before the gap */ - wptr = buf->bufstart, towrite = (buf->gapstart - buf->bufstart); - while (towrite && ((nwrite = write(fd, wptr, towrite)) > 0)) - wptr += nwrite, towrite -= nwrite; - /* write the chunk after the gap */ - wptr = buf->gapend, towrite = (buf->bufend - buf->gapend); - while (towrite && ((nwrite = write(fd, wptr, towrite)) > 0)) - wptr += nwrite, towrite -= nwrite; + long nwrite = writefd(fd, buf->bufstart, (buf->gapstart - buf->bufstart)); + if (nwrite >= 0) + { + nwrite = writefd(fd, buf->gapend, (buf->bufend - buf->gapend)); + } close(fd); } else diff --git a/src/lib/job.c b/src/lib/job.c index 17dfbad..127b7ba 100644 --- a/src/lib/job.c +++ b/src/lib/job.c @@ -159,8 +159,15 @@ bool job_poll(int ms) } /* Poll until a job is ready, call the functions based on events */ long ret = poll(JobFds, njobs, ms); + if (ret < 0) + { + perror("poll() failed: "); + exit(1); + } for (int i = 0; i < njobs; i++) + { job_process(JobFds[i].fd, JobFds[i].revents); + } /* reap zombie processes */ for (int status; waitpid(-1, &status, WNOHANG) > 0;); return (ret > 0); -- 2.52.0