The Linux Programming Interface

(nextflipdebug5) #1
Sockets: Advanced Topics 1255

Listing 61-1: Implementation of readn() and writen()


––––––––––––––––––––––––––––––––––––––––––––––––––––––––––sockets/rdwrn.c
#include <unistd.h>
#include <errno.h>
#include "rdwrn.h" / Declares readn() and writen() /


ssize_t
readn(int fd, void buffer, size_t n)
{
ssize_t numRead; /
# of bytes fetched by last read() /
size_t totRead; /
Total # of bytes read so far /
char
buf;


buf = buffer; / No pointer arithmetic on "void " */
for (totRead = 0; totRead < n; ) {
numRead = read(fd, buf, n - totRead);


if (numRead == 0) / EOF /
return totRead; / May be 0 if this is first read() /
if (numRead == -1) {
if (errno == EINTR)
continue; / Interrupted --> restart read() /
else
return -1; / Some other error /
}
totRead += numRead;
buf += numRead;
}
return totRead; / Must be 'n' bytes if we get here /
}


ssize_t
writen(int fd, const void buffer, size_t n)
{
ssize_t numWritten; /
# of bytes written by last write() /
size_t totWritten; /
Total # of bytes written so far /
const char
buf;


buf = buffer; / No pointer arithmetic on "void " */
for (totWritten = 0; totWritten < n; ) {
numWritten = write(fd, buf, n - totWritten);


if (numWritten <= 0) {
if (numWritten == -1 && errno == EINTR)
continue; / Interrupted --> restart write() /
else
return -1; / Some other error /
}
totWritten += numWritten;
buf += numWritten;
}
return totWritten; / Must be 'n' bytes if we get here /
}
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––sockets/rdwrn.c

Free download pdf