connect occurs before sending the fd to worker.

This commit is contained in:
Nikos Mavrogiannopoulos
2013-02-12 17:22:10 +01:00
parent 217a5e48e2
commit 356da3fbe4
4 changed files with 18 additions and 27 deletions

View File

@@ -77,8 +77,7 @@ fail:
return ret;
}
int send_udp_fd(main_server_st* s, struct proc_st * proc,
void* cli_addr, socklen_t cli_addr_size, int fd)
int send_udp_fd(main_server_st* s, struct proc_st * proc, int fd)
{
struct iovec iov[2];
uint8_t cmd = CMD_UDP_FD;
@@ -95,10 +94,6 @@ int send_udp_fd(main_server_st* s, struct proc_st * proc,
iov[0].iov_len = 1;
hdr.msg_iovlen++;
iov[1].iov_base = cli_addr;
iov[1].iov_len = cli_addr_size;
hdr.msg_iovlen++;
hdr.msg_iov = iov;
hdr.msg_control = control_un.control;

View File

@@ -385,7 +385,7 @@ static void handle_term(int signo)
#define HANDSHAKE_SESSION_ID_POS 46
static int forward_udp_to_owner(main_server_st* s, struct listener_st *listener)
{
int ret;
int ret, e;
struct sockaddr_storage cli_addr;
struct proc_st *ctmp;
socklen_t cli_addr_size;
@@ -431,8 +431,15 @@ int connected = 0;
if (ctmp->udp_fd_received == 0 && session_id_size == ctmp->session_id_size &&
memcmp(session_id, ctmp->session_id, session_id_size) == 0) {
ret = send_udp_fd(s, ctmp, (void*)&cli_addr, cli_addr_size, listener->fd);
ret = connect(listener->fd, (void*)&cli_addr, cli_addr_size);
if (ret == -1) {
e = errno;
mslog(s, ctmp, LOG_ERR, "connect UDP socket: %s", strerror(e));
return -1;
}
ret = send_udp_fd(s, ctmp, listener->fd);
if (ret < 0) {
mslog(s, ctmp, LOG_ERR, "Error passing UDP socket");
return -1;

View File

@@ -81,7 +81,7 @@ void expire_tls_sessions(main_server_st *s);
int send_resume_fetch_reply(main_server_st* s, struct proc_st* proc,
cmd_resume_reply_t r, struct cmd_resume_fetch_reply_st * reply);
int send_udp_fd(main_server_st* s, struct proc_st* proc, void* cli_addr, socklen_t cli_addr_size, int fd);
int send_udp_fd(main_server_st* s, struct proc_st * proc, int fd);
int handle_resume_delete_req(main_server_st* s, struct proc_st* proc,
const struct cmd_resume_fetch_req_st * req);

View File

@@ -76,8 +76,8 @@ int handle_worker_commands(struct worker_st *ws)
char control[CMSG_SPACE(sizeof(int))];
} control_un;
struct cmsghdr *cmptr;
int ret, e;
int cmd_data_len;
int ret;
/*int cmd_data_len;*/
memset(&cmd_data, 0, sizeof(cmd_data));
@@ -104,7 +104,7 @@ int handle_worker_commands(struct worker_st *ws)
exit(1);
}
cmd_data_len = ret - 1;
/*cmd_data_len = ret - 1;*/
switch(cmd) {
case CMD_TERMINATE:
@@ -117,21 +117,10 @@ int handle_worker_commands(struct worker_st *ws)
if ( (cmptr = CMSG_FIRSTHDR(&hdr)) != NULL && cmptr->cmsg_len == CMSG_LEN(sizeof(int))) {
if (cmptr->cmsg_level != SOL_SOCKET)
return -1;
if (cmptr->cmsg_type != SCM_RIGHTS)
return -1;
memcpy(&ws->udp_fd, CMSG_DATA(cmptr), sizeof(int));
if (cmd_data_len > 0) {
ret = connect(ws->udp_fd, (void*)&cmd_data.ss, cmd_data_len);
if (ret == -1) {
e = errno;
oclog(ws, LOG_ERR, "connect(): %s", strerror(e));
goto udp_fd_fail;
}
} else {
oclog(ws, LOG_ERR, "didn't receive peer's UDP address");
goto udp_fd_fail;
}
if (cmptr->cmsg_type != SCM_RIGHTS)
goto udp_fd_fail;
memcpy(&ws->udp_fd, CMSG_DATA(cmptr), sizeof(int));
ws->udp_state = UP_SETUP;
oclog(ws, LOG_DEBUG, "received UDP fd and connected to peer");