Changed safe_write() to fully send all the data in the buffer it was
passed. Also safe_write() and safe_read() now use char pointer buffers rather than the void pointer style.
This commit is contained in:
parent
cad9a5d11b
commit
b969ed4302
32
src/sock.c
32
src/sock.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: sock.c,v 1.19 2001-12-15 05:58:30 rjkaes Exp $
|
/* $Id: sock.c,v 1.20 2001-12-15 20:04:04 rjkaes Exp $
|
||||||
*
|
*
|
||||||
* Sockets are created and destroyed here. When a new connection comes in from
|
* Sockets are created and destroyed here. When a new connection comes in from
|
||||||
* a client, we need to copy the socket and the create a second socket to the
|
* a client, we need to copy the socket and the create a second socket to the
|
||||||
@ -271,18 +271,34 @@ getpeer_string(int fd, char *string)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Write the buffer to the socket. If an EINTR occurs, pick up and try
|
* Write the buffer to the socket. If an EINTR occurs, pick up and try
|
||||||
* again.
|
* again. Keep sending until the buffer has been sent.
|
||||||
*/
|
*/
|
||||||
ssize_t
|
ssize_t
|
||||||
safe_write(int fd, const void *buffer, size_t count)
|
safe_write(int fd, const char *buffer, size_t count)
|
||||||
{
|
{
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
|
size_t bytestosend;
|
||||||
|
|
||||||
do {
|
bytestosend = count;
|
||||||
len = write(fd, buffer, count);
|
|
||||||
} while (len < 0 && errno == EINTR);
|
|
||||||
|
|
||||||
return len;
|
while (1) {
|
||||||
|
len = write(fd, buffer, bytestosend);
|
||||||
|
|
||||||
|
if (len < 0) {
|
||||||
|
if (errno == EINTR)
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len == bytestosend)
|
||||||
|
break;
|
||||||
|
|
||||||
|
buffer += len;
|
||||||
|
bytestosend -= len;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -290,7 +306,7 @@ safe_write(int fd, const void *buffer, size_t count)
|
|||||||
* again.
|
* again.
|
||||||
*/
|
*/
|
||||||
ssize_t
|
ssize_t
|
||||||
safe_read(int fd, void *buffer, size_t count)
|
safe_read(int fd, char *buffer, size_t count)
|
||||||
{
|
{
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Id: sock.h,v 1.7 2001-11-22 00:19:18 rjkaes Exp $
|
/* $Id: sock.h,v 1.8 2001-12-15 20:04:04 rjkaes Exp $
|
||||||
*
|
*
|
||||||
* See 'sock.c' for a detailed description.
|
* See 'sock.c' for a detailed description.
|
||||||
*
|
*
|
||||||
@ -35,8 +35,8 @@ extern int socket_blocking(int sock);
|
|||||||
extern char *getpeer_ip(int fd, char *ipaddr);
|
extern char *getpeer_ip(int fd, char *ipaddr);
|
||||||
extern char *getpeer_string(int fd, char *string);
|
extern char *getpeer_string(int fd, char *string);
|
||||||
|
|
||||||
extern ssize_t safe_write(int fd, const void *buffer, size_t count);
|
extern ssize_t safe_write(int fd, const char *buffer, size_t count);
|
||||||
extern ssize_t safe_read(int fd, void *buffer, size_t count);
|
extern ssize_t safe_read(int fd, char *buffer, size_t count);
|
||||||
|
|
||||||
extern ssize_t readline(int fd, char **whole_buffer);
|
extern ssize_t readline(int fd, char **whole_buffer);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user