xref: /f-stack/app/micro_thread/ff_hook.cpp (revision a9643ea8)
1*a9643ea8Slogwang 
2*a9643ea8Slogwang /**
3*a9643ea8Slogwang  * Tencent is pleased to support the open source community by making MSEC available.
4*a9643ea8Slogwang  *
5*a9643ea8Slogwang  * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
6*a9643ea8Slogwang  *
7*a9643ea8Slogwang  * Licensed under the GNU General Public License, Version 2.0 (the "License");
8*a9643ea8Slogwang  * you may not use this file except in compliance with the License. You may
9*a9643ea8Slogwang  * obtain a copy of the License at
10*a9643ea8Slogwang  *
11*a9643ea8Slogwang  *     https://opensource.org/licenses/GPL-2.0
12*a9643ea8Slogwang  *
13*a9643ea8Slogwang  * Unless required by applicable law or agreed to in writing, software distributed under the
14*a9643ea8Slogwang  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
15*a9643ea8Slogwang  * either express or implied. See the License for the specific language governing permissions
16*a9643ea8Slogwang  * and limitations under the License.
17*a9643ea8Slogwang  */
18*a9643ea8Slogwang 
19*a9643ea8Slogwang 
20*a9643ea8Slogwang #include <stdio.h>
21*a9643ea8Slogwang #include <stdlib.h>
22*a9643ea8Slogwang #include <stdint.h>
23*a9643ea8Slogwang #include <sched.h>
24*a9643ea8Slogwang #include <unistd.h>
25*a9643ea8Slogwang #include <pthread.h>
26*a9643ea8Slogwang #include <errno.h>
27*a9643ea8Slogwang #include <assert.h>
28*a9643ea8Slogwang #include <sys/types.h>
29*a9643ea8Slogwang #include <sys/stat.h>
30*a9643ea8Slogwang #include <sys/ioctl.h>
31*a9643ea8Slogwang #include <fcntl.h>
32*a9643ea8Slogwang #include <stdarg.h>
33*a9643ea8Slogwang #include "ff_api.h"
34*a9643ea8Slogwang #include "mt_sys_hook.h"
35*a9643ea8Slogwang #include "ff_hook.h"
36*a9643ea8Slogwang 
37*a9643ea8Slogwang 
38*a9643ea8Slogwang 
39*a9643ea8Slogwang 
40*a9643ea8Slogwang /*
41*a9643ea8Slogwang void ff_hook_new_fd(int fd)
42*a9643ea8Slogwang {
43*a9643ea8Slogwang 	if (fd < 0 || fd >= ff_HOOK_MAX_FD) {
44*a9643ea8Slogwang 		return;
45*a9643ea8Slogwang 	}
46*a9643ea8Slogwang 	g_ff_hook_fd_tab[fd] = 1;
47*a9643ea8Slogwang }
48*a9643ea8Slogwang 
49*a9643ea8Slogwang bool ff_hook_find_fd(int fd) {
50*a9643ea8Slogwang 	if (fd < 0 || fd >= ff_HOOK_MAX_FD) {
51*a9643ea8Slogwang 		return false;
52*a9643ea8Slogwang 	}
53*a9643ea8Slogwang 
54*a9643ea8Slogwang 	if (g_ff_hook_fd_tab[fd] == 1) {
55*a9643ea8Slogwang 		return true;
56*a9643ea8Slogwang 	} else {
57*a9643ea8Slogwang 		return false;
58*a9643ea8Slogwang 	}
59*a9643ea8Slogwang }
60*a9643ea8Slogwang 
61*a9643ea8Slogwang void ff_hook_free_fd(int fd)
62*a9643ea8Slogwang {
63*a9643ea8Slogwang 	if (fd < 0 || fd >= ff_HOOK_MAX_FD) {
64*a9643ea8Slogwang 		return;
65*a9643ea8Slogwang 	}
66*a9643ea8Slogwang 	g_ff_hook_fd_tab[fd] = 0;
67*a9643ea8Slogwang }
68*a9643ea8Slogwang */
69*a9643ea8Slogwang 
70*a9643ea8Slogwang int ff_hook_socket(int domain, int type, int protocol)
71*a9643ea8Slogwang {
72*a9643ea8Slogwang     if (!ff_hook_active() ||  (AF_INET != domain) || (SOCK_STREAM != type && SOCK_DGRAM != type)) {
73*a9643ea8Slogwang         return mt_real_func(socket)(domain, type, protocol);
74*a9643ea8Slogwang 	}
75*a9643ea8Slogwang 	int fd = ff_socket(domain, type, protocol);
76*a9643ea8Slogwang 	if (fd >= 0) {
77*a9643ea8Slogwang 		fd |= 1 << FF_FD_BITS;
78*a9643ea8Slogwang 	}
79*a9643ea8Slogwang 	return fd;
80*a9643ea8Slogwang }
81*a9643ea8Slogwang 
82*a9643ea8Slogwang int ff_hook_close(int fd)
83*a9643ea8Slogwang {
84*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
85*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
86*a9643ea8Slogwang 		return ff_close(fd);
87*a9643ea8Slogwang 	} else {
88*a9643ea8Slogwang         return mt_real_func(close)(fd);
89*a9643ea8Slogwang 	}
90*a9643ea8Slogwang }
91*a9643ea8Slogwang 
92*a9643ea8Slogwang int ff_hook_connect(int fd, const struct sockaddr *address, socklen_t addrlen_len)
93*a9643ea8Slogwang {
94*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
95*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
96*a9643ea8Slogwang 		return ff_connect(fd, (struct linux_sockaddr *)address, addrlen_len);
97*a9643ea8Slogwang 	} else {
98*a9643ea8Slogwang         return mt_real_func(connect)(fd, address, addrlen_len);
99*a9643ea8Slogwang 	}
100*a9643ea8Slogwang }
101*a9643ea8Slogwang 
102*a9643ea8Slogwang ssize_t ff_hook_read(int fd, void *buf, size_t nbyte)
103*a9643ea8Slogwang {
104*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
105*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
106*a9643ea8Slogwang 		return ff_read(fd, buf, nbyte);
107*a9643ea8Slogwang 	} else {
108*a9643ea8Slogwang         return mt_real_func(read)(fd, buf, nbyte);
109*a9643ea8Slogwang 	}
110*a9643ea8Slogwang }
111*a9643ea8Slogwang 
112*a9643ea8Slogwang ssize_t ff_hook_write(int fd, const void *buf, size_t nbyte)
113*a9643ea8Slogwang {
114*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
115*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
116*a9643ea8Slogwang 		return ff_write(fd, buf, nbyte);
117*a9643ea8Slogwang 	} else {
118*a9643ea8Slogwang         return mt_real_func(write)(fd, buf, nbyte);
119*a9643ea8Slogwang 	}
120*a9643ea8Slogwang }
121*a9643ea8Slogwang ssize_t ff_hook_sendto(int fd, const void *message, size_t length, int flags,
122*a9643ea8Slogwang                const struct sockaddr *dest_addr, socklen_t dest_len)
123*a9643ea8Slogwang {
124*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
125*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
126*a9643ea8Slogwang         return ff_sendto(fd, message, length, flags, (struct linux_sockaddr *)dest_addr, dest_len);
127*a9643ea8Slogwang 	} else {
128*a9643ea8Slogwang         return mt_real_func(sendto)(fd, message, length, flags, dest_addr, dest_len);
129*a9643ea8Slogwang 	}
130*a9643ea8Slogwang }
131*a9643ea8Slogwang ssize_t ff_hook_recvfrom(int fd, void *buffer, size_t length, int flags,
132*a9643ea8Slogwang                   struct sockaddr *address, socklen_t *address_len)
133*a9643ea8Slogwang {
134*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
135*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
136*a9643ea8Slogwang         return ff_recvfrom(fd, buffer, length, flags, (struct linux_sockaddr *)address, address_len);
137*a9643ea8Slogwang 	} else {
138*a9643ea8Slogwang         return mt_real_func(recvfrom)(fd, buffer, length, flags, address, address_len);
139*a9643ea8Slogwang 	}
140*a9643ea8Slogwang }
141*a9643ea8Slogwang ssize_t ff_hook_recv(int fd, void *buffer, size_t length, int flags)
142*a9643ea8Slogwang {
143*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
144*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
145*a9643ea8Slogwang 		return ff_recv(fd, buffer, length, flags);
146*a9643ea8Slogwang 	} else {
147*a9643ea8Slogwang         return mt_real_func(recv)(fd, buffer, length, flags);
148*a9643ea8Slogwang 	}
149*a9643ea8Slogwang }
150*a9643ea8Slogwang ssize_t ff_hook_send(int fd, const void *buf, size_t nbyte, int flags)
151*a9643ea8Slogwang {
152*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
153*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
154*a9643ea8Slogwang 		return ff_send(fd, buf, nbyte, flags);
155*a9643ea8Slogwang 	} else {
156*a9643ea8Slogwang         return mt_real_func(send)(fd, buf, nbyte, flags);
157*a9643ea8Slogwang 	}
158*a9643ea8Slogwang 
159*a9643ea8Slogwang }
160*a9643ea8Slogwang int ff_hook_setsockopt(int fd, int level, int option_name, const void *option_value, socklen_t option_len)
161*a9643ea8Slogwang {
162*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
163*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
164*a9643ea8Slogwang         return ff_setsockopt(fd, level, option_name, option_value, option_len);
165*a9643ea8Slogwang 	} else {
166*a9643ea8Slogwang         return mt_real_func(setsockopt)(fd, level, option_name, option_value, option_len);
167*a9643ea8Slogwang 	}
168*a9643ea8Slogwang }
169*a9643ea8Slogwang 
170*a9643ea8Slogwang int ff_hook_ioctl(int fd, int cmd, void *arg)
171*a9643ea8Slogwang {
172*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
173*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
174*a9643ea8Slogwang 		return ff_ioctl(fd, cmd, arg);
175*a9643ea8Slogwang 	} else {
176*a9643ea8Slogwang         return mt_real_func(ioctl)(fd, cmd, arg);
177*a9643ea8Slogwang 	}
178*a9643ea8Slogwang }
179*a9643ea8Slogwang 
180*a9643ea8Slogwang int ff_hook_fcntl(int fd, int cmd, void *arg)
181*a9643ea8Slogwang {
182*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
183*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
184*a9643ea8Slogwang 		return ff_fcntl(fd, cmd, arg);
185*a9643ea8Slogwang 	} else {
186*a9643ea8Slogwang         return mt_real_func(fcntl)(fd, cmd, arg);
187*a9643ea8Slogwang 	}
188*a9643ea8Slogwang }
189*a9643ea8Slogwang 
190*a9643ea8Slogwang int ff_hook_listen(int fd, int backlog)
191*a9643ea8Slogwang {
192*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
193*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
194*a9643ea8Slogwang 		return ff_listen(fd, backlog);
195*a9643ea8Slogwang 	} else {
196*a9643ea8Slogwang 		return mt_real_func(listen)(fd, backlog);
197*a9643ea8Slogwang 	}
198*a9643ea8Slogwang }
199*a9643ea8Slogwang 
200*a9643ea8Slogwang int ff_hook_bind(int fd, const struct sockaddr *addr, socklen_t addrlen)
201*a9643ea8Slogwang {
202*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
203*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
204*a9643ea8Slogwang 		return ff_bind(fd, (struct linux_sockaddr *)addr, addrlen);
205*a9643ea8Slogwang 	} else {
206*a9643ea8Slogwang 		return mt_real_func(bind)(fd, addr, addrlen);
207*a9643ea8Slogwang 	}
208*a9643ea8Slogwang }
209*a9643ea8Slogwang int ff_hook_accept(int fd, struct sockaddr *addr, socklen_t *addrlen)
210*a9643ea8Slogwang {
211*a9643ea8Slogwang 	if (CHK_FD_BIT(fd)) {
212*a9643ea8Slogwang 		fd = CLR_FD_BIT(fd);
213*a9643ea8Slogwang 		int c = ff_accept(fd, (struct linux_sockaddr *)addr, addrlen);
214*a9643ea8Slogwang 		if (c < 0) {
215*a9643ea8Slogwang 			return c;
216*a9643ea8Slogwang 		}
217*a9643ea8Slogwang 		c |= 1 << FF_FD_BITS;
218*a9643ea8Slogwang 		return c;
219*a9643ea8Slogwang 	} else {
220*a9643ea8Slogwang 		return mt_real_func(accept)(fd, addr, addrlen);
221*a9643ea8Slogwang 	}
222*a9643ea8Slogwang }
223