Date: Wed, 26 May 2004 20:52:24 +0900 From: Akihiro Sagawa <sagawa@sohgoh.net> To: freebsd-emulation@freebsd.org Cc: Sharp Gao <imgaolong@yahoo.com.cn> Subject: Re: Device name convert for linux use Message-ID: <20040526204931.0F7E.SAGAWA@sohgoh.net> In-Reply-To: <20040524060403.7239.qmail@web15105.mail.bjs.yahoo.com> References: <20040524060403.7239.qmail@web15105.mail.bjs.yahoo.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi,
In "Device name convert for linux use", wrote:
> I was developig a name and major/minor device number converting
> mechanism for linux applications to use on a linux.ko module , as if
> the application itself run on a linux.
(snip)
> Is this helpful to linux emulator ?
This mail was a bit old, but that sounds great.
AFAIK, glibc's wordexp(3) checks /dev/null's device number before
opening /dev/null as stderr for a shell. If they are not match (ie.
under FreeBSD Linux emulation mode), wordexp always returns error.
And (maybe?) ld-linux.so also checks /dev/null's device number before
launching programs when one of stdin, stdout, stderr is closed and program
has set SetUID bit. (In glibc-2.3.2/sysdeps/generic/dl-sysdep.c???)
Therefore I made a quick hack patch for sys/compat/linux/linux_stats.c
to tell a lie about /dev/null's device number. But Sharp Gao's way seems
to be better. :)
Where is the patch?
--
Akihiro SAGAWA <sagawa@sohgoh.net>
To reproduce this problem, compile below source
with linux gcc.
---- for wordexp, cut here
#include <stdio.h>
#include <wordexp.h>
int main(int argc, char* argv[])
{
int i, err;
wordexp_t we;
err = wordexp("`date`", &we, 0);
printf("err=%d\n", err);
if (!err)
for(i=0; i < we.we_wordc; i++)
printf("[%d] %s\n", i, we.we_wordv[i]);
wordfree(&we);
}
---- to here
---- for ld-linux, cut here
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
char* exec_args[] = {"id", NULL};
printf("bye stdin\n");
close(STDIN_FILENO);
printf("stdin has closed\n");
fflush(stdout);
execvp(exec_args[0], exec_args);
printf("failed to exec prog.\n");
exit(1);
}
---- to here
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040526204931.0F7E.SAGAWA>
