xref: /openbsd-src/regress/sys/kern/fchdir/fchdir.c (revision 61e7dd5d21b5cbd01b6e4ab46c2e129fcdb2828f)
1*61e7dd5dSderaadt /*	$OpenBSD: fchdir.c,v 1.2 2017/03/08 18:42:28 deraadt Exp $ */
2*61e7dd5dSderaadt 
378260f06Sguenther /*
478260f06Sguenther  *	Written by Philip Guenther <guenther@openbsd.org> 2011 Public Domain.
578260f06Sguenther  *
678260f06Sguenther  *	Verify errno returns from fchdir()
778260f06Sguenther  */
878260f06Sguenther #include <sys/types.h>
978260f06Sguenther #include <sys/socket.h>
1078260f06Sguenther #include <err.h>
1178260f06Sguenther #include <errno.h>
1278260f06Sguenther #include <fcntl.h>
1378260f06Sguenther #include <stdio.h>
1478260f06Sguenther #include <stdlib.h>
1578260f06Sguenther #include <unistd.h>
1678260f06Sguenther 
1778260f06Sguenther int
main(int argc,char * argv[])1878260f06Sguenther main(int argc, char *argv[])
1978260f06Sguenther {
2078260f06Sguenther 	int fds[2];
2178260f06Sguenther 	int fd;
2278260f06Sguenther 
2378260f06Sguenther 	if ((fd = open("/etc/passwd", O_RDONLY)) == -1)
2478260f06Sguenther 		err(1, "open");
2578260f06Sguenther 	if (fchdir(fd) == 0)
2678260f06Sguenther 		errx(1, "fchdir file succeeded");
2778260f06Sguenther 	if (errno != ENOTDIR)
2878260f06Sguenther 		err(1, "fchdir file: wrong errno");
2978260f06Sguenther 	close(fd);
3078260f06Sguenther 
3178260f06Sguenther 	if (pipe(fds))
3278260f06Sguenther 		err(1, "pipe");
3378260f06Sguenther 	if (fchdir(fds[0]) == 0)
3478260f06Sguenther 		errx(1, "fchdir pipe succeeded");
3578260f06Sguenther 	if (errno != ENOTDIR)
3678260f06Sguenther 		err(1, "fchdir pipe: wrong errno");
3778260f06Sguenther 	close(fds[0]);
3878260f06Sguenther 	close(fds[1]);
3978260f06Sguenther 
4078260f06Sguenther 	if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
4178260f06Sguenther 		err(1, "socket");
4278260f06Sguenther 	if (fchdir(fd) == 0)
4378260f06Sguenther 		errx(1, "fchdir socket succeeded");
4478260f06Sguenther 	if (errno != ENOTDIR)
4578260f06Sguenther 		err(1, "fchdir socket: wrong errno");
4678260f06Sguenther 	close(fd);
4778260f06Sguenther 
4878260f06Sguenther 	if (fchdir(fd) == 0)
4978260f06Sguenther 		errx(1, "fchdir bad fd succeeded");
5078260f06Sguenther 	if (errno != EBADF)
5178260f06Sguenther 		err(1, "fchdir bad fd: wrong errno");
5278260f06Sguenther 
5378260f06Sguenther 	return 0;
5478260f06Sguenther }
55