diff --git a/ChangeLog b/ChangeLog index 4ecbeb32..fb4f3b4d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2007-02-14 Benoît Dejean + + * lib/read.c: (glibtop_read_l): + * lib/write.c: (glibtop_write_l): + + Handle EINTR. + + * configure.in: + + Post release version bump. + 2007-02-10 Benoît Dejean * NEWS: diff --git a/configure.in b/configure.in index a8179670..5540f952 100644 --- a/configure.in +++ b/configure.in @@ -4,7 +4,7 @@ dnl m4_define([libgtop_major_version], [2]) m4_define([libgtop_minor_version], [14]) -m4_define([libgtop_micro_version], [7]) +m4_define([libgtop_micro_version], [8]) m4_define([libgtop_version], [libgtop_major_version.libgtop_minor_version.libgtop_micro_version]) dnl increment if the interface has additions, changes, removals. diff --git a/lib/read.c b/lib/read.c index b2920af4..f263adcf 100644 --- a/lib/read.c +++ b/lib/read.c @@ -22,48 +22,39 @@ */ #include +#include #include #include #include -/* Reads some data from server. */ - -static void -do_read (int s, void *ptr, size_t total_size) -{ - ssize_t nread; - - if(!total_size) return; - - while (total_size && (nread = recv (s, ptr, total_size, 0)) > 0) { - total_size -= nread; - ptr = (char*)ptr + nread; - } - - if(nread == 0) - close (s); - else if (nread < 0) - glibtop_error_io ("recv"); -} void glibtop_read_l (glibtop *server, size_t size, void *buf) { + int fd; glibtop_init_r (&server, 0, 0); #ifdef DEBUG fprintf (stderr, "LIBRARY: really reading %d bytes.\n", (int)size); #endif - if (server->socket) { - do_read (server->socket, buf, size); - } else { - if(read (server->input [0], buf, size) < 0) - glibtop_error_io_r ( + fd = server->socket ? server->socket : server->input[0]; + + while (size) { + ssize_t nread = read(fd, buf, size); + + if (nread < 0 && errno == EINTR) + continue; + + if (nread <= 0) + glibtop_error_io_r( server, ngettext ("read %d byte", "read %d bytes", size), (int)size); + + size -= nread; + buf = (char *)buf + nread; } } diff --git a/lib/write.c b/lib/write.c index 2d301b3e..55f527a1 100644 --- a/lib/write.c +++ b/lib/write.c @@ -22,7 +22,7 @@ */ #include - +#include #include #include #include @@ -33,6 +33,7 @@ void glibtop_write_l (glibtop *server, size_t size, void *buf) { int ret; + int fd; glibtop_init_r (&server, 0, 0); @@ -42,11 +43,10 @@ glibtop_write_l (glibtop *server, size_t size, void *buf) fprintf (stderr, "LIBRARY: really writing %d bytes.\n", (int)size); #endif - if (server->socket) { - ret = send (server->socket, buf, size, 0); - } else { - ret = write (server->output [1], buf, size); - } + fd = server->socket ? server->socket : server->output[1]; + + while ((ret = write(fd, buf, size)) < 0 && errno == EINTR) + ; if (ret < 0) glibtop_error_io_r (server,