summaryrefslogtreecommitdiff
path: root/source4/lib/socket/socket_unix.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-01-15 10:28:08 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:08:50 -0500
commit21aafc3536cb8a172805f0dd5d23b100f1ecb493 (patch)
treea43565bc8dbf36083cb8067458e4cf153902313b /source4/lib/socket/socket_unix.c
parentf4e29ae1e9ad43f7cbc323d45590bafc94153da2 (diff)
downloadsamba-21aafc3536cb8a172805f0dd5d23b100f1ecb493.tar.gz
samba-21aafc3536cb8a172805f0dd5d23b100f1ecb493.tar.bz2
samba-21aafc3536cb8a172805f0dd5d23b100f1ecb493.zip
r4753: 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) (This used to be commit b787dd166f5cca82b3710802eefb41e0a8851fc3)
Diffstat (limited to 'source4/lib/socket/socket_unix.c')
-rw-r--r--source4/lib/socket/socket_unix.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/source4/lib/socket/socket_unix.c b/source4/lib/socket/socket_unix.c
index e35453e6e0..60a4b9ec48 100644
--- a/source4/lib/socket/socket_unix.c
+++ b/source4/lib/socket/socket_unix.c
@@ -50,6 +50,33 @@ static void unixdom_close(struct socket_context *sock)
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 @@ static NTSTATUS unixdom_connect(struct socket_context *sock,
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 @@ static const struct socket_ops unixdom_ops = {
.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,