Main Page | Class List | Directories | File List | Class Members | File Members

ifconf.c File Reference

#include "cf.defs.h"
#include "cf.extern.h"

Go to the source code of this file.

Defines

#define cfproto   0
#define IPPROTO_IP   0
#define SIOCSIFBRDADDR   SIOCGIFBRDADDR

Functions

void IfConf (char *vifdev, char *vnetmask, char *vbroadcast)
int GetIfStatus (int sk, char *vifdev, char *vnetmask, char *vbroadcast)
void SetIfStatus (int sk, char *vifdev, char *vnetmask, char *vbroadcast)
void GetBroadcastAddr (char *ipaddr, char *vifdev, char *vnetmask, char *vbroadcast)
void SetDefaultRoute ()

Variables

ifreq IFR
char VNUMBROADCAST [256]


Define Documentation

#define cfproto   0
 

Definition at line 80 of file ifconf.c.

#define IPPROTO_IP   0
 

Definition at line 83 of file ifconf.c.

Referenced by IfConf().

#define SIOCSIFBRDADDR   SIOCGIFBRDADDR
 

Definition at line 87 of file ifconf.c.

Referenced by SetIfStatus().


Function Documentation

void GetBroadcastAddr char *  ipaddr,
char*  vifdev,
char*  vnetmask,
char*  vbroadcast
 

Definition at line 313 of file ifconf.c.

References broadcast, and VNUMBROADCAST.

Referenced by GetIfStatus().

00317 { unsigned int na,nb,nc,nd;
00318   unsigned int ia,ib,ic,id;
00319   unsigned int ba,bb,bc,bd;
00320   unsigned netmask,ip,broadcast;
00321 
00322 sscanf(vnetmask,"%u.%u.%u.%u",&na,&nb,&nc,&nd);
00323 
00324 netmask = nd + 256*nc + 256*256*nb + 256*256*256*na;
00325 
00326 sscanf(ipaddr,"%u.%u.%u.%u",&ia,&ib,&ic,&id);
00327 
00328 ip = id + 256*ic + 256*256*ib + 256*256*256*ia;
00329 
00330 if (strcmp(vbroadcast,"zero") == 0)
00331    {
00332    broadcast = ip & netmask;
00333    }
00334 else if (strcmp(vbroadcast,"one") == 0)
00335    {
00336    broadcast = ip | (~netmask);
00337    }
00338 else
00339    {
00340    return;
00341    }
00342 
00343 ba = broadcast / (256 * 256 * 256);
00344 bb = (broadcast / (256 * 256)) % 256;
00345 bc = broadcast / (256) % 256;
00346 bd = broadcast % 256;
00347 sprintf(VNUMBROADCAST,"%u.%u.%u.%u",ba,bb,bc,bd);
00348 }

int GetIfStatus int  sk,
char *  vifdev,
char*  vnetmask,
char*  vbroadcast
 

Definition at line 160 of file ifconf.c.

References bcopy, bufsize, cferror, CfLog(), GetBroadcastAddr(), hp, IFR, utsname::nodename, NULL, OUTPUT, snprintf(), VBUFF, Verbose, VNUMBROADCAST, and VSYSNAME.

Referenced by IfConf().

00165 { struct sockaddr_in *sin;
00166   struct sockaddr_in netmask;
00167   int insane = false;
00168   struct hostent *hp;
00169   struct in_addr inaddr;
00170 
00171 Verbose("Checking interface status...\n");
00172   
00173 if ((hp = gethostbyname(VSYSNAME.nodename)) == NULL)
00174    {
00175    CfLog(cferror,"","gethostbyname");
00176    return false;
00177    }
00178 else
00179    {
00180    bcopy(hp->h_addr,&inaddr, hp->h_length);
00181    Verbose("Address given by nameserver: %s\n",inet_ntoa(inaddr));
00182    }
00183 
00184 strcpy(IFR.ifr_name,vifdev);
00185 
00186 if (ioctl(sk,SIOCGIFADDR, (caddr_t) &IFR) == -1)   /* Get the device status flags */
00187    {
00188    return false;
00189    }
00190 
00191 sin = (struct sockaddr_in *) &IFR.ifr_addr;
00192 
00193 
00194 if (strcmp((char *)inet_ntoa(*(struct in_addr *)(hp->h_addr)),(char *)inet_ntoa(sin->sin_addr)) != 0)
00195    {
00196    CfLog(cferror,"This machine is configured with an address which differs from\n","");
00197    CfLog(cferror,"the nameserver's information! (Insane!)\n","");
00198    CfLog(cferror,"Don't quite know what to do...\n","");
00199    insane = true;
00200    }
00201 
00202 if (ioctl(sk,SIOCGIFNETMASK, (caddr_t) &IFR) == -1) 
00203    {
00204    return false;
00205    }
00206 
00207 netmask.sin_addr = ((struct sockaddr_in *) &IFR.ifr_addr)->sin_addr;
00208 
00209 Verbose("Found netmask: %s\n",inet_ntoa(netmask.sin_addr));
00210 
00211 strcpy(VBUFF,inet_ntoa(netmask.sin_addr));
00212 
00213 if (strcmp(VBUFF,vnetmask))
00214    {
00215    CfLog(cferror,"The netmask is incorrectly configured, resetting...\n","");
00216    insane = true;
00217    }
00218 
00219 if (ioctl(sk,SIOCGIFBRDADDR, (caddr_t) &IFR) == -1) 
00220    {
00221    return false;
00222    }
00223 
00224 sin = (struct sockaddr_in *) &IFR.ifr_addr;
00225 strcpy(VBUFF,inet_ntoa(sin->sin_addr));
00226 
00227 Verbose("Found broadcast address: %s\n",inet_ntoa(sin->sin_addr));
00228 
00229 GetBroadcastAddr(inet_ntoa(inaddr),vifdev,vnetmask,vbroadcast);
00230 
00231 if (strcmp(VBUFF,VNUMBROADCAST) != 0)
00232    {
00233    snprintf(OUTPUT,bufsize*2,"Broadcast address was %s not %s (should be bit-type %s)\n",VBUFF,VNUMBROADCAST,vbroadcast);
00234    CfLog(cferror,OUTPUT,"");
00235    insane = true;
00236    }
00237 
00238 return(insane);
00239 }

void IfConf char *  vifdev,
char*  vnetmask,
char *  vbroadcast
 

Definition at line 92 of file ifconf.c.

References cferror, CfLog(), DONTDO, FatalError(), GetIfStatus(), IFR, IPPROTO_IP, IsPrivileged(), SetIfStatus(), Verbose, and VPREFIX.

Referenced by ConfigureInterfaces().

00096 { int sk, flags, metric, isnotsane = false;
00097 
00098  
00099 Verbose("Assumed interface name: %s %s %s\n",vifdev,vnetmask,vbroadcast);
00100 
00101 if (!IsPrivileged())                            
00102    {
00103    printf("%s: Only root can configure the net interface.\n",VPREFIX);
00104    return;
00105    }
00106 
00107 if (vnetmask[0] == '\0')
00108    {
00109    CfLog(cferror,"Program does not define a subnetmask","");
00110    return;
00111    }
00112 
00113 if (vbroadcast[0] == '\0')
00114    {
00115    CfLog(cferror,"Program does not define a broadcast mode for this host","");
00116    return;
00117    }
00118 
00119 
00120 strcpy(IFR.ifr_name,vifdev);
00121 IFR.ifr_addr.sa_family = AF_INET;
00122 
00123 if ((sk = socket(AF_INET,SOCK_DGRAM,IPPROTO_IP)) == -1)
00124    {
00125    CfLog(cferror,"","socket");
00126    FatalError("Error in IfConfig()");
00127    }
00128 
00129 if (ioctl(sk,SIOCGIFFLAGS, (caddr_t) &IFR) == -1)   /* Get the device status flags */
00130    {
00131    CfLog(cferror,"No such network device","ioctl");
00132    return;
00133    }
00134 
00135 flags = IFR.ifr_flags;
00136 strcpy(IFR.ifr_name,vifdev);                   /* copy this each time */
00137  
00138 if (ioctl(sk,SIOCGIFMETRIC, (caddr_t) &IFR) == -1)   /* Get the routing priority */
00139    {
00140    CfLog(cferror,"","ioctl");
00141    FatalError("Software error: error getting metric");
00142    }
00143 
00144 metric = IFR.ifr_metric;
00145 
00146 isnotsane = GetIfStatus(sk,vifdev,vnetmask,vbroadcast);
00147 
00148 if (! DONTDO && isnotsane)
00149    {
00150    SetIfStatus(sk,vifdev,vnetmask,vbroadcast);
00151    GetIfStatus(sk,vifdev,vnetmask,vbroadcast);
00152    }
00153 
00154 close(sk);
00155 }

void SetDefaultRoute  ) 
 

Definition at line 361 of file ifconf.c.

References bufsize, cferror, cfinform, CfLog(), cfpclose(), cfpopen(), CLASSTEXT, Debug, DONTDO, FatalError(), IsPrivileged(), linuxx, NULL, OUTPUT, ReadLine(), snprintf(), strstr(), VBUFF, VDEFAULTROUTE, Verbose, VNETSTAT, and VSYSTEMHARDCLASS.

Referenced by ConfigureInterfaces().

00363 { int sk, defaultokay = 1;
00364   struct sockaddr_in sindst,singw;
00365 
00366 # ifdef HAVE_ORTENTRY
00367    struct ortentry route;
00368 # else
00369 #  if HAVE_RTENTRY
00370    struct rtentry route;
00371 #  endif
00372 # endif
00373 
00374   FILE *pp;
00375 
00376 Verbose("Looking at default route...\n");
00377   
00378 if (!IsPrivileged())                            
00379    {
00380    snprintf(OUTPUT,bufsize*2,"Only root can set a default route.");
00381    CfLog(cfinform,OUTPUT,"");
00382    return;
00383    }
00384 
00385 if (VDEFAULTROUTE[0] == '\0')
00386    {
00387    Debug("cfengine: No default route is defined. Ignoring the routing tables.\n");
00388    return;
00389    }
00390 
00391 if ((pp = cfpopen(VNETSTAT[VSYSTEMHARDCLASS],"r")) == NULL)
00392    {
00393    snprintf(OUTPUT,bufsize*2,"Failed to open pipe from %s\n",VNETSTAT[VSYSTEMHARDCLASS]);
00394    CfLog(cferror,OUTPUT,"popen");
00395    return;
00396    }
00397 
00398 while (!feof(pp))
00399    {
00400    ReadLine(VBUFF,bufsize,pp);
00401 
00402    if (strncmp(VBUFF,"default",7) == 0)
00403       {
00404       if (strstr(VBUFF,VDEFAULTROUTE))
00405          {
00406          Verbose("cfengine: default route is already set to %s\n",VDEFAULTROUTE);
00407          defaultokay = 1;
00408          break;
00409          }
00410       else
00411          {
00412          CfLog(cferror,"The default packet-route is incorrectly set\n","");
00413          CfLog(cferror,"Please correct this manually using route(1).\n","");
00414          break;
00415          }
00416       }
00417    defaultokay = 0;
00418    }
00419 
00420 cfpclose(pp);
00421 
00422 if (defaultokay)
00423    {
00424    return;
00425    }
00426 
00427 # if defined HAVE_RTENTRY || defined HAVE_ORTENTRY
00428  
00429 if ((sk = socket(AF_INET,SOCK_RAW,0)) == -1)
00430    {
00431    if ( VSYSTEMHARDCLASS == linuxx )
00432       {
00433       Debug ("No raw socket protocol for linux\n");
00434       return;
00435       }
00436    
00437    printf("System class %s\n",CLASSTEXT[VSYSTEMHARDCLASS]);
00438    perror("cfengine: socket");
00439    FatalError("Error in SetDefaultRoute()");
00440    }
00441 
00442 sindst.sin_family = AF_INET;
00443 singw.sin_family = AF_INET;
00444 
00445 sindst.sin_addr.s_addr = INADDR_ANY;
00446 singw.sin_addr.s_addr = inet_addr(VDEFAULTROUTE);
00447 
00448 route.rt_dst = *(struct sockaddr *)&sindst;      /* This disgusting method is necessary */
00449 route.rt_gateway = *(struct sockaddr *)&singw;
00450 route.rt_flags = RTF_GATEWAY;
00451 
00452 if (! DONTDO)
00453    {
00454    if (ioctl(sk,SIOCADDRT, (caddr_t) &route) == -1)   /* Get the device status flags */
00455       {
00456       CfLog(cferror,"","ioctl SIOCADDRT:");
00457       FatalError("Software error: set default route");
00458       }
00459 
00460    CfLog(cferror,"The routing table did not contain a default route.\n","");
00461    snprintf(OUTPUT,bufsize*2,"I'm setting it to %s\n",VDEFAULTROUTE);
00462    CfLog(cferror,OUTPUT,"");
00463    }
00464 
00465 # else
00466 
00467 /* Socket routing - don't really know how to do this yet */ 
00468 
00469 Verbose("Sorry don't know how to do routing on this platform\n");
00470  
00471 # endif
00472 }

void SetIfStatus int  sk,
char *  vifdev,
char*  vnetmask,
char *  vbroadcast
 

Definition at line 243 of file ifconf.c.

References bufsize, cferror, cfinform, CfLog(), IFR, NULL, OUTPUT, SIOCSIFBRDADDR, snprintf(), Verbose, and VNUMBROADCAST.

Referenced by IfConf().

00248 { struct sockaddr_in *sin;
00249   struct sockaddr_in netmask, broadcast;
00250 
00251    /*********************************
00252 
00253    Don't try to set the address yet...
00254 
00255     if (ioctl(sk,SIOCSIFADDR, (caddr_t) &IFR) == -1) 
00256       {
00257       perror ("Can't set IP address");
00258       return;
00259       } 
00260 
00261    **********************************/
00262 
00263 /* set netmask */
00264 
00265 Verbose("Resetting interface...\n");
00266 
00267 memset(&IFR, 0, sizeof(IFR));
00268 strncpy(IFR.ifr_name,vifdev,sizeof(IFR.ifr_name)); 
00269 netmask.sin_addr.s_addr = inet_network(vnetmask);
00270 netmask.sin_family = AF_INET;
00271 IFR.ifr_addr = *((struct sockaddr *) &netmask);
00272 
00273 sin = (struct sockaddr_in *) &IFR.ifr_addr;
00274 
00275 if (ioctl(sk,SIOCSIFNETMASK, (caddr_t) &IFR) < 0) 
00276    {
00277    CfLog(cferror,"Permission to reconfigure netmask denied.\n","ioctl");
00278    }
00279 else
00280    {
00281    snprintf(OUTPUT,bufsize*2,"Set Netmask to: %s\n",inet_ntoa(netmask.sin_addr));
00282    CfLog(cfinform,OUTPUT,"");
00283    }
00284 
00285 /* broadcast addr */
00286 
00287 strcpy(IFR.ifr_name,vifdev);
00288 broadcast.sin_addr.s_addr = inet_addr(VNUMBROADCAST);
00289 IFR.ifr_addr = *((struct sockaddr *) &broadcast);
00290 sin = (struct sockaddr_in *) &IFR.ifr_addr;
00291 
00292 Verbose("Trying to set broad to %s = %s\n",VNUMBROADCAST,inet_ntoa(sin->sin_addr));
00293  
00294 if (ioctl(sk,SIOCSIFBRDADDR, (caddr_t) &IFR) == -1) 
00295    {
00296    CfLog(cferror,"Permission to reconfigure broadcast denied.\n","ioctl");
00297    return;
00298    } 
00299 
00300 if ((char *) sin->sin_addr.s_addr == NULL)
00301    {
00302    CfLog(cferror,"No broadcast address on socket after configuration!!\n","");
00303    }
00304 else
00305    {
00306    snprintf(OUTPUT,bufsize*2,"Set Broadcast address to: %s\n",inet_ntoa(sin->sin_addr));
00307    CfLog(cfinform,OUTPUT,"");
00308    }
00309 }


Variable Documentation

struct ifreq IFR
 

Definition at line 76 of file ifconf.c.

Referenced by GetIfStatus(), IfConf(), and SetIfStatus().

char VNUMBROADCAST[256]
 

Definition at line 78 of file ifconf.c.

Referenced by GetBroadcastAddr(), GetIfStatus(), and SetIfStatus().


© sourcejam.com 2005-2008