PostgreSQL Source Code: src/port/inet_net_ntop.c Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20#if defined(LIBC_SCCS) && !defined(lint)

21static const char rcsid[] = "Id: inet_net_ntop.c,v 1.1.2.2 2004/03/09 09:17:27 marka Exp $";

22#endif

23

24#ifndef FRONTEND

26#else

28#endif

29

33

34#ifndef FRONTEND

36#else

37

38

39

40

41

42#define PGSQL_AF_INET (AF_INET + 0)

43#define PGSQL_AF_INET6 (AF_INET + 1)

44#endif

45

46

47#define NS_IN6ADDRSZ 16

48#define NS_INT16SZ 2

49

50#ifdef SPRINTF_CHAR

51#define SPRINTF(x) strlen(sprintfx)

52#else

53#define SPRINTF(x) ((size_t)sprintf x)

54#endif

55

57 char *dst, size_t size);

59 char *dst, size_t size);

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76char *

77pg_inet_net_ntop(int af, const void *src, int bits, char *dst, size_t size)

78{

79

80

81

82

83

84

85 switch (af)

86 {

90#if AF_INET6 != PGSQL_AF_INET6

91 case AF_INET6:

92#endif

94 default:

96 return (NULL);

97 }

98}

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113static char *

115{

116 char *odst = dst;

117 char *t;

118 int len = 4;

119 int b;

120

121 if (bits < 0 || bits > 32)

122 {

123 errno = EINVAL;

124 return (NULL);

125 }

126

127

128 for (b = len; b > 0; b--)

129 {

130 if (size <= sizeof ".255")

131 goto emsgsize;

132 t = dst;

133 if (dst != odst)

134 *dst++ = '.';

135 dst += SPRINTF((dst, "%u", *src++));

136 size -= (size_t) (dst - t);

137 }

138

139

140 if (bits != 32)

141 {

142 if (size <= sizeof "/32")

143 goto emsgsize;

144 dst += SPRINTF((dst, "/%u", bits));

145 }

146

147 return (odst);

148

149emsgsize:

151 return (NULL);

152}

153

154static int

155decoct(const u_char *src, int bytes, char *dst, size_t size)

156{

157 char *odst = dst;

158 char *t;

159 int b;

160

161 for (b = 1; b <= bytes; b++)

162 {

163 if (size <= sizeof "255.")

164 return (0);

165 t = dst;

166 dst += SPRINTF((dst, "%u", *src++));

167 if (b != bytes)

168 {

169 *dst++ = '.';

170 *dst = '\0';

171 }

172 size -= (size_t) (dst - t);

173 }

174 return (dst - odst);

175}

176

177static char *

179{

180

181

182

183

184

185

186

187 char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255/128"];

188 char *tp;

189 struct

190 {

191 int base,

193 } best, cur;

195 int i;

196

197 if ((bits < -1) || (bits > 128))

198 {

199 errno = EINVAL;

200 return (NULL);

201 }

202

203

204

205

206

207 memset(words, '\0', sizeof words);

209 words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));

210 best.base = -1;

211 cur.base = -1;

212 best.len = 0;

213 cur.len = 0;

215 {

216 if (words[i] == 0)

217 {

218 if (cur.base == -1)

219 cur.base = i, cur.len = 1;

220 else

221 cur.len++;

222 }

223 else

224 {

225 if (cur.base != -1)

226 {

227 if (best.base == -1 || cur.len > best.len)

228 best = cur;

229 cur.base = -1;

230 }

231 }

232 }

233 if (cur.base != -1)

234 {

235 if (best.base == -1 || cur.len > best.len)

236 best = cur;

237 }

238 if (best.base != -1 && best.len < 2)

239 best.base = -1;

240

241

242

243

244 tp = tmp;

246 {

247

248 if (best.base != -1 && i >= best.base &&

249 i < (best.base + best.len))

250 {

251 if (i == best.base)

252 *tp++ = ':';

253 continue;

254 }

255

256 if (i != 0)

257 *tp++ = ':';

258

259 if (i == 6 && best.base == 0 && (best.len == 6 ||

260 (best.len == 7 && words[7] != 0x0001) ||

261 (best.len == 5 && words[5] == 0xffff)))

262 {

263 int n;

264

265 n = decoct(src + 12, 4, tp, sizeof tmp - (tp - tmp));

266 if (n == 0)

267 {

269 return (NULL);

270 }

271 tp += strlen(tp);

272 break;

273 }

274 tp += SPRINTF((tp, "%x", words[i]));

275 }

276

277

278 if (best.base != -1 && (best.base + best.len) ==

280 *tp++ = ':';

281 *tp = '\0';

282

283 if (bits != -1 && bits != 128)

284 tp += SPRINTF((tp, "/%u", bits));

285

286

287

288

289 if ((size_t) (tp - tmp) > size)

290 {

292 return (NULL);

293 }

294 strcpy(dst, tmp);

295 return (dst);

296}

static char * inet_net_ntop_ipv6(const u_char *src, int bits, char *dst, size_t size)

char * pg_inet_net_ntop(int af, const void *src, int bits, char *dst, size_t size)

static char * inet_net_ntop_ipv4(const u_char *src, int bits, char *dst, size_t size)

static int decoct(const u_char *src, int bytes, char *dst, size_t size)