diff --git a/src/util/threads-win32.c b/src/util/threads-win32.c index a30bccfdd1..e478560c15 100644 --- a/src/util/threads-win32.c +++ b/src/util/threads-win32.c @@ -157,6 +157,16 @@ int virCondWait(virCondPtr c, virMutexPtr m) return 0; } +int virCondWaitUntil(virCondPtr c ATTRIBUTE_UNUSED, + virMutexPtr m ATTRIBUTE_UNUSED, + unsigned long long whenms ATTRIBUTE_UNUSED) +{ + /* FIXME: this function is currently only used by the QEMU driver that + * is not compiled on Windows, so it's okay for now to just + * miss an implementation */ + return -1; +} + void virCondSignal(virCondPtr c) { virMutexLock(&c->lock); diff --git a/src/util/util.c b/src/util/util.c index 536cadd6c4..2d329527dc 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -786,86 +786,6 @@ int virExecDaemonize(const char *const*argv, return ret; } -int -virPipeReadUntilEOF(int outfd, int errfd, - char **outbuf, char **errbuf) { - - struct pollfd fds[2]; - int i; - int finished[2]; - - fds[0].fd = outfd; - fds[0].events = POLLIN; - finished[0] = 0; - fds[1].fd = errfd; - fds[1].events = POLLIN; - finished[1] = 0; - - while(!(finished[0] && finished[1])) { - - if (poll(fds, ARRAY_CARDINALITY(fds), -1) < 0) { - if ((errno == EAGAIN) || (errno == EINTR)) - continue; - goto pollerr; - } - - for (i = 0; i < ARRAY_CARDINALITY(fds); ++i) { - char data[1024], **buf; - int got, size; - - if (!(fds[i].revents)) - continue; - else if (fds[i].revents & POLLHUP) - finished[i] = 1; - - if (!(fds[i].revents & POLLIN)) { - if (fds[i].revents & POLLHUP) - continue; - - virUtilError(VIR_ERR_INTERNAL_ERROR, - "%s", _("Unknown poll response.")); - goto error; - } - - got = read(fds[i].fd, data, sizeof(data)); - - if (got == 0) { - finished[i] = 1; - continue; - } - if (got < 0) { - if (errno == EINTR) - continue; - if (errno == EAGAIN) - break; - goto pollerr; - } - - buf = ((fds[i].fd == outfd) ? outbuf : errbuf); - size = (*buf ? strlen(*buf) : 0); - if (VIR_REALLOC_N(*buf, size+got+1) < 0) { - virReportOOMError(); - goto error; - } - memmove(*buf+size, data, got); - (*buf)[size+got] = '\0'; - } - continue; - - pollerr: - virReportSystemError(errno, - "%s", _("poll error")); - goto error; - } - - return 0; - -error: - VIR_FREE(*outbuf); - VIR_FREE(*errbuf); - return -1; -} - /** * @argv NULL terminated argv to run * @status optional variable to return exit status in @@ -1011,6 +931,86 @@ virExecDaemonize(const char *const*argv ATTRIBUTE_UNUSED, # endif /* WIN32 */ +int +virPipeReadUntilEOF(int outfd, int errfd, + char **outbuf, char **errbuf) { + + struct pollfd fds[2]; + int i; + int finished[2]; + + fds[0].fd = outfd; + fds[0].events = POLLIN; + finished[0] = 0; + fds[1].fd = errfd; + fds[1].events = POLLIN; + finished[1] = 0; + + while(!(finished[0] && finished[1])) { + + if (poll(fds, ARRAY_CARDINALITY(fds), -1) < 0) { + if ((errno == EAGAIN) || (errno == EINTR)) + continue; + goto pollerr; + } + + for (i = 0; i < ARRAY_CARDINALITY(fds); ++i) { + char data[1024], **buf; + int got, size; + + if (!(fds[i].revents)) + continue; + else if (fds[i].revents & POLLHUP) + finished[i] = 1; + + if (!(fds[i].revents & POLLIN)) { + if (fds[i].revents & POLLHUP) + continue; + + virUtilError(VIR_ERR_INTERNAL_ERROR, + "%s", _("Unknown poll response.")); + goto error; + } + + got = read(fds[i].fd, data, sizeof(data)); + + if (got == 0) { + finished[i] = 1; + continue; + } + if (got < 0) { + if (errno == EINTR) + continue; + if (errno == EAGAIN) + break; + goto pollerr; + } + + buf = ((fds[i].fd == outfd) ? outbuf : errbuf); + size = (*buf ? strlen(*buf) : 0); + if (VIR_REALLOC_N(*buf, size+got+1) < 0) { + virReportOOMError(); + goto error; + } + memmove(*buf+size, data, got); + (*buf)[size+got] = '\0'; + } + continue; + + pollerr: + virReportSystemError(errno, + "%s", _("poll error")); + goto error; + } + + return 0; + +error: + VIR_FREE(*outbuf); + VIR_FREE(*errbuf); + return -1; +} + int virRun(const char *const*argv, int *status) {