summaryrefslogtreecommitdiff
path: root/src/fdevent_solaris_devpoll.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fdevent_solaris_devpoll.c')
-rw-r--r--src/fdevent_solaris_devpoll.c106
1 files changed, 62 insertions, 44 deletions
diff --git a/src/fdevent_solaris_devpoll.c b/src/fdevent_solaris_devpoll.c
index 91238b0..dd273e6 100644
--- a/src/fdevent_solaris_devpoll.c
+++ b/src/fdevent_solaris_devpoll.c
@@ -1,3 +1,7 @@
+#include "fdevent.h"
+#include "buffer.h"
+#include "log.h"
+
#include <sys/types.h>
#include <unistd.h>
@@ -8,12 +12,10 @@
#include <signal.h>
#include <fcntl.h>
-#include "fdevent.h"
-#include "settings.h"
-#include "buffer.h"
-
#ifdef USE_SOLARIS_DEVPOLL
+# include <sys/devpoll.h>
+
static void fdevent_solaris_devpoll_free(fdevents *ev) {
free(ev->devpollfds);
close(ev->devpoll_fd);
@@ -23,60 +25,76 @@ static void fdevent_solaris_devpoll_free(fdevents *ev) {
static int fdevent_solaris_devpoll_event_del(fdevents *ev, int fde_ndx, int fd) {
struct pollfd pfd;
-
+
if (fde_ndx < 0) return -1;
-
+
pfd.fd = fd;
pfd.events = POLLREMOVE;
pfd.revents = 0;
-
+
if (-1 == write(ev->devpoll_fd, &pfd, sizeof(pfd))) {
- fprintf(stderr, "%s.%d: (del) write failed: (%d, %s)\n",
- __FILE__, __LINE__,
- fd, strerror(errno));
-
+ log_error_write(ev->srv, __FILE__, __LINE__, "S(D, S)",
+ "(del) write failed: ", fd, strerror(errno));
+
return -1;
}
-
+
return -1;
}
-static int fdevent_solaris_devpoll_event_add(fdevents *ev, int fde_ndx, int fd, int events) {
+static int fdevent_solaris_devpoll_event_set(fdevents *ev, int fde_ndx, int fd, int events) {
struct pollfd pfd;
int add = 0;
-
+
+ int pevents = 0;
+ if (events & FDEVENT_IN) pevents |= POLLIN;
+ if (events & FDEVENT_OUT) pevents |= POLLOUT;
+
if (fde_ndx == -1) add = 1;
-
+
pfd.fd = fd;
- pfd.events = events;
+ pfd.events = pevents;
pfd.revents = 0;
-
+
if (-1 == write(ev->devpoll_fd, &pfd, sizeof(pfd))) {
- fprintf(stderr, "%s.%d: (del) write failed: (%d, %s)\n",
- __FILE__, __LINE__,
- fd, strerror(errno));
-
+ log_error_write(ev->srv, __FILE__, __LINE__, "S(D, S)",
+ "(set) write failed: ", fd, strerror(errno));
+
return -1;
}
-
+
return fd;
}
static int fdevent_solaris_devpoll_poll(fdevents *ev, int timeout_ms) {
struct dvpoll dopoll;
int ret;
-
+
dopoll.dp_timeout = timeout_ms;
- dopoll.dp_nfds = ev->maxfds;
+ dopoll.dp_nfds = ev->maxfds - 1;
dopoll.dp_fds = ev->devpollfds;
-
+
ret = ioctl(ev->devpoll_fd, DP_POLL, &dopoll);
-
+
return ret;
}
static int fdevent_solaris_devpoll_event_get_revent(fdevents *ev, size_t ndx) {
- return ev->devpollfds[ndx].revents;
+ int r, poll_r;
+
+ r = 0;
+ poll_r = ev->devpollfds[ndx].revents;
+
+ /* map POLL* to FDEVEN_*; they are probably the same, but still. */
+
+ if (poll_r & POLLIN) r |= FDEVENT_IN;
+ if (poll_r & POLLOUT) r |= FDEVENT_OUT;
+ if (poll_r & POLLERR) r |= FDEVENT_ERR;
+ if (poll_r & POLLHUP) r |= FDEVENT_HUP;
+ if (poll_r & POLLNVAL) r |= FDEVENT_NVAL;
+ if (poll_r & POLLPRI) r |= FDEVENT_PRI;
+
+ return r;
}
static int fdevent_solaris_devpoll_event_get_fd(fdevents *ev, size_t ndx) {
@@ -85,11 +103,11 @@ static int fdevent_solaris_devpoll_event_get_fd(fdevents *ev, size_t ndx) {
static int fdevent_solaris_devpoll_event_next_fdndx(fdevents *ev, int last_ndx) {
size_t i;
-
+
UNUSED(ev);
i = (last_ndx < 0) ? 0 : last_ndx + 1;
-
+
return i;
}
@@ -97,15 +115,15 @@ int fdevent_solaris_devpoll_reset(fdevents *ev) {
/* a forked process does only inherit the filedescriptor,
* but every operation on the device will lead to a EACCES */
if ((ev->devpoll_fd = open("/dev/poll", O_RDWR)) < 0) {
- fprintf(stderr, "%s.%d: opening /dev/poll failed (%s), try to set server.event-handler = \"poll\" or \"select\"\n",
- __FILE__, __LINE__, strerror(errno));
+ log_error_write(ev->srv, __FILE__, __LINE__, "SSS",
+ "opening /dev/poll failed (", strerror(errno), "), try to set server.event-handler = \"poll\" or \"select\"");
return -1;
}
if (fcntl(ev->devpoll_fd, F_SETFD, FD_CLOEXEC) < 0) {
- fprintf(stderr, "%s.%d: opening /dev/poll failed (%s), try to set server.event-handler = \"poll\" or \"select\"\n",
- __FILE__, __LINE__, strerror(errno));
+ log_error_write(ev->srv, __FILE__, __LINE__, "SSS",
+ "fcntl /dev/poll fd failed (", strerror(errno), "), try to set server.event-handler = \"poll\" or \"select\"");
close(ev->devpoll_fd);
@@ -117,23 +135,23 @@ int fdevent_solaris_devpoll_init(fdevents *ev) {
ev->type = FDEVENT_HANDLER_SOLARIS_DEVPOLL;
#define SET(x) \
ev->x = fdevent_solaris_devpoll_##x;
-
+
SET(free);
SET(poll);
SET(reset);
-
+
SET(event_del);
- SET(event_add);
-
+ SET(event_set);
+
SET(event_next_fdndx);
SET(event_get_fd);
SET(event_get_revent);
-
+
ev->devpollfds = malloc(sizeof(*ev->devpollfds) * ev->maxfds);
-
+
if ((ev->devpoll_fd = open("/dev/poll", O_RDWR)) < 0) {
- fprintf(stderr, "%s.%d: opening /dev/poll failed (%s), try to set server.event-handler = \"poll\" or \"select\"\n",
- __FILE__, __LINE__, strerror(errno));
+ log_error_write(ev->srv, __FILE__, __LINE__, "SSS",
+ "opening /dev/poll failed (", strerror(errno), "), try to set server.event-handler = \"poll\" or \"select\"");
return -1;
}
@@ -150,9 +168,9 @@ int fdevent_solaris_devpoll_init(fdevents *ev) {
int fdevent_solaris_devpoll_init(fdevents *ev) {
UNUSED(ev);
- fprintf(stderr, "%s.%d: solaris-devpoll not supported, try to set server.event-handler = \"poll\" or \"select\"\n",
- __FILE__, __LINE__);
-
+ log_error_write(ev->srv, __FILE__, __LINE__, "S",
+ "solaris-devpoll not supported, try to set server.event-handler = \"poll\" or \"select\"");
+
return -1;
}
#endif