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 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