On Sat, May 5, 2012 at 3:15 PM, Raimundo Santos via Redmine
<bugtracker-admin@leaf.dragonflybsd.org> wrote:
Issue #1897 has been updated by Raimundo Santos.
Description updated
I had the same issue here, detected while trying do run the NO-IP daemon. It works fine under FreeBSD, so I thinked that it should work too under DragonFlyBSD.
I took this as a solution:
(based on the test posted by Steve)
(basically bypass the ioctl and use getifaddrs(3) - is, therefore, SIOGIFADDR and the like deprecated?!)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <ifaddrs.h>
int main (int argc, char **argv) {
struct ifaddrs *ifa = NULL;
char inaddr[INET_ADDRSTRLEN];
if(getifaddrs(&ifa) != 0) {
printf("Error while trying to get ifaddrs...\n");
exit(1);
}
while(ifa) {
inet_ntop(AF_INET, (struct in_addr *)&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr, inaddr, INET_ADDRSTRLEN);
printf("Dev: %s IP %s --> %d\n", ifa->ifa_name, inaddr, ifa->ifa_addr->sa_family);
ifa = ifa->ifa_next;
}
freeifaddrs(ifa);
return(0);
}
Now, working on the NO-IP patch.
----------------------------------------
Bug #1897: SIOCGIFADDR doesn't work
http://bugs.dragonflybsd.org/issues/1897
Author: Steve O'Hara-Smith
Status: New
Priority: Normal
Assignee:
Category:
Target version:
Hi,
I found this while trying to get ushare to work - the SIOCGIFADDR
ioctl doesn't set the IP address (at least for re devices), what you get is
whatever was in the struct ifreq before the call.
It is due to wrongly numbered SIOCGIFDATA; it should have been fixed on master:
401c752a1960c193055c3ab3e6830eb2f259d1f4
Best Regards,
sephe
Running v2.9.0.105.gba1cb-DEVELOPMENT - but it's been going on for
a while I just haven't got to the bottom of the problem until now.
My test code (below) always prints 0.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if_dl.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
int main (int argc, char **argv)
{
int sock;
int32_t ip;
struct ifreq ifr;
memset (&ifr, 0, sizeof ifr);
sock = socket (AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror ("socket");
exit(1);
}
strcpy(ifr.ifr_name, "re0");
ifr.ifr_addr.sa_family = AF_INET;
if (ioctl (sock, SIOCGIFADDR, &ifr) < 0) {
perror("ioctl");
exit(1);
}
ip = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr;
printf("%x\n", ip);
}
--
You have received this notification because you have either subscribed to it, or are involved in it.
To change your notification preferences, please click here: http://bugs.dragonflybsd.org/my/account
--
Tomorrow Will Never Die