summaryrefslogtreecommitdiff
path: root/sbin/iked
diff options
context:
space:
mode:
authorReyk Floeter <reyk@cvs.openbsd.org>2010-12-22 17:43:11 +0000
committerReyk Floeter <reyk@cvs.openbsd.org>2010-12-22 17:43:11 +0000
commitaf5cc54da27a9bfaf0facfe8695378904a6f1dda (patch)
tree0b0cf1005286831dff0224182c256b636ac64c23 /sbin/iked
parent33da8686a7ef42188e04f85531a4ef0b4c5e4494 (diff)
split util.c into two files: imsg_util.c for ibuf/imsg stuff and util for
everything else. we might need to include util.c in ikectl later. sure mikeb@
Diffstat (limited to 'sbin/iked')
-rw-r--r--sbin/iked/Makefile4
-rw-r--r--sbin/iked/iked.h27
-rw-r--r--sbin/iked/imsg_util.c280
-rw-r--r--sbin/iked/util.c240
4 files changed, 297 insertions, 254 deletions
diff --git a/sbin/iked/Makefile b/sbin/iked/Makefile
index 65e74c07033..c312cabbb52 100644
--- a/sbin/iked/Makefile
+++ b/sbin/iked/Makefile
@@ -1,10 +1,10 @@
-# $OpenBSD: Makefile,v 1.5 2010/06/11 12:47:18 reyk Exp $
+# $OpenBSD: Makefile,v 1.6 2010/12/22 17:43:10 reyk Exp $
# $vantronix: Makefile,v 1.22 2010/06/02 12:22:58 reyk Exp $
PROG= iked
SRCS= ca.c chap_ms.c config.c control.c crypto.c dh.c \
eap.c iked.c ikev1.c ikev2.c ikev2_msg.c ikev2_pld.c \
- log.c pfkey.c policy.c proc.c timer.c util.c
+ log.c pfkey.c policy.c proc.c timer.c util.c imsg_util.c
SRCS+= ${.OBJDIR}/eap_map.c ${.OBJDIR}/ikev2_map.c
SRCS+= parse.y
MAN= iked.conf.5 iked.8
diff --git a/sbin/iked/iked.h b/sbin/iked/iked.h
index bab95ea5cd0..c555ccb1823 100644
--- a/sbin/iked/iked.h
+++ b/sbin/iked/iked.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: iked.h,v 1.23 2010/12/22 16:22:27 mikeb Exp $ */
+/* $OpenBSD: iked.h,v 1.24 2010/12/22 17:43:10 reyk Exp $ */
/* $vantronix: iked.h,v 1.61 2010/06/03 07:57:33 reyk Exp $ */
/*
@@ -721,18 +721,6 @@ pid_t run_proc(struct iked *, struct iked_proc *, struct iked_proc *,
/* util.c */
void socket_set_blockmode(int, enum blockmodes);
-void imsg_event_add(struct imsgev *);
-int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t,
- pid_t, int, void *, u_int16_t);
-int imsg_composev_event(struct imsgev *, u_int16_t, u_int32_t,
- pid_t, int, const struct iovec *, int);
-int imsg_compose_proc(struct iked *, enum iked_procid,
- u_int16_t, int, void *, u_int16_t);
-int imsg_composev_proc(struct iked *, enum iked_procid,
- u_int16_t, int, const struct iovec *, int);
-int imsg_forward_proc(struct iked *, struct imsg *,
- enum iked_procid);
-void imsg_flush_proc(struct iked *, enum iked_procid);
int socket_af(struct sockaddr *, in_port_t);
in_port_t
socket_getport(struct sockaddr_storage *);
@@ -763,6 +751,19 @@ const char *
int expand_string(char *, size_t, const char *, const char *);
u_int8_t *string2unicode(const char *, size_t *);
+/* imsg_util.c */
+void imsg_event_add(struct imsgev *);
+int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t,
+ pid_t, int, void *, u_int16_t);
+int imsg_composev_event(struct imsgev *, u_int16_t, u_int32_t,
+ pid_t, int, const struct iovec *, int);
+int imsg_compose_proc(struct iked *, enum iked_procid,
+ u_int16_t, int, void *, u_int16_t);
+int imsg_composev_proc(struct iked *, enum iked_procid,
+ u_int16_t, int, const struct iovec *, int);
+int imsg_forward_proc(struct iked *, struct imsg *,
+ enum iked_procid);
+void imsg_flush_proc(struct iked *, enum iked_procid);
struct ibuf *
ibuf_new(void *, size_t);
struct ibuf *
diff --git a/sbin/iked/imsg_util.c b/sbin/iked/imsg_util.c
new file mode 100644
index 00000000000..6307752871a
--- /dev/null
+++ b/sbin/iked/imsg_util.c
@@ -0,0 +1,280 @@
+/* $OpenBSD: imsg_util.c,v 1.1 2010/12/22 17:43:10 reyk Exp $ */
+
+/*
+ * Copyright (c) 2010 Reyk Floeter <reyk@vantronix.net>
+ *
+ * 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 <net/if.h>
+#include <netinet/in_systm.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <event.h>
+
+#include "iked.h"
+#include "ikev2.h"
+
+void
+imsg_event_add(struct imsgev *iev)
+{
+ if (iev->handler == NULL) {
+ imsg_flush(&iev->ibuf);
+ return;
+ }
+
+ iev->events = EV_READ;
+ if (iev->ibuf.w.queued)
+ iev->events |= EV_WRITE;
+
+ event_del(&iev->ev);
+ event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev->data);
+ event_add(&iev->ev, NULL);
+}
+
+int
+imsg_compose_event(struct imsgev *iev, u_int16_t type, u_int32_t peerid,
+ pid_t pid, int fd, void *data, u_int16_t datalen)
+{
+ int ret;
+
+ if ((ret = imsg_compose(&iev->ibuf, type, peerid,
+ pid, fd, data, datalen)) == -1)
+ return (ret);
+ imsg_event_add(iev);
+ return (ret);
+}
+
+int
+imsg_composev_event(struct imsgev *iev, u_int16_t type, u_int32_t peerid,
+ pid_t pid, int fd, const struct iovec *iov, int iovcnt)
+{
+ int ret;
+
+ if ((ret = imsg_composev(&iev->ibuf, type, peerid,
+ pid, fd, iov, iovcnt)) == -1)
+ return (ret);
+ imsg_event_add(iev);
+ return (ret);
+}
+
+int
+imsg_compose_proc(struct iked *env, enum iked_procid id,
+ u_int16_t type, int fd, void *data, u_int16_t datalen)
+{
+ return (imsg_compose_event(&env->sc_ievs[id],
+ type, -1, 0, fd, data, datalen));
+}
+
+int
+imsg_composev_proc(struct iked *env, enum iked_procid id,
+ u_int16_t type, int fd, const struct iovec *iov, int iovcnt)
+{
+ return (imsg_composev_event(&env->sc_ievs[id],
+ type, -1, 0, fd, iov, iovcnt));
+}
+
+int
+imsg_forward_proc(struct iked *env, struct imsg *imsg,
+ enum iked_procid id)
+{
+ return (imsg_compose_proc(env, id, imsg->hdr.type,
+ imsg->fd, imsg->data, IMSG_DATA_SIZE(imsg)));
+}
+
+void
+imsg_flush_proc(struct iked *env, enum iked_procid id)
+{
+ imsg_flush(&env->sc_ievs[id].ibuf);
+}
+
+/*
+ * Extending the imsg buffer API for internal use
+ */
+
+int
+ibuf_cat(struct ibuf *dst, struct ibuf *src)
+{
+ return (ibuf_add(dst, src->buf, ibuf_size(src)));
+}
+
+void
+ibuf_zero(struct ibuf *buf)
+{
+ memset(buf->buf, 0, buf->wpos);
+}
+
+struct ibuf *
+ibuf_new(void *data, size_t len)
+{
+ struct ibuf *buf;
+
+ if ((buf = ibuf_dynamic(len,
+ IKED_MSGBUF_MAX)) == NULL)
+ return (NULL);
+
+ ibuf_zero(buf);
+
+ if (data == NULL && len) {
+ if (ibuf_advance(buf, len) == NULL) {
+ ibuf_free(buf);
+ return (NULL);
+ }
+ } else {
+ if (ibuf_add(buf, data, len) != 0) {
+ ibuf_free(buf);
+ return (NULL);
+ }
+ }
+
+ return (buf);
+}
+
+struct ibuf *
+ibuf_static(void)
+{
+ struct ibuf *buf;
+
+ if ((buf = ibuf_open(IKED_MSGBUF_MAX)) == NULL)
+ return (NULL);
+
+ ibuf_zero(buf);
+
+ return (buf);
+}
+
+void *
+ibuf_advance(struct ibuf *buf, size_t len)
+{
+ void *ptr;
+
+ if ((ptr = ibuf_reserve(buf, len)) != NULL)
+ memset(ptr, 0, len);
+
+ return (ptr);
+}
+
+void
+ibuf_release(struct ibuf *buf)
+{
+ if (buf == NULL)
+ return;
+ if (buf->buf != NULL)
+ free(buf->buf);
+ free(buf);
+}
+
+size_t
+ibuf_length(struct ibuf *buf)
+{
+ if (buf == NULL || buf->buf == NULL)
+ return (0);
+ return (ibuf_size(buf));
+}
+
+u_int8_t *
+ibuf_data(struct ibuf *buf)
+{
+ return (ibuf_seek(buf, 0, 0));
+}
+
+void *
+ibuf_getdata(struct ibuf *buf, size_t len)
+{
+ void *data;
+
+ if ((data = ibuf_seek(buf, buf->rpos, len)) == NULL)
+ return (NULL);
+ buf->rpos += len;
+
+ return (data);
+}
+
+struct ibuf *
+ibuf_get(struct ibuf *buf, size_t len)
+{
+ void *data;
+
+ if ((data = ibuf_getdata(buf, len)) == NULL)
+ return (NULL);
+
+ return (ibuf_new(data, len));
+}
+
+struct ibuf *
+ibuf_dup(struct ibuf *buf)
+{
+ if (buf == NULL)
+ return (NULL);
+ return (ibuf_new(ibuf_data(buf), ibuf_size(buf)));
+}
+
+struct ibuf *
+ibuf_random(size_t len)
+{
+ struct ibuf *buf;
+ void *ptr;
+
+ if ((buf = ibuf_open(len)) == NULL)
+ return (NULL);
+ if ((ptr = ibuf_reserve(buf, len)) == NULL) {
+ ibuf_free(buf);
+ return (NULL);
+ }
+ arc4random_buf(ptr, len);
+ return (buf);
+}
+
+int
+ibuf_setsize(struct ibuf *buf, size_t len)
+{
+ if (len > buf->size)
+ return (-1);
+ buf->wpos = len;
+ return (0);
+}
+
+int
+ibuf_prepend(struct ibuf *buf, void *data, size_t len)
+{
+ struct ibuf *new;
+
+ /* Swap buffers (we could also use memmove here) */
+ if ((new = ibuf_new(data, len)) == NULL)
+ return (-1);
+ if (ibuf_cat(new, buf) == -1) {
+ ibuf_release(new);
+ return (-1);
+ }
+ free(buf->buf);
+ memcpy(buf, new, sizeof(*buf));
+ free(new);
+
+ return (0);
+}
diff --git a/sbin/iked/util.c b/sbin/iked/util.c
index 52fe6033b1a..bb8d61ab028 100644
--- a/sbin/iked/util.c
+++ b/sbin/iked/util.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: util.c,v 1.8 2010/12/01 12:01:25 reyk Exp $ */
+/* $OpenBSD: util.c,v 1.9 2010/12/22 17:43:10 reyk Exp $ */
/* $vantronix: util.c,v 1.39 2010/06/02 12:22:58 reyk Exp $ */
/*
@@ -59,79 +59,6 @@ socket_set_blockmode(int fd, enum blockmodes bm)
fatal("fcntl F_SETFL");
}
-void
-imsg_event_add(struct imsgev *iev)
-{
- if (iev->handler == NULL) {
- imsg_flush(&iev->ibuf);
- return;
- }
-
- iev->events = EV_READ;
- if (iev->ibuf.w.queued)
- iev->events |= EV_WRITE;
-
- event_del(&iev->ev);
- event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev->data);
- event_add(&iev->ev, NULL);
-}
-
-int
-imsg_compose_event(struct imsgev *iev, u_int16_t type, u_int32_t peerid,
- pid_t pid, int fd, void *data, u_int16_t datalen)
-{
- int ret;
-
- if ((ret = imsg_compose(&iev->ibuf, type, peerid,
- pid, fd, data, datalen)) == -1)
- return (ret);
- imsg_event_add(iev);
- return (ret);
-}
-
-int
-imsg_composev_event(struct imsgev *iev, u_int16_t type, u_int32_t peerid,
- pid_t pid, int fd, const struct iovec *iov, int iovcnt)
-{
- int ret;
-
- if ((ret = imsg_composev(&iev->ibuf, type, peerid,
- pid, fd, iov, iovcnt)) == -1)
- return (ret);
- imsg_event_add(iev);
- return (ret);
-}
-
-int
-imsg_compose_proc(struct iked *env, enum iked_procid id,
- u_int16_t type, int fd, void *data, u_int16_t datalen)
-{
- return (imsg_compose_event(&env->sc_ievs[id],
- type, -1, 0, fd, data, datalen));
-}
-
-int
-imsg_composev_proc(struct iked *env, enum iked_procid id,
- u_int16_t type, int fd, const struct iovec *iov, int iovcnt)
-{
- return (imsg_composev_event(&env->sc_ievs[id],
- type, -1, 0, fd, iov, iovcnt));
-}
-
-int
-imsg_forward_proc(struct iked *env, struct imsg *imsg,
- enum iked_procid id)
-{
- return (imsg_compose_proc(env, id, imsg->hdr.type,
- imsg->fd, imsg->data, IMSG_DATA_SIZE(imsg)));
-}
-
-void
-imsg_flush_proc(struct iked *env, enum iked_procid id)
-{
- imsg_flush(&env->sc_ievs[id].ibuf);
-}
-
int
socket_af(struct sockaddr *sa, in_port_t port)
{
@@ -796,168 +723,3 @@ string2unicode(const char *ascii, size_t *outlen)
return (uc);
}
-
-/*
- * Extending the imsg buffer API for internal use
- */
-
-int
-ibuf_cat(struct ibuf *dst, struct ibuf *src)
-{
- return (ibuf_add(dst, src->buf, ibuf_size(src)));
-}
-
-void
-ibuf_zero(struct ibuf *buf)
-{
- memset(buf->buf, 0, buf->wpos);
-}
-
-struct ibuf *
-ibuf_new(void *data, size_t len)
-{
- struct ibuf *buf;
-
- if ((buf = ibuf_dynamic(len,
- IKED_MSGBUF_MAX)) == NULL)
- return (NULL);
-
- ibuf_zero(buf);
-
- if (data == NULL && len) {
- if (ibuf_advance(buf, len) == NULL) {
- ibuf_free(buf);
- return (NULL);
- }
- } else {
- if (ibuf_add(buf, data, len) != 0) {
- ibuf_free(buf);
- return (NULL);
- }
- }
-
- return (buf);
-}
-
-struct ibuf *
-ibuf_static(void)
-{
- struct ibuf *buf;
-
- if ((buf = ibuf_open(IKED_MSGBUF_MAX)) == NULL)
- return (NULL);
-
- ibuf_zero(buf);
-
- return (buf);
-}
-
-void *
-ibuf_advance(struct ibuf *buf, size_t len)
-{
- void *ptr;
-
- if ((ptr = ibuf_reserve(buf, len)) != NULL)
- memset(ptr, 0, len);
-
- return (ptr);
-}
-
-void
-ibuf_release(struct ibuf *buf)
-{
- if (buf == NULL)
- return;
- if (buf->buf != NULL)
- free(buf->buf);
- free(buf);
-}
-
-size_t
-ibuf_length(struct ibuf *buf)
-{
- if (buf == NULL || buf->buf == NULL)
- return (0);
- return (ibuf_size(buf));
-}
-
-u_int8_t *
-ibuf_data(struct ibuf *buf)
-{
- return (ibuf_seek(buf, 0, 0));
-}
-
-void *
-ibuf_getdata(struct ibuf *buf, size_t len)
-{
- void *data;
-
- if ((data = ibuf_seek(buf, buf->rpos, len)) == NULL)
- return (NULL);
- buf->rpos += len;
-
- return (data);
-}
-
-struct ibuf *
-ibuf_get(struct ibuf *buf, size_t len)
-{
- void *data;
-
- if ((data = ibuf_getdata(buf, len)) == NULL)
- return (NULL);
-
- return (ibuf_new(data, len));
-}
-
-struct ibuf *
-ibuf_dup(struct ibuf *buf)
-{
- if (buf == NULL)
- return (NULL);
- return (ibuf_new(ibuf_data(buf), ibuf_size(buf)));
-}
-
-struct ibuf *
-ibuf_random(size_t len)
-{
- struct ibuf *buf;
- void *ptr;
-
- if ((buf = ibuf_open(len)) == NULL)
- return (NULL);
- if ((ptr = ibuf_reserve(buf, len)) == NULL) {
- ibuf_free(buf);
- return (NULL);
- }
- arc4random_buf(ptr, len);
- return (buf);
-}
-
-int
-ibuf_setsize(struct ibuf *buf, size_t len)
-{
- if (len > buf->size)
- return (-1);
- buf->wpos = len;
- return (0);
-}
-
-int
-ibuf_prepend(struct ibuf *buf, void *data, size_t len)
-{
- struct ibuf *new;
-
- /* Swap buffers (we could also use memmove here) */
- if ((new = ibuf_new(data, len)) == NULL)
- return (-1);
- if (ibuf_cat(new, buf) == -1) {
- ibuf_release(new);
- return (-1);
- }
- free(buf->buf);
- memcpy(buf, new, sizeof(*buf));
- free(new);
-
- return (0);
-}