summaryrefslogtreecommitdiff
path: root/algorithms/ip.c
diff options
context:
space:
mode:
authorPatrick Simianer <p@simianer.de>2014-06-15 03:24:33 +0200
committerPatrick Simianer <p@simianer.de>2014-06-15 03:24:33 +0200
commitcf3a29feb5887344b6633ead1b4b6d5657a15a4b (patch)
treef1149508f7305a48dba0226699dfafdd68d81969 /algorithms/ip.c
parent5ddc763ab9953eebdaf78af4eb72288d7955b310 (diff)
old stuff: algorithms
Diffstat (limited to 'algorithms/ip.c')
-rw-r--r--algorithms/ip.c131
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;
+}