// the exposed libscalpel API // NOTE: This function is deprecated and will be removed. Use the // libscalpel_* functions instead. // TODO make the driver in scalpel_exec.c use this (minor refactoring needed) // TODO add support for the remaining options avail from cmd-line // returns SCALPEL_OK on no error, can throw runtime_error exception on errors int scalpel_carveSingleInput(ScalpelInputReader * const reader, const char * const confFilePath, const char * const outDir, const unsigned char generateFooterDb, const unsigned char handleEmbedded, const unsigned char organizeSubdirs, const unsigned char previewMode, const unsigned char carveWithMissingFooters, const unsigned char noSearchOverlap) throw (std::runtime_error) { if (!reader || ! confFilePath || ! outDir) { //invalid args throw std::runtime_error("Invalid empty arguments"); } if (!reader->dataSource || !reader->id) { throw std::runtime_error("Invalid empty input reader arguments"); } //check fns if (!reader->open || !reader->read || !reader->seeko || !reader->tello || !reader->close || !reader->getError || !reader->getSize) { throw std::runtime_error("Reader callbacks not setup"); } struct scalpelState state; std::string processorName ("scalpel_carveSingleInput()"); char * args[5]; args[0] = const_cast<char*> ( processorName.c_str()); args[1] = reader->id; args[2] = const_cast<char*> (confFilePath); args[3] = const_cast<char*> (outDir); args[4] = 0; initializeState(args, &state); //setup input state.inReader = reader; //setup options const size_t outDirLen = strlen(outDir); strncpy(state.outputdirectory, outDir, outDirLen); state.outputdirectory[outDirLen] = 0; const size_t confFilePathLen = strlen(confFilePath); strncpy(state.conffile, confFilePath, confFilePathLen); state.conffile[confFilePathLen] = 0; state.generateHeaderFooterDatabase = generateFooterDb; state.handleEmbedded = handleEmbedded; state.organizeSubdirectories = organizeSubdirs; state.previewMode = previewMode; state.carveWithMissingFooters = carveWithMissingFooters; state.noSearchOverlap = noSearchOverlap; convertFileNames(&state); // read configuration file int err; if ((err = readSearchSpecFile(&state))) { // problem with config file handleError(&state, err); //can throw freeState(&state); std::stringstream ss; ss << "Error reading spec file, error code: " << err; throw std::runtime_error(ss.str()); } // prepare audit file and make sure output directory is empty. if ((err = openAuditFile(&state))) { handleError(&state, err); //can throw freeState(&state); std::stringstream ss; ss << "Error opening audit file, error code: " << err; throw std::runtime_error(ss.str()); } // Initialize the backing store of buffer to read-in, process image data. init_store(); // Initialize threading model for cpu or gpu search. init_threading_model(&state); if ((err = digImageFile(&state))) { handleError(&state, err); //can throw closeAuditFile(state.auditFile); destroyStore(); freeState(&state); std::stringstream ss; ss << "Error digging file, error code: " << err; throw std::runtime_error(ss.str()); } if ((err = carveImageFile(&state))) { handleError(&state, err); //can throw closeAuditFile(state.auditFile); destroy_threading_model(&state); destroyStore(); freeState(&state); std::stringstream ss; ss << "Error carving file, error code: " << err; throw std::runtime_error(ss.str()); } closeAuditFile(state.auditFile); destroy_threading_model(&state); destroyStore(); freeState(&state); return SCALPEL_OK; }
int main(int argc, char **argv) { time_t starttime=time(0); struct scalpelState state; if (ldiv(SIZE_OF_BUFFER,SCALPEL_BLOCK_SIZE).rem != 0) { fprintf (stderr, SCALPEL_SIZEOFBUFFER_PANIC_STRING); exit (-1); } #ifndef __GLIBC__ setProgramName(argv[0]); #endif fprintf (stdout,SCALPEL_BANNER_STRING); initializeState(argv,&state); processCommandLineArgs(argc,argv,&state); convertFileNames(&state); if (state.modeVerbose) { fprintf (stdout,"Output directory: \"%s\"\n", state.outputdirectory); fprintf (stdout,"Configuration file: \"%s\"\n", state.conffile); fprintf (stdout,"Coverage maps directory: \"%s\"\n", state.coveragedirectory); } // read configuration file if (readSearchSpecFile(&state)) { // error in configuration file, msg has already been output exit(-1); } setttywidth(); argv += optind; if (*argv != NULL || state.useInputFileList) { // prepare audit file and make sure output directory is empty. if(openAuditFile(&state)){ fprintf(stderr, "Aborting.\n\n"); exit(-1); } digAllFiles(argc,argv,&state); closeFile(state.auditFile); } else { usage(); fprintf(stdout,"\nERROR: No image files specified.\n\n"); } #ifdef __WIN32 fprintf (stdout,"\nScalpel is done, files carved = %I64u, elapsed = %ld seconds.\n", state.fileswritten, (int)time(0) - starttime); #else fprintf (stdout,"\nScalpel is done, files carved = %llu, elapsed = %ld seconds.\n", state.fileswritten, (int)time(0) - starttime); #endif return 0; }
int libscalpel_initialize(scalpelState ** state, char * confFilePath, char * outDir, const scalpelState & options) { std::string funcname("libscalpel_initialize"); if (state == NULL) throw std::runtime_error(funcname + ": state argument must not be NULL."); if (*state != NULL) throw std::runtime_error(funcname + ": state has already been allocated."); if (outDir == NULL || strlen(outDir) == 0) throw std::runtime_error(funcname + ": no output directory provided."); if (confFilePath == NULL || strlen(confFilePath) == 0) throw std::runtime_error(funcname + ": no configuration file path provided."); scalpelState * pState = new scalpelState(options); char * argv[3]; argv[0] = confFilePath; argv[1] = outDir; argv[2] = NULL; initializeState(&argv[0], pState); const size_t outDirLen = strlen(outDir); strncpy(pState->outputdirectory, outDir, outDirLen + 1); pState->outputdirectory[outDirLen + 1] = 0; const size_t confFilePathLen = strlen(confFilePath); strncpy(pState->conffile, confFilePath, confFilePathLen + 1); pState->conffile[confFilePathLen + 1] = 0; convertFileNames(pState); int err = 0; // prepare audit file and make sure output directory is empty. if ((err = openAuditFile(pState))) { handleError(pState, err); //can throw std::stringstream ss; ss << ": Error opening audit file, error code: " << err; throw std::runtime_error(funcname + ss.str()); } // read configuration file if ((err = readSearchSpecFile(pState))) { // problem with config file handleError(pState, err); //can throw std::stringstream ss; ss << ": Error reading spec file, error code: " << err; throw std::runtime_error(funcname + ss.str()); } // Initialize the backing store of buffer to read-in, process image data. init_store(); // Initialize threading model for cpu or gpu search. init_threading_model(pState); *state = pState; return SCALPEL_OK; }