xref: /dflybsd-src/test/testcases/posixipc/use_after_unlink/use_after_unlink.c (revision 0bba68feaae2960c1f2b5feb6978a8918f571707)
1*0bba68feSAntonio Huete Jimenez #include <common.h>
2*0bba68feSAntonio Huete Jimenez 
3*0bba68feSAntonio Huete Jimenez int
main(void)4*0bba68feSAntonio Huete Jimenez main(void) {
5*0bba68feSAntonio Huete Jimenez 	sem_t *id;
6*0bba68feSAntonio Huete Jimenez 
7*0bba68feSAntonio Huete Jimenez 	/*
8*0bba68feSAntonio Huete Jimenez 	 * Create named semaphore with value of 1 and then unlink it
9*0bba68feSAntonio Huete Jimenez 	 * while still retaining the initial reference.
10*0bba68feSAntonio Huete Jimenez 	 */
11*0bba68feSAntonio Huete Jimenez 	id = sem_open(TEST_PATH, O_CREAT | O_EXCL, 0777, 1);
12*0bba68feSAntonio Huete Jimenez 	if (id == SEM_FAILED) {
13*0bba68feSAntonio Huete Jimenez 		perror("sem_open(O_CREAT | O_EXCL)");
14*0bba68feSAntonio Huete Jimenez 		return 1;
15*0bba68feSAntonio Huete Jimenez 	}
16*0bba68feSAntonio Huete Jimenez 	if (sem_unlink(TEST_PATH) < 0) {
17*0bba68feSAntonio Huete Jimenez 		perror("sem_unlink");
18*0bba68feSAntonio Huete Jimenez 		sem_close(id);
19*0bba68feSAntonio Huete Jimenez 		return 1;
20*0bba68feSAntonio Huete Jimenez 	}
21*0bba68feSAntonio Huete Jimenez 	if (checkvalue(id, 1) < 0) {
22*0bba68feSAntonio Huete Jimenez 		sem_close(id);
23*0bba68feSAntonio Huete Jimenez 		return 1;
24*0bba68feSAntonio Huete Jimenez 	}
25*0bba68feSAntonio Huete Jimenez 
26*0bba68feSAntonio Huete Jimenez 	/* Post the semaphore to set its value to 2. */
27*0bba68feSAntonio Huete Jimenez 	if (sem_post(id) < 0) {
28*0bba68feSAntonio Huete Jimenez 		perror("sem_post");
29*0bba68feSAntonio Huete Jimenez 		sem_close(id);
30*0bba68feSAntonio Huete Jimenez 		return 1;
31*0bba68feSAntonio Huete Jimenez 	}
32*0bba68feSAntonio Huete Jimenez 	if (checkvalue(id, 2) < 0) {
33*0bba68feSAntonio Huete Jimenez 		sem_close(id);
34*0bba68feSAntonio Huete Jimenez 		return 1;
35*0bba68feSAntonio Huete Jimenez 	}
36*0bba68feSAntonio Huete Jimenez 
37*0bba68feSAntonio Huete Jimenez 	/* Wait on the semaphore which should set its value to 1. */
38*0bba68feSAntonio Huete Jimenez 	if (sem_wait(id) < 0) {
39*0bba68feSAntonio Huete Jimenez 		perror("sem_wait");
40*0bba68feSAntonio Huete Jimenez 		sem_close(id);
41*0bba68feSAntonio Huete Jimenez 		return 1;
42*0bba68feSAntonio Huete Jimenez 	}
43*0bba68feSAntonio Huete Jimenez 	if (checkvalue(id, 1) < 0) {
44*0bba68feSAntonio Huete Jimenez 		sem_close(id);
45*0bba68feSAntonio Huete Jimenez 		return 1;
46*0bba68feSAntonio Huete Jimenez 	}
47*0bba68feSAntonio Huete Jimenez 
48*0bba68feSAntonio Huete Jimenez 	if (sem_close(id) < 0) {
49*0bba68feSAntonio Huete Jimenez 		perror("sem_close");
50*0bba68feSAntonio Huete Jimenez 		return 1;
51*0bba68feSAntonio Huete Jimenez 	}
52*0bba68feSAntonio Huete Jimenez 	return 0;
53*0bba68feSAntonio Huete Jimenez }
54