diff options
author | Reyk Floeter <reyk@cvs.openbsd.org> | 2010-12-22 17:43:11 +0000 |
---|---|---|
committer | Reyk Floeter <reyk@cvs.openbsd.org> | 2010-12-22 17:43:11 +0000 |
commit | af5cc54da27a9bfaf0facfe8695378904a6f1dda (patch) | |
tree | 0b0cf1005286831dff0224182c256b636ac64c23 /sbin/iked | |
parent | 33da8686a7ef42188e04f85531a4ef0b4c5e4494 (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/Makefile | 4 | ||||
-rw-r--r-- | sbin/iked/iked.h | 27 | ||||
-rw-r--r-- | sbin/iked/imsg_util.c | 280 | ||||
-rw-r--r-- | sbin/iked/util.c | 240 |
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); -} |