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>
|
2007-02-10 Benoît Dejean <benoit@placenet.org>
|
||||||
|
|
||||||
* NEWS:
|
* NEWS:
|
||||||
|
@@ -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.
|
||||||
|
39
lib/read.c
39
lib/read.c
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
12
lib/write.c
12
lib/write.c
@@ -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,
|
||||||
|
Reference in New Issue
Block a user