PostgreSQL Source Code: src/common/ip.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#ifndef FRONTEND

22#else

24#endif

25

27#include <sys/stat.h>

34

36

37

38

40 const struct addrinfo *hintsp,

41 struct addrinfo **result);

42

44 char *node, int nodelen,

45 char *service, int servicelen,

46 int flags);

47

48

49

50

51

52int

54 const struct addrinfo *hintp, struct addrinfo **result)

55{

56 int rc;

57

58

59 *result = NULL;

60

61 if (hintp->ai_family == AF_UNIX)

63

64

66 servname, hintp, result);

67

68 return rc;

69}

70

71

72

73

74

75

76

77

78

79

80

81void

83{

84 if (hint_ai_family == AF_UNIX)

85 {

86

87 while (ai != NULL)

88 {

89 struct addrinfo *p = ai;

90

91 ai = ai->ai_next;

92 free(p->ai_addr);

94 }

95 }

96 else

97 {

98

99 if (ai != NULL)

100 freeaddrinfo(ai);

101 }

102}

103

104

105

106

107

108

109

110

111

112

113int

115 char *node, int nodelen,

116 char *service, int servicelen,

117 int flags)

118{

119 int rc;

120

121 if (addr && addr->ss_family == AF_UNIX)

123 node, nodelen,

124 service, servicelen,

125 flags);

126 else

127 rc = getnameinfo((const struct sockaddr *) addr, salen,

128 node, nodelen,

129 service, servicelen,

130 flags);

131

132 if (rc != 0)

133 {

134 if (node)

135 strlcpy(node, "???", nodelen);

136 if (service)

137 strlcpy(service, "???", servicelen);

138 }

139

140 return rc;

141}

142

143

144

145

146

147

148

149

150

151

152static int

154 struct addrinfo **result)

155{

156 struct addrinfo hints = {0};

157 struct addrinfo *aip;

159

160 *result = NULL;

161

162 if (strlen(path) >= sizeof(unp->sun_path))

163 return EAI_FAIL;

164

165 if (hintsp == NULL)

166 {

167 hints.ai_family = AF_UNIX;

168 hints.ai_socktype = SOCK_STREAM;

169 }

170 else

171 memcpy(&hints, hintsp, sizeof(hints));

172

173 if (hints.ai_socktype == 0)

174 hints.ai_socktype = SOCK_STREAM;

175

176 if (hints.ai_family != AF_UNIX)

177 {

178

179 return EAI_FAIL;

180 }

181

182 aip = calloc(1, sizeof(struct addrinfo));

183 if (aip == NULL)

184 return EAI_MEMORY;

185

187 if (unp == NULL)

188 {

190 return EAI_MEMORY;

191 }

192

193 aip->ai_family = AF_UNIX;

194 aip->ai_socktype = hints.ai_socktype;

195 aip->ai_protocol = hints.ai_protocol;

196 aip->ai_next = NULL;

197 aip->ai_canonname = NULL;

198 *result = aip;

199

201 aip->ai_addr = (struct sockaddr *) unp;

202 aip->ai_addrlen = sizeof(struct sockaddr_un);

203

205

206

207

208

209

210

211

212

213

214

215 if (path[0] == '@')

216 {

219 }

220

221 return 0;

222}

223

224

225

226

227static int

229 char *node, int nodelen,

230 char *service, int servicelen,

231 int flags)

232{

233 int ret;

234

235

236 if (sa == NULL || sa->sun_family != AF_UNIX ||

237 (node == NULL && service == NULL))

238 return EAI_FAIL;

239

240 if (node)

241 {

242 ret = snprintf(node, nodelen, "%s", "[local]");

243 if (ret < 0 || ret >= nodelen)

244 return EAI_MEMORY;

245 }

246

247 if (service)

248 {

249

250

251

252

253 if (sa->sun_path[0] == '\0' && sa->sun_path[1] != '\0')

254 ret = snprintf(service, servicelen, "@%s", sa->sun_path + 1);

255 else

256 ret = snprintf(service, servicelen, "%s", sa->sun_path);

257 if (ret < 0 || ret >= servicelen)

258 return EAI_MEMORY;

259 }

260

261 return 0;

262}

void pg_freeaddrinfo_all(int hint_ai_family, struct addrinfo *ai)

int pg_getnameinfo_all(const struct sockaddr_storage *addr, int salen, char *node, int nodelen, char *service, int servicelen, int flags)

static int getnameinfo_unix(const struct sockaddr_un *sa, int salen, char *node, int nodelen, char *service, int servicelen, int flags)

static int getaddrinfo_unix(const char *path, const struct addrinfo *hintsp, struct addrinfo **result)

int pg_getaddrinfo_all(const char *hostname, const char *servname, const struct addrinfo *hintp, struct addrinfo **result)

size_t strlcpy(char *dst, const char *src, size_t siz)

unsigned short sun_family