diff options
author | djm@openbsd.org <djm@openbsd.org> | 2017-10-23 05:08:00 +0000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2017-10-23 16:14:30 +1100 |
commit | b7548b12a6b2b4abf4d057192c353147e0abba08 (patch) | |
tree | dc76477cd371b6197ba840c3a178bfbcf6d7baba /openbsd-compat | |
parent | 887669ef032d63cf07f53cada216fa8a0c9a7d72 (diff) |
upstream commit
Expose devices allocated for tun/tap forwarding.
At the client, the device may be obtained from a new %T expansion
for LocalCommand.
At the server, the allocated devices will be listed in a
SSH_TUNNEL variable exposed to the environment of any user sessions
started after the tunnel forwarding was established.
ok markus
Upstream-ID: e61e53f8ae80566e9ddc0d67a5df5bdf2f3c9f9e
Diffstat (limited to 'openbsd-compat')
-rw-r--r-- | openbsd-compat/port-tun.c | 16 | ||||
-rw-r--r-- | openbsd-compat/port-tun.h | 2 |
2 files changed, 15 insertions, 3 deletions
diff --git a/openbsd-compat/port-tun.c b/openbsd-compat/port-tun.c index 7579c608..0e75c911 100644 --- a/openbsd-compat/port-tun.c +++ b/openbsd-compat/port-tun.c @@ -56,12 +56,15 @@ #include <linux/if_tun.h> int -sys_tun_open(int tun, int mode) +sys_tun_open(int tun, int mode, char **ifname) { struct ifreq ifr; int fd = -1; const char *name = NULL; + if (ifname != NULL) + *ifname = NULL; + if ((fd = open("/dev/net/tun", O_RDWR)) == -1) { debug("%s: failed to open tunnel control interface: %s", __func__, strerror(errno)); @@ -99,6 +102,9 @@ sys_tun_open(int tun, int mode) else debug("%s: %s mode %d fd %d", __func__, ifr.ifr_name, mode, fd); + if (ifname != NULL && (*ifname = strdup(ifr.ifr_name))) + goto failed; + return (fd); failed: @@ -116,13 +122,16 @@ sys_tun_open(int tun, int mode) #endif int -sys_tun_open(int tun, int mode) +sys_tun_open(int tun, int mode, char **ifname) { struct ifreq ifr; char name[100]; int fd = -1, sock, flag; const char *tunbase = "tun"; + if (ifname != NULL) + *ifname = NULL; + if (mode == SSH_TUNMODE_ETHERNET) { #ifdef SSH_TUN_NO_L2 debug("%s: no layer 2 tunnelling support", __func__); @@ -180,6 +189,9 @@ sys_tun_open(int tun, int mode) goto failed; } + if (ifname != NULL && (*ifname = strdup(ifr.ifr_name))) + goto failed; + close(sock); return (fd); diff --git a/openbsd-compat/port-tun.h b/openbsd-compat/port-tun.h index 10351437..926bc93e 100644 --- a/openbsd-compat/port-tun.h +++ b/openbsd-compat/port-tun.h @@ -22,7 +22,7 @@ struct ssh; #if defined(SSH_TUN_LINUX) || defined(SSH_TUN_FREEBSD) # define CUSTOM_SYS_TUN_OPEN -int sys_tun_open(int, int); +int sys_tun_open(int, int, char **); #endif #if defined(SSH_TUN_COMPAT_AF) || defined(SSH_TUN_PREPEND_AF) |