* sven falempin <sven.falem...@gmail.com> [2012-06-30 02:06]: > - ea = ether_aton(argv[0]); > + m_size = strnlen(argv[0], ETHER_ADDR_LEN+1 ); > + if ( m_size > ETHER_ADDR_LEN || m_size < 3 ) { > + warnx("mac address expression too long or > too small %s", argv[0]); > + return (1); > + } > + if ( ( argv[0][0] == '*' && argv[0][1] == ':' ) > || > + ( argv[0][m_size-1] == '*' && > argv[0][m_size-2] == ':' ) > + ) { > + int n = 0; > + char* mac = malloc( > (ETHER_ADDR_LEN+1)*sizeof(char) ); > + char* p; > + if ( mac == NULL ) { > + warnx("not enough memory"); > + return (1); > + } > + for ( p = argv[0]; *p != '\0'; ++p) { > + if ( *p == ':' ) n++; > + } > + if ( argv[0][0] == '*' ) { > + for (; n > 0; --n) strlcat( mac, > "0:", ETHER_ADDR_LEN); > + strlcat( mac, &(argv[0][2]), > ETHER_ADDR_LEN); > + *m_b = -n; > + } > + if ( argv[0][m_size-1] == '*' ) { > + strlcat( mac, argv[0], > ETHER_ADDR_LEN); > + for (; n > 0; --n) strlcat( mac, > ":0", ETHER_ADDR_LEN); > + *m_b = n; > + } > + rule.ifbr_flags |= m_flag; > + ea = ether_aton(mac); > + free(mac); > + } else { > + ea = ether_aton(argv[0]); > + }
NO WAY. doing this with string fiddling (in the kernel!) is beyond inacceptible. -- Henning Brauer, h...@bsws.de, henn...@openbsd.org BS Web Services, http://bsws.de, Full-Service ISP Secure Hosting, Mail and DNS Services. Dedicated Servers, Root to Fully Managed Henning Brauer Consulting, http://henningbrauer.com/