mad_status RegInit( void ) { unsigned i; unsigned max; unsigned curr; mad_status ms; max = 0; for( i = 0; i < NUM_ELTS( RegList ); ++i ) { switch( RegList[i].sublist_code ) { case RS_INT: case RS_FLT: curr = TYPEIDX( RegList[i].info.bit_start, axpreg ); if( curr > max ) max = curr; break; } } RegSubList = MCAlloc( ( max + 1 ) * sizeof( *RegSubList ) ); if( RegSubList == NULL ) return( MS_ERR | MS_NO_MEM ); memset( RegSubList, 0, ( max + 1 ) * sizeof( *RegSubList ) ); for( i = 0; i < NUM_ELTS( RegList ); ++i ) { switch( RegList[i].sublist_code ) { case RS_INT: ms = AddSubList( i, IntRegSubData, NUM_ELTS( IntRegSubData ) ); if( ms != MS_OK ) return( ms ); break; case RS_FLT: ms = AddSubList( i, FltRegSubData, NUM_ELTS( FltRegSubData ) ); if( ms != MS_OK ) return( ms ); break; } } return( MS_OK ); }
mad_status RegInit() { unsigned i; unsigned max; unsigned curr; unsigned half_idx = 0; mad_status ms; max = 0; for( i = 0; i < NUM_ELTS( RegList ); ++i ) { switch( RegList[i].sublist_code ) { case RS_DWORD: curr = TYPEIDX( RegList[i].info.bit_start, unsigned_64 ); if( curr > max ) max = curr; RegListHalf[half_idx] = RegList[i]; #if defined( __BIG_ENDIAN__ ) // kludge for 64-bit registers displayed as 32-bit - need to // skip 32 bits! RegListHalf[half_idx].info.bit_start += 32; #endif RegListHalf[half_idx].info.bit_size = 32; ++half_idx; break; } } RegSubList = MCAlloc( ( max + 1 ) * sizeof( *RegSubList ) ); if( RegSubList == NULL ) return( MS_ERR | MS_NO_MEM ); memset( RegSubList, 0, ( max + 1 ) * sizeof( *RegSubList ) ); for( i = 0; i < NUM_ELTS( RegList ); ++i ) { switch( RegList[i].sublist_code ) { case RS_DWORD: ms = AddSubList( i, IntRegSubData, NUM_ELTS( IntRegSubData ) ); if( ms != MS_OK ) return( ms ); break; } } return( MS_OK ); }
/******************************************************* * Convert an IP list to numbers and add them ********************************************************/ int AddIPRanges(NumList* n, char* Ranges){ int i; char ThisNum[64]; int ThisNumCount; unsigned int LowNum; unsigned int HighNum; unsigned int Mask; int SubListID; int IsDashed=FALSE; DEBUGPATH; if (!n) return FALSE; #ifdef DEBUG printf("Ranges is %s\n",Ranges); #endif if ( (SubListID=GetListByName(Ranges))!=LIST_NONE){ if (!AddSubList(n,Globals.Lists[SubListID].List)){ printf("Failed to add ip list \"%s\" \n",Ranges); return FALSE; } return TRUE; } ThisNumCount=0; LowNum=0; for (i=0;i<=strlen(Ranges);i++){ switch(Ranges[i]){ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': case '.': /*normal number, keep going*/ ThisNum[ThisNumCount]=Ranges[i]; ThisNumCount++; break; case '-': /*contiguous range notation*/ /*this a delimiter, add the numbers*/ ThisNum[ThisNumCount]=0x00; LowNum=ntohl(inet_addr(ThisNum)); #ifdef DEBUG printf("Setting Low Range to %u\n",LowNum); #endif ThisNumCount=0; IsDashed=TRUE; break; case 0x00: case ',': /*this a delimiter, add the numbers*/ ThisNum[ThisNumCount]=0x00; HighNum=ntohl(inet_addr(ThisNum)); if (LowNum==0) LowNum=HighNum; if (IsDashed){ AddRange(n, LowNum, HighNum); #ifdef DEBUG printf("1Added Number %u-%u\n",LowNum, HighNum); #endif }else{ /*there may be a bug here*/ /*keep an eye on it*/ AddRange(n, LowNum, LowNum); #ifdef DEBUG printf("5Added Number %u-%u\n", LowNum, LowNum); #endif } ThisNumCount=0; IsDashed=FALSE; LowNum=0; break; case ' ': /*ignore white space*/ break; case '/': /*this is a range*/ ThisNum[ThisNumCount]=0x00; LowNum=ntohl(inet_addr(ThisNum)); i++; Mask=atoi(&Ranges[i]); HighNum=LowNum; switch (Mask){ case 0: LowNum&=0x00000000; HighNum|=0xFFFFFFFF; AddRange(n, LowNum, HighNum); break; case 1: LowNum&=0x10000000; HighNum|=0x7FFFFFFF; AddRange(n, LowNum, HighNum); break; case 2: LowNum&=0x30000000; HighNum|=0x3FFFFFFF; AddRange(n, LowNum, HighNum); break; case 3: LowNum&=0x70000000; HighNum|=0x1FFFFFFF; AddRange(n, LowNum, HighNum); break; case 4: LowNum&=0xF0000000; HighNum|=0x0FFFFFFF; AddRange(n, LowNum, HighNum); break; case 5: LowNum&=0xF1000000; HighNum|=0x07FFFFFF; AddRange(n, LowNum, HighNum); break; case 6: LowNum&=0xF3000000; HighNum|=0x03FFFFFF; AddRange(n, LowNum, HighNum); break; case 7: LowNum&=0xF7000000; HighNum|=0x01FFFFFF; AddRange(n, LowNum, HighNum); break; case 8: LowNum&=0xFF000000; HighNum|=0x00FFFFFF; AddRange(n, LowNum, HighNum); break; case 9: LowNum&=0xFF100000; HighNum|=0x007FFFFF; AddRange(n, LowNum, HighNum); break; case 10: LowNum&=0xFF300000; HighNum|=0x003FFFFF; AddRange(n, LowNum, HighNum); break; case 11: LowNum&=0xFF700000; HighNum|=0x001FFFFF; AddRange(n, LowNum, HighNum); break; case 12: LowNum&=0xFFF00000; HighNum|=0x000FFFFF; AddRange(n, LowNum, HighNum); break; case 13: LowNum&=0xFFF10000; HighNum|=0x0007FFFF; AddRange(n, LowNum, HighNum); break; case 14: LowNum&=0xFFF30000; HighNum|=0x0003FFFF; AddRange(n, LowNum, HighNum); break; case 15: LowNum&=0xFFF70000; HighNum|=0x0001FFFF; AddRange(n, LowNum, HighNum); break; case 16: LowNum&=0xFFFF0000; HighNum|=0x0000FFFF; AddRange(n, LowNum, HighNum); break; case 17: LowNum&=0xFFFF1000; HighNum|=0x00007FFF; AddRange(n, LowNum, HighNum); break; case 18: LowNum&=0xFFFF3000; HighNum|=0x00003FFF; AddRange(n, LowNum, HighNum); break; case 19: LowNum&=0xFFFF7000; HighNum|=0x00001FFF; AddRange(n, LowNum, HighNum); break; case 20: LowNum&=0xFFFF000; HighNum|=0x00000FFF; AddRange(n, LowNum, HighNum); break; case 21: LowNum&=0xFFFFF100; HighNum|=0x000007FF; AddRange(n, LowNum, HighNum); break; case 22: LowNum&=0xFFFFF300; HighNum|=0x000003FF; AddRange(n, LowNum, HighNum); break; case 23: LowNum&=0xFFFFF700; HighNum|=0x000001FF; AddRange(n, LowNum, HighNum); break; case 24: LowNum&=0xFFFFFF00; HighNum|=0x000000FF; AddRange(n, LowNum, HighNum); break; case 25: LowNum&=0xFFFFFF10; HighNum|=0x0000007F; AddRange(n, LowNum, HighNum); break; case 26: LowNum&=0xFFFFFF30; HighNum|=0x0000003F; AddRange(n, LowNum, HighNum); break; case 27: LowNum&=0xFFFFFF70; HighNum|=0x0000001F; AddRange(n, LowNum, HighNum); break; case 28: LowNum&=0xFFFFFFF0; HighNum|=0x0000000F; AddRange(n, LowNum, HighNum); break; case 29: LowNum&=0xFFFFFFF1; HighNum|=0x00000007; AddRange(n, LowNum, HighNum); break; case 30: LowNum&=0xFFFFFFF3; HighNum|=0x00000003; AddRange(n, LowNum, HighNum); break; case 31: LowNum&=0xFFFFFFF7; HighNum|=0x00000001; AddRange(n, LowNum, HighNum); break; case 32: LowNum&=0xFFFFFFFF; HighNum|=0x00000000; AddRange(n, LowNum, HighNum); break; default: printf("Invalid CIDR Notation /%u\n",Mask); return FALSE; } #ifdef DEBUG printf("1Added Range %u-%u\n",LowNum, HighNum); #endif while ((Ranges[i]>='0') && (Ranges[i]<='9')) i++; ThisNumCount=0; IsDashed=FALSE; break; default: printf("Invalid character \"%c\"\n", Ranges[i]); printf("I don't understand %s\n",Ranges); return FALSE; } } return TRUE; }