diff options
author | Christian Pointner <equinox@anytun.org> | 2008-12-28 02:39:57 +0000 |
---|---|---|
committer | Christian Pointner <equinox@anytun.org> | 2008-12-28 02:39:57 +0000 |
commit | 03e65a0b2401f63c8b10a1395def5c7859280aba (patch) | |
tree | 1f1643f21653cfca58f3aa5b48871ac963114cdd /src/udp.c | |
parent | fixed memory error und udp_close (diff) |
added enpoint to string functions
Diffstat (limited to 'src/udp.c')
-rw-r--r-- | src/udp.c | 47 |
1 files changed, 45 insertions, 2 deletions
@@ -96,7 +96,6 @@ void udp_set_remote(udp_socket_t* sock, const char* remote_addr, const char* por memset (&hints, 0, sizeof (hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; - hints.ai_flags |= AI_CANONNAME; int errcode = getaddrinfo(remote_addr, port, &hints, &res); if (errcode != 0) { @@ -118,7 +117,51 @@ void udp_close(udp_socket_t** sock) free(*sock); *sock = NULL; } - + +char* udp_endpoint_to_string(struct sockaddr_storage ss) +{ + void* ptr; + u_int16_t port; + char* addrstr; + + switch (((struct sockaddr *)&ss)->sa_family) + { + case AF_INET: + ptr = &((struct sockaddr_in *)&ss)->sin_addr; + port = ntohs(((struct sockaddr_in *)&ss)->sin_port); + addrstr = malloc(INET_ADDRSTRLEN+1); + break; + case AF_INET6: + ptr = &((struct sockaddr_in6 *)&ss)->sin6_addr; + port = ntohs(((struct sockaddr_in6 *)&ss)->sin6_port); + addrstr = malloc(INET6_ADDRSTRLEN+1); + break; + default: + return ""; + } + inet_ntop (((struct sockaddr *)&ss)->sa_family, ptr, addrstr, 100); + char* ret; + asprintf(&ret, "%s:%d", addrstr, port); + free(addrstr); + return ret; +} + +char* udp_get_local_end_string(udp_socket_t* sock) +{ + if(!sock) + return ""; + + return udp_endpoint_to_string(sock->remote_end_); +} + +char* udp_get_remote_end_string(udp_socket_t* sock) +{ + if(!sock) + return ""; + + return udp_endpoint_to_string(sock->remote_end_); +} + int udp_read(udp_socket_t* sock, u_int8_t* buf, u_int32_t len, struct sockaddr_storage* remote_end_) { if(!sock || !remote_end_) |