blob: 27db0713cfa65d98e8a122e569987810cdfd2315 [file] [log] [blame]
thughes03766282004-06-13 14:23:00 +00001#define _GNU_SOURCE
2
thughes2c52e7d2004-06-14 13:15:40 +00003#include <config.h>
thughes03766282004-06-13 14:23:00 +00004#include <errno.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <sys/ipc.h>
8#include <sys/sem.h>
sewardj2f3bcd22006-12-12 01:38:15 +00009#include <time.h>
philippe5d2db152012-10-21 18:46:09 +000010#include <unistd.h>
thughes03766282004-06-13 14:23:00 +000011int main(int argc, char **argv)
12{
13 int semid;
14 struct sembuf sop;
thughesb2d43ba2004-06-14 17:27:41 +000015#ifdef HAVE_SEMTIMEDOP
thughes03766282004-06-13 14:23:00 +000016 struct timespec ts;
thughesb2d43ba2004-06-14 17:27:41 +000017#endif
thughes03766282004-06-13 14:23:00 +000018
19 if ((semid = semget(IPC_PRIVATE, 1, 0600)) < 0)
20 {
21 perror("semget");
22 exit(1);
23 }
24
25 sop.sem_num = 0;
26 sop.sem_op = 1;
27 sop.sem_flg = 0;
28
29 if (semop(semid, &sop, 1) < 0)
30 {
31 perror("semop");
32 semctl(semid, 0, IPC_RMID);
33 exit(1);
34 }
35
philippe5d2db152012-10-21 18:46:09 +000036 if (semctl(semid, 0, GETVAL) != 1)
37 {
38 perror("semctl GETVAL");
39 semctl(semid, 0, IPC_RMID);
40 exit(1);
41 }
42
43 if (semctl(semid, 0, GETPID) != getpid())
44 {
45 perror("semctl GETPID");
46 semctl(semid, 0, IPC_RMID);
47 exit(1);
48 }
49
sewardjd9a1ce12005-07-02 20:11:59 +000050 /* The next call to semtimedop causes the program to hang on
51 ppc32-linux (Yellow Dog 4.0). I don't know why. Hence the
52 extended ifdef. */
53#if defined(HAVE_SEMTIMEDOP) && !defined(__powerpc__)
thughes03766282004-06-13 14:23:00 +000054 sop.sem_num = 0;
55 sop.sem_op = 0;
56 sop.sem_flg = 0;
57
58 ts.tv_sec = 0;
thughesb2d43ba2004-06-14 17:27:41 +000059 ts.tv_nsec = 1000000;
thughes03766282004-06-13 14:23:00 +000060
61 if (semtimedop(semid, &sop, 1, &ts) < 0 && errno != EAGAIN)
62 {
63 perror("semtimedop");
64 semctl(semid, 0, IPC_RMID);
65 exit(1);
66 }
thughesb2d43ba2004-06-14 17:27:41 +000067#endif
thughes03766282004-06-13 14:23:00 +000068
69 sop.sem_num = 0;
70 sop.sem_op = -1;
71 sop.sem_flg = 0;
72
73 if (semop(semid, &sop, 1) < 0)
74 {
75 perror("semop");
76 semctl(semid, 0, IPC_RMID);
77 exit(1);
78 }
79
thughesb2d43ba2004-06-14 17:27:41 +000080#ifdef HAVE_SEMTIMEDOP
thughes03766282004-06-13 14:23:00 +000081 sop.sem_num = 0;
82 sop.sem_op = 0;
83 sop.sem_flg = 0;
84
85 ts.tv_sec = 0;
86 ts.tv_nsec = 1000;
87
88 if (semtimedop(semid, &sop, 1, &ts) < 0)
89 {
90 perror("semtimedop");
91 semctl(semid, 0, IPC_RMID);
92 exit(1);
93 }
thughesb2d43ba2004-06-14 17:27:41 +000094#endif
thughes03766282004-06-13 14:23:00 +000095
96 if (semctl(semid, 0, IPC_RMID) < 0)
97 {
98 perror("semctl(IPC_RMID)");
99 exit(1);
100 }
101
102 exit(0);
103}