Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 90728
b: refs/heads/master
c: b89741a
h: refs/heads/master
v: v3
  • Loading branch information
Allan Stephens authored and David S. Miller committed Apr 15, 2008
1 parent a457a38 commit d7d2c87
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 72 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 4934c69a384ede7d0c3009098184554da2063de6
refs/heads/master: b89741a0cc162511b4341c07e17e1bd4c8b4621d
143 changes: 72 additions & 71 deletions trunk/net/tipc/socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -1248,77 +1248,78 @@ static void wakeupdispatch(struct tipc_port *tport)
static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
int flags)
{
struct tipc_sock *tsock = tipc_sk(sock->sk);
struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest;
struct msghdr m = {NULL,};
struct sk_buff *buf;
struct tipc_msg *msg;
int res;

/* For now, TIPC does not allow use of connect() with DGRAM or RDM types */

if (sock->state == SS_READY)
return -EOPNOTSUPP;

/* For now, TIPC does not support the non-blocking form of connect() */

if (flags & O_NONBLOCK)
return -EWOULDBLOCK;

/* Issue Posix-compliant error code if socket is in the wrong state */

if (sock->state == SS_LISTENING)
return -EOPNOTSUPP;
if (sock->state == SS_CONNECTING)
return -EALREADY;
if (sock->state != SS_UNCONNECTED)
return -EISCONN;

/*
* Reject connection attempt using multicast address
*
* Note: send_msg() validates the rest of the address fields,
* so there's no need to do it here
*/

if (dst->addrtype == TIPC_ADDR_MCAST)
return -EINVAL;

/* Send a 'SYN-' to destination */

m.msg_name = dest;
m.msg_namelen = destlen;
if ((res = send_msg(NULL, sock, &m, 0)) < 0) {
sock->state = SS_DISCONNECTING;
return res;
}

if (mutex_lock_interruptible(&tsock->lock))
return -ERESTARTSYS;

/* Wait for destination's 'ACK' response */

res = wait_event_interruptible_timeout(*sock->sk->sk_sleep,
skb_queue_len(&sock->sk->sk_receive_queue),
sock->sk->sk_rcvtimeo);
buf = skb_peek(&sock->sk->sk_receive_queue);
if (res > 0) {
msg = buf_msg(buf);
res = auto_connect(sock, tsock, msg);
if (!res) {
if (!msg_data_sz(msg))
advance_queue(tsock);
}
} else {
if (res == 0) {
res = -ETIMEDOUT;
} else
{ /* leave "res" unchanged */ }
sock->state = SS_DISCONNECTING;
}

mutex_unlock(&tsock->lock);
return res;
struct tipc_sock *tsock = tipc_sk(sock->sk);
struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest;
struct msghdr m = {NULL,};
struct sk_buff *buf;
struct tipc_msg *msg;
int res;

/* For now, TIPC does not allow use of connect() with DGRAM/RDM types */

if (sock->state == SS_READY)
return -EOPNOTSUPP;

/* For now, TIPC does not support the non-blocking form of connect() */

if (flags & O_NONBLOCK)
return -EWOULDBLOCK;

/* Issue Posix-compliant error code if socket is in the wrong state */

if (sock->state == SS_LISTENING)
return -EOPNOTSUPP;
if (sock->state == SS_CONNECTING)
return -EALREADY;
if (sock->state != SS_UNCONNECTED)
return -EISCONN;

/*
* Reject connection attempt using multicast address
*
* Note: send_msg() validates the rest of the address fields,
* so there's no need to do it here
*/

if (dst->addrtype == TIPC_ADDR_MCAST)
return -EINVAL;

/* Send a 'SYN-' to destination */

m.msg_name = dest;
m.msg_namelen = destlen;
res = send_msg(NULL, sock, &m, 0);
if (res < 0) {
sock->state = SS_DISCONNECTING;
return res;
}

if (mutex_lock_interruptible(&tsock->lock))
return -ERESTARTSYS;

/* Wait for destination's 'ACK' response */

res = wait_event_interruptible_timeout(*sock->sk->sk_sleep,
skb_queue_len(&sock->sk->sk_receive_queue),
sock->sk->sk_rcvtimeo);
buf = skb_peek(&sock->sk->sk_receive_queue);
if (res > 0) {
msg = buf_msg(buf);
res = auto_connect(sock, tsock, msg);
if (!res) {
if (!msg_data_sz(msg))
advance_queue(tsock);
}
} else {
if (res == 0)
res = -ETIMEDOUT;
else
; /* leave "res" unchanged */
sock->state = SS_DISCONNECTING;
}

mutex_unlock(&tsock->lock);
return res;
}

/**
Expand Down

0 comments on commit d7d2c87

Please sign in to comment.