| /* |
| * Generic code for native (BSD-compatible) sockets |
| * |
| * Copyright 2000-2020 Willy Tarreau <w@1wt.eu> |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation; either version |
| * 2 of the License, or (at your option) any later version. |
| * |
| */ |
| |
| #include <ctype.h> |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <time.h> |
| |
| #include <sys/param.h> |
| #include <sys/socket.h> |
| #include <sys/types.h> |
| |
| #include <haproxy/api.h> |
| #include <haproxy/connection.h> |
| #include <haproxy/namespace.h> |
| #include <haproxy/sock.h> |
| #include <haproxy/tools.h> |
| |
| |
| /* Create a socket to connect to the server in conn->dst (which MUST be valid), |
| * using the configured namespace if needed, or the one passed by the proxy |
| * protocol if required to do so. It ultimately calls socket() or socketat() |
| * and returns the FD or error code. |
| */ |
| int sock_create_server_socket(struct connection *conn) |
| { |
| const struct netns_entry *ns = NULL; |
| |
| #ifdef USE_NS |
| if (objt_server(conn->target)) { |
| if (__objt_server(conn->target)->flags & SRV_F_USE_NS_FROM_PP) |
| ns = conn->proxy_netns; |
| else |
| ns = __objt_server(conn->target)->netns; |
| } |
| #endif |
| return my_socketat(ns, conn->dst->ss_family, SOCK_STREAM, 0); |
| } |
| |
| /* |
| * Retrieves the source address for the socket <fd>, with <dir> indicating |
| * if we're a listener (=0) or an initiator (!=0). It returns 0 in case of |
| * success, -1 in case of error. The socket's source address is stored in |
| * <sa> for <salen> bytes. |
| */ |
| int sock_get_src(int fd, struct sockaddr *sa, socklen_t salen, int dir) |
| { |
| if (dir) |
| return getsockname(fd, sa, &salen); |
| else |
| return getpeername(fd, sa, &salen); |
| } |
| |
| /* |
| * Retrieves the original destination address for the socket <fd>, with <dir> |
| * indicating if we're a listener (=0) or an initiator (!=0). It returns 0 in |
| * case of success, -1 in case of error. The socket's source address is stored |
| * in <sa> for <salen> bytes. |
| */ |
| int sock_get_dst(int fd, struct sockaddr *sa, socklen_t salen, int dir) |
| { |
| if (dir) |
| return getpeername(fd, sa, &salen); |
| else |
| return getsockname(fd, sa, &salen); |
| } |
| |
| /* |
| * Local variables: |
| * c-indent-level: 8 |
| * c-basic-offset: 8 |
| * End: |
| */ |