mirror of
https://gitlab.com/openconnect/ocserv.git
synced 2026-10-12 01:26:48 +08:00
small reorganization
This commit is contained in:
@@ -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];
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user