/* $Header: /mit/jik/sipbsrc/src/gameserver/RCS/safe_read.c,v 1.3 1992/03/03 02:18:16 jik Exp $ */
/* $Log: safe_read.c,v $
 * Revision 1.3  1992/03/03  02:18:16  jik
 * INclude <sys/select.h> under AIX.
 *
 * Revision 1.2  1988/12/23  04:09:19  jik
 * A few bubfixes.
 *
 * Revision 1.1  85/04/07  23:27:56  jtkohl
 * Initial revision
 * 
 * Revision 1.2  85/01/31  15:53:53  jtkohl
 * changed safe time struct to reflect possible slower action of charon
 * 
 * Revision 1.1  85/01/31  14:09:44  jtkohl
 * Initial revision
 */

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#ifdef _AIX
#include <sys/select.h>
#endif

static
#ifdef __STDC__
    const
#endif
    struct timeval safe_read_timeout = {15, 0};

safe_read(fd, buf, len)
    int fd, len;
#ifdef __STDC__
    void * buf;
#else
    char *buf;
#endif
{
     fd_set mask, readmask;
    register int num, numfds;
    char *ptr = buf;

#ifdef DEBUG
    fprintf(stderr, "waiting to read %d\n", len);
#endif
     FD_ZERO(&mask);
     FD_SET(fd, &mask);
    numfds = fd + 1;
    while (len > 0) {
	readmask = mask;
	if (select(numfds, &readmask, NULL, NULL, &safe_read_timeout) <= 0)
	    return(-1);
        if ((num = read(fd, ptr, len)) <= 0) return(-1);
        ptr += num;
        len -= num;
    }
#ifdef DEBUG
    fprintf(stderr, "got it.\n");
#endif
    return(0);
}
