summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/relayd/parse.y97
-rw-r--r--usr.sbin/relayd/relayd.c123
-rw-r--r--usr.sbin/relayd/relayd.h6
3 files changed, 133 insertions, 93 deletions
diff --git a/usr.sbin/relayd/parse.y b/usr.sbin/relayd/parse.y
index 85322751e79..e3feb7381ea 100644
--- a/usr.sbin/relayd/parse.y
+++ b/usr.sbin/relayd/parse.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.y,v 1.105 2008/02/11 10:53:12 reyk Exp $ */
+/* $OpenBSD: parse.y,v 1.106 2008/02/13 11:02:37 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -739,98 +739,13 @@ protoptsl : SSL sslflags
label = 0;
}
| direction protonode log {
- struct protonode *pn, *proot, pk;
- struct proto_tree *tree;
-
- if ($1 == RELAY_DIR_RESPONSE)
- tree = &proto->response_tree;
- else
- tree = &proto->request_tree;
- if ((pn = calloc(1, sizeof (*pn))) == NULL)
- fatal("out of memory");
-
- bcopy(&node, pn, sizeof(*pn));
- pn->key = node.key;
- pn->value = node.value;
- pn->type = node.type;
- pn->label = label;
- SIMPLEQ_INIT(&pn->head);
- if ($1 == RELAY_DIR_RESPONSE)
- pn->id = proto->response_nodes++;
- else
- pn->id = proto->request_nodes++;
if ($3)
- pn->flags |= PNFLAG_LOG;
- if (pn->id == INT_MAX) {
- yyerror("too many protocol nodes defined");
- free(pn);
- YYERROR;
- }
- if ((proot =
- RB_INSERT(proto_tree, tree, pn)) != NULL) {
- /*
- * A protocol node with the same key already
- * exists, append it to a queue behind the
- * existing node.
- */
- if (SIMPLEQ_EMPTY(&proot->head))
- SIMPLEQ_NEXT(proot, entry) = pn;
- SIMPLEQ_INSERT_TAIL(&proot->head, pn, entry);
- }
-
- if (node.type == NODE_TYPE_COOKIE)
- pk.key = "Cookie";
- else if (node.type == NODE_TYPE_URL)
- pk.key = "Host";
- else
- pk.key = "GET";
- if (node.type != NODE_TYPE_HEADER) {
- pk.type = NODE_TYPE_HEADER;
- pn = RB_FIND(proto_tree, tree, &pk);
- if (pn == NULL) {
- if ((pn = (struct protonode *)
- calloc(1, sizeof(*pn))) == NULL)
- fatal("out of memory");
- pn->key = strdup(pk.key);
- if (pn->key == NULL)
- fatal("out of memory");
- pn->value = NULL;
- pn->action = NODE_ACTION_NONE;
- pn->type = pk.type;
- SIMPLEQ_INIT(&pn->head);
- if ($1 == RELAY_DIR_RESPONSE)
- pn->id =
- proto->response_nodes++;
- else
- pn->id = proto->request_nodes++;
- if (pn->id == INT_MAX) {
- yyerror("too many protocol "
- "nodes defined");
- YYERROR;
- }
- RB_INSERT(proto_tree, tree, pn);
- }
- switch (node.type) {
- case NODE_TYPE_QUERY:
- pn->flags |= PNFLAG_LOOKUP_QUERY;
- break;
- case NODE_TYPE_COOKIE:
- pn->flags |= PNFLAG_LOOKUP_COOKIE;
- break;
- case NODE_TYPE_URL:
- if (node.flags &
- PNFLAG_LOOKUP_URL_DIGEST)
- pn->flags |= node.flags &
- PNFLAG_LOOKUP_URL_DIGEST;
- else
- pn->flags |=
- PNFLAG_LOOKUP_DIGEST(0);
- break;
- default:
- break;
- }
+ node.flags |= PNFLAG_LOG;
+ node.label = label;
+ if (protonode_add($1, proto, &node) == -1) {
+ yyerror("failed to add protocol node");
+ YYERROR;
}
-
bzero(&node, sizeof(node));
}
| include
diff --git a/usr.sbin/relayd/relayd.c b/usr.sbin/relayd/relayd.c
index b903c393819..570ad2a13aa 100644
--- a/usr.sbin/relayd/relayd.c
+++ b/usr.sbin/relayd/relayd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: relayd.c,v 1.70 2008/02/11 10:42:50 reyk Exp $ */
+/* $OpenBSD: relayd.c,v 1.71 2008/02/13 11:02:37 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -1012,3 +1012,124 @@ canonicalize_host(const char *host, char *name, size_t len)
errno = EINVAL;
return (NULL);
}
+
+struct protonode *
+protonode_header(enum direction dir, struct protocol *proto,
+ struct protonode *pk)
+{
+ struct protonode *pn;
+ struct proto_tree *tree;
+
+ if (dir == RELAY_DIR_RESPONSE)
+ tree = &proto->response_tree;
+ else
+ tree = &proto->request_tree;
+
+ pn = RB_FIND(proto_tree, tree, pk);
+ if (pn != NULL)
+ return (pn);
+ if ((pn = (struct protonode *)calloc(1, sizeof(*pn))) == NULL) {
+ log_warn("out of memory");
+ return (NULL);
+ }
+ pn->key = strdup(pk->key);
+ if (pn->key == NULL) {
+ log_warn("out of memory");
+ return (NULL);
+ }
+ pn->value = NULL;
+ pn->action = NODE_ACTION_NONE;
+ pn->type = pk->type;
+ SIMPLEQ_INIT(&pn->head);
+ if (dir == RELAY_DIR_RESPONSE)
+ pn->id =
+ proto->response_nodes++;
+ else
+ pn->id = proto->request_nodes++;
+ if (pn->id == INT_MAX) {
+ log_warnx("too many protocol "
+ "nodes defined");
+ return (NULL);
+ }
+ RB_INSERT(proto_tree, tree, pn);
+ return (pn);
+}
+
+int
+protonode_add(enum direction dir, struct protocol *proto,
+ struct protonode *node)
+{
+ struct protonode *pn, *proot, pk;
+ struct proto_tree *tree;
+
+ if (dir == RELAY_DIR_RESPONSE)
+ tree = &proto->response_tree;
+ else
+ tree = &proto->request_tree;
+
+ if ((pn = calloc(1, sizeof (*pn))) == NULL) {
+ log_warn("out of memory");
+ return (-1);
+ }
+ bcopy(node, pn, sizeof(*pn));
+ pn->key = node->key;
+ pn->value = node->value;
+ pn->type = node->type;
+ pn->label = node->label;
+ SIMPLEQ_INIT(&pn->head);
+ if (dir == RELAY_DIR_RESPONSE)
+ pn->id = proto->response_nodes++;
+ else
+ pn->id = proto->request_nodes++;
+ pn->flags = node->flags;
+ if (pn->id == INT_MAX) {
+ log_warnx("too many protocol nodes defined");
+ free(pn);
+ return (-1);
+ }
+ if ((proot =
+ RB_INSERT(proto_tree, tree, pn)) != NULL) {
+ /*
+ * A protocol node with the same key already
+ * exists, append it to a queue behind the
+ * existing node->
+ */
+ if (SIMPLEQ_EMPTY(&proot->head))
+ SIMPLEQ_NEXT(proot, entry) = pn;
+ SIMPLEQ_INSERT_TAIL(&proot->head, pn, entry);
+ }
+
+ if (node->type == NODE_TYPE_COOKIE)
+ pk.key = "Cookie";
+ else if (node->type == NODE_TYPE_URL)
+ pk.key = "Host";
+ else
+ pk.key = "GET";
+ if (node->type != NODE_TYPE_HEADER) {
+ pk.type = NODE_TYPE_HEADER;
+ pn = protonode_header(dir, proto, &pk);
+ if (pn == NULL)
+ return (-1);
+ switch (node->type) {
+ case NODE_TYPE_QUERY:
+ pn->flags |= PNFLAG_LOOKUP_QUERY;
+ break;
+ case NODE_TYPE_COOKIE:
+ pn->flags |= PNFLAG_LOOKUP_COOKIE;
+ break;
+ case NODE_TYPE_URL:
+ if (node->flags &
+ PNFLAG_LOOKUP_URL_DIGEST)
+ pn->flags |= node->flags &
+ PNFLAG_LOOKUP_URL_DIGEST;
+ else
+ pn->flags |=
+ PNFLAG_LOOKUP_DIGEST(0);
+ break;
+ default:
+ break;
+ }
+ }
+
+ return (0);
+}
diff --git a/usr.sbin/relayd/relayd.h b/usr.sbin/relayd/relayd.h
index 446347925f6..223ab26dce7 100644
--- a/usr.sbin/relayd/relayd.h
+++ b/usr.sbin/relayd/relayd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: relayd.h,v 1.97 2008/02/11 10:42:50 reyk Exp $ */
+/* $OpenBSD: relayd.h,v 1.98 2008/02/13 11:02:37 reyk Exp $ */
/*
* Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -825,6 +825,10 @@ void purge_table(struct tablelist *, struct table *);
void merge_config(struct relayd *, struct relayd *);
char *digeststr(enum digest_type, const u_int8_t *, size_t, char *);
const char *canonicalize_host(const char *, char *, size_t);
+struct protonode *protonode_header(enum direction, struct protocol *,
+ struct protonode *);
+int protonode_add(enum direction, struct protocol *,
+ struct protonode *);
/* carp.c */
int carp_demote_init(char *, int);