static void process_path(const image_process &p,string path,scanner_params::PrintOptions &po) { /* Check for "/r" in path which means print raw */ if(path.size()>2 && path.substr(path.size()-2,2)=="/r"){ path = path.substr(0,path.size()-2); } string prefix = get_and_remove_token(path); int64_t offset = stoi64(prefix); /* Get the offset. process */ u_char *buf = (u_char *)calloc(opt_pagesize,1); if(!buf) errx(1,"Cannot allocate buffer"); int count = p.pread(buf,opt_pagesize,offset); if(count<0){ cerr << p.image_fname() << ": " << strerror(errno) << " (Read Error)\n"; return; } /* make up a bogus feature recorder set and feature recorder */ feature_recorder_set fs(feature_recorder_set::DISABLED); pos0_t pos0(path+"-PRINT"); // insert the PRINT token sbuf_t sbuf(pos0,buf,count,count,true); // sbuf system will free scanner_params sp(scanner_params::scan,sbuf,fs,po); process_path_printer(sp); }
static void process_open_path(const image_process &p,std::string path,scanner_params::PrintOptions &po, const size_t process_path_bufsize) { /* Check for "/r" in path which means print raw */ if(path.size()>2 && path.substr(path.size()-2,2)=="/r"){ path = path.substr(0,path.size()-2); } std::string prefix = get_and_remove_token(path); int64_t offset = stoi64(prefix); /* Get the offset into the buffer process */ u_char *buf = (u_char *)calloc(process_path_bufsize,1); if(!buf){ std::cerr << "Cannot allocate " << process_path_bufsize << " buffer\n"; return; } int count = p.pread(buf,process_path_bufsize,offset); if(count<0){ std::cerr << p.image_fname() << ": " << strerror(errno) << " (Read Error)\n"; return; } /* make up a bogus feature recorder set and with a disabled feature recorder. * Then we call the path printer, which throws an exception after the printing * to prevent further printing. * * The printer is called when a PRINT token is found in the * forensic path, so that has to be added. */ feature_recorder_set fs(feature_recorder_set::SET_DISABLED,feature_recorder_set::null_hasher, feature_recorder_set::NO_INPUT,feature_recorder_set::NO_OUTDIR); pos0_t pos0(path+"-PRINT"); // insert the PRINT token sbuf_t sbuf(pos0,buf,count,count,true); // sbuf system will free scanner_params sp(scanner_params::PHASE_SCAN,sbuf,fs,po); try { process_path_printer(sp); } catch (path_printer_finished &e) { } }