int tracer_copy_in( struct tracer *t, void *data, const void *uaddr, int length ) { int result; static int fast_read_success = 0; static int fast_read_failure = 0; static int fast_read_attempts = 100; UPTRINT_T iuaddr = (UPTRINT_T)uaddr; #if !defined(CCTOOLS_CPU_I386) if(!tracer_is_64bit(t)) iuaddr &= 0xffffffff; #endif if(fast_read_success>0 || fast_read_failure<fast_read_attempts) { result = full_pread64(t->memory_file,data,length,iuaddr); if(result>0) { fast_read_success++; return result; } else { fast_read_failure++; // fall through to slow method, print message on the last attempt. if(fast_read_success==0 && fast_read_failure>=fast_read_attempts) { debug(D_SYSCALL,"reading from /proc/X/mem failed, falling back to slow ptrace read"); } } } result = tracer_copy_in_slow(t,data,(void*)iuaddr,length); return result; }
int tracer_copy_in( struct tracer *t, void *data, const void *uaddr, int length ) { int result; static int has_fast_read = 1; UPTRINT_T iuaddr = (UPTRINT_T)uaddr; #if !defined(CCTOOLS_CPU_I386) if(!tracer_is_64bit(t)) iuaddr &= 0xffffffff; #endif if(has_fast_read) { result = full_pread64(t->memory_file,data,length,iuaddr); if( result<=0 && errno==EINVAL ) { has_fast_read = 0; debug(D_SYSCALL,"reading from /proc/X/mem failed, falling back to slow ptrace read"); } else { return result; } } result = tracer_copy_in_slow(t,data,(void*)iuaddr,length); return result; }
static INT64_T chirp_fs_local_pread(int fd, void *buffer, INT64_T length, INT64_T offset) { INT64_T result; result = full_pread64(fd, buffer, length, offset); if(result < 0 && errno == ESPIPE) { /* if this is a pipe, return whatever amount is available */ result = read(fd, buffer, length); } return result; }
static INT64_T chirp_fs_local_pread(int fd, void *buffer, INT64_T length, INT64_T offset) { PREAMBLE("pread(%d, %p, %zu, %" PRId64 ")", fd, buffer, (size_t)length, offset); SETUP_FILE rc = full_pread64(lfd, buffer, length, offset); if(rc < 0 && errno == ESPIPE) { /* if this is a pipe, return whatever amount is available */ rc = read(lfd, buffer, length); } PROLOGUE }