]> andersk Git - openssh.git/blobdiff - channels.c
- reyk@cvs.openbsd.org 2009/10/28 16:38:18
[openssh.git] / channels.c
index 22e7f628b0302bf5f0418d1cfbc05457ffd3a128..884c14c992799c4bf0ec44057939f0af169127ba 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.c,v 1.296 2009/05/25 06:48:00 andreas Exp $ */
+/* $OpenBSD: channels.c,v 1.297 2009/10/28 16:38:18 reyk Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -162,6 +162,9 @@ static u_int x11_fake_data_len;
 /* AF_UNSPEC or AF_INET or AF_INET6 */
 static int IPv4or6 = AF_UNSPEC;
 
+/* Set the routing domain a.k.a. VRF */
+static int channel_rdomain = -1;
+
 /* helper */
 static void port_open_helper(Channel *c, char *rtype);
 
@@ -2461,6 +2464,12 @@ channel_set_af(int af)
        IPv4or6 = af;
 }
 
+void
+channel_set_rdomain(int rdomain)
+{
+       channel_rdomain = rdomain;
+}
+
 static int
 channel_setup_fwd_listener(int type, const char *listen_addr,
     u_short listen_port, int *allocated_listen_port,
@@ -2569,7 +2578,8 @@ channel_setup_fwd_listener(int type, const char *listen_addr,
                        continue;
                }
                /* Create a port to listen for the host. */
-               sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+               sock = socket_rdomain(ai->ai_family, ai->ai_socktype,
+                   ai->ai_protocol, channel_rdomain);
                if (sock < 0) {
                        /* this is no error since kernel may not support ipv6 */
                        verbose("socket: %.100s", strerror(errno));
@@ -2910,8 +2920,9 @@ connect_next(struct channel_connect *cctx)
                        error("connect_next: getnameinfo failed");
                        continue;
                }
-               if ((sock = socket(cctx->ai->ai_family, cctx->ai->ai_socktype,
-                   cctx->ai->ai_protocol)) == -1) {
+               if ((sock = socket_rdomain(cctx->ai->ai_family,
+                   cctx->ai->ai_socktype, cctx->ai->ai_protocol,
+                   channel_rdomain)) == -1) {
                        if (cctx->ai->ai_next == NULL)
                                error("socket: %.100s", strerror(errno));
                        else
@@ -3097,8 +3108,8 @@ x11_create_display_inet(int x11_display_offset, int x11_use_localhost,
                for (ai = aitop; ai; ai = ai->ai_next) {
                        if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
                                continue;
-                       sock = socket(ai->ai_family, ai->ai_socktype,
-                           ai->ai_protocol);
+                       sock = socket_rdomain(ai->ai_family, ai->ai_socktype,
+                           ai->ai_protocol, channel_rdomain);
                        if (sock < 0) {
                                if ((errno != EINVAL) && (errno != EAFNOSUPPORT)) {
                                        error("socket: %.100s", strerror(errno));
@@ -3273,7 +3284,8 @@ x11_connect_display(void)
        }
        for (ai = aitop; ai; ai = ai->ai_next) {
                /* Create a socket. */
-               sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+               sock = socket_rdomain(ai->ai_family, ai->ai_socktype,
+                   ai->ai_protocol, channel_rdomain);
                if (sock < 0) {
                        debug2("socket: %.100s", strerror(errno));
                        continue;
This page took 0.801499 seconds and 4 git commands to generate.