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>