Heitor Ricardo Alves de Siqueira <hal...@linux.vnet.ibm.com> writes: > +static void dump_entry_data(struct ipr_dump_entry_header *hdr) > +{ > + u32 i; > + char *s; > + > + switch (hdr->id) { > + case ID_IOA_DUMP: > + fprintf(out_fp, "Smart Dump Table Data:\n"); > + print_sdt(hdr->offset); > + break; > + case ID_IOA_LOC: > + fprintf(out_fp, "IOA Location:\n"); > + s = dump_map+hdr->offset; > + fprintf(out_fp, "\t %.*s\n\n", hdr->len, s); > + break; > + case ID_DRV_VER: > + fprintf(out_fp, "Driver Version:\n"); > + s = dump_map+hdr->offset; > + fprintf(out_fp, "\t %.*s\n\n", hdr->len, s); > + break; > + case ID_DRV_TRACE: > + fprintf(out_fp, "Driver Trace Entries:\n"); > + print_trace(hdr); > + fprintf(out_fp, "\n"); > + break; > + case ID_DRV_TYPE: > + fprintf(out_fp, "Driver Type:\n"); > + memcpy(&i, dump_map+hdr->offset, sizeof(i)); > + i = TARGET_TO_HOST32(i, hdr->eye_catcher);
Skip the memcpy and convert directly from dump_map+hdr->offset. > + fprintf(out_fp, "\t CCIN: 0x%04X\n", i); > + memcpy(&i, dump_map+hdr->offset+sizeof(i), sizeof(i)); > + i = TARGET_TO_HOST32(i, hdr->eye_catcher); Likewise. > + fprintf(out_fp,"\t Adapter firmware Version: " > + " %02X:%02X:%02X:%02X\n\n", > + i >> 24, /* major release */ > + (i & 0x00FF0000) >> 16, /* card type */ > + (i & 0x0000FF00) >> 8, /* minor release 0 */ > + i & 0x000000FF); /* minor release 1 */ > + break; > + case ID_DRV_CTRL_BLK: > + case ID_DRV_PEND_OPS: > + /* not implemented yet */ > + fprintf(stderr, > + "Warning: found IPR Control Block or IPR Pending Ops!\n" > + "These are not implemented yet. Skipping...\n"); > + break; > + default: > + fprintf(stderr, > + "Warning: did not recognize data identification " > + "(id 0x%08X). Skipping...\n\n", hdr->id); > + } > +} > + > +/** > + * fsize - > + * @filename: ipr dump file name > + * > + * Returns: > + * ipr dump file size > + **/ > +off_t fsize(const char *filename) > +{ > + struct stat st; > + > + if (stat(filename, &st) == 0) > + return st.st_size; > + > + fprintf(stderr, "Cannot determine size of %s: %s\n", > + filename, strerror(errno)); > + > + return -1; > +} > + > +/** > + * print_usage - > + * > + * Returns: > + * nothing > + **/ > +static void print_usage() > +{ > + fprintf(stdout, > + "Usage: iprdumpfmt [options] <dump_file> <report_file>\n" > + " Options:\n" > + "\t-h --help\tPrint this message\n" > + "\t-v --verbose\tPrint verbose trace data\n"); > +} > + > +int main(int argc, char *argv[]) > +{ > + u32 i, offset; > + int in_fd; > + struct ipr_dump_header hdr; > + struct ipr_dump_entry_header entry_hdr; > + > + while (1) { > + static struct option long_options[] = { > + {"verbose", no_argument, &verbose_trace, 1}, > + {"brief", no_argument, &verbose_trace, 0}, > + {"help", no_argument, 0, 'h'}, > + {0, 0, 0, 0} > + }; Make this struct global. static keyword has a different meaning when used inside a function and there is no point in using it here. > + dump_map = mmap(NULL, fsize(argv[optind]), PROT_READ, MAP_PRIVATE, > in_fd, 0); > + > + read_dump_header(&hdr); > + print_dump_header(&hdr); > + fprintf(out_fp, "\n"); > + > + if (dump_map == MAP_FAILED) { > + fprintf(stderr, "Could not map dump file to memory: %s\n", > + strerror(errno)); > + return errno; > + } In read_dump_header you use dump_map, but you only check if the mmap failed afterwards. This will get you a segfault inside read_dump_header if the mapping fails. Do the verification right after the mmap, before doing anything else. > + > + offset = hdr.first_entry_offset; > + for (i = 0; i < hdr.num_entries; ++i) { > + offset = read_entry_header(&entry_hdr, offset); > + dump_entry_data(&entry_hdr); > + } > + > + return 0; > +} -- Gabriel Krisman Bertazi ------------------------------------------------------------------------------ _______________________________________________ Iprdd-devel mailing list Iprdd-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/iprdd-devel