# HG changeset patch # User Bastien Roucariès # Date 1300042354 -3600 # Node ID 1d050d935509d91920c5464a9e4b739b5bc2fbac # Parent e29883807ecf6f1f0ee669616f40e7cb110c2d5c passfd module, part 4. * modules/passfd-tests: New file. * tests/test-passfd.c: New file. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-03-07 Bastien Roucariès + + passfd module, part 4. + * modules/passfd-tests: New file. + * tests/test-passfd.c: New file. + 2011-03-13 Jim Meyering Makefile: rely on GNU make; derive syntax-check rule names diff --git a/modules/passfd-tests b/modules/passfd-tests new file mode 100644 --- /dev/null +++ b/modules/passfd-tests @@ -0,0 +1,11 @@ +Files: +tests/test-passfd.c +tests/macros.h + +Depends-on: + +configure.ac: + +Makefile.am: +TESTS += test-passfd +check_PROGRAMS += test-passfd diff --git a/tests/test-passfd.c b/tests/test-passfd.c new file mode 100644 --- /dev/null +++ b/tests/test-passfd.c @@ -0,0 +1,112 @@ +/* Test of terminating the current process. + Copyright (C) 2010-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2010. */ + +#include +#include +#include +#include +#include "passfd.h" +#include +#include +#include +#include + + +#include "macros.h" + +int +main () +{ + int pair[2]; + int ret; + pid_t pid; + int status; + int fdnull; + int fd; + struct stat st; + + fdnull = open ("/dev/null", O_RDWR); + if (fdnull < 0) + { + perror ("Could not open /dev/null"); + return 1; + } + + ret = socketpair (AF_UNIX, SOCK_STREAM, 0, pair); + if (ret < 0) + { + perror ("socket pair failed"); + return 2; + } + + pid = fork (); + if (pid == -1) + { + perror ("fork:"); + return 3; + } + if (pid == 0) + { + ret = sendfd (pair[1], fdnull); + if (ret == -1) + { + perror ("sendfd:"); + return 64; + } + return 0; + } + /* father */ + else + { + fd = recvfd (pair[0], 0); + if (fd == -1) + { + perror ("recvfd"); + return 16; + } + ret = waitpid (pid, &status, 0); + if (ret == -1) + { + perror ("waitpid:"); + return 17; + } + ASSERT (ret == pid); + + ret = WIFEXITED (status); + if (ret == 0) + { + fprintf (stderr, "Child does not normally exit\n"); + return 65; + } + ret = WEXITSTATUS (status); + if (ret != 0) + { + fprintf (stderr, "Send fd fail"); + return ret; + } + + /* try to stat new fd */ + ret == fstat (fd, &st); + if (0 != ret) + { + perror("fstat:"); + return 80; + } + return 0; + } +}