diff --git a/src/http.c b/src/http.c index f0eb4284..715b69f5 100644 --- a/src/http.c +++ b/src/http.c @@ -335,15 +335,12 @@ void http_error(http_connection_t *hc, int error) { const char *errtxt = http_rc2str(error); - char addrstr[50]; if (!http_server) return; - tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrstr, 50); - if (error != HTTP_STATUS_FOUND && error != HTTP_STATUS_MOVED) tvhlog(error < 400 ? LOG_INFO : LOG_ERR, "http", "%s: %s %s %s -- %d", - addrstr, http_ver2str(hc->hc_version), + hc->hc_peer_ipstr, http_ver2str(hc->hc_version), http_cmd2str(hc->hc_cmd), hc->hc_url, error); if (hc->hc_version != RTSP_VERSION_1_0) { @@ -447,10 +444,8 @@ http_access_verify_ticket(http_connection_t *hc) hc->hc_access = access_ticket_verify2(ticket_id, hc->hc_url); if (hc->hc_access == NULL) return; - char addrstr[50]; - tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrstr, 50); tvhlog(LOG_INFO, "http", "%s: using ticket %s for %s", - addrstr, ticket_id, hc->hc_url); + hc->hc_peer_ipstr, ticket_id, hc->hc_url); } /** @@ -675,7 +670,7 @@ process_request(http_connection_t *hc, htsbuf_queue_t *spill) { char *v, *argv[2]; int n, rval = -1; - uint8_t authbuf[150]; + char authbuf[150]; hc->hc_url_orig = tvh_strdupa(hc->hc_url); @@ -715,11 +710,11 @@ process_request(http_connection_t *hc, htsbuf_queue_t *spill) /* Extract authorization */ if((v = http_arg_get(&hc->hc_args, "Authorization")) != NULL) { if((n = http_tokenize(v, argv, 2, -1)) == 2) { - n = base64_decode(authbuf, argv[1], sizeof(authbuf) - 1); + n = base64_decode((uint8_t *)authbuf, argv[1], sizeof(authbuf) - 1); if (n < 0) n = 0; authbuf[n] = 0; - if((n = http_tokenize((char *)authbuf, argv, 2, ':')) == 2) { + if((n = http_tokenize(authbuf, argv, 2, ':')) == 2) { hc->hc_username = strdup(argv[0]); hc->hc_password = strdup(argv[1]); // No way to actually track this @@ -727,13 +722,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(50); - /* Not threadsafe ? */ - tcp_get_ip_str((struct sockaddr*)hc->hc_peer, hc->hc_representative, 50); - } + tcp_get_ip_str((struct sockaddr*)hc->hc_peer, authbuf, sizeof(authbuf)); + hc->hc_peer_ipstr = strdup(authbuf); + hc->hc_representative = strdup(hc->hc_username ?: authbuf); switch(hc->hc_version) { case RTSP_VERSION_1_0: @@ -752,6 +743,7 @@ process_request(http_connection_t *hc, htsbuf_queue_t *spill) break; } free(hc->hc_representative); + free(hc->hc_peer_ipstr); free(hc->hc_session); hc->hc_session = NULL; return rval; diff --git a/src/http.h b/src/http.h index 71ea02b0..17638018 100644 --- a/src/http.h +++ b/src/http.h @@ -120,6 +120,7 @@ typedef enum http_ver { typedef struct http_connection { int hc_fd; struct sockaddr_storage *hc_peer; + char *hc_peer_ipstr; struct sockaddr_storage *hc_self; char *hc_representative; diff --git a/src/satip/rtsp.c b/src/satip/rtsp.c index d9addef0..8afea294 100644 --- a/src/satip/rtsp.c +++ b/src/satip/rtsp.c @@ -787,7 +787,7 @@ rtsp_parse_cmd const char *caller; mpegts_apids_t pids, addpids, delpids; dvb_mux_conf_t *dmc; - char buf[256], addrbuf[50]; + char buf[256]; http_arg_t *arg; switch (cmd) { @@ -803,8 +803,6 @@ rtsp_parse_cmd mpegts_pid_init(&addpids); mpegts_pid_init(&delpids); - tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, sizeof(addrbuf)); - has_args = !TAILQ_EMPTY(&hc->hc_req_args); fe = atoi(http_arg_get_remove(&hc->hc_req_args, "fe")); @@ -1045,7 +1043,7 @@ play: tvhdebug("satips", "%i/%s/%d: %s from %s:%d %s", rs->frontend, rs->session, rs->stream, - caller, addrbuf, IP_PORT(*hc->hc_peer), buf); + caller, hc->hc_peer_ipstr, IP_PORT(*hc->hc_peer), buf); ok: errcode = 0; @@ -1257,11 +1255,9 @@ rtsp_process_play(http_connection_t *hc, int setup) { session_t *rs; int errcode = HTTP_STATUS_BAD_REQUEST, valid = 0, oldstate = 0, i, stream;; - char buf[256], addrbuf[50], *u = tvh_strdupa(hc->hc_url); + char buf[256], *u = tvh_strdupa(hc->hc_url); http_arg_list_t args; - tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, sizeof(addrbuf)); - http_arg_init(&args); if ((u = rtsp_check_urlbase(u)) == NULL) @@ -1285,14 +1281,14 @@ rtsp_process_play(http_connection_t *hc, int setup) errcode = HTTP_STATUS_INTERNAL; goto error; } - if (udp_connect(rs->udp_rtp, "RTP", addrbuf, rs->rtp_peer_port) || - udp_connect(rs->udp_rtcp, "RTCP", addrbuf, rs->rtp_peer_port + 1)) { + if (udp_connect(rs->udp_rtp, "RTP", hc->hc_peer_ipstr, rs->rtp_peer_port) || + udp_connect(rs->udp_rtcp, "RTCP", hc->hc_peer_ipstr, rs->rtp_peer_port + 1)) { errcode = HTTP_STATUS_INTERNAL; goto error; } } - if ((errcode = rtsp_start(hc, rs, addrbuf, valid, setup, oldstate)) < 0) + if ((errcode = rtsp_start(hc, rs, hc->hc_peer_ipstr, valid, setup, oldstate)) < 0) goto error; if (setup) { @@ -1336,11 +1332,9 @@ rtsp_process_teardown(http_connection_t *hc) char *u = tvh_strdupa(hc->hc_url); struct session *rs = NULL; http_arg_list_t args; - char addrbuf[50], session[16]; + char session[16]; int stream; - tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, sizeof(addrbuf)); - if ((u = rtsp_check_urlbase(u)) == NULL || (stream = rtsp_parse_args(hc, u)) < 0) { http_error(hc, HTTP_STATUS_BAD_REQUEST); @@ -1348,7 +1342,7 @@ rtsp_process_teardown(http_connection_t *hc) } tvhdebug("satips", "-/%s/%i: teardown from %s:%d", - hc->hc_session, stream, addrbuf, IP_PORT(*hc->hc_peer)); + hc->hc_session, stream, hc->hc_peer_ipstr, IP_PORT(*hc->hc_peer)); pthread_mutex_lock(&rtsp_lock); rs = rtsp_find_session(hc, stream); diff --git a/src/satip/server.c b/src/satip/server.c index ff610844..82567527 100644 --- a/src/satip/server.c +++ b/src/satip/server.c @@ -162,9 +162,8 @@ satip_server_http_xml(http_connection_t *hc) htsbuf_queue_flush(&q); if (devicelist == NULL || devicelist[0] == '\0') { - tcp_get_ip_str((struct sockaddr*)hc->hc_peer, buf, sizeof(buf)); tvhwarn("satips", "SAT>IP server announces an empty tuner list to a client %s (missing %s)", - buf, !tuners ? "tuner settings - global config" : "network assignment"); + hc->hc_peer_ipstr, !tuners ? "tuner settings - global config" : "network assignment"); } if (satip_server_rtsp_port != 554) diff --git a/src/webui/comet.c b/src/webui/comet.c index 4e4ff28a..423af726 100644 --- a/src/webui/comet.c +++ b/src/webui/comet.c @@ -142,16 +142,13 @@ comet_access_update(http_connection_t *hc, comet_mailbox_t *cmb) htsmsg_t *m = htsmsg_create_map(); const char *username = hc->hc_access ? (hc->hc_access->aa_username ?: "") : ""; - char addrstr[50]; htsmsg_add_str(m, "notificationClass", "accessUpdate"); - tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrstr, sizeof(addrstr)); - if (!access_noacl) htsmsg_add_str(m, "username", username); - if (addrstr[0]) - htsmsg_add_str(m, "address", addrstr); + if (hc->hc_peer_ipstr) + htsmsg_add_str(m, "address", hc->hc_peer_ipstr); htsmsg_add_u32(m, "dvr", !http_access_verify(hc, ACCESS_RECORDER)); htsmsg_add_u32(m, "admin", !http_access_verify(hc, ACCESS_ADMIN)); diff --git a/src/webui/webui.c b/src/webui/webui.c index 6e8f3769..80a8eb65 100644 --- a/src/webui/webui.c +++ b/src/webui/webui.c @@ -744,7 +744,6 @@ http_stream_service(http_connection_t *hc, service_t *service, int weight) const char *str; size_t qsize; const char *name; - char addrbuf[50]; void *tcp_id; int res = HTTP_STATUS_SERVICE; @@ -767,11 +766,9 @@ http_stream_service(http_connection_t *hc, service_t *service, int weight) profile_chain_init(&prch, pro, service); if (!profile_chain_open(&prch, NULL, 0, qsize)) { - tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, 50); - s = subscription_create_from_service(&prch, NULL, weight ?: 100, "HTTP", prch.prch_flags | SUBSCRIPTION_STREAMING, - addrbuf, + hc->hc_peer_ipstr, hc->hc_username, http_arg_get(&hc->hc_args, "User-Agent"), NULL); @@ -803,7 +800,6 @@ http_stream_mux(http_connection_t *hc, mpegts_mux_t *mm, int weight) profile_chain_t prch; size_t qsize; const char *name, *str; - char addrbuf[50]; void *tcp_id; char *p, *saveptr = NULL; mpegts_apids_t pids; @@ -847,12 +843,10 @@ http_stream_mux(http_connection_t *hc, mpegts_mux_t *mm, int weight) if (!profile_chain_raw_open(&prch, mm, qsize, 1)) { - tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, 50); - s = subscription_create_from_mux(&prch, NULL, weight ?: 10, "HTTP", prch.prch_flags | SUBSCRIPTION_STREAMING, - addrbuf, hc->hc_username, + hc->hc_peer_ipstr, hc->hc_username, http_arg_get(&hc->hc_args, "User-Agent"), NULL); if (s) { @@ -887,7 +881,6 @@ http_stream_channel(http_connection_t *hc, channel_t *ch, int weight) char *str; size_t qsize; const char *name; - char addrbuf[50]; void *tcp_id; int res = HTTP_STATUS_SERVICE; @@ -910,12 +903,10 @@ http_stream_channel(http_connection_t *hc, channel_t *ch, int weight) profile_chain_init(&prch, pro, ch); if (!profile_chain_open(&prch, NULL, 0, qsize)) { - tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, 50); - s = subscription_create_from_channel(&prch, NULL, weight ?: 100, "HTTP", prch.prch_flags | SUBSCRIPTION_STREAMING, - addrbuf, hc->hc_username, + hc->hc_peer_ipstr, hc->hc_username, http_arg_get(&hc->hc_args, "User-Agent"), NULL); @@ -1240,12 +1231,11 @@ page_dvrfile(http_connection_t *hc, const char *remain, void *opaque) pthread_mutex_lock(&global_lock); tcp_id = http_stream_preop(hc); - tcp_get_ip_str((struct sockaddr*)hc->hc_peer, range_buf, 50); sub = NULL; if (tcp_id && !hc->hc_no_output && content_len > 64*1024) { sub = subscription_create(NULL, 1, "HTTP", SUBSCRIPTION_NONE, NULL, - range_buf, hc->hc_username, + hc->hc_peer_ipstr, hc->hc_username, http_arg_get(&hc->hc_args, "User-Agent")); if (sub == NULL) { http_stream_postop(tcp_id);