#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <port.h>
#include <err.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <sys/poll.h>
#include <stdbool.h>
static bool
has_event(int pfd)
{
port_event_t ev = { 0 };
timespec_t ts = { 0 };
int res = port_get(pfd, &ev, &ts);
if (res != 0 || ev.portev_source == 0) {
return (false);
} else {
return (true);
}
}
int
main(int argc, char *argv[])
{
int res;
int pipes[2];
res = pipe2(pipes, 0);
assert(res == 0);
int pfd = port_create();
assert(pfd >= 0);
res = port_associate(pfd, PORT_SOURCE_FD, (uintptr_t)pipes[1], POLLIN,
NULL);
assert(res == 0);
if (has_event(pfd)) {
errx(EXIT_FAILURE, "FAIL - unexpected early event");
}
char port_path[MAXPATHLEN];
(void) sprintf(port_path, "/proc/%d/fd/%d", getpid(), pfd);
struct stat sbuf;
res = lstat(port_path, &sbuf);
assert(res == 0);
(void) write(pipes[0], port_path, 1);
if (!has_event(pfd)) {
errx(EXIT_FAILURE, "FAIL - no event found");
}
(void) printf("PASS\n");
return (EXIT_SUCCESS);
}