summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bio/b_sock.c
diff options
context:
space:
mode:
authorjsing <>2014-04-15 16:37:22 +0000
committerjsing <>2014-04-15 16:37:22 +0000
commitbb63ff2d125e51688213d0af9e4f785cf3865063 (patch)
tree41dd30d546977ed0c409d7de59564fa1a2e3b100 /src/lib/libcrypto/bio/b_sock.c
parent90b03b7785bece7b16c6a38b7db633fcfdd9ecf4 (diff)
downloadopenbsd-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.c1025
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))
88static int wsa_init_done=0; 88static 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
103static unsigned long BIO_ghbn_hits=0L; 103static unsigned long BIO_ghbn_hits = 0L;
104static unsigned long BIO_ghbn_miss=0L; 104static unsigned long BIO_ghbn_miss = 0L;
105 105
106#define GHBN_NUM 4 106#define GHBN_NUM 4
107static struct ghbn_cache_st 107static 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
115static int get_ip(const char *str,unsigned char *ip); 114static int get_ip(const char *str, unsigned char *ip);
116#if 0 115#if 0
117static void ghbn_free(struct hostent *a); 116static void ghbn_free(struct hostent *a);
118static struct hostent *ghbn_dup(struct hostent *a); 117static struct hostent *ghbn_dup(struct hostent *a);
119#endif 118#endif
120int BIO_get_host_ip(const char *str, unsigned char *ip) 119
121 { 120int
121BIO_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: 162err:
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
175int BIO_get_port(const char *str, unsigned short *port_ptr) 172int
176 { 173BIO_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
233int BIO_sock_error(int sock) 227int
234 { 228BIO_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
256long BIO_ghbn_ctrl(int cmd, int iarg, char *parg) 251long
257 { 252BIO_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
296static struct hostent *ghbn_dup(struct hostent *a) 291static 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 { 335err:
341err:
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
350static void ghbn_free(struct hostent *a) 344static void
351 { 345ghbn_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
375struct hostent *BIO_gethostbyname(const char *name) 369struct 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 }
462end: 448end:
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
471int BIO_sock_init(void) 457int
472 { 458BIO_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
525void BIO_sock_cleanup(void) 509void
526 { 510BIO_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
547int BIO_socket_ioctl(int fd, long type, void *arg) 530int
548 { 531BIO_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 :-( */
587static int get_ip(const char *str, unsigned char ip[4]) 571static int
588 { 572get_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];
622int 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
605int
606BIO_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
737again: 720again:
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;
817err: 790err:
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
827int BIO_accept(int sock, char **addr) 800int
828 { 801BIO_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);
941end:
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
945int BIO_set_tcp_ndelay(int s, int on) 920end:
946 { 921 return (ret);
947 int ret=0; 922}
923
924int
925BIO_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
964int BIO_socket_nbio(int s, int mode) 944int
965 { 945BIO_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