static int lar_module_redraw(WINDOW *win) { int i, row = 2; struct larstat stat; print_module_title(win, "LAR Listing"); if (lar == 0) { mvwprintw(win, 11, 61 / 2, "Bad or missing LAR"); return 0; } /* Draw a line down the middle. */ for (i = 2; i < 21; i++) mvwaddch(win, i, 30, ACS_VLINE); /* Draw the names down the left side. */ for (i = 0; i < lcount; i++) { if (i == selected) wattrset(win, COLOR_PAIR(3) | A_BOLD); else wattrset(win, COLOR_PAIR(2)); mvwprintw(win, 2 + i, 1, "%.25s", lnames[i]); } /* Get the information for the LAR. */ if (larstat(lar, lnames[selected], &stat)) { printf("larstat failed\n"); return 0; } wattrset(win, COLOR_PAIR(2)); mvwprintw(win, row++, 32, "Offset: 0x%x", stat.offset); if (stat.compression) { mvwprintw(win, row++, 32, "Compression: %s", compression_table[stat.compression]); mvwprintw(win, row++, 32, "Compressed length: %d", stat.len); mvwprintw(win, row++, 32, "Compressed checksum: 0x%x", stat.compchecksum); } mvwprintw(win, row++, 32, "Length: %d", stat.reallen); mvwprintw(win, row++, 32, "Checksum: 0x%x", stat.checksum); mvwprintw(win, row++, 32, "Load address: 0x%llx", stat.loadaddress); mvwprintw(win, row++, 32, "Entry point: 0x%llx", stat.entry); return 0; }
static int add_payload(struct LAR *lar, struct larent *larent) { struct payload *payload; int plen; u8 *params = NULL; u8 *fptr; if (bayoucfg.n_entries == BAYOU_MAX_ENTRIES) return -1; payload = &bayoucfg.entries[bayoucfg.n_entries]; if (strncmp((char *)larent->name, "payload/", 8)) return -1; if (larstat(lar, (const char *)larent->name, &payload->stat)) return -1; /* Make sure the LAR entry is valid. */ if (!lfverify(lar, (const char *)larent->name)) return -1; /* Get a pointer to the start of the file. */ fptr = larfptr(lar, (const char *)larent->name); if (fptr == NULL) return -1; if (!verify_self(fptr)) return -1; payload->pentry.index = bayoucfg.n_entries; payload->pentry.parent = 0; payload->pentry.type = BPT_TYPE_CHOOSER; payload->pentry.flags = 0; plen = self_get_params(fptr, ¶ms); payload_parse_params(payload, params, plen); payload->fptr = fptr; bayoucfg.n_entries++; return 0; }
int get_configuration(struct LAR *lar) { struct larstat stat; struct bpt_config *bptcfg; u8 *fptr, *ptr; int i; /* * If bayou_payload_table doesn't exist, then dummy up * a table from the LAR contents. */ if (larstat(lar, "bayou_payload_table", &stat) || !lfverify(lar, "bayou_payload_table")) build_dummy_table(lar); /* Open up the BPT and get the creamy goodness within. */ fptr = larfptr(lar, "bayou_payload_table"); if (fptr == NULL) build_dummy_table(lar); bptcfg = (struct bpt_config *)fptr; bayoucfg.timeout = bptcfg->timeout; bayoucfg.n_entries = bptcfg->entries; if (bayoucfg.n_entries > BAYOU_MAX_ENTRIES) { printf("W: Limiting the number of entries to %d\n", BAYOU_MAX_ENTRIES); bayoucfg.n_entries = BAYOU_MAX_ENTRIES; } ptr = fptr + sizeof(struct bpt_config); for (i = 0; i < bayoucfg.n_entries; i++) { struct bpt_pentry *entry = (struct bpt_pentry *)ptr; struct payload *p = &(bayoucfg.entries[i]); int plen; u8 *params = NULL; memcpy(&p->pentry, entry, sizeof(struct bpt_pentry)); if (entry->type != BPT_TYPE_CHAIN) { char *lname = (char *)ptr + sizeof(struct bpt_pentry); if (larstat(lar, (const char *)lname, &p->stat)) build_dummy_table(lar); if (!lfverify(lar, (const char *)lname)) build_dummy_table(lar); fptr = larfptr(lar, (const char *)lname); if (verify_self(fptr)) p->fptr = fptr; else build_dummy_table(lar); plen = self_get_params(fptr, ¶ms); payload_parse_params(p, params, plen); } ptr += sizeof(struct bpt_pentry) + entry->nlen; } return 0; }