1*d583b39bSJohn Wren Kennedy /*
2*d583b39bSJohn Wren Kennedy  * CDDL HEADER START
3*d583b39bSJohn Wren Kennedy  *
4*d583b39bSJohn Wren Kennedy  * The contents of this file are subject to the terms of the
5*d583b39bSJohn Wren Kennedy  * Common Development and Distribution License (the "License").
6*d583b39bSJohn Wren Kennedy  * You may not use this file except in compliance with the License.
7*d583b39bSJohn Wren Kennedy  *
8*d583b39bSJohn Wren Kennedy  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*d583b39bSJohn Wren Kennedy  * or http://www.opensolaris.org/os/licensing.
10*d583b39bSJohn Wren Kennedy  * See the License for the specific language governing permissions
11*d583b39bSJohn Wren Kennedy  * and limitations under the License.
12*d583b39bSJohn Wren Kennedy  *
13*d583b39bSJohn Wren Kennedy  * When distributing Covered Code, include this CDDL HEADER in each
14*d583b39bSJohn Wren Kennedy  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*d583b39bSJohn Wren Kennedy  * If applicable, add the following below this CDDL HEADER, with the
16*d583b39bSJohn Wren Kennedy  * fields enclosed by brackets "[]" replaced with your own identifying
17*d583b39bSJohn Wren Kennedy  * information: Portions Copyright [yyyy] [name of copyright owner]
18*d583b39bSJohn Wren Kennedy  *
19*d583b39bSJohn Wren Kennedy  * CDDL HEADER END
20*d583b39bSJohn Wren Kennedy  */
21*d583b39bSJohn Wren Kennedy 
22*d583b39bSJohn Wren Kennedy /*
23*d583b39bSJohn Wren Kennedy  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24*d583b39bSJohn Wren Kennedy  * Use is subject to license terms.
25*d583b39bSJohn Wren Kennedy  */
26*d583b39bSJohn Wren Kennedy 
27*d583b39bSJohn Wren Kennedy /*
28*d583b39bSJohn Wren Kennedy  * --------------------------------------------------------------
29*d583b39bSJohn Wren Kennedy  *	BugId 5047993 : Getting bad read data.
30*d583b39bSJohn Wren Kennedy  *
31*d583b39bSJohn Wren Kennedy  *	Usage: readmmap <filename>
32*d583b39bSJohn Wren Kennedy  *
33*d583b39bSJohn Wren Kennedy  *	where:
34*d583b39bSJohn Wren Kennedy  *		filename is an absolute path to the file name.
35*d583b39bSJohn Wren Kennedy  *
36*d583b39bSJohn Wren Kennedy  *	Return values:
37*d583b39bSJohn Wren Kennedy  *		1 : error
38*d583b39bSJohn Wren Kennedy  *		0 : no errors
39*d583b39bSJohn Wren Kennedy  * --------------------------------------------------------------
40*d583b39bSJohn Wren Kennedy  */
41*d583b39bSJohn Wren Kennedy #include <stdio.h>
42*d583b39bSJohn Wren Kennedy #include <stdlib.h>
43*d583b39bSJohn Wren Kennedy #include <unistd.h>
44*d583b39bSJohn Wren Kennedy #include <fcntl.h>
45*d583b39bSJohn Wren Kennedy #include <errno.h>
46*d583b39bSJohn Wren Kennedy #include <sys/mman.h>
47*d583b39bSJohn Wren Kennedy 
48*d583b39bSJohn Wren Kennedy int
main(int argc,char ** argv)49*d583b39bSJohn Wren Kennedy main(int argc, char **argv)
50*d583b39bSJohn Wren Kennedy {
51*d583b39bSJohn Wren Kennedy 	char *filename = "badfile";
52*d583b39bSJohn Wren Kennedy 	size_t size = 4395;
53*d583b39bSJohn Wren Kennedy 	size_t idx = 0;
54*d583b39bSJohn Wren Kennedy 	char *buf = NULL;
55*d583b39bSJohn Wren Kennedy 	char *map = NULL;
56*d583b39bSJohn Wren Kennedy 	int fd = -1, bytes, retval = 0;
57*d583b39bSJohn Wren Kennedy 	unsigned seed;
58*d583b39bSJohn Wren Kennedy 
59*d583b39bSJohn Wren Kennedy 	if (argc < 2 || optind == argc) {
60*d583b39bSJohn Wren Kennedy 		(void) fprintf(stderr,
61*d583b39bSJohn Wren Kennedy 		    "usage: %s <file name>\n", argv[0]);
62*d583b39bSJohn Wren Kennedy 		exit(1);
63*d583b39bSJohn Wren Kennedy 	}
64*d583b39bSJohn Wren Kennedy 
65*d583b39bSJohn Wren Kennedy 	if ((buf = calloc(1, size)) == NULL) {
66*d583b39bSJohn Wren Kennedy 		perror("calloc");
67*d583b39bSJohn Wren Kennedy 		exit(1);
68*d583b39bSJohn Wren Kennedy 	}
69*d583b39bSJohn Wren Kennedy 
70*d583b39bSJohn Wren Kennedy 	filename = argv[optind];
71*d583b39bSJohn Wren Kennedy 
72*d583b39bSJohn Wren Kennedy 	(void) remove(filename);
73*d583b39bSJohn Wren Kennedy 
74*d583b39bSJohn Wren Kennedy 	fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0666);
75*d583b39bSJohn Wren Kennedy 	if (fd == -1) {
76*d583b39bSJohn Wren Kennedy 		perror("open to create");
77*d583b39bSJohn Wren Kennedy 		retval = 1;
78*d583b39bSJohn Wren Kennedy 		goto end;
79*d583b39bSJohn Wren Kennedy 	}
80*d583b39bSJohn Wren Kennedy 
81*d583b39bSJohn Wren Kennedy 	bytes = write(fd, buf, size);
82*d583b39bSJohn Wren Kennedy 	if (bytes != size) {
83*d583b39bSJohn Wren Kennedy 		(void) printf("short write: %d != %ud\n", bytes, size);
84*d583b39bSJohn Wren Kennedy 		retval = 1;
85*d583b39bSJohn Wren Kennedy 		goto end;
86*d583b39bSJohn Wren Kennedy 	}
87*d583b39bSJohn Wren Kennedy 
88*d583b39bSJohn Wren Kennedy 	map = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
89*d583b39bSJohn Wren Kennedy 	if (map == MAP_FAILED) {
90*d583b39bSJohn Wren Kennedy 		perror("mmap");
91*d583b39bSJohn Wren Kennedy 		retval = 1;
92*d583b39bSJohn Wren Kennedy 		goto end;
93*d583b39bSJohn Wren Kennedy 	}
94*d583b39bSJohn Wren Kennedy 	seed = time(NULL);
95*d583b39bSJohn Wren Kennedy 	srandom(seed);
96*d583b39bSJohn Wren Kennedy 
97*d583b39bSJohn Wren Kennedy 	idx = random() % size;
98*d583b39bSJohn Wren Kennedy 	map[idx] = 1;
99*d583b39bSJohn Wren Kennedy 
100*d583b39bSJohn Wren Kennedy 	if (msync(map, size, MS_SYNC) != 0) {
101*d583b39bSJohn Wren Kennedy 		perror("msync");
102*d583b39bSJohn Wren Kennedy 		retval = 1;
103*d583b39bSJohn Wren Kennedy 		goto end;
104*d583b39bSJohn Wren Kennedy 	}
105*d583b39bSJohn Wren Kennedy 
106*d583b39bSJohn Wren Kennedy 	if (munmap(map, size) != 0) {
107*d583b39bSJohn Wren Kennedy 		perror("munmap");
108*d583b39bSJohn Wren Kennedy 		retval = 1;
109*d583b39bSJohn Wren Kennedy 		goto end;
110*d583b39bSJohn Wren Kennedy 	}
111*d583b39bSJohn Wren Kennedy 
112*d583b39bSJohn Wren Kennedy 	bytes = pread(fd, buf, size, 0);
113*d583b39bSJohn Wren Kennedy 	if (bytes != size) {
114*d583b39bSJohn Wren Kennedy 		(void) printf("short read: %d != %ud\n", bytes, size);
115*d583b39bSJohn Wren Kennedy 		retval = 1;
116*d583b39bSJohn Wren Kennedy 		goto end;
117*d583b39bSJohn Wren Kennedy 	}
118*d583b39bSJohn Wren Kennedy 
119*d583b39bSJohn Wren Kennedy 	if (buf[idx] != 1) {
120*d583b39bSJohn Wren Kennedy 		(void) printf(
121*d583b39bSJohn Wren Kennedy 		    "bad data from read!  got buf[%ud]=%d, expected 1\n",
122*d583b39bSJohn Wren Kennedy 		    idx, buf[idx]);
123*d583b39bSJohn Wren Kennedy 		retval = 1;
124*d583b39bSJohn Wren Kennedy 		goto end;
125*d583b39bSJohn Wren Kennedy 	}
126*d583b39bSJohn Wren Kennedy 
127*d583b39bSJohn Wren Kennedy 	(void) printf("good data from read: buf[%ud]=1\n", idx);
128*d583b39bSJohn Wren Kennedy end:
129*d583b39bSJohn Wren Kennedy 	if (fd != -1) {
130*d583b39bSJohn Wren Kennedy 		(void) close(fd);
131*d583b39bSJohn Wren Kennedy 	}
132*d583b39bSJohn Wren Kennedy 	if (buf != NULL) {
133*d583b39bSJohn Wren Kennedy 		free(buf);
134*d583b39bSJohn Wren Kennedy 	}
135*d583b39bSJohn Wren Kennedy 
136*d583b39bSJohn Wren Kennedy 	return (retval);
137*d583b39bSJohn Wren Kennedy }
138