Andrea Righi a écrit :
> Thomas Krause wrote:
>> The best thing (tm) IME would be to not rely on the ifconfig output at 
>> all and find some other way to obtain the ip address of an interface, 
>> but I’m not sure how to do this.
> 
> Thomas,
> 
> thanks for raising this problem. If I'm not wrong the same issue has
> been reported other times in the list and I agree with you that ifconfig
> output is not portable at all due to languages issue.

yes, good memory,  it was the same case for me some weeks ago on a 
french debian etch with LANG = fr_FR.UTF-8
the issue for me  had been to export LANG=C but i dont know if it's 
sufficient in order to return "adr" instead of "addr"

waiting for the valid  patch it might be helpful to report this little 
problem on the documentation?

> 
> I've found a way to get the ip address of an interface directly using
> ioctl() and so fully implemented in perl. See the patch below. It's a
> bit tricky, but it would be independent on language settings and
> ifconfig output in general (so it'll work even if ifconfig will change
> its output).
> 
i will try to test your patch tomorrow

thanks

ML

> I've tested it in Ubuntu 7.10 and it seems to work. Could you test if it
> works also for you? Otherwise we can always fall back to your patch.
> 
> Thanks,
> -Andrea
> 
> --
> Index: sbin/si_installbtimage
> ===================================================================
> --- sbin/si_installbtimage    (revision 4443)
> +++ sbin/si_installbtimage    (working copy)
> @@ -10,6 +10,7 @@
>  use File::Basename;
>  use Getopt::Long;
>  use SystemImager::Config;
> +use Socket qw/PF_INET SOCK_DGRAM inet_ntoa sockaddr_in/;
>  use vars qw($config $VERSION);
>  
>  my $config_dir = "/etc/systemimager";
> @@ -107,7 +108,20 @@
>      if (m/BT_TRACKER_PORT=([0-9]+)/) {
>          $tracker_port = $1;
>      } elsif (m/BT_INTERFACE=(.+)/) {
> -        ($image_server) = (`/sbin/ifconfig $1`)[1] =~ /inet addr:(\S+)/;
> +     # Get IP address of the specified interface.
> +     # This is quite tricky but more portable than retrieving the IP address
> +     # from ifconfig output (see language issue).
> +     socket(SOCKET, PF_INET, SOCK_DGRAM, getprotobyname('ip'))
> +            or die("ERROR: couldn't create socket!\n");
> +
> +        # use ioctl() interface with SIOCGIFADDR.
> +        my $ifreq = pack('a32', $1);
> +        ioctl(SOCKET, 0x8915, $ifreq) or
> +            die("ERROR: ioctl failed: $!\n");
> +
> +        # Format the IP address from the output of ioctl().
> +        $image_server = inet_ntoa((sockaddr_in((unpack('a16 a16', 
> $ifreq))[1]))[1]) or
> +            die("ERROR: couldn't retrieve IP address from: $ifreq\n");
>      }
>  }
>  unless ($tracker_port) {
> 
> -------------------------------------------------------------------------
> This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
> Don't miss this year's exciting event. There's still time to save $100. 
> Use priority code J8TL2D2. 
> http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
> _______________________________________________
> sisuite-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/sisuite-users


-- 
      Maurice Libes
Tel : +33 (04) 91 82 93 25            Centre d'Oceanologie de Marseille
Fax : +33 (04) 91 82 93 03            UMS2196CNRS- Campus de Luminy, 
Case 901
                                       F-13288 Marseille cedex 9

Veuillez noter ma nouvelle adresse ==> [EMAIL PROTECTED]


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
sisuite-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sisuite-users

Reply via email to