xref: /netbsd-src/external/ibm-public/postfix/dist/src/util/peekfd.c (revision a5847cc334d9a7029f6352b847e9e8d71a0f9e0c)
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