---
 common.h                  |    4 +---
 sysdeps/linux-gnu/trace.c |   36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/common.h b/common.h
index 753d3dc..45d38fc 100644
--- a/common.h
+++ b/common.h
@@ -256,9 +256,7 @@ extern long gimme_arg(enum tof type, Process * proc, int 
arg_num, arg_type_info
 extern void save_register_args(enum tof type, Process * proc);
 extern int umovestr(Process * proc, void * addr, int len, void * laddr);
 extern int umovelong (Process * proc, void * addr, long * result, 
arg_type_info * info);
+extern size_t umovebytes (Process *proc, void * addr, void * laddr, size_t 
count);
 extern int ffcheck(void * maddr);
 extern void * sym2addr(Process *, struct library_symbol *);
 
-#if 0                          /* not yet */
-extern int umoven(Process * proc, void * addr, int len, void * laddr);
-#endif
diff --git a/sysdeps/linux-gnu/trace.c b/sysdeps/linux-gnu/trace.c
index 75d0d55..9f61a03 100644
--- a/sysdeps/linux-gnu/trace.c
+++ b/sysdeps/linux-gnu/trace.c
@@ -171,6 +171,42 @@ continue_after_breakpoint(Process *proc, Breakpoint *sbp) {
        }
 }
 
+size_t
+umovebytes(Process *proc, void *addr, void *laddr, size_t len) {
+
+       union {
+               long a;
+               char c[sizeof(long)];
+       } a;
+       int i;
+       int offset = 0, started = 0;
+       size_t bytes_read = 0;
+
+       while (offset < len) {
+               a.a = ptrace(PTRACE_PEEKTEXT, proc->pid, addr + offset, 0);
+               if (errno) {
+                       if (started && (errno == EPERM || errno == EIO))
+                               return bytes_read;
+
+                       if (addr != 0 && errno != EIO && errno != ESRCH)
+                               return -1;
+               }
+               started = 1;
+
+               if (len - offset >= sizeof(long)) {
+                       memcpy(laddr + offset, &a.c[0], sizeof(long));
+                       bytes_read += sizeof(long);
+               }
+               else {
+                       memcpy(laddr + offset, &a.c[0], len - offset);
+                       bytes_read += (len - offset);
+               }
+               offset += sizeof(long);
+       }
+
+       return bytes_read;
+}
+
 /* Read a series of bytes starting at the process's memory address
    'addr' and continuing until a NUL ('\0') is seen or 'len' bytes
    have been read.
-- 
1.7.0.4


_______________________________________________
Ltrace-devel mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/ltrace-devel

Reply via email to