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:
parent
e2865ebbc2
commit
50692f84c6
@ -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) */
|
||||
|
@ -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);
|
||||
|
@ -271,5 +271,5 @@ static __constructor void
|
||||
sp_ctor(void)
|
||||
{
|
||||
|
||||
proto_register(&sp_proto);
|
||||
proto_register(&sp_proto, false);
|
||||
}
|
||||
|
@ -515,5 +515,5 @@ static __constructor void
|
||||
tcp4_ctor(void)
|
||||
{
|
||||
|
||||
proto_register(&tcp4_proto);
|
||||
proto_register(&tcp4_proto, true);
|
||||
}
|
||||
|
@ -326,5 +326,5 @@ static __constructor void
|
||||
uds_ctor(void)
|
||||
{
|
||||
|
||||
proto_register(&uds_proto);
|
||||
proto_register(&uds_proto, false);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user