small reorganization

This commit is contained in:
Nikos Mavrogiannopoulos
2013-02-09 19:54:25 +01:00
parent 4ac5d57b40
commit a5257b6167
7 changed files with 138 additions and 136 deletions
+38
View File
@@ -77,6 +77,44 @@ 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)
{
struct iovec iov[2];
uint8_t cmd = CMD_UDP_FD;
struct msghdr hdr;
union {
struct cmsghdr cm;
char control[CMSG_SPACE(sizeof(int))];
} control_un;
struct cmsghdr *cmptr;
memset(&hdr, 0, sizeof(hdr));
iov[0].iov_base = &cmd;
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;
hdr.msg_controllen = sizeof(control_un.control);
cmptr = CMSG_FIRSTHDR(&hdr);
cmptr->cmsg_len = CMSG_LEN(sizeof(int));
cmptr->cmsg_level = SOL_SOCKET;
cmptr->cmsg_type = SCM_RIGHTS;
memcpy(CMSG_DATA(cmptr), &fd, sizeof(int));
return(sendmsg(proc->fd, &hdr, 0));
}
int handle_commands(main_server_st *s, struct proc_st* proc)
{
struct iovec iov[2];
-36
View File
@@ -63,42 +63,6 @@ int send_resume_fetch_reply(main_server_st* s, struct proc_st * proc,
return(sendmsg(proc->fd, &hdr, 0));
}
int send_udp_fd(main_server_st* s, struct proc_st * proc,
void* cli_addr, socklen_t cli_addr_size, int fd)
{
struct iovec iov[2];
uint8_t cmd = CMD_UDP_FD;
struct msghdr hdr;
union {
struct cmsghdr cm;
char control[CMSG_SPACE(sizeof(int))];
} control_un;
struct cmsghdr *cmptr;
memset(&hdr, 0, sizeof(hdr));
iov[0].iov_base = &cmd;
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;
hdr.msg_controllen = sizeof(control_un.control);
cmptr = CMSG_FIRSTHDR(&hdr);
cmptr->cmsg_len = CMSG_LEN(sizeof(int));
cmptr->cmsg_level = SOL_SOCKET;
cmptr->cmsg_type = SCM_RIGHTS;
memcpy(CMSG_DATA(cmptr), &fd, sizeof(int));
return(sendmsg(proc->fd, &hdr, 0));
}
int handle_resume_delete_req(main_server_st* s, struct proc_st * proc,
const struct cmd_resume_fetch_req_st * req)
{
+1 -1
View File
@@ -2,7 +2,7 @@
*
* DO NOT EDIT THIS FILE (ocserv-args.c)
*
* It has been AutoGen-ed February 8, 2013 at 09:35:09 PM by AutoGen 5.16
* It has been AutoGen-ed February 9, 2013 at 07:49:10 PM by AutoGen 5.16
* From the definitions ocserv-args.def
* and the template file options
*
+1 -1
View File
@@ -2,7 +2,7 @@
*
* DO NOT EDIT THIS FILE (ocserv-args.h)
*
* It has been AutoGen-ed February 8, 2013 at 09:35:09 PM by AutoGen 5.16
* It has been AutoGen-ed February 9, 2013 at 07:49:10 PM by AutoGen 5.16
* From the definitions ocserv-args.def
* and the template file options
*
+97
View File
@@ -61,3 +61,100 @@ int send_tun_mtu(worker_st *ws, unsigned int mtu)
return(sendmsg(ws->cmd_fd, &hdr, 0));
}
int handle_worker_commands(struct worker_st *ws)
{
struct iovec iov[2];
uint8_t cmd;
struct msghdr hdr;
union {
char x[32];
struct sockaddr_storage ss;
} cmd_data;
union {
struct cmsghdr cm;
char control[CMSG_SPACE(sizeof(int))];
} control_un;
struct cmsghdr *cmptr;
int ret, e;
int cmd_data_len;
memset(&cmd_data, 0, sizeof(cmd_data));
iov[0].iov_base = &cmd;
iov[0].iov_len = 1;
iov[1].iov_base = &cmd_data;
iov[1].iov_len = sizeof(cmd_data);
memset(&hdr, 0, sizeof(hdr));
hdr.msg_iov = iov;
hdr.msg_iovlen = 2;
hdr.msg_control = control_un.control;
hdr.msg_controllen = sizeof(control_un.control);
ret = recvmsg( ws->cmd_fd, &hdr, 0);
if (ret == -1) {
oclog(ws, LOG_ERR, "cannot obtain data from command socket");
exit(1);
}
if (ret == 0) {
exit(1);
}
cmd_data_len = ret - 1;
switch(cmd) {
case CMD_TERMINATE:
exit(0);
case CMD_UDP_FD:
if (ws->udp_state != UP_WAIT_FD) {
oclog(ws, LOG_ERR, "didn't expect a UDP fd!");
goto fatal_error;
}
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;
}
ws->udp_state = UP_SETUP;
oclog(ws, LOG_DEBUG, "received UDP fd and connected to peer");
return 0;
} else {
oclog(ws, LOG_ERR, "Could not receive peer's UDP fd");
return -1;
}
break;
default:
oclog(ws, LOG_ERR, "unknown CMD 0x%x", (unsigned)cmd);
exit(1);
}
return 0;
fatal_error:
closelog();
exit(1);
udp_fd_fail:
ws->udp_state = UP_DISABLED;
close(ws->udp_fd);
ws->udp_fd = -1;
return -1;
}
-98
View File
@@ -58,7 +58,6 @@
#define MAX_HTTP_REQUESTS 8
static int terminate = 0;
static int handle_worker_commands(struct worker_st *ws);
static int parse_cstp_data(struct worker_st* ws, uint8_t* buf, size_t buf_size);
static int parse_dtls_data(struct worker_st* ws,
uint8_t* buf, size_t buf_size);
@@ -926,103 +925,6 @@ send_error:
exit(1);
}
static
int handle_worker_commands(struct worker_st *ws)
{
struct iovec iov[2];
uint8_t cmd;
struct msghdr hdr;
union {
char x[32];
struct sockaddr_storage ss;
} cmd_data;
union {
struct cmsghdr cm;
char control[CMSG_SPACE(sizeof(int))];
} control_un;
struct cmsghdr *cmptr;
int ret, e;
int cmd_data_len;
memset(&cmd_data, 0, sizeof(cmd_data));
iov[0].iov_base = &cmd;
iov[0].iov_len = 1;
iov[1].iov_base = &cmd_data;
iov[1].iov_len = sizeof(cmd_data);
memset(&hdr, 0, sizeof(hdr));
hdr.msg_iov = iov;
hdr.msg_iovlen = 2;
hdr.msg_control = control_un.control;
hdr.msg_controllen = sizeof(control_un.control);
ret = recvmsg( ws->cmd_fd, &hdr, 0);
if (ret == -1) {
oclog(ws, LOG_ERR, "cannot obtain data from command socket");
exit(1);
}
if (ret == 0) {
exit(1);
}
cmd_data_len = ret - 1;
switch(cmd) {
case CMD_TERMINATE:
exit(0);
case CMD_UDP_FD:
if (ws->udp_state != UP_WAIT_FD) {
oclog(ws, LOG_ERR, "didn't expect a UDP fd!");
goto fatal_error;
}
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;
}
ws->udp_state = UP_SETUP;
oclog(ws, LOG_ERR, "received UDP fd and connected to peer");
return 0;
} else {
oclog(ws, LOG_ERR, "Could not receive peer's UDP fd");
return -1;
}
break;
default:
oclog(ws, LOG_ERR, "unknown CMD 0x%x", (unsigned)cmd);
exit(1);
}
return 0;
fatal_error:
closelog();
exit(1);
udp_fd_fail:
ws->udp_state = UP_DISABLED;
close(ws->udp_fd);
ws->udp_fd = -1;
return -1;
}
static int parse_data(struct worker_st* ws,
gnutls_session_t ts, /* the interface of recv */
+1
View File
@@ -98,5 +98,6 @@ int get_rt_vpn_info(worker_st * ws,
ssize_t tun_write(int sockfd, const void *buf, size_t len);
int send_tun_mtu(worker_st *ws, unsigned int mtu);
int handle_worker_commands(struct worker_st *ws);
#endif