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