#include "generic.h" #include "network_util.h" #include "error_handlers.h" ssize_t readn(int fd, void* vptr, size_t n) { size_t nleft; ssize_t nread; char* ptr; ptr = vptr; nleft = n; while (nleft > 0) { /* keep reading upto n bytes */ if ( (nread = read(fd, ptr, nleft)) < 0) { if (errno == EINTR) /* got interrupted by a signal ? */ nread = 0; /* and call read() again */ else return(-1); } else if (nread == 0) { break; /* EOF */ } nleft -= nread; ptr += nread; } return(n - nleft); /* return >= 0 */ } ssize_t writen(int fd, const void* vptr, size_t n) { size_t nleft; ssize_t nwritten; const char* ptr; ptr = vptr; nleft = n; while (nleft > 0) { if ( (nwritten = write(fd, ptr, nleft)) <= 0) { if (errno == EINTR) { /* interrupted by a signal ? */ nwritten = 0; /* and call write() again */ } else { return(-1); } } nleft -= nwritten; ptr += nwritten; } return(n); } static ssize_t my_read(int fd, char* ptr) { static int read_count = 0; static char* read_ptr; static char read_buf[MAXLINE]; int got_signal; got_signal = 0; if (read_count <= 0) { again: if ( (read_count = read(fd, read_buf, sizeof(read_buf))) < 0) { if (errno == EINTR) { goto again; /* bad programming practice ? may be not */ } else { return(-1); } } else if (read_count == 0) { return(0); } read_ptr = read_buf; } read_count--; *ptr = *read_ptr++; return(1); }