/*constructor for channels creating an outgoing connection * bindip local ip address to bind on, typically 0.0.0.0 or ::0 * locaport locaport to use for binding, can be set to 0 if port doesn't matter * peer_cname canonical name of remote host, used for TLS verification * peername peer's hostname, either ip address or DNS name * pee_port peer's port to connect to. */ void belle_sip_channel_init(belle_sip_channel_t *obj, belle_sip_stack_t *stack,const char *bindip,int localport,const char *peer_cname, const char *peername, int peer_port){ /*to initialize our base class:*/ belle_sip_channel_set_socket(obj,-1,NULL); /*then initialize members*/ obj->ai_family=AF_INET; obj->peer_cname=peer_cname ? belle_sip_strdup(peer_cname) : NULL; obj->peer_name=belle_sip_strdup(peername); obj->peer_port=peer_port; obj->stack=stack; if (bindip){ if (strcmp(bindip,"::0")!=0 && strcmp(bindip,"0.0.0.0")!=0) obj->local_ip=belle_sip_strdup(bindip); if (strchr(bindip,':')!=NULL) obj->ai_family=AF_INET6; } obj->local_port=localport; obj->simulated_recv_return=1;/*not set*/ if (peername){ /*check if we are given a real dns name or just an ip address*/ struct addrinfo *ai=belle_sip_ip_address_to_addrinfo(AF_UNSPEC,peername,peer_port); if (ai) freeaddrinfo(ai); else obj->has_name=TRUE; } belle_sip_channel_input_stream_reset(&obj->input_stream); update_inactivity_timer(obj,FALSE); }
BELLE_SIP_INSTANCIATE_CUSTOM_VPTR_END belle_sip_channel_t * belle_sip_channel_new_udp(belle_sip_stack_t *stack, int sock, const char *bindip, int localport, const char *dest, int port){ belle_sip_udp_channel_t *obj=belle_sip_object_new(belle_sip_udp_channel_t); belle_sip_channel_init((belle_sip_channel_t*)obj,stack,bindip,localport,NULL,dest,port); belle_sip_channel_set_socket((belle_sip_channel_t*)obj,sock,NULL); return (belle_sip_channel_t*)obj; }
static int tls_channel_connect(belle_sip_channel_t *obj, const struct addrinfo *ai){ int err= stream_channel_connect((belle_sip_stream_channel_t*)obj,ai); if (err==0){ belle_sip_socket_t sock=belle_sip_source_get_socket((belle_sip_source_t*)obj); belle_sip_channel_set_socket(obj,sock,(belle_sip_source_func_t)tls_process_data); return 0; } return -1; }
belle_sip_channel_t * belle_sip_channel_new_udp_with_addr(belle_sip_stack_t *stack, int sock, const char *bindip, int localport, const struct addrinfo *peer){ belle_sip_udp_channel_t *obj=belle_sip_object_new(belle_sip_udp_channel_t); belle_sip_channel_init_with_addr((belle_sip_channel_t*)obj,stack,peer->ai_addr, peer->ai_addrlen); obj->base.local_port=localport; belle_sip_channel_set_socket((belle_sip_channel_t*)obj,sock,NULL); /*this lookups the local address*/ udp_channel_connect((belle_sip_channel_t*)obj,peer); return (belle_sip_channel_t*)obj; }