54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* text2ip.c - Converts a text string to an IP address. */
 | |
| 
 | |
| /* Written 1998 by Werner Almesberger, EPFL ICA */
 | |
| 
 | |
| 
 | |
| #include <stdint.h>
 | |
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| #include <netdb.h>
 | |
| #include <sys/socket.h>
 | |
| #include <netinet/in.h>
 | |
| #include <arpa/inet.h>
 | |
| 
 | |
| #include "atm.h"
 | |
| #include "atmd.h"
 | |
| 
 | |
| 
 | |
| static void complain(const char *component,const char *item,const char *msg)
 | |
| {
 | |
|     if (!component) fprintf(stderr,"%s: %s\n",item,msg);
 | |
|     else diag(component,DIAG_ERROR,"%s: %s",item,msg);
 | |
| }
 | |
| 
 | |
| 
 | |
| uint32_t text2ip(const char *text,const char *component,int flags)
 | |
| {
 | |
|     struct hostent *hostent;
 | |
|     uint32_t ip;
 | |
| 
 | |
|     if (strspn(text,"0123456789.") == strlen(text)) {
 | |
| 	ip = inet_addr(text);
 | |
| 	if (ip != INADDR_NONE) return ip;
 | |
| 	if (flags & T2I_ERROR) complain(component,text,"invalid address");
 | |
| 	return INADDR_NONE;
 | |
|     }
 | |
|     if (!(flags & T2I_NAME)) {
 | |
| 	if (flags & T2I_ERROR)
 | |
| 	    complain(component,text,"numeric IP address expected");
 | |
| 	return INADDR_NONE;
 | |
|     }
 | |
|     hostent = gethostbyname(text);
 | |
|     if (!hostent) {
 | |
| 	if (flags & T2I_ERROR) complain(component,text,"no such host");
 | |
| 	return INADDR_NONE;
 | |
|     }
 | |
|     if (hostent->h_addrtype != AF_INET) {
 | |
| 	if (flags & T2I_ERROR)
 | |
| 	    complain(component,text,"unknown address family");
 | |
| 	return INADDR_NONE;
 | |
|     }
 | |
|     memcpy(&ip,hostent->h_addr,hostent->h_length);
 | |
|     return ip;
 | |
| }
 |