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