All pastes #749898 Raw Edit

getip.c

public c v1 · immutable
#749898 ·published 2007-10-26 00:55 UTC
rendered paste body
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <ifaddrs.h>           /* getifaddrs() */#include <netinet/ether.h>     /* ether_ntoa() */#include <netpacket/packet.h>  /* struct sockaddr_ll */char *generic_ntoa(struct sockaddr *sa){  static char *str = 0;  static size_t size = 0;  struct sockaddr_ll *sll;  if ( size )  {    free(str);    str = 0;    size = 0;  }  switch ( sa->sa_family )  {    case AF_INET:      size = INET_ADDRSTRLEN;      str = malloc(size);      memset((void *)str, 0, size);      inet_ntop(((struct sockaddr_in *)sa)->sin_family,                &(((struct sockaddr_in *)sa)->sin_addr),                str, size);      break;    case AF_INET6:      size = INET6_ADDRSTRLEN;      str = malloc(size);      memset((void *)str, 0, size);      inet_ntop(((struct sockaddr_in6 *)sa)->sin6_family,                &(((struct sockaddr_in6 *)sa)->sin6_addr),                str, size);      break;    case AF_PACKET:      sll = (struct sockaddr_ll *)sa;      switch (sll->sll_hatype)      {        case ARPHRD_LOOPBACK:          /* loopback interfaces don't have a hardware address */          break;        case ARPHRD_ETHER:          str = ether_ntoa((struct ether_addr *)(sll->sll_addr));          break;        default:          size = 40;          str = malloc(size);          memset((void *)str, 0, size);          snprintf(str, size,                   "Can't decode raw packet type %d", sll->sll_hatype);          break;      }      break;    default:      size = 30;      str = malloc(size);      memset((void *)str, 0, size);      snprintf(str, size, "Can't decode family %d", sa->sa_family);      break;  }  return str;}int main(){  struct ifaddrs *id;  char *address_str;  int val;  val = getifaddrs(&id);  for ( ; id != NULL ; id = id->ifa_next )  {    printf("Network Interface: %s\n", id->ifa_name);    address_str = generic_ntoa(id->ifa_addr);    if ( address_str )    {      printf("Address:           %s\n", address_str);    }    if ( id->ifa_netmask != NULL )    {      address_str = generic_ntoa(id->ifa_netmask);      printf("Netmask:           %s\n", address_str);    }    printf("\n");  }  return 0;}