forked from cooldavid/tsps
-
Notifications
You must be signed in to change notification settings - Fork 0
/
threads.c
105 lines (94 loc) · 2.41 KB
/
threads.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
* TSP Server
*
* A TSP Server implementation that follows RFC5572 as much as possible.
* It is designed to be compatible with FreeNET6 service.
*
* Copyright (C) 2011 Guo-Fu Tseng <cooldavid@cooldavid.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "tsps.h"
#include <pthread.h>
#include <stdio.h>
#include <errno.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
static pthread_t ttun;
static pthread_t tsock;
void *thread_tun(void *arg)
{
while (1) {
dbg_thread("Waiting for tun input");
sleep_on_tun_empty(SLEEP_GAP);
while (!queue_tun_isempty()) {
dbg_thread("Processing tun input");
dequeue_tun();
}
do_keepalive();
}
return NULL;
}
void *thread_sock(void *arg)
{
while (1) {
dbg_thread("Waiting for sock input");
sleep_on_sock_empty(SLEEP_GAP);
while (!queue_sock_isempty()) {
dbg_thread("Processing sock input");
dequeue_sock();
}
}
return NULL;
}
int create_threads(void)
{
if (pthread_create(&ttun, NULL, thread_tun, NULL)) {
tspslog(LOG_ERR, "Failed to create TUN process thread: %s",
strerror(errno));
return -1;
}
if (pthread_create(&tsock, NULL, thread_sock, NULL)) {
tspslog(LOG_ERR, "Failed to create socket process thread: %s",
strerror(errno));
return -1;
}
return 0;
}
void main_loop(void)
{
int nfds;
fd_set ofdset, fdset;
FD_ZERO(&ofdset);
FD_SET(server.tunfd, &ofdset);
FD_SET(server.sockfd, &ofdset);
if (server.tunfd > server.sockfd)
nfds = server.tunfd + 1;
else
nfds = server.sockfd + 1;
while (1) {
memcpy(&fdset, &ofdset, sizeof(fd_set));
if (select(nfds, &fdset, NULL, NULL, NULL) < 0) {
perror("Select error");
break;
}
if (FD_ISSET(server.tunfd, &fdset))
enqueue_tun();
if (FD_ISSET(server.sockfd, &fdset))
enqueue_sock();
}
}