diff --git a/headers/private/net/net_socket.h b/headers/private/net/net_socket.h index f981316cae..314a3eccc5 100644 --- a/headers/private/net/net_socket.h +++ b/headers/private/net/net_socket.h @@ -51,7 +51,7 @@ typedef struct net_socket { struct net_socket_module_info { struct module_info info; - status_t (*socket)(int family, int type, int protocol, net_socket **_socket); + status_t (*open_socket)(int family, int type, int protocol, net_socket **_socket); status_t (*close)(net_socket *socket); status_t (*free)(net_socket *socket); diff --git a/src/add-ons/kernel/drivers/network/stack/kernel_stack.cpp b/src/add-ons/kernel/drivers/network/stack/kernel_stack.cpp index 2ba9e14ab4..3541757a8e 100644 --- a/src/add-ons/kernel/drivers/network/stack/kernel_stack.cpp +++ b/src/add-ons/kernel/drivers/network/stack/kernel_stack.cpp @@ -409,7 +409,8 @@ net_stack_control(void *_cookie, uint32 op, void *data, size_t length) if (status < B_OK) return status; - return sSocket->socket(args.family, args.type, args.protocol, &cookie->socket); + return sSocket->open_socket(args.family, args.type, + args.protocol, &cookie->socket); } case NET_STACK_GET_COOKIE: diff --git a/src/add-ons/kernel/network/stack/net_socket.cpp b/src/add-ons/kernel/network/stack/net_socket.cpp index 1f0b012f58..614c24ed3b 100644 --- a/src/add-ons/kernel/network/stack/net_socket.cpp +++ b/src/add-ons/kernel/network/stack/net_socket.cpp @@ -25,8 +25,8 @@ void socket_delete(net_socket *socket); -status_t -socket_create(int family, int type, int protocol, net_socket **_socket) +static status_t +create_socket(int family, int type, int protocol, net_socket **_socket) { struct net_socket *socket = new (std::nothrow) net_socket; if (socket == NULL) @@ -55,15 +55,9 @@ socket_create(int family, int type, int protocol, net_socket **_socket) if (status < B_OK) goto err2; - status = socket->first_info->open(socket->first_protocol); - if (status < B_OK) - goto err3; - *_socket = socket; return B_OK; -err3: - put_domain_protocols(socket); err2: benaphore_destroy(&socket->lock); err1: @@ -72,6 +66,28 @@ err1: } +// #pragma mark - + + +status_t +socket_open(int family, int type, int protocol, net_socket **_socket) +{ + net_socket *socket; + status_t status = create_socket(family, type, protocol, &socket); + if (status < B_OK) + return status; + + status = socket->first_info->open(socket->first_protocol); + if (status < B_OK) { + socket_delete(socket); + return status; + } + + *_socket = socket; + return B_OK; +} + + status_t socket_close(net_socket *socket) { @@ -200,7 +216,7 @@ socket_spawn_pending(net_socket *parent, net_socket **_socket) return ENOBUFS; net_socket *socket; - status_t status = socket_create(parent->family, parent->type, parent->protocol, &socket); + status_t status = create_socket(parent->family, parent->type, parent->protocol, &socket); if (status < B_OK) return status; @@ -797,7 +813,7 @@ net_socket_module_info gNetSocketModule = { 0, socket_std_ops }, - socket_create, + socket_open, socket_close, socket_free,