diff options
author | jsing <> | 2014-04-15 16:37:22 +0000 |
---|---|---|
committer | jsing <> | 2014-04-15 16:37:22 +0000 |
commit | bb63ff2d125e51688213d0af9e4f785cf3865063 (patch) | |
tree | 41dd30d546977ed0c409d7de59564fa1a2e3b100 /src/lib/libcrypto/bio/b_sock.c | |
parent | 90b03b7785bece7b16c6a38b7db633fcfdd9ecf4 (diff) | |
download | openbsd-bb63ff2d125e51688213d0af9e4f785cf3865063.tar.gz openbsd-bb63ff2d125e51688213d0af9e4f785cf3865063.tar.bz2 openbsd-bb63ff2d125e51688213d0af9e4f785cf3865063.zip |
First pass at applying KNF to the OpenSSL code, which almost makes it
readable. This pass is whitespace only and can readily be verified using
tr and md5.
Diffstat (limited to 'src/lib/libcrypto/bio/b_sock.c')
-rw-r--r-- | src/lib/libcrypto/bio/b_sock.c | 1025 |
1 files changed, 503 insertions, 522 deletions
diff --git a/src/lib/libcrypto/bio/b_sock.c b/src/lib/libcrypto/bio/b_sock.c index bd43307456..d739452580 100644 --- a/src/lib/libcrypto/bio/b_sock.c +++ b/src/lib/libcrypto/bio/b_sock.c | |||
@@ -85,7 +85,7 @@ NETDB_DEFINE_CONTEXT | |||
85 | #endif | 85 | #endif |
86 | 86 | ||
87 | #if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) | 87 | #if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) |
88 | static int wsa_init_done=0; | 88 | static int wsa_init_done = 0; |
89 | #endif | 89 | #endif |
90 | 90 | ||
91 | /* | 91 | /* |
@@ -100,36 +100,36 @@ static int wsa_init_done=0; | |||
100 | #endif | 100 | #endif |
101 | 101 | ||
102 | #if 0 | 102 | #if 0 |
103 | static unsigned long BIO_ghbn_hits=0L; | 103 | static unsigned long BIO_ghbn_hits = 0L; |
104 | static unsigned long BIO_ghbn_miss=0L; | 104 | static unsigned long BIO_ghbn_miss = 0L; |
105 | 105 | ||
106 | #define GHBN_NUM 4 | 106 | #define GHBN_NUM 4 |
107 | static struct ghbn_cache_st | 107 | static struct ghbn_cache_st { |
108 | { | ||
109 | char name[129]; | 108 | char name[129]; |
110 | struct hostent *ent; | 109 | struct hostent *ent; |
111 | unsigned long order; | 110 | unsigned long order; |
112 | } ghbn_cache[GHBN_NUM]; | 111 | } ghbn_cache[GHBN_NUM]; |
113 | #endif | 112 | #endif |
114 | 113 | ||
115 | static int get_ip(const char *str,unsigned char *ip); | 114 | static int get_ip(const char *str, unsigned char *ip); |
116 | #if 0 | 115 | #if 0 |
117 | static void ghbn_free(struct hostent *a); | 116 | static void ghbn_free(struct hostent *a); |
118 | static struct hostent *ghbn_dup(struct hostent *a); | 117 | static struct hostent *ghbn_dup(struct hostent *a); |
119 | #endif | 118 | #endif |
120 | int BIO_get_host_ip(const char *str, unsigned char *ip) | 119 | |
121 | { | 120 | int |
121 | BIO_get_host_ip(const char *str, unsigned char *ip) | ||
122 | { | ||
122 | int i; | 123 | int i; |
123 | int err = 1; | 124 | int err = 1; |
124 | int locked = 0; | 125 | int locked = 0; |
125 | struct hostent *he; | 126 | struct hostent *he; |
126 | 127 | ||
127 | i=get_ip(str,ip); | 128 | i = get_ip(str, ip); |
128 | if (i < 0) | 129 | if (i < 0) { |
129 | { | 130 | BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_INVALID_IP_ADDRESS); |
130 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS); | ||
131 | goto err; | 131 | goto err; |
132 | } | 132 | } |
133 | 133 | ||
134 | /* At this point, we have something that is most probably correct | 134 | /* At this point, we have something that is most probably correct |
135 | in some way, so let's init the socket. */ | 135 | in some way, so let's init the socket. */ |
@@ -138,172 +138,169 @@ int BIO_get_host_ip(const char *str, unsigned char *ip) | |||
138 | 138 | ||
139 | /* If the string actually contained an IP address, we need not do | 139 | /* If the string actually contained an IP address, we need not do |
140 | anything more */ | 140 | anything more */ |
141 | if (i > 0) return(1); | 141 | if (i > 0) |
142 | return (1); | ||
142 | 143 | ||
143 | /* do a gethostbyname */ | 144 | /* do a gethostbyname */ |
144 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); | 145 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); |
145 | locked = 1; | 146 | locked = 1; |
146 | he=BIO_gethostbyname(str); | 147 | he = BIO_gethostbyname(str); |
147 | if (he == NULL) | 148 | if (he == NULL) { |
148 | { | 149 | BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_BAD_HOSTNAME_LOOKUP); |
149 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP); | ||
150 | goto err; | 150 | goto err; |
151 | } | 151 | } |
152 | 152 | ||
153 | /* cast to short because of win16 winsock definition */ | 153 | /* cast to short because of win16 winsock definition */ |
154 | if ((short)he->h_addrtype != AF_INET) | 154 | if ((short)he->h_addrtype != AF_INET) { |
155 | { | 155 | BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET); |
156 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET); | ||
157 | goto err; | 156 | goto err; |
158 | } | 157 | } |
159 | for (i=0; i<4; i++) | 158 | for (i = 0; i < 4; i++) |
160 | ip[i]=he->h_addr_list[0][i]; | 159 | ip[i] = he->h_addr_list[0][i]; |
161 | err = 0; | 160 | err = 0; |
162 | 161 | ||
163 | err: | 162 | err: |
164 | if (locked) | 163 | if (locked) |
165 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); | 164 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); |
166 | if (err) | 165 | if (err) { |
167 | { | 166 | ERR_add_error_data(2, "host=", str); |
168 | ERR_add_error_data(2,"host=",str); | ||
169 | return 0; | 167 | return 0; |
170 | } | 168 | } else |
171 | else | ||
172 | return 1; | 169 | return 1; |
173 | } | 170 | } |
174 | 171 | ||
175 | int BIO_get_port(const char *str, unsigned short *port_ptr) | 172 | int |
176 | { | 173 | BIO_get_port(const char *str, unsigned short *port_ptr) |
174 | { | ||
177 | int i; | 175 | int i; |
178 | struct servent *s; | 176 | struct servent *s; |
179 | 177 | ||
180 | if (str == NULL) | 178 | if (str == NULL) { |
181 | { | 179 | BIOerr(BIO_F_BIO_GET_PORT, BIO_R_NO_PORT_DEFINED); |
182 | BIOerr(BIO_F_BIO_GET_PORT,BIO_R_NO_PORT_DEFINED); | 180 | return (0); |
183 | return(0); | 181 | } |
184 | } | 182 | i = atoi(str); |
185 | i=atoi(str); | ||
186 | if (i != 0) | 183 | if (i != 0) |
187 | *port_ptr=(unsigned short)i; | 184 | *port_ptr = (unsigned short)i; |
188 | else | 185 | else { |
189 | { | ||
190 | CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME); | 186 | CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME); |
191 | /* Note: under VMS with SOCKETSHR, it seems like the first | 187 | /* Note: under VMS with SOCKETSHR, it seems like the first |
192 | * parameter is 'char *', instead of 'const char *' | 188 | * parameter is 'char *', instead of 'const char *' |
193 | */ | 189 | */ |
194 | #ifndef CONST_STRICT | 190 | #ifndef CONST_STRICT |
195 | s=getservbyname((char *)str,"tcp"); | 191 | s = getservbyname((char *)str, "tcp"); |
196 | #else | 192 | #else |
197 | s=getservbyname(str,"tcp"); | 193 | s = getservbyname(str, "tcp"); |
198 | #endif | 194 | #endif |
199 | if(s != NULL) | 195 | if (s != NULL) |
200 | *port_ptr=ntohs((unsigned short)s->s_port); | 196 | *port_ptr = ntohs((unsigned short)s->s_port); |
201 | CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME); | 197 | CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME); |
202 | if(s == NULL) | 198 | if (s == NULL) { |
203 | { | 199 | if (strcmp(str, "http") == 0) |
204 | if (strcmp(str,"http") == 0) | 200 | *port_ptr = 80; |
205 | *port_ptr=80; | 201 | else if (strcmp(str, "telnet") == 0) |
206 | else if (strcmp(str,"telnet") == 0) | 202 | *port_ptr = 23; |
207 | *port_ptr=23; | 203 | else if (strcmp(str, "socks") == 0) |
208 | else if (strcmp(str,"socks") == 0) | 204 | *port_ptr = 1080; |
209 | *port_ptr=1080; | 205 | else if (strcmp(str, "https") == 0) |
210 | else if (strcmp(str,"https") == 0) | 206 | *port_ptr = 443; |
211 | *port_ptr=443; | 207 | else if (strcmp(str, "ssl") == 0) |
212 | else if (strcmp(str,"ssl") == 0) | 208 | *port_ptr = 443; |
213 | *port_ptr=443; | 209 | else if (strcmp(str, "ftp") == 0) |
214 | else if (strcmp(str,"ftp") == 0) | 210 | *port_ptr = 21; |
215 | *port_ptr=21; | 211 | else if (strcmp(str, "gopher") == 0) |
216 | else if (strcmp(str,"gopher") == 0) | 212 | *port_ptr = 70; |
217 | *port_ptr=70; | ||
218 | #if 0 | 213 | #if 0 |
219 | else if (strcmp(str,"wais") == 0) | 214 | else if (strcmp(str, "wais") == 0) |
220 | *port_ptr=21; | 215 | *port_ptr = 21; |
221 | #endif | 216 | #endif |
222 | else | 217 | else { |
223 | { | 218 | SYSerr(SYS_F_GETSERVBYNAME, errno); |
224 | SYSerr(SYS_F_GETSERVBYNAME,errno); | 219 | ERR_add_error_data(3, "service = '", str, "'"); |
225 | ERR_add_error_data(3,"service='",str,"'"); | 220 | return (0); |
226 | return(0); | ||
227 | } | ||
228 | } | 221 | } |
229 | } | 222 | } |
230 | return(1); | ||
231 | } | 223 | } |
224 | return (1); | ||
225 | } | ||
232 | 226 | ||
233 | int BIO_sock_error(int sock) | 227 | int |
234 | { | 228 | BIO_sock_error(int sock) |
235 | int j,i; | 229 | { |
230 | int j, i; | ||
236 | int size; | 231 | int size; |
237 | 232 | ||
238 | #if defined(OPENSSL_SYS_BEOS_R5) | 233 | #if defined(OPENSSL_SYS_BEOS_R5) |
239 | return 0; | 234 | return 0; |
240 | #endif | 235 | #endif |
241 | 236 | ||
242 | size=sizeof(int); | 237 | size = sizeof(int); |
243 | /* Note: under Windows the third parameter is of type (char *) | 238 | /* Note: under Windows the third parameter is of type (char *) |
244 | * whereas under other systems it is (void *) if you don't have | 239 | * whereas under other systems it is (void *) if you don't have |
245 | * a cast it will choke the compiler: if you do have a cast then | 240 | * a cast it will choke the compiler: if you do have a cast then |
246 | * you can either go for (char *) or (void *). | 241 | * you can either go for (char *) or (void *). |
247 | */ | 242 | */ |
248 | i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(void *)&j,(void *)&size); | 243 | i = getsockopt(sock, SOL_SOCKET, SO_ERROR,(void *)&j,(void *)&size); |
249 | if (i < 0) | 244 | if (i < 0) |
250 | return(1); | 245 | return (1); |
251 | else | 246 | else |
252 | return(j); | 247 | return (j); |
253 | } | 248 | } |
254 | 249 | ||
255 | #if 0 | 250 | #if 0 |
256 | long BIO_ghbn_ctrl(int cmd, int iarg, char *parg) | 251 | long |
257 | { | 252 | BIO_ghbn_ctrl(int cmd, int iarg, char *parg) |
253 | { | ||
258 | int i; | 254 | int i; |
259 | char **p; | 255 | char **p; |
260 | 256 | ||
261 | switch (cmd) | 257 | switch (cmd) { |
262 | { | ||
263 | case BIO_GHBN_CTRL_HITS: | 258 | case BIO_GHBN_CTRL_HITS: |
264 | return(BIO_ghbn_hits); | 259 | return (BIO_ghbn_hits); |
265 | /* break; */ | 260 | /* break; */ |
266 | case BIO_GHBN_CTRL_MISSES: | 261 | case BIO_GHBN_CTRL_MISSES: |
267 | return(BIO_ghbn_miss); | 262 | return (BIO_ghbn_miss); |
268 | /* break; */ | 263 | /* break; */ |
269 | case BIO_GHBN_CTRL_CACHE_SIZE: | 264 | case BIO_GHBN_CTRL_CACHE_SIZE: |
270 | return(GHBN_NUM); | 265 | return (GHBN_NUM); |
271 | /* break; */ | 266 | /* break; */ |
272 | case BIO_GHBN_CTRL_GET_ENTRY: | 267 | case BIO_GHBN_CTRL_GET_ENTRY: |
273 | if ((iarg >= 0) && (iarg <GHBN_NUM) && | 268 | if ((iarg >= 0) && (iarg < GHBN_NUM) && |
274 | (ghbn_cache[iarg].order > 0)) | 269 | (ghbn_cache[iarg].order > 0)) { |
275 | { | 270 | p = (char **)parg; |
276 | p=(char **)parg; | 271 | if (p == NULL) |
277 | if (p == NULL) return(0); | 272 | return (0); |
278 | *p=ghbn_cache[iarg].name; | 273 | *p = ghbn_cache[iarg].name; |
279 | ghbn_cache[iarg].name[128]='\0'; | 274 | ghbn_cache[iarg].name[128] = '\0'; |
280 | return(1); | 275 | return (1); |
281 | } | 276 | } |
282 | return(0); | 277 | return (0); |
283 | /* break; */ | 278 | /* break; */ |
284 | case BIO_GHBN_CTRL_FLUSH: | 279 | case BIO_GHBN_CTRL_FLUSH: |
285 | for (i=0; i<GHBN_NUM; i++) | 280 | for (i = 0; i < GHBN_NUM; i++) |
286 | ghbn_cache[i].order=0; | 281 | ghbn_cache[i].order = 0; |
287 | break; | 282 | break; |
288 | default: | 283 | default: |
289 | return(0); | 284 | return (0); |
290 | } | ||
291 | return(1); | ||
292 | } | 285 | } |
286 | return (1); | ||
287 | } | ||
293 | #endif | 288 | #endif |
294 | 289 | ||
295 | #if 0 | 290 | #if 0 |
296 | static struct hostent *ghbn_dup(struct hostent *a) | 291 | static struct hostent |
297 | { | 292 | *ghbn_dup(struct hostent *a) |
293 | { | ||
298 | struct hostent *ret; | 294 | struct hostent *ret; |
299 | int i,j; | 295 | int i, j; |
300 | 296 | ||
301 | MemCheck_off(); | 297 | MemCheck_off(); |
302 | ret=(struct hostent *)OPENSSL_malloc(sizeof(struct hostent)); | 298 | ret = (struct hostent *)OPENSSL_malloc(sizeof(struct hostent)); |
303 | if (ret == NULL) return(NULL); | 299 | if (ret == NULL) |
304 | memset(ret,0,sizeof(struct hostent)); | 300 | return (NULL); |
301 | memset(ret, 0, sizeof(struct hostent)); | ||
305 | 302 | ||
306 | for (i=0; a->h_aliases[i] != NULL; i++) | 303 | for (i = 0; a->h_aliases[i] != NULL; i++) |
307 | ; | 304 | ; |
308 | i++; | 305 | i++; |
309 | ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *)); | 306 | ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *)); |
@@ -311,69 +308,66 @@ static struct hostent *ghbn_dup(struct hostent *a) | |||
311 | goto err; | 308 | goto err; |
312 | memset(ret->h_aliases, 0, i*sizeof(char *)); | 309 | memset(ret->h_aliases, 0, i*sizeof(char *)); |
313 | 310 | ||
314 | for (i=0; a->h_addr_list[i] != NULL; i++) | 311 | for (i = 0; a->h_addr_list[i] != NULL; i++) |
315 | ; | 312 | ; |
316 | i++; | 313 | i++; |
317 | ret->h_addr_list=(char **)OPENSSL_malloc(i*sizeof(char *)); | 314 | ret->h_addr_list = (char **)OPENSSL_malloc(i*sizeof(char *)); |
318 | if (ret->h_addr_list == NULL) | 315 | if (ret->h_addr_list == NULL) |
319 | goto err; | 316 | goto err; |
320 | memset(ret->h_addr_list, 0, i*sizeof(char *)); | 317 | memset(ret->h_addr_list, 0, i*sizeof(char *)); |
321 | 318 | ||
322 | j=strlen(a->h_name)+1; | 319 | j = strlen(a->h_name) + 1; |
323 | if ((ret->h_name=OPENSSL_malloc(j)) == NULL) goto err; | 320 | if ((ret->h_name = OPENSSL_malloc(j)) == NULL) goto err; |
324 | memcpy((char *)ret->h_name,a->h_name,j); | 321 | memcpy((char *)ret->h_name, a->h_name, j); |
325 | for (i=0; a->h_aliases[i] != NULL; i++) | 322 | for (i = 0; a->h_aliases[i] != NULL; i++) { |
326 | { | 323 | j = strlen(a->h_aliases[i]) + 1; |
327 | j=strlen(a->h_aliases[i])+1; | 324 | if ((ret->h_aliases[i] = OPENSSL_malloc(j)) == NULL) goto err; |
328 | if ((ret->h_aliases[i]=OPENSSL_malloc(j)) == NULL) goto err; | 325 | memcpy(ret->h_aliases[i], a->h_aliases[i], j); |
329 | memcpy(ret->h_aliases[i],a->h_aliases[i],j); | 326 | } |
330 | } | 327 | ret->h_length = a->h_length; |
331 | ret->h_length=a->h_length; | 328 | ret->h_addrtype = a->h_addrtype; |
332 | ret->h_addrtype=a->h_addrtype; | 329 | for (i = 0; a->h_addr_list[i] != NULL; i++) { |
333 | for (i=0; a->h_addr_list[i] != NULL; i++) | 330 | if ((ret->h_addr_list[i] = OPENSSL_malloc(a->h_length)) == NULL) |
334 | { | ||
335 | if ((ret->h_addr_list[i]=OPENSSL_malloc(a->h_length)) == NULL) | ||
336 | goto err; | 331 | goto err; |
337 | memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length); | 332 | memcpy(ret->h_addr_list[i], a->h_addr_list[i], a->h_length); |
338 | } | 333 | } |
339 | if (0) | 334 | if (0) { |
340 | { | 335 | err: |
341 | err: | ||
342 | if (ret != NULL) | 336 | if (ret != NULL) |
343 | ghbn_free(ret); | 337 | ghbn_free(ret); |
344 | ret=NULL; | 338 | ret = NULL; |
345 | } | ||
346 | MemCheck_on(); | ||
347 | return(ret); | ||
348 | } | 339 | } |
340 | MemCheck_on(); | ||
341 | return (ret); | ||
342 | } | ||
349 | 343 | ||
350 | static void ghbn_free(struct hostent *a) | 344 | static void |
351 | { | 345 | ghbn_free(struct hostent *a) |
346 | { | ||
352 | int i; | 347 | int i; |
353 | 348 | ||
354 | if(a == NULL) | 349 | if (a == NULL) |
355 | return; | 350 | return; |
356 | 351 | ||
357 | if (a->h_aliases != NULL) | 352 | if (a->h_aliases != NULL) { |
358 | { | 353 | for (i = 0; a->h_aliases[i] != NULL; i++) |
359 | for (i=0; a->h_aliases[i] != NULL; i++) | ||
360 | OPENSSL_free(a->h_aliases[i]); | 354 | OPENSSL_free(a->h_aliases[i]); |
361 | OPENSSL_free(a->h_aliases); | 355 | OPENSSL_free(a->h_aliases); |
362 | } | 356 | } |
363 | if (a->h_addr_list != NULL) | 357 | if (a->h_addr_list != NULL) { |
364 | { | 358 | for (i = 0; a->h_addr_list[i] != NULL; i++) |
365 | for (i=0; a->h_addr_list[i] != NULL; i++) | ||
366 | OPENSSL_free(a->h_addr_list[i]); | 359 | OPENSSL_free(a->h_addr_list[i]); |
367 | OPENSSL_free(a->h_addr_list); | 360 | OPENSSL_free(a->h_addr_list); |
368 | } | ||
369 | if (a->h_name != NULL) OPENSSL_free(a->h_name); | ||
370 | OPENSSL_free(a); | ||
371 | } | 361 | } |
362 | if (a->h_name != NULL) | ||
363 | OPENSSL_free(a->h_name); | ||
364 | OPENSSL_free(a); | ||
365 | } | ||
372 | 366 | ||
373 | #endif | 367 | #endif |
374 | 368 | ||
375 | struct hostent *BIO_gethostbyname(const char *name) | 369 | struct hostent |
376 | { | 370 | *BIO_gethostbyname(const char *name) { |
377 | #if 1 | 371 | #if 1 |
378 | /* Caching gethostbyname() results forever is wrong, | 372 | /* Caching gethostbyname() results forever is wrong, |
379 | * so we have to let the true gethostbyname() worry about this */ | 373 | * so we have to let the true gethostbyname() worry about this */ |
@@ -384,8 +378,8 @@ struct hostent *BIO_gethostbyname(const char *name) | |||
384 | #endif | 378 | #endif |
385 | #else | 379 | #else |
386 | struct hostent *ret; | 380 | struct hostent *ret; |
387 | int i,lowi=0,j; | 381 | int i, lowi = 0, j; |
388 | unsigned long low= (unsigned long)-1; | 382 | unsigned long low = (unsigned long) - 1; |
389 | 383 | ||
390 | 384 | ||
391 | # if 0 | 385 | # if 0 |
@@ -395,42 +389,37 @@ struct hostent *BIO_gethostbyname(const char *name) | |||
395 | */ | 389 | */ |
396 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); | 390 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); |
397 | # endif | 391 | # endif |
398 | j=strlen(name); | 392 | j = strlen(name); |
399 | if (j < 128) | 393 | if (j < 128) { |
400 | { | 394 | for (i = 0; i < GHBN_NUM; i++) { |
401 | for (i=0; i<GHBN_NUM; i++) | 395 | if (low > ghbn_cache[i].order) { |
402 | { | 396 | low = ghbn_cache[i].order; |
403 | if (low > ghbn_cache[i].order) | 397 | lowi = i; |
404 | { | 398 | } |
405 | low=ghbn_cache[i].order; | 399 | if (ghbn_cache[i].order > 0) { |
406 | lowi=i; | 400 | if (strncmp(name, ghbn_cache[i].name, 128) == 0) |
407 | } | ||
408 | if (ghbn_cache[i].order > 0) | ||
409 | { | ||
410 | if (strncmp(name,ghbn_cache[i].name,128) == 0) | ||
411 | break; | 401 | break; |
412 | } | ||
413 | } | 402 | } |
414 | } | 403 | } |
415 | else | 404 | } else |
416 | i=GHBN_NUM; | 405 | i = GHBN_NUM; |
417 | 406 | ||
418 | if (i == GHBN_NUM) /* no hit*/ | 407 | if (i == GHBN_NUM) /* no hit*/ |
419 | { | 408 | { |
420 | BIO_ghbn_miss++; | 409 | BIO_ghbn_miss++; |
421 | /* Note: under VMS with SOCKETSHR, it seems like the first | 410 | /* Note: under VMS with SOCKETSHR, it seems like the first |
422 | * parameter is 'char *', instead of 'const char *' | 411 | * parameter is 'char *', instead of 'const char *' |
423 | */ | 412 | */ |
424 | # ifndef CONST_STRICT | 413 | # ifndef CONST_STRICT |
425 | ret=gethostbyname((char *)name); | 414 | ret = gethostbyname((char *)name); |
426 | # else | 415 | # else |
427 | ret=gethostbyname(name); | 416 | ret = gethostbyname(name); |
428 | # endif | 417 | # endif |
429 | 418 | ||
430 | if (ret == NULL) | 419 | if (ret == NULL) |
431 | goto end; | 420 | goto end; |
432 | if (j > 128) /* too big to cache */ | 421 | if (j > 128) /* too big to cache */ |
433 | { | 422 | { |
434 | # if 0 | 423 | # if 0 |
435 | /* If we were trying to make this function thread-safe (which | 424 | /* If we were trying to make this function thread-safe (which |
436 | * is bound to fail), we'd have to give up in this case | 425 | * is bound to fail), we'd have to give up in this case |
@@ -438,118 +427,113 @@ struct hostent *BIO_gethostbyname(const char *name) | |||
438 | ret = NULL; | 427 | ret = NULL; |
439 | # endif | 428 | # endif |
440 | goto end; | 429 | goto end; |
441 | } | 430 | } |
442 | 431 | ||
443 | /* else add to cache */ | 432 | /* else add to cache */ |
444 | if (ghbn_cache[lowi].ent != NULL) | 433 | if (ghbn_cache[lowi].ent != NULL) |
445 | ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */ | 434 | ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */ |
446 | ghbn_cache[lowi].name[0] = '\0'; | 435 | ghbn_cache[lowi].name[0] = '\0'; |
447 | 436 | ||
448 | if((ret=ghbn_cache[lowi].ent=ghbn_dup(ret)) == NULL) | 437 | if ((ret = ghbn_cache[lowi].ent = ghbn_dup(ret)) == NULL) { |
449 | { | 438 | BIOerr(BIO_F_BIO_GETHOSTBYNAME, ERR_R_MALLOC_FAILURE); |
450 | BIOerr(BIO_F_BIO_GETHOSTBYNAME,ERR_R_MALLOC_FAILURE); | ||
451 | goto end; | 439 | goto end; |
452 | } | ||
453 | strncpy(ghbn_cache[lowi].name,name,128); | ||
454 | ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits; | ||
455 | } | 440 | } |
456 | else | 441 | strncpy(ghbn_cache[lowi].name, name, 128); |
457 | { | 442 | ghbn_cache[lowi].order = BIO_ghbn_miss + BIO_ghbn_hits; |
443 | } else { | ||
458 | BIO_ghbn_hits++; | 444 | BIO_ghbn_hits++; |
459 | ret= ghbn_cache[i].ent; | 445 | ret = ghbn_cache[i].ent; |
460 | ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits; | 446 | ghbn_cache[i].order = BIO_ghbn_miss + BIO_ghbn_hits; |
461 | } | 447 | } |
462 | end: | 448 | end: |
463 | # if 0 | 449 | # if 0 |
464 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); | 450 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); |
465 | # endif | 451 | # endif |
466 | return(ret); | 452 | return (ret); |
467 | #endif | 453 | #endif |
468 | } | 454 | } |
469 | 455 | ||
470 | 456 | ||
471 | int BIO_sock_init(void) | 457 | int |
472 | { | 458 | BIO_sock_init(void) |
459 | { | ||
473 | #ifdef OPENSSL_SYS_WINDOWS | 460 | #ifdef OPENSSL_SYS_WINDOWS |
474 | static struct WSAData wsa_state; | 461 | static struct WSAData wsa_state; |
475 | 462 | ||
476 | if (!wsa_init_done) | 463 | if (!wsa_init_done) { |
477 | { | ||
478 | int err; | 464 | int err; |
479 | 465 | ||
480 | wsa_init_done=1; | 466 | wsa_init_done = 1; |
481 | memset(&wsa_state,0,sizeof(wsa_state)); | 467 | memset(&wsa_state, 0, sizeof(wsa_state)); |
482 | /* Not making wsa_state available to the rest of the | 468 | /* Not making wsa_state available to the rest of the |
483 | * code is formally wrong. But the structures we use | 469 | * code is formally wrong. But the structures we use |
484 | * are [beleived to be] invariable among Winsock DLLs, | 470 | * are [beleived to be] invariable among Winsock DLLs, |
485 | * while API availability is [expected to be] probed | 471 | * while API availability is [expected to be] probed |
486 | * at run-time with DSO_global_lookup. */ | 472 | * at run-time with DSO_global_lookup. */ |
487 | if (WSAStartup(0x0202,&wsa_state)!=0) | 473 | if (WSAStartup(0x0202, &wsa_state) != 0) { |
488 | { | 474 | err = WSAGetLastError(); |
489 | err=WSAGetLastError(); | 475 | SYSerr(SYS_F_WSASTARTUP, err); |
490 | SYSerr(SYS_F_WSASTARTUP,err); | 476 | BIOerr(BIO_F_BIO_SOCK_INIT, BIO_R_WSASTARTUP); |
491 | BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP); | 477 | return (-1); |
492 | return(-1); | ||
493 | } | ||
494 | } | 478 | } |
479 | } | ||
495 | #endif /* OPENSSL_SYS_WINDOWS */ | 480 | #endif /* OPENSSL_SYS_WINDOWS */ |
496 | #ifdef WATT32 | 481 | #ifdef WATT32 |
497 | extern int _watt_do_exit; | 482 | extern int _watt_do_exit; |
498 | _watt_do_exit = 0; /* don't make sock_init() call exit() */ | 483 | _watt_do_exit = 0; |
484 | /* don't make sock_init() call exit() */ | ||
499 | if (sock_init()) | 485 | if (sock_init()) |
500 | return (-1); | 486 | return (-1); |
501 | #endif | 487 | #endif |
502 | 488 | ||
503 | #if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) | 489 | #if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) |
504 | WORD wVerReq; | 490 | WORD wVerReq; |
505 | WSADATA wsaData; | 491 | WSADATA wsaData; |
506 | int err; | 492 | int err; |
507 | 493 | ||
508 | if (!wsa_init_done) | 494 | if (!wsa_init_done) { |
509 | { | 495 | wsa_init_done = 1; |
510 | wsa_init_done=1; | 496 | wVerReq = MAKEWORD( 2, 0 ); |
511 | wVerReq = MAKEWORD( 2, 0 ); | 497 | err = WSAStartup(wVerReq, &wsaData); |
512 | err = WSAStartup(wVerReq,&wsaData); | 498 | if (err != 0) { |
513 | if (err != 0) | 499 | SYSerr(SYS_F_WSASTARTUP, err); |
514 | { | 500 | BIOerr(BIO_F_BIO_SOCK_INIT, BIO_R_WSASTARTUP); |
515 | SYSerr(SYS_F_WSASTARTUP,err); | 501 | return (-1); |
516 | BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP); | ||
517 | return(-1); | ||
518 | } | ||
519 | } | 502 | } |
503 | } | ||
520 | #endif | 504 | #endif |
521 | 505 | ||
522 | return(1); | 506 | return (1); |
523 | } | 507 | } |
524 | 508 | ||
525 | void BIO_sock_cleanup(void) | 509 | void |
526 | { | 510 | BIO_sock_cleanup(void) |
511 | { | ||
527 | #ifdef OPENSSL_SYS_WINDOWS | 512 | #ifdef OPENSSL_SYS_WINDOWS |
528 | if (wsa_init_done) | 513 | if (wsa_init_done) { |
529 | { | 514 | wsa_init_done = 0; |
530 | wsa_init_done=0; | ||
531 | #if 0 /* this call is claimed to be non-present in Winsock2 */ | 515 | #if 0 /* this call is claimed to be non-present in Winsock2 */ |
532 | WSACancelBlockingCall(); | 516 | WSACancelBlockingCall(); |
533 | #endif | 517 | #endif |
534 | WSACleanup(); | 518 | WSACleanup(); |
535 | } | 519 | } |
536 | #elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) | 520 | #elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) |
537 | if (wsa_init_done) | 521 | if (wsa_init_done) { |
538 | { | 522 | wsa_init_done = 0; |
539 | wsa_init_done=0; | 523 | WSACleanup(); |
540 | WSACleanup(); | ||
541 | } | ||
542 | #endif | ||
543 | } | 524 | } |
525 | #endif | ||
526 | } | ||
544 | 527 | ||
545 | #if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000 | 528 | #if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000 |
546 | 529 | ||
547 | int BIO_socket_ioctl(int fd, long type, void *arg) | 530 | int |
548 | { | 531 | BIO_socket_ioctl(int fd, long type, void *arg) |
532 | { | ||
549 | int i; | 533 | int i; |
550 | 534 | ||
551 | #ifdef __DJGPP__ | 535 | #ifdef __DJGPP__ |
552 | i=ioctl(fd,type,(char *)arg); | 536 | i = ioctl(fd, type,(char *)arg); |
553 | #else | 537 | #else |
554 | # if defined(OPENSSL_SYS_VMS) | 538 | # if defined(OPENSSL_SYS_VMS) |
555 | /* 2011-02-18 SMS. | 539 | /* 2011-02-18 SMS. |
@@ -574,402 +558,399 @@ int BIO_socket_ioctl(int fd, long type, void *arg) | |||
574 | # define ARG arg | 558 | # define ARG arg |
575 | # endif /* defined(OPENSSL_SYS_VMS) [else] */ | 559 | # endif /* defined(OPENSSL_SYS_VMS) [else] */ |
576 | 560 | ||
577 | i=ioctl(fd,type,ARG); | 561 | i = ioctl(fd, type, ARG); |
578 | #endif /* __DJGPP__ */ | 562 | #endif /* __DJGPP__ */ |
579 | if (i < 0) | 563 | if (i < 0) |
580 | SYSerr(SYS_F_IOCTLSOCKET,errno); | 564 | SYSerr(SYS_F_IOCTLSOCKET, errno); |
581 | return(i); | 565 | return (i); |
582 | } | 566 | } |
583 | #endif /* __VMS_VER */ | 567 | #endif /* __VMS_VER */ |
584 | 568 | ||
585 | /* The reason I have implemented this instead of using sscanf is because | 569 | /* The reason I have implemented this instead of using sscanf is because |
586 | * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ | 570 | * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ |
587 | static int get_ip(const char *str, unsigned char ip[4]) | 571 | static int |
588 | { | 572 | get_ip(const char *str, unsigned char ip[4]) |
573 | { | ||
589 | unsigned int tmp[4]; | 574 | unsigned int tmp[4]; |
590 | int num=0,c,ok=0; | 575 | int num = 0, c, ok = 0; |
591 | 576 | ||
592 | tmp[0]=tmp[1]=tmp[2]=tmp[3]=0; | 577 | tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0; |
593 | 578 | ||
594 | for (;;) | 579 | for (;;) { |
595 | { | ||
596 | c= *(str++); | 580 | c= *(str++); |
597 | if ((c >= '0') && (c <= '9')) | 581 | if ((c >= '0') && (c <= '9')) { |
598 | { | 582 | ok = 1; |
599 | ok=1; | 583 | tmp[num] = tmp[num]*10 + c-'0'; |
600 | tmp[num]=tmp[num]*10+c-'0'; | 584 | if (tmp[num] > 255) |
601 | if (tmp[num] > 255) return(0); | 585 | return (0); |
602 | } | 586 | } else if (c == '.') { |
603 | else if (c == '.') | 587 | if (!ok) |
604 | { | 588 | return (-1); |
605 | if (!ok) return(-1); | 589 | if (num == 3) |
606 | if (num == 3) return(0); | 590 | return (0); |
607 | num++; | 591 | num++; |
608 | ok=0; | 592 | ok = 0; |
609 | } | 593 | } else if (c == '\0' && (num == 3) && ok) |
610 | else if (c == '\0' && (num == 3) && ok) | 594 | break; |
611 | break; | ||
612 | else | 595 | else |
613 | return(0); | 596 | return (0); |
614 | } | ||
615 | ip[0]=tmp[0]; | ||
616 | ip[1]=tmp[1]; | ||
617 | ip[2]=tmp[2]; | ||
618 | ip[3]=tmp[3]; | ||
619 | return(1); | ||
620 | } | 597 | } |
621 | 598 | ip[0] = tmp[0]; | |
622 | int BIO_get_accept_socket(char *host, int bind_mode) | 599 | ip[1] = tmp[1]; |
623 | { | 600 | ip[2] = tmp[2]; |
624 | int ret=0; | 601 | ip[3] = tmp[3]; |
602 | return (1); | ||
603 | } | ||
604 | |||
605 | int | ||
606 | BIO_get_accept_socket(char *host, int bind_mode) | ||
607 | { | ||
608 | int ret = 0; | ||
625 | union { | 609 | union { |
626 | struct sockaddr sa; | 610 | struct sockaddr sa; |
627 | struct sockaddr_in sa_in; | 611 | struct sockaddr_in sa_in; |
628 | #if OPENSSL_USE_IPV6 | 612 | #if OPENSSL_USE_IPV6 |
629 | struct sockaddr_in6 sa_in6; | 613 | struct sockaddr_in6 sa_in6; |
630 | #endif | 614 | #endif |
631 | } server,client; | 615 | } server, client; |
632 | int s=-1,cs,addrlen; | 616 | int s = -1, cs, addrlen; |
633 | unsigned char ip[4]; | 617 | unsigned char ip[4]; |
634 | unsigned short port; | 618 | unsigned short port; |
635 | char *str=NULL,*e; | 619 | char *str = NULL, *e; |
636 | char *h,*p; | 620 | char *h, *p; |
637 | unsigned long l; | 621 | unsigned long l; |
638 | int err_num; | 622 | int err_num; |
639 | 623 | ||
640 | if (BIO_sock_init() != 1) return(-1); | 624 | if (BIO_sock_init() != 1) |
625 | return (-1); | ||
641 | 626 | ||
642 | if ((str=BUF_strdup(host)) == NULL) return(-1); | 627 | if ((str = BUF_strdup(host)) == NULL) |
628 | return (-1); | ||
643 | 629 | ||
644 | h=p=NULL; | 630 | h = p = NULL; |
645 | h=str; | 631 | h = str; |
646 | for (e=str; *e; e++) | 632 | for (e = str; *e; e++) { |
647 | { | 633 | if (*e == ':') { |
648 | if (*e == ':') | 634 | p = e; |
649 | { | 635 | } else if (*e == '/') { |
650 | p=e; | 636 | *e = '\0'; |
651 | } | ||
652 | else if (*e == '/') | ||
653 | { | ||
654 | *e='\0'; | ||
655 | break; | 637 | break; |
656 | } | ||
657 | } | 638 | } |
658 | if (p) *p++='\0'; /* points at last ':', '::port' is special [see below] */ | 639 | } |
659 | else p=h,h=NULL; | 640 | if (p) |
641 | *p++='\0'; /* points at last ':', '::port' is special [see below] */ | ||
642 | else | ||
643 | p = h, h = NULL; | ||
660 | 644 | ||
661 | #ifdef EAI_FAMILY | 645 | #ifdef EAI_FAMILY |
662 | do { | 646 | do { |
663 | static union { void *p; | 647 | static union { |
664 | int (WSAAPI *f)(const char *,const char *, | 648 | void *p; |
665 | const struct addrinfo *, | 649 | int (WSAAPI *f)(const char *, const char *, |
666 | struct addrinfo **); | 650 | const struct addrinfo *, |
667 | } p_getaddrinfo = {NULL}; | 651 | struct addrinfo **); |
668 | static union { void *p; | 652 | } p_getaddrinfo = {NULL}; |
653 | static union { | ||
654 | void *p; | ||
669 | void (WSAAPI *f)(struct addrinfo *); | 655 | void (WSAAPI *f)(struct addrinfo *); |
670 | } p_freeaddrinfo = {NULL}; | 656 | } p_freeaddrinfo = {NULL}; |
671 | struct addrinfo *res,hint; | 657 | struct addrinfo *res, hint; |
672 | 658 | ||
673 | if (p_getaddrinfo.p==NULL) | 659 | if (p_getaddrinfo.p == NULL) { |
674 | { | 660 | if ((p_getaddrinfo.p = DSO_global_lookup("getaddrinfo"))==NULL || |
675 | if ((p_getaddrinfo.p=DSO_global_lookup("getaddrinfo"))==NULL || | 661 | (p_freeaddrinfo.p = DSO_global_lookup("freeaddrinfo"))==NULL) |
676 | (p_freeaddrinfo.p=DSO_global_lookup("freeaddrinfo"))==NULL) | 662 | p_getaddrinfo.p = (void*) - 1; |
677 | p_getaddrinfo.p=(void*)-1; | 663 | } |
678 | } | 664 | if (p_getaddrinfo.p == (void *) - 1) break; |
679 | if (p_getaddrinfo.p==(void *)-1) break; | 665 | |
680 | 666 | /* '::port' enforces IPv6 wildcard listener. Some OSes, | |
681 | /* '::port' enforces IPv6 wildcard listener. Some OSes, | 667 | * e.g. Solaris, default to IPv6 without any hint. Also |
682 | * e.g. Solaris, default to IPv6 without any hint. Also | 668 | * note that commonly IPv6 wildchard socket can service |
683 | * note that commonly IPv6 wildchard socket can service | 669 | * IPv4 connections just as well... */ |
684 | * IPv4 connections just as well... */ | 670 | memset(&hint, 0, sizeof(hint)); |
685 | memset(&hint,0,sizeof(hint)); | 671 | hint.ai_flags = AI_PASSIVE; |
686 | hint.ai_flags = AI_PASSIVE; | 672 | if (h) { |
687 | if (h) | 673 | if (strchr(h, ':')) { |
688 | { | 674 | if (h[1] == '\0') |
689 | if (strchr(h,':')) | 675 | h = NULL; |
690 | { | ||
691 | if (h[1]=='\0') h=NULL; | ||
692 | #if OPENSSL_USE_IPV6 | 676 | #if OPENSSL_USE_IPV6 |
693 | hint.ai_family = AF_INET6; | 677 | hint.ai_family = AF_INET6; |
694 | #else | 678 | #else |
695 | h=NULL; | 679 | h = NULL; |
696 | #endif | 680 | #endif |
697 | } | 681 | } else if (h[0] == '*' && h[1] == '\0') { |
698 | else if (h[0]=='*' && h[1]=='\0') | 682 | hint.ai_family = AF_INET; |
699 | { | 683 | h = NULL; |
700 | hint.ai_family = AF_INET; | ||
701 | h=NULL; | ||
702 | } | 684 | } |
703 | } | 685 | } |
704 | 686 | ||
705 | if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break; | 687 | if ((*p_getaddrinfo.f)(h, p, &hint, &res)) |
688 | break; | ||
706 | 689 | ||
707 | addrlen = res->ai_addrlen<=sizeof(server) ? | 690 | addrlen = res->ai_addrlen <= sizeof(server) ? |
708 | res->ai_addrlen : | 691 | res->ai_addrlen : sizeof(server); |
709 | sizeof(server); | 692 | memcpy(&server, res->ai_addr, addrlen); |
710 | memcpy(&server, res->ai_addr, addrlen); | ||
711 | 693 | ||
712 | (*p_freeaddrinfo.f)(res); | 694 | (*p_freeaddrinfo.f)(res); |
713 | goto again; | 695 | goto again; |
714 | } while (0); | 696 | } while (0); |
715 | #endif | 697 | #endif |
716 | 698 | ||
717 | if (!BIO_get_port(p,&port)) goto err; | 699 | if (!BIO_get_port(p, &port)) |
700 | goto err; | ||
718 | 701 | ||
719 | memset((char *)&server,0,sizeof(server)); | 702 | memset((char *)&server, 0, sizeof(server)); |
720 | server.sa_in.sin_family=AF_INET; | 703 | server.sa_in.sin_family = AF_INET; |
721 | server.sa_in.sin_port=htons(port); | 704 | server.sa_in.sin_port = htons(port); |
722 | addrlen = sizeof(server.sa_in); | 705 | addrlen = sizeof(server.sa_in); |
723 | 706 | ||
724 | if (h == NULL || strcmp(h,"*") == 0) | 707 | if (h == NULL || strcmp(h, "*") == 0) |
725 | server.sa_in.sin_addr.s_addr=INADDR_ANY; | 708 | server.sa_in.sin_addr.s_addr = INADDR_ANY; |
726 | else | 709 | else { |
727 | { | 710 | if (!BIO_get_host_ip(h, &(ip[0]))) |
728 | if (!BIO_get_host_ip(h,&(ip[0]))) goto err; | 711 | goto err; |
729 | l=(unsigned long) | 712 | l = (unsigned long) |
730 | ((unsigned long)ip[0]<<24L)| | 713 | ((unsigned long)ip[0]<<24L)| |
731 | ((unsigned long)ip[1]<<16L)| | 714 | ((unsigned long)ip[1]<<16L)| |
732 | ((unsigned long)ip[2]<< 8L)| | 715 | ((unsigned long)ip[2]<< 8L)| |
733 | ((unsigned long)ip[3]); | 716 | ((unsigned long)ip[3]); |
734 | server.sa_in.sin_addr.s_addr=htonl(l); | 717 | server.sa_in.sin_addr.s_addr = htonl(l); |
735 | } | 718 | } |
736 | 719 | ||
737 | again: | 720 | again: |
738 | s=socket(server.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL); | 721 | s = socket(server.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL); |
739 | if (s == -1) | 722 | if (s == -1) { |
740 | { | 723 | SYSerr(SYS_F_SOCKET, errno); |
741 | SYSerr(SYS_F_SOCKET,errno); | 724 | ERR_add_error_data(3, "port = '", host, "'"); |
742 | ERR_add_error_data(3,"port='",host,"'"); | 725 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_CREATE_SOCKET); |
743 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET); | ||
744 | goto err; | 726 | goto err; |
745 | } | 727 | } |
746 | 728 | ||
747 | #ifdef SO_REUSEADDR | 729 | #ifdef SO_REUSEADDR |
748 | if (bind_mode == BIO_BIND_REUSEADDR) | 730 | if (bind_mode == BIO_BIND_REUSEADDR) { |
749 | { | 731 | int i = 1; |
750 | int i=1; | ||
751 | 732 | ||
752 | ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i)); | 733 | ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR,(char *)&i, sizeof(i)); |
753 | bind_mode=BIO_BIND_NORMAL; | 734 | bind_mode = BIO_BIND_NORMAL; |
754 | } | 735 | } |
755 | #endif | 736 | #endif |
756 | if (bind(s,&server.sa,addrlen) == -1) | 737 | if (bind(s, &server.sa, addrlen) == -1) { |
757 | { | ||
758 | #ifdef SO_REUSEADDR | 738 | #ifdef SO_REUSEADDR |
759 | err_num=errno; | 739 | err_num = errno; |
760 | if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) && | 740 | if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) && |
761 | #ifdef OPENSSL_SYS_WINDOWS | 741 | #ifdef OPENSSL_SYS_WINDOWS |
762 | /* Some versions of Windows define EADDRINUSE to | 742 | /* Some versions of Windows define EADDRINUSE to |
763 | * a dummy value. | 743 | * a dummy value. |
764 | */ | 744 | */ |
765 | (err_num == WSAEADDRINUSE)) | 745 | (err_num == WSAEADDRINUSE)) |
766 | #else | 746 | #else |
767 | (err_num == EADDRINUSE)) | 747 | (err_num == EADDRINUSE)) |
768 | #endif | 748 | #endif |
769 | { | 749 | { |
770 | client = server; | 750 | client = server; |
771 | if (h == NULL || strcmp(h,"*") == 0) | 751 | if (h == NULL || strcmp(h, "*") == 0) { |
772 | { | ||
773 | #if OPENSSL_USE_IPV6 | 752 | #if OPENSSL_USE_IPV6 |
774 | if (client.sa.sa_family == AF_INET6) | 753 | if (client.sa.sa_family == AF_INET6) { |
775 | { | 754 | memset(&client.sa_in6.sin6_addr, 0, sizeof(client.sa_in6.sin6_addr)); |
776 | memset(&client.sa_in6.sin6_addr,0,sizeof(client.sa_in6.sin6_addr)); | 755 | client.sa_in6.sin6_addr.s6_addr[15] = 1; |
777 | client.sa_in6.sin6_addr.s6_addr[15]=1; | 756 | } else |
778 | } | 757 | #endif |
779 | else | 758 | if (client.sa.sa_family == AF_INET) { |
780 | #endif | 759 | client.sa_in.sin_addr.s_addr = htonl(0x7F000001); |
781 | if (client.sa.sa_family == AF_INET) | 760 | } else |
782 | { | 761 | goto err; |
783 | client.sa_in.sin_addr.s_addr=htonl(0x7F000001); | 762 | } |
784 | } | 763 | cs = socket(client.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL); |
785 | else goto err; | 764 | if (cs != -1) { |
786 | } | ||
787 | cs=socket(client.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL); | ||
788 | if (cs != -1) | ||
789 | { | ||
790 | int ii; | 765 | int ii; |
791 | ii=connect(cs,&client.sa,addrlen); | 766 | ii = connect(cs, &client.sa, addrlen); |
792 | close(cs); | 767 | close(cs); |
793 | if (ii == -1) | 768 | if (ii == -1) { |
794 | { | 769 | bind_mode = BIO_BIND_REUSEADDR; |
795 | bind_mode=BIO_BIND_REUSEADDR; | ||
796 | close(s); | 770 | close(s); |
797 | goto again; | 771 | goto again; |
798 | } | ||
799 | /* else error */ | ||
800 | } | 772 | } |
801 | /* else error */ | 773 | /* else error */ |
802 | } | 774 | } |
775 | /* else error */ | ||
776 | } | ||
803 | #endif | 777 | #endif |
804 | SYSerr(SYS_F_BIND,err_num); | 778 | SYSerr(SYS_F_BIND, err_num); |
805 | ERR_add_error_data(3,"port='",host,"'"); | 779 | ERR_add_error_data(3, "port = '", host, "'"); |
806 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET); | 780 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_BIND_SOCKET); |
807 | goto err; | 781 | goto err; |
808 | } | 782 | } |
809 | if (listen(s,MAX_LISTEN) == -1) | 783 | if (listen(s, MAX_LISTEN) == -1) { |
810 | { | 784 | SYSerr(SYS_F_BIND, errno); |
811 | SYSerr(SYS_F_BIND,errno); | 785 | ERR_add_error_data(3, "port = '", host, "'"); |
812 | ERR_add_error_data(3,"port='",host,"'"); | 786 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_LISTEN_SOCKET); |
813 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_LISTEN_SOCKET); | ||
814 | goto err; | 787 | goto err; |
815 | } | 788 | } |
816 | ret=1; | 789 | ret = 1; |
817 | err: | 790 | err: |
818 | if (str != NULL) OPENSSL_free(str); | 791 | if (str != NULL) |
819 | if ((ret == 0) && (s != -1)) | 792 | OPENSSL_free(str); |
820 | { | 793 | if ((ret == 0) && (s != -1)) { |
821 | close(s); | 794 | close(s); |
822 | s= -1; | 795 | s = -1; |
823 | } | ||
824 | return(s); | ||
825 | } | 796 | } |
797 | return (s); | ||
798 | } | ||
826 | 799 | ||
827 | int BIO_accept(int sock, char **addr) | 800 | int |
828 | { | 801 | BIO_accept(int sock, char **addr) |
829 | int ret=-1; | 802 | { |
803 | int ret = -1; | ||
830 | unsigned long l; | 804 | unsigned long l; |
831 | unsigned short port; | 805 | unsigned short port; |
832 | char *p; | 806 | char *p; |
833 | 807 | ||
834 | struct { | 808 | struct { |
835 | /* | 809 | /* |
836 | * As for following union. Trouble is that there are platforms | 810 | * As for following union. Trouble is that there are platforms |
837 | * that have socklen_t and there are platforms that don't, on | 811 | * that have socklen_t and there are platforms that don't, on |
838 | * some platforms socklen_t is int and on some size_t. So what | 812 | * some platforms socklen_t is int and on some size_t. So what |
839 | * one can do? One can cook #ifdef spaghetti, which is nothing | 813 | * one can do? One can cook #ifdef spaghetti, which is nothing |
840 | * but masochistic. Or one can do union between int and size_t. | 814 | * but masochistic. Or one can do union between int and size_t. |
841 | * One naturally does it primarily for 64-bit platforms where | 815 | * One naturally does it primarily for 64-bit platforms where |
842 | * sizeof(int) != sizeof(size_t). But would it work? Note that | 816 | * sizeof(int) != sizeof(size_t). But would it work? Note that |
843 | * if size_t member is initialized to 0, then later int member | 817 | * if size_t member is initialized to 0, then later int member |
844 | * assignment naturally does the job on little-endian platforms | 818 | * assignment naturally does the job on little-endian platforms |
845 | * regardless accept's expectations! What about big-endians? | 819 | * regardless accept's expectations! What about big-endians? |
846 | * If accept expects int*, then it works, and if size_t*, then | 820 | * If accept expects int*, then it works, and if size_t*, then |
847 | * length value would appear as unreasonably large. But this | 821 | * length value would appear as unreasonably large. But this |
848 | * won't prevent it from filling in the address structure. The | 822 | * won't prevent it from filling in the address structure. The |
849 | * trouble of course would be if accept returns more data than | 823 | * trouble of course would be if accept returns more data than |
850 | * actual buffer can accomodate and overwrite stack... That's | 824 | * actual buffer can accomodate and overwrite stack... That's |
851 | * where early OPENSSL_assert comes into picture. Besides, the | 825 | * where early OPENSSL_assert comes into picture. Besides, the |
852 | * only 64-bit big-endian platform found so far that expects | 826 | * only 64-bit big-endian platform found so far that expects |
853 | * size_t* is HP-UX, where stack grows towards higher address. | 827 | * size_t* is HP-UX, where stack grows towards higher address. |
854 | * <appro> | 828 | * <appro> |
855 | */ | 829 | */ |
856 | union { size_t s; int i; } len; | 830 | union { |
857 | union { | 831 | size_t s; |
858 | struct sockaddr sa; | 832 | int i; |
859 | struct sockaddr_in sa_in; | 833 | } len; |
834 | union { | ||
835 | struct sockaddr sa; | ||
836 | struct sockaddr_in sa_in; | ||
860 | #if OPENSSL_USE_IPV6 | 837 | #if OPENSSL_USE_IPV6 |
861 | struct sockaddr_in6 sa_in6; | 838 | struct sockaddr_in6 sa_in6; |
862 | #endif | 839 | #endif |
863 | } from; | 840 | } from; |
864 | } sa; | 841 | } sa; |
865 | 842 | ||
866 | sa.len.s=0; | 843 | sa.len.s = 0; |
867 | sa.len.i=sizeof(sa.from); | 844 | sa.len.i = sizeof(sa.from); |
868 | memset(&sa.from,0,sizeof(sa.from)); | 845 | memset(&sa.from, 0, sizeof(sa.from)); |
869 | ret=accept(sock,&sa.from.sa,(void *)&sa.len); | 846 | ret = accept(sock, &sa.from.sa,(void *)&sa.len); |
870 | if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0) | 847 | if (sizeof(sa.len.i) != sizeof(sa.len.s) && sa.len.i == 0) { |
871 | { | 848 | OPENSSL_assert(sa.len.s <= sizeof(sa.from)); |
872 | OPENSSL_assert(sa.len.s<=sizeof(sa.from)); | ||
873 | sa.len.i = (int)sa.len.s; | 849 | sa.len.i = (int)sa.len.s; |
874 | /* use sa.len.i from this point */ | 850 | /* use sa.len.i from this point */ |
875 | } | 851 | } |
876 | if (ret == -1) | 852 | if (ret == -1) { |
877 | { | 853 | if (BIO_sock_should_retry(ret)) return -2; |
878 | if(BIO_sock_should_retry(ret)) return -2; | 854 | SYSerr(SYS_F_ACCEPT, errno); |
879 | SYSerr(SYS_F_ACCEPT,errno); | 855 | BIOerr(BIO_F_BIO_ACCEPT, BIO_R_ACCEPT_ERROR); |
880 | BIOerr(BIO_F_BIO_ACCEPT,BIO_R_ACCEPT_ERROR); | ||
881 | goto end; | 856 | goto end; |
882 | } | 857 | } |
883 | 858 | ||
884 | if (addr == NULL) goto end; | 859 | if (addr == NULL) |
860 | goto end; | ||
885 | 861 | ||
886 | #ifdef EAI_FAMILY | 862 | #ifdef EAI_FAMILY |
887 | do { | 863 | do { |
888 | char h[NI_MAXHOST],s[NI_MAXSERV]; | 864 | char h[NI_MAXHOST], s[NI_MAXSERV]; |
889 | size_t nl; | 865 | size_t nl; |
890 | static union { void *p; | 866 | static union { |
891 | int (WSAAPI *f)(const struct sockaddr *,size_t/*socklen_t*/, | 867 | void *p; |
892 | char *,size_t,char *,size_t,int); | 868 | int (WSAAPI *f)(const struct sockaddr *, |
893 | } p_getnameinfo = {NULL}; | 869 | size_t/*socklen_t*/, char *, size_t, |
894 | /* 2nd argument to getnameinfo is specified to | 870 | char *, size_t, int); |
895 | * be socklen_t. Unfortunately there is a number | 871 | } p_getnameinfo = {NULL}; |
896 | * of environments where socklen_t is not defined. | 872 | /* 2nd argument to getnameinfo is specified to |
897 | * As it's passed by value, it's safe to pass it | 873 | * be socklen_t. Unfortunately there is a number |
898 | * as size_t... <appro> */ | 874 | * of environments where socklen_t is not defined. |
899 | 875 | * As it's passed by value, it's safe to pass it | |
900 | if (p_getnameinfo.p==NULL) | 876 | * as size_t... <appro> */ |
901 | { | 877 | |
902 | if ((p_getnameinfo.p=DSO_global_lookup("getnameinfo"))==NULL) | 878 | if (p_getnameinfo.p == NULL) { |
903 | p_getnameinfo.p=(void*)-1; | 879 | if ((p_getnameinfo.p = DSO_global_lookup("getnameinfo")) == NULL) |
880 | p_getnameinfo.p = (void*) - 1; | ||
881 | } | ||
882 | if (p_getnameinfo.p == (void *) - 1) | ||
883 | break; | ||
884 | |||
885 | if ((*p_getnameinfo.f)(&sa.from.sa, sa.len.i, h, sizeof(h), | ||
886 | s, sizeof(s), NI_NUMERICHOST|NI_NUMERICSERV)) | ||
887 | break; | ||
888 | nl = strlen(h) + strlen(s) + 2; | ||
889 | p = *addr; | ||
890 | if (p) { | ||
891 | *p = '\0'; | ||
892 | p = OPENSSL_realloc(p, nl); | ||
893 | } else { | ||
894 | p = OPENSSL_malloc(nl); | ||
895 | } | ||
896 | if (p == NULL) { | ||
897 | BIOerr(BIO_F_BIO_ACCEPT, ERR_R_MALLOC_FAILURE); | ||
898 | goto end; | ||
904 | } | 899 | } |
905 | if (p_getnameinfo.p==(void *)-1) break; | 900 | *addr = p; |
906 | 901 | (void) snprintf(*addr, nl, "%s:%s", h, s); | |
907 | if ((*p_getnameinfo.f)(&sa.from.sa,sa.len.i,h,sizeof(h),s,sizeof(s), | ||
908 | NI_NUMERICHOST|NI_NUMERICSERV)) break; | ||
909 | nl = strlen(h)+strlen(s)+2; | ||
910 | p = *addr; | ||
911 | if (p) { *p = '\0'; p = OPENSSL_realloc(p,nl); } | ||
912 | else { p = OPENSSL_malloc(nl); } | ||
913 | if (p==NULL) | ||
914 | { | ||
915 | BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE); | ||
916 | goto end; | 902 | goto end; |
917 | } | 903 | } while (0); |
918 | *addr = p; | 904 | #endif |
919 | (void) snprintf(*addr,nl,"%s:%s",h,s); | 905 | if (sa.from.sa.sa_family != AF_INET) |
920 | goto end; | 906 | goto end; |
921 | } while(0); | 907 | l = ntohl(sa.from.sa_in.sin_addr.s_addr); |
922 | #endif | 908 | port = ntohs(sa.from.sa_in.sin_port); |
923 | if (sa.from.sa.sa_family != AF_INET) goto end; | 909 | if (*addr == NULL) { |
924 | l=ntohl(sa.from.sa_in.sin_addr.s_addr); | 910 | if ((p = OPENSSL_malloc(24)) == NULL) { |
925 | port=ntohs(sa.from.sa_in.sin_port); | 911 | BIOerr(BIO_F_BIO_ACCEPT, ERR_R_MALLOC_FAILURE); |
926 | if (*addr == NULL) | ||
927 | { | ||
928 | if ((p=OPENSSL_malloc(24)) == NULL) | ||
929 | { | ||
930 | BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE); | ||
931 | goto end; | 912 | goto end; |
932 | } | ||
933 | *addr=p; | ||
934 | } | 913 | } |
935 | (void) snprintf(*addr,24,"%d.%d.%d.%d:%d", | 914 | *addr = p; |
936 | (unsigned char)(l>>24L)&0xff, | ||
937 | (unsigned char)(l>>16L)&0xff, | ||
938 | (unsigned char)(l>> 8L)&0xff, | ||
939 | (unsigned char)(l )&0xff, | ||
940 | port); | ||
941 | end: | ||
942 | return(ret); | ||
943 | } | 915 | } |
916 | (void) snprintf(*addr, 24, "%d.%d.%d.%d:%d", | ||
917 | (unsigned char)(l >> 24L) & 0xff, (unsigned char)(l >> 16L) & 0xff, | ||
918 | (unsigned char)(l >> 8L) & 0xff, (unsigned char)(l) & 0xff, port); | ||
944 | 919 | ||
945 | int BIO_set_tcp_ndelay(int s, int on) | 920 | end: |
946 | { | 921 | return (ret); |
947 | int ret=0; | 922 | } |
923 | |||
924 | int | ||
925 | BIO_set_tcp_ndelay(int s, int on) | ||
926 | { | ||
927 | int ret = 0; | ||
948 | #if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP)) | 928 | #if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP)) |
949 | int opt; | 929 | int opt; |
950 | 930 | ||
951 | #ifdef SOL_TCP | 931 | #ifdef SOL_TCP |
952 | opt=SOL_TCP; | 932 | opt = SOL_TCP; |
953 | #else | 933 | #else |
954 | #ifdef IPPROTO_TCP | 934 | #ifdef IPPROTO_TCP |
955 | opt=IPPROTO_TCP; | 935 | opt = IPPROTO_TCP; |
956 | #endif | 936 | #endif |
957 | #endif | 937 | #endif |
958 | 938 | ||
959 | ret=setsockopt(s,opt,TCP_NODELAY,(char *)&on,sizeof(on)); | 939 | ret = setsockopt(s, opt, TCP_NODELAY,(char *)&on, sizeof(on)); |
960 | #endif | 940 | #endif |
961 | return(ret == 0); | 941 | return (ret == 0); |
962 | } | 942 | } |
963 | 943 | ||
964 | int BIO_socket_nbio(int s, int mode) | 944 | int |
965 | { | 945 | BIO_socket_nbio(int s, int mode) |
966 | int ret= -1; | 946 | { |
947 | int ret = -1; | ||
967 | int l; | 948 | int l; |
968 | 949 | ||
969 | l=mode; | 950 | l = mode; |
970 | #ifdef FIONBIO | 951 | #ifdef FIONBIO |
971 | ret=BIO_socket_ioctl(s,FIONBIO,&l); | 952 | ret = BIO_socket_ioctl(s, FIONBIO, &l); |
972 | #endif | 953 | #endif |
973 | return(ret == 0); | 954 | return (ret == 0); |
974 | } | 955 | } |
975 | #endif | 956 | #endif |