summaryrefslogtreecommitdiffstats
path: root/usr.sbin/hoststated/check_send_expect.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/hoststated/check_send_expect.c')
-rw-r--r--usr.sbin/hoststated/check_send_expect.c77
1 files changed, 40 insertions, 37 deletions
diff --git a/usr.sbin/hoststated/check_send_expect.c b/usr.sbin/hoststated/check_send_expect.c
index 528dd8b1fc1..81c9519b567 100644
--- a/usr.sbin/hoststated/check_send_expect.c
+++ b/usr.sbin/hoststated/check_send_expect.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: check_send_expect.c,v 1.3 2007/01/09 00:45:32 deraadt Exp $ */
+/* $OpenBSD: check_send_expect.c,v 1.4 2007/01/11 18:05:08 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@spootnik.org>
*
@@ -19,6 +19,7 @@
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/param.h>
+
#include <net/if.h>
#include <limits.h>
#include <event.h>
@@ -28,6 +29,7 @@
#include <unistd.h>
#include <fcntl.h>
#include <fnmatch.h>
+#include <errno.h>
#include "hoststated.h"
@@ -49,7 +51,7 @@ se_validate(struct ctl_tcp_event *cte)
if (fnmatch(cte->table->exbuf, cte->buf->buf, 0) == 0)
cte->host->up = HOST_UP;
else
- cte->host->up = HOST_DOWN;
+ cte->host->up = HOST_UNKNOWN;
/*
* go back to original position.
@@ -62,8 +64,6 @@ se_read(int s, short event, void *arg)
{
ssize_t br;
char rbuf[SMALL_READ_BUF_SIZE];
- struct timeval tv;
- struct timeval tv_now;
struct ctl_tcp_event *cte = arg;
if (event == EV_TIMEOUT) {
@@ -72,42 +72,44 @@ se_read(int s, short event, void *arg)
hce_notify_done(cte->host, "se_read: timeout");
return;
}
+
br = read(s, rbuf, sizeof(rbuf));
- log_debug("se_read: %d bytes read", br);
- if (br == 0) {
+ if (br == -1) {
+ if (errno == EAGAIN || errno == EINTR)
+ goto retry;
+ cte->host->up = HOST_DOWN;
+ buf_free(cte->buf);
+ hce_notify_done(cte->host, "se_read: read failed");
+ return;
+ } else if (br == 0) {
cte->host->up = HOST_DOWN;
se_validate(cte);
buf_free(cte->buf);
hce_notify_done(cte->host, "se_read: connection closed");
- } else if (br == -1) {
- cte->host->up = HOST_DOWN;
+ return;
+ }
+
+ buf_add(cte->buf, rbuf, br);
+ se_validate(cte);
+ if (cte->host->up == HOST_UP) {
buf_free(cte->buf);
- hce_notify_done(cte->host, "se_read: read failed");
- } else {
- buf_add(cte->buf, rbuf, br);
- bcopy(&cte->table->timeout, &tv, sizeof(tv));
- if (gettimeofday(&tv_now, NULL))
- fatal("se_read: gettimeofday");
- timersub(&tv_now, &cte->tv_start, &tv_now);
- timersub(&tv, &tv_now, &tv);
- se_validate(cte);
- if (cte->host->up == HOST_UP) {
- buf_free(cte->buf);
- hce_notify_done(cte->host, NULL);
- } else
- event_once(s, EV_READ|EV_TIMEOUT, se_read, cte, &tv);
+ hce_notify_done(cte->host, "se_read: done");
+ return;
}
+
+ retry:
+ event_again(&cte->ev, s, EV_TIMEOUT|EV_READ, se_read,
+ &cte->tv_start, &cte->table->timeout, cte);
}
void
-start_send_expect(struct ctl_tcp_event *cte)
+start_send_expect(int s, short event, void *arg)
{
- int bs;
- int pos;
- int len;
- char *req;
- struct timeval tv;
- struct timeval tv_now;
+ struct ctl_tcp_event *cte = (struct ctl_tcp_event *)arg;
+ int bs;
+ int pos;
+ int len;
+ char *req;
req = cte->table->sendbuf;
pos = 0;
@@ -115,7 +117,9 @@ start_send_expect(struct ctl_tcp_event *cte)
if (len) {
do {
bs = write(cte->s, req + pos, len);
- if (bs <= 0) {
+ if (bs == -1) {
+ if (errno == EAGAIN || errno == EINTR)
+ goto retry;
log_warnx("send_se_data: cannot send");
cte->host->up = HOST_DOWN;
hce_notify_done(cte->host,
@@ -130,12 +134,11 @@ start_send_expect(struct ctl_tcp_event *cte)
if ((cte->buf = buf_dynamic(SMALL_READ_BUF_SIZE, UINT_MAX)) == NULL)
fatalx("send_se_data: cannot create dynamic buffer");
- log_debug("start_send_expect: reading");
+ event_again(&cte->ev, s, EV_TIMEOUT|EV_READ, se_read,
+ &cte->tv_start, &cte->table->timeout, cte);
+ return;
- bcopy(&cte->table->timeout, &tv, sizeof(tv));
- if (gettimeofday(&tv_now, NULL))
- fatal("start_send_expect: gettimeofday");
- timersub(&tv_now, &cte->tv_start, &tv_now);
- timersub(&tv, &tv_now, &tv);
- event_once(cte->s, EV_READ|EV_TIMEOUT, se_read, cte, &tv);
+ retry:
+ event_again(&cte->ev, s, EV_TIMEOUT|EV_WRITE, start_send_expect,
+ &cte->tv_start, &cte->table->timeout, cte);
}