#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);
}

