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 #include <stdio.h> 21a9643ea8Slogwang #include <stdlib.h> 22a9643ea8Slogwang #include <stdint.h> 23a9643ea8Slogwang #include <sched.h> 24a9643ea8Slogwang #include <unistd.h> 25a9643ea8Slogwang #include <pthread.h> 26a9643ea8Slogwang #include <errno.h> 27a9643ea8Slogwang #include <assert.h> 28a9643ea8Slogwang #include <sys/types.h> 29a9643ea8Slogwang #include <sys/stat.h> 30a9643ea8Slogwang #include <sys/ioctl.h> 31a9643ea8Slogwang #include <fcntl.h> 32a9643ea8Slogwang #include <stdarg.h> 33a9643ea8Slogwang #include "ff_api.h" 34a9643ea8Slogwang #include "mt_sys_hook.h" 35a9643ea8Slogwang #include "ff_hook.h" 36a9643ea8Slogwang 37a9643ea8Slogwang int ff_hook_socket(int domain, int type, int protocol) 38a9643ea8Slogwang { 39*a02c88d6Slogwang if ((AF_INET != domain) || (SOCK_STREAM != type && SOCK_DGRAM != type)) { 40a9643ea8Slogwang return mt_real_func(socket)(domain, type, protocol); 41a9643ea8Slogwang } 42*a02c88d6Slogwang return ff_socket(domain, type, protocol); 43a9643ea8Slogwang } 44a9643ea8Slogwang 45a9643ea8Slogwang int ff_hook_close(int fd) 46a9643ea8Slogwang { 47*a02c88d6Slogwang if (ff_fdisused(fd)) { 48a9643ea8Slogwang return ff_close(fd); 49a9643ea8Slogwang } else { 50a9643ea8Slogwang return mt_real_func(close)(fd); 51a9643ea8Slogwang } 52a9643ea8Slogwang } 53a9643ea8Slogwang 54a9643ea8Slogwang int ff_hook_connect(int fd, const struct sockaddr *address, socklen_t addrlen_len) 55a9643ea8Slogwang { 56*a02c88d6Slogwang if (ff_fdisused(fd)) { 57a9643ea8Slogwang return ff_connect(fd, (struct linux_sockaddr *)address, addrlen_len); 58a9643ea8Slogwang } else { 59a9643ea8Slogwang return mt_real_func(connect)(fd, address, addrlen_len); 60a9643ea8Slogwang } 61a9643ea8Slogwang } 62a9643ea8Slogwang 63a9643ea8Slogwang ssize_t ff_hook_read(int fd, void *buf, size_t nbyte) 64a9643ea8Slogwang { 65*a02c88d6Slogwang if (ff_fdisused(fd)) { 66a9643ea8Slogwang return ff_read(fd, buf, nbyte); 67a9643ea8Slogwang } else { 68a9643ea8Slogwang return mt_real_func(read)(fd, buf, nbyte); 69a9643ea8Slogwang } 70a9643ea8Slogwang } 71a9643ea8Slogwang 72a9643ea8Slogwang ssize_t ff_hook_write(int fd, const void *buf, size_t nbyte) 73a9643ea8Slogwang { 74*a02c88d6Slogwang if (ff_fdisused(fd)) { 75a9643ea8Slogwang return ff_write(fd, buf, nbyte); 76a9643ea8Slogwang } else { 77a9643ea8Slogwang return mt_real_func(write)(fd, buf, nbyte); 78a9643ea8Slogwang } 79a9643ea8Slogwang } 80a9643ea8Slogwang ssize_t ff_hook_sendto(int fd, const void *message, size_t length, int flags, 81a9643ea8Slogwang const struct sockaddr *dest_addr, socklen_t dest_len) 82a9643ea8Slogwang { 83*a02c88d6Slogwang if (ff_fdisused(fd)) { 84a9643ea8Slogwang return ff_sendto(fd, message, length, flags, (struct linux_sockaddr *)dest_addr, dest_len); 85a9643ea8Slogwang } else { 86a9643ea8Slogwang return mt_real_func(sendto)(fd, message, length, flags, dest_addr, dest_len); 87a9643ea8Slogwang } 88a9643ea8Slogwang } 89a9643ea8Slogwang ssize_t ff_hook_recvfrom(int fd, void *buffer, size_t length, int flags, 90a9643ea8Slogwang struct sockaddr *address, socklen_t *address_len) 91a9643ea8Slogwang { 92*a02c88d6Slogwang if (ff_fdisused(fd)) { 93a9643ea8Slogwang return ff_recvfrom(fd, buffer, length, flags, (struct linux_sockaddr *)address, address_len); 94a9643ea8Slogwang } else { 95a9643ea8Slogwang return mt_real_func(recvfrom)(fd, buffer, length, flags, address, address_len); 96a9643ea8Slogwang } 97a9643ea8Slogwang } 98a9643ea8Slogwang ssize_t ff_hook_recv(int fd, void *buffer, size_t length, int flags) 99a9643ea8Slogwang { 100*a02c88d6Slogwang if (ff_fdisused(fd)) { 101a9643ea8Slogwang return ff_recv(fd, buffer, length, flags); 102a9643ea8Slogwang } else { 103a9643ea8Slogwang return mt_real_func(recv)(fd, buffer, length, flags); 104a9643ea8Slogwang } 105a9643ea8Slogwang } 106a9643ea8Slogwang ssize_t ff_hook_send(int fd, const void *buf, size_t nbyte, int flags) 107a9643ea8Slogwang { 108*a02c88d6Slogwang if (ff_fdisused(fd)) { 109a9643ea8Slogwang return ff_send(fd, buf, nbyte, flags); 110a9643ea8Slogwang } else { 111a9643ea8Slogwang return mt_real_func(send)(fd, buf, nbyte, flags); 112a9643ea8Slogwang } 113a9643ea8Slogwang 114a9643ea8Slogwang } 115a9643ea8Slogwang int ff_hook_setsockopt(int fd, int level, int option_name, const void *option_value, socklen_t option_len) 116a9643ea8Slogwang { 117*a02c88d6Slogwang if (ff_fdisused(fd)) { 118a9643ea8Slogwang return ff_setsockopt(fd, level, option_name, option_value, option_len); 119a9643ea8Slogwang } else { 120a9643ea8Slogwang return mt_real_func(setsockopt)(fd, level, option_name, option_value, option_len); 121a9643ea8Slogwang } 122a9643ea8Slogwang } 123a9643ea8Slogwang 124a9643ea8Slogwang int ff_hook_ioctl(int fd, int cmd, void *arg) 125a9643ea8Slogwang { 126*a02c88d6Slogwang if (ff_fdisused(fd)) { 127a9643ea8Slogwang return ff_ioctl(fd, cmd, arg); 128a9643ea8Slogwang } else { 129a9643ea8Slogwang return mt_real_func(ioctl)(fd, cmd, arg); 130a9643ea8Slogwang } 131a9643ea8Slogwang } 132a9643ea8Slogwang 133a9643ea8Slogwang int ff_hook_fcntl(int fd, int cmd, void *arg) 134a9643ea8Slogwang { 135*a02c88d6Slogwang if (ff_fdisused(fd)) { 136a9643ea8Slogwang return ff_fcntl(fd, cmd, arg); 137a9643ea8Slogwang } else { 138a9643ea8Slogwang return mt_real_func(fcntl)(fd, cmd, arg); 139a9643ea8Slogwang } 140a9643ea8Slogwang } 141a9643ea8Slogwang 142a9643ea8Slogwang int ff_hook_listen(int fd, int backlog) 143a9643ea8Slogwang { 144*a02c88d6Slogwang if (ff_fdisused(fd)) { 145a9643ea8Slogwang return ff_listen(fd, backlog); 146a9643ea8Slogwang } else { 147a9643ea8Slogwang return mt_real_func(listen)(fd, backlog); 148a9643ea8Slogwang } 149a9643ea8Slogwang } 150a9643ea8Slogwang 151a9643ea8Slogwang int ff_hook_bind(int fd, const struct sockaddr *addr, socklen_t addrlen) 152a9643ea8Slogwang { 153*a02c88d6Slogwang if (ff_fdisused(fd)) { 154a9643ea8Slogwang return ff_bind(fd, (struct linux_sockaddr *)addr, addrlen); 155a9643ea8Slogwang } else { 156a9643ea8Slogwang return mt_real_func(bind)(fd, addr, addrlen); 157a9643ea8Slogwang } 158a9643ea8Slogwang } 159a9643ea8Slogwang int ff_hook_accept(int fd, struct sockaddr *addr, socklen_t *addrlen) 160a9643ea8Slogwang { 161*a02c88d6Slogwang if (ff_fdisused(fd)) { 162*a02c88d6Slogwang return ff_accept(fd, (struct linux_sockaddr *)addr, addrlen); 163a9643ea8Slogwang } else { 164a9643ea8Slogwang return mt_real_func(accept)(fd, addr, addrlen); 165a9643ea8Slogwang } 166a9643ea8Slogwang } 167