#include <errno.h>
#include <sys/sem.h>
+union semun {
+ int val; /* Value for SETVAL */
+ struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
+ unsigned short *array; /* Array for GETALL, SETALL */
+ struct seminfo *__buf; /* Buffer for IPC_INFO
+ (Linux-specific) */
+};
+
int
main(void)
{
int rc, id;
+ union semun un;
struct semid_ds ds;
struct seminfo info;
return 77;
printf("semget\\(IPC_PRIVATE, 1, 0600\\) += %d\n", id);
- if (semctl(id, 0, IPC_STAT, &ds))
+ un.buf = &ds;
+ if (semctl(id, 0, IPC_STAT, un))
goto fail;
printf("semctl\\(%d, 0, IPC_STAT, %p\\) += 0\n", id, &ds);
- int max = semctl(0, 0, SEM_INFO, &info);
+ un.__buf = &info;
+ int max = semctl(0, 0, SEM_INFO, un);
if (max < 0)
goto fail;
printf("semctl\\(0, 0, SEM_INFO, %p\\) += %d\n", &info, max);
- rc = semctl(id, 0, SEM_STAT, &ds);
+ un.buf = &ds;
+ rc = semctl(id, 0, SEM_STAT, un);
if (rc != id) {
/*
* In linux < v2.6.24-rc1 the first argument must be
return rc;
fail:
- /*
- * If the kernel failed, SKIP the test. We want to ignore
- * such failures as they're out of scope for this project.
- */
- rc = errno == EFAULT ? 77 : 1;
+ rc = 1;
goto done;
}