Device name convert for linux use
Akihiro Sagawa
sagawa at sohgoh.net
Wed May 26 04:53:11 PDT 2004
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 at 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
More information about the freebsd-emulation
mailing list