1 /* $NetBSD: peekfd.c,v 1.1.1.1 2009/06/23 10:09:00 tron Exp $ */ 2 3 /*++ 4 /* NAME 5 /* peekfd 3 6 /* SUMMARY 7 /* determine amount of data ready to read 8 /* SYNOPSIS 9 /* #include <iostuff.h> 10 /* 11 /* ssize_t peekfd(fd) 12 /* int fd; 13 /* DESCRIPTION 14 /* peekfd() attempts to find out how many bytes are available to 15 /* be read from the named file descriptor. The result value is 16 /* the number of available bytes. 17 /* DIAGNOSTICS 18 /* peekfd() returns -1 in case of trouble. The global \fIerrno\fR 19 /* variable reflects the nature of the problem. 20 /* BUGS 21 /* On some systems, non-blocking read() may fail even after a 22 /* positive return from peekfd(). The smtp-sink program works 23 /* around this by using the readable() function instead. 24 /* LICENSE 25 /* .ad 26 /* .fi 27 /* The Secure Mailer license must be distributed with this software. 28 /* AUTHOR(S) 29 /* Wietse Venema 30 /* IBM T.J. Watson Research 31 /* P.O. Box 704 32 /* Yorktown Heights, NY 10598, USA 33 /*--*/ 34 35 /* System library. */ 36 37 #include <sys_defs.h> 38 #include <sys/ioctl.h> 39 #ifdef FIONREAD_IN_SYS_FILIO_H 40 #include <sys/filio.h> 41 #endif 42 #ifdef FIONREAD_IN_TERMIOS_H 43 #include <termios.h> 44 #endif 45 #include <unistd.h> 46 47 /* Utility library. */ 48 49 #include "iostuff.h" 50 51 /* peekfd - return amount of data ready to read */ 52 53 ssize_t peekfd(int fd) 54 { 55 56 /* 57 * Anticipate a series of system-dependent code fragments. 58 */ 59 #ifdef FIONREAD 60 int count; 61 62 return (ioctl(fd, FIONREAD, (char *) &count) < 0 ? -1 : count); 63 #else 64 #error "don't know how to look ahead" 65 #endif 66 } 67