/* HELPER.C ======== (c) Paul Griffiths, 1999 Email: mail@paulgriffiths.net Implementation of sockets helper functions. Many of these functions are adapted from, inspired by, or otherwise shamelessly plagiarised from "Unix Network Programming", W Richard Stevens (Prentice Hall). */ #include "helper.h" #include #include #include /* Read a line from a socket */ ssize_t Readline(int sockd, void *vptr, size_t maxlen) { char *ptr = vptr; ssize_t rc = read(sockd, vptr, maxlen); if (rc >= 0) ptr[rc] = 0; /* We know there is space */ else { *ptr = 0; /* ERROR */ return 0; } return rc; #if 0 ssize_t n, rc; char c, *buffer; buffer = vptr; for ( n = 1; n < maxlen; n++ ) { if ( (rc = read(sockd, &c, 1)) == 1 ) { *buffer++ = c; if ( c == '\n' ) break; } else if ( rc == 0 ) { if ( n == 1 ) return 0; else break; } else { if ( errno == EINTR ) continue; return -1; } } *buffer = 0; return n; #endif } /* Write a line to a socket */ ssize_t Writeline(int sockd, const void *vptr, size_t n) { size_t nleft; ssize_t nwritten; const char *buffer; buffer = vptr; nleft = n; while ( nleft > 0 ) { if ( (nwritten = write(sockd, buffer, nleft)) <= 0 ) { if ( errno == EINTR ) nwritten = 0; else return -1; } nleft -= nwritten; buffer += nwritten; } return n; }