Home | History | Annotate | Download | only in readv
      1 /*
      2  * Copyright (c) International Business Machines  Corp., 2001
      3  *   07/2001 Ported by Wayne Boyer
      4  *
      5  * Copyright (c) 2013 Cyril Hrubis <chrubis (at) suse.cz>
      6  *
      7  * This program is free software;  you can redistribute it and/or modify
      8  * it under the terms of the GNU General Public License as published by
      9  * the Free Software Foundation; either version 2 of the License, or
     10  * (at your option) any later version.
     11  *
     12  * This program is distributed in the hope that it will be useful,
     13  * but WITHOUT ANY WARRANTY;  without even the implied warranty of
     14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     15  * the GNU General Public License for more details.
     16  *
     17  * You should have received a copy of the GNU General Public License
     18  * along with this program;  if not, write to the Free Software
     19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     20  */
     21 
     22 /*
     23  * DESCRIPTION
     24  *	Testcase to check the basic functionality of the readv(2) system call.
     25  *
     26  * ALGORITHM
     27  *	Create a IO vector, and attempt to readv() various components of it.
     28  */
     29 #include <stdlib.h>
     30 #include <sys/types.h>
     31 #include <sys/uio.h>
     32 #include <fcntl.h>
     33 #include <memory.h>
     34 #include <errno.h>
     35 
     36 #include "test.h"
     37 #include "safe_macros.h"
     38 
     39 #define	CHUNK		64
     40 
     41 char *TCID = "readv01";
     42 int TST_TOTAL = 1;
     43 
     44 static char buf[CHUNK];
     45 
     46 static struct iovec rd_iovec[] = {
     47 	{buf, CHUNK},
     48 	{NULL, 0},
     49 	{NULL, 0},
     50 };
     51 
     52 static int fd;
     53 
     54 static void setup(void);
     55 static void cleanup(void);
     56 
     57 int main(int ac, char **av)
     58 {
     59 	int lc, i, fail;
     60 	char *vec;
     61 
     62 	tst_parse_opts(ac, av, NULL, NULL);
     63 
     64 	setup();
     65 
     66 	for (lc = 0; TEST_LOOPING(lc); lc++) {
     67 		tst_count = 0;
     68 
     69 		SAFE_LSEEK(cleanup, fd, 0, SEEK_SET);
     70 
     71 		if (readv(fd, rd_iovec, 0) == -1)
     72 			tst_resm(TFAIL | TERRNO, "readv failed unexpectedly");
     73 		else
     74 			tst_resm(TPASS, "readv read 0 io vectors");
     75 
     76 		memset(rd_iovec[0].iov_base, 0x00, CHUNK);
     77 
     78 		if (readv(fd, rd_iovec, 3) != CHUNK) {
     79 			tst_resm(TFAIL, "readv failed reading %d bytes, "
     80 				 "followed by two NULL vectors", CHUNK);
     81 		} else {
     82 			fail = 0;
     83 			vec = rd_iovec[0].iov_base;
     84 
     85 			for (i = 0; i < CHUNK; i++) {
     86 				if (vec[i] != 0x42)
     87 					fail++;
     88 			}
     89 
     90 			if (fail)
     91 				tst_resm(TFAIL, "Wrong buffer content");
     92 			else
     93 				tst_resm(TPASS, "readv passed reading %d bytes "
     94 				         "followed by two NULL vectors", CHUNK);
     95 		}
     96 	}
     97 
     98 	cleanup();
     99 	tst_exit();
    100 }
    101 
    102 static void setup(void)
    103 {
    104 	tst_sig(NOFORK, DEF_HANDLER, cleanup);
    105 
    106 	TEST_PAUSE;
    107 
    108 	tst_tmpdir();
    109 
    110 	memset(buf, 0x42, sizeof(buf));
    111 
    112 	fd = SAFE_OPEN(cleanup, "data_file", O_WRONLY | O_CREAT, 0666);
    113 	SAFE_WRITE(cleanup, 1, fd, buf, sizeof(buf));
    114 	SAFE_CLOSE(cleanup, fd);
    115 	fd = SAFE_OPEN(cleanup, "data_file", O_RDONLY);
    116 }
    117 
    118 static void cleanup(void)
    119 {
    120 	if (fd > 0)
    121 		close(fd);
    122 
    123 	tst_rmdir();
    124 }
    125