Handle EINTR.

2007-02-14  Benoît Dejean  <benoit@placenet.org>

	* lib/read.c: (glibtop_read_l):
	* lib/write.c: (glibtop_write_l):

	Handle EINTR.
	
	* configure.in:
	
	Post release version bump.

svn path=/trunk/; revision=2554
This commit is contained in:
Benoît Dejean
2007-02-14 22:19:01 +00:00
committed by Benoît Dejean
parent 9f509067d4
commit 09f8aaec1e
4 changed files with 33 additions and 31 deletions

View File

@@ -1,3 +1,14 @@
2007-02-14 Benoît Dejean <benoit@placenet.org>
* 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 <benoit@placenet.org> 2007-02-10 Benoît Dejean <benoit@placenet.org>
* NEWS: * NEWS:

View File

@@ -4,7 +4,7 @@ dnl
m4_define([libgtop_major_version], [2]) m4_define([libgtop_major_version], [2])
m4_define([libgtop_minor_version], [14]) 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]) m4_define([libgtop_version], [libgtop_major_version.libgtop_minor_version.libgtop_micro_version])
dnl increment if the interface has additions, changes, removals. dnl increment if the interface has additions, changes, removals.

View File

@@ -22,48 +22,39 @@
*/ */
#include <config.h> #include <config.h>
#include <errno.h>
#include <glibtop/read.h> #include <glibtop/read.h>
#include <glibtop/error.h> #include <glibtop/error.h>
#include <glib/gi18n-lib.h> #include <glib/gi18n-lib.h>
/* 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 void
glibtop_read_l (glibtop *server, size_t size, void *buf) glibtop_read_l (glibtop *server, size_t size, void *buf)
{ {
int fd;
glibtop_init_r (&server, 0, 0); glibtop_init_r (&server, 0, 0);
#ifdef DEBUG #ifdef DEBUG
fprintf (stderr, "LIBRARY: really reading %d bytes.\n", (int)size); fprintf (stderr, "LIBRARY: really reading %d bytes.\n", (int)size);
#endif #endif
if (server->socket) { fd = server->socket ? server->socket : server->input[0];
do_read (server->socket, buf, size);
} else { while (size) {
if(read (server->input [0], buf, size) < 0) ssize_t nread = read(fd, buf, size);
glibtop_error_io_r (
if (nread < 0 && errno == EINTR)
continue;
if (nread <= 0)
glibtop_error_io_r(
server, server,
ngettext ("read %d byte", ngettext ("read %d byte",
"read %d bytes", size), "read %d bytes", size),
(int)size); (int)size);
size -= nread;
buf = (char *)buf + nread;
} }
} }

View File

@@ -22,7 +22,7 @@
*/ */
#include <config.h> #include <config.h>
#include <errno.h>
#include <glibtop/write.h> #include <glibtop/write.h>
#include <glibtop/error.h> #include <glibtop/error.h>
#include <glib/gi18n-lib.h> #include <glib/gi18n-lib.h>
@@ -33,6 +33,7 @@ void
glibtop_write_l (glibtop *server, size_t size, void *buf) glibtop_write_l (glibtop *server, size_t size, void *buf)
{ {
int ret; int ret;
int fd;
glibtop_init_r (&server, 0, 0); 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); fprintf (stderr, "LIBRARY: really writing %d bytes.\n", (int)size);
#endif #endif
if (server->socket) { fd = server->socket ? server->socket : server->output[1];
ret = send (server->socket, buf, size, 0);
} else { while ((ret = write(fd, buf, size)) < 0 && errno == EINTR)
ret = write (server->output [1], buf, size); ;
}
if (ret < 0) if (ret < 0)
glibtop_error_io_r (server, glibtop_error_io_r (server,