From: Dmitry V. Levin Date: Thu, 11 Dec 2014 19:25:02 +0000 (+0000) Subject: process.c: move execve and execv parsers to a separate file X-Git-Tag: v4.10~300 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7be2318ad286bad093ff79858e54a40b7a65f208;p=strace process.c: move execve and execv parsers to a separate file * execve.c: New file. * Makefile.am (strace_SOURCES): Add it. * process.c: Move sys_execve, sys_execv, and related code to execve.c. --- diff --git a/Makefile.am b/Makefile.am index ce00548b..c344338d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -30,6 +30,7 @@ strace_SOURCES = \ count.c \ desc.c \ dirent.c \ + execve.c \ fadvise.c \ fallocate.c \ fanotify.c \ diff --git a/execve.c b/execve.c new file mode 100644 index 00000000..31e80a69 --- /dev/null +++ b/execve.c @@ -0,0 +1,86 @@ +#include "defs.h" + +static void +printargv(struct tcb *tcp, long addr) +{ + union { + unsigned int p32; + unsigned long p64; + char data[sizeof(long)]; + } cp; + const char *sep; + unsigned int n = 0; + unsigned wordsize = current_wordsize; + + cp.p64 = 1; + for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) { + if (umoven(tcp, addr, wordsize, cp.data) < 0) { + tprintf("%#lx", addr); + return; + } + if (wordsize == 4) + cp.p64 = cp.p32; + if (cp.p64 == 0) + break; + tprints(sep); + printstr(tcp, cp.p64, -1); + addr += wordsize; + } + if (cp.p64) + tprintf("%s...", sep); +} + +static void +printargc(const char *fmt, struct tcb *tcp, long addr) +{ + int count; + char *cp; + + for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) { + addr += sizeof(char *); + } + tprintf(fmt, count, count == 1 ? "" : "s"); +} + +int +sys_execve(struct tcb *tcp) +{ + if (entering(tcp)) { + printpath(tcp, tcp->u_arg[0]); + if (!verbose(tcp)) + tprintf(", %#lx", tcp->u_arg[1]); + else { + tprints(", ["); + printargv(tcp, tcp->u_arg[1]); + tprints("]"); + } + if (!verbose(tcp)) + tprintf(", %#lx", tcp->u_arg[2]); + else if (abbrev(tcp)) + printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]); + else { + tprints(", ["); + printargv(tcp, tcp->u_arg[2]); + tprints("]"); + } + } + return 0; +} + +#if defined(SPARC) || defined(SPARC64) +int +sys_execv(struct tcb *tcp) +{ + if (entering(tcp)) { + printpath(tcp, tcp->u_arg[0]); + if (!verbose(tcp)) + tprintf(", %#lx", tcp->u_arg[1]); + else { + tprints(", ["); + printargv(tcp, tcp->u_arg[1]); + tprints("]"); + } + } + return 0; +} +#endif /* SPARC || SPARC64 */ diff --git a/process.c b/process.c index 908adf63..cd0c516d 100644 --- a/process.c +++ b/process.c @@ -574,91 +574,6 @@ sys_getgroups32(struct tcb *tcp) return 0; } -static void -printargv(struct tcb *tcp, long addr) -{ - union { - unsigned int p32; - unsigned long p64; - char data[sizeof(long)]; - } cp; - const char *sep; - unsigned int n = 0; - unsigned wordsize = current_wordsize; - - cp.p64 = 1; - for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) { - if (umoven(tcp, addr, wordsize, cp.data) < 0) { - tprintf("%#lx", addr); - return; - } - if (wordsize == 4) - cp.p64 = cp.p32; - if (cp.p64 == 0) - break; - tprints(sep); - printstr(tcp, cp.p64, -1); - addr += wordsize; - } - if (cp.p64) - tprintf("%s...", sep); -} - -static void -printargc(const char *fmt, struct tcb *tcp, long addr) -{ - int count; - char *cp; - - for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) { - addr += sizeof(char *); - } - tprintf(fmt, count, count == 1 ? "" : "s"); -} - -#if defined(SPARC) || defined(SPARC64) -int -sys_execv(struct tcb *tcp) -{ - if (entering(tcp)) { - printpath(tcp, tcp->u_arg[0]); - if (!verbose(tcp)) - tprintf(", %#lx", tcp->u_arg[1]); - else { - tprints(", ["); - printargv(tcp, tcp->u_arg[1]); - tprints("]"); - } - } - return 0; -} -#endif - -int -sys_execve(struct tcb *tcp) -{ - if (entering(tcp)) { - printpath(tcp, tcp->u_arg[0]); - if (!verbose(tcp)) - tprintf(", %#lx", tcp->u_arg[1]); - else { - tprints(", ["); - printargv(tcp, tcp->u_arg[1]); - tprints("]"); - } - if (!verbose(tcp)) - tprintf(", %#lx", tcp->u_arg[2]); - else if (abbrev(tcp)) - printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]); - else { - tprints(", ["); - printargv(tcp, tcp->u_arg[2]); - tprints("]"); - } - } - return 0; -} - #include "xlat/ptrace_cmds.h" #include "xlat/ptrace_setoptions_flags.h" #include "xlat/nt_descriptor_types.h"