static int __close(RIODesc *desc) { int pid, fd; if (!desc || !desc->data) return -1; pid = RIOPTRACE_PID (desc); fd = RIOPTRACE_FD (desc); if (fd!=-1) close (fd); free (desc->data); desc->data = NULL; return ptrace (PTRACE_DETACH, pid, 0, 0); }
static int __read(RIO *io, RIODesc *desc, ut8 *buf, int len) { int fd; ut64 addr = io->off; if (!desc || !desc->data) return -1; memset (buf, '\xff', len); // TODO: only memset the non-readed bytes fd = RIOPTRACE_FD (desc); if (fd != -1) { lseek (fd, addr, SEEK_SET); return read (fd, buf, len); } return debug_os_read_at (RIOPTRACE_PID (desc), (ut32*)buf, len, addr); }
static int __read(RIO *io, RIODesc *desc, ut8 *buf, int len) { int ret, fd; ut64 addr = io->off; if (!desc || !desc->data) return -1; memset (buf, '\xff', len); // TODO: only memset the non-readed bytes fd = RIOPTRACE_FD (desc); if (fd != -1) { ret = lseek (fd, addr, SEEK_SET); if (ret < 0) return -1; ret = read (fd, buf, len); // Workaround for the buggy Debian Wheeze's /proc/pid/mem if (ret != -1) return ret; } return debug_os_read_at (RIOPTRACE_PID (desc), (ut32*)buf, len, addr); }