1
0
mirror of https://github.com/moparisthebest/curl synced 2024-11-15 14:05:03 -05:00

tests: run the RTSP test server on a dynamic port number

To avoid port collisions.

Closes #5272
This commit is contained in:
Daniel Stenberg 2020-04-20 14:53:50 +02:00
parent 018dd775c8
commit bae87dc0d9
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
3 changed files with 77 additions and 21 deletions

View File

@ -44,6 +44,7 @@ my $ipvnum = 4; # default IP version of rtsp server
my $idnum = 1; # default rtsp server instance number my $idnum = 1; # default rtsp server instance number
my $proto = 'rtsp'; # protocol the rtsp server speaks my $proto = 'rtsp'; # protocol the rtsp server speaks
my $pidfile; # rtsp server pid file my $pidfile; # rtsp server pid file
my $portfile;
my $logfile; # rtsp server log file my $logfile; # rtsp server log file
my $srcdir; my $srcdir;
@ -58,6 +59,12 @@ while(@ARGV) {
shift @ARGV; shift @ARGV;
} }
} }
elsif($ARGV[0] eq '--portfile') {
if($ARGV[1]) {
$portfile = $ARGV[1];
shift @ARGV;
}
}
elsif($ARGV[0] eq '--logfile') { elsif($ARGV[0] eq '--logfile') {
if($ARGV[1]) { if($ARGV[1]) {
$logfile = $ARGV[1]; $logfile = $ARGV[1];
@ -107,7 +114,9 @@ if(!$logfile) {
$logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum); $logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum);
} }
$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" "; $flags .= "--pidfile \"$pidfile\" ".
"--portfile \"$portfile\" ".
"--logfile \"$logfile\" ";
$flags .= "--ipv$ipvnum --port $port --srcdir \"$srcdir\""; $flags .= "--ipv$ipvnum --port $port --srcdir \"$srcdir\"";
exec("server/rtspd".exe_ext('SRV')." $flags"); exec("server/rtspd".exe_ext('SRV')." $flags");

View File

@ -2025,7 +2025,6 @@ sub runtftpserver {
# #
sub runrtspserver { sub runrtspserver {
my ($verbose, $ipv6) = @_; my ($verbose, $ipv6) = @_;
my $port = $RTSPPORT;
my $ip = $HOSTIP; my $ip = $HOSTIP;
my $proto = 'rtsp'; my $proto = 'rtsp';
my $ipvnum = 4; my $ipvnum = 4;
@ -2039,13 +2038,13 @@ sub runrtspserver {
if($ipv6) { if($ipv6) {
# if IPv6, use a different setup # if IPv6, use a different setup
$ipvnum = 6; $ipvnum = 6;
$port = $RTSP6PORT;
$ip = $HOST6IP; $ip = $HOST6IP;
} }
$server = servername_id($proto, $ipvnum, $idnum); $server = servername_id($proto, $ipvnum, $idnum);
$pidfile = $serverpidfile{$server}; $pidfile = $serverpidfile{$server};
my $portfile = $serverportfile{$server};
# don't retry if the server doesn't work # don't retry if the server doesn't work
if ($doesntrun{$pidfile}) { if ($doesntrun{$pidfile}) {
@ -2063,9 +2062,11 @@ sub runrtspserver {
$logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum); $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
$flags .= "--verbose " if($debugprotocol); $flags .= "--verbose " if($debugprotocol);
$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" "; $flags .= "--pidfile \"$pidfile\" ".
"--portfile \"$portfile\" ".
"--logfile \"$logfile\" ";
$flags .= "--id $idnum " if($idnum > 1); $flags .= "--id $idnum " if($idnum > 1);
$flags .= "--ipv$ipvnum --port $port --srcdir \"$srcdir\""; $flags .= "--ipv$ipvnum --port 0 --srcdir \"$srcdir\"";
my $cmd = "$perl $srcdir/rtspserver.pl $flags"; my $cmd = "$perl $srcdir/rtspserver.pl $flags";
my ($rtsppid, $pid2) = startnew($cmd, $pidfile, 15, 0); my ($rtsppid, $pid2) = startnew($cmd, $pidfile, 15, 0);
@ -2079,6 +2080,8 @@ sub runrtspserver {
return (0,0); return (0,0);
} }
my $port = pidfromfile($portfile);
# Server is up. Verify that we can speak to it. # Server is up. Verify that we can speak to it.
my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port); my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
if(!$pid3) { if(!$pid3) {
@ -2092,12 +2095,12 @@ sub runrtspserver {
$pid2 = $pid3; $pid2 = $pid3;
if($verbose) { if($verbose) {
logmsg "RUN: $srvrname server is now running PID $rtsppid\n"; logmsg "RUN: $srvrname server PID $rtsppid port $port\n";
} }
sleep(1); sleep(1);
return ($rtsppid, $pid2); return ($rtsppid, $pid2, $port);
} }
@ -3154,14 +3157,10 @@ sub checksystem {
if($verbose) { if($verbose) {
logmsg "* Ports: "; logmsg "* Ports: ";
logmsg sprintf("RTSP/%d ", $RTSPPORT);
if($stunnel) { if($stunnel) {
logmsg sprintf("FTPS/%d ", $FTPSPORT); logmsg sprintf("FTPS/%d ", $FTPSPORT);
logmsg sprintf("HTTPS/%d ", $HTTPSPORT); logmsg sprintf("HTTPS/%d ", $HTTPSPORT);
} }
if($http_ipv6) {
logmsg sprintf("RTSP-IPv6/%d ", $RTSP6PORT);
}
logmsg sprintf("\n* SSH/%d ", $SSHPORT); logmsg sprintf("\n* SSH/%d ", $SSHPORT);
if($httptlssrv) { if($httptlssrv) {
logmsg sprintf("HTTPTLS/%d ", $HTTPTLSPORT); logmsg sprintf("HTTPTLS/%d ", $HTTPTLSPORT);
@ -4718,7 +4717,7 @@ sub startservers {
stopserver('rtsp'); stopserver('rtsp');
} }
if(!$run{'rtsp'}) { if(!$run{'rtsp'}) {
($pid, $pid2) = runrtspserver($verbose); ($pid, $pid2, $RTSPPORT) = runrtspserver($verbose);
if($pid <= 0) { if($pid <= 0) {
return "failed starting RTSP server"; return "failed starting RTSP server";
} }
@ -4732,7 +4731,7 @@ sub startservers {
stopserver('rtsp-ipv6'); stopserver('rtsp-ipv6');
} }
if(!$run{'rtsp-ipv6'}) { if(!$run{'rtsp-ipv6'}) {
($pid, $pid2) = runrtspserver($verbose, "ipv6"); ($pid, $pid2, $RTSP6PORT) = runrtspserver($verbose, "ipv6");
if($pid <= 0) { if($pid <= 0) {
return "failed starting RTSP-IPv6 server"; return "failed starting RTSP-IPv6 server";
} }
@ -5446,8 +5445,6 @@ $minport = $base; # original base port number
$HTTPSPORT = $base++; # HTTPS (stunnel) server port $HTTPSPORT = $base++; # HTTPS (stunnel) server port
$FTPSPORT = $base++; # FTPS (stunnel) server port $FTPSPORT = $base++; # FTPS (stunnel) server port
$SSHPORT = $base++; # SSH (SCP/SFTP) port $SSHPORT = $base++; # SSH (SCP/SFTP) port
$RTSPPORT = $base++; # RTSP server port
$RTSP6PORT = $base++; # RTSP IPv6 server port
$HTTPTLSPORT = $base++; # HTTP TLS (non-stunnel) server port $HTTPTLSPORT = $base++; # HTTP TLS (non-stunnel) server port
$HTTPTLS6PORT = $base++; # HTTP TLS (non-stunnel) IPv6 server port $HTTPTLS6PORT = $base++; # HTTP TLS (non-stunnel) IPv6 server port
$HTTP2PORT = $base++; # HTTP/2 port $HTTP2PORT = $base++; # HTTP/2 port

View File

@ -1049,6 +1049,7 @@ int main(int argc, char *argv[])
int flag; int flag;
unsigned short port = DEFAULT_PORT; unsigned short port = DEFAULT_PORT;
const char *pidname = ".rtsp.pid"; const char *pidname = ".rtsp.pid";
const char *portfile = NULL;
struct httprequest req; struct httprequest req;
int rc; int rc;
int error; int error;
@ -1075,6 +1076,11 @@ int main(int argc, char *argv[])
if(argc>arg) if(argc>arg)
pidname = argv[arg++]; pidname = argv[arg++];
} }
else if(!strcmp("--portfile", argv[arg])) {
arg++;
if(argc>arg)
portfile = argv[arg++];
}
else if(!strcmp("--logfile", argv[arg])) { else if(!strcmp("--logfile", argv[arg])) {
arg++; arg++;
if(argc>arg) if(argc>arg)
@ -1099,12 +1105,6 @@ int main(int argc, char *argv[])
if(argc>arg) { if(argc>arg) {
char *endptr; char *endptr;
unsigned long ulnum = strtoul(argv[arg], &endptr, 10); unsigned long ulnum = strtoul(argv[arg], &endptr, 10);
if((endptr != argv[arg] + strlen(argv[arg])) ||
(ulnum < 1025UL) || (ulnum > 65535UL)) {
fprintf(stderr, "rtspd: invalid --port argument (%s)\n",
argv[arg]);
return 0;
}
port = curlx_ultous(ulnum); port = curlx_ultous(ulnum);
arg++; arg++;
} }
@ -1121,6 +1121,7 @@ int main(int argc, char *argv[])
" --version\n" " --version\n"
" --logfile [file]\n" " --logfile [file]\n"
" --pidfile [file]\n" " --pidfile [file]\n"
" --portfile [file]\n"
" --ipv4\n" " --ipv4\n"
" --ipv6\n" " --ipv6\n"
" --port [port]\n" " --port [port]\n"
@ -1188,6 +1189,49 @@ int main(int argc, char *argv[])
goto server_cleanup; goto server_cleanup;
} }
if(!port) {
/* The system was supposed to choose a port number, figure out which
port we actually got and update the listener port value with it. */
curl_socklen_t la_size;
srvr_sockaddr_union_t localaddr;
#ifdef ENABLE_IPV6
if(!use_ipv6)
#endif
la_size = sizeof(localaddr.sa4);
#ifdef ENABLE_IPV6
else
la_size = sizeof(localaddr.sa6);
#endif
memset(&localaddr.sa, 0, (size_t)la_size);
if(getsockname(sock, &localaddr.sa, &la_size) < 0) {
error = SOCKERRNO;
logmsg("getsockname() failed with error: (%d) %s",
error, strerror(error));
sclose(sock);
goto server_cleanup;
}
switch(localaddr.sa.sa_family) {
case AF_INET:
port = ntohs(localaddr.sa4.sin_port);
break;
#ifdef ENABLE_IPV6
case AF_INET6:
port = ntohs(localaddr.sa6.sin6_port);
break;
#endif
default:
break;
}
if(!port) {
/* Real failure, listener port shall not be zero beyond this point. */
logmsg("Apparently getsockname() succeeded, with listener port zero.");
logmsg("A valid reason for this failure is a binary built without");
logmsg("proper network library linkage. This might not be the only");
logmsg("reason, but double check it before anything else.");
sclose(sock);
goto server_cleanup;
}
}
logmsg("Running %s version on port %d", ipv_inuse, (int)port); logmsg("Running %s version on port %d", ipv_inuse, (int)port);
/* start accepting connections */ /* start accepting connections */
@ -1208,6 +1252,12 @@ int main(int argc, char *argv[])
if(!wrotepidfile) if(!wrotepidfile)
goto server_cleanup; goto server_cleanup;
if(portfile) {
wrotepidfile = write_portfile(portfile, port);
if(!wrotepidfile)
goto server_cleanup;
}
for(;;) { for(;;) {
msgsock = accept(sock, NULL, NULL); msgsock = accept(sock, NULL, NULL);