Files
ports/multimedia/motion/files/patch-netcam.c
Jason E. Hale 0a3f2e2222 - Fix an issue where netcams were not connecting [1]
- When motion was updated to 4.x, it was overlooked that the default
  search path for the configuration files was changed. This was causing
  existing configurations to not be read. Fix the port to install
  default configuration in correct location and add an UPDATING message
  giving users the proper instructions on where to place their existing
  conf files. [2]
- Create an empty ${ETCDIR}/conf.d directory that can optionally be used
  to dump camera configs in instead of creating separate lines for each
  one in motion.conf
- Add some missing PORTDOCS and install with the correct mode
- Make the VIDEO options OPTIONS_RADIO instead of OPTIONS_SINGLE to
  allow for netcam only support (suggested in [2])
- Fix bad logic in configure.ac that was causing V4L to not be dectected
  when the PWCBSD option was enabled

PR:		216189 [1]
Reported by:	Charles P <charlespigott@googlemail.com>
Patched by:	<anthony@ury.org.uk>
Obtained from:	upstream
PR:		216466 [2]
Reported by:	<bakhur@inbox.ru>, tdb@
Pointy hat to:	jhale
MFH:		2017Q1 (blanket)
2017-01-30 00:09:53 +00:00

58 lines
2.0 KiB
C

Fix netcam getaddrinfo/connect usage (Fixed upstream in be2328a)
--- netcam.c.orig 2016-10-25 01:39:24 UTC
+++ netcam.c
@@ -840,8 +840,7 @@ static void netcam_disconnect(netcam_con
*/
static int netcam_connect(netcam_context_ptr netcam, int err_flag)
{
- struct sockaddr_in6 server; /* For connect */
- struct addrinfo *ai; /* For getaddrinfo */
+ struct addrinfo *ai;
int ret;
int saveflags;
int back_err;
@@ -851,8 +850,11 @@ static int netcam_connect(netcam_context
fd_set fd_w;
struct timeval selecttime;
+ char port[15];
+ sprintf(port,"%u",netcam->connect_port);
+
/* Lookup the hostname given in the netcam URL. */
- if ((ret = getaddrinfo(netcam->connect_host, NULL, NULL, &ai)) != 0) {
+ if ((ret = getaddrinfo(netcam->connect_host, port, NULL, &ai)) != 0) {
if (!err_flag)
MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, "%s: getaddrinfo() failed (%s): %s",
netcam->connect_host, gai_strerror(ret));
@@ -920,16 +922,6 @@ static int netcam_connect(netcam_context
netcam->sock);
/*
- * Fill the hostname details into the 'server' structure and
- * attempt to connect to the remote server.
- */
- memset(&server, 0, sizeof(server));
- memcpy(&server, ai->ai_addr, sizeof(server));
- server.sin6_family = ai->ai_family;
- server.sin6_port = htons(netcam->connect_port);
- freeaddrinfo(ai);
-
- /*
* We set the socket non-blocking and then use a 'select'
* system call to control the timeout.
*/
@@ -948,9 +940,11 @@ static int netcam_connect(netcam_context
}
/* Now the connect call will return immediately. */
- ret = connect(netcam->sock, &server, sizeof(server));
+ ret = connect(netcam->sock, ai->ai_addr, ai->ai_addrlen);
back_err = errno; /* Save the errno from connect */
+ freeaddrinfo(ai);
+
/* If the connect failed with anything except EINPROGRESS, error. */
if ((ret < 0) && (back_err != EINPROGRESS)) {
if (!err_flag)