diff --git a/src/include/networking.h b/src/include/networking.h index 20f7263..db89609 100644 --- a/src/include/networking.h +++ b/src/include/networking.h @@ -142,7 +142,7 @@ /// @retval 0 The session is offline. int (*is_connected)(const H3270 *hSession); - /// @brief get socket name. + /// @brief Get socket name. /// /// @return On success, zero is returned. On error, -1 is returned, and errno is set appropriately. /// @@ -150,6 +150,14 @@ /// @retval -1 Error (errno is set). int (*getsockname)(const H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen); + /// @brief Get name of connected peer socket. + /// + /// @return On success, zero is returned. On error, -1 is returned, and errno is set appropriately. + /// + /// @retval 0 Success. + /// @retval -1 Error (errno is set). + int (*getpeername)(const H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen); + /// @brief Set socket options. int (*setsockopt)(H3270 *hSession, int level, int optname, const void *optval, size_t optlen); diff --git a/src/network_modules/default/main.c b/src/network_modules/default/main.c index be21318..85417d7 100644 --- a/src/network_modules/default/main.c +++ b/src/network_modules/default/main.c @@ -92,6 +92,10 @@ static int unsecure_network_getsockname(const H3270 *hSession, struct sockaddr * return getsockname(hSession->network.context->sock, addr, addrlen); } +static int unsecure_network_getpeername(const H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen) { + return getpeername(hSession->network.context->sock, addr, addrlen); +} + static void * unsecure_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata) { return lib3270_add_poll_fd(hSession,hSession->network.context->sock,flag,call,userdata); } @@ -166,6 +170,7 @@ void lib3270_set_default_network_module(H3270 *hSession) { .non_blocking = unsecure_network_non_blocking, .is_connected = unsecure_network_is_connected, .getsockname = unsecure_network_getsockname, + .getpeername = unsecure_network_getpeername, .setsockopt = unsecure_network_setsockopt, .getsockopt = unsecure_network_getsockopt, .reset = unsecure_network_reset diff --git a/src/network_modules/openssl/main.c b/src/network_modules/openssl/main.c index 32cc183..a37738f 100644 --- a/src/network_modules/openssl/main.c +++ b/src/network_modules/openssl/main.c @@ -186,6 +186,10 @@ static int openssl_network_getsockname(const H3270 *hSession, struct sockaddr *a return getsockname(hSession->network.context->sock, addr, addrlen); } +static int openssl_network_getpeername(const H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen) { + return getpeername(hSession->network.context->sock, addr, addrlen); +} + static void * openssl_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata) { return lib3270_add_poll_fd(hSession,hSession->network.context->sock,flag,call,userdata); } @@ -346,6 +350,7 @@ void lib3270_set_libssl_network_module(H3270 *hSession) { .non_blocking = openssl_network_non_blocking, .is_connected = openssl_network_is_connected, .getsockname = openssl_network_getsockname, + .getpeername = openssl_network_getpeername, .setsockopt = openssl_network_setsockopt, .getsockopt = openssl_network_getsockopt, .getcert = openssl_network_getcert, diff --git a/src/network_modules/tools.c b/src/network_modules/tools.c index d67d1c7..91f16d9 100644 --- a/src/network_modules/tools.c +++ b/src/network_modules/tools.c @@ -263,3 +263,16 @@ int lib3270_socket_set_non_blocking(H3270 *hSession, int sock, const unsigned ch return EINVAL; } + + LIB3270_EXPORT int lib3270_getpeername(H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen) + { + FAIL_IF_NOT_ONLINE(hSession); + return hSession->network.module->getpeername(hSession, addr, addrlen); + } + + LIB3270_EXPORT int lib3270_getsockname(H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen) + { + FAIL_IF_NOT_ONLINE(hSession); + return hSession->network.module->getsockname(hSession, addr, addrlen); + } + -- libgit2 0.21.2