Add read_nonblock() function

Deal with platforms where EWOULDBLOCK != EAGAIN
This commit is contained in:
Andrew Bettison 2012-07-13 11:04:50 +09:30
parent e378a8dc82
commit dcf7209304
2 changed files with 25 additions and 1 deletions

24
net.c
View File

@ -47,6 +47,25 @@ int _set_block(int fd, const char *file, unsigned int line, const char *function
return 0;
}
int _read_nonblock(int fd, void *buf, size_t len, const char *file, unsigned int line, const char *function)
{
ssize_t nread = read(fd, buf, len);
if (nread == -1) {
switch (errno) {
case EINTR:
case EAGAIN:
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
case EWOULDBLOCK:
#endif
return 0;
}
logMessage_perror(LOG_LEVEL_ERROR, file, line, function, "read_nonblock: read(%d,%p,%lu)",
fd, buf, (unsigned long)len);
return -1;
}
return nread;
}
int _write_all(int fd, const void *buf, size_t len, const char *file, unsigned int line, const char *function)
{
ssize_t written = write(fd, buf, len);
@ -68,8 +87,11 @@ int _write_nonblock(int fd, const void *buf, size_t len, const char *file, unsig
ssize_t written = write(fd, buf, len);
if (written == -1) {
switch (errno) {
case EAGAIN:
case EINTR:
case EAGAIN:
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
case EWOULDBLOCK:
#endif
return 0;
}
logMessage_perror(LOG_LEVEL_ERROR, file, line, function, "write_nonblock: write(%d,%p %s,%lu)",

View File

@ -1565,6 +1565,7 @@ void sigIoHandler(int signal);
#define set_nonblock(fd) (_set_nonblock(fd, __FILE__, __LINE__, __FUNCTION__))
#define set_block(fd) (_set_block(fd, __FILE__, __LINE__, __FUNCTION__))
#define read_nonblock(fd,buf,len) (_read_nonblock(fd, buf, len, __FILE__, __LINE__, __FUNCTION__))
#define write_all(fd,buf,len) (_write_all(fd, buf, len, __FILE__, __LINE__, __FUNCTION__))
#define write_nonblock(fd,buf,len) (_write_nonblock(fd, buf, len, __FILE__, __LINE__, __FUNCTION__))
#define write_all_nonblock(fd,buf,len) (_write_all_nonblock(fd, buf, len, __FILE__, __LINE__, __FUNCTION__))
@ -1573,6 +1574,7 @@ void sigIoHandler(int signal);
int _set_nonblock(int fd, const char *file, unsigned int line, const char *function);
int _set_block(int fd, const char *file, unsigned int line, const char *function);
int _read_nonblock(int fd, void *buf, size_t len, const char *file, unsigned int line, const char *function);
int _write_all(int fd, const void *buf, size_t len, const char *file, unsigned int line, const char *function);
int _write_nonblock(int fd, const void *buf, size_t len, const char *file, unsigned int line, const char *function);
int _write_all_nonblock(int fd, const void *buf, size_t len, const char *file, unsigned int line, const char *function);