Committer  : klmitch
CVSROOT    : /cvsroot/undernet-ircu
Module     : ircu2.10
Branch tags: u2_10_11_07
Commit time: 2004-08-27 04:01:38 UTC

Modified files:
  Tag: u2_10_11_07
     ChangeLog include/s_conf.h ircd/s_bsd.c ircd/s_conf.c

Log message:

Author: Kev <[EMAIL PROTECTED]>
Log message:

Quick hack to allow C-lines to originate connects from specific local IPs,
rather than from INADDR_ANY or the VirtualHost setting.  To use, set the
first field of your C-line to <local ip address>/<remote host/ip>--i.e.:

C:10.1.0.5/10.1.0.6:passwd:localnet.net:4400:5

A "/connect localnet.net" would result in a TCP connection originating from
10.1.0.5 to 10.1.0.6 port 4400.  If you don't need the feature, just omit
the '/' and anything before it.

---------------------- diff included ----------------------
Index: ircu2.10/ChangeLog
diff -u ircu2.10/ChangeLog:1.290.2.130.2.11 ircu2.10/ChangeLog:1.290.2.130.2.12
--- ircu2.10/ChangeLog:1.290.2.130.2.11 Sun Jun 20 12:20:31 2004
+++ ircu2.10/ChangeLog  Thu Aug 26 21:01:21 2004
@@ -1,3 +1,15 @@
+2004-08-26  Kevin L Mitchell  <[EMAIL PROTECTED]>
+
+       * ircd/s_conf.c (lookup_confhost): if field 1 of a C-line contains
+       a '/', interpret the text before the '/' as an IP address to bind
+       to locally, and use the text after the '/' as the host to connect
+       to
+
+       * ircd/s_bsd.c (connect_inet): if origin field in struct ConfItem
+       is set, bind to the identified address
+
+       * include/s_conf.h: add origin field to struct ConfItem
+
 2004-06-20  Alex Badea  <[EMAIL PROTECTED]>
 
        * ircd/m_account.c: login-on-connect extensions, part 1:
Index: ircu2.10/include/s_conf.h
diff -u ircu2.10/include/s_conf.h:1.15.2.1 ircu2.10/include/s_conf.h:1.15.2.1.16.1
--- ircu2.10/include/s_conf.h:1.15.2.1  Fri May 17 09:42:19 2002
+++ ircu2.10/include/s_conf.h   Thu Aug 26 21:01:25 2004
@@ -1,7 +1,7 @@
 /*
  * s_conf.h
  *
- * $Id: s_conf.h,v 1.15.2.1 2002/05/17 16:42:19 kev Exp $ 
+ * $Id: s_conf.h,v 1.15.2.1.16.1 2004/08/27 04:01:25 klmitch Exp $ 
  */
 #ifndef INCLUDED_s_conf_h
 #define INCLUDED_s_conf_h
@@ -55,6 +55,7 @@
   unsigned int             status;      /* If CONF_ILLEGAL, delete when no clients */
   unsigned int             clients;     /* Number of *LOCAL* clients using this */
   struct ConnectionClass*  conn_class;  /* Class of connection */
+  struct in_addr           origin;      /* ip number of connect origin */
   struct in_addr           ipnum;       /* ip number of host field */
   char*                    host;
   char*                    passwd;
Index: ircu2.10/ircd/s_bsd.c
diff -u ircu2.10/ircd/s_bsd.c:1.45.2.13 ircu2.10/ircd/s_bsd.c:1.45.2.13.4.1
--- ircu2.10/ircd/s_bsd.c:1.45.2.13     Sat Nov  1 02:19:12 2003
+++ ircu2.10/ircd/s_bsd.c       Thu Aug 26 21:01:26 2004
@@ -17,7 +17,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * $Id: s_bsd.c,v 1.45.2.13 2003/11/01 10:19:12 isomer Exp $
+ * $Id: s_bsd.c,v 1.45.2.13.4.1 2004/08/27 04:01:26 klmitch Exp $
  */
 #include "config.h"
 
@@ -229,7 +229,7 @@
  */
 static int connect_inet(struct ConfItem* aconf, struct Client* cptr)
 {
-  static struct sockaddr_in sin;
+  static struct sockaddr_in sin, *locaddr = 0;
   IOResult result;
   assert(0 != aconf);
   assert(0 != cptr);
@@ -265,9 +265,17 @@
    * explicitly bind it, it will default to IN_ADDR_ANY and we lose
    * due to the other server not allowing our base IP --smg
    */
-  if (feature_bool(FEAT_VIRTUAL_HOST) &&
-      bind(cli_fd(cptr), (struct sockaddr*) &VirtualHost,
-          sizeof(VirtualHost))) {
+  if (aconf->origin.s_addr != INADDR_NONE) {
+    memset(&sin, 0, sizeof(sin));
+    sin.sin_family = AF_INET;
+    sin.sin_addr.s_addr = aconf->origin.s_addr;
+    locaddr = &sin;
+  } else if (feature_bool(FEAT_VIRTUAL_HOST))
+    locaddr = &VirtualHost;
+
+  if (locaddr &&
+      bind(cli_fd(cptr), (struct sockaddr*) locaddr,
+          sizeof(struct sockaddr_in))) {
     report_error(BIND_ERROR_MSG, cli_name(cptr), errno);
     close(cli_fd(cptr));
     cli_fd(cptr) = -1;
Index: ircu2.10/ircd/s_conf.c
diff -u ircu2.10/ircd/s_conf.c:1.44.2.5.4.1 ircu2.10/ircd/s_conf.c:1.44.2.5.4.2
--- ircu2.10/ircd/s_conf.c:1.44.2.5.4.1 Fri Jun 18 06:41:44 2004
+++ ircu2.10/ircd/s_conf.c      Thu Aug 26 21:01:28 2004
@@ -17,7 +17,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * $Id: s_conf.c,v 1.44.2.5.4.1 2004/06/18 13:41:44 decampos Exp $
+ * $Id: s_conf.c,v 1.44.2.5.4.2 2004/08/27 04:01:28 klmitch Exp $
  */
 #include "config.h"
 
@@ -238,6 +238,7 @@
  */
 static void lookup_confhost(struct ConfItem *aconf)
 {
+  char *tmp, *tmp2;
   struct DNSReply* reply;
 
   if (EmptyString(aconf->host) || EmptyString(aconf->name)) {
@@ -249,6 +250,15 @@
    * Do name lookup now on hostnames given and store the
    * ip numbers in conf structure.
    */
+  if ((tmp = strchr(aconf->host, '/'))) {
+    *(tmp++) = '\0';
+    aconf->origin.s_addr = inet_addr(aconf->host);
+    tmp2 = aconf->host;
+    DupString(aconf->host, tmp);
+    free(tmp2);
+  } else
+    aconf->origin.s_addr = INADDR_NONE;
+
   if (IsDigit(*aconf->host)) {
     /*
      * rfc 1035 sez host names may not start with a digit
----------------------- End of diff -----------------------

Reply via email to