#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] |
|
|
|
|
|
Definition at line 83 of file ifconf.c. Referenced by IfConf(). |
|
|
Definition at line 87 of file ifconf.c. Referenced by SetIfStatus(). |
|
||||||||||||||||||||
|
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 }
|
|
||||||||||||||||||||
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
|
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 }
|
|
||||||||||||||||||||
|
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 }
|
|
|
Definition at line 76 of file ifconf.c. Referenced by GetIfStatus(), IfConf(), and SetIfStatus(). |
|
|
Definition at line 78 of file ifconf.c. Referenced by GetBroadcastAddr(), GetIfStatus(), and SetIfStatus(). |