1*baf7bba7Spedro /* $OpenBSD: confuse.c,v 1.1 2005/12/07 01:43:39 pedro Exp $ */
2*baf7bba7Spedro
3*baf7bba7Spedro /*
4*baf7bba7Spedro * Written by Artur Grabowski <art@openbsd.org> in 2002. Public Domain.
5*baf7bba7Spedro */
6*baf7bba7Spedro
7*baf7bba7Spedro #include <stdio.h>
8*baf7bba7Spedro #include <stdlib.h>
9*baf7bba7Spedro #include <unistd.h>
10*baf7bba7Spedro #include <err.h>
11*baf7bba7Spedro #include <fcntl.h>
12*baf7bba7Spedro #include <errno.h>
13*baf7bba7Spedro
14*baf7bba7Spedro int
main(int argc,char * argv[])15*baf7bba7Spedro main(int argc, char *argv[])
16*baf7bba7Spedro {
17*baf7bba7Spedro char fname[64];
18*baf7bba7Spedro int fd, newfd;
19*baf7bba7Spedro
20*baf7bba7Spedro if ((fd = open("/dev/null", O_RDONLY)) < 0)
21*baf7bba7Spedro err(1, "open(/dev/null)");
22*baf7bba7Spedro
23*baf7bba7Spedro /* Try to confuse fdescfs by making it open into itself. */
24*baf7bba7Spedro close(fd);
25*baf7bba7Spedro
26*baf7bba7Spedro snprintf(fname, sizeof(fname), "/dev/fd/%d", fd);
27*baf7bba7Spedro
28*baf7bba7Spedro if ((newfd = open(fname, O_RDONLY)) == fd)
29*baf7bba7Spedro errx(1, "open of %s to %d succeeded, beware.", fname, fd);
30*baf7bba7Spedro
31*baf7bba7Spedro if (newfd >= 0)
32*baf7bba7Spedro errx(1, "open(%s) gave us the unexpected %d", fname, fd);
33*baf7bba7Spedro
34*baf7bba7Spedro if (errno == ENOENT)
35*baf7bba7Spedro err(1, "open(%s)", fname);
36*baf7bba7Spedro
37*baf7bba7Spedro if (errno == ENXIO)
38*baf7bba7Spedro errx(1, "no support for fdesc in kernel");
39*baf7bba7Spedro
40*baf7bba7Spedro warn("errno was (%d)", errno);
41*baf7bba7Spedro
42*baf7bba7Spedro return 0;
43*baf7bba7Spedro }
44