On 4/18/23 11:45 AM, Stanislav Fomichev wrote:
+
+int get_socket_local_port(int family, int sock_fd, __u16 *out_port)
+{
+ socklen_t addr_len;
+ int err;
Sorry for keeping bikeshedding this part, but if you're going to do
another respin, we can also drop the family argument:
int get_socket_local_port(int sock_fd, __be16 *out_port)
/* ^^ maybe also do be16? */
I would also just return the port as the return value instead of having another
arg for this. The int is more than enough.
{
struct sockaddr_storage addr;
socklen_t addrlen;
addrlen = sizeof(addr);
getsockname(sock_fd, (struct sockaddr *)&addr, &addrlen);
if (addr.ss_family == AF_INET) {
} else if () {
}
}
+
+ if (family == AF_INET) {
+ struct sockaddr_in addr = {};
+
+ addr_len = sizeof(addr);
+ err = getsockname(sock_fd, (struct sockaddr *)&addr, &addr_len);
+ if (err < 0)
+ return err;
+ *out_port = addr.sin_port;
+ return 0;
+ } else if (family == AF_INET6) {
+ struct sockaddr_in6 addr = {};
+
+ addr_len = sizeof(addr);
+ err = getsockname(sock_fd, (struct sockaddr *)&addr, &addr_len);
+ if (err < 0)
+ return err;
+ *out_port = addr.sin6_port;
+ return 0;
+ }
+
+ return -1;
+}