1 /* $OpenBSD: fchdir.c,v 1.2 2017/03/08 18:42:28 deraadt Exp $ */ 2 3 /* 4 * Written by Philip Guenther <guenther@openbsd.org> 2011 Public Domain. 5 * 6 * Verify errno returns from fchdir() 7 */ 8 #include <sys/types.h> 9 #include <sys/socket.h> 10 #include <err.h> 11 #include <errno.h> 12 #include <fcntl.h> 13 #include <stdio.h> 14 #include <stdlib.h> 15 #include <unistd.h> 16 17 int 18 main(int argc, char *argv[]) 19 { 20 int fds[2]; 21 int fd; 22 23 if ((fd = open("/etc/passwd", O_RDONLY)) == -1) 24 err(1, "open"); 25 if (fchdir(fd) == 0) 26 errx(1, "fchdir file succeeded"); 27 if (errno != ENOTDIR) 28 err(1, "fchdir file: wrong errno"); 29 close(fd); 30 31 if (pipe(fds)) 32 err(1, "pipe"); 33 if (fchdir(fds[0]) == 0) 34 errx(1, "fchdir pipe succeeded"); 35 if (errno != ENOTDIR) 36 err(1, "fchdir pipe: wrong errno"); 37 close(fds[0]); 38 close(fds[1]); 39 40 if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) 41 err(1, "socket"); 42 if (fchdir(fd) == 0) 43 errx(1, "fchdir socket succeeded"); 44 if (errno != ENOTDIR) 45 err(1, "fchdir socket: wrong errno"); 46 close(fd); 47 48 if (fchdir(fd) == 0) 49 errx(1, "fchdir bad fd succeeded"); 50 if (errno != EBADF) 51 err(1, "fchdir bad fd: wrong errno"); 52 53 return 0; 54 } 55