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:
committed by
Benoît Dejean
parent
9f509067d4
commit
09f8aaec1e
11
ChangeLog
11
ChangeLog
@@ -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>
|
||||
|
||||
* NEWS:
|
||||
|
@@ -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.
|
||||
|
39
lib/read.c
39
lib/read.c
@@ -22,48 +22,39 @@
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <errno.h>
|
||||
#include <glibtop/read.h>
|
||||
#include <glibtop/error.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
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
12
lib/write.c
12
lib/write.c
@@ -22,7 +22,7 @@
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <glibtop/write.h>
|
||||
#include <glibtop/error.h>
|
||||
#include <glib/gi18n-lib.h>
|
||||
@@ -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,
|
||||
|
Reference in New Issue
Block a user