• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  This program is free software; you can redistribute it and/or modify
3  *  it under the terms of the GNU General Public License version 2.
4  *
5  *  This program is distributed in the hope that it will be useful,
6  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
7  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8  *  GNU General Public License for more details.
9  *
10  * Test that mlockall lock the shared memory pages currently mapped into the
11  * address space of the process when MCL_CURRENT is set.
12  *
13  * This test use msync to check that the page is locked.
14  */
15 
16 /* ftruncate was formerly an XOPEN extension. We define _XOPEN_SOURCE here to
17    avoid warning if the implementation does not program ftruncate as a base
18    interface */
19 #define _XOPEN_SOURCE 600
20 
21 #include <sys/mman.h>
22 #include <sys/stat.h>
23 #include <fcntl.h>
24 #include <stdio.h>
25 #include <unistd.h>
26 #include <errno.h>
27 #include "posixtest.h"
28 
29 #define BUF_SIZE 8
30 #define SHM_NAME "/posixtest_3-6"
31 
main(void)32 int main(void)
33 {
34 	void *page_ptr;
35 	size_t page_size;
36 	int result, fd;
37 	void *foo;
38 
39 	page_size = sysconf(_SC_PAGESIZE);
40 	if (errno) {
41 		perror("An error occurs when calling sysconf()");
42 		return PTS_UNRESOLVED;
43 	}
44 
45 	fd = shm_open(SHM_NAME, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
46 	if (fd == -1) {
47 		perror("An error occurs when calling shm_open()");
48 		return PTS_UNRESOLVED;
49 	}
50 
51 	if (ftruncate(fd, BUF_SIZE) != 0) {
52 		perror("An error occurs when calling ftruncate()");
53 		shm_unlink(SHM_NAME);
54 		return PTS_UNRESOLVED;
55 	}
56 
57 	foo = mmap(NULL, BUF_SIZE, PROT_WRITE, MAP_SHARED, fd, 0);
58 	if (foo == MAP_FAILED) {
59 		perror("An error occurs when calling mmap()");
60 		shm_unlink(SHM_NAME);
61 		return PTS_UNRESOLVED;
62 	}
63 
64 	if (mlockall(MCL_CURRENT) == -1) {
65 		if (errno == EPERM) {
66 			printf
67 			    ("You don't have permission to lock your address space.\nTry to rerun this test as root.\n");
68 		} else {
69 			perror("An error occurs when calling mlockall()");
70 		}
71 		return PTS_UNRESOLVED;
72 	}
73 
74 	page_ptr = (void *)((long)foo - ((long)foo % page_size));
75 
76 	result = msync(page_ptr, page_size, MS_SYNC | MS_INVALIDATE);
77 	if (result == -1 && errno == EBUSY) {
78 		printf("Test PASSED\n");
79 		return PTS_PASS;
80 	} else if (result == 0) {
81 		printf
82 		    ("The shared memory pages of the process are not locked.\n");
83 		return PTS_FAIL;
84 	}
85 	perror("Unexpected error");
86 	return PTS_UNRESOLVED;
87 }
88