-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathpriv_sock.c
executable file
·169 lines (145 loc) · 3.51 KB
/
priv_sock.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include "priv_sock.h"
#include "common.h"
#include "sysutil.h"
#include "trans_ctrl.h"
void priv_sock_init(Session_t *sess)
{
int fds[2];
if(socketpair(PF_UNIX, SOCK_STREAM, 0, fds) == -1)
ERR_EXIT("socketpair");
sess->nobody_fd = fds[0];
sess->proto_fd = fds[1];
}
void priv_sock_close(Session_t *sess)
{
if(sess->nobody_fd != -1)
{
close(sess->nobody_fd);
sess->nobody_fd = -1;
}
if(sess->proto_fd != -1)
{
close(sess->proto_fd);
sess->proto_fd = -1;
}
}
void priv_sock_set_nobody_context(Session_t *sess)
{
close(sess->peer_fd); //关闭控制连接
if(sess->proto_fd != -1)
{
close(sess->proto_fd);
sess->proto_fd = -1;
}
}
void priv_sock_set_proto_context(Session_t *sess)
{
if(sess->nobody_fd != -1)
{
close(sess->nobody_fd);
sess->nobody_fd = -1;
}
setup_signal_alarm_ctrl_fd(); //安装定时器
setup_signal_sigurg(); //安装定时器
activate_oobinline(sess->peer_fd); //开启带外数据
activate_signal_sigurg(sess->peer_fd); //开启sigurg信号
}
void priv_sock_send_cmd(int fd, char cmd)
{
int ret = writen(fd, &cmd, sizeof cmd);
if(ret != sizeof(cmd))
{
fprintf(stderr, "priv_sock_send_cmd error\n");
exit(EXIT_FAILURE);
}
}
char priv_sock_recv_cmd(int fd)
{
char res;
int ret = readn(fd, &res, sizeof res);
//子进程关闭
if(ret == 0)
{
printf("Proto close!\n");
exit(EXIT_SUCCESS);
}
if(ret != sizeof(res))
{
fprintf(stderr, "priv_sock_recv_cmd error\n");
exit(EXIT_FAILURE);
}
return res;
}
void priv_sock_send_result(int fd, char res)
{
int ret = writen(fd, &res, sizeof res);
if(ret != sizeof(res))
{
fprintf(stderr, "priv_sock_send_result\n");
exit(EXIT_FAILURE);
}
}
char priv_sock_recv_result(int fd)
{
char res;
int ret = readn(fd, &res, sizeof res);
if(ret != sizeof(res))
{
fprintf(stderr, "priv_sock_recv_result error\n");
exit(EXIT_FAILURE);
}
return res;
}
void priv_sock_send_int(int fd, int the_int)
{
int ret = writen(fd, &the_int, sizeof(int));
if(ret != sizeof(the_int))
{
fprintf(stderr, "priv_sock_send_int error\n");
exit(EXIT_FAILURE);
}
}
int priv_sock_recv_int(int fd)
{
int res;
int ret = readn(fd, &res, sizeof(res));
if(ret != sizeof(res))
{
fprintf(stderr, "priv_sock_recv_int error\n");
exit(EXIT_FAILURE);
}
return res;
}
void priv_sock_send_str(int fd, const char *buf, unsigned int len)
{
priv_sock_send_int(fd, (int)len);
int ret = writen(fd, buf, len);
if(ret != (int)len)
{
fprintf(stderr, "priv_sock_send_str error\n");
exit(EXIT_FAILURE);
}
}
void priv_sock_recv_str(int fd, char *buf, unsigned int len)
{
unsigned int recv_len = (unsigned int)priv_sock_recv_int(fd);
if (recv_len > len)
{
fprintf(stderr, "priv_sock_recv_str error\n");
exit(EXIT_FAILURE);
}
int ret = readn(fd, buf, recv_len);
if (ret != (int)recv_len)
{
fprintf(stderr, "priv_sock_recv_str error\n");
exit(EXIT_FAILURE);
}
}
void priv_sock_send_fd(int sock_fd, int fd)
{
send_fd(sock_fd, fd);
}
int priv_sock_recv_fd(int sock_fd)
{
return recv_fd(sock_fd);
}