Mercurial > hg > octave-lyh > gnulib-hg
changeset 14423:1d050d935509
passfd module, part 4.
* modules/passfd-tests: New file.
* tests/test-passfd.c: New file.
author | Bastien Roucariès <roucaries.bastien@gmail.com> |
---|---|
date | Sun, 13 Mar 2011 19:52:34 +0100 |
parents | e29883807ecf |
children | 7be307034349 |
files | ChangeLog modules/passfd-tests tests/test-passfd.c |
diffstat | 3 files changed, 129 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-03-07 Bastien Roucariès <roucaries.bastien@gmail.com> + + passfd module, part 4. + * modules/passfd-tests: New file. + * tests/test-passfd.c: New file. + 2011-03-13 Jim Meyering <meyering@redhat.com> Makefile: rely on GNU make; derive syntax-check rule names
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
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 <http://www.gnu.org/licenses/>. */ + +/* Written by Bruno Haible <bruno@clisp.org>, 2010. */ + +#include <config.h> +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include "passfd.h" +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <fcntl.h> + + +#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; + } +}