svn commit: samba r4753 - in branches/SAMBA_4_0/source/lib/socket: .
tridge at samba.org
tridge at samba.org
Sat Jan 15 10:28:08 GMT 2005
Author: tridge
Date: 2005-01-15 10:28:08 +0000 (Sat, 15 Jan 2005)
New Revision: 4753
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=4753
Log:
added the ability for the generic socket library to handle async
connect(). This required a small API change (the addition of
a socket_connect_complete() method)
Modified:
branches/SAMBA_4_0/source/lib/socket/socket.c
branches/SAMBA_4_0/source/lib/socket/socket.h
branches/SAMBA_4_0/source/lib/socket/socket_ipv4.c
branches/SAMBA_4_0/source/lib/socket/socket_ipv6.c
branches/SAMBA_4_0/source/lib/socket/socket_unix.c
Changeset:
Modified: branches/SAMBA_4_0/source/lib/socket/socket.c
===================================================================
--- branches/SAMBA_4_0/source/lib/socket/socket.c 2005-01-15 09:30:54 UTC (rev 4752)
+++ branches/SAMBA_4_0/source/lib/socket/socket.c 2005-01-15 10:28:08 UTC (rev 4753)
@@ -107,6 +107,14 @@
return sock->ops->fn_connect(sock, my_address, my_port, server_address, server_port, flags);
}
+NTSTATUS socket_connect_complete(struct socket_context *sock, uint32_t flags)
+{
+ if (!sock->ops->fn_connect_complete) {
+ return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ return sock->ops->fn_connect_complete(sock, flags);
+}
+
NTSTATUS socket_listen(struct socket_context *sock, const char *my_address, int port, int queue_size, uint32_t flags)
{
if (sock->type != SOCKET_TYPE_STREAM) {
Modified: branches/SAMBA_4_0/source/lib/socket/socket.h
===================================================================
--- branches/SAMBA_4_0/source/lib/socket/socket.h 2005-01-15 09:30:54 UTC (rev 4752)
+++ branches/SAMBA_4_0/source/lib/socket/socket.h 2005-01-15 10:28:08 UTC (rev 4753)
@@ -39,6 +39,10 @@
const char *server_address, int server_port,
uint32_t flags);
+ /* complete a non-blocking connect */
+ NTSTATUS (*fn_connect_complete)(struct socket_context *sock,
+ uint32_t flags);
+
/* server ops */
NTSTATUS (*fn_listen)(struct socket_context *sock,
const char *my_address, int port, int queue_size, uint32_t flags);
Modified: branches/SAMBA_4_0/source/lib/socket/socket_ipv4.c
===================================================================
--- branches/SAMBA_4_0/source/lib/socket/socket_ipv4.c 2005-01-15 09:30:54 UTC (rev 4752)
+++ branches/SAMBA_4_0/source/lib/socket/socket_ipv4.c 2005-01-15 10:28:08 UTC (rev 4753)
@@ -1,7 +1,10 @@
/*
Unix SMB/CIFS implementation.
+
Socket IPv4 functions
+
Copyright (C) Stefan Metzmacher 2004
+ Copyright (C) Andrew Tridgell 2004-2005
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -36,6 +39,34 @@
close(sock->fd);
}
+static NTSTATUS ipv4_tcp_connect_complete(struct socket_context *sock, uint32_t flags)
+{
+ int error=0, ret;
+ socklen_t len = sizeof(error);
+
+ /* check for any errors that may have occurred - this is needed
+ for non-blocking connect */
+ ret = getsockopt(sock->fd, SOL_SOCKET, SO_ERROR, &error, &len);
+ if (ret == -1) {
+ return map_nt_error_from_unix(errno);
+ }
+ if (error != 0) {
+ return map_nt_error_from_unix(error);
+ }
+
+ if (!(flags & SOCKET_FLAG_BLOCK)) {
+ ret = set_blocking(sock->fd, False);
+ if (ret == -1) {
+ return map_nt_error_from_unix(errno);
+ }
+ }
+
+ sock->state = SOCKET_STATE_CLIENT_CONNECTED;
+
+ return NT_STATUS_OK;
+}
+
+
static NTSTATUS ipv4_tcp_connect(struct socket_context *sock,
const char *my_address, int my_port,
const char *srv_address, int srv_port,
@@ -79,18 +110,10 @@
return map_nt_error_from_unix(errno);
}
- if (!(flags & SOCKET_FLAG_BLOCK)) {
- ret = set_blocking(sock->fd, False);
- if (ret == -1) {
- return map_nt_error_from_unix(errno);
- }
- }
+ return ipv4_tcp_connect_complete(sock, flags);
+}
- sock->state = SOCKET_STATE_CLIENT_CONNECTED;
- return NT_STATUS_OK;
-}
-
static NTSTATUS ipv4_tcp_listen(struct socket_context *sock,
const char *my_address, int port,
int queue_size, uint32_t flags)
@@ -315,6 +338,7 @@
.fn_init = ipv4_tcp_init,
.fn_connect = ipv4_tcp_connect,
+ .fn_connect_complete = ipv4_tcp_connect_complete,
.fn_listen = ipv4_tcp_listen,
.fn_accept = ipv4_tcp_accept,
.fn_recv = ipv4_tcp_recv,
Modified: branches/SAMBA_4_0/source/lib/socket/socket_ipv6.c
===================================================================
--- branches/SAMBA_4_0/source/lib/socket/socket_ipv6.c 2005-01-15 09:30:54 UTC (rev 4752)
+++ branches/SAMBA_4_0/source/lib/socket/socket_ipv6.c 2005-01-15 10:28:08 UTC (rev 4753)
@@ -50,6 +50,33 @@
close(sock->fd);
}
+static NTSTATUS ipv6_tcp_connect_complete(struct socket_context *sock, uint32_t flags)
+{
+ int error=0, ret;
+ socklen_t len = sizeof(error);
+
+ /* check for any errors that may have occurred - this is needed
+ for non-blocking connect */
+ ret = getsockopt(sock->fd, SOL_SOCKET, SO_ERROR, &error, &len);
+ if (ret == -1) {
+ return map_nt_error_from_unix(errno);
+ }
+ if (error != 0) {
+ return map_nt_error_from_unix(error);
+ }
+
+ if (!(flags & SOCKET_FLAG_BLOCK)) {
+ ret = set_blocking(sock->fd, False);
+ if (ret == -1) {
+ return map_nt_error_from_unix(errno);
+ }
+ }
+
+ sock->state = SOCKET_STATE_CLIENT_CONNECTED;
+
+ return NT_STATUS_OK;
+}
+
static NTSTATUS ipv6_tcp_connect(struct socket_context *sock,
const char *my_address, int my_port,
const char *srv_address, int srv_port,
@@ -87,16 +114,7 @@
return map_nt_error_from_unix(errno);
}
- if (!(flags & SOCKET_FLAG_BLOCK)) {
- ret = set_blocking(sock->fd, False);
- if (ret == -1) {
- return map_nt_error_from_unix(errno);
- }
- }
-
- sock->state = SOCKET_STATE_CLIENT_CONNECTED;
-
- return NT_STATUS_OK;
+ return ipv6_tcp_connect_complete(sock, flags);
}
static NTSTATUS ipv6_tcp_listen(struct socket_context *sock,
@@ -333,6 +351,7 @@
.fn_init = ipv6_tcp_init,
.fn_connect = ipv6_tcp_connect,
+ .fn_connect_complete = ipv6_tcp_connect_complete,
.fn_listen = ipv6_tcp_listen,
.fn_accept = ipv6_tcp_accept,
.fn_recv = ipv6_tcp_recv,
Modified: branches/SAMBA_4_0/source/lib/socket/socket_unix.c
===================================================================
--- branches/SAMBA_4_0/source/lib/socket/socket_unix.c 2005-01-15 09:30:54 UTC (rev 4752)
+++ branches/SAMBA_4_0/source/lib/socket/socket_unix.c 2005-01-15 10:28:08 UTC (rev 4753)
@@ -50,6 +50,33 @@
close(sock->fd);
}
+static NTSTATUS unixdom_connect_complete(struct socket_context *sock, uint32_t flags)
+{
+ int error=0, ret;
+ socklen_t len = sizeof(error);
+
+ /* check for any errors that may have occurred - this is needed
+ for non-blocking connect */
+ ret = getsockopt(sock->fd, SOL_SOCKET, SO_ERROR, &error, &len);
+ if (ret == -1) {
+ return map_nt_error_from_unix(errno);
+ }
+ if (error != 0) {
+ return map_nt_error_from_unix(error);
+ }
+
+ if (!(flags & SOCKET_FLAG_BLOCK)) {
+ ret = set_blocking(sock->fd, False);
+ if (ret == -1) {
+ return map_nt_error_from_unix(errno);
+ }
+ }
+
+ sock->state = SOCKET_STATE_CLIENT_CONNECTED;
+
+ return NT_STATUS_OK;
+}
+
static NTSTATUS unixdom_connect(struct socket_context *sock,
const char *my_address, int my_port,
const char *srv_address, int srv_port,
@@ -66,21 +93,12 @@
srv_addr.sun_family = AF_UNIX;
strncpy(srv_addr.sun_path, srv_address, sizeof(srv_addr.sun_path));
- if (!(flags & SOCKET_FLAG_BLOCK)) {
- ret = set_blocking(sock->fd, False);
- if (ret == -1) {
- return NT_STATUS_INVALID_PARAMETER;
- }
- }
-
ret = connect(sock->fd, (const struct sockaddr *)&srv_addr, sizeof(srv_addr));
if (ret == -1) {
return unixdom_error(errno);
}
- sock->state = SOCKET_STATE_CLIENT_CONNECTED;
-
- return NT_STATUS_OK;
+ return unixdom_connect_complete(sock, flags);
}
static NTSTATUS unixdom_listen(struct socket_context *sock,
@@ -252,6 +270,7 @@
.fn_init = unixdom_init,
.fn_connect = unixdom_connect,
+ .fn_connect_complete = unixdom_connect_complete,
.fn_listen = unixdom_listen,
.fn_accept = unixdom_accept,
.fn_recv = unixdom_recv,
More information about the samba-cvs
mailing list