int loadcmd(interpreteur inter, memory mem) { int no_args; char* token; char* elf_file; size_t addr; if ((token = get_next_token(inter)) == NULL) { WARNING_MSG("Usage : load <fichier elf> {<adresse>}\n"); return 1; } else { elf_file = token; no_args = 1; } token = get_next_token(inter); if(token!=NULL && !is_hexa(token)) { WARNING_MSG("Attention : adresse de depart non hexadecimale. Utilisation de la valeur par défaut.\n"); } else if(token!=NULL && is_hexa(token)) { sscanf(token, "%zx", &addr); no_args = 2; } load(no_args, elf_file, addr, mem); return 0; }
/** * retourne le type du token (fonction très incomplete) * @param chaine le token à analyser * @return un entier correspondant au type du token * */ int get_type(char* chaine) { if (is_hexa(chaine)) return HEXA; // HEXA ==1 if(convert(chaine)!=-1){ return REGISTRE; } if(is_hexa(chaine)) return ADD; if(strcmp(chaine,":")==0) return DEUXPOINTS; if (strcmp(chaine,"+")==0) return PLUS; return UNKNOWN; }
/**** set progaddr ****/ int command_progaddr(){ char *tmp; int addr; tmp = strtok(NULL, " "); if(!tmp) return 2; else if((addr = is_hexa(tmp,1)) == -1) return 3; if(comma_check(tmp)) return 9; if((tmp = strtok(NULL, " "))) return 6; set_Addr(addr); return 0; }
int check_mac(const char * command, unsigned char * mac) { int i = 0; char c; int size = 0; int current = 0; int j; unsigned char num; while ( command[i] == ' '){ i++; } j = i; while( i < j + MAC_ADDRESS_SIZE){ c = command[i++]; switch(c){ case ':': if ( size > 2 ){ return -1; }else{ size = 0; current++; } break; default: if ( !is_hexa(c) || size > 2 ){ return -1; }else{ if ( size == 0 ){ num = char_hexa_to_i(c) * 0x10; }else{ num += char_hexa_to_i(c); mac[current] = num; } size++; } } } return i; }
int assertcmd(interpreteur inter, memory mem) { DEBUG_MSG("Chaine : %s", inter->input); char* token = NULL; if ((token = get_next_token(inter)) == NULL) { WARNING_MSG("no argument given to command %s\n", "assertcmd"); return 1; } if (strcmp(token, "reg") == 0) { if ((token = get_next_token(inter)) == NULL) { WARNING_MSG("not enough arguments given to command %s\n", "assertcmd"); return 1; } if (!is_register(token)) { char* token1; if((token1 = get_next_token(inter)) == NULL) { WARNING_MSG("not enough arguments given to command %s\n", "setcmd"); return 1; } if (get_type(token1) == INT) { if (atoi(token1) == mem->reg[reg_index(token)]) { printf("Ok\n"); return 0; } return 1; } else if (is_hexa(token1)) { if (strtol(token1, NULL, 16) == mem->reg[reg_index(token)]) { printf("Ok\n"); return 0; } return 1; } else { WARNING_MSG("second argument is not an integer %s\n", "assertcmd"); return 1; } } else { WARNING_MSG("first argument not a valid register%s\n", "assertcmd"); return 1; } } if (strcmp(token, "word") == 0) { if ((token = get_next_token(inter)) == NULL) { WARNING_MSG("not enough arguments given to command %s\n", "assertcmd"); return 1; } if (is_adress(token)) { char* token1; if ((token1 = get_next_token(inter)) == NULL) { WARNING_MSG("not enough arguments given to command %s\n", "assertcmd"); return 1; } word value; if (get_type(token1) == INT) value = atoi(token1); else if (is_hexa(token1)) value = strtol(token1, NULL, 16); else{ WARNING_MSG("second argument is not an integer %s\n", "assertcmd"); return 1; } byte bValue[4]; bValue[0] = (byte)((value & 0xff000000) >> 24); bValue[1] = (byte)((value & 0x00ff0000) >> 16); bValue[2] = (byte)((value & 0x0000ff00) >> 8); bValue[3] = (byte)((value & 0x000000ff)); size_t addr = strtol(token, NULL, 16); if (mem->endianness == LSB && bValue[0] == read_memory_value(addr, mem) && bValue[1] == read_memory_value(addr+1, mem) && bValue[2] == read_memory_value(addr+2, mem) && bValue[3] == read_memory_value(addr+3, mem)) { printf("Ok\n"); return 0; } else if (mem->endianness == MSB && bValue[0] == read_memory_value(addr+3, mem) && bValue[1] == read_memory_value(addr+2, mem) && bValue[2] == read_memory_value(addr+1, mem) && bValue[3] == read_memory_value(addr, mem)) { printf("Ok\n"); return 0; } return 1; } else { WARNING_MSG("first argument not a valid adress %s\n","assertcmd"); return 1; } }
int setcmd(interpreteur inter, memory mem) { DEBUG_MSG("Chaine : %s", inter->input); char* token = NULL; if ((token = get_next_token(inter)) == NULL) { WARNING_MSG("no argument given to command %s\n", "setcmd"); return 1; } if (strcmp(token, "mem") == 0) { if ((token = get_next_token(inter)) == NULL) { WARNING_MSG("not enough arguments given to command %s\n", "setcmd"); return 1; } if (!strcmp(token, "byte")) { if((token = get_next_token(inter)) == NULL) { WARNING_MSG("not enough arguments given to command %s\n", "setcmd"); return 1; } if(!is_adress(token)) { WARNING_MSG("third argument is not an adress range %s\n", "setcmd"); return 1; } size_t adress = strtol(token, NULL, 16); if((token = get_next_token(inter)) == NULL) { WARNING_MSG("not enough arguments given to command %s\n", "setcmd"); return 1; } if(!is_hexa(token)) { WARNING_MSG("fourth argument is not an hex %s\n", "setcmd"); return 1; } byte value = strtol(token, NULL, 16); if(write_memory_value(adress, value, mem)) { WARNING_MSG("address is not valid %s\n", "setcmd"); return 1; } return 0; } if (!strcmp(token, "word")) { if((token = get_next_token(inter)) == NULL) { WARNING_MSG("not enough arguments given to command %s\n", "setcmd"); return 1; } if(!is_adress(token)) { WARNING_MSG("third argument is not an adress range %s\n", "setcmd"); return 1; } size_t adress = strtol(token, NULL, 16); if((token = get_next_token(inter)) == NULL) { WARNING_MSG("not enough arguments given to command %s\n", "setcmd"); return 1; } if(!is_hexa(token)) { WARNING_MSG("fourth argument is not an hex %s\n", "setcmd"); return 1; } word wValue = strtol(token, NULL, 16); byte bValue[4]; bValue[0] = (byte)((wValue & 0xff000000) >> 24); bValue[1] = (byte)((wValue & 0x00ff0000) >> 16); bValue[2] = (byte)((wValue & 0x0000ff00) >> 8); bValue[3] = (byte)((wValue & 0x000000ff)); int i; if (mem->endianness == LSB) { for (i=0;i<=3;i++) { if (write_memory_value(adress+i, bValue[i], mem)) { WARNING_MSG("address is not valid %s\n", "setcmd"); return 1; } } } else if (mem->endianness == MSB) { for (i=0;i<=3;i++) { if (write_memory_value(adress+i, bValue[3-i], mem)) { WARNING_MSG("address is not valid %s\n", "setcmd"); return 1; } } } else ERROR_MSG("Endianness invaid\n"); return 0; } } if (strcmp(token, "reg") == 0) { if ((token = get_next_token(inter)) == NULL) { WARNING_MSG("not enough arguments given to command %s\n", "setcmd"); return 1; } if (!is_register(token)) { char* value; if ((value = get_next_token(inter)) != NULL) { if (get_type(value) == INT) mem->reg[reg_index(token)] = atoi(value); else if (is_hexa(value)) mem->reg[reg_index(token)] = strtol(value, NULL, 16); else { WARNING_MSG("value is not an integer %s\n", "setcmd"); return 1; } return 0; } else { WARNING_MSG("not enough arguments given to command %s\n", "setcmd"); return 1; } } else { WARNING_MSG("argument not a valid register%s\n", "setcmd"); return 1; } } else { WARNING_MSG("value %s is not a valid argument of command %s\n", token, "setcmd"); return 1; } return 1; }