1*c6d32703Smikeb /* $OpenBSD: timer.c,v 1.13 2016/09/13 10:49:52 mikeb Exp $ */
2a183e813Sreyk
3a183e813Sreyk /*
4fcebd35dSreyk * Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org>
5a183e813Sreyk *
6a183e813Sreyk * Permission to use, copy, modify, and distribute this software for any
7a183e813Sreyk * purpose with or without fee is hereby granted, provided that the above
8a183e813Sreyk * copyright notice and this permission notice appear in all copies.
9a183e813Sreyk *
10a183e813Sreyk * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11a183e813Sreyk * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12a183e813Sreyk * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13a183e813Sreyk * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14a183e813Sreyk * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15a183e813Sreyk * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16a183e813Sreyk * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17a183e813Sreyk */
18a183e813Sreyk
19a183e813Sreyk #include <sys/queue.h>
20a183e813Sreyk #include <sys/socket.h>
21a183e813Sreyk #include <sys/uio.h>
22a183e813Sreyk
23a183e813Sreyk #include <stdio.h>
24a183e813Sreyk #include <stdlib.h>
25a183e813Sreyk #include <unistd.h>
26a183e813Sreyk #include <string.h>
27a183e813Sreyk #include <errno.h>
28a183e813Sreyk #include <fcntl.h>
29a183e813Sreyk #include <ctype.h>
30a183e813Sreyk #include <event.h>
31a183e813Sreyk
32a183e813Sreyk #include "iked.h"
33a183e813Sreyk
34e487e0e8Smikeb void timer_callback(int, short, void *);
35a183e813Sreyk
36a183e813Sreyk void
timer_set(struct iked * env,struct iked_timer * tmr,void (* cb)(struct iked *,void *),void * arg)37b3eeacebSmikeb timer_set(struct iked *env, struct iked_timer *tmr,
38e71a3409Smikeb void (*cb)(struct iked *, void *), void *arg)
39e71a3409Smikeb {
40*c6d32703Smikeb if (evtimer_initialized(&tmr->tmr_ev) &&
41*c6d32703Smikeb evtimer_pending(&tmr->tmr_ev, NULL))
42*c6d32703Smikeb evtimer_del(&tmr->tmr_ev);
43*c6d32703Smikeb
44e71a3409Smikeb tmr->tmr_env = env;
45e71a3409Smikeb tmr->tmr_cb = cb;
46e71a3409Smikeb tmr->tmr_cbarg = arg;
47e71a3409Smikeb evtimer_set(&tmr->tmr_ev, timer_callback, tmr);
48e71a3409Smikeb }
49e71a3409Smikeb
50e71a3409Smikeb void
timer_add(struct iked * env,struct iked_timer * tmr,int timeout)51b3eeacebSmikeb timer_add(struct iked *env, struct iked_timer *tmr, int timeout)
52a183e813Sreyk {
53e487e0e8Smikeb struct timeval tv = { timeout };
54a183e813Sreyk
55e487e0e8Smikeb evtimer_add(&tmr->tmr_ev, &tv);
56a183e813Sreyk }
57a183e813Sreyk
58a183e813Sreyk void
timer_del(struct iked * env,struct iked_timer * tmr)59b3eeacebSmikeb timer_del(struct iked *env, struct iked_timer *tmr)
603476d919Smikeb {
61b3eeacebSmikeb if (tmr->tmr_env == env && tmr->tmr_cb &&
62b3eeacebSmikeb evtimer_initialized(&tmr->tmr_ev))
633476d919Smikeb evtimer_del(&tmr->tmr_ev);
643476d919Smikeb }
653476d919Smikeb
663476d919Smikeb void
timer_callback(int fd,short event,void * arg)67e487e0e8Smikeb timer_callback(int fd, short event, void *arg)
68a183e813Sreyk {
69e487e0e8Smikeb struct iked_timer *tmr = arg;
70a183e813Sreyk
71e487e0e8Smikeb if (tmr->tmr_cb)
72e487e0e8Smikeb tmr->tmr_cb(tmr->tmr_env, tmr->tmr_cbarg);
73a183e813Sreyk }
74