Add an argument to the proto_register() function which allows protocol to

declare it is the default and be placed at the end of the queue so it is
checked last.

MFC after:	1 month
This commit is contained in:
Pawel Jakub Dawidek 2010-08-05 17:56:41 +00:00
parent e2865ebbc2
commit 50692f84c6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=210869
5 changed files with 16 additions and 9 deletions

View File

@ -52,13 +52,20 @@ struct proto_conn {
#define PROTO_SIDE_SERVER_WORK 2
};
static LIST_HEAD(, hast_proto) protos = LIST_HEAD_INITIALIZER(protos);
static TAILQ_HEAD(, hast_proto) protos = TAILQ_HEAD_INITIALIZER(protos);
void
proto_register(struct hast_proto *proto)
proto_register(struct hast_proto *proto, bool isdefault)
{
static bool seen_default = false;
LIST_INSERT_HEAD(&protos, proto, hp_next);
if (!isdefault)
TAILQ_INSERT_HEAD(&protos, proto, hp_next);
else {
assert(!seen_default);
seen_default = true;
TAILQ_INSERT_TAIL(&protos, proto, hp_next);
}
}
static int
@ -75,7 +82,7 @@ proto_common_setup(const char *addr, struct proto_conn **connp, int side)
if (conn == NULL)
return (-1);
LIST_FOREACH(proto, &protos, hp_next) {
TAILQ_FOREACH(proto, &protos, hp_next) {
if (side == PROTO_SIDE_CLIENT)
ret = proto->hp_client(addr, &ctx);
else /* if (side == PROTO_SIDE_SERVER_LISTEN) */

View File

@ -64,10 +64,10 @@ struct hast_proto {
hp_local_address_t *hp_local_address;
hp_remote_address_t *hp_remote_address;
hp_close_t *hp_close;
LIST_ENTRY(hast_proto) hp_next;
TAILQ_ENTRY(hast_proto) hp_next;
};
void proto_register(struct hast_proto *proto);
void proto_register(struct hast_proto *proto, bool isdefault);
int proto_common_send(int fd, const unsigned char *data, size_t size);
int proto_common_recv(int fd, unsigned char *data, size_t size);

View File

@ -271,5 +271,5 @@ static __constructor void
sp_ctor(void)
{
proto_register(&sp_proto);
proto_register(&sp_proto, false);
}

View File

@ -515,5 +515,5 @@ static __constructor void
tcp4_ctor(void)
{
proto_register(&tcp4_proto);
proto_register(&tcp4_proto, true);
}

View File

@ -326,5 +326,5 @@ static __constructor void
uds_ctor(void)
{
proto_register(&uds_proto);
proto_register(&uds_proto, false);
}