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