int main(int argc, char* argv[]) { int optarg; for(optarg = 1; optarg < argc; ++optarg) { char *dll, *filename, *dll_name; size_t dllsz; uint32 i, *name_rvas, nexp, num_entries; pe_data_directory *datadir; pe_export_directory* expdata; pe32_opt_header* opt_hdr_32; pe_type type; filename = argv[optarg]; dll = mmap_read(filename, &dllsz); if(dll == NULL) return 1; dll_name = str_basename(filename); opt_hdr_32 = pe_header_opt(dll); type = uint16_get(&opt_hdr_32->magic); datadir = pe_get_datadir(dll, &num_entries); if(num_entries < 1) /* no exports */ return 1; expdata = pe_rva2ptr(dll, uint32_get(&datadir->virtual_address)); nexp = uint32_get(&expdata->number_of_names); name_rvas = pe_rva2ptr(dll, uint32_get(&expdata->address_of_names)); buffer_puts(buffer_1, "EXPORTS\n"); (void)dll_name; /* buffer_putm_3(buffer_1, "LIBRARY ", dll_name, "\n"); */ for(i = 0; i < nexp; i++) { buffer_putm_3(buffer_1, " ", pe_rva2ptr(dll, uint32_get(&name_rvas[i])), " @ "); buffer_putulong(buffer_1, 1 + i); buffer_putnlflush(buffer_1); } mmap_unmap(dll, dllsz); } return 0; }
static void parse_mime_types(const char* filename) { size_t maplen; const char* map=mmap_read(filename,&maplen); unsigned int allocated=0,used=0; struct mimeentry* nmt=0; if (map) { const char* mimetype; const char* extension; const char* end=map+maplen; const char* x,* l; struct pool* p=malloc(sizeof(struct pool)); if (!p) goto kaputt; pinit(p); for (l=map; l<end; l=nextline(l,end)) { x=skipws(l,end); if (x>=end) break; if (*x=='#' || *x=='\n') continue; mimetype=x; x=skipnonws(x,end); if (x>=end) break; if (*x=='#' || *x=='\n') continue; mimetype=memdup(p,mimetype,x); x=skipws(x,end); if (x>=end) break; if (*x=='#' || *x=='\n') continue; while (x<end) { extension=x; x=skipnonws(x,end); if (x>extension) { extension=memdup(p,extension,x); if (!extension) continue; // printf("%s -> %s\n",extension,mimetype); if (used+1 > allocated) { struct mimeentry* tmp; allocated+=16; tmp=realloc(nmt,allocated*sizeof(nmt[0])); if (!tmp) { free(nmt); pfree(p); free(p); nmt=0; goto kaputt; } nmt=tmp; } nmt[used].name=extension; nmt[used].type=mimetype; ++used; } x=skipws(x,end); if (x>=end || *x=='#' || *x=='\n') break; } if (x>=end) break; } if (mimepool) { pfree(mimepool); free(mimepool); } mimepool=p; kaputt: mmap_unmap((char*)map,maplen); } if (nmt) { nmt[used].name=nmt[used].type=0; free(mimetypes); mimetypes=nmt; } }