40 unsigned short ip6[8];
44 int ipv4_inet_pton(
const char *src)
47 char ipv4_map_ipv6[20], ipv4[16], octet_1[5], octet_2[5], concat_octets[20];
48 int octet[4], octet_index = 0 , dot_count = 0;
50 static const char hex[] =
"0123456789";
51 const char * char_ptr_src;
53 memset(ipv4_map_ipv6, 0,
sizeof(ipv4_map_ipv6));
54 strcpy(ipv4_map_ipv6, src);
56 memset(octet, 0,
sizeof(octet));
57 memset(ipv4, 0,
sizeof(ipv4));
58 memset(octet_1, 0,
sizeof(octet_1));
59 memset(octet_2, 0,
sizeof(octet_2));
60 memset(concat_octets, 0,
sizeof(concat_octets));
62 ptr_src = ipv4_map_ipv6;
64 if (*ptr_src ==
':' && *++ptr_src !=
':')
67 if (*ptr_src ==
':' && *++ptr_src ==
':')
74 while(*ptr_src !=
'\0')
78 if (*ptr_src ==
'.' && *++ptr_src !=
'.')
84 char_ptr_src = strchr (hex, *ptr_src);
86 if(char_ptr_src == NULL)
95 while(*ptr_src !=
'\0')
97 if ( *ptr_src ==
':' && *++ptr_src ==
'\0')
102 if ( *ptr_src ==
'.' && *++ptr_src ==
'\0')
109 ptr_src = strtok(ipv4,
".");
111 while (ptr_src !=
'\0')
113 sscanf(ptr_src,
"%d", &octet[octet_index]);
115 if(octet[octet_index++] > 255)
120 ptr_src = strtok (NULL,
".");
131 if(octet_index < 3 || octet_index > 4)
138 str.ip6[0] = str.ip6[1] = str.ip6[2] = str.ip6[3] = str.ip6[4] = str.ip6[5] = 0;
140 for (
int i=6 ; i <= 7; i++)
147 sprintf(octet_1,
"%02x", octet[octet_index]);
149 sprintf(octet_2,
"%02x", octet[++octet_index]);
151 strcpy(concat_octets,octet_1);
153 strcat(concat_octets,octet_2);
155 sscanf(concat_octets,
"%x",(
unsigned int *)&str.ip6[i]);
157 memset(octet_1, 0,
sizeof(octet_1));
159 memset(octet_2, 0,
sizeof(octet_2));
161 memset(concat_octets, 0,
sizeof(concat_octets));
168 char * ipv4_inet_ntop(
char *destination)
170 memset(destination, 0,
sizeof(destination));
172 snprintf(destination, IPV6_BUFFER_LENGTH,
"%03x:%03x:%03x:%03x:%03x:%03x:%03d.%03d.%03d.%03d" ,
173 str.ip6[0],str.ip6[1],str.ip6[2],str.ip6[3],str.ip6[4],str.ip6[5],
174 (((
unsigned int )str.ip6[6]>>8) & 0xFF),
175 ((
unsigned int )str.ip6[6] & 0xFF),
176 (((
unsigned int )str.ip6[7]>>8) & 0xFF),
177 ((
unsigned int )str.ip6[7] & 0xFF));
185 int ipv6_inet_pton(
const char *src)
187 if (strlen(src)> IPV6_DISPLAY_LENGTH)
193 char ipv6[IPV6_BUFFER_LENGTH];
195 memset(ipv6, 0, IPV6_BUFFER_LENGTH);
199 char ipv6_temp[IPV6_BUFFER_LENGTH], ipv6_temp1[IPV6_BUFFER_LENGTH], ipv6_temp2[IPV6_BUFFER_LENGTH];
201 memset(ipv6_temp, 0, IPV6_BUFFER_LENGTH);
203 strcpy(ipv6_temp, ipv6);
205 memset(ipv6_temp1, 0, IPV6_BUFFER_LENGTH);
207 strcpy(ipv6_temp1, ipv6);
209 memset(ipv6_temp2, 0, IPV6_BUFFER_LENGTH);
211 strcpy(ipv6_temp2,ipv6);
214 static const char hex[] =
"0123456789abcdef";
215 char temp[IPV6_BUFFER_LENGTH];
216 char *ptr_src ,*ptr_char, *ptr_src1;
217 const char *char_ptr_src;
218 int char_int = 0, index_ip6 = 0, octet_count = 0, not_colon = 0, colon = 0, count_colon = 0;
219 char temp_first[IPV6_BUFFER_LENGTH],temp_end[IPV6_BUFFER_LENGTH];
221 memset(temp_first, 0, IPV6_BUFFER_LENGTH);
223 memset(temp_end, 0, IPV6_BUFFER_LENGTH);
227 while (*ptr_src !=
'\0')
230 if (*ptr_src ==
':' && *++ptr_src ==
':' && *++ptr_src ==
':')
241 while (*ptr_src !=
'\0')
245 if (*ptr_src ==
':' && *++ptr_src !=
':')
247 if (count_colon == 1)
257 while (*ptr_src !=
'\0')
259 if ( *ptr_src ==
':' && *++ptr_src ==
'\0')
270 ptr_src = strtok (ipv6_temp2,
":");
273 while (ptr_src != NULL)
277 ptr_src = strtok (NULL,
":");
285 bool colon_flag =
true;
289 while (*ptr_src !=
'\0')
291 if (*ptr_src ==
':' && *++ptr_src ==
':')
298 if (colon_flag ==
true && octet_count < 8)
303 int num_miss_octet =0;
305 num_miss_octet = 8 - octet_count;
307 size = 2*num_miss_octet +1;
310 std::string zero_append;
315 while(*ptr_src !=
'\0')
317 if(*ptr_src ==
':' && *++ptr_src ==
':')
319 if (*++ptr_src==
'\0')
323 else if (not_colon == 0)
350 for (
int i= 0; i < num_miss_octet; i++)
357 if(colon==2 || colon==3)
370 if(colon==1 || colon==3)
373 ptr_src1 = strstr (ipv6_temp,
"::");
375 ptr_src1 = ptr_src1+2;
377 while(*ptr_src1 !=
'\0')
379 *ptr_src++ = *ptr_src1++;
381 if(*ptr_src1 ==
'\0')
389 ptr_src1 = strstr (ipv6_temp1,
"::");
393 strcpy(temp_first,ipv6_temp1);
397 strcat(temp_first, zero_append.c_str());
401 strcat(temp_first, zero_append.c_str());
403 strcat(temp_first,temp_end);
406 memset(ipv6, 0, IPV6_BUFFER_LENGTH);
408 strcpy(ipv6,temp_first);
416 ptr_src = strtok (ipv6,
":");
419 while (ptr_src != NULL)
421 strcpy(temp, ptr_src);
425 int octet_length = strlen(ptr_char);
427 *(ptr_char + octet_length) =
'\0';
430 while(*ptr_char !=
'\0')
432 char_int = tolower(*ptr_char);
434 char_ptr_src = strchr (hex, char_int);
436 if(char_ptr_src == NULL)
442 *ptr_char = *char_ptr_src;
446 ptr_char -= octet_length;
448 unsigned int ptr_char_val = 0;
450 sscanf(ptr_char,
"%x", (
unsigned int *)&ptr_char_val);
453 if (ptr_char_val > 65535)
455 str.ip6[0] = str.ip6[1] = str.ip6[2] = str.ip6[3] = str.ip6[4] = str.ip6[5] = str.ip6[6] = str.ip6[7] = 0;
459 unsigned int *ptr = (
unsigned int *)&(str.ip6[index_ip6++]);
461 sscanf(ptr_char,
"%x", ptr);
463 memset(temp, 0, IPV6_BUFFER_LENGTH);
465 ptr_src = strtok (NULL,
":");
472 char* ipv6_inet_ntop(
char *destination)
476 memset(temp, 0,
sizeof(temp));
478 memset(destination, 0, IPV6_BUFFER_LENGTH);
481 for (
int i= 0; i <= 7; i++)
485 sprintf(temp,
"%04x",str.ip6[i]);
487 strcat(destination,temp);
491 sprintf(temp,
"%04x:",str.ip6[i]);
493 strcat(destination,temp);
496 memset(temp, 0,
sizeof(temp));
508 str.ip6[0] = str.ip6[1] = str.ip6[2] = str.ip6[3] = str.ip6[4] = str.ip6[5] = str.ip6[6] = str.ip6[7] = 0;
512 void store_object(
unsigned char *out)
514 memcpy(out, (
unsigned char *)&str,
sizeof(str));
517 void restore_object(
const unsigned char * in)
519 memcpy(&str, (
struct ipv6_ds *)in,
sizeof(str));
522 int inet_pton(
const char *ip)
526 pch=strchr((
char *)ip,
'.');
530 return ipv6_inet_pton(ip);
534 return ipv4_inet_pton(ip);
538 char * inet_ntop(
char *dest)
540 if (str.ip6[0]==0 && str.ip6[1]==0 && str.ip6[2]==0 && str.ip6[3]==0 && str.ip6[4]==0 && str.ip6[5]==0 && str.ip6[6]!=0)
542 return ipv4_inet_ntop(dest);
546 return ipv6_inet_ntop(dest);
550 static const size_t LENGTH= 16;
551 static const size_t IPV6_DISPLAY_LENGTH= 39;
552 static const size_t IPV6_BUFFER_LENGTH= IPV6_DISPLAY_LENGTH+1;