Raw sockets problem?

Ivan Voras ivoras at fer.hr
Sat Jan 8 14:35:40 PST 2005


Robert Watson wrote:

 > On Sat, 8 Jan 2005, Ivan Voras wrote:
 >
 >
 >> I've just noticed I can't create a raw socket on 5.3-RELEASE, while the
 >> same code works on 5.2. I get 'Protocol not supported' error on code
 >> like this:
 >
 >
 >
 > I've not got a 5.2 box on hand, but this appears not to work on 4.x. 
There isn't a domain handler for AF_LINK, so you shouldn't be able to
 > create a socket of that type, so if it was possible in 5.2, it was likely
 > a bug.


I use it in this code:

/* get interface name by index */
int cardif_get_int(int index, char *retInterface)
{
     struct ifreq ifr;
     struct ifaddrs *ifa_master, *ifa;
     int sock, retval;
     char msg[100];

     sock = socket(AF_LINK, SOCK_RAW, 0);
     if (sock < 0) {
         sprintf(msg, "cardif_get_int: cannot create raw socket: %s\n", 
strerror(errno));
         debug_printf(DEBUG_NORMAL, msg);
         return XESOCKOP;
     }

     getifaddrs(&ifa_master);

     for (ifa = ifa_master; ifa != NULL; ifa = ifa->ifa_next) {
         strncpy(ifr.ifr_name, ifa->ifa_name, IFNAMSIZ);

         retval = ioctl(sock, SIOCGIFINDEX, &ifr);
         if (retval < 0) {
             debug_printf(DEBUG_NORMAL, "Error getting interface index 
value for interface %s\n", ifa->ifa_name);
             freeifaddrs(ifa_master);
             close(sock);
             return XESOCKOP;
         }

         if (ifr.ifr_index == index)
             break;
     }

     if (ifa == NULL) {
         debug_printf(DEBUG_NORMAL, "Cannot find interface name by its 
index: %d\n", index);
         freeifaddrs(ifa_master);
         close(sock);
         return XENOTINT;
     }

     strncpy(retInterface, ifa->ifa_name, IFNAMSIZ);

     freeifaddrs(ifa_master);
     close(sock);
     return XENONE;
}

---

i.e. I need it for the ioctl() call. Is there another way?




More information about the freebsd-hackers mailing list