1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define _GNU_SOURCE
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <config.h>
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <errno.h>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <sys/ipc.h>
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <sys/sem.h>
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <time.h>
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char **argv)
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int semid;
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct sembuf sop;
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef HAVE_SEMTIMEDOP
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct timespec ts;
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ((semid = semget(IPC_PRIVATE, 1, 0600)) < 0)
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror("semget");
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit(1);
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sop.sem_num = 0;
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sop.sem_op = 1;
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sop.sem_flg = 0;
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (semop(semid, &sop, 1) < 0)
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror("semop");
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      semctl(semid, 0, IPC_RMID);
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit(1);
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* The next call to semtimedop causes the program to hang on
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppc32-linux (Yellow Dog 4.0).  I don't know why.  Hence the
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      extended ifdef. */
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(HAVE_SEMTIMEDOP) && !defined(__powerpc__)
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sop.sem_num = 0;
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sop.sem_op = 0;
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sop.sem_flg = 0;
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ts.tv_sec = 0;
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ts.tv_nsec = 1000000;
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (semtimedop(semid, &sop, 1, &ts) < 0 && errno != EAGAIN)
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror("semtimedop");
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      semctl(semid, 0, IPC_RMID);
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit(1);
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sop.sem_num = 0;
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sop.sem_op = -1;
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sop.sem_flg = 0;
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (semop(semid, &sop, 1) < 0)
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror("semop");
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      semctl(semid, 0, IPC_RMID);
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit(1);
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef HAVE_SEMTIMEDOP
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sop.sem_num = 0;
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sop.sem_op = 0;
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sop.sem_flg = 0;
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ts.tv_sec = 0;
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ts.tv_nsec = 1000;
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (semtimedop(semid, &sop, 1, &ts) < 0)
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror("semtimedop");
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      semctl(semid, 0, IPC_RMID);
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit(1);
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (semctl(semid, 0, IPC_RMID) < 0)
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror("semctl(IPC_RMID)");
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit(1);
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   exit(0);
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
89