xref: /f-stack/app/micro_thread/mt_sys_hook.cpp (revision a02c88d6)
1a9643ea8Slogwang 
2a9643ea8Slogwang /**
3a9643ea8Slogwang  * Tencent is pleased to support the open source community by making MSEC available.
4a9643ea8Slogwang  *
5a9643ea8Slogwang  * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
6a9643ea8Slogwang  *
7a9643ea8Slogwang  * Licensed under the GNU General Public License, Version 2.0 (the "License");
8a9643ea8Slogwang  * you may not use this file except in compliance with the License. You may
9a9643ea8Slogwang  * obtain a copy of the License at
10a9643ea8Slogwang  *
11a9643ea8Slogwang  *     https://opensource.org/licenses/GPL-2.0
12a9643ea8Slogwang  *
13a9643ea8Slogwang  * Unless required by applicable law or agreed to in writing, software distributed under the
14a9643ea8Slogwang  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
15a9643ea8Slogwang  * either express or implied. See the License for the specific language governing permissions
16a9643ea8Slogwang  * and limitations under the License.
17a9643ea8Slogwang  */
18a9643ea8Slogwang 
19a9643ea8Slogwang 
20a9643ea8Slogwang /**
21a9643ea8Slogwang  *  @filename mt_sys_hook.cpp
22a9643ea8Slogwang  *  @info  ΢�߳�hookϵͳapi, �Բ��ö�����������, תͬ��Ϊ�첽��
23a9643ea8Slogwang  *         ֻhook socket��ص�API, HOOK ����, �ο�pth��libcoʵ��
24a9643ea8Slogwang  */
25a9643ea8Slogwang 
26a9643ea8Slogwang #include <stdio.h>
27a9643ea8Slogwang #include <stdlib.h>
28a9643ea8Slogwang #include <stdint.h>
29a9643ea8Slogwang #include <unistd.h>
30a9643ea8Slogwang #include <errno.h>
31a9643ea8Slogwang #include <assert.h>
32a9643ea8Slogwang #include <sys/types.h>
33a9643ea8Slogwang #include <sys/stat.h>
34a9643ea8Slogwang #include <stdarg.h>
35a9643ea8Slogwang 
36a9643ea8Slogwang #include "micro_thread.h"
37a9643ea8Slogwang #include "mt_sys_hook.h"
38a9643ea8Slogwang #include "ff_hook.h"
39a9643ea8Slogwang 
40a9643ea8Slogwang using namespace NS_MICRO_THREAD;
41a9643ea8Slogwang 
42a9643ea8Slogwang 
43a9643ea8Slogwang #define MT_HOOK_MAX_FD      65535*2
44a9643ea8Slogwang #define MT_FD_FLG_INUSE     0x1
45a9643ea8Slogwang #define MT_FD_FLG_UNBLOCK   0x2
46a9643ea8Slogwang 
47a9643ea8Slogwang 
48a9643ea8Slogwang /**
49a9643ea8Slogwang  * @brief ÿsockt����һ������ṹ, ����Ƿ���ҪHOOK, ��ʱʱ���
50a9643ea8Slogwang  */
51a9643ea8Slogwang typedef struct socket_hook_info
52a9643ea8Slogwang {
53a9643ea8Slogwang     int     sock_flag;      // �Ƿ�ʹ��HOOK, �Ƿ��û�����UNBLOCK
54a9643ea8Slogwang     int     read_timeout;   // socket��ȡ��ʱʱ��, ms��λ
55a9643ea8Slogwang     int     write_timeout;  // socketд�볬ʱʱ��, ms��λ
56a9643ea8Slogwang }MtHookFd;
57a9643ea8Slogwang 
58a9643ea8Slogwang MtSyscallFuncTab       g_mt_syscall_tab;            // ȫ�ַ��ű�
59a9643ea8Slogwang int                    g_mt_hook_flag;              // ȫ�ֿ��Ʊ��
60a9643ea8Slogwang int                    g_ff_hook_flag;              // ȫ�ֿ��Ʊ��
61a9643ea8Slogwang static MtHookFd        g_mt_hook_fd_tab[MT_HOOK_MAX_FD];   // ȫ��fd����
62a9643ea8Slogwang 
63a9643ea8Slogwang /**
64a9643ea8Slogwang  * @brief �ڲ��ӿ�, ��ȡhook fd��ص���Ϣ, socket Ĭ��hook, open Ĭ��no hook
65a9643ea8Slogwang  */
66a9643ea8Slogwang MtHookFd* mt_hook_find_fd(int fd)
67a9643ea8Slogwang {
68a9643ea8Slogwang     if ((fd < 0) || (fd >= MT_HOOK_MAX_FD)) {
69a9643ea8Slogwang         return NULL;
70a9643ea8Slogwang     }
71a9643ea8Slogwang 
72a9643ea8Slogwang     MtHookFd* fd_info =  &g_mt_hook_fd_tab[fd];
73a9643ea8Slogwang     if (!(fd_info->sock_flag & MT_FD_FLG_INUSE)) {
74a9643ea8Slogwang         return NULL;
75a9643ea8Slogwang     } else {
76a9643ea8Slogwang         return fd_info;
77a9643ea8Slogwang     }
78a9643ea8Slogwang }
79a9643ea8Slogwang 
80a9643ea8Slogwang /**
81a9643ea8Slogwang  * @brief �ڲ��ӿ�, ����socket����hook, ֻ����socket, �������ļ�IO
82a9643ea8Slogwang  */
83a9643ea8Slogwang void mt_hook_new_fd(int fd)
84a9643ea8Slogwang {
85a9643ea8Slogwang     if ((fd < 0) || (fd >= MT_HOOK_MAX_FD)) {
86a9643ea8Slogwang         return;
87a9643ea8Slogwang     }
88a9643ea8Slogwang 
89a9643ea8Slogwang     MtHookFd* fd_info       = &g_mt_hook_fd_tab[fd];
90a9643ea8Slogwang     fd_info->sock_flag      = MT_FD_FLG_INUSE;
91a9643ea8Slogwang     fd_info->read_timeout   = 500;
92a9643ea8Slogwang     fd_info->write_timeout  = 500;
93a9643ea8Slogwang }
94a9643ea8Slogwang 
95a9643ea8Slogwang /**
96a9643ea8Slogwang  * @brief �ڲ��ӿ�, �ر�hook socket
97a9643ea8Slogwang  */
98a9643ea8Slogwang void mt_hook_free_fd(int fd)
99a9643ea8Slogwang {
100a9643ea8Slogwang     if ((fd < 0) || (fd >= MT_HOOK_MAX_FD)) {
101a9643ea8Slogwang         return;
102a9643ea8Slogwang     }
103a9643ea8Slogwang 
104a9643ea8Slogwang     MtHookFd* fd_info       = &g_mt_hook_fd_tab[fd];
105a9643ea8Slogwang     fd_info->sock_flag      = 0;
106a9643ea8Slogwang     fd_info->read_timeout   = 0;
107a9643ea8Slogwang     fd_info->write_timeout  = 0;
108a9643ea8Slogwang }
109a9643ea8Slogwang 
110a9643ea8Slogwang /**
111a9643ea8Slogwang  * @brief HOOK�ӿ�, ��ʼ��mt���, �ӹ�ϵͳapi, �ػ��û����õķ��������
112a9643ea8Slogwang  */
113a9643ea8Slogwang #ifdef __cplusplus
114a9643ea8Slogwang extern "C" {
115a9643ea8Slogwang #endif
116a9643ea8Slogwang int ioctl(int fd, unsigned long cmd, ...)
117a9643ea8Slogwang {
118a9643ea8Slogwang     va_list ap;
119a9643ea8Slogwang     va_start(ap, cmd);
120a9643ea8Slogwang     void* arg = va_arg(ap, void *);
121a9643ea8Slogwang     va_end(ap);
122a9643ea8Slogwang 
123a9643ea8Slogwang     mt_hook_syscall(ioctl);
124a9643ea8Slogwang     MtHookFd* hook_fd = mt_hook_find_fd(fd);
125*a02c88d6Slogwang     if (!mt_hook_active() || !hook_fd || !ff_hook_active())
126a9643ea8Slogwang     {
127a9643ea8Slogwang         return ff_hook_ioctl(fd, cmd, arg);
128a9643ea8Slogwang     }
129a9643ea8Slogwang 
130a9643ea8Slogwang     if (cmd == FIONBIO)
131a9643ea8Slogwang     {
132a9643ea8Slogwang         int flags =  (arg != NULL) ? *((int*)arg) : 0;
133a9643ea8Slogwang         if (flags != 0) {
134a9643ea8Slogwang             hook_fd->sock_flag |= MT_FD_FLG_UNBLOCK;
135a9643ea8Slogwang         }
136a9643ea8Slogwang     }
137a9643ea8Slogwang 
138a9643ea8Slogwang 	return ff_hook_ioctl(fd, cmd, arg);
139a9643ea8Slogwang }
140a9643ea8Slogwang 
141a9643ea8Slogwang /**
142a9643ea8Slogwang  * @brief HOOK�ӿ�, ��ʼ��mt���, �ӹ�ϵͳapi, Ĭ������unblock
143a9643ea8Slogwang  */
144a9643ea8Slogwang int socket(int domain, int type, int protocol)
145a9643ea8Slogwang {
146a9643ea8Slogwang     mt_hook_syscall(socket);
147a9643ea8Slogwang 
148*a02c88d6Slogwang     if (!ff_hook_active())
149a9643ea8Slogwang     {
150*a02c88d6Slogwang         return mt_real_func(socket)(domain, type, protocol);
151a9643ea8Slogwang     }
152a9643ea8Slogwang 
153a9643ea8Slogwang     int fd = ff_hook_socket(domain, type, protocol);
154a9643ea8Slogwang     if (fd < 0)
155a9643ea8Slogwang     {
156a9643ea8Slogwang         return fd;
157a9643ea8Slogwang     }
158a9643ea8Slogwang 
159a9643ea8Slogwang     mt_hook_new_fd(fd);
160a9643ea8Slogwang 
161a9643ea8Slogwang     mt_hook_syscall(ioctl);
162a9643ea8Slogwang 	int nb = 1;
163a9643ea8Slogwang 	ff_hook_ioctl(fd, FIONBIO, &nb);
164a9643ea8Slogwang 
165a9643ea8Slogwang     return fd;
166a9643ea8Slogwang }
167a9643ea8Slogwang 
168a9643ea8Slogwang /**
169a9643ea8Slogwang  * @brief HOOK�ӿ�, ��ʼ��mt���, �ӹ�ϵͳapi
170a9643ea8Slogwang  */
171a9643ea8Slogwang int close(int fd)
172a9643ea8Slogwang {
173a9643ea8Slogwang     mt_hook_syscall(close);
174*a02c88d6Slogwang     if (!ff_hook_active())
175a9643ea8Slogwang     {
176*a02c88d6Slogwang         return mt_real_func(close)(fd);
177a9643ea8Slogwang     }
178a9643ea8Slogwang 
179a9643ea8Slogwang     mt_hook_free_fd(fd);
180a9643ea8Slogwang 	return ff_hook_close(fd);
181a9643ea8Slogwang }
182a9643ea8Slogwang 
183a9643ea8Slogwang 
184a9643ea8Slogwang /**
185a9643ea8Slogwang  * @brief HOOK�ӿ�, ��ʼ��mt���, �ӹ�ϵͳapi
186a9643ea8Slogwang  */
187a9643ea8Slogwang int connect(int fd, const struct sockaddr *address, socklen_t address_len)
188a9643ea8Slogwang {
189a9643ea8Slogwang     mt_hook_syscall(connect);
190a9643ea8Slogwang     MtHookFd* hook_fd = mt_hook_find_fd(fd);
191*a02c88d6Slogwang     if (!mt_hook_active() || !hook_fd || !ff_hook_active())
192a9643ea8Slogwang     {
193*a02c88d6Slogwang         return mt_real_func(connect)(fd, address, address_len);
194a9643ea8Slogwang     }
195a9643ea8Slogwang 
196a9643ea8Slogwang     if (hook_fd->sock_flag & MT_FD_FLG_UNBLOCK)
197a9643ea8Slogwang     {
198a9643ea8Slogwang         return ff_hook_connect(fd, address, address_len);
199a9643ea8Slogwang     }
200a9643ea8Slogwang 
201a9643ea8Slogwang     return MtFrame::connect(fd, address, (int)address_len, hook_fd->write_timeout);
202a9643ea8Slogwang }
203a9643ea8Slogwang 
204a9643ea8Slogwang /**
205a9643ea8Slogwang  * @brief HOOK�ӿ�, ��ʼ��mt���, �ӹ�ϵͳapi, �û��Ѿ�����unblock, ����
206a9643ea8Slogwang  */
207a9643ea8Slogwang ssize_t read(int fd, void *buf, size_t nbyte)
208a9643ea8Slogwang {
209a9643ea8Slogwang     mt_hook_syscall(read);
210a9643ea8Slogwang     MtHookFd* hook_fd = mt_hook_find_fd(fd);
211*a02c88d6Slogwang     if (!mt_hook_active() || !hook_fd || !ff_hook_active())
212a9643ea8Slogwang     {
213*a02c88d6Slogwang         return mt_real_func(read)(fd, buf, nbyte);
214a9643ea8Slogwang     }
215a9643ea8Slogwang 
216a9643ea8Slogwang     if (hook_fd->sock_flag & MT_FD_FLG_UNBLOCK)
217a9643ea8Slogwang     {
218a9643ea8Slogwang         return ff_hook_read(fd, buf, nbyte);
219a9643ea8Slogwang     }
220a9643ea8Slogwang 
221a9643ea8Slogwang     return MtFrame::read(fd, buf, nbyte, hook_fd->read_timeout);
222a9643ea8Slogwang }
223a9643ea8Slogwang 
224a9643ea8Slogwang /**
225a9643ea8Slogwang  * @brief HOOK�ӿ�, ��ʼ��mt���, �ӹ�ϵͳapi, �û��Ѿ�����unblock, ����
226a9643ea8Slogwang  */
227a9643ea8Slogwang ssize_t write(int fd, const void *buf, size_t nbyte)
228a9643ea8Slogwang {
229a9643ea8Slogwang     mt_hook_syscall(write);
230a9643ea8Slogwang     MtHookFd* hook_fd = mt_hook_find_fd(fd);
231*a02c88d6Slogwang     if (!mt_hook_active() || !hook_fd || !ff_hook_active())
232a9643ea8Slogwang     {
233*a02c88d6Slogwang         return mt_real_func(write)(fd, buf, nbyte);
234a9643ea8Slogwang     }
235a9643ea8Slogwang 
236a9643ea8Slogwang     if (hook_fd->sock_flag & MT_FD_FLG_UNBLOCK)
237a9643ea8Slogwang     {
238a9643ea8Slogwang         return ff_hook_write(fd, buf, nbyte);
239a9643ea8Slogwang     }
240a9643ea8Slogwang 
241a9643ea8Slogwang     return MtFrame::write(fd, buf, nbyte, hook_fd->write_timeout);
242a9643ea8Slogwang }
243a9643ea8Slogwang 
244a9643ea8Slogwang /**
245a9643ea8Slogwang  * @brief HOOK�ӿ�, ��ʼ��mt���, �ӹ�ϵͳapi, �û��Ѿ�����unblock, ����
246a9643ea8Slogwang  */
247a9643ea8Slogwang ssize_t sendto(int fd, const void *message, size_t length, int flags,
248a9643ea8Slogwang                const struct sockaddr *dest_addr, socklen_t dest_len)
249a9643ea8Slogwang {
250a9643ea8Slogwang     mt_hook_syscall(sendto);
251a9643ea8Slogwang     MtHookFd* hook_fd = mt_hook_find_fd(fd);
252*a02c88d6Slogwang     if (!mt_hook_active() || !hook_fd || !ff_hook_active())
253a9643ea8Slogwang     {
254*a02c88d6Slogwang         return mt_real_func(sendto)(fd, message, length, flags, dest_addr, dest_len);
255a9643ea8Slogwang     }
256a9643ea8Slogwang 
257a9643ea8Slogwang     if (hook_fd->sock_flag & MT_FD_FLG_UNBLOCK)
258a9643ea8Slogwang     {
259a9643ea8Slogwang         return ff_hook_sendto(fd, message, length, flags, dest_addr, dest_len);
260a9643ea8Slogwang     }
261a9643ea8Slogwang 
262a9643ea8Slogwang     return MtFrame::sendto(fd, message, (int)length, flags,
263a9643ea8Slogwang                            dest_addr, dest_len, hook_fd->write_timeout);
264a9643ea8Slogwang }
265a9643ea8Slogwang 
266a9643ea8Slogwang /**
267a9643ea8Slogwang  * @brief HOOK�ӿ�, ��ʼ��mt���, �ӹ�ϵͳapi, �û��Ѿ�����unblock, ����
268a9643ea8Slogwang  */
269a9643ea8Slogwang ssize_t recvfrom(int fd, void *buffer, size_t length, int flags,
270a9643ea8Slogwang                   struct sockaddr *address, socklen_t *address_len)
271a9643ea8Slogwang {
272a9643ea8Slogwang     mt_hook_syscall(recvfrom);
273a9643ea8Slogwang     MtHookFd* hook_fd = mt_hook_find_fd(fd);
274*a02c88d6Slogwang     if (!mt_hook_active() || !hook_fd || !ff_hook_active())
275a9643ea8Slogwang     {
276*a02c88d6Slogwang         return mt_real_func(recvfrom)(fd, buffer, length, flags, address, address_len);
277a9643ea8Slogwang     }
278a9643ea8Slogwang 
279a9643ea8Slogwang     if (hook_fd->sock_flag & MT_FD_FLG_UNBLOCK)
280a9643ea8Slogwang     {
281a9643ea8Slogwang         return ff_hook_recvfrom(fd, buffer, length, flags, address, address_len);
282a9643ea8Slogwang     }
283a9643ea8Slogwang 
284a9643ea8Slogwang     return MtFrame::recvfrom(fd, buffer, length, flags, address, address_len, hook_fd->read_timeout);
285a9643ea8Slogwang 
286a9643ea8Slogwang }
287a9643ea8Slogwang 
288a9643ea8Slogwang /**
289a9643ea8Slogwang  * @brief HOOK�ӿ�, ��ʼ��mt���, �ӹ�ϵͳapi, �û��Ѿ�����unblock, ����
290a9643ea8Slogwang  */
291a9643ea8Slogwang ssize_t recv(int fd, void *buffer, size_t length, int flags)
292a9643ea8Slogwang {
293a9643ea8Slogwang     mt_hook_syscall(recv);
294a9643ea8Slogwang     MtHookFd* hook_fd = mt_hook_find_fd(fd);
295*a02c88d6Slogwang     if (!mt_hook_active() || !hook_fd || !ff_hook_active())
296a9643ea8Slogwang     {
297*a02c88d6Slogwang         return mt_real_func(recv)(fd, buffer, length, flags);
298a9643ea8Slogwang     }
299a9643ea8Slogwang 
300a9643ea8Slogwang     if (hook_fd->sock_flag & MT_FD_FLG_UNBLOCK)
301a9643ea8Slogwang     {
302a9643ea8Slogwang         return ff_hook_recv(fd, buffer, length, flags);
303a9643ea8Slogwang     }
304a9643ea8Slogwang 
305a9643ea8Slogwang     return MtFrame::recv(fd, buffer, length, flags, hook_fd->read_timeout);
306a9643ea8Slogwang }
307a9643ea8Slogwang 
308a9643ea8Slogwang /**
309a9643ea8Slogwang  * @brief HOOK�ӿ�, ��ʼ��mt���, �ӹ�ϵͳapi, �û��Ѿ�����unblock, ����
310a9643ea8Slogwang  */
311a9643ea8Slogwang ssize_t send(int fd, const void *buf, size_t nbyte, int flags)
312a9643ea8Slogwang {
313a9643ea8Slogwang     mt_hook_syscall(send);
314a9643ea8Slogwang     MtHookFd* hook_fd = mt_hook_find_fd(fd);
315*a02c88d6Slogwang     if (!mt_hook_active() || !hook_fd || !ff_hook_active())
316a9643ea8Slogwang     {
317*a02c88d6Slogwang         return mt_real_func(send)(fd, buf, nbyte, flags);
318a9643ea8Slogwang     }
319a9643ea8Slogwang 
320a9643ea8Slogwang     if (hook_fd->sock_flag & MT_FD_FLG_UNBLOCK)
321a9643ea8Slogwang     {
322a9643ea8Slogwang         return ff_hook_send(fd, buf, nbyte, flags);
323a9643ea8Slogwang     }
324a9643ea8Slogwang 
325a9643ea8Slogwang     return MtFrame::send(fd, buf, nbyte, flags, hook_fd->write_timeout);
326a9643ea8Slogwang }
327a9643ea8Slogwang 
328a9643ea8Slogwang 
329a9643ea8Slogwang /**
330a9643ea8Slogwang  * @brief HOOK�ӿ�, ��ʼ��mt���, �ӹ�ϵͳapi, �ػ��û����õij�ʱʱ����Ϣ
331a9643ea8Slogwang  */
332a9643ea8Slogwang int setsockopt(int fd, int level, int option_name, const void *option_value, socklen_t option_len)
333a9643ea8Slogwang {
334a9643ea8Slogwang     mt_hook_syscall(setsockopt);
335a9643ea8Slogwang     MtHookFd* hook_fd = mt_hook_find_fd(fd);
336*a02c88d6Slogwang     if (!mt_hook_active() || !hook_fd || !ff_hook_active())
337a9643ea8Slogwang     {
338*a02c88d6Slogwang         return mt_real_func(setsockopt)(fd, level, option_name, option_value, option_len);
339a9643ea8Slogwang     }
340a9643ea8Slogwang 
341a9643ea8Slogwang     if (SOL_SOCKET == level)
342a9643ea8Slogwang     {
343a9643ea8Slogwang         struct timeval *val = (struct timeval*)option_value;
344a9643ea8Slogwang         if (SO_RCVTIMEO == option_name)
345a9643ea8Slogwang         {
346a9643ea8Slogwang             hook_fd->read_timeout = val->tv_sec * 1000 + val->tv_usec / 1000;
347a9643ea8Slogwang         }
348a9643ea8Slogwang         else if (SO_SNDTIMEO == option_name)
349a9643ea8Slogwang         {
350a9643ea8Slogwang             hook_fd->write_timeout = val->tv_sec * 1000 + val->tv_usec / 1000;
351a9643ea8Slogwang         }
352a9643ea8Slogwang     }
353a9643ea8Slogwang 
354a9643ea8Slogwang 	return ff_hook_setsockopt(fd, level, option_name, option_value, option_len);
355a9643ea8Slogwang }
356a9643ea8Slogwang 
357a9643ea8Slogwang 
358a9643ea8Slogwang 
359a9643ea8Slogwang /**
360a9643ea8Slogwang  * @brief HOOK�ӿ�, ��ʼ��mt���, �ӹ�ϵͳapi, �ػ��û����õķ��������
361a9643ea8Slogwang  */
362a9643ea8Slogwang int fcntl(int fd, int cmd, ...)
363a9643ea8Slogwang {
364a9643ea8Slogwang     va_list ap;
365a9643ea8Slogwang     va_start(ap, cmd);
366a9643ea8Slogwang     void* arg = va_arg(ap, void *);
367a9643ea8Slogwang     va_end(ap);
368a9643ea8Slogwang 
369a9643ea8Slogwang     mt_hook_syscall(fcntl);
370a9643ea8Slogwang     MtHookFd* hook_fd = mt_hook_find_fd(fd);
371*a02c88d6Slogwang     if (!mt_hook_active() || !hook_fd || !ff_hook_active())
372a9643ea8Slogwang     {
373*a02c88d6Slogwang         return mt_real_func(fcntl)(fd, cmd, arg);
374a9643ea8Slogwang     }
375a9643ea8Slogwang 
376a9643ea8Slogwang     if (cmd == F_SETFL)
377a9643ea8Slogwang     {
378a9643ea8Slogwang         va_start(ap, cmd);
379a9643ea8Slogwang         int flags = va_arg(ap, int);
380a9643ea8Slogwang         va_end(ap);
381a9643ea8Slogwang 
382a9643ea8Slogwang         if (flags & O_NONBLOCK)
383a9643ea8Slogwang         {
384a9643ea8Slogwang             hook_fd->sock_flag |= MT_FD_FLG_UNBLOCK;
385a9643ea8Slogwang         }
386a9643ea8Slogwang     }
387a9643ea8Slogwang 
388a9643ea8Slogwang     return ff_hook_fcntl(fd, cmd, arg);
389a9643ea8Slogwang }
390a9643ea8Slogwang 
391a9643ea8Slogwang 
392a9643ea8Slogwang int listen(int sockfd, int backlog)
393a9643ea8Slogwang {
394a9643ea8Slogwang     mt_hook_syscall(listen);
395*a02c88d6Slogwang     if (!ff_hook_active())
396*a02c88d6Slogwang     {
397*a02c88d6Slogwang         return mt_real_func(listen)(sockfd, backlog);
398*a02c88d6Slogwang     }
399*a02c88d6Slogwang 
400a9643ea8Slogwang 	return ff_hook_listen(sockfd, backlog);
401a9643ea8Slogwang }
402a9643ea8Slogwang 
403a9643ea8Slogwang int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
404a9643ea8Slogwang {
405a9643ea8Slogwang     mt_hook_syscall(bind);
406*a02c88d6Slogwang     if (!ff_hook_active())
407*a02c88d6Slogwang     {
408*a02c88d6Slogwang         return mt_real_func(bind)(sockfd, addr, addrlen);
409*a02c88d6Slogwang     }
410*a02c88d6Slogwang 
411a9643ea8Slogwang 	return ff_hook_bind(sockfd, addr, addrlen);
412a9643ea8Slogwang }
413a9643ea8Slogwang 
414a9643ea8Slogwang int accept(int fd, struct sockaddr *addr, socklen_t *addrlen)
415a9643ea8Slogwang {
416a9643ea8Slogwang     mt_hook_syscall(accept);
417*a02c88d6Slogwang     if (!ff_hook_active())
418*a02c88d6Slogwang     {
419*a02c88d6Slogwang         return mt_real_func(accept)(fd, addr, addrlen);
420*a02c88d6Slogwang     }
421*a02c88d6Slogwang 
422a9643ea8Slogwang 	return ff_hook_accept(fd, addr, addrlen);
423a9643ea8Slogwang }
424a9643ea8Slogwang 
425a9643ea8Slogwang #ifdef __cplusplus
426a9643ea8Slogwang }
427a9643ea8Slogwang #endif
428