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