1 1.4 christos /* $NetBSD: t_popen.c,v 1.4 2013/02/15 23:27:19 christos Exp $ */ 2 1.1 pgoyette 3 1.1 pgoyette /*- 4 1.1 pgoyette * Copyright (c) 1999 The NetBSD Foundation, Inc. 5 1.1 pgoyette * All rights reserved. 6 1.1 pgoyette * 7 1.1 pgoyette * This code is derived from software contributed to The NetBSD Foundation 8 1.1 pgoyette * by Matthias Scheler. 9 1.1 pgoyette * 10 1.1 pgoyette * Redistribution and use in source and binary forms, with or without 11 1.1 pgoyette * modification, are permitted provided that the following conditions 12 1.1 pgoyette * are met: 13 1.1 pgoyette * 1. Redistributions of source code must retain the above copyright 14 1.1 pgoyette * notice, this list of conditions and the following disclaimer. 15 1.1 pgoyette * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 pgoyette * notice, this list of conditions and the following disclaimer in the 17 1.1 pgoyette * documentation and/or other materials provided with the distribution. 18 1.1 pgoyette * 19 1.1 pgoyette * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 pgoyette * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 pgoyette * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.3 jruoho * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 pgoyette * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 pgoyette * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 pgoyette * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 pgoyette * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 pgoyette * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 pgoyette * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 pgoyette * POSSIBILITY OF SUCH DAMAGE. 30 1.1 pgoyette */ 31 1.1 pgoyette 32 1.1 pgoyette #include <sys/cdefs.h> 33 1.1 pgoyette #ifndef lint 34 1.1 pgoyette __COPYRIGHT("@(#) Copyright (c) 1999\ 35 1.1 pgoyette The NetBSD Foundation, Inc. All rights reserved."); 36 1.1 pgoyette #endif /* not lint */ 37 1.1 pgoyette 38 1.1 pgoyette #ifndef lint 39 1.4 christos __RCSID("$NetBSD: t_popen.c,v 1.4 2013/02/15 23:27:19 christos Exp $"); 40 1.1 pgoyette #endif /* not lint */ 41 1.1 pgoyette 42 1.1 pgoyette #include <atf-c.h> 43 1.1 pgoyette 44 1.1 pgoyette #include <sys/param.h> 45 1.1 pgoyette 46 1.1 pgoyette #include <errno.h> 47 1.2 christos #include <err.h> 48 1.1 pgoyette #include <paths.h> 49 1.1 pgoyette #include <stdio.h> 50 1.1 pgoyette #include <stdlib.h> 51 1.1 pgoyette #include <time.h> 52 1.1 pgoyette #include <unistd.h> 53 1.1 pgoyette 54 1.1 pgoyette #define _PATH_CAT "/bin/cat" 55 1.1 pgoyette #define BUFSIZE (640*1024) 56 1.1 pgoyette /* 640KB ought to be enough for everyone. */ 57 1.1 pgoyette #define DATAFILE "popen.data" 58 1.1 pgoyette 59 1.1 pgoyette #define TEST_ERROR(a) \ 60 1.1 pgoyette do \ 61 1.1 pgoyette { \ 62 1.2 christos warn(a); \ 63 1.1 pgoyette atf_tc_fail("Check stderr for error details."); \ 64 1.1 pgoyette } while ( /*CONSTCOND*/ 0 ) 65 1.1 pgoyette 66 1.3 jruoho ATF_TC_WITH_CLEANUP(popen_zeropad); 67 1.3 jruoho ATF_TC_HEAD(popen_zeropad, tc) 68 1.3 jruoho { 69 1.1 pgoyette 70 1.1 pgoyette atf_tc_set_md_var(tc, "descr", "output format zero padding"); 71 1.1 pgoyette } 72 1.3 jruoho 73 1.3 jruoho ATF_TC_BODY(popen_zeropad, tc) 74 1.1 pgoyette { 75 1.1 pgoyette char *buffer, command[MAXPATHLEN]; 76 1.4 christos int idx, in; 77 1.1 pgoyette FILE *my_pipe; 78 1.1 pgoyette 79 1.3 jruoho if ((buffer = malloc(BUFSIZE)) == NULL) 80 1.1 pgoyette atf_tc_skip("Unable to allocate buffer."); 81 1.1 pgoyette 82 1.1 pgoyette srand ((unsigned int)time(NULL)); 83 1.3 jruoho 84 1.4 christos for (idx = 0; idx < BUFSIZE; idx++) 85 1.4 christos buffer[idx]=(char)rand(); 86 1.1 pgoyette 87 1.3 jruoho (void)snprintf(command, sizeof(command), "%s >%s", 88 1.3 jruoho _PATH_CAT, DATAFILE); 89 1.3 jruoho 90 1.1 pgoyette if ((my_pipe = popen(command, "w")) == NULL) 91 1.1 pgoyette TEST_ERROR("popen write"); 92 1.1 pgoyette 93 1.1 pgoyette if (fwrite(buffer, sizeof(char), BUFSIZE, my_pipe) != BUFSIZE) 94 1.1 pgoyette TEST_ERROR("fwrite"); 95 1.1 pgoyette 96 1.1 pgoyette if (pclose(my_pipe) == -1) 97 1.1 pgoyette TEST_ERROR("pclose"); 98 1.1 pgoyette 99 1.1 pgoyette (void)snprintf(command, sizeof(command), "%s %s", _PATH_CAT, DATAFILE); 100 1.3 jruoho 101 1.1 pgoyette if ((my_pipe = popen(command, "r")) == NULL) 102 1.1 pgoyette TEST_ERROR("popen read"); 103 1.1 pgoyette 104 1.4 christos idx = 0; 105 1.1 pgoyette while ((in = fgetc(my_pipe)) != EOF) 106 1.4 christos if (idx == BUFSIZE) { 107 1.1 pgoyette errno = EFBIG; 108 1.1 pgoyette TEST_ERROR("read"); 109 1.1 pgoyette } 110 1.4 christos else if ((char)in != buffer[idx++]) { 111 1.1 pgoyette errno = EINVAL; 112 1.1 pgoyette TEST_ERROR("read"); 113 1.1 pgoyette } 114 1.1 pgoyette 115 1.4 christos if (idx < BUFSIZE) { 116 1.1 pgoyette errno = EIO; 117 1.1 pgoyette TEST_ERROR("read"); 118 1.1 pgoyette } 119 1.1 pgoyette 120 1.1 pgoyette if (pclose(my_pipe) == -1) 121 1.1 pgoyette TEST_ERROR("pclose"); 122 1.1 pgoyette } 123 1.1 pgoyette 124 1.3 jruoho ATF_TC_CLEANUP(popen_zeropad, tc) 125 1.1 pgoyette { 126 1.1 pgoyette (void)unlink(DATAFILE); 127 1.1 pgoyette } 128 1.1 pgoyette 129 1.1 pgoyette ATF_TP_ADD_TCS(tp) 130 1.1 pgoyette { 131 1.3 jruoho 132 1.3 jruoho ATF_TP_ADD_TC(tp, popen_zeropad); 133 1.1 pgoyette 134 1.1 pgoyette return atf_no_error(); 135 1.1 pgoyette } 136