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