oceanbase

Форк
0
/
ussl_factory.c 
125 строк · 4.1 Кб
1
/**
2
 * Copyright (c) 2021 OceanBase
3
 * OceanBase CE is licensed under Mulan PubL v2.
4
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
5
 * You may obtain a copy of Mulan PubL v2 at:
6
 *          http://license.coscl.org.cn/MulanPubL-2.0
7
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
 * See the Mulan PubL v2 for more details.
11
 */
12

13
static clientfd_sk_t *clientfd_sk_new(ussl_sf_t *sf)
14
{
15
  clientfd_sk_t *s = NULL;
16
  if (NULL == (s = (typeof(s))malloc(sizeof(clientfd_sk_t)))) {
17
    ussl_log_error("malloc for clientfd_sk_t failed, errno:%d", errno);
18
  } else {
19
    s->fty = sf;
20
    s->handle_event = (ussl_handle_event_t)clientfd_sk_handle_event;
21
    s->type = CLIENT_SOCK;
22
    s->has_error = 0;
23
    ussl_dlink_init(&s->timeout_link);
24
  }
25
  return s;
26
}
27

28
static void clientfd_sk_delete(ussl_sf_t *sf, clientfd_sk_t *s)
29
{
30
  if (NULL != s) {
31
    int ret = 0;
32
    remove_from_timeout_list(&s->timeout_link);
33
    char client_addr[IP_STRING_MAX_LEN] = {0};
34
    ussl_get_peer_addr(s->fd_info.client_fd, client_addr, IP_STRING_MAX_LEN);
35
    if (s->fd >= 0) {
36
      if (s->has_error) {
37
        shutdown(s->fd, SHUT_WR);
38
      }
39
      if (NULL != s->ep) {
40
        if (0 != (ret = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) {
41
          ussl_log_warn("delete client fd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd,
42
                        s->fd, errno);
43
        }
44
      }
45
      if (0 != (ret = libc_epoll_ctl(s->fd_info.org_epfd, EPOLL_CTL_ADD,
46
                                            s->fd_info.client_fd, &s->fd_info.event))) {
47
        ussl_log_warn("give back fd to origin epoll failed, fd:%d, errno:%d", s->fd_info.client_fd,
48
                      errno);
49
      }
50
      if (0 == ret) {
51
        ussl_log_info("give back fd to origin epoll succ, client_fd:%d, client_epfd:%d, event:0x%x, client_addr:%s, has_error:%d",
52
                      s->fd_info.client_fd, s->fd_info.org_epfd, s->fd_info.event.events, client_addr, s->has_error);
53
      }
54
      s->fd = -1;
55
    }
56
    free(s);
57
  }
58
}
59

60
int clientfd_sf_init(ussl_sf_t *sf)
61
{
62
  ussl_sf_init(sf, (void *)clientfd_sk_new, (void *)clientfd_sk_delete);
63
  return 0;
64
}
65

66
static acceptfd_sk_t *acceptfd_sk_new(ussl_sf_t *sf)
67
{
68
  acceptfd_sk_t *s = NULL;
69
  if (NULL == (s = (typeof(s))malloc(sizeof(acceptfd_sk_t)))) {
70
    ussl_log_error("malloc for acceptfd_sk_t failed, errno:%d", errno);
71
  } else {
72
    s->fty = sf;
73
    s->handle_event = (ussl_handle_event_t)acceptfd_sk_handle_event;
74
    s->type = SERVER_SOCK;
75
    s->has_error = 0;
76
    s->start_time = time(NULL);
77
    s->fd = -1;
78
    s->ep = NULL;
79
    ussl_dlink_init(&s->timeout_link);
80
  }
81
  return s;
82
}
83

84
static void acceptfd_sk_delete(ussl_sf_t *sf, acceptfd_sk_t *s)
85
{
86
  if (NULL != s) {
87
    remove_from_timeout_list(&s->timeout_link);
88
    if (s->fd >= 0) {
89
      int need_close = 1;
90
      int err = 0;
91
      if (s->has_error) {
92
      } else {
93
        if (NULL == s->ep) {
94
          need_close = 1;
95
        } else if (0 != (err = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) {
96
          ussl_log_warn("remove acceptfd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd, s->fd,
97
                        errno);
98
        } else if (0 != (err = dispatch_accept_fd_to_certain_group(s->fd, s->fd_info.client_gid))) {
99
          ussl_log_warn("dispatch fd to default group failed, fd:%d, ret:%d", s->fd, ret);
100
        } else {
101
          need_close = 0;
102
        }
103
      }
104
      if (need_close) {
105
        if (NULL != s->ep) {
106
          if (0 != (err = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) {
107
            ussl_log_warn("delete accept fd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd,
108
                          s->fd, errno);
109
          }
110
        }
111
        if (0 != (err = ussl_close(s->fd))) {
112
          ussl_log_warn("ussl_close failed, fd:%d, errno:%d", s->fd, errno);
113
        }
114
      }
115
    }
116
    s->fd = -1;
117
    free(s);
118
  }
119
}
120

121
int acceptfd_sf_init(ussl_sf_t *sf)
122
{
123
  ussl_sf_init(sf, (void *)acceptfd_sk_new, (void *)acceptfd_sk_delete);
124
  return 0;
125
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.