From 48d66cd5e89764b00fe225db4823b3392a759942 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Thu, 11 May 2006 11:08:58 +0000 Subject: Handle pipes on platforms where they are non-existant of broken. We do this by creating a TCP socket pair instead of a normal pipe. Since Windows isn't UNIX-y enough to support read()/write() on sockets, we also need a wrapper to handle read() vs recv() and write() vs send(). git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@840 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/polypcore/util.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) (limited to 'src/polypcore/util.c') diff --git a/src/polypcore/util.c b/src/polypcore/util.c index 191fa809..beb93f45 100644 --- a/src/polypcore/util.c +++ b/src/polypcore/util.c @@ -198,6 +198,47 @@ finish: return ret; } +/** Platform independent read function. Necessary since not all systems + * treat all file descriptors equal. */ +ssize_t pa_read(int fd, void *buf, size_t count) { + ssize_t r; + +#ifdef OS_IS_WIN32 + r = recv(fd, buf, count, 0); + if (r < 0) { + if (WSAGetLastError() != WSAENOTSOCK) { + errno = WSAGetLastError(); + return r; + } + } + + if (r < 0) +#endif + r = read(fd, buf, count); + + return r; +} + +/** Similar to pa_read(), but handles writes */ +ssize_t pa_write(int fd, void *buf, size_t count) { + ssize_t r; + +#ifdef OS_IS_WIN32 + r = send(fd, buf, count, 0); + if (r < 0) { + if (WSAGetLastError() != WSAENOTSOCK) { + errno = WSAGetLastError(); + return r; + } + } + + if (r < 0) +#endif + r = write(fd, buf, count); + + return r; +} + /** Calls read() in a loop. Makes sure that as much as 'size' bytes, * unless EOF is reached or an error occured */ ssize_t pa_loop_read(int fd, void*data, size_t size) { @@ -207,7 +248,7 @@ ssize_t pa_loop_read(int fd, void*data, size_t size) { while (size > 0) { ssize_t r; - if ((r = read(fd, data, size)) < 0) + if ((r = pa_read(fd, data, size)) < 0) return r; if (r == 0) @@ -229,7 +270,7 @@ ssize_t pa_loop_write(int fd, const void*data, size_t size) { while (size > 0) { ssize_t r; - if ((r = write(fd, data, size)) < 0) + if ((r = pa_write(fd, data, size)) < 0) return r; if (r == 0) -- cgit