These are bits of code we've found for linux that don't necessarily relate exactly to raspbian on the RPi, but may be useful
Network Config
//Code sourced from: http://www.network-builders.com/programatically-change-ip-address-t58439.html
//The RPi doesn't have a folder "/etc/sysconfig/" so this isn't usable as currently implemented
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/route.h>
#include <arpa/inet.h>
int SetNetworkConfig(char *ifname,in_addr_t ip,in_addr_t mask,in_addr_t gw);
in_addr_t IP2Broadcast(in_addr_t IP, in_addr_t Mask);
in_addr_t IP2Network(in_addr_t IP, in_addr_t Mask);
in_addr_t ValidateMask(in_addr_t Mask);
int GetIP(char *ifname, in_addr_t *ip, in_addr_t *mask);
static int set_default_gw( int sockfd, in_addr_t gip );
void UpdateIP(const char *ifname, in_addr_t ip, in_addr_t mask, in_addr_t gip);
int GetMacAddress(char *ifname, char *addr);
int SetMacAddress(char *ifname, char *addr);
static const char *l_pszConfigFile = "/etc/sysconfig/network/ifcfg-";
//==============================================================================
// function: SetNetworkConfig
// description: updates the network configuration file
//==============================================================================
int SetNetworkConfig(char *ifname, in_addr_t ip, in_addr_t mask, in_addr_t gw)
{
char szTemp[256];
in_addr_t bc,nw;
mask = ValidateMask(mask);
nw = IP2Network(ip,mask);
bc = IP2Broadcast(ip,mask);
sprintf(szTemp,"%s%s", l_pszConfigFile, ifname);
printf("open -> %s\n",szTemp);
FILE *file = fopen(szTemp,"wr");
if (file == NULL)
{
perror("SetNetworkConfig");
return -1;
}
fprintf(file, "IPADDR=\"%s\"\n", inet_ntoa(inet_makeaddr(ip,0)));
fprintf(file, "NETMASK=\"%s\"\n", inet_ntoa(inet_makeaddr(mask,0)));
fprintf(file, "NETWORK=\"%s\"\n", inet_ntoa(inet_makeaddr(nw,0)));
fprintf(file, "BROADCAST=\"%s\"\n", inet_ntoa(inet_makeaddr(bc,0)));
if ( gw != 0 )
fprintf(file, "GATEWAY=\"%s\"\n", inet_ntoa(inet_makeaddr(gw,0)));
fclose(file);
system("/etc/init.d/network restart");
return 0;
}
//==============================================================================
// function: IP2Broadcast
// description: Takes a subnet mask and IP returns a subnet broadcast address
//==============================================================================
in_addr_t IP2Broadcast(in_addr_t IP, in_addr_t Mask)
{
in_addr_t bcIP;
in_addr_t bit;
in_addr_t notbit;
int i;
bit = 0x80000000;
notbit = 0xFFFFFFFF;
bcIP = 0;
for ( i=0; i<31; i++)
{
if ((bit & Mask) == 0)
break;
bcIP |= (IP & bit);
notbit &= ~bit;
bit = bit >> 1;
}
//bcIP != notbit;
//printf("bcIP = %s\n",inet_ntoa(inet_makeaddr(bcIP,0)));
return bcIP;
}
//==============================================================================
// function: IP2Network
// description: Takes a subnet mask and IP returns a subnet address
//==============================================================================
in_addr_t IP2Network(in_addr_t IP, in_addr_t Mask)
{
in_addr_t netIP;
in_addr_t bit;
int i;
bit = 0x80000000;
netIP = 0;
for ( i=0; i<31; i++)
{
if ((bit & Mask) == 0)
break;
netIP |= (IP & bit);
bit = bit >> 1;
}
// printf("Network = %s\n",inet_ntoa(inet_makeaddr(netIP,0)));
return netIP;
}
//==============================================================================
// function: ValidateMask
// description: Takes a subnet mask and returns a valid version
//==============================================================================
in_addr_t ValidateMask(in_addr_t Mask)
{
in_addr_t newMask;
in_addr_t bit;
int i;
bit = 0x80000000;
newMask = 0;
for ( i=0; i<31; i++)
{
if ((bit & Mask) == 0)
break;
newMask |= bit;
bit = bit >> 1;
}
// printf("Mask = %s\n",inet_ntoa(inet_makeaddr(Mask,0)));
return Mask;
}
//==============================================================================
// function: GetLocalIP
// description: retrieve current network ip and mask
//==============================================================================
int GetIP(char *ifname, in_addr_t *ip, in_addr_t *mask)
{
struct ifreq ifr;
int sock = socket(AF_INET,SOCK_DGRAM,0);
// Get the interface IP address
strcpy( ifr.ifr_name, ifname );
ifr.ifr_addr.sa_family = AF_INET;
if (ioctl( sock, SIOCGIFADDR, &ifr ) < 0)
perror( "SIOCGIFADDR" );
*ip = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr;
shutdown(sock,SHUT_RDWR);
return 0;
}
//==============================================================================
// function: set_default_gw
// description: sets routing table's default gateway to the sock peeraddr
//==============================================================================
static int set_default_gw( int sockfd, in_addr_t gip )
{
struct sockaddr_in *dst, *gw, *mask;
struct rtentry route;
memset(&route,0,sizeof(struct rtentry));
dst = (struct sockaddr_in *)(&(route.rt_dst));
gw = (struct sockaddr_in *)(&(route.rt_gateway));
mask = (struct sockaddr_in *)(&(route.rt_genmask));
/* Make sure we're talking about IP here */
dst->sin_family = AF_INET;
gw->sin_family = AF_INET;
mask->sin_family = AF_INET;
/* Set up the data for removing the default route */
dst->sin_addr.s_addr = 0;
gw->sin_addr.s_addr = 0;
mask->sin_addr.s_addr = 0;
route.rt_flags = RTF_UP | RTF_GATEWAY;
/* Remove the default route */
ioctl(sockfd,SIOCDELRT,&route);
/* Set up the data for adding the default route */
dst->sin_addr.s_addr = 0;
gw->sin_addr.s_addr = gip;
mask->sin_addr.s_addr = 0;
route.rt_metric = 1;
route.rt_flags = RTF_UP | RTF_GATEWAY;
/* Remove this route if it already exists */
ioctl(sockfd,SIOCDELRT,&route);
/* Add the default route */
if( ioctl(sockfd,SIOCADDRT,&route) == -1 )
{
fprintf( stderr,"Adding default route: %d", errno);
return -1;
}
//fprintf( stdout,"Added default route successfully." );
return 0;
}
//==============================================================================
// function: UpdateIP
// description: updates the networks parameters
//==============================================================================
void UpdateIP(const char *ifname, in_addr_t ip, in_addr_t mask, in_addr_t gip)
{
struct ifreq ifr;
char *myip;
int sock = socket(AF_INET,SOCK_DGRAM,0);
in_addr_t IP;
struct rtentry rt;
struct sockaddr_in sa;
memset(&sa, 0, sizeof(sa));
memset(&rt, 0, sizeof(rt));
// Get the interface IP address
strcpy( ifr.ifr_name, ifname );
ifr.ifr_addr.sa_family = AF_INET;
if (ioctl( sock, SIOCGIFADDR, &ifr ) < 0)
perror( "SIOCGIFADDR" );
myip = inet_ntoa( ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr );
IP = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr;
((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr = ip;
if (ioctl( sock, SIOCSIFADDR, &ifr ) < 0)
perror( "SIOCSIFADDR" );
set_default_gw(sock, gip);
shutdown(sock,SHUT_RDWR);
}
//==============================================================================
// function: GetMacAddress
// description: retrieve current network address
//==============================================================================
int GetMacAddress(char *ifname, char *addr)
{
struct ifreq ifr;
int sock = socket(AF_INET,SOCK_DGRAM,0);
// Get the interface IP address
strcpy( ifr.ifr_name, ifname );
ifr.ifr_addr.sa_family = AF_INET;
if (ioctl( sock, SIOCGIFHWADDR, &ifr ) < 0)
{
perror( "SIOCGHWADDR" );
return -1;
}
memcpy(addr,ifr.ifr_hwaddr.sa_data,6);
//uint8_t *hwaddr = (uint8_t*)addr;
//printf("The hardware address (SIOCGIFHWADDR) of %s is type %d "
// "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", ifname,
// ifr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1],
// hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
shutdown(sock,SHUT_RDWR);
return 0;
}
//==============================================================================
// function: SetMacAddress
// description: Set network address
//==============================================================================
int SetMacAddress(char *ifname, char *addr)
{
struct ifreq ifr;
int sock = socket(AF_INET,SOCK_DGRAM,0);
// Set the interface IP address
strcpy( ifr.ifr_name, ifname );
ifr.ifr_addr.sa_family = AF_UNIX;
memcpy(ifr.ifr_hwaddr.sa_data,addr,6);
if (ioctl( sock, SIOCSIFHWADDR, &ifr ) < 0)
{
perror( "SIOCSIFHWADDR" );
return -1;
}
shutdown(sock,SHUT_RDWR);
return 0;
}
