1# Copyright 2019 gRPC authors.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#     http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14# distutils: language=c++
15
16from libc cimport string
17from libc.stdlib cimport malloc
18from libcpp.string cimport string as cppstring
19
20cdef grpc_error* grpc_error_none():
21  return <grpc_error*>0
22
23cdef grpc_error* socket_error(str syscall, str err):
24  error_str = "{} failed: {}".format(syscall, err)
25  error_bytes = str_to_bytes(error_str)
26  return grpc_socket_error(error_bytes)
27
28cdef resolved_addr_to_tuple(grpc_resolved_address* address):
29  cdef cppstring res_str
30  port = grpc_sockaddr_get_port(address)
31  res_str = grpc_sockaddr_to_string(address, False)
32  byte_str = _decode(res_str)
33  if byte_str.endswith(':' + str(port)):
34    byte_str = byte_str[:(0 - len(str(port)) - 1)]
35  byte_str = byte_str.lstrip('[')
36  byte_str = byte_str.rstrip(']')
37  byte_str = '{}'.format(byte_str)
38  return byte_str, port
39
40cdef sockaddr_to_tuple(const grpc_sockaddr* address, size_t length):
41  cdef grpc_resolved_address c_addr
42  string.memcpy(<void*>c_addr.addr, <void*> address, length)
43  c_addr.len = length
44  return resolved_addr_to_tuple(&c_addr)
45
46cdef sockaddr_is_ipv4(const grpc_sockaddr* address, size_t length):
47  cdef grpc_resolved_address c_addr
48  string.memcpy(<void*>c_addr.addr, <void*> address, length)
49  c_addr.len = length
50  return grpc_sockaddr_get_uri_scheme(&c_addr) == b'ipv4'
51
52cdef grpc_resolved_addresses* tuples_to_resolvaddr(tups):
53  cdef grpc_resolved_addresses* addresses
54  tups_set = set((tup[4][0], tup[4][1]) for tup in tups)
55  addresses = <grpc_resolved_addresses*> malloc(sizeof(grpc_resolved_addresses))
56  addresses.naddrs = len(tups_set)
57  addresses.addrs = <grpc_resolved_address*> malloc(sizeof(grpc_resolved_address) * len(tups_set))
58  i = 0
59  for tup in set(tups_set):
60    hostname = str_to_bytes(tup[0])
61    grpc_string_to_sockaddr(&addresses.addrs[i], hostname, tup[1])
62    i += 1
63  return addresses
64