diff options
author | Artur Grabowski <art@cvs.openbsd.org> | 2002-02-16 01:55:10 +0000 |
---|---|---|
committer | Artur Grabowski <art@cvs.openbsd.org> | 2002-02-16 01:55:10 +0000 |
commit | 48c6fb77e1e7b9afdf1f971107ffc84184ad0cb3 (patch) | |
tree | 632269337a95bc5554586feefe1850636c504461 /regress/lib/libc | |
parent | ed343173b41b3b9e432cacf4fca78844d512d7ab (diff) |
Tests for popen(3). From NetBSD.
Diffstat (limited to 'regress/lib/libc')
-rw-r--r-- | regress/lib/libc/popen/Makefile | 5 | ||||
-rw-r--r-- | regress/lib/libc/popen/popen.c | 104 |
2 files changed, 109 insertions, 0 deletions
diff --git a/regress/lib/libc/popen/Makefile b/regress/lib/libc/popen/Makefile new file mode 100644 index 00000000000..25b8668a7ac --- /dev/null +++ b/regress/lib/libc/popen/Makefile @@ -0,0 +1,5 @@ +# $OpenBSD: Makefile,v 1.1 2002/02/16 01:55:09 art Exp $ + +PROG=popen + +.include <bsd.regress.mk> diff --git a/regress/lib/libc/popen/popen.c b/regress/lib/libc/popen/popen.c new file mode 100644 index 00000000000..491c5becea1 --- /dev/null +++ b/regress/lib/libc/popen/popen.c @@ -0,0 +1,104 @@ +/* $NetBSD: popen.c,v 1.1 1999/09/30 09:23:23 tron Exp $ */ + +/*- + * Copyright (c) 1999 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Matthias Scheler. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/param.h> + +#include <errno.h> +#include <paths.h> +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <unistd.h> + +#define _PATH_CAT "/bin/cat" +#define BUFSIZE (640*1024) + /* 640KB ought to be enough for everyone. */ +#define DATAFILE "popen.data" + +int +main(int argc, char **argv) +{ + char *buffer, command[MAXPATHLEN]; + int index, in; + FILE *pipe; + + if ((buffer = malloc(BUFSIZE*sizeof(char))) == NULL) + err(1, NULL); + + for (index=0; index<BUFSIZE; index++) + buffer[index]=arc4random(); + + (void)snprintf(command, sizeof(command), "%s >%s", + _PATH_CAT, DATAFILE); + if ((pipe = popen(command, "w")) == NULL) + err(1, "popen write"); + + if (fwrite(buffer, sizeof(char), BUFSIZE, pipe) != BUFSIZE) + err(1, "write"); + + if (pclose(pipe) == -1) + err(1, "pclose"); + + (void)snprintf(command, sizeof(command), "%s %s", + _PATH_CAT, DATAFILE); + if ((pipe = popen(command, "r")) == NULL) + err(1, "popen read"); + + index = 0; + while ((in = fgetc(pipe)) != EOF) + if (index == BUFSIZE) { + errno = EFBIG; + err(1, "read"); + } + else + if ((char)in != buffer[index++]) { + errno = EINVAL; + err(1, "read"); + } + + if (index < BUFSIZE) { + errno = EIO; + err(1, "read"); + } + + if (pclose(pipe) == -1) + err(1, "pclose"); + + (void)unlink(DATAFILE); + return 0; +} |