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 #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 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 static int
@ -75,7 +82,7 @@ proto_common_setup(const char *addr, struct proto_conn **connp, int side)
if (conn == NULL) if (conn == NULL)
return (-1); return (-1);
LIST_FOREACH(proto, &protos, hp_next) { TAILQ_FOREACH(proto, &protos, hp_next) {
if (side == PROTO_SIDE_CLIENT) if (side == PROTO_SIDE_CLIENT)
ret = proto->hp_client(addr, &ctx); ret = proto->hp_client(addr, &ctx);
else /* if (side == PROTO_SIDE_SERVER_LISTEN) */ else /* if (side == PROTO_SIDE_SERVER_LISTEN) */

View File

@ -64,10 +64,10 @@ struct hast_proto {
hp_local_address_t *hp_local_address; hp_local_address_t *hp_local_address;
hp_remote_address_t *hp_remote_address; hp_remote_address_t *hp_remote_address;
hp_close_t *hp_close; 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_send(int fd, const unsigned char *data, size_t size);
int proto_common_recv(int fd, 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) sp_ctor(void)
{ {
proto_register(&sp_proto); proto_register(&sp_proto, false);
} }

View File

@ -515,5 +515,5 @@ static __constructor void
tcp4_ctor(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) uds_ctor(void)
{ {
proto_register(&uds_proto); proto_register(&uds_proto, false);
} }