163 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**
 | 
						|
 * Copyright (c) 2021 OceanBase
 | 
						|
 * OceanBase CE is licensed under Mulan PubL v2.
 | 
						|
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | 
						|
 * You may obtain a copy of Mulan PubL v2 at:
 | 
						|
 *          http://license.coscl.org.cn/MulanPubL-2.0
 | 
						|
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
						|
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
						|
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
						|
 * See the Mulan PubL v2 for more details.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef USSL_HOOK_USSL_DEPS_
 | 
						|
#define USSL_HOOK_USSL_DEPS_
 | 
						|
 | 
						|
#ifndef ATOMIC_LOAD
 | 
						|
#define ATOMIC_LOAD(x) __atomic_load_n((x), __ATOMIC_ACQUIRE)
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef ATOMIC_STORE
 | 
						|
#define ATOMIC_STORE(x, v) __atomic_store_n((x), (v), __ATOMIC_RELEASE)
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef ATOMIC_TAS
 | 
						|
#define ATOMIC_TAS(val, newv) __sync_lock_test_and_set((val), (newv))
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef ATOMIC_FAA
 | 
						|
#define ATOMIC_FAA(val, addv) __sync_fetch_and_add((val), (addv))
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef ATOMIC_AAF
 | 
						|
#define ATOMIC_AAF(val, addv) __sync_add_and_fetch((val), (addv))
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef ATOMIC_VCAS
 | 
						|
#define ATOMIC_VCAS(val, cmpv, newv) __sync_val_compare_and_swap((val), (cmpv), (newv))
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef ATOMIC_BCAS
 | 
						|
#define ATOMIC_BCAS(val, cmpv, newv) __sync_bool_compare_and_swap((val), (cmpv), (newv))
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#include <errno.h>
 | 
						|
#include <stdint.h>
 | 
						|
#include <sys/socket.h>
 | 
						|
#include <sys/syscall.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <sys/epoll.h>
 | 
						|
static pid_t ussl_gettid() { return syscall(SYS_gettid); }
 | 
						|
 | 
						|
#include <sys/time.h>
 | 
						|
#include <time.h>
 | 
						|
static int64_t ussl_get_us()
 | 
						|
{
 | 
						|
  struct timeval tv;
 | 
						|
  gettimeofday(&tv, NULL);
 | 
						|
  return tv.tv_sec * 1000000 + tv.tv_usec;
 | 
						|
}
 | 
						|
 | 
						|
#ifndef ussl_log
 | 
						|
#include <stdio.h>
 | 
						|
static const char *ussl_format_ts(char *buf, int64_t limit, int64_t time_us)
 | 
						|
{
 | 
						|
  const char *format = "%Y-%m-%d %H:%M:%S";
 | 
						|
  buf[0] = '\0';
 | 
						|
  struct tm time_struct;
 | 
						|
  int64_t time_s = time_us / 1000000;
 | 
						|
  int64_t cur_second_time_us = time_us % 1000000;
 | 
						|
  if (NULL != localtime_r(&time_s, &time_struct)) {
 | 
						|
    int64_t pos = strftime(buf, limit, format, &time_struct);
 | 
						|
    if (pos < limit) {
 | 
						|
      snprintf(buf + pos, limit - pos, ".%.6ld", cur_second_time_us);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return buf;
 | 
						|
}
 | 
						|
 | 
						|
#include <string.h>
 | 
						|
#define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1):__FILE__)
 | 
						|
 | 
						|
#define ussl_log(level, errcode, format, ...)                                                                 \
 | 
						|
  {                                                                                                           \
 | 
						|
    char time_str[64];                                                                                        \
 | 
						|
    (void)errcode;                                                                                            \
 | 
						|
    ussl_format_ts(time_str, sizeof(time_str), ussl_get_us());                                                \
 | 
						|
    fprintf(stderr, "[%s] %s %s:%d [%d] %s [ussl_log]" format "\n", time_str, #level, __FILENAME__, __LINE__, \
 | 
						|
            ussl_gettid(), __func__, ##__VA_ARGS__);                                                          \
 | 
						|
  }
 | 
						|
#endif
 | 
						|
 | 
						|
#define ussl_log_info(...) ussl_log(INFO, oceanbase::common::OB_SUCCESS, ##__VA_ARGS__)
 | 
						|
#define ussl_log_error(...) ussl_log(ERROR, oceanbase::common::OB_ERR_SYS, ##__VA_ARGS__)
 | 
						|
#define ussl_log_warn(...) ussl_log(WARN, oceanbase::common::OB_SUCCESS, ##__VA_ARGS__)
 | 
						|
#define ussl_fatal(...)                                          \
 | 
						|
{                                                                \
 | 
						|
  ussl_log(ERROR, oceanbase::common::OB_ERR_SYS, ##__VA_ARGS__); \
 | 
						|
  exit(1);                                                       \
 | 
						|
}
 | 
						|
 | 
						|
#include <stddef.h>
 | 
						|
 | 
						|
#define ussl_structof(p, T, m) (T *)((char *)p - offsetof(T, m))
 | 
						|
 | 
						|
#define ussl_arrlen(x) (sizeof(x) / sizeof(x[0]))
 | 
						|
 | 
						|
typedef struct ussl_dlink_t
 | 
						|
{
 | 
						|
  struct ussl_dlink_t *next;
 | 
						|
  struct ussl_dlink_t *prev;
 | 
						|
} ussl_dlink_t;
 | 
						|
 | 
						|
void ussl_dlink_init(ussl_dlink_t *n)
 | 
						|
{
 | 
						|
  n->prev = n;
 | 
						|
  n->next = n;
 | 
						|
}
 | 
						|
 | 
						|
void __ussl_dlink_insert(ussl_dlink_t *prev, ussl_dlink_t *next, ussl_dlink_t *n)
 | 
						|
{
 | 
						|
  n->prev = prev;
 | 
						|
  n->next = next;
 | 
						|
  prev->next = n;
 | 
						|
  next->prev = n;
 | 
						|
}
 | 
						|
 | 
						|
void __ussl_dlink_delete(ussl_dlink_t *prev, ussl_dlink_t *next)
 | 
						|
{
 | 
						|
  prev->next = next;
 | 
						|
  next->prev = prev;
 | 
						|
}
 | 
						|
 | 
						|
void ussl_dlink_insert(ussl_dlink_t *head, ussl_dlink_t *n) { __ussl_dlink_insert(head, head->next, n); }
 | 
						|
 | 
						|
void ussl_dlink_delete(ussl_dlink_t *n)
 | 
						|
{
 | 
						|
  if (n->next) {
 | 
						|
    __ussl_dlink_delete(n->prev, n->next);
 | 
						|
    n->next = NULL;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
#define ussl_dlink_for(head, p) \
 | 
						|
  for (ussl_dlink_t *p = (head)->next, *_np = p->next; p != (head); p = _np, _np = p->next)
 | 
						|
 | 
						|
static int (*libc_setsockopt)(int sockfd, int level, int optname, const void *optval,
 | 
						|
                              socklen_t optlen);
 | 
						|
static int (*libc_listen)(int sockfd, int backlog);
 | 
						|
static int (*libc_connect)(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
 | 
						|
// libc_accept is used in other files, so don't make it static.
 | 
						|
int (*libc_accept)(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
 | 
						|
static int (*libc_accept4)(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
 | 
						|
static int (*libc_epoll_ctl)(int epfd, int op, int fd, struct epoll_event *event);
 | 
						|
static int (*libc_close)(int fd);
 | 
						|
static ssize_t (*libc_read)(int fd, void *buf, size_t count);
 | 
						|
static ssize_t (*libc_write)(int fd, const void *buf, size_t count);
 | 
						|
static ssize_t (*libc_writev)(int fildes, const struct iovec *iov, int iovcnt);
 | 
						|
 | 
						|
int make_socket_non_blocking(int fd);
 | 
						|
 | 
						|
#endif // USSL_HOOK_USSL_DEPS_
 |