1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-11 05:18:09 +03:00

r6562: added support for datagram unix domain sockets in the socket library

This commit is contained in:
Andrew Tridgell 2005-05-01 18:49:43 +00:00 committed by Gerald (Jerry) Carter
parent f244a64ed5
commit 23b2046dcb
2 changed files with 26 additions and 9 deletions

View File

@ -159,7 +159,8 @@ NTSTATUS socket_recv(struct socket_context *sock, void *buf,
size_t wantlen, size_t *nread, uint32_t flags)
{
if (sock->state != SOCKET_STATE_CLIENT_CONNECTED &&
sock->state != SOCKET_STATE_SERVER_CONNECTED) {
sock->state != SOCKET_STATE_SERVER_CONNECTED &&
sock->type != SOCKET_TYPE_DGRAM) {
return NT_STATUS_INVALID_PARAMETER;
}

View File

@ -38,9 +38,22 @@ static NTSTATUS unixdom_error(int ernum)
static NTSTATUS unixdom_init(struct socket_context *sock)
{
sock->fd = socket(PF_UNIX, SOCK_STREAM, 0);
int type;
switch (sock->type) {
case SOCKET_TYPE_STREAM:
type = SOCK_STREAM;
break;
case SOCKET_TYPE_DGRAM:
type = SOCK_DGRAM;
break;
default:
return NT_STATUS_INVALID_PARAMETER;
}
sock->fd = socket(PF_UNIX, type, 0);
if (sock->fd == -1) {
return NT_STATUS_INSUFFICIENT_RESOURCES;
return map_nt_error_from_unix(errno);
}
sock->private_data = NULL;
@ -126,9 +139,11 @@ static NTSTATUS unixdom_listen(struct socket_context *sock,
return unixdom_error(errno);
}
ret = listen(sock->fd, queue_size);
if (ret == -1) {
return unixdom_error(errno);
if (sock->type == SOCKET_TYPE_STREAM) {
ret = listen(sock->fd, queue_size);
if (ret == -1) {
return unixdom_error(errno);
}
}
if (!(flags & SOCKET_FLAG_BLOCK)) {
@ -151,6 +166,10 @@ static NTSTATUS unixdom_accept(struct socket_context *sock,
socklen_t cli_addr_len = sizeof(cli_addr);
int new_fd;
if (sock->type != SOCKET_TYPE_STREAM) {
return NT_STATUS_INVALID_PARAMETER;
}
new_fd = accept(sock->fd, (struct sockaddr *)&cli_addr, &cli_addr_len);
if (new_fd == -1) {
return unixdom_error(errno);
@ -290,8 +309,5 @@ static const struct socket_ops unixdom_ops = {
const struct socket_ops *socket_unixdom_ops(enum socket_type type)
{
if (type != SOCKET_TYPE_STREAM) {
return NULL;
}
return &unixdom_ops;
}