00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00037 #include <net/socket_codes.h>
00038 #include <net/in.h>
00039 #include <net/in6.h>
00040 #include <net/inet.h>
00041
00042 #include <errno.h>
00043 #include <mem.h>
00044 #include <stdio.h>
00045 #include <str.h>
00046
00058 int
00059 inet_ntop(uint16_t family, const uint8_t *data, char *address, size_t length)
00060 {
00061 if ((!data) || (!address))
00062 return EINVAL;
00063
00064 switch (family) {
00065 case AF_INET:
00066
00067 if (length < INET_ADDRSTRLEN)
00068 return ENOMEM;
00069
00070
00071 snprintf(address, length, "%hhu.%hhu.%hhu.%hhu",
00072 data[0], data[1], data[2], data[3]);
00073
00074 return EOK;
00075
00076 case AF_INET6:
00077
00078 if (length < INET6_ADDRSTRLEN)
00079 return ENOMEM;
00080
00081
00082 snprintf(address, length,
00083 "%hhx%hhx:%hhx%hhx:%hhx%hhx:%hhx%hhx:%hhx%hhx:%hhx%hhx:"
00084 "%hhx%hhx:%hhx%hhx",
00085 data[0], data[1], data[2], data[3], data[4], data[5],
00086 data[6], data[7], data[8], data[9], data[10], data[11],
00087 data[12], data[13], data[14], data[15]);
00088
00089 return EOK;
00090
00091 default:
00092 return ENOTSUP;
00093 }
00094 }
00095
00108 int inet_pton(uint16_t family, const char *address, uint8_t *data)
00109 {
00111 int base;
00113 size_t bytes;
00115 int count;
00116
00117 const char *next;
00118 char *last;
00119 int index;
00120 size_t shift;
00121 unsigned long value;
00122
00123 if (!data)
00124 return EINVAL;
00125
00126
00127 switch (family) {
00128 case AF_INET:
00129 count = 4;
00130 base = 10;
00131 bytes = 1;
00132 break;
00133
00134 case AF_INET6:
00135 count = 16;
00136 base = 16;
00137 bytes = 4;
00138 break;
00139
00140 default:
00141 return ENOTSUP;
00142 }
00143
00144
00145 if (!address) {
00146 bzero(data, count);
00147 return ENOENT;
00148 }
00149
00150
00151 next = address;
00152 index = 0;
00153 do {
00154
00155 if (next && *next) {
00156
00157
00158 if (index) {
00159
00160 ++next;
00161 }
00162
00163
00164 value = strtoul(next, &last, base);
00165
00166
00167
00168
00169
00170 next = last;
00171
00172
00173 shift = bytes - 1;
00174 do {
00175
00176 data[index + shift] = value;
00177 value >>= 8;
00178 } while(shift --);
00179
00180 index += bytes;
00181 } else {
00182
00183 bzero(data + index, count - index);
00184 return EOK;
00185 }
00186 } while (index < count);
00187
00188 return EOK;
00189 }
00190