hi!

Please, review the following PR: 
http://www.freebsd.org/cgi/query-pr.cgi?pr=25847

Same patch is in the attach.

-- 
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/CC/IT d-@ s: a- C++ UBSC++++$ P++>+++@ L- E--- W+ N++ o? K? w>-- O- M- V-
PS@ PE@ Y+ PGP>+ t 5 X R tv- b+++(++++) DI-- D+(++) G>++ e- h--- r y+++
------END GEEK CODE BLOCK------
--- nos-tun.c.orig      Fri Mar 16 11:01:38 2001
+++ nos-tun.c   Fri Mar 16 11:17:35 2001
@@ -239,11 +239,13 @@
   char *point_to = NULL;
   char *to_point = NULL;
   char *target;
+  char *source = NULL;
   char *protocol = NULL;
   int protnum;
 
   struct sockaddr t_laddr;          /* Source address of tunnel */
   struct sockaddr whereto;          /* Destination of tunnel */
+  struct sockaddr wherefrom;        /* Source of tunnel */
   struct sockaddr_in *to;
 
   char buf[0x2000];                 /* Packets buffer */
@@ -272,7 +274,7 @@
   argc -= optind;
   argv += optind;
 
-  if (argc != 1 || (devname == NULL) ||
+  if ((argc != 1 && argc != 2) || (devname == NULL) ||
       (point_to == NULL) || (to_point == NULL)) {
     usage();
   }
@@ -282,7 +284,11 @@
   else
       protnum = atoi(protocol);
 
-  target = *argv;
+  if (argc == 1) {
+      target = *argv;
+  } else {
+      source = *argv++; target = *argv;
+  }
 
   /* Establish logging through 'syslog' */
   openlog("nos-tun", LOG_PID, LOG_DAEMON);
@@ -306,6 +312,15 @@
     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 ) {
     syslog(LOG_ERR,"can't connect to target - %m");
     close(net);
@@ -365,7 +380,7 @@
 usage()
 {
        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);
 }
 

Reply via email to