/*
*
*/
-static inline char *
-rtsp_conn_ip(http_connection_t *hc, char *buf, size_t buflen, int *port)
+static inline const char *
+rtsp_conn_ip(http_connection_t *hc, int *port)
{
- char *used_ip = rtsp_ip;
+ const char *used_ip = rtsp_ip;
int used_port = rtsp_port;
+ struct sockaddr_storage self;
if (rtsp_nat_ip[0] == '\0')
goto end;
- if (satip_server_conf.satip_nat_name_force ||
- !ip_check_is_local_address(hc->hc_peer, hc->hc_self)) {
+ self = *hc->hc_self;
+ /* note: call ip_check at first to initialize self (ip any) */
+ if (!ip_check_is_local_address(hc->hc_peer, hc->hc_self, &self) ||
+ satip_server_conf.satip_nat_name_force) {
used_ip = rtsp_nat_ip;
if (rtsp_nat_port > 0)
used_port = rtsp_nat_port;
}
if (used_ip[0] == '*' || used_ip[0] == '\0' || used_ip == NULL) {
- tcp_get_str_from_ip(hc->hc_self, buf, buflen);
- used_ip = buf;
+ used_ip = "127.0.0.1";
}
end:
char *u = tvh_strdupa(hc->hc_url);
session_t *rs;
htsbuf_queue_t q;
- char buf[96], buf1[46], *used_ip = NULL;
+ char buf[96];
+ const char *used_ip = NULL;
int r = HTTP_STATUS_BAD_REQUEST;
int stream, first = 1, valid, used_port;
http_arg_init(&args);
if (hc->hc_session)
http_arg_set(&args, "Session", hc->hc_session);
- used_ip = rtsp_conn_ip(hc, buf1, sizeof(buf1), &used_port);
+ used_ip = rtsp_conn_ip(hc, &used_port);
if ((stream > 0) && (used_port != 554))
snprintf(buf, sizeof(buf), "rtsp://%s:%d/stream=%i", used_ip, used_port, stream);
else if ((stream > 0) && (used_port == 554))
{
session_t *rs;
int errcode = HTTP_STATUS_BAD_REQUEST, valid = 0, i, stream, used_port;
- char buf[256], buf1[46], *u = tvh_strdupa(hc->hc_url), *used_ip = NULL;
+ char buf[256], *u = tvh_strdupa(hc->hc_url);
+ const char *used_ip = NULL;
http_arg_list_t args;
http_arg_init(&args);
snprintf(buf, sizeof(buf), "%d", rs->stream);
http_arg_set(&args, "com.ses.streamID", buf);
} else {
- used_ip = rtsp_conn_ip(hc, buf1, sizeof(buf1), &used_port);
+ used_ip = rtsp_conn_ip(hc, &used_port);
if (used_port != 554)
snprintf(buf, sizeof(buf), "url=rtsp://%s:%d/stream=%d", used_ip, used_port, rs->stream);
else
*/
int
ip_check_is_local_address
- (const struct sockaddr_storage *peer, const struct sockaddr_storage *local)
+ (const struct sockaddr_storage *peer, const struct sockaddr_storage *local,
+ struct sockaddr_storage *used_local)
{
struct ifaddrs *iflist, *ifdev = NULL;
struct sockaddr_storage *ifaddr, *ifnetmask;
if (ifaddr->ss_family != local->ss_family) continue;
if (!any_address && !ip_check_equal(ifaddr, local)) continue;
ret = !!ip_check_in_network_v4(ifaddr, ifnetmask, peer);
+ if (ret) {
+ if (used_local)
+ memcpy(used_local, ifaddr, sizeof(struct sockaddr));
+ break;
+ }
}
freeifaddrs(iflist);
return ret;
{ return address->ss_family == AF_INET ? ip_check_is_any_v4(address) :
(address->ss_family == AF_INET6 ? ip_check_is_any_v6(address) : 0); }
-int ip_check_is_local_address(const struct sockaddr_storage *peer, const struct sockaddr_storage *local);
+int ip_check_is_local_address(const struct sockaddr_storage *peer,
+ const struct sockaddr_storage *local,
+ struct sockaddr_storage *used_local);
int socket_set_dscp(int sockfd, uint32_t dscp, char *errbuf, size_t errbufsize);