* Made the code a bit more robust against faulty use.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38181 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -504,6 +504,11 @@ put_domain_protocols(net_socket* socket)
|
|||||||
static void
|
static void
|
||||||
uninit_domain_datalink_protocols(domain_datalink* datalink)
|
uninit_domain_datalink_protocols(domain_datalink* datalink)
|
||||||
{
|
{
|
||||||
|
TRACE(("%s(datalink %p)\n", __FUNCTION__, datalink));
|
||||||
|
|
||||||
|
if (datalink == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
net_datalink_protocol* protocol = datalink->first_protocol;
|
net_datalink_protocol* protocol = datalink->first_protocol;
|
||||||
while (protocol != NULL) {
|
while (protocol != NULL) {
|
||||||
net_datalink_protocol* next = protocol->next;
|
net_datalink_protocol* next = protocol->next;
|
||||||
@@ -520,6 +525,9 @@ uninit_domain_datalink_protocols(domain_datalink* datalink)
|
|||||||
status_t
|
status_t
|
||||||
get_domain_datalink_protocols(Interface* interface, net_domain* domain)
|
get_domain_datalink_protocols(Interface* interface, net_domain* domain)
|
||||||
{
|
{
|
||||||
|
TRACE(("%s(interface %p, domain %d)\n", __FUNCTION__, interface,
|
||||||
|
domain->family));
|
||||||
|
|
||||||
struct chain* chain;
|
struct chain* chain;
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -531,10 +539,16 @@ get_domain_datalink_protocols(Interface* interface, net_domain* domain)
|
|||||||
return EAFNOSUPPORT;
|
return EAFNOSUPPORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
domain_datalink* datalink = interface->DomainDatalink(domain->family);
|
||||||
|
if (datalink == NULL)
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
if (datalink->first_protocol != NULL)
|
||||||
|
return B_NAME_IN_USE;
|
||||||
|
|
||||||
// create net_protocol objects for the protocols in the chain
|
// create net_protocol objects for the protocols in the chain
|
||||||
|
|
||||||
status_t status = chain->Acquire();
|
status_t status = chain->Acquire();
|
||||||
if (status < B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
net_datalink_protocol* last = NULL;
|
net_datalink_protocol* last = NULL;
|
||||||
@@ -545,8 +559,7 @@ get_domain_datalink_protocols(Interface* interface, net_domain* domain)
|
|||||||
chain->infos[i])->init_protocol(interface, domain, &protocol);
|
chain->infos[i])->init_protocol(interface, domain, &protocol);
|
||||||
if (status != B_OK) {
|
if (status != B_OK) {
|
||||||
// free protocols we already initialized
|
// free protocols we already initialized
|
||||||
uninit_domain_datalink_protocols(
|
uninit_domain_datalink_protocols(datalink);
|
||||||
interface->DomainDatalink(domain->family));
|
|
||||||
chain->Release();
|
chain->Release();
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -557,9 +570,6 @@ get_domain_datalink_protocols(Interface* interface, net_domain* domain)
|
|||||||
protocol->next = NULL;
|
protocol->next = NULL;
|
||||||
|
|
||||||
if (last == NULL) {
|
if (last == NULL) {
|
||||||
domain_datalink* datalink
|
|
||||||
= interface->DomainDatalink(domain->family);
|
|
||||||
|
|
||||||
datalink->first_protocol = protocol;
|
datalink->first_protocol = protocol;
|
||||||
datalink->first_info = protocol->module;
|
datalink->first_info = protocol->module;
|
||||||
} else
|
} else
|
||||||
@@ -575,6 +585,9 @@ get_domain_datalink_protocols(Interface* interface, net_domain* domain)
|
|||||||
status_t
|
status_t
|
||||||
put_domain_datalink_protocols(Interface* interface, net_domain* domain)
|
put_domain_datalink_protocols(Interface* interface, net_domain* domain)
|
||||||
{
|
{
|
||||||
|
TRACE(("%s(interface %p, domain %d)\n", __FUNCTION__, interface,
|
||||||
|
domain->family));
|
||||||
|
|
||||||
struct chain* chain;
|
struct chain* chain;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user