1 /* 2 * 3 * Copyright (c) International Business Machines Corp., 2002 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13 * the GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 20 /* 01/02/2003 Port to LTP avenkat@us.ibm.com */ 21 /* 06/30/2001 Port to Linux nsharoff@us.ibm.com */ 22 23 /* 24 * NAME 25 * memcpy -- test memcpy 26 * 27 * CALLS 28 * memcpy1(3) 29 * 30 * ALGORITHM 31 * There are 2 cases for copies: S = Source, D = Destination 32 * 33 * 1 - S < D no overlap 34 * 2 - D < S no overlap 35 * 36 * We try both cases. Check buffer boundaries. 37 * 38 * RESTRICTIONS 39 */ 40 41 #include <stdio.h> 42 #include <string.h> 43 #include <unistd.h> 44 #include <string.h> 45 #include <errno.h> 46 47 #include "test.h" 48 49 char *TCID = "memcpy1"; 50 51 #undef BSIZE 52 #define BSIZE 4096 53 #define LEN 100 54 #define FAILED 0 55 #define PASSED 1 56 57 int local_flag = PASSED; 58 int block_number; 59 FILE *temp; 60 int TST_TOTAL = 1; 61 char buf[BSIZE]; 62 63 64 int anyfail(); 65 int blenter(); 66 int blexit(); 67 68 void setup(); 69 void clearit(); 70 void fill(char *str); 71 int checkit(char *str); 72 73 int main(int argc, char *argv[]) 74 { 75 char *p, *q; 76 77 tst_parse_opts(argc, argv, NULL, NULL); 78 79 setup(); /* temp file is now open */ 80 /*--------------------------------------------------------------*/ 81 blenter(); 82 83 clearit(); 84 85 p = &buf[100]; 86 87 fill(p); 88 q = &buf[800]; 89 memcpy(q, p, LEN); 90 91 if (checkit(q)) { 92 fprintf(temp, "\tcopy failed - missed data\n"); 93 local_flag = FAILED; 94 } 95 96 if (p[-1] || p[LEN]) { 97 fprintf(temp, "\tcopy failed - 'to' bounds\n"); 98 local_flag = FAILED; 99 } 100 101 if (q[-1] || q[LEN]) { 102 fprintf(temp, "\tcopy failed - 'from' bounds\n"); 103 local_flag = FAILED; 104 } 105 106 blexit(); 107 /*--------------------------------------------------------------*/ 108 blenter(); 109 110 clearit(); 111 112 p = &buf[800]; 113 114 fill(p); 115 q = &buf[100]; 116 memcpy(q, p, LEN); 117 118 if (checkit(q)) { 119 fprintf(temp, "\tcopy failed - missed data\n"); 120 local_flag = FAILED; 121 } 122 123 if (p[-1] || p[LEN]) { 124 fprintf(temp, "\tcopy failed - 'to' bounds\n"); 125 local_flag = FAILED; 126 } 127 128 if (q[-1] || q[LEN]) { 129 fprintf(temp, "\tcopy failed - 'from' bounds\n"); 130 local_flag = FAILED; 131 } 132 133 blexit(); 134 135 anyfail(); 136 tst_exit(); 137 } 138 139 void clearit(void) 140 { 141 register int i; 142 143 for (i = 0; i < BSIZE; i++) 144 buf[i] = 0; 145 } 146 147 void fill(char *str) 148 { 149 register int i; 150 for (i = 0; i < LEN; i++) 151 *str++ = 'a'; 152 } 153 154 int checkit(char *str) 155 { 156 register int i; 157 for (i = 0; i < LEN; i++) 158 if (*str++ != 'a') 159 return (-1); 160 161 return (0); 162 } 163 164 int anyfail(void) 165 { 166 (local_flag == FAILED) ? tst_resm(TFAIL, 167 "Test failed") : tst_resm(TPASS, 168 "Test passed"); 169 tst_exit(); 170 } 171 172 void setup(void) 173 { 174 temp = stderr; 175 } 176 177 int blenter(void) 178 { 179 local_flag = PASSED; 180 return 0; 181 } 182 183 int blexit(void) 184 { 185 (local_flag == FAILED) ? tst_resm(TFAIL, 186 "Test failed") : tst_resm(TPASS, 187 "Test passed"); 188 return 0; 189 } 190