version 1.296, 2009/05/25 06:48:00 |
version 1.297, 2009/10/28 16:38:18 |
|
|
/* AF_UNSPEC or AF_INET or AF_INET6 */ |
/* AF_UNSPEC or AF_INET or AF_INET6 */ |
static int IPv4or6 = AF_UNSPEC; |
static int IPv4or6 = AF_UNSPEC; |
|
|
|
/* Set the routing domain a.k.a. VRF */ |
|
static int channel_rdomain = -1; |
|
|
/* helper */ |
/* helper */ |
static void port_open_helper(Channel *c, char *rtype); |
static void port_open_helper(Channel *c, char *rtype); |
|
|
|
|
IPv4or6 = af; |
IPv4or6 = af; |
} |
} |
|
|
|
void |
|
channel_set_rdomain(int rdomain) |
|
{ |
|
channel_rdomain = rdomain; |
|
} |
|
|
static int |
static int |
channel_setup_fwd_listener(int type, const char *listen_addr, |
channel_setup_fwd_listener(int type, const char *listen_addr, |
u_short listen_port, int *allocated_listen_port, |
u_short listen_port, int *allocated_listen_port, |
|
|
continue; |
continue; |
} |
} |
/* Create a port to listen for the host. */ |
/* 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) { |
if (sock < 0) { |
/* this is no error since kernel may not support ipv6 */ |
/* this is no error since kernel may not support ipv6 */ |
verbose("socket: %.100s", strerror(errno)); |
verbose("socket: %.100s", strerror(errno)); |
|
|
error("connect_next: getnameinfo failed"); |
error("connect_next: getnameinfo failed"); |
continue; |
continue; |
} |
} |
if ((sock = socket(cctx->ai->ai_family, cctx->ai->ai_socktype, |
if ((sock = socket_rdomain(cctx->ai->ai_family, |
cctx->ai->ai_protocol)) == -1) { |
cctx->ai->ai_socktype, cctx->ai->ai_protocol, |
|
channel_rdomain)) == -1) { |
if (cctx->ai->ai_next == NULL) |
if (cctx->ai->ai_next == NULL) |
error("socket: %.100s", strerror(errno)); |
error("socket: %.100s", strerror(errno)); |
else |
else |
|
|
for (ai = aitop; ai; ai = ai->ai_next) { |
for (ai = aitop; ai; ai = ai->ai_next) { |
if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6) |
if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6) |
continue; |
continue; |
sock = socket(ai->ai_family, ai->ai_socktype, |
sock = socket_rdomain(ai->ai_family, ai->ai_socktype, |
ai->ai_protocol); |
ai->ai_protocol, channel_rdomain); |
if (sock < 0) { |
if (sock < 0) { |
error("socket: %.100s", strerror(errno)); |
error("socket: %.100s", strerror(errno)); |
freeaddrinfo(aitop); |
freeaddrinfo(aitop); |
|
|
} |
} |
for (ai = aitop; ai; ai = ai->ai_next) { |
for (ai = aitop; ai; ai = ai->ai_next) { |
/* Create a socket. */ |
/* 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) { |
if (sock < 0) { |
debug2("socket: %.100s", strerror(errno)); |
debug2("socket: %.100s", strerror(errno)); |
continue; |
continue; |