| 756 | } |
| 757 | |
| 758 | int scanipl(unsigned char *arg, struct iplist *dst){ |
| 759 | #ifndef NOIPV6 |
| 760 | struct sockaddr_in6 sa; |
| 761 | #else |
| 762 | struct sockaddr_in sa; |
| 763 | #endif |
| 764 | char * slash, *dash; |
| 765 | int masklen, addrlen; |
| 766 | if((slash = strchr((char *)arg, '/'))) *slash = 0; |
| 767 | if((dash = strchr((char *)arg,'-'))) *dash = 0; |
| 768 | |
| 769 | if(!getip46(46, arg, (struct sockaddr *)&sa)) return 1; |
| 770 | memcpy(&dst->ip_from, SAADDR(&sa), SAADDRLEN(&sa)); |
| 771 | dst->family = *SAFAMILY(&sa); |
| 772 | if(dash){ |
| 773 | if(!getip46(46, (unsigned char *)dash+1, (struct sockaddr *)&sa)) return 2; |
| 774 | memcpy(&dst->ip_to, SAADDR(&sa), SAADDRLEN(&sa)); |
| 775 | if(*SAFAMILY(&sa) != dst->family || memcmp(&dst->ip_to, &dst->ip_from, SAADDRLEN(&sa)) < 0) return 3; |
| 776 | return 0; |
| 777 | } |
| 778 | memcpy(&dst->ip_to, &dst->ip_from, SAADDRLEN(&sa)); |
| 779 | if(slash){ |
| 780 | addrlen = SAADDRLEN(&sa); |
| 781 | masklen = atoi(slash+1); |
| 782 | if(masklen < 0 || masklen > (addrlen*8)) return 4; |
| 783 | else { |
| 784 | int i, nbytes = masklen / 8, nbits = (8 - (masklen % 8)) % 8; |
| 785 | |
| 786 | for(i = addrlen; i>(nbytes + (nbits > 0)); i--){ |
| 787 | ((unsigned char *)&dst->ip_from)[i-1] = 0x00; |
| 788 | ((unsigned char *)&dst->ip_to)[i-1] = 0xff; |
| 789 | } |
| 790 | for(;nbits;nbits--){ |
| 791 | ((unsigned char *)&dst->ip_from)[nbytes] &= ~(0x01<<(nbits-1)); |
| 792 | ((unsigned char *)&dst->ip_to)[nbytes] |= (0x01<<(nbits-1)); |
| 793 | } |
| 794 | return 0; |
| 795 | } |
| 796 | } |
| 797 | return 0; |
| 798 | } |
| 799 | |
| 800 | struct ace * make_ace (int argc, unsigned char ** argv){ |
| 801 | struct ace * acl; |