From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LSzgs-0006W6-GS for qemu-devel@nongnu.org; Fri, 30 Jan 2009 15:10:14 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LSzgp-0006VI-Sr for qemu-devel@nongnu.org; Fri, 30 Jan 2009 15:10:14 -0500 Received: from [199.232.76.173] (port=47784 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LSzgp-0006VF-I3 for qemu-devel@nongnu.org; Fri, 30 Jan 2009 15:10:11 -0500 Received: from hall.aurel32.net ([88.191.82.174]:59627) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LSzgp-0007uq-1S for qemu-devel@nongnu.org; Fri, 30 Jan 2009 15:10:11 -0500 Date: Fri, 30 Jan 2009 21:10:08 +0100 From: Aurelien Jarno Subject: Re: [Qemu-devel] [PATCH] linux-user: identify running binary in /proc/self/exe Message-ID: <20090130201008.GA25693@hall.aurel32.net> References: <20090119153008.GA20882@kos.to> <200901191557.27453.paul@codesourcery.com> <20090120160104.GA4358@kos.to> <20090126190711.GA1135@kos.to> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: <20090126190711.GA1135@kos.to> Sender: Aurelien Jarno Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Riku Voipio Cc: qemu-devel@nongnu.org On Mon, Jan 26, 2009 at 09:07:11PM +0200, Riku Voipio wrote: > Some applications like to test /proc/self/exe to find > out who they are. Fake the result of readlink() for > them. Use realpath() to return full path to binary > (which the links /proc/self/exe are) > > updated version - fix ret/errno in the /proc/self/exe case. > > Signed-off-by: Riku Voipio Thanks, applied. > --- > linux-user/main.c | 3 +++ > linux-user/qemu.h | 1 + > linux-user/syscall.c | 15 ++++++++++++--- > 3 files changed, 16 insertions(+), 3 deletions(-) > > diff --git a/linux-user/main.c b/linux-user/main.c > index cb10173..3418ca6 100644 > --- a/linux-user/main.c > +++ b/linux-user/main.c > @@ -37,6 +37,8 @@ > > #define DEBUG_LOGFILE "/tmp/qemu.log" > > +char *exec_path; > + > static const char *interp_prefix = CONFIG_QEMU_PREFIX; > const char *qemu_uname_release = CONFIG_UNAME_RELEASE; > > @@ -2354,6 +2356,7 @@ int main(int argc, char **argv, char **envp) > if (optind >= argc) > usage(); > filename = argv[optind]; > + exec_path = argv[optind]; > > /* Zero out regs */ > memset(regs, 0, sizeof(struct target_pt_regs)); > diff --git a/linux-user/qemu.h b/linux-user/qemu.h > index 9fddd05..4137567 100644 > --- a/linux-user/qemu.h > +++ b/linux-user/qemu.h > @@ -120,6 +120,7 @@ typedef struct TaskState { > uint8_t stack[0]; > } __attribute__((aligned(16))) TaskState; > > +extern char *exec_path; > void init_task_state(TaskState *ts); > extern const char *qemu_uname_release; > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 690df14..2903bf3 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -4877,13 +4877,22 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > #endif > case TARGET_NR_readlink: > { > - void *p2; > + void *p2, *temp; > p = lock_user_string(arg1); > p2 = lock_user(VERIFY_WRITE, arg2, arg3, 0); > if (!p || !p2) > ret = -TARGET_EFAULT; > - else > - ret = get_errno(readlink(path(p), p2, arg3)); > + else { > + if (strncmp((const char *)p, "/proc/self/exe", 14) == 0) { > + char real[PATH_MAX]; > + temp = realpath(exec_path,real); > + ret = (temp==NULL) ? get_errno(-1) : strlen(real) ; > + snprintf((char *)p2, arg3, "%s", real); > + } > + else > + ret = get_errno(readlink(path(p), p2, arg3)); > + break; > + } > unlock_user(p2, arg2, ret); > unlock_user(p, arg1, 0); > } > -- > 1.5.6.5 > > > > -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurelien@aurel32.net http://www.aurel32.net