--- src/libcharon/plugins/socket_default/socket_default_socket.c.orig 2020-09-14 00:44:03.000000000 +0700 +++ src/libcharon/plugins/socket_default/socket_default_socket.c 2022-10-06 03:54:04.472789000 +0700 @@ -430,6 +430,7 @@ static ssize_t send_msg_v4(private_socke struct in_addr *addr; struct sockaddr_in *sin; + if (getenv("STRONGSWAN_BIND") == NULL) { msg->msg_control = buf; msg->msg_controllen = sizeof(buf); cmsg = CMSG_FIRSTHDR(msg); @@ -441,6 +442,7 @@ static ssize_t send_msg_v4(private_socke sin = (struct sockaddr_in*)src->get_sockaddr(src); memcpy(addr, &sin->sin_addr, sizeof(struct in_addr)); + } return send_msg_generic(skt, msg); } @@ -663,6 +665,7 @@ static int open_socket(private_socket_de socklen_t addrlen; u_int sol, pktinfo = 0; int skt; + char *s; memset(&addr, 0, sizeof(addr)); addr.sockaddr.sa_family = family; @@ -670,7 +673,9 @@ static int open_socket(private_socket_de switch (family) { case AF_INET: - addr.sin.sin_addr.s_addr = htonl(INADDR_ANY); + s = getenv("STRONGSWAN_BIND"); + if (s == NULL || inet_pton(AF_INET, s, &addr.sin.sin_addr) == 0) + addr.sin.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin.sin_port = htons(*port); addrlen = sizeof(addr.sin); sol = SOL_IP; --- src/libcharon/plugins/socket_dynamic/socket_dynamic_socket.c.orig 2020-09-14 00:44:03.000000000 +0700 +++ src/libcharon/plugins/socket_dynamic/socket_dynamic_socket.c 2022-10-06 03:55:05.904883000 +0700 @@ -379,12 +379,16 @@ static int open_socket(private_socket_dy socklen_t addrlen; u_int sol, pktinfo = 0; int fd; + char *s; memset(&addr, 0, sizeof(addr)); /* precalculate constants depending on address family */ switch (family) { case AF_INET: + s = getenv("STRONGSWAN_BIND"); + if (s == NULL || inet_pton(AF_INET, s, &addr.sin.sin_addr) == 0) + addr.sin.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin.sin_family = AF_INET; addr.sin.sin_addr.s_addr = INADDR_ANY; addr.sin.sin_port = htons(*port); @@ -543,6 +547,7 @@ static ssize_t send_msg_v4(int skt, stru struct in_pktinfo *pktinfo; struct sockaddr_in *sin; + if (getenv("STRONGSWAN_BIND") == NULL) { msg->msg_control = buf; msg->msg_controllen = sizeof(buf); cmsg = CMSG_FIRSTHDR(msg); @@ -555,6 +560,7 @@ static ssize_t send_msg_v4(int skt, stru sin = (struct sockaddr_in*)src->get_sockaddr(src); memcpy(addr, &sin->sin_addr, sizeof(struct in_addr)); + } return send_msg_generic(skt, msg); }