xref: /plan9/sys/src/ape/lib/bsd/ioctl.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier /* posix */
2*219b2ee8SDavid du Colombier #include <sys/types.h>
3*219b2ee8SDavid du Colombier #include <unistd.h>
4*219b2ee8SDavid du Colombier #include <stdlib.h>
5*219b2ee8SDavid du Colombier #include <stdio.h>
6*219b2ee8SDavid du Colombier #include <errno.h>
7*219b2ee8SDavid du Colombier #include <string.h>
8*219b2ee8SDavid du Colombier #include <fcntl.h>
9*219b2ee8SDavid du Colombier #include <sys/stat.h>
10*219b2ee8SDavid du Colombier 
11*219b2ee8SDavid du Colombier /* bsd extensions */
12*219b2ee8SDavid du Colombier #include <sys/uio.h>
13*219b2ee8SDavid du Colombier #include <sys/socket.h>
14*219b2ee8SDavid du Colombier #include <sys/ioctl.h>
15*219b2ee8SDavid du Colombier 
16*219b2ee8SDavid du Colombier int
ioctl(int fd,unsigned long request,void * arg)17*219b2ee8SDavid du Colombier ioctl(int fd, unsigned long request, void* arg)
18*219b2ee8SDavid du Colombier {
19*219b2ee8SDavid du Colombier 	struct stat d;
20*219b2ee8SDavid du Colombier 
21*219b2ee8SDavid du Colombier 	if(request == FIONREAD) {
22*219b2ee8SDavid du Colombier 		if(fstat(fd, &d) < 0) {
23*219b2ee8SDavid du Colombier 			errno = EBADF;
24*219b2ee8SDavid du Colombier 			return -1;
25*219b2ee8SDavid du Colombier 		}
26*219b2ee8SDavid du Colombier 		/* this works if the file is buffered somehow */
27*219b2ee8SDavid du Colombier 		*(long*)arg = d.st_size;
28*219b2ee8SDavid du Colombier 		return 0;
29*219b2ee8SDavid du Colombier 	} else {
30*219b2ee8SDavid du Colombier 		errno = EINVAL;
31*219b2ee8SDavid du Colombier 		return -1;
32*219b2ee8SDavid du Colombier 	}
33*219b2ee8SDavid du Colombier }
34