Пример #1
0
status_t
add_interface(const char* name, net_domain_private* domain,
	const ifaliasreq& request, net_device_interface* deviceInterface)
{
	RecursiveLocker locker(sLock);

	if (find_interface(name) != NULL)
		return B_NAME_IN_USE;

	Interface* interface
		= new(std::nothrow) Interface(name, deviceInterface);
	if (interface == NULL)
		return B_NO_MEMORY;

	sInterfaces.Add(interface);
	interface->AcquireReference();
		// We need another reference to be able to use the interface without
		// holding sLock.

	locker.Unlock();

	status_t status = add_interface_address(interface, domain, request);
	if (status == B_OK)
		notify_interface_added(interface);
	else {
		locker.Lock();
		sInterfaces.Remove(interface);
		locker.Unlock();
		interface->ReleaseReference();
	}

	interface->ReleaseReference();

	return status;
}
Пример #2
0
Interface*
get_interface(net_domain* domain, const char* name)
{
	RecursiveLocker locker(sLock);

	Interface* interface = find_interface(name);
	if (interface == NULL || interface->IsBusy())
		return NULL;

	if (interface->CreateDomainDatalinkIfNeeded(domain) != B_OK)
		return NULL;

	interface->AcquireReference();
	return interface;
}
Пример #3
0
Interface*
get_interface(net_domain* domain, uint32 index)
{
	RecursiveLocker locker(sLock);

	Interface* interface;
	if (index == 0)
		interface = sInterfaces.First();
	else
		interface = find_interface(index);
	if (interface == NULL || interface->IsBusy())
		return NULL;

	if (interface->CreateDomainDatalinkIfNeeded(domain) != B_OK)
		return NULL;

	interface->AcquireReference();
	return interface;
}