/************************************************************ Program: Socket I/0 functions File: sockio.cpp Author: Ryan Junee - ryan@cs.usyd.edu.au Version: 1.0 Date: 02/09/2001 Revisions: 1.0 02/09/2001 First Version Defines a couple of socket IO functions. **************************************************************/ #include "sockio.h" /** * This function reads in a text line from a socket 1 byte at a time. * It comes from p79 of Stevens - Unix Network Programming. It is used * because reading from sockets can be more delicate than normal File I/O. * @param fd The socket * @param vptr The buffer to fill * @param maxlen The maximum bytes that can be stored in the buffer * @return The number of bytes read. */ ssize_t readline(int fd, void *vptr, ssize_t maxlen) { ssize_t n, rc; char c, *ptr; ptr = (char *)vptr; for (n = 1; n < maxlen; n++) { again: if ((rc = read(fd, &c, 1)) == 1) { *ptr++ = c; if (c == '\n') break; /* newline is stored, like fgets() */ } else if (rc == 0) { if (n == 1) return 0; /* EOF, no data read */ else break; /* EOF, some data read */ } else { if (errno == EINTR) goto again; return - 1; /* error, errno set by read() */ } } *ptr = 0; /* null terminate like fgets() */ return n; } /** * This function writes n bytes of text to the socket. It comes from p78 * of Stevens - Unix Network Programming. It is used because writing to a * socket can be a bit more delicate than normal file I/O. * @param fd The socket * @param vptr The buffer to write * @param n The number of bytes to write * @return The number of bytes written. */ ssize_t writen(int fd, const void *vptr, size_t n) { size_t nleft; ssize_t nwritten; const char *ptr; ptr = (char *)vptr; nleft = n; while (nleft > 0) { if ((nwritten = write(fd, ptr, nleft)) <= 0) { if (errno == EINTR) nwritten = 0; /* and call write() again */ else return -1; /* error */ } nleft -= nwritten; ptr += nwritten; } return n; }