All pastes #1522391 Raw Edit

mpd-5.3-ipfw.table.macros

public text v1 · immutable
#1522391 ·published 2009-08-08 23:01 UTC
rendered paste body
diff -urN mpd-5.3.orig/src/iface.c mpd-5.3/src/iface.c
--- mpd-5.3.orig/src/iface.c	2009-04-11 18:24:19.000000000 -0300
+++ mpd-5.3/src/iface.c	2009-08-08 19:54:00.000000000 -0300
@@ -142,7 +142,7 @@
 #ifdef USE_IPFW
   static int	IfaceAllocACL (struct acl_pool ***ap, int start, char * ifname, int number);
   static int	IfaceFindACL (struct acl_pool *ap, char * ifname, int number);
-  static char *	IFaceParseACL (char * src, char * ifname);
+  static char *	IFaceParseACL (char * src, IfaceState iface);
 #endif
   
 /*
@@ -481,22 +481,24 @@
   }
   acls = b->params.acl_queue;
   while (acls != NULL) {
-    buf = IFaceParseACL(acls->rule,iface->ifname);
+    buf = IFaceParseACL(acls->rule,iface);
     ExecCmd(LG_IFACE2, b->name, "%s queue %d config %s", PATH_IPFW, acls->real_number, buf);
     Freee(buf);
     acls = acls->next;
   }
   acls = b->params.acl_table;
   while (acls != NULL) {
+    buf = IFaceParseACL(acls->rule, iface);
     acl = Mdup(MB_IFACE, acls, sizeof(struct acl) + strlen(acls->rule));
     acl->next = iface->tables;
     iface->tables = acl;
-    ExecCmd(LG_IFACE2, b->name, "%s table %d add %s", PATH_IPFW, acls->real_number, acls->rule);
+    ExecCmd(LG_IFACE2, b->name, "%s table %d add %s", PATH_IPFW, acls->real_number, buf);
+    Freee(buf);
     acls = acls->next;
   };
   acls = b->params.acl_rule;
   while (acls != NULL) {
-    buf = IFaceParseACL(acls->rule, iface->ifname);
+    buf = IFaceParseACL(acls->rule, iface);
     ExecCmd(LG_IFACE2, b->name, "%s add %d %s via %s", PATH_IPFW, acls->real_number, buf, iface->ifname);
     Freee(buf);
     acls = acls->next;
@@ -569,7 +571,7 @@
   acl = iface->tables;
   while (acl != NULL) {
     ExecCmd(LG_IFACE2, b->name, "%s table %d delete %s",
-	PATH_IPFW, acl->real_number, acl->rule);
+	PATH_IPFW, acl->real_number, IFaceParseACL(acl->rule,iface));
     aclnext = acl->next;
     Freee(acl);
     acl = aclnext;
@@ -704,13 +706,15 @@
  */
 
 static char *
-IFaceParseACL (char * src, char * ifname)
+IFaceParseACL (char * src, IfaceState iface)
 {
     char *buf,*buf1;
     char *begin,*param,*end;
     char t;
     int num,real_number;
     struct acl_pool *ap;
+    char hisaddr[20];
+    int ipmode=0; // 0 - normal macro, 1 - IP address macro
     
     buf = Malloc(MB_IFACE, ACL_LEN);
     buf1 = Malloc(MB_IFACE, ACL_LEN);
@@ -735,14 +739,34 @@
 		    case 't':
 			ap = table_pool;
 			break;
+		    case 'a':
+			ipmode = 1;
+			if (num==1)
+			    u_addrtoa(&iface->peer_addr,hisaddr,sizeof(hisaddr));
+			else if (num==2)
+			    u_rangetoa(&iface->self_addr,hisaddr,sizeof(hisaddr));
+			else
+			    ipmode = 0;
+			ap = NULL;
+			break;
 		    default:
 			ap = NULL;
 		};
-		real_number = IfaceFindACL(ap,ifname,num);
-		if (end != NULL) {
-		    snprintf(buf1, ACL_LEN, "%s%d %s", begin, real_number, end);
-		} else {
-		    snprintf(buf1, ACL_LEN, "%s%d", begin, real_number);
+		if (ipmode)
+		{
+		    if (end != NULL)
+			snprintf(buf1, ACL_LEN, "%s%s %s", begin, hisaddr, end);
+		    else
+			snprintf(buf1, ACL_LEN, "%s%s", begin, hisaddr);
+		    ipmode = 0;
+		}
+		else
+		{
+		    real_number = IfaceFindACL(ap,iface->ifname,num);
+		    if (end != NULL)
+			snprintf(buf1, ACL_LEN, "%s%d %s", begin, real_number, end);
+		    else
+			snprintf(buf1, ACL_LEN, "%s%d", begin, real_number);
 		};
 		strlcpy(buf, buf1, ACL_LEN);
 	    };