diff --git a/src/http.c b/src/http.c index 610e72e3..c668a02f 100644 --- a/src/http.c +++ b/src/http.c @@ -247,9 +247,12 @@ void http_error(http_connection_t *hc, int error) { const char *errtxt = http_rc2str(error); + char *addrstr = (char*)malloc(50); + tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrstr, 50); tvhlog(LOG_ERR, "HTTP", "%s: %s -- %d", - inet_ntoa(hc->hc_peer->sin_addr), hc->hc_url, error); + addrstr, hc->hc_url, error); + free(addrstr); htsbuf_queue_flush(&hc->hc_reply); @@ -315,10 +318,13 @@ http_access_verify(http_connection_t *hc, int mask) { const char *ticket_id = http_arg_get(&hc->hc_req_args, "ticket"); - if(!access_ticket_verify(ticket_id, hc->hc_url)) { + if(!access_ticket_verify(ticket_id, hc->hc_url)) + { + char *addrstr = (char*)malloc(50); + tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrstr, 50); tvhlog(LOG_INFO, "HTTP", "%s: using ticket %s for %s", - inet_ntoa(hc->hc_peer->sin_addr), ticket_id, - hc->hc_url); + addrstr, ticket_id, hc->hc_url); + free(addrstr); return 0; } @@ -504,11 +510,9 @@ process_request(http_connection_t *hc, htsbuf_queue_t *spill) if(hc->hc_username != NULL) { hc->hc_representative = strdup(hc->hc_username); } else { - hc->hc_representative = malloc(30); + hc->hc_representative = malloc(50); /* Not threadsafe ? */ - snprintf(hc->hc_representative, 30, - "%s", inet_ntoa(hc->hc_peer->sin_addr)); - + tcp_get_ip_str((struct sockaddr*)hc->hc_peer, hc->hc_representative, 50); } switch(hc->hc_version) { @@ -777,8 +781,8 @@ http_serve_requests(http_connection_t *hc, htsbuf_queue_t *spill) * */ static void -http_serve(int fd, void *opaque, struct sockaddr_in *peer, - struct sockaddr_in *self) +http_serve(int fd, void *opaque, struct sockaddr_storage *peer, + struct sockaddr_storage *self) { htsbuf_queue_t spill; http_connection_t hc; diff --git a/src/http.h b/src/http.h index 2a29b8a9..9e3d061c 100644 --- a/src/http.h +++ b/src/http.h @@ -39,8 +39,8 @@ typedef struct http_arg { typedef struct http_connection { int hc_fd; - struct sockaddr_in *hc_peer; - struct sockaddr_in *hc_self; + struct sockaddr_storage *hc_peer; + struct sockaddr_storage *hc_self; char *hc_representative; char *hc_url; diff --git a/src/tcp.c b/src/tcp.c index 84313663..3653e8b2 100644 --- a/src/tcp.c +++ b/src/tcp.c @@ -344,6 +344,31 @@ tcp_read_timeout(int fd, void *buf, size_t len, int timeout) } +/** + * + */ +char * +tcp_get_ip_str(const struct sockaddr *sa, char *s, size_t maxlen) +{ + if(sa == NULL || s == NULL) + return NULL; + + switch(sa->sa_family) + { + case AF_INET: + inet_ntop(AF_INET, &(((struct sockaddr_in*)sa)->sin_addr), s, maxlen); + break; + case AF_INET6: + inet_ntop(AF_INET6, &(((struct sockaddr_in6*)sa)->sin6_addr), s, maxlen); + break; + default: + strncpy(s, "Unknown AF", maxlen); + return NULL; + } + + return s; +} + /** * */ diff --git a/src/tcp.h b/src/tcp.h index b7a7c876..187a9d57 100644 --- a/src/tcp.h +++ b/src/tcp.h @@ -44,4 +44,6 @@ int tcp_write_queue(int fd, htsbuf_queue_t *q); int tcp_read_timeout(int fd, void *buf, size_t len, int timeout); +char *tcp_get_ip_str(const struct sockaddr *sa, char *s, size_t maxlen); + #endif /* TCP_H_ */