10dc076565f772bb1953209fb69ea150b494aaa40robbiew/*
20dc076565f772bb1953209fb69ea150b494aaa40robbiew *  This program is free software; you can redistribute it and/or modify
30dc076565f772bb1953209fb69ea150b494aaa40robbiew *  it under the terms of the GNU General Public License version 2.
40dc076565f772bb1953209fb69ea150b494aaa40robbiew *
50dc076565f772bb1953209fb69ea150b494aaa40robbiew *  This program is distributed in the hope that it will be useful,
60dc076565f772bb1953209fb69ea150b494aaa40robbiew *  but WITHOUT ANY WARRANTY; without even the implied warranty of
70dc076565f772bb1953209fb69ea150b494aaa40robbiew *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
80dc076565f772bb1953209fb69ea150b494aaa40robbiew *  GNU General Public License for more details.
90dc076565f772bb1953209fb69ea150b494aaa40robbiew *
100dc076565f772bb1953209fb69ea150b494aaa40robbiew * Test that shm_open open the shared memory object for reading when calling
110dc076565f772bb1953209fb69ea150b494aaa40robbiew * shm_open even if the mode don't set read permission.
120dc076565f772bb1953209fb69ea150b494aaa40robbiew *
130dc076565f772bb1953209fb69ea150b494aaa40robbiew * The test use mmap to check the object is open for reading.
140dc076565f772bb1953209fb69ea150b494aaa40robbiew */
150dc076565f772bb1953209fb69ea150b494aaa40robbiew
160dc076565f772bb1953209fb69ea150b494aaa40robbiew/* ftruncate was formerly an XOPEN extension. We define _XOPEN_SOURCE here to
172c28215423293e443469a07ae7011135d058b671Garrett Cooper   avoid warning if the implementation does not program ftruncate as a base
180dc076565f772bb1953209fb69ea150b494aaa40robbiew   interface */
190dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _XOPEN_SOURCE 600
200dc076565f772bb1953209fb69ea150b494aaa40robbiew
210dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h>
220dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/mman.h>
230dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/stat.h>
240dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <unistd.h>
250dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <fcntl.h>
260dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <errno.h>
270dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h"
280dc076565f772bb1953209fb69ea150b494aaa40robbiew
290dc076565f772bb1953209fb69ea150b494aaa40robbiew#define BUF_SIZE 8
300dc076565f772bb1953209fb69ea150b494aaa40robbiew#define SHM_NAME "posixtest_20-3"
310dc076565f772bb1953209fb69ea150b494aaa40robbiew
324ca2bbdcd3003f3c8df4e6129e9c7b2bd1514f87Cyril Hrubisint main(void)
33354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
340dc076565f772bb1953209fb69ea150b494aaa40robbiew	int fd, result;
350dc076565f772bb1953209fb69ea150b494aaa40robbiew	void *ptr;
362c28215423293e443469a07ae7011135d058b671Garrett Cooper
370dc076565f772bb1953209fb69ea150b494aaa40robbiew	result = shm_unlink(SHM_NAME);
382c28215423293e443469a07ae7011135d058b671Garrett Cooper	if (result != 0 && errno != ENOENT) {
392c28215423293e443469a07ae7011135d058b671Garrett Cooper		/* The shared memory object exist and shm_unlink can not
400dc076565f772bb1953209fb69ea150b494aaa40robbiew		   remove it. */
410dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("An error occurs when calling shm_unlink()");
420dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
430dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
440dc076565f772bb1953209fb69ea150b494aaa40robbiew
45354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	fd = shm_open(SHM_NAME, O_RDWR | O_CREAT, 0);
46df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	if (fd == -1) {
470dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("An error occurs when calling shm_open()");
480dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
490dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
500dc076565f772bb1953209fb69ea150b494aaa40robbiew
51df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	if (ftruncate(fd, BUF_SIZE) != 0) {
520dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("An error occurs when calling ftruncate()");
530dc076565f772bb1953209fb69ea150b494aaa40robbiew		shm_unlink(SHM_NAME);
542c28215423293e443469a07ae7011135d058b671Garrett Cooper		return PTS_UNRESOLVED;
550dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
560dc076565f772bb1953209fb69ea150b494aaa40robbiew
570dc076565f772bb1953209fb69ea150b494aaa40robbiew	ptr = mmap(NULL, BUF_SIZE, PROT_NONE, MAP_SHARED, fd, 0);
58df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	if (ptr != MAP_FAILED) {
590dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf("Test PASSED\n");
600dc076565f772bb1953209fb69ea150b494aaa40robbiew		shm_unlink(SHM_NAME);
610dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_PASS;
62df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	} else if (errno == EACCES) {
630dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf("The shared memory object is not opened for reading.\n");
640dc076565f772bb1953209fb69ea150b494aaa40robbiew		shm_unlink(SHM_NAME);
650dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_FAIL;
660dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
670dc076565f772bb1953209fb69ea150b494aaa40robbiew
680dc076565f772bb1953209fb69ea150b494aaa40robbiew	perror("mmap");
690dc076565f772bb1953209fb69ea150b494aaa40robbiew	shm_unlink(SHM_NAME);
700dc076565f772bb1953209fb69ea150b494aaa40robbiew	return PTS_FAIL;
71ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
72