On Tue, Mar 1, 2011 at 15:37, Nelson A. de Oliveira <nao...@debian.org> wrote:
> Hi again!
>
> On Tue, Mar 1, 2011 at 2:13 PM, Nelson A. de Oliveira <nao...@debian.org> 
> wrote:
>> Note the garbage in the source address. Maybe this could give us some
>> hint about the problem?
>
> OK, it seems to be what I was thinking that it's :-)
> It gets the IP address in src/Util_NetBSD.cc line 33, where it greps for 
> "inet "
>
> But see, with LC_ALL=C:
>
> $ ifconfig eth0 | fgrep inet
>          inet addr:200.145.221.37  Bcast:200.145.221.255  Mask:255.255.255.0
>          inet6 addr: fe80::240:a7ff:fe15:39a9/64 Scope:Link
>
> While with pt_BR:
>
> $ ifconfig eth0 | fgrep inet
>          inet end.: 200.145.221.37  Bcast:200.145.221.255  Masc:255.255.255.0
>          endereço inet6: fe80::240:a7ff:fe15:39a9/64 Escopo:Link
>
> See that with pt_BR there is a space before the IP number, while with
> LC_ALL there isn't.
> Wrong number of fields (4 fields with LC_ALL=C versus 5 fields in
> pt_BR) is causing this issue.
>
> Maybe it's a bug in the translation that has included this space, but
> paris-traceroute should be more robust about cases like this (maybe
> using inet_ntoa() or something else that returns the IP number in
> C/C++, instead relying the work to a script).
>
> Best regards,
> Nelson

Hi again,

I was having exactly the same thoughts :)

A ugly hack to get the right source IP would be to use something similar to :

void GetPrimaryIp(char* buffer, size_t buflen)
{
    assert(buflen >= 16);

    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    assert(sock != -1);

    const char* kGoogleDnsIp = "8.8.8.8";
    uint16_t kDnsPort = 53;
    struct sockaddr_in serv;
    memset(&serv, 0, sizeof(serv));
    serv.sin_family = AF_INET;
    serv.sin_addr.s_addr = inet_addr(kGoogleDnsIp);
    serv.sin_port = htons(kDnsPort);

    int err = connect(sock, (const sockaddr*) &serv, sizeof(serv));
    assert(err != -1);

    sockaddr_in name;
    socklen_t namelen = sizeof(name);
    err = getsockname(sock, (sockaddr*) &name, &namelen);
    assert(err != -1);

    const char* p = inet_ntop(AF_INET, &name.sin_addr, buffer, buflen);
    assert(p);

    close(sock);
}

I'll have a closer look and see how to integrate this (and let know
upstream then :p)

Cheers !

-- 
Herve Rousseau



--
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to