summaryrefslogtreecommitdiff
path: root/lib/read.c
diff options
context:
space:
mode:
authorMartin Baulig <martin@src.gnome.org>1998-06-18 19:06:55 +0000
committerMartin Baulig <martin@src.gnome.org>1998-06-18 19:06:55 +0000
commit71187a5e519bd03926c933c57e307f29b07e77c6 (patch)
tree44810abf5421d1aeec10ceb94d2dc32052d268ae /lib/read.c
parentb54a5d2dfdce076438da84046b4d0589cbaece36 (diff)
downloadlibgtop-71187a5e519bd03926c933c57e307f29b07e77c6.tar.gz
Some more daemon stuff.
Diffstat (limited to 'lib/read.c')
-rw-r--r--lib/read.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/lib/read.c b/lib/read.c
index 55fb922e..c9a0c565 100644
--- a/lib/read.c
+++ b/lib/read.c
@@ -23,10 +23,35 @@
/* Reads some data from server. */
+static void
+do_read (int s, void *ptr, size_t total_size)
+{
+ int nread;
+ size_t already_read = 0, remaining = total_size;
+
+ while (already_read < total_size) {
+ nread = recv (s, ptr, remaining, 0);
+
+ if (nread == 0) {
+ close (s);
+ continue;
+ }
+
+ if (nread <= 0) {
+ glibtop_error_io ("recv");
+ return;
+ }
+
+ already_read += nread;
+ remaining -= nread;
+ (char *) ptr += nread;
+ }
+}
+
void
glibtop_read_l (glibtop *server, size_t size, void *buf)
{
- int ret;
+ int ret = 0;
glibtop_init_r (&server, 0, 0);
@@ -35,7 +60,7 @@ glibtop_read_l (glibtop *server, size_t size, void *buf)
#endif
if (server->socket) {
- ret = recv (server->socket, buf, size, 0);
+ do_read (server->socket, buf, size);
} else {
ret = read (server->input [0], buf, size);
}