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
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=210869
@ -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) */
|
||||||
|
@ -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);
|
||||||
|
@ -271,5 +271,5 @@ static __constructor void
|
|||||||
sp_ctor(void)
|
sp_ctor(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
proto_register(&sp_proto);
|
proto_register(&sp_proto, false);
|
||||||
}
|
}
|
||||||
|
@ -515,5 +515,5 @@ static __constructor void
|
|||||||
tcp4_ctor(void)
|
tcp4_ctor(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
proto_register(&tcp4_proto);
|
proto_register(&tcp4_proto, true);
|
||||||
}
|
}
|
||||||
|
@ -326,5 +326,5 @@ static __constructor void
|
|||||||
uds_ctor(void)
|
uds_ctor(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
proto_register(&uds_proto);
|
proto_register(&uds_proto, false);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user