]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Make http server IPv6 ready
authorBtbN <btbn@btbn.de>
Tue, 15 Jan 2013 02:05:21 +0000 (03:05 +0100)
committerBtbN <btbn@btbn.de>
Tue, 15 Jan 2013 02:05:21 +0000 (03:05 +0100)
src/http.c
src/http.h
src/tcp.c
src/tcp.h

index 610e72e3177f6eee8e5b7de1b9724a0af0d111b5..c668a02f42b25c95bb0d1ac76eedfadfbd936075 100644 (file)
@@ -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;
index 2a29b8a9fbaa66c9b074100cbc9cf397dfe5a32a..9e3d061c0413fd7c5cbe36b8721c4e63805e58c1 100644 (file)
@@ -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;
index 84313663ee09d1a4d80d795de0be90f17066743f..3653e8b2c6768a0e8ab9ae0ad5fb4abf7b9fb6be 100644 (file)
--- 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;
+}
+
 /**
  *
  */
index b7a7c8762173e1c26332f527e2be1626311d27c3..187a9d5765fc41b50193deb890c39d046cd430e8 100644 (file)
--- 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_ */