summaryrefslogtreecommitdiff
path: root/usr.sbin/relayd/hce.c
diff options
context:
space:
mode:
authorPierre-Yves Ritschard <pyr@cvs.openbsd.org>2007-05-31 05:07:09 +0000
committerPierre-Yves Ritschard <pyr@cvs.openbsd.org>2007-05-31 05:07:09 +0000
commitf6fdea49316c86f4de06b9ec051ed2830e37e134 (patch)
tree1ff64a8166ed968ea89ebbe2244afa173aa440a4 /usr.sbin/relayd/hce.c
parenta8df952cee1a9e4e21242052e03a4f06661afd0b (diff)
split event registration between the ones that will be kept intact
at reconfiguration time.
Diffstat (limited to 'usr.sbin/relayd/hce.c')
-rw-r--r--usr.sbin/relayd/hce.c105
1 files changed, 53 insertions, 52 deletions
diff --git a/usr.sbin/relayd/hce.c b/usr.sbin/relayd/hce.c
index 7bb7d8c38c2..35437fd1869 100644
--- a/usr.sbin/relayd/hce.c
+++ b/usr.sbin/relayd/hce.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hce.c,v 1.24 2007/05/31 03:26:36 pyr Exp $ */
+/* $OpenBSD: hce.c,v 1.25 2007/05/31 05:07:08 pyr Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@spootnik.org>
@@ -45,8 +45,8 @@ void hce_shutdown(void);
void hce_dispatch_imsg(int, short, void *);
void hce_dispatch_parent(int, short, void *);
void hce_launch_checks(int, short, void *);
-void hce_setup_events(int);
-void hce_start(void);
+void hce_setup_events(void);
+void hce_disable_events(void);
static struct hoststated *env = NULL;
struct imsgbuf *ibuf_pfe;
@@ -78,6 +78,8 @@ hce(struct hoststated *x_env, int pipe_parent2pfe[2], int pipe_parent2hce[2],
pid_t pid;
struct passwd *pw;
int i;
+ struct event ev_sigint;
+ struct event ev_sigterm;
switch (pid = fork()) {
case -1:
@@ -110,10 +112,29 @@ hce(struct hoststated *x_env, int pipe_parent2pfe[2], int pipe_parent2hce[2],
setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid))
fatal("hce: can't drop privileges");
- pipe_pfe = pipe_pfe2hce[0];
- pipe_parent = pipe_parent2hce[1];
+ event_init();
+
+ if ((ibuf_pfe = calloc(1, sizeof(struct imsgbuf))) == NULL ||
+ (ibuf_main = calloc(1, sizeof(struct imsgbuf))) == NULL)
+ fatal("hce");
+ imsg_init(ibuf_pfe, pipe_pfe2hce[0], hce_dispatch_imsg);
+ imsg_init(ibuf_main, pipe_parent2hce[1], hce_dispatch_parent);
+
+ ibuf_pfe->events = EV_READ;
+ event_set(&ibuf_pfe->ev, ibuf_pfe->fd, ibuf_pfe->events,
+ ibuf_pfe->handler, ibuf_pfe);
+ event_add(&ibuf_pfe->ev, NULL);
+
+ ibuf_main->events = EV_READ;
+ event_set(&ibuf_main->ev, ibuf_main->fd, ibuf_main->events,
+ ibuf_main->handler, ibuf_main);
+ event_add(&ibuf_main->ev, NULL);
- hce_setup_events(0);
+ signal_set(&ev_sigint, SIGINT, hce_sig_handler, NULL);
+ signal_set(&ev_sigterm, SIGTERM, hce_sig_handler, NULL);
+ signal_add(&ev_sigint, NULL);
+ signal_add(&ev_sigterm, NULL);
+ signal(SIGPIPE, SIG_IGN);
/* setup pipes */
close(pipe_pfe2hce[1]);
@@ -127,57 +148,15 @@ hce(struct hoststated *x_env, int pipe_parent2pfe[2], int pipe_parent2hce[2],
close(pipe_pfe2relay[i][1]);
}
- hce_start();
-
+ hce_setup_events();
+ event_dispatch();
hce_shutdown();
return (0);
}
void
-hce_setup_events(int diefirst)
-{
- struct event ev_sigint;
- struct event ev_sigterm;
- struct timeval tv;
-
- if (diefirst) {
-
- if (!TAILQ_EMPTY(env->tables)) {
- evtimer_set(&env->ev, hce_launch_checks, env);
- bzero(&tv, sizeof(tv));
- evtimer_add(&env->ev, &tv);
- }
-
- bzero(&tv, sizeof(tv));
- event_loopexit(&tv);
- }
- event_init();
-
- signal_set(&ev_sigint, SIGINT, hce_sig_handler, NULL);
- signal_set(&ev_sigterm, SIGTERM, hce_sig_handler, NULL);
- signal_add(&ev_sigint, NULL);
- signal_add(&ev_sigterm, NULL);
- signal(SIGPIPE, SIG_IGN);
-
- if ((ibuf_pfe = calloc(1, sizeof(struct imsgbuf))) == NULL ||
- (ibuf_main = calloc(1, sizeof(struct imsgbuf))) == NULL)
- fatal("hce");
- imsg_init(ibuf_pfe, pipe_pfe, hce_dispatch_imsg);
- imsg_init(ibuf_main, pipe_parent, hce_dispatch_parent);
- ibuf_pfe->events = EV_READ;
- event_set(&ibuf_pfe->ev, ibuf_pfe->fd, ibuf_pfe->events,
- ibuf_pfe->handler, ibuf_pfe);
- event_add(&ibuf_pfe->ev, NULL);
-
- ibuf_main->events = EV_READ;
- event_set(&ibuf_main->ev, ibuf_main->fd, ibuf_main->events,
- ibuf_main->handler, ibuf_main);
- event_add(&ibuf_main->ev, NULL);
-}
-
-void
-hce_start(void)
+hce_setup_events(void)
{
struct timeval tv;
struct table *table;
@@ -196,7 +175,29 @@ hce_start(void)
table->ssl_ctx = ssl_ctx_create(env);
}
}
- event_dispatch();
+}
+
+void
+hce_disable_events(void)
+{
+ struct table *table;
+ struct host *host;
+
+ evtimer_del(&env->ev);
+ TAILQ_FOREACH(table, env->tables, entry) {
+ TAILQ_FOREACH(host, &table->hosts, entry) {
+ event_del(&host->cte.ev);
+ close(host->cte.s);
+ }
+ }
+ if (env->has_icmp) {
+ event_del(&env->icmp_send.ev);
+ event_del(&env->icmp_recv.ev);
+ }
+ if (env->has_icmp6) {
+ event_del(&env->icmp6_send.ev);
+ event_del(&env->icmp6_recv.ev);
+ }
}
void