Ping !
Le jeudi 20 décembre 2012 à 21:53 +0100, Laurent Vivier a écrit : > This patch allows to have IP addresses in correct order > in the case of "netstat -nr" when the endianess of the > guest differs from one of the host. > > For instance, an m68k guest on an x86_64 host: > > WITHOUT this patch: > > $ netstat -nr > Kernel IP routing table > Destination Gateway Genmask Flags MSS Window irtt Iface > 0.0.0.0 1.3.0.10 0.0.0.0 UG 0 0 0 eth0 > 0.3.0.10 0.0.0.0 0.255.255.255 U 0 0 0 eth0 > $ cat /proc/net/route > Iface Destination Gateway Flags RefCnt Use Metric Mask > MTU Window IRTT > > eth0 00000000 0103000A 0003 0 0 0 > 000000000 0 0 > eth0 0003000A 00000000 0001 0 0 0 > 00FFFFFF0 0 0 > > WITH this patch: > > $ netstat -nr > Kernel IP routing table > Destination Gateway Genmask Flags MSS Window irtt Iface > 0.0.0.0 10.0.3.1 0.0.0.0 UG 0 0 0 eth0 > 10.0.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 > $ cat /proc/net/route > Iface Destination Gateway Flags RefCnt Use Metric Mask > MTU Window IRTT > eth0 00000000 0a000301 0003 0 0 0 > 000000000 0 0 > eth0 0a000300 00000000 0001 0 0 0 > ffffff000 0 0 > > Signed-off-by: Laurent Vivier <laur...@vivier.eu> > --- > linux-user/syscall.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index e99adab..501002b 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -5085,6 +5085,45 @@ static int open_self_auxv(void *cpu_env, int fd) > return 0; > } > > +#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN) > +static int open_net_route(void *cpu_env, int fd) > +{ > + FILE *fp; > + char *line = NULL; > + size_t len = 0; > + ssize_t read; > + > + fp = fopen("/proc/net/route", "r"); > + if (fp == NULL) { > + return -EACCES; > + } > + > + /* read header */ > + > + read = getline(&line, &len, fp); > + dprintf(fd, "%s", line); > + > + /* read routes */ > + > + while ((read = getline(&line, &len, fp)) != -1) { > + char iface[16]; > + uint32_t dest, gw, mask; > + unsigned int flags, refcnt, use, metric, mtu, window, irtt; > + sscanf(line, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n", > + iface, &dest, &gw, &flags, &refcnt, &use, &metric, > + &mask, &mtu, &window, &irtt); > + dprintf(fd, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n", > + iface, tswap32(dest), tswap32(gw), flags, refcnt, use, > + metric, tswap32(mask), mtu, window, irtt); > + } > + > + free(line); > + fclose(fp); > + > + return 0; > +} > +#endif > + > static int do_open(void *cpu_env, const char *pathname, int flags, mode_t > mode) > { > struct fake_open { > @@ -5096,6 +5135,9 @@ static int do_open(void *cpu_env, const char *pathname, > int flags, mode_t mode) > { "/proc/self/maps", open_self_maps }, > { "/proc/self/stat", open_self_stat }, > { "/proc/self/auxv", open_self_auxv }, > +#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN) > + { "/proc/net/route", open_net_route }, > +#endif > { NULL, NULL } > }; > -- "Just play. Have fun. Enjoy the game." - Michael Jordan "Just play. Have fun. Enjoy the game." - Michael Jordan