xref: /dflybsd-src/test/testcases/posixipc/common/common.c (revision 944cd60c7b4392d637be82be7baafe9ac12a3061)
10bba68feSAntonio Huete Jimenez /*-
20bba68feSAntonio Huete Jimenez  * Copyright (c) 2008 Yahoo!, Inc.
30bba68feSAntonio Huete Jimenez  * All rights reserved.
40bba68feSAntonio Huete Jimenez  * Written by: John Baldwin <jhb@FreeBSD.org>
50bba68feSAntonio Huete Jimenez  *
60bba68feSAntonio Huete Jimenez  * Redistribution and use in source and binary forms, with or without
70bba68feSAntonio Huete Jimenez  * modification, are permitted provided that the following conditions
80bba68feSAntonio Huete Jimenez  * are met:
90bba68feSAntonio Huete Jimenez  * 1. Redistributions of source code must retain the above copyright
100bba68feSAntonio Huete Jimenez  *    notice, this list of conditions and the following disclaimer.
110bba68feSAntonio Huete Jimenez  * 2. Redistributions in binary form must reproduce the above copyright
120bba68feSAntonio Huete Jimenez  *    notice, this list of conditions and the following disclaimer in the
130bba68feSAntonio Huete Jimenez  *    documentation and/or other materials provided with the distribution.
140bba68feSAntonio Huete Jimenez  * 3. Neither the name of the author nor the names of any co-contributors
150bba68feSAntonio Huete Jimenez  *    may be used to endorse or promote products derived from this software
160bba68feSAntonio Huete Jimenez  *    without specific prior written permission.
170bba68feSAntonio Huete Jimenez  *
180bba68feSAntonio Huete Jimenez  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
190bba68feSAntonio Huete Jimenez  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
200bba68feSAntonio Huete Jimenez  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
210bba68feSAntonio Huete Jimenez  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
220bba68feSAntonio Huete Jimenez  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
230bba68feSAntonio Huete Jimenez  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
240bba68feSAntonio Huete Jimenez  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
250bba68feSAntonio Huete Jimenez  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
260bba68feSAntonio Huete Jimenez  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
270bba68feSAntonio Huete Jimenez  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
280bba68feSAntonio Huete Jimenez  * SUCH DAMAGE.
290bba68feSAntonio Huete Jimenez  */
300bba68feSAntonio Huete Jimenez 
310bba68feSAntonio Huete Jimenez #include <sys/cdefs.h>
320bba68feSAntonio Huete Jimenez #include <sys/mman.h>
330bba68feSAntonio Huete Jimenez #include <sys/queue.h>
340bba68feSAntonio Huete Jimenez #include <sys/sysctl.h>
350bba68feSAntonio Huete Jimenez #include <sys/time.h>
360bba68feSAntonio Huete Jimenez #include <sys/types.h>
370bba68feSAntonio Huete Jimenez #include <sys/user.h>
380bba68feSAntonio Huete Jimenez #include <sys/wait.h>
390bba68feSAntonio Huete Jimenez 
400bba68feSAntonio Huete Jimenez #include <errno.h>
410bba68feSAntonio Huete Jimenez #include <kvm.h>
420bba68feSAntonio Huete Jimenez #include <limits.h>
430bba68feSAntonio Huete Jimenez #include <signal.h>
440bba68feSAntonio Huete Jimenez #include <stdio.h>
450bba68feSAntonio Huete Jimenez #include <time.h>
460bba68feSAntonio Huete Jimenez 
470bba68feSAntonio Huete Jimenez #include <common.h>
480bba68feSAntonio Huete Jimenez 
490bba68feSAntonio Huete Jimenez /*
500bba68feSAntonio Huete Jimenez  * Use a timer to post a specific semaphore after a timeout.  A timer
510bba68feSAntonio Huete Jimenez  * is scheduled via schedule_post().  check_alarm() must be called
520bba68feSAntonio Huete Jimenez  * afterwards to clean up and check for errors.
530bba68feSAntonio Huete Jimenez  */
540bba68feSAntonio Huete Jimenez sem_t *alarm_id = SEM_FAILED;
550bba68feSAntonio Huete Jimenez int alarm_errno;
560bba68feSAntonio Huete Jimenez int alarm_handler_installed;
570bba68feSAntonio Huete Jimenez 
580bba68feSAntonio Huete Jimenez int
checkvalue(sem_t * id,int expected)590bba68feSAntonio Huete Jimenez checkvalue(sem_t *id, int expected)
600bba68feSAntonio Huete Jimenez {
610bba68feSAntonio Huete Jimenez 	int val;
620bba68feSAntonio Huete Jimenez 
630bba68feSAntonio Huete Jimenez 	if (sem_getvalue(id, &val) < 0) {
640bba68feSAntonio Huete Jimenez 		perror("sem_getvalue");
650bba68feSAntonio Huete Jimenez 		return (-1);
660bba68feSAntonio Huete Jimenez 	}
670bba68feSAntonio Huete Jimenez 	if (val != expected) {
680bba68feSAntonio Huete Jimenez 		fprintf(stderr, "sem value should be %d instead of %d",
690bba68feSAntonio Huete Jimenez 		    expected, val);
700bba68feSAntonio Huete Jimenez 		return (-1);
710bba68feSAntonio Huete Jimenez 	}
720bba68feSAntonio Huete Jimenez 	return (0);
730bba68feSAntonio Huete Jimenez }
740bba68feSAntonio Huete Jimenez 
750bba68feSAntonio Huete Jimenez sem_t *
construct_shared_unnamed_sem(unsigned int count)760bba68feSAntonio Huete Jimenez construct_shared_unnamed_sem(unsigned int count)
770bba68feSAntonio Huete Jimenez {
780bba68feSAntonio Huete Jimenez 	sem_t *id = mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE,
790bba68feSAntonio Huete Jimenez 			 MAP_SHARED|MAP_ANON, -1, 0);
800bba68feSAntonio Huete Jimenez 	if (id == MAP_FAILED) {
810bba68feSAntonio Huete Jimenez 		perror("mmap");
820bba68feSAntonio Huete Jimenez 		return SEM_FAILED;
830bba68feSAntonio Huete Jimenez 	}
840bba68feSAntonio Huete Jimenez 
850bba68feSAntonio Huete Jimenez 	if (sem_init(id, 1, count) < 0) {
860bba68feSAntonio Huete Jimenez 		perror("sem_init");
870bba68feSAntonio Huete Jimenez 		munmap(id, sizeof(sem_t));
880bba68feSAntonio Huete Jimenez 		return SEM_FAILED;
890bba68feSAntonio Huete Jimenez 	}
900bba68feSAntonio Huete Jimenez 
910bba68feSAntonio Huete Jimenez 	return id;
920bba68feSAntonio Huete Jimenez }
930bba68feSAntonio Huete Jimenez 
940bba68feSAntonio Huete Jimenez void
destruct_shared_unnamed_sem(sem_t * id)950bba68feSAntonio Huete Jimenez destruct_shared_unnamed_sem(sem_t *id)
960bba68feSAntonio Huete Jimenez {
970bba68feSAntonio Huete Jimenez 	if (sem_destroy(id) < 0)
980bba68feSAntonio Huete Jimenez 		perror("sem_destroy");
990bba68feSAntonio Huete Jimenez 
1000bba68feSAntonio Huete Jimenez 	if (munmap(id, sizeof(sem_t)) < 0)
1010bba68feSAntonio Huete Jimenez 		perror("munmap");
1020bba68feSAntonio Huete Jimenez }
1030bba68feSAntonio Huete Jimenez 
1040bba68feSAntonio Huete Jimenez int
testwait(sem_t * id,u_int * delta)1050bba68feSAntonio Huete Jimenez testwait(sem_t *id, u_int *delta)
1060bba68feSAntonio Huete Jimenez {
1070bba68feSAntonio Huete Jimenez 	struct timespec start, end;
1080bba68feSAntonio Huete Jimenez 
1090bba68feSAntonio Huete Jimenez 	if (clock_gettime(CLOCK_REALTIME, &start) < 0) {
1100bba68feSAntonio Huete Jimenez 		perror("clock_gettime(CLOCK_REALTIME)");
1110bba68feSAntonio Huete Jimenez 		return (-1);
1120bba68feSAntonio Huete Jimenez 	}
1130bba68feSAntonio Huete Jimenez 	if (sem_wait(id) < 0) {
1140bba68feSAntonio Huete Jimenez 		perror("sem_wait");
1150bba68feSAntonio Huete Jimenez 		return (-1);
1160bba68feSAntonio Huete Jimenez 	}
1170bba68feSAntonio Huete Jimenez 	if (clock_gettime(CLOCK_REALTIME, &end) < 0) {
1180bba68feSAntonio Huete Jimenez 		perror("clock_gettime(CLOCK_REALTIME)");
1190bba68feSAntonio Huete Jimenez 		return (-1);
1200bba68feSAntonio Huete Jimenez 	}
121*944cd60cSSascha Wildner 	timespecsub(&end, &start, &end);
1220bba68feSAntonio Huete Jimenez 	*delta = end.tv_nsec / 1000000;
1230bba68feSAntonio Huete Jimenez 	*delta += end.tv_sec * 1000;
1240bba68feSAntonio Huete Jimenez 	return (0);
1250bba68feSAntonio Huete Jimenez }
1260bba68feSAntonio Huete Jimenez 
1270bba68feSAntonio Huete Jimenez static void
alarm_handler(int signo)1280bba68feSAntonio Huete Jimenez alarm_handler(int signo)
1290bba68feSAntonio Huete Jimenez {
1300bba68feSAntonio Huete Jimenez 
1310bba68feSAntonio Huete Jimenez 	if (sem_post(alarm_id) < 0)
1320bba68feSAntonio Huete Jimenez 		alarm_errno = errno;
1330bba68feSAntonio Huete Jimenez }
1340bba68feSAntonio Huete Jimenez 
1350bba68feSAntonio Huete Jimenez int
schedule_post(sem_t * id,u_int msec)1360bba68feSAntonio Huete Jimenez schedule_post(sem_t *id, u_int msec)
1370bba68feSAntonio Huete Jimenez {
1380bba68feSAntonio Huete Jimenez 	struct itimerval it;
1390bba68feSAntonio Huete Jimenez 
1400bba68feSAntonio Huete Jimenez 	if (!alarm_handler_installed) {
1410bba68feSAntonio Huete Jimenez 		if (signal(SIGALRM, alarm_handler) == SIG_ERR) {
1420bba68feSAntonio Huete Jimenez 			perror("signal(SIGALRM)");
1430bba68feSAntonio Huete Jimenez 			return (-1);
1440bba68feSAntonio Huete Jimenez 		}
1450bba68feSAntonio Huete Jimenez 		alarm_handler_installed = 1;
1460bba68feSAntonio Huete Jimenez 	}
1470bba68feSAntonio Huete Jimenez 	if (alarm_id != SEM_FAILED) {
1480bba68feSAntonio Huete Jimenez 		fprintf(stderr, "sem_post() already scheduled");
1490bba68feSAntonio Huete Jimenez 		return (-1);
1500bba68feSAntonio Huete Jimenez 	}
1510bba68feSAntonio Huete Jimenez 	alarm_id = id;
1520bba68feSAntonio Huete Jimenez 	bzero(&it, sizeof(it));
1530bba68feSAntonio Huete Jimenez 	it.it_value.tv_sec = msec / 1000;
1540bba68feSAntonio Huete Jimenez 	it.it_value.tv_usec = (msec % 1000) * 1000;
1550bba68feSAntonio Huete Jimenez 	if (setitimer(ITIMER_REAL, &it, NULL) < 0) {
1560bba68feSAntonio Huete Jimenez 		perror("setitimer");
1570bba68feSAntonio Huete Jimenez 		return (-1);
1580bba68feSAntonio Huete Jimenez 	}
1590bba68feSAntonio Huete Jimenez 	return (0);
1600bba68feSAntonio Huete Jimenez }
1610bba68feSAntonio Huete Jimenez 
1620bba68feSAntonio Huete Jimenez int
check_alarm(int just_clear)1630bba68feSAntonio Huete Jimenez check_alarm(int just_clear)
1640bba68feSAntonio Huete Jimenez {
1650bba68feSAntonio Huete Jimenez 	struct itimerval it;
1660bba68feSAntonio Huete Jimenez 
1670bba68feSAntonio Huete Jimenez 	bzero(&it, sizeof(it));
1680bba68feSAntonio Huete Jimenez 	if (just_clear) {
1690bba68feSAntonio Huete Jimenez 		setitimer(ITIMER_REAL, &it, NULL);
1700bba68feSAntonio Huete Jimenez 		alarm_errno = 0;
1710bba68feSAntonio Huete Jimenez 		alarm_id = SEM_FAILED;
1720bba68feSAntonio Huete Jimenez 		return (0);
1730bba68feSAntonio Huete Jimenez 	}
1740bba68feSAntonio Huete Jimenez 	if (setitimer(ITIMER_REAL, &it, NULL) < 0) {
1750bba68feSAntonio Huete Jimenez 		perror("setitimer");
1760bba68feSAntonio Huete Jimenez 		return (-1);
1770bba68feSAntonio Huete Jimenez 	}
1780bba68feSAntonio Huete Jimenez 	if (alarm_errno != 0 && !just_clear) {
1790bba68feSAntonio Huete Jimenez 		errno = alarm_errno;
1800bba68feSAntonio Huete Jimenez 		perror("sem_post() (via timeout)");
1810bba68feSAntonio Huete Jimenez 		alarm_errno = 0;
1820bba68feSAntonio Huete Jimenez 		return (-1);
1830bba68feSAntonio Huete Jimenez 	}
1840bba68feSAntonio Huete Jimenez 	alarm_id = SEM_FAILED;
1850bba68feSAntonio Huete Jimenez 
1860bba68feSAntonio Huete Jimenez 	return (0);
1870bba68feSAntonio Huete Jimenez }
1880bba68feSAntonio Huete Jimenez 
1890bba68feSAntonio Huete Jimenez /*
1900bba68feSAntonio Huete Jimenez  * Helper routine for tests that use a child process.  This routine
1910bba68feSAntonio Huete Jimenez  * creates a pipe and forks a child process.  The child process runs
1920bba68feSAntonio Huete Jimenez  * the 'func' routine which returns a status integer.  The status
1930bba68feSAntonio Huete Jimenez  * integer gets written over the pipe to the parent and returned in
1940bba68feSAntonio Huete Jimenez  * '*stat'.  If there is an error in pipe(), fork(), or wait() this
1950bba68feSAntonio Huete Jimenez  * returns -1 and fails the test.
1960bba68feSAntonio Huete Jimenez  */
1970bba68feSAntonio Huete Jimenez int
child_worker(int (* func)(void * arg),void * arg,int * stat)1980bba68feSAntonio Huete Jimenez child_worker(int (*func)(void *arg), void *arg, int *stat)
1990bba68feSAntonio Huete Jimenez {
2000bba68feSAntonio Huete Jimenez 	pid_t pid;
2010bba68feSAntonio Huete Jimenez 	int pfd[2], cstat;
2020bba68feSAntonio Huete Jimenez 
2030bba68feSAntonio Huete Jimenez 	if (pipe(pfd) < 0) {
2040bba68feSAntonio Huete Jimenez 		perror("pipe");
2050bba68feSAntonio Huete Jimenez 		return (-1);
2060bba68feSAntonio Huete Jimenez 	}
2070bba68feSAntonio Huete Jimenez 
2080bba68feSAntonio Huete Jimenez 	pid = fork();
2090bba68feSAntonio Huete Jimenez 	switch (pid) {
2100bba68feSAntonio Huete Jimenez 	case -1:
2110bba68feSAntonio Huete Jimenez 		/* Error. */
2120bba68feSAntonio Huete Jimenez 		perror("fork");
2130bba68feSAntonio Huete Jimenez 		close(pfd[0]);
2140bba68feSAntonio Huete Jimenez 		close(pfd[1]);
2150bba68feSAntonio Huete Jimenez 		return (-1);
2160bba68feSAntonio Huete Jimenez 	case 0:
2170bba68feSAntonio Huete Jimenez 		/* Child. */
2180bba68feSAntonio Huete Jimenez 		cstat = func(arg);
2190bba68feSAntonio Huete Jimenez 		write(pfd[1], &cstat, sizeof(cstat));
2200bba68feSAntonio Huete Jimenez 		exit(0);
2210bba68feSAntonio Huete Jimenez 	}
2220bba68feSAntonio Huete Jimenez 
2230bba68feSAntonio Huete Jimenez 	if (read(pfd[0], stat, sizeof(*stat)) < 0) {
2240bba68feSAntonio Huete Jimenez 		perror("read(pipe)");
2250bba68feSAntonio Huete Jimenez 		close(pfd[0]);
2260bba68feSAntonio Huete Jimenez 		close(pfd[1]);
2270bba68feSAntonio Huete Jimenez 		return (-1);
2280bba68feSAntonio Huete Jimenez 	}
2290bba68feSAntonio Huete Jimenez 	if (waitpid(pid, NULL, 0) < 0) {
2300bba68feSAntonio Huete Jimenez 		perror("wait");
2310bba68feSAntonio Huete Jimenez 		close(pfd[0]);
2320bba68feSAntonio Huete Jimenez 		close(pfd[1]);
2330bba68feSAntonio Huete Jimenez 		return (-1);
2340bba68feSAntonio Huete Jimenez 	}
2350bba68feSAntonio Huete Jimenez 	close(pfd[0]);
2360bba68feSAntonio Huete Jimenez 	close(pfd[1]);
2370bba68feSAntonio Huete Jimenez 	return (0);
2380bba68feSAntonio Huete Jimenez }
2390bba68feSAntonio Huete Jimenez 
2400bba68feSAntonio Huete Jimenez /*
2410bba68feSAntonio Huete Jimenez  * Fork off a child process.  The child will open the semaphore via
2420bba68feSAntonio Huete Jimenez  * the same name.  The child will then block on the semaphore waiting
2430bba68feSAntonio Huete Jimenez  * for the parent to post it.
2440bba68feSAntonio Huete Jimenez  */
2450bba68feSAntonio Huete Jimenez int
wait_twoproc_child(void * arg)2460bba68feSAntonio Huete Jimenez wait_twoproc_child(void *arg)
2470bba68feSAntonio Huete Jimenez {
2480bba68feSAntonio Huete Jimenez 	sem_t *id;
2490bba68feSAntonio Huete Jimenez 
2500bba68feSAntonio Huete Jimenez 	id = sem_open(TEST_PATH, 0, 0, 0);
2510bba68feSAntonio Huete Jimenez 	if (id == SEM_FAILED)
2520bba68feSAntonio Huete Jimenez 		return (CSTAT(1, errno));
2530bba68feSAntonio Huete Jimenez 	if (sem_wait(id) < 0)
2540bba68feSAntonio Huete Jimenez 		return (CSTAT(2, errno));
2550bba68feSAntonio Huete Jimenez 	if (sem_close(id) < 0)
2560bba68feSAntonio Huete Jimenez 		return (CSTAT(3, errno));
2570bba68feSAntonio Huete Jimenez 	return (CSTAT(0, 0));
2580bba68feSAntonio Huete Jimenez }
2590bba68feSAntonio Huete Jimenez 
2600bba68feSAntonio Huete Jimenez int
timedwait(sem_t * id,u_int msec,u_int * delta,int error)2610bba68feSAntonio Huete Jimenez timedwait(sem_t *id, u_int msec, u_int *delta, int error)
2620bba68feSAntonio Huete Jimenez {
2630bba68feSAntonio Huete Jimenez 	struct timespec start, end;
2640bba68feSAntonio Huete Jimenez 
2650bba68feSAntonio Huete Jimenez 	if (clock_gettime(CLOCK_REALTIME, &start) < 0) {
2660bba68feSAntonio Huete Jimenez 		perror("clock_gettime(CLOCK_REALTIME)");
2670bba68feSAntonio Huete Jimenez 		return (-1);
2680bba68feSAntonio Huete Jimenez 	}
2690bba68feSAntonio Huete Jimenez 	end.tv_sec = msec / 1000;
2700bba68feSAntonio Huete Jimenez 	end.tv_nsec = msec % 1000 * 1000000;
271*944cd60cSSascha Wildner 	timespecadd(&end, &start, &end);
2720bba68feSAntonio Huete Jimenez 	if (sem_timedwait(id, &end) < 0) {
2730bba68feSAntonio Huete Jimenez 		if (errno != error) {
2740bba68feSAntonio Huete Jimenez 			perror("sem_timedwait");
2750bba68feSAntonio Huete Jimenez 			return (-1);
2760bba68feSAntonio Huete Jimenez 		}
2770bba68feSAntonio Huete Jimenez 	} else if (error != 0) {
2780bba68feSAntonio Huete Jimenez 		return (-1);
2790bba68feSAntonio Huete Jimenez 	}
2800bba68feSAntonio Huete Jimenez 	if (clock_gettime(CLOCK_REALTIME, &end) < 0) {
2810bba68feSAntonio Huete Jimenez 		perror("clock_gettime(CLOCK_REALTIME)");
2820bba68feSAntonio Huete Jimenez 		return (-1);
2830bba68feSAntonio Huete Jimenez 	}
284*944cd60cSSascha Wildner 	timespecsub(&end, &start, &end);
2850bba68feSAntonio Huete Jimenez 	*delta = end.tv_nsec / 1000000;
2860bba68feSAntonio Huete Jimenez 	*delta += end.tv_sec * 1000;
2870bba68feSAntonio Huete Jimenez 	return (0);
2880bba68feSAntonio Huete Jimenez }
2890bba68feSAntonio Huete Jimenez 
2900bba68feSAntonio Huete Jimenez /*
2910bba68feSAntonio Huete Jimenez  * Attempt a sem_open() that should fail with an expected error of
2920bba68feSAntonio Huete Jimenez  * 'error'.
2930bba68feSAntonio Huete Jimenez  */
2940bba68feSAntonio Huete Jimenez int
sem_open_should_fail(const char * path,int flags,mode_t mode,unsigned int value,int error)2950bba68feSAntonio Huete Jimenez sem_open_should_fail(const char *path, int flags, mode_t mode,
2960bba68feSAntonio Huete Jimenez 		     unsigned int value, int error)
2970bba68feSAntonio Huete Jimenez {
2980bba68feSAntonio Huete Jimenez 	int retval = 0;
2990bba68feSAntonio Huete Jimenez 	sem_t *id;
3000bba68feSAntonio Huete Jimenez 
3010bba68feSAntonio Huete Jimenez 	id = sem_open(path, flags, mode, value);
3020bba68feSAntonio Huete Jimenez 	if (id != SEM_FAILED) {
3030bba68feSAntonio Huete Jimenez 		sem_close(id);
3040bba68feSAntonio Huete Jimenez 		retval = 1;
3050bba68feSAntonio Huete Jimenez 	}
3060bba68feSAntonio Huete Jimenez 	if (errno != error) {
3070bba68feSAntonio Huete Jimenez 		fprintf(stderr, "sem_open: %s\n", strerror(errno));
3080bba68feSAntonio Huete Jimenez 		retval = 1;
3090bba68feSAntonio Huete Jimenez 	}
3100bba68feSAntonio Huete Jimenez 	return retval;
3110bba68feSAntonio Huete Jimenez }
3120bba68feSAntonio Huete Jimenez 
3130bba68feSAntonio Huete Jimenez /*
3140bba68feSAntonio Huete Jimenez  * Attempt a sem_init() that should fail with an expected error of
3150bba68feSAntonio Huete Jimenez  * 'error'.
3160bba68feSAntonio Huete Jimenez  */
3170bba68feSAntonio Huete Jimenez int
sem_init_should_fail(unsigned int value,int error)3180bba68feSAntonio Huete Jimenez sem_init_should_fail(unsigned int value, int error)
3190bba68feSAntonio Huete Jimenez {
3200bba68feSAntonio Huete Jimenez 	sem_t id;
3210bba68feSAntonio Huete Jimenez 
3220bba68feSAntonio Huete Jimenez 	if (sem_init(&id, 0, value) >= 0) {
3230bba68feSAntonio Huete Jimenez 		sem_destroy(&id);
3240bba68feSAntonio Huete Jimenez 		return 1;
3250bba68feSAntonio Huete Jimenez 	}
3260bba68feSAntonio Huete Jimenez 	if (errno != error) {
3270bba68feSAntonio Huete Jimenez 		perror("sem_init");
3280bba68feSAntonio Huete Jimenez 		return 1;
3290bba68feSAntonio Huete Jimenez 	}
3300bba68feSAntonio Huete Jimenez 
3310bba68feSAntonio Huete Jimenez 	return 0;
3320bba68feSAntonio Huete Jimenez }
3330bba68feSAntonio Huete Jimenez 
3340bba68feSAntonio Huete Jimenez /*
3350bba68feSAntonio Huete Jimenez  * Attempt a sem_unlink() that should fail with an expected error of
3360bba68feSAntonio Huete Jimenez  * 'error'.
3370bba68feSAntonio Huete Jimenez  */
3380bba68feSAntonio Huete Jimenez int
sem_unlink_should_fail(const char * path,int error)3390bba68feSAntonio Huete Jimenez sem_unlink_should_fail(const char *path, int error)
3400bba68feSAntonio Huete Jimenez {
3410bba68feSAntonio Huete Jimenez 
3420bba68feSAntonio Huete Jimenez 	if (sem_unlink(path) >= 0) {
3430bba68feSAntonio Huete Jimenez 		return 1;
3440bba68feSAntonio Huete Jimenez 	}
3450bba68feSAntonio Huete Jimenez 	if (errno != error) {
3460bba68feSAntonio Huete Jimenez 		perror("sem_unlink");
3470bba68feSAntonio Huete Jimenez 		return 1;
3480bba68feSAntonio Huete Jimenez 	}
3490bba68feSAntonio Huete Jimenez 	return 0;
3500bba68feSAntonio Huete Jimenez }
3510bba68feSAntonio Huete Jimenez 
3520bba68feSAntonio Huete Jimenez /*
3530bba68feSAntonio Huete Jimenez  * Attempt a sem_destroy() that should fail with an expected error of
3540bba68feSAntonio Huete Jimenez  * 'error'.
3550bba68feSAntonio Huete Jimenez  */
3560bba68feSAntonio Huete Jimenez int
sem_destroy_should_fail(sem_t * id,int error)3570bba68feSAntonio Huete Jimenez sem_destroy_should_fail(sem_t *id, int error)
3580bba68feSAntonio Huete Jimenez {
3590bba68feSAntonio Huete Jimenez 	if (sem_destroy(id) >= 0) {
3600bba68feSAntonio Huete Jimenez 		return 1;
3610bba68feSAntonio Huete Jimenez 	}
3620bba68feSAntonio Huete Jimenez 	if (errno != error) {
3630bba68feSAntonio Huete Jimenez 		perror("sem_destroy");
3640bba68feSAntonio Huete Jimenez 		return 1;
3650bba68feSAntonio Huete Jimenez 	}
3660bba68feSAntonio Huete Jimenez 	return 0;
3670bba68feSAntonio Huete Jimenez }
3680bba68feSAntonio Huete Jimenez 
3690bba68feSAntonio Huete Jimenez /*
3700bba68feSAntonio Huete Jimenez  * Attempt a sem_close() that should fail with an expected error of
3710bba68feSAntonio Huete Jimenez  * 'error'.
3720bba68feSAntonio Huete Jimenez  */
3730bba68feSAntonio Huete Jimenez int
sem_close_should_fail(sem_t * id,int error)3740bba68feSAntonio Huete Jimenez sem_close_should_fail(sem_t *id, int error)
3750bba68feSAntonio Huete Jimenez {
3760bba68feSAntonio Huete Jimenez 
3770bba68feSAntonio Huete Jimenez 	if (sem_close(id) >= 0) {
3780bba68feSAntonio Huete Jimenez 		return 1;
3790bba68feSAntonio Huete Jimenez 	}
3800bba68feSAntonio Huete Jimenez 	if (errno != error) {
3810bba68feSAntonio Huete Jimenez 		perror("sem_close");
3820bba68feSAntonio Huete Jimenez 		return 1;
3830bba68feSAntonio Huete Jimenez 	}
3840bba68feSAntonio Huete Jimenez 	return 0;
3850bba68feSAntonio Huete Jimenez }
386