general: update the semaphore test
[libc-test] / src / general / sem.c
1 #include <stdlib.h>
2 #include <errno.h>
3 #include <string.h>
4 #include <semaphore.h>
5 #include <time.h>
6 #include <fcntl.h>
7 #include <unistd.h>
8 #include "test.h"
9
10 #define TEST(c, ...) \
11         ( (c) || (error(#c " failed: " __VA_ARGS__),0) )
12
13 int main(void)
14 {
15         char buf[100];
16         struct timespec ts;
17         sem_t *sem, *sem2;
18         int val;
19
20         clock_gettime(CLOCK_REALTIME, &ts);
21         snprintf(buf, sizeof buf, "/testsuite-%d-%d", (int)getpid(), (int)ts.tv_nsec);
22
23         TEST((sem=sem_open(buf, O_CREAT|O_EXCL, 0700, 1)) != SEM_FAILED,
24                 "could not open sem: %s\n", strerror(errno));
25         errno = 0;
26         TEST(sem_open(buf, O_CREAT|O_EXCL, 0700, 1) == SEM_FAILED,
27                 "reopening should fail with O_EXCL\n");
28         TEST(errno == EEXIST,
29                 "after reopen failure errno is \"%s\" (%d); want EEXIST (%d)\n", strerror(errno), errno, EEXIST);
30         errno = 0;
31
32         TEST(sem_getvalue(sem, &val) == 0, "failed to get sem value\n");
33         TEST(val == 1, "wrong initial semaphore value: %d\n", val);
34
35         TEST((sem2=sem_open(buf, 0)) == sem,
36                 "could not reopen sem: got %p, want %p\n", sem2, sem);
37
38         TEST(sem_wait(sem) == 0, "%s\n", strerror(errno));
39         TEST(sem_getvalue(sem2, &val) == 0, "%s\n", strerror(errno));
40         TEST(val == 0, "wrong semaphore value on second handle: %d\n", val);
41
42         TEST(sem_post(sem) == 0, "%s\n", strerror(errno));
43         TEST(sem_getvalue(sem2, &val) == 0, "%s\n", strerror(errno));
44         TEST(val == 1, "wrong semaphore value on second handle: %d\n", val);
45
46         TEST(sem_close(sem) == 0, "%s\n", strerror(errno));
47         TEST(sem_close(sem) == 0, "%s\n", strerror(errno));
48         TEST(sem_unlink(buf) == 0, "%s\n", strerror(errno));
49         return test_status;
50 }