12c28215423293e443469a07ae7011135d058b671Garrett Cooper/*
20dc076565f772bb1953209fb69ea150b494aaa40robbiew * Copyright (c) 2002, Intel Corporation. All rights reserved.
344de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis * Copyright (c) 2012, Cyril Hrubis <chrubis@suse.cz>
444de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis *
50dc076565f772bb1953209fb69ea150b494aaa40robbiew * This file is licensed under the GPL license.  For the full content
62c28215423293e443469a07ae7011135d058b671Garrett Cooper * of this license, see the COPYING file at the top level of this
70dc076565f772bb1953209fb69ea150b494aaa40robbiew * source tree.
844de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis *
92c28215423293e443469a07ae7011135d058b671Garrett Cooper * The mmap() function shall establish a mapping between a process's
100dc076565f772bb1953209fb69ea150b494aaa40robbiew * address space and a file,
110dc076565f772bb1953209fb69ea150b494aaa40robbiew *
1243c1224558e7ea2df04e16ba6b88b4945c750dfaCyril Hrubis * Test Steps:
130dc076565f772bb1953209fb69ea150b494aaa40robbiew * 1. Create a tmp file;
140dc076565f772bb1953209fb69ea150b494aaa40robbiew * 2. mmap it to memory using mmap();
150dc076565f772bb1953209fb69ea150b494aaa40robbiew *
160dc076565f772bb1953209fb69ea150b494aaa40robbiew */
170dc076565f772bb1953209fb69ea150b494aaa40robbiew
180dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _XOPEN_SOURCE 600
190dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h>
200dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h>
210dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <unistd.h>
220dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/mman.h>
230dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/types.h>
240dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/stat.h>
250dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <fcntl.h>
260dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <string.h>
270dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <errno.h>
280dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h"
292c28215423293e443469a07ae7011135d058b671Garrett Cooper
3044de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubisint main(void)
310dc076565f772bb1953209fb69ea150b494aaa40robbiew{
3244de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	char tmpfname[256];
3375d9d65295cf559f9ba38aae5c16acf426e397f9Cyril Hrubis	ssize_t len = 1024;
34e6ad98c69b0347d4e9033677bf5673c192edf4a0Wei,Jiangang	char data[len];
35e6ad98c69b0347d4e9033677bf5673c192edf4a0Wei,Jiangang	void *pa;
3644de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	int fd;
372c28215423293e443469a07ae7011135d058b671Garrett Cooper
3844de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_mmap_1_1_%d", getpid());
3944de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	unlink(tmpfname);
4044de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR);
4144de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	if (fd == -1) {
4244de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		printf("Error at open(): %s\n", strerror(errno));
4344de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		return PTS_UNRESOLVED;
4444de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	}
4543c1224558e7ea2df04e16ba6b88b4945c750dfaCyril Hrubis
4644de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	unlink(tmpfname);
4743c1224558e7ea2df04e16ba6b88b4945c750dfaCyril Hrubis
4844de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	memset(data, 'a', len);
4944de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	if (write(fd, data, len) != len) {
5044de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		printf("Error at write(): %s\n", strerror(errno));
5144de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		return PTS_UNRESOLVED;
5244de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	}
532c28215423293e443469a07ae7011135d058b671Garrett Cooper
5444de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	pa = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5544de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	if (pa == MAP_FAILED) {
5644de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		printf("Error at mmap: %s\n", strerror(errno));
5744de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		return PTS_FAIL;
5844de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	}
590dc076565f772bb1953209fb69ea150b494aaa40robbiew
6043c1224558e7ea2df04e16ba6b88b4945c750dfaCyril Hrubis	if (*(char *)pa != 'a') {
6144de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		printf("Test FAILED: The file was not mapped correctly.\n");
6244de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis		return PTS_FAIL;
6344de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	}
640dc076565f772bb1953209fb69ea150b494aaa40robbiew
6544de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	close(fd);
6644de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	munmap(pa, len);
6744de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	printf("Test PASSED\n");
6844de8a350c48dcf079d2871493d8d635fe1d7de0Cyril Hrubis	return PTS_PASS;
69ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
70