Ejemplo n.º 1
0
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 );
}
Ejemplo n.º 2
0
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 );
}
Ejemplo n.º 3
0
/*******************************************************
* 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;
}