static void wait_twoproc_test(void) { semid_t id; int stat; if (ksem_open(&id, TEST_PATH, O_CREAT, 0777, 0)) { fail_errno("ksem_open"); return; } if (schedule_post(id, 500) < 0) { ksem_close(id); ksem_unlink(TEST_PATH); return; } if (child_worker(wait_twoproc_child, NULL, &stat) < 0) { check_alarm(1); ksem_close(id); ksem_unlink(TEST_PATH); return; } errno = CSTAT_ERROR(stat); switch (CSTAT_CLASS(stat)) { case 0: pass(); break; case 1: fail_errno("child ksem_open()"); break; case 2: fail_errno("child ksem_wait()"); break; case 3: fail_errno("child ksem_close()"); break; default: fail_err("bad child state %#x", stat); break; } check_alarm(1); ksem_close(id); ksem_unlink(TEST_PATH); }
/* * Attempt a ksem_open() that should fail with an expected error of * 'error'. */ static void ksem_open_should_fail(const char *path, int flags, mode_t mode, unsigned int value, int error) { semid_t id; if (ksem_open(&id, path, flags, mode, value) >= 0) { fail_err("ksem_open() didn't fail"); ksem_close(id); return; } if (errno != error) { fail_errno("ksem_open"); return; } pass(); }
static void open_after_unlink(void) { semid_t id; if (ksem_open(&id, TEST_PATH, O_CREAT, 0777, 1) < 0) { fail_errno("ksem_open(1)"); return; } ksem_close(id); if (ksem_unlink(TEST_PATH) < 0) { fail_errno("ksem_unlink"); return; } ksem_open_should_fail(TEST_PATH, O_RDONLY, 0777, 1, ENOENT); }
static int exhaust_named_child(void *arg) { char buffer[64]; semid_t id; int i, max; max = (intptr_t)arg; for (i = 0; i < max + 1; i++) { snprintf(buffer, sizeof(buffer), "%s%d", TEST_PATH, i); if (ksem_open(&id, buffer, O_CREAT, 0777, 1) < 0) { if (errno == ENOSPC || errno == EMFILE || errno == ENFILE) return (CSTAT(0, 0)); return (CSTAT(1, errno)); } } return (CSTAT(2, errno)); }
static void open_named_semaphore(void) { semid_t id; if (ksem_open(&id, TEST_PATH, O_CREAT, 0777, 1) < 0) { fail_errno("ksem_open(O_CREAT)"); return; } if (ksem_close(id) < 0) { fail_errno("ksem_close"); return; } if (ksem_unlink(TEST_PATH) < 0) { fail_errno("ksem_unlink"); return; } pass(); }