ath79: rb91x: enable pcie power early (WIP)
[openwrt/staging/xback.git] / package / network / services / dropbear / patches / 011-add-option-to-bind-to-interface.patch
1 From fb64db9eac3fdc6434f2dc7b5ea407fe5df76e6f Mon Sep 17 00:00:00 2001
2 From: Diederik De Coninck <diederik.deconinck_ext@softathome.com>
3 Date: Tue, 11 Apr 2023 15:38:04 +0200
4 Subject: Add option to bind to interface
5
6 ---
7 netio.c | 13 +++++++++++--
8 netio.h | 2 +-
9 runopts.h | 1 +
10 svr-main.c | 2 +-
11 svr-runopts.c | 9 +++++++++
12 svr-tcpfwd.c | 1 +
13 tcp-accept.c | 2 +-
14 tcpfwd.h | 1 +
15 8 files changed, 26 insertions(+), 5 deletions(-)
16
17 --- a/netio.c
18 +++ b/netio.c
19 @@ -467,7 +467,7 @@ int get_sock_port(int sock) {
20 * failure, if errstring wasn't NULL, it'll be a newly malloced error
21 * string.*/
22 int dropbear_listen(const char* address, const char* port,
23 - int *socks, unsigned int sockcount, char **errstring, int *maxfd) {
24 + int *socks, unsigned int sockcount, char **errstring, int *maxfd, const char* interface) {
25
26 struct addrinfo hints, *res = NULL, *res0 = NULL;
27 int err;
28 @@ -497,7 +497,11 @@ int dropbear_listen(const char* address,
29 TRACE(("dropbear_listen: local loopback"))
30 } else {
31 if (address[0] == '\0') {
32 - TRACE(("dropbear_listen: all interfaces"))
33 + if (interface) {
34 + TRACE(("dropbear_listen: %s", interface))
35 + } else {
36 + TRACE(("dropbear_listen: all interfaces"))
37 + }
38 address = NULL;
39 }
40 hints.ai_flags = AI_PASSIVE;
41 @@ -551,6 +555,11 @@ int dropbear_listen(const char* address,
42 /* set to reuse, quick timeout */
43 setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*) &val, sizeof(val));
44
45 + if(interface && setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, interface, strlen(interface)) < 0) {
46 + dropbear_log(LOG_WARNING, "Couldn't set SO_BINDTODEVICE");
47 + TRACE(("Failed setsockopt with errno failure, %d %s", errno, strerror(errno)))
48 + }
49 +
50 #if defined(IPPROTO_IPV6) && defined(IPV6_V6ONLY)
51 if (res->ai_family == AF_INET6) {
52 int on = 1;
53 --- a/netio.h
54 +++ b/netio.h
55 @@ -19,7 +19,7 @@ void get_socket_address(int fd, char **l
56 void getaddrstring(struct sockaddr_storage* addr,
57 char **ret_host, char **ret_port, int host_lookup);
58 int dropbear_listen(const char* address, const char* port,
59 - int *socks, unsigned int sockcount, char **errstring, int *maxfd);
60 + int *socks, unsigned int sockcount, char **errstring, int *maxfd, const char* interface);
61
62 struct dropbear_progress_connection;
63
64 --- a/runopts.h
65 +++ b/runopts.h
66 @@ -128,6 +128,7 @@ typedef struct svr_runopts {
67 char * pidfile;
68
69 char * forced_command;
70 + char* interface;
71
72 #if DROPBEAR_PLUGIN
73 /* malloced */
74 --- a/svr-main.c
75 +++ b/svr-main.c
76 @@ -488,7 +488,7 @@ static size_t listensockets(int *socks,
77
78 nsock = dropbear_listen(svr_opts.addresses[i], svr_opts.ports[i], &socks[sockpos],
79 sockcount - sockpos,
80 - &errstring, maxfd);
81 + &errstring, maxfd, svr_opts.interface);
82
83 if (nsock < 0) {
84 dropbear_log(LOG_WARNING, "Failed listening on '%s': %s",
85 --- a/svr-runopts.c
86 +++ b/svr-runopts.c
87 @@ -98,6 +98,8 @@ static void printhelp(const char * progn
88 " (default port is %s if none specified)\n"
89 "-P PidFile Create pid file PidFile\n"
90 " (default %s)\n"
91 + "-l <interface>\n"
92 + " interface to bind on\n"
93 #if INETD_MODE
94 "-i Start for inetd\n"
95 #endif
96 @@ -265,6 +267,9 @@ void svr_getopts(int argc, char ** argv)
97 case 'P':
98 next = &svr_opts.pidfile;
99 break;
100 + case 'l':
101 + next = &svr_opts.interface;
102 + break;
103 #if DO_MOTD
104 /* motd is displayed by default, -m turns it off */
105 case 'm':
106 @@ -438,6 +443,10 @@ void svr_getopts(int argc, char ** argv)
107 dropbear_log(LOG_INFO, "Forced command set to '%s'", svr_opts.forced_command);
108 }
109
110 + if (svr_opts.interface) {
111 + dropbear_log(LOG_INFO, "Binding to interface '%s'", svr_opts.interface);
112 + }
113 +
114 if (reexec_fd_arg) {
115 if (m_str_to_uint(reexec_fd_arg, &svr_opts.reexec_childpipe) == DROPBEAR_FAILURE
116 || svr_opts.reexec_childpipe < 0) {
117 --- a/svr-tcpfwd.c
118 +++ b/svr-tcpfwd.c
119 @@ -205,6 +205,7 @@ static int svr_remotetcpreq(int *allocat
120 tcpinfo->listenport = port;
121 tcpinfo->chantype = &svr_chan_tcpremote;
122 tcpinfo->tcp_type = forwarded;
123 + tcpinfo->interface = svr_opts.interface;
124
125 tcpinfo->request_listenaddr = request_addr;
126 if (!opts.listen_fwd_all || (strcmp(request_addr, "localhost") == 0) ) {
127 --- a/tcp-accept.c
128 +++ b/tcp-accept.c
129 @@ -117,7 +117,7 @@ int listen_tcpfwd(struct TCPListener* tc
130 snprintf(portstring, sizeof(portstring), "%u", tcpinfo->listenport);
131
132 nsocks = dropbear_listen(tcpinfo->listenaddr, portstring, socks,
133 - DROPBEAR_MAX_SOCKS, &errstring, &ses.maxfd);
134 + DROPBEAR_MAX_SOCKS, &errstring, &ses.maxfd, tcpinfo->interface);
135 if (nsocks < 0) {
136 dropbear_log(LOG_INFO, "TCP forward failed: %s", errstring);
137 m_free(errstring);
138 --- a/tcpfwd.h
139 +++ b/tcpfwd.h
140 @@ -42,6 +42,7 @@ struct TCPListener {
141 unsigned int listenport;
142 /* The address that the remote host asked to listen on */
143 char *request_listenaddr;
144 + char* interface;
145
146 const struct ChanType *chantype;
147 enum {direct, forwarded} tcp_type;