int nvram_parse_mac_addr(const char *nvram, unsigned nvram_len, const char *name, char *mac) { char *buf; char *mac_str; int ret; int t; buf = vmalloc(nvram_len); if (!buf) return -ENOMEM; memcpy(buf, nvram, nvram_len); buf[nvram_len - 1] = '\0'; mac_str = nvram_find_var(name, buf, nvram_len); if (!mac_str) { ret = -EINVAL; goto free; } t = sscanf(mac_str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); if (t != 6) { ret = -EINVAL; goto free; } ret = 0; free: vfree(buf); return ret; }
int nvram_get_var(const char* name) { enter_critical_section(); NvramVar* var = nvram_find_var(name); if(var == NULL) { puts("unable to find nvram entry\n\n"); exit_critical_section(); return -1; } printf("%s = %s\n", var->name, var->string); exit_critical_section(); return 0; }
int nvram_remove_var(const char* name) { NvramVar* var = nvram_find_var(name); if(var == NULL) { return -1; } NvramVar* next = var->next; NvramVar* prev = var->prev; next->prev = prev; prev->next = next; var->next = 0; var->prev = 0; free(var->string); free(var); return 0; }
int nvram_set_var(const char* name, const char* value) { enter_critical_section(); NvramVar* var = NULL; var = nvram_find_var(name); if(var != NULL) { nvram_remove_var(name); var = NULL; } NvramVar* next = (NvramVar*) gNvramList; NvramVar* prev = (NvramVar*) gNvramList->prev; var = malloc(sizeof(NvramVar)); if(var == NULL) { exit_critical_section(); return -1; } strncpy(var->name, name, 0x40); var->string = malloc(0x200); if(var->string == NULL) { free(var); exit_critical_section(); return -1; } strncpy(var->string, value, 0x200); var->integer = strtoul(var->string, NULL, 0); var->save = 1; var->next = next; var->prev = prev; next->prev = var; prev->next = var; exit_critical_section(); return 0; }
int main(int argc, CmdArg* argv) { int i = 0; char result[0x10]; if(!gGpHasInit || gCmdCount == 0) { if(gp_init()) { puts("Unable to initialize greenpois0n!!\n"); return -1; } puts("=========================\n"); puts("iFaith Thanks & Credits:\n"); puts("=========================\n"); puts("* AKi_nG\n"); puts("* bile\n"); puts("* Chronic Dev-Team\n"); puts("* CPICH\n"); puts("* cj\n"); puts("* demize\n"); puts("* geohot\n"); puts("* GreySyntax\n"); puts("* iFish12\n"); puts("* msftguy\n"); puts("* MuscleNerd\n"); puts("* Neal\n"); puts("* planetbeing\n"); puts("* pod2g\n"); puts("* posixninja\n"); puts("* qwertyoruiop\n"); puts("* sbingner\n"); puts("* ThePirate\n"); puts("* vonswanko\n"); puts("=========================\n"); cmd_detect(); fs_mount("nand0a", "hfs", "/boot"); //puts("HFS+ filesystem mounted.\n") //puts("=========================\n"); return 0; } for(i = 1; i < argc; i++) { if(!strcmp(argv[i].string, "$_")) { NvramVar* retval = nvram_find_var("?"); argv[i].string = retval->string; continue; } if(argv[i].string[0] == '$') { NvramVar* var = nvram_find_var(&(argv[i].string[1])); if(var == NULL) { printf("Unable to find nvram var for %s\n", &(argv[i].string[1])); } else { argv[i].string = var->string; } } } if(argc > 1) { int i = 0; char* command = argv[1].string; for(i = 0; i < gCmdCount; i++) { if(!strcmp(gCmdCommands[i]->name, command)) { int ret = gCmdCommands[i]->handler(argc-1, &argv[1]); snprintf(result, 0xF, "0x%x", ret); nvram_set_var("cmd-results", result); return ret; } } printf("Command %s not found.\n\n", command); return -1; } return 0; }