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