Skip to content

Commit

Permalink
Merge changes from patch branch back to main.
Browse files Browse the repository at this point in the history
  • Loading branch information
mike-jumper committed Aug 30, 2024
2 parents a95e66c + 8d84245 commit 13868fa
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 20 deletions.
2 changes: 1 addition & 1 deletion bin/guacctl
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ error() {
##
usage() {
cat >&2 <<END
guacctl 1.5.5, Apache Guacamole terminal session control utility.
guacctl 1.6.0, Apache Guacamole terminal session control utility.
Usage: guacctl [OPTION] [FILE or NAME]...
-d, --download download each of the files listed.
Expand Down
2 changes: 1 addition & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#

AC_PREREQ([2.61])
AC_INIT([guacamole-server], [1.5.5])
AC_INIT([guacamole-server], [1.6.0])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
AM_SILENT_RULES([yes])
Expand Down
75 changes: 57 additions & 18 deletions src/libguac/tcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,7 @@ int guac_tcp_connect(const char* hostname, const char* port, const int timeout)
}

/* Attempt connection to each address until success */
current_address = addresses;
while (current_address != NULL) {
for (current_address = addresses; current_address != NULL; current_address = current_address->ai_next) {

/* Resolve hostname */
if ((retval = getnameinfo(current_address->ai_addr,
Expand All @@ -69,40 +68,80 @@ int guac_tcp_connect(const char* hostname, const char* port, const int timeout)
continue;
}

/* Get socket */
/* Get socket or return the error. */
fd = socket(current_address->ai_family, SOCK_STREAM, 0);
if (fd < 0) {
freeaddrinfo(addresses);
return fd;
}

/* Set socket to non-blocking */
fcntl(fd, F_SETFL, O_NONBLOCK);
/* Variable to store current socket options. */
int opt;

/* Get current socket options */
if ((opt = fcntl(fd, F_GETFL, NULL)) < 0) {
guac_error = GUAC_STATUS_INVALID_ARGUMENT;
guac_error_message = "Failed to retrieve socket options.";
close(fd);
continue;
}

/* Set up timeout. */
fd_set fdset;
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
/* Set socket to non-blocking */
if (fcntl(fd, F_SETFL, opt | O_NONBLOCK) < 0) {
guac_error = GUAC_STATUS_INVALID_ARGUMENT;
guac_error_message = "Failed to set non-blocking socket.";
close(fd);
continue;
}

/* Structure that stores our timeout setting. */
struct timeval tv;
tv.tv_sec = timeout;
tv.tv_usec = 0;

/* Connect and wait for timeout */
if (connect(fd, current_address->ai_addr, current_address->ai_addrlen) < 0) {
guac_error = GUAC_STATUS_REFUSED;
guac_error_message = "Unable to connect via socket.";
close(fd);
break;
if ((retval = connect(fd, current_address->ai_addr, current_address->ai_addrlen)) < 0) {
if (errno == EINPROGRESS) {
/* Set up timeout. */
fd_set fdset;
FD_ZERO(&fdset);
FD_SET(fd, &fdset);

retval = select(fd + 1, NULL, &fdset, NULL, &tv);
}

else {
guac_error = GUAC_STATUS_REFUSED;
guac_error_message = "Unable to connect via socket.";
close(fd);
continue;
}
}

/* Check for the connection and break if successful */
if (select(fd + 1, NULL, &fdset, NULL, &tv) > 0)
/* Successful connection */
if (retval > 0) {
/* Restore previous socket options. */
if (fcntl(fd, F_SETFL, opt) < 0) {
guac_error = GUAC_STATUS_INVALID_ARGUMENT;
guac_error_message = "Failed to reset socket options.";
close(fd);
continue;
}

break;
}

if (retval == 0) {
guac_error = GUAC_STATUS_REFUSED;
guac_error_message = "Timeout connecting via socket.";
}
else {
guac_error = GUAC_STATUS_INVALID_ARGUMENT;
guac_error_message = "Error attempting to connect via socket.";
}

/* Connection not successful - free resources and go to the next address. */
/* Some error has occurred - free resources before next iteration. */
close(fd);
current_address = current_address->ai_next;

}

Expand Down

0 comments on commit 13868fa

Please sign in to comment.