whoops...sorry about that.. you are right about them bugs. I was originally
just printing it out instead of putting it in a variable.. i forgot to
increase the character arrays :) As far as having to mask the hardware
digits with 0xff, for some reason, the digits in ifr.ifr_hwaddr.sa_data are
ffffffb4 when the actual value is b4.. I had to mask off the upper bits to
give the correct value.
-Andy
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
> Sent: Thursday, December 21, 2000 12:18 PM
> To: Andy Angrick
> Cc: [EMAIL PROTECTED]
> Subject: Re: Retrieving IP/MAC
>
>
> In message <[EMAIL PROTECTED]> Andy
> Angrick wrote:
> > With a lot of research and great help from a few on the list
> (thanks Luc)..
> > this is what i finally came up with for find out the IP and MAC
> address of
> > an interface in case anyone is interested.
> ...
> > int main(void){
> > printf("Hardware: %s\n",gethwaddr("eth0"));
> > printf("IP: %s\n",getipaddr("eth0"));
> > }
> warning: control reaches end of non-void function
>
> >
> > char *gethwaddr(char *device)
> > {
> > int fd,i;
> warning: unused variable `i'
>
> > static char ethaddr[8];
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
> > struct ifreq ifr;
> > unsigned char *txt;
> >
> > if((fd=socket(AF_INET,SOCK_DGRAM,0))<0)
> > return 0;
> > memset(&ifr,0,sizeof(ifr));
> > strncpy(ifr.ifr_name,device,sizeof(ifr.ifr_name));
> >
> > if(ioctl(fd,SIOCGIFHWADDR,(char *)&ifr)==-1)
> > {
> > close(fd);
> > return 0;
> > }
> > close(fd);
> > txt=(unsigned char *)&ifr.ifr_hwaddr.sa_data;
> > sprintf(ethaddr, "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
> txt[0]&0x000000ff,\
>
> *** ERROR *** This format outputs 19 characters (including the final '\0')
> into a character array which can only hold 8 chars...
>
> > txt[1]&0x000000ff,txt[2]&0x000000ff,txt[3]&0x000000ff,\
> > txt[4]&0x000000ff,txt[5]&0x000000ff);
>
> ??? What is the "&0xFF" needed for? You are using unsigned chars, and
> an unsigned format string???
>
> > return ethaddr;
> > }
> >
> > char *getipaddr(char *device)
> > {
> > int fd,i;
> warning: unused variable `i'
>
> > static char ipaddr[14];
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
> > struct ifreq ifr;
> > unsigned long int myip;
> warning: unused variable `myip'
>
> > char tmp[14]="",str[14]="";
> warning: unused variable `str'
> warning: unused variable `tmp'
>
> > unsigned char *txt;
> >
> > if((fd=socket(AF_INET,SOCK_DGRAM,0))<0)
> > return 0;
> > memset(&ifr,0,sizeof(ifr));
> >
> > strncpy(ifr.ifr_name,device,sizeof(ifr.ifr_name));
> > ifr.ifr_addr.sa_family = AF_INET;
> >
> > if(ioctl(fd,SIOCGIFADDR,(char *)&ifr)==-1)
> > {
> > close(fd);
> > return 0;
> > }
> > close(fd);
> > txt=(unsigned char *)&ifr.ifr_addr.sa_data;
> > sprintf(ipaddr, "%d.%d.%d.%d", txt[2],txt[3],txt[4],txt[5]);
>
> *** ERROR *** This format outputs up to 16 characters (including
> the final '\0')
> into a character array which can only hold 14 chars...
>
> > return ipaddr;
> > }
>
> Ummmm... you better fix them bugs...
>
> Wolfgang Denk
> Software Engineering: Embedded and Realtime Systems, Embedded Linux
> Phone: (+49)-8142-4596-87 Fax: (+49)-8142-4596-88 Email: [EMAIL PROTECTED]
> Drun'? 'm not drun'! You woudn' dare call m' drun' if I was sober!
> - Terry Pratchett, _Men at Arms_
>
--
To unsubscribe from this list, send a message to [EMAIL PROTECTED]
with the command "unsubscribe linux-embedded" in the message body.
For more information, see <http://waste.org/mail/linux-embedded>.