Allow specification of which source address to use for encapsulation.

PR:		25847
Submitted by:	Eugene Polovnikov <eugene@brain-fag.org>
This commit is contained in:
Poul-Henning Kamp 2001-03-28 17:30:26 +00:00
parent 944adaa6c0
commit 6d4a212d49

View File

@ -239,11 +239,13 @@ int main (int argc, char **argv)
char *point_to = NULL; char *point_to = NULL;
char *to_point = NULL; char *to_point = NULL;
char *target; char *target;
char *source = NULL;
char *protocol = NULL; char *protocol = NULL;
int protnum; int protnum;
struct sockaddr t_laddr; /* Source address of tunnel */ struct sockaddr t_laddr; /* Source address of tunnel */
struct sockaddr whereto; /* Destination of tunnel */ struct sockaddr whereto; /* Destination of tunnel */
struct sockaddr wherefrom; /* Source of tunnel */
struct sockaddr_in *to; struct sockaddr_in *to;
char buf[0x2000]; /* Packets buffer */ char buf[0x2000]; /* Packets buffer */
@ -272,7 +274,7 @@ int main (int argc, char **argv)
argc -= optind; argc -= optind;
argv += optind; argv += optind;
if (argc != 1 || (devname == NULL) || if ((argc != 1 && argc != 2) || (devname == NULL) ||
(point_to == NULL) || (to_point == NULL)) { (point_to == NULL) || (to_point == NULL)) {
usage(); usage();
} }
@ -282,7 +284,11 @@ int main (int argc, char **argv)
else else
protnum = atoi(protocol); protnum = atoi(protocol);
target = *argv; if (argc == 1) {
target = *argv;
} else {
source = *argv++; target = *argv;
}
/* Establish logging through 'syslog' */ /* Establish logging through 'syslog' */
openlog("nos-tun", LOG_PID, LOG_DAEMON); openlog("nos-tun", LOG_PID, LOG_DAEMON);
@ -306,6 +312,15 @@ int main (int argc, char **argv)
Finish(5); Finish(5);
} }
if (source) {
if (Set_address(source, (struct sockaddr_in *)&wherefrom))
Finish(9);
if (bind(net, &wherefrom, sizeof(wherefrom)) < 0) {
syslog(LOG_ERR, "can't bind source address - %m");
Finish(10);
}
}
if (connect(net,&whereto,sizeof(struct sockaddr_in)) < 0 ) { if (connect(net,&whereto,sizeof(struct sockaddr_in)) < 0 ) {
syslog(LOG_ERR,"can't connect to target - %m"); syslog(LOG_ERR,"can't connect to target - %m");
close(net); close(net);
@ -365,7 +380,7 @@ static void
usage() usage()
{ {
fprintf(stderr, fprintf(stderr,
"usage: nos-tun -t <tun_name> -s <source_addr> -d <dest_addr> -p <protocol_number> <target_addr>\n"); "usage: nos-tun -t <tun_name> -s <source_addr> -d <dest_addr> -p <protocol_number> [<source_addr>] <target_addr>\n");
exit(1); exit(1);
} }