aboutsummaryrefslogtreecommitdiffstats
path: root/glougloud/external/imsgev.c
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2012-11-29 10:58:30 +0100
committerLaurent Ghigonis <laurent@p1sec.com>2012-11-29 10:58:30 +0100
commitb9decf4304d2204173a8d8a706e003cdde2b1bf7 (patch)
treed2a271e59d13cf1c01268931e79602f239a86ea4 /glougloud/external/imsgev.c
parentinclude event.h here, and also the default queue.h of the system instead of the (diff)
downloadglouglou-b9decf4304d2204173a8d8a706e003cdde2b1bf7.tar.xz
glouglou-b9decf4304d2204173a8d8a706e003cdde2b1bf7.zip
move glougloud to old
Diffstat (limited to 'glougloud/external/imsgev.c')
-rw-r--r--glougloud/external/imsgev.c170
1 files changed, 0 insertions, 170 deletions
diff --git a/glougloud/external/imsgev.c b/glougloud/external/imsgev.c
deleted file mode 100644
index 6b92d79..0000000
--- a/glougloud/external/imsgev.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (c) 2009 Eric Faurot <eric@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "imsgev.h"
-
-void imsgev_add(struct imsgev *);
-void imsgev_dispatch(int, short, void *);
-void imsgev_disconnect(struct imsgev *, int);
-
-void
-imsgev_init(struct imsgev *iev, int fd, void *data,
- void (*callback)(struct imsgev *, int, struct imsg *),
- void (*needfd)(struct imsgev *))
-{
- imsg_init(&iev->ibuf, fd);
- iev->terminate = 0;
-
- iev->data = data;
- iev->handler = imsgev_dispatch;
- iev->callback = callback;
- iev->needfd = needfd;
-
- iev->events = EV_READ;
- event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev);
- event_add(&iev->ev, NULL);
-}
-
-int
-imsgev_compose(struct imsgev *iev, u_int16_t type, u_int32_t peerid,
- uint32_t pid, int fd, void *data, u_int16_t datalen)
-{
- int r;
-
- r = imsg_compose(&iev->ibuf, type, peerid, pid, fd, data, datalen);
- if (r != -1)
- imsgev_add(iev);
-
- return (r);
-}
-
-void
-imsgev_close(struct imsgev *iev)
-{
- iev->terminate = 1;
- imsgev_add(iev);
-}
-
-void
-imsgev_clear(struct imsgev *iev)
-{
- event_del(&iev->ev);
- msgbuf_clear(&iev->ibuf.w);
- close(iev->ibuf.fd);
-}
-
-void
-imsgev_add(struct imsgev *iev)
-{
- short events = 0;
-
- if (!iev->terminate)
- events = EV_READ;
- if (iev->ibuf.w.queued || iev->terminate)
- events |= EV_WRITE;
-
- /* optimization: skip event_{del/set/add} if already set */
- if (events == iev->events)
- return;
-
- iev->events = events;
- event_del(&iev->ev);
- event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev);
- event_add(&iev->ev, NULL);
-}
-
-void
-imsgev_dispatch(int fd, short ev, void *humppa)
-{
- struct imsgev *iev = humppa;
- struct imsgbuf *ibuf = &iev->ibuf;
- struct imsg imsg;
- ssize_t n;
-
- iev->events = 0;
-
- if (ev & EV_READ) {
- if ((n = imsg_read(ibuf)) == -1) {
- /* if we don't have enough fds, free one up and retry */
- if (errno == EAGAIN) {
- iev->needfd(iev);
- n = imsg_read(ibuf);
- }
-
- if (n == -1) {
- imsgev_disconnect(iev, IMSGEV_EREAD);
- return;
- }
- }
- if (n == 0) {
- /*
- * Connection is closed for reading, and we assume
- * it is also closed for writing, so we error out
- * if write data is pending.
- */
- imsgev_disconnect(iev,
- (iev->ibuf.w.queued) ? IMSGEV_EWRITE : IMSGEV_DONE);
- return;
- }
- }
-
- if (ev & EV_WRITE) {
- /*
- * We wanted to write data out but the connection is either
- * closed, or some error occured. Both case are not recoverable
- * from the imsg perspective, so we treat it as a WRITE error.
- */
- if ((n = msgbuf_write(&ibuf->w)) != 1) {
- imsgev_disconnect(iev, IMSGEV_EWRITE);
- return;
- }
- }
-
- while (iev->terminate == 0) {
- if ((n = imsg_get(ibuf, &imsg)) == -1) {
- imsgev_disconnect(iev, IMSGEV_EIMSG);
- return;
- }
- if (n == 0)
- break;
- iev->callback(iev, IMSGEV_IMSG, &imsg);
- imsg_free(&imsg);
- }
-
- if (iev->terminate && iev->ibuf.w.queued == 0) {
- imsgev_disconnect(iev, IMSGEV_DONE);
- return;
- }
-
- imsgev_add(iev);
-}
-
-void
-imsgev_disconnect(struct imsgev *iev, int code)
-{
- iev->callback(iev, code, NULL);
-}