📄 ipobj.c
字号:
if (port2) { unsigned int i; *port2 = '\0'; port2++; if (*port1 == '\0' || *port2 == '\0') return -1; for (i = 0; i < strlen(port1); i++) { if (!isdigit((int)port1[i])) return -2; } for (i = 0; i < strlen(port2); i++) { if (!isdigit((int)port2[i])) return -2; } port_lo = atoi(port1); port_hi = atoi(port2); } else { unsigned int i; if (*port1 == '\0') return -1; for (i = 0; i < strlen(port1); i++) { if (!isdigit((int)port1[i])) return -2; } port_hi = port_lo = atoi(port1); } /* check to see if port is out of range */ if ( port_hi > 65535 || port_lo > 65535) return -3; /* swap ports if necessary */ if (port_hi < port_lo) { unsigned tmp; tmp = port_hi; port_hi = port_lo; port_lo = tmp; } portset_add(portset, port_lo, port_hi); /* Move to next port/port range */ port_begin = port_end; if (port_begin != portset_end) port_begin++; while (isspace((int)(*port_begin))) port_begin++; port_end = strpbrk(port_begin, " \t"); if (port_end == NULL) port_end = portset_end; else *port_end = '\0'; } return 0;}/** * Break an IP4 Address down into its components * * @param ipstr string to parse * @param use network order for return values (defaults to host order) * @param not_flag return value if the ip is negated * @param host ipv4 host argument * @param mask ipv4 mask argument * * @return 0 on sucess, else failure parsing the address * @retval -3 \0 encountered prematurely * @retval -2 strdup failed * @retval -1 null argument * @retval -4 out of range for CIDR notation */static int ip4_parse(char *ipstr, int network_order, int *not_flag, unsigned *host, unsigned *mask, PORTSET *portset){ char *saved, *s_copy, *maskptr, *endp, *portptr = NULL, *addrend; struct in_addr addrstuff; if(!ipstr || !not_flag || !host || !mask) return -1; if(*ipstr == '\0') return -3; saved = s_copy = strdup(ipstr); if(!s_copy) { return -2; } else { while(isspace((int)*s_copy)) s_copy++; if(*s_copy == '\0') { free(saved); return -3; } if(*s_copy == '!') { *not_flag = 1; s_copy++; if(*s_copy == '\0') { free(saved); return -3; } } else { *not_flag = 0; } endp = strstr(s_copy, "]"); if (endp) { /* Removing trailing ']' */ *endp = 0; } endp = strstr(s_copy, ","); if (endp) { /* Removing trailing ',' */ *endp = 0; } maskptr = strstr(s_copy, "/"); portptr = strstr(s_copy, ":"); if(!maskptr) { /* assume this is a host */ *mask = 0xFFFFFFFF; } else { *maskptr = '\0'; maskptr++; } if(!portptr) { /* no port */ } else { *portptr = '\0'; portptr++; } /* this will just be the address part as *maskptr and *portptr == '\0' * we shouldn't find anything after moving past trailing whitespace */ addrend = strpbrk(s_copy, " \t"); if (addrend != NULL) { while (isspace((int)(*addrend))) addrend++; if (*addrend != '\0') { free(saved); return -1; } } if(strncmp(s_copy, "0", 1) == 0 || strncmp(s_copy, "0.0.0.0", 7) == 0) { *host = 0; } else if((addrstuff.s_addr = inet_addr(s_copy)) == -1) { if(!strncmp(s_copy, "255.255.255.255", 15)) { addrstuff.s_addr = INADDR_BROADCAST; } else { /* invalid ip address! */ free(saved); return -3; } } else { *host = ntohl(addrstuff.s_addr); } if(maskptr) { char *maskend; while (isspace((int)(*maskptr))) maskptr++; if(*maskptr == '\0') { /* Nothing beyond the / -- no bits in CIDR */ free(saved); return -3; } /* make sure if there are spaces at the end that we don't find * any more stuff, like another address that wasn't separated * with a comma */ maskend = strpbrk(maskptr, " \t"); if (maskend != NULL) { while (isspace((int)(*maskend))) maskend++; if (*maskend != '\0') { free(saved); return -1; } } if(strstr(maskptr, ".")) { if(strncmp(maskptr, "0", 1) == 0 || strncmp(maskptr, "0.0.0.0", 7) == 0) { *mask = 0; } else if((addrstuff.s_addr = inet_addr(maskptr)) == -1) { if(strncmp(maskptr, "255.255.255.255", 15) == 0) { addrstuff.s_addr = INADDR_BROADCAST; } else { /* invalid ip address! */ free(saved); return -3; } } else { *mask = ntohl(addrstuff.s_addr); } } else { int blocksize = atoi(maskptr); int i; if(blocksize == 0) { *mask = 0; } else if(blocksize < 1 || blocksize > 32) { free(saved); return -4; } else { *mask = 0; for(i=0;i<blocksize;i++) { (*mask) |= (1 << 31) >> i; } } } } if(portptr) { while (isspace((int)(*portptr))) portptr++; if (*portptr == '\0') { free(saved); return -5; } if (port_parse(portptr, portset) != 0) { free(saved); return -6; } } else { /* Make sure we have at least one port range in list, but an invalid port range */ portset_add(portset, 0, 0); } } /* convert the arguments by default */ if(network_order) { *mask = htonl(*mask); *host = htonl(*host); } free(saved); return 0;}int ip4_setparse(IPSET *ipset, char *ipstr) { char *copy, *startIP, *endIP; int parse_count = 0; int set_not_flag = 0; int item_not_flag; unsigned host, mask; PORTSET portset; copy = strdup(ipstr); if(!copy) return -2; startIP = copy; if (*startIP == '!') { set_not_flag = 1; startIP++; } while (startIP) { while (isspace((int)*startIP) || (*startIP == '[') ) { startIP++; } if ((*startIP == ']') || (*startIP == '\0')) break; /* if not found, endIP will be NULL */ endIP = strstr(startIP, ","); if (endIP) *endIP = '\0'; portset_init(&portset); if(ip4_parse(startIP, 0, &item_not_flag, &host, &mask, &portset) != 0) { free(copy); return -5; } if(ipset_add(ipset, &host, &mask, &portset, (item_not_flag ^ set_not_flag), IPV4_FAMILY) != 0) { free(copy); return -6; } parse_count++; if (endIP) endIP++; startIP = endIP; } free(copy); if (!parse_count) return -7; return 0;}#ifdef MAIN_IP#include <time.h>#ifndef WIN32#define rand random#define srand srandom#endif#define MAXIP 100 #include "sflsq.c"void test_ip4_parsing(void){ unsigned host, mask, not_flag; PORTSET portset; char **curip; int ret; IPADDRESS *adp; char *ips[] = { "138.26.1.24:25", "1.1.1.1/255.255.255.0:444", "1.1.1.1/16:25-28", "1.1.1.1/255.255.255.255:25 27-29", "z/24", "0/0", "0.0.0.0/0.0.0.0:25-26 28-29 31", "0.0.0.0/0.0.2.0", NULL }; for(curip = ips; curip[0] != NULL; curip++) { portset_init(&portset); /* network byte order stuff */ if((ret = ip4_parse(curip[0], 1, ¬_flag, &host, &mask, &portset)) != 0) { fprintf(stderr, "Unable to parse %s with ret %d\n", curip[0], ret); } else { printf("%c", not_flag ? '!' : ' '); printf("%s/", inet_ntoa(*(struct in_addr *) &host)); printf("%s", inet_ntoa(*(struct in_addr *) &mask)); printf(" parsed successfully!\n"); } /* host byte order stuff */ if((ret = ip4_parse(curip[0], 0, ¬_flag, &host, &mask, &portset)) != 0) { fprintf(stderr, "Unable to parse %s with ret %d\n", curip[0], ret); } else { adp = ip_new(IPV4_FAMILY); ip_set(adp, &host, IPV4_FAMILY); ip_fprint(stdout, adp); fprintf(stdout, "*****************\n"); ip_free(adp); } } return;}void test_ip4set_parsing(void){ char **curip; int ret; char *ips[] = { "12.24.24.1/32,!24.24.24.1", "[0.0.0.0/0.0.2.0,241.242.241.22]", "138.26.1.24", "1.1.1.1", "1.1.1.1/16", "1.1.1.1/255.255.255.255", "z/24", "0/0", "0.0.0.0/0.0.0.0", "0.0.0.0/0.0.2.0", NULL }; for(curip = ips; curip[0] != NULL; curip++) { IPSET *ipset = ipset_new(IPV4_FAMILY); /* network byte order stuff */ if((ret = ip4_setparse(ipset, curip[0])) != 0) { ipset_free(ipset); fprintf(stderr, "Unable to parse %s with ret %d\n", curip[0], ret); } else { printf("-[%s]\n ", curip[0]); ipset_print(ipset); printf("---------------------\n "); } } return;}// -----------------------------void test_ip(){ int i,k; IPADDRESS * ipa[MAXIP]; unsigned ipaddress,ipx; unsigned short ipaddress6[8], ipx6[8]; printf("IPADDRESS testing\n"); srand( time(0) ); for(i=0;i<MAXIP;i++) { if( i % 2 ) { ipa[i]= ip_new(IPV4_FAMILY); ipaddress = rand() * rand(); ip_set( ipa[i], &ipaddress, IPV4_FAMILY ); if( !ip_equal(ipa[i],&ipaddress, IPV4_FAMILY ) ) printf("error with ip_equal\n"); ip_get( ipa[i], &ipx, IPV4_FAMILY ); if( ipx != ipaddress ) printf("error with ip_get\n"); } else { ipa[i]= ip_new(IPV6_FAMILY); for(k=0;k<8;k++) ipaddress6[k] = (char) (rand() % (1<<16)); ip_set( ipa[i], ipaddress6, IPV6_FAMILY ); if( !ip_equal(ipa[i],&ipaddress6, IPV6_FAMILY ) ) printf("error with ip6_equal\n"); ip_get( ipa[i], ipx6, IPV6_FAMILY ); for(k=0;k<8;k++) if( ipx6[k] != ipaddress6[k] ) printf("error with ip6_get\n"); } printf("[%d] ",i); ip_fprint(stdout,ipa[i]); printf("\n"); } printf("IP testing completed\n");}// -----------------------------void test_ipset(){ int i,k; IPSET * ipset, * ipset6; IPSET * ipset_copyp, * ipset6_copyp; unsigned ipaddress, mask; unsigned short mask6[8]; unsigned short ipaddress6[8]; unsigned port_lo, port_hi; PORTSET portset; printf("IPSET testing\n"); ipset = ipset_new(IPV4_FAMILY); ipset6 = ipset_new(IPV6_FAMILY); srand( time(0) ); for(i=0;i<MAXIP;i++) { if( i % 2 ) { ipaddress = rand() * rand(); mask = 0xffffff00; port_lo = rand(); port_hi = rand() % 5 + port_lo; portset_init(&portset); portset_add(&portset, port_lo, port_hi); ipset_add( ipset, &ipaddress, &mask, &portset, 0, IPV4_FAMILY ); //class C cidr blocks if( !ipset_contains( ipset, &ipaddress, &port_lo, IPV4_FAMILY ) ) printf("error with ipset_contains\n"); } else { for(k=0;k<8;k++) ipaddress6[k] = (char) (rand() % (1<<16)); for(k=0;k<8;k++) mask6[k] = 0xffff; port_lo = rand(); port_hi = rand() % 5 + port_lo; portset_init(&portset); portset_add(&portset, port_lo, port_hi); ipset_add( ipset6, ipaddress6, mask6, &portset, 0, IPV6_FAMILY ); if( !ipset_contains( ipset6, &ipaddress6, &port_lo, IPV6_FAMILY ) ) printf("error with ipset6_contains\n"); } } ipset_copyp = ipset_copy( ipset ); ipset6_copyp = ipset_copy( ipset6 ); printf("-----IP SET-----\n"); ipset_print( ipset ); printf("\n"); printf("-----IP SET6-----\n"); ipset_print( ipset6 ); printf("\n"); printf("-----IP SET COPY -----\n"); ipset_print( ipset_copyp ); printf("\n"); printf("-----IP SET6 COPY -----\n"); ipset_print( ipset6_copyp ); printf("\n"); printf("IP set testing completed\n");}// -----------------------------int main( int argc, char ** argv ){ printf("ipobj \n"); test_ip(); test_ipset(); test_ip4_parsing(); test_ip4set_parsing(); printf("normal pgm completion\n"); return 0;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -