diff options
Diffstat (limited to 'algorithms/ip.c')
-rw-r--r-- | algorithms/ip.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/algorithms/ip.c b/algorithms/ip.c new file mode 100644 index 0000000..6db600f --- /dev/null +++ b/algorithms/ip.c @@ -0,0 +1,131 @@ +#include <stdio.h> + +#define IPSTRLEN 20 + + +int +ip_str_to_ip_tuple(char ip_str[], int ip_tuple[]) +{ + int retval; + + if (4!=(retval=sscanf(ip_str, "%d.%d.%d.%d", + &ip_tuple[0], &ip_tuple[1], &ip_tuple[2], &ip_tuple[3]))) { + fprintf(stderr, "Error: sscanf failed, retval was: %d\n", retval); + return retval; + } + + return 0; +} + +int +ip_tuple_to_ip_str(int ip_tuple[], char ip_str[], int ip_str_size) +{ + int retval; + + if (IPSTRLEN<(retval=snprintf(ip_str, ip_str_size, "%d.%d.%d.%d", + ip_tuple[3], ip_tuple[2], ip_tuple[1], ip_tuple[0]))) { + return retval; + } + + return 0; +} + +unsigned long +ip_tuple_to_addr(int ip_tuple[]) +{ + unsigned long result=0; + + for (int i = 0; i < 4; i += 1) { + result = result<<8; + result = ip_tuple[i]|result; + } + + return result; +} + +int +addr_to_ip_tuple(unsigned long addr, int ip_tuple[]) +{ + for (int i = 0; i < 4; i += 1) { + ip_tuple[i] = (addr>>i*8)&255; + } + + return 0; +} + +unsigned long +compute_netmask_for_size(int net_size) +{ + unsigned long netmask = 0xffffffff; + + netmask = netmask<<net_size; + + return netmask; +} + +unsigned long +compute_network_address(unsigned long host_addr, unsigned long netmask) +{ + unsigned long net_addr; + + net_addr = host_addr&netmask; + + return net_addr; +} + +unsigned long +computer_router_address(unsigned long host_addr, unsigned long netmask) +{ + unsigned long router_addr; + + router_addr = compute_network_address(host_addr, netmask)+1; + + return router_addr; +} + +int +addr_to_ip_str(unsigned long addr, char ip_str[], int ip_str_size) +{ + int ip_tuple[4]; + + addr_to_ip_tuple(addr, ip_tuple); + + if (ip_tuple_to_ip_str(ip_tuple, ip_str, ip_str_size)) { + fprintf(stderr, "Error: IP Address malformed.\n"); + } + + return 0; +} + + +int +main(void) +{ + char the_ip[]="147.142.207.19", new_ip[IPSTRLEN]; + int net_size=8; + int ip_tuple[4]; + unsigned long ip_addr; + + if (ip_str_to_ip_tuple(the_ip, ip_tuple)) { + fprintf(stderr, "Invalid IP address: %s\n", the_ip); + return 1; + } + ip_addr = ip_tuple_to_addr(ip_tuple); + printf("IP Address: %lx\n", ip_addr); + if (addr_to_ip_str(compute_network_address(ip_addr, + compute_netmask_for_size(net_size)), new_ip, IPSTRLEN)) { + fprintf(stderr, "Couldn't format network address.\n"); + return 1; + } + printf("Network for this host (netmask %lx): %s\n", + compute_netmask_for_size(net_size), new_ip); + if (addr_to_ip_str(computer_router_address(ip_addr, + compute_netmask_for_size(net_size)), new_ip, IPSTRLEN)) { + fprintf(stderr, "Couldn't format router address.\n"); + return 1; + } + printf("Probable router for this host (netmask %lx): %s\n", + compute_netmask_for_size(net_size), new_ip); + + return 0; +} |