SHARE
TWEET

Untitled

a guest Jul 17th, 2017 43 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. int expand_ipv6 (char * ip, unsigned int * ip_return) {
  6.     char * ip_tmp;
  7.     char * netmp;
  8.     int i_space = -1;
  9.     int i;
  10.     int i2;
  11.     int b;
  12.    
  13.     ip_tmp = ip;
  14.    
  15.     for (i = 0; i < 9; i++)
  16.         ip_return[i] = 0;
  17.    
  18.    
  19.     // IP extrahieren
  20.     for (i = 0; i < 8; i++) {
  21.         if (ip_tmp[0] == ':' && ip_tmp[1] == ':') {
  22.             i_space = i;
  23.             ip_tmp++;
  24.         }
  25.         if (ip_tmp[0] == ':')
  26.             ip_tmp++;
  27.  
  28.         if (!sscanf (ip_tmp, "%x", &(ip_return[i]))) {
  29.             i--;
  30.             break;
  31.         }
  32.         ip_tmp = strchr (ip_tmp, ':');
  33.        
  34.         if (ip_tmp == NULL)
  35.             break;
  36.     }
  37.  
  38.     if (i < 7 && i_space >= 0) {
  39.         b = 7 - i;
  40.         for (i2 = 7; i2 >= i_space; i2--) {
  41.             if (i2 - b >= i_space)
  42.                 ip_return[i2] = ip_return[i2 - b];
  43.             else
  44.                 ip_return[i2] = 0;
  45.         }
  46.     }
  47.    
  48.     // Netmask extrahieren
  49.     ip_return[8] = -1;
  50.     netmp = strchr (ip, '/');
  51.     //*netmp++ = '\0';
  52.     if (netmp) {
  53.         netmp++;
  54.         sscanf (netmp, "%d", &(ip_return[8]));
  55.     }
  56.    
  57.     return 1;
  58. }
  59.  
  60. int print_ipv6 (unsigned int * ip) {
  61.     int i;
  62.  
  63.     for (i = 0; i < 8; i++)
  64.         printf ("%s%x", (i > 0) ? ":" : "", ip[i]);
  65.    
  66.     if ((int) ip[8] >= 0)
  67.         printf ("/%d", ip[8]);
  68.    
  69.     printf ("\n");
  70.    
  71.     return 1;
  72. }
  73.  
  74. int main (int argc, char ** argv)
  75. {
  76.     unsigned int    network[9];
  77.     unsigned int    ip1[9];
  78.     unsigned int    ip2[9];
  79.     unsigned int    netmask[8];
  80.     int             n_bits;
  81.     int             ips = 0;
  82.     int             i;
  83.     int             b;
  84.     int             b2;
  85.     int             idx;
  86.    
  87.    
  88.     if (argc <= 1) {
  89.         fprintf(stderr, "No arguments given\n");
  90.         return 1;
  91.     }
  92.     // Eine IP angegeben
  93.     if (argc > 1) {
  94.         ips = 1;
  95.         expand_ipv6(argv[1], ip1);
  96.     }
  97.     // Zwei IPs angegeben
  98.     if (argc > 2) {
  99.         ips = 2;
  100.         expand_ipv6(argv[2], ip2);
  101.     }
  102.    
  103.    
  104.     // Bei nur einer angegebenen IP ohne oder mit 128 Netmask,
  105.     // nur die IP ausgeben ohne Berechnung
  106.     if (ips == 1 && ((int) ip1[8] < 0 || ip1[8] > 127)) {
  107.         print_ipv6(ip1);
  108.         return 0;
  109.     }
  110.    
  111.    
  112.     if (ips > 1)
  113.         for (b = 0; b < ip2[8]; b++) {
  114.             i = b / 16;
  115.             b2 = (127 - b) % 16;
  116.        
  117.             if (ip2[i] & (1 << b2))
  118.                 ip1[i] |= (1 << b2);
  119.             else
  120.                 ip1[i] &= ~(1 << b2);
  121.         }
  122.    
  123.    
  124.     // Netmask
  125.     if (ips == 1 || (ip1[8] > 0 && ip1[8] < 128)) {
  126.        
  127.         for (i = 0; i < 8; i++)
  128.             netmask[i] = 0;
  129.        
  130.         for (b = 0; b < ip1[8]; b++) {
  131.             i = b / 16;
  132.             b2 = (127 - b) % 16;
  133.  
  134.             netmask[i] |= (1 << b2);
  135.         }
  136.  
  137.         for (i = 0; i < 8; i++)
  138.             ip1[i] &= netmask[i];
  139.     }
  140.  
  141.     print_ipv6(ip1);
  142.     return (0);
  143. }
RAW Paste Data
Top