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