Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- int expand_ipv6 (char * ip, unsigned int * ip_return) {
- char * ip_tmp;
- char * netmp;
- int i_space = -1;
- int i;
- int i2;
- int b;
- ip_tmp = ip;
- for (i = 0; i < 9; i++)
- ip_return[i] = 0;
- // IP extrahieren
- for (i = 0; i < 8; i++) {
- if (ip_tmp[0] == ':' && ip_tmp[1] == ':') {
- i_space = i;
- ip_tmp++;
- }
- if (ip_tmp[0] == ':')
- ip_tmp++;
- if (!sscanf (ip_tmp, "%x", &(ip_return[i]))) {
- i--;
- break;
- }
- ip_tmp = strchr (ip_tmp, ':');
- if (ip_tmp == NULL)
- break;
- }
- if (i < 7 && i_space >= 0) {
- b = 7 - i;
- for (i2 = 7; i2 >= i_space; i2--) {
- if (i2 - b >= i_space)
- ip_return[i2] = ip_return[i2 - b];
- else
- ip_return[i2] = 0;
- }
- }
- // Netmask extrahieren
- ip_return[8] = -1;
- netmp = strchr (ip, '/');
- //*netmp++ = '\0';
- if (netmp) {
- netmp++;
- sscanf (netmp, "%d", &(ip_return[8]));
- }
- return 1;
- }
- int print_ipv6 (unsigned int * ip) {
- int i;
- for (i = 0; i < 8; i++)
- printf ("%s%x", (i > 0) ? ":" : "", ip[i]);
- if ((int) ip[8] >= 0)
- printf ("/%d", ip[8]);
- printf ("\n");
- return 1;
- }
- int main (int argc, char ** argv)
- {
- unsigned int network[9];
- unsigned int ip1[9];
- unsigned int ip2[9];
- unsigned int netmask[8];
- int n_bits;
- int ips = 0;
- int i;
- int b;
- int b2;
- int idx;
- if (argc <= 1) {
- fprintf(stderr, "No arguments given\n");
- return 1;
- }
- // Eine IP angegeben
- if (argc > 1) {
- ips = 1;
- expand_ipv6(argv[1], ip1);
- }
- // Zwei IPs angegeben
- if (argc > 2) {
- ips = 2;
- expand_ipv6(argv[2], ip2);
- }
- // Bei nur einer angegebenen IP ohne oder mit 128 Netmask,
- // nur die IP ausgeben ohne Berechnung
- if (ips == 1 && ((int) ip1[8] < 0 || ip1[8] > 127)) {
- print_ipv6(ip1);
- return 0;
- }
- if (ips > 1)
- for (b = 0; b < ip2[8]; b++) {
- i = b / 16;
- b2 = (127 - b) % 16;
- if (ip2[i] & (1 << b2))
- ip1[i] |= (1 << b2);
- else
- ip1[i] &= ~(1 << b2);
- }
- // Netmask
- if (ips == 1 || (ip1[8] > 0 && ip1[8] < 128)) {
- for (i = 0; i < 8; i++)
- netmask[i] = 0;
- for (b = 0; b < ip1[8]; b++) {
- i = b / 16;
- b2 = (127 - b) % 16;
- netmask[i] |= (1 << b2);
- }
- for (i = 0; i < 8; i++)
- ip1[i] &= netmask[i];
- }
- print_ipv6(ip1);
- return (0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement