summaryrefslogtreecommitdiffstats
path: root/src/polypcore/util.c
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2006-05-11 11:08:58 +0000
committerPierre Ossman <ossman@cendio.se>2006-05-11 11:08:58 +0000
commit48d66cd5e89764b00fe225db4823b3392a759942 (patch)
tree0e60a5cf549d07f6be53e60fa83b355fd77a7094 /src/polypcore/util.c
parent12d4b5d952c7a284fd081966a02d34d94dd6be10 (diff)
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
Diffstat (limited to 'src/polypcore/util.c')
-rw-r--r--src/polypcore/util.c45
1 files changed, 43 insertions, 2 deletions
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)