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.h 22a9643ea8Slogwang */ 23a9643ea8Slogwang 24a9643ea8Slogwang #ifndef _MT_SYS_HOOK___ 25a9643ea8Slogwang #define _MT_SYS_HOOK___ 26a9643ea8Slogwang 27a9643ea8Slogwang #include <poll.h> 28a9643ea8Slogwang #include <dlfcn.h> 29a9643ea8Slogwang 30a9643ea8Slogwang #include "ff_api.h" 31a9643ea8Slogwang 32a9643ea8Slogwang #ifdef __cplusplus 33a9643ea8Slogwang extern "C" { 34a9643ea8Slogwang #endif 35a9643ea8Slogwang 36a9643ea8Slogwang typedef int (*func_socket)(int domain, int type, int protocol); 37a9643ea8Slogwang typedef int (*func_bind)(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 38a9643ea8Slogwang typedef int (*func_listen)(int sockfd, int backlog); 39a9643ea8Slogwang typedef int (*func_close)(int fd); 40a9643ea8Slogwang typedef int (*func_connect)(int socket, const struct sockaddr *address, socklen_t address_len); 41a9643ea8Slogwang typedef int (*func_accept)(int socket, struct sockaddr *address, socklen_t *addrlen); 42a9643ea8Slogwang typedef ssize_t (*func_read)(int fildes, void *buf, size_t nbyte); 43a9643ea8Slogwang typedef ssize_t (*func_write)(int fildes, const void *buf, size_t nbyte); 44a9643ea8Slogwang typedef ssize_t (*func_sendto)(int socket, const void *message, size_t length, 45a9643ea8Slogwang int flags, const struct sockaddr *dest_addr, socklen_t dest_len); 46a9643ea8Slogwang typedef ssize_t (*func_recvfrom)(int socket, void *buffer, size_t length, 47a9643ea8Slogwang int flags, struct sockaddr *address, socklen_t *address_len); 48a9643ea8Slogwang typedef size_t (*func_send)(int socket, const void *buffer, size_t length, int flags); 49a9643ea8Slogwang typedef ssize_t (*func_recv)(int socket, void *buffer, size_t length, int flags); 50a9643ea8Slogwang typedef int (*func_select)(int nfds, fd_set *readfds, fd_set *writefds, 51a9643ea8Slogwang fd_set *exceptfds, struct timeval *timeout); 52a9643ea8Slogwang typedef int (*func_poll)(struct pollfd fds[], nfds_t nfds, int timeout); 53a9643ea8Slogwang typedef int (*func_setsockopt)(int socket, int level, int option_name, 54a9643ea8Slogwang const void *option_value, socklen_t option_len); 55a9643ea8Slogwang typedef int (*func_ioctl)(int fd, unsigned long cmd, ...); 56a9643ea8Slogwang typedef int (*func_fcntl)(int fd, int cmd, ...); 57a9643ea8Slogwang 58a9643ea8Slogwang typedef unsigned int (*func_sleep)(unsigned int seconds); 59a9643ea8Slogwang 60a9643ea8Slogwang typedef struct mt_syscall_func_tab 61a9643ea8Slogwang { 62a9643ea8Slogwang func_socket real_socket; 63a9643ea8Slogwang func_bind real_bind; 64a9643ea8Slogwang func_listen real_listen; 65a9643ea8Slogwang func_close real_close; 66a9643ea8Slogwang func_connect real_connect; 67a9643ea8Slogwang func_read real_read; 68a9643ea8Slogwang func_write real_write; 69a9643ea8Slogwang func_sendto real_sendto; 70a9643ea8Slogwang func_recvfrom real_recvfrom; 71a9643ea8Slogwang func_send real_send; 72a9643ea8Slogwang func_recv real_recv; 73a9643ea8Slogwang func_setsockopt real_setsockopt; 74a9643ea8Slogwang func_fcntl real_fcntl; 75a9643ea8Slogwang func_ioctl real_ioctl; 76a9643ea8Slogwang 77*35a81399Slogwang func_sleep real_sleep; 78*35a81399Slogwang func_select real_select; 79*35a81399Slogwang func_poll real_poll; 80a9643ea8Slogwang 81a9643ea8Slogwang func_accept real_accept; 82a9643ea8Slogwang } MtSyscallFuncTab; 83a9643ea8Slogwang 84*35a81399Slogwang extern MtSyscallFuncTab g_mt_syscall_tab; 85*35a81399Slogwang extern int g_mt_hook_flag; 86*35a81399Slogwang extern int g_ff_hook_flag; 87a9643ea8Slogwang 88a9643ea8Slogwang #define mt_hook_syscall(name) \ 89a9643ea8Slogwang do { \ 90a9643ea8Slogwang if (!g_mt_syscall_tab.real_##name) { \ 91a9643ea8Slogwang g_mt_syscall_tab.real_##name = (func_##name)dlsym(RTLD_NEXT, #name);\ 92a9643ea8Slogwang } \ 93a9643ea8Slogwang } while (0) 94a9643ea8Slogwang 95a9643ea8Slogwang #define mt_real_func(name) g_mt_syscall_tab.real_##name 96a9643ea8Slogwang 97a9643ea8Slogwang #define mt_set_hook_flag() (g_mt_hook_flag = 1) 98a9643ea8Slogwang #define mt_unset_hook_flag() (g_mt_hook_flag = 0) 99a9643ea8Slogwang 100a9643ea8Slogwang #define mt_hook_active() (g_mt_hook_flag == 1) 101a9643ea8Slogwang 102a9643ea8Slogwang #define ff_set_hook_flag() (g_ff_hook_flag = 1) 103a9643ea8Slogwang #define ff_unset_hook_flag() (g_ff_hook_flag = 0) 104a9643ea8Slogwang #define ff_hook_active() (g_ff_hook_flag == 1) 105a9643ea8Slogwang 106a9643ea8Slogwang #ifdef __cplusplus 107a9643ea8Slogwang } 108a9643ea8Slogwang #endif 109a9643ea8Slogwang 110a9643ea8Slogwang #endif 111a9643ea8Slogwang 112a9643ea8Slogwang 113