Mercurial > hg > nginx
comparison src/core/ngx_cycle.c @ 236:86e473b5641e
nginx-0.0.1-2004-01-22-09:47:28 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 22 Jan 2004 06:47:28 +0000 |
parents | 2ba3477070ac |
children | 8d5cce3ae221 |
comparison
equal
deleted
inserted
replaced
235:6bd5d25b6744 | 236:86e473b5641e |
---|---|
360 | 360 |
361 return cycle; | 361 return cycle; |
362 } | 362 } |
363 | 363 |
364 | 364 |
365 #if 0 | |
366 | |
367 | |
368 static ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle, char **envp) | |
369 { | |
370 char *p, *v; | |
371 ngx_socket_t s; | |
372 ngx_listening_t *ls; | |
373 struct sockaddr_in *addr_in; | |
374 | |
375 for ( /* void */ ; *envp; envp++) { | |
376 if (ngx_strncmp(*envp, NGINX_VAR, NGINX_VAR_LEN) != 0) { | |
377 continue; | |
378 } | |
379 | |
380 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, | |
381 "using inherited sockets from \"%s\"", *envp); | |
382 | |
383 ngx_init_array(cycle->listening, cycle->pool, | |
384 10, sizeof(ngx_listening_t), NGX_ERROR); | |
385 | |
386 for (p = *envp + NGINX_VAR_LEN, v = p; *p; p++) { | |
387 if (*p == ':' || *p == ';') { | |
388 s = ngx_atoi(v, p - v); | |
389 if (s == NGX_ERROR) { | |
390 ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, | |
391 "invalid socket number \"%s\" " | |
392 "in NGINX enviroment variable, " | |
393 "ignoring the rest of the variable", v); | |
394 break; | |
395 } | |
396 v = p + 1; | |
397 | |
398 if (!(ls = ngx_push_array(&cycle->listening))) { | |
399 return NGX_ERROR; | |
400 } | |
401 | |
402 ls->fd = s; | |
403 | |
404 /* AF_INET only */ | |
405 | |
406 ls->sockaddr = ngx_palloc(cycle->pool, | |
407 sizeof(struct sockaddr_in)); | |
408 if (ls->sockaddr == NULL) { | |
409 return NGX_ERROR; | |
410 } | |
411 | |
412 ls->socklen = sizeof(struct sockaddr_in); | |
413 if (getsockname(s, ls->sockaddr, &ls->socklen) == -1) { | |
414 ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno, | |
415 "getsockname() of the inherited " | |
416 "socket #%d failed", s); | |
417 ls->ignore = 1; | |
418 continue; | |
419 } | |
420 | |
421 addr_in = (struct sockaddr_in *) ls->sockaddr; | |
422 | |
423 if (addr_in->sin_family != AF_INET) { | |
424 ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno, | |
425 "the inherited socket #%d has " | |
426 "unsupported family", s); | |
427 ls->ignore = 1; | |
428 continue; | |
429 } | |
430 ls->addr_text_max_len = INET_ADDRSTRLEN; | |
431 | |
432 ls->addr_text.data = ngx_palloc(cycle->pool, | |
433 ls->addr_text_max_len); | |
434 if (ls->addr_text.data == NULL) { | |
435 return NGX_ERROR; | |
436 } | |
437 | |
438 addr_in->sin_len = 0; | |
439 | |
440 ls->family = addr_in->sin_family; | |
441 ls->addr_text.len = ngx_sock_ntop(ls->family, ls->sockaddr, | |
442 ls->addr_text.data, | |
443 ls->addr_text_max_len); | |
444 if (ls->addr_text.len == 0) { | |
445 return NGX_ERROR; | |
446 } | |
447 } | |
448 } | |
449 | |
450 break; | |
451 } | |
452 | |
453 return NGX_OK; | |
454 } | |
455 | |
456 | |
457 static ngx_int_t ngx_open_listening_sockets(ngx_cycle_t *cycle) | |
458 { | |
459 int tries, failed, reuseaddr, i; | |
460 ngx_err_t err; | |
461 ngx_log_t *log; | |
462 ngx_socket_t s; | |
463 ngx_listening_t *ls; | |
464 | |
465 reuseaddr = 1; | |
466 #if (NGX_SUPPRESS_WARN) | |
467 failed = 0; | |
468 #endif | |
469 | |
470 log = cycle->log; | |
471 | |
472 /* TODO: tries configurable */ | |
473 | |
474 for (tries = 10; tries; tries--) { | |
475 failed = 0; | |
476 | |
477 /* for each listening socket */ | |
478 | |
479 ls = cycle->listening.elts; | |
480 for (i = 0; i < cycle->listening.nelts; i++) { | |
481 | |
482 if (ls[i].ignore) { | |
483 continue; | |
484 } | |
485 | |
486 if (ls[i].fd != -1) { | |
487 continue; | |
488 } | |
489 | |
490 if (ls[i].inherited) { | |
491 | |
492 /* TODO: close on exit */ | |
493 /* TODO: nonblocking */ | |
494 /* TODO: deferred accept */ | |
495 | |
496 continue; | |
497 } | |
498 | |
499 s = ngx_socket(ls[i].family, ls[i].type, ls[i].protocol, | |
500 ls[i].flags); | |
501 | |
502 if (s == -1) { | |
503 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
504 ngx_socket_n " %s failed", ls[i].addr_text.data); | |
505 return NGX_ERROR; | |
506 } | |
507 | |
508 #if (WIN32) | |
509 /* | |
510 * Winsock assignes a socket number divisible by 4 | |
511 * so to find a connection we divide a socket number by 4. | |
512 */ | |
513 | |
514 if (s % 4) { | |
515 ngx_log_error(NGX_LOG_EMERG, ls->log, 0, | |
516 ngx_socket_n " created socket %d", s); | |
517 return NGX_ERROR; | |
518 } | |
519 #endif | |
520 | |
521 if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, | |
522 (const void *) &reuseaddr, sizeof(int)) == -1) { | |
523 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
524 "setsockopt(SO_REUSEADDR) %s failed", | |
525 ls[i].addr_text.data); | |
526 return NGX_ERROR; | |
527 } | |
528 | |
529 /* TODO: close on exit */ | |
530 | |
531 if (!(ngx_event_flags & NGX_USE_AIO_EVENT)) { | |
532 if (ngx_nonblocking(s) == -1) { | |
533 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
534 ngx_nonblocking_n " %s failed", | |
535 ls[i].addr_text.data); | |
536 return NGX_ERROR; | |
537 } | |
538 } | |
539 | |
540 #if 0 | |
541 if (ls[i].nonblocking) { | |
542 if (ngx_nonblocking(s) == -1) { | |
543 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
544 ngx_nonblocking_n " %s failed", | |
545 ls[i].addr_text.data); | |
546 return NGX_ERROR; | |
547 } | |
548 } | |
549 #endif | |
550 | |
551 if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) { | |
552 err = ngx_socket_errno; | |
553 ngx_log_error(NGX_LOG_EMERG, log, err, | |
554 "bind() to %s failed", ls[i].addr_text.data); | |
555 | |
556 if (err != NGX_EADDRINUSE) | |
557 return NGX_ERROR; | |
558 | |
559 if (ngx_close_socket(s) == -1) | |
560 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
561 ngx_close_socket_n " %s failed", | |
562 ls[i].addr_text.data); | |
563 | |
564 failed = 1; | |
565 continue; | |
566 } | |
567 | |
568 if (listen(s, ls[i].backlog) == -1) { | |
569 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
570 "listen() to %s failed", ls[i].addr_text.data); | |
571 return NGX_ERROR; | |
572 } | |
573 | |
574 /* TODO: deferred accept */ | |
575 | |
576 ls[i].fd = s; | |
577 } | |
578 | |
579 if (!failed) | |
580 break; | |
581 | |
582 /* TODO: delay configurable */ | |
583 | |
584 ngx_log_error(NGX_LOG_NOTICE, log, 0, | |
585 "try again to bind() after 500ms"); | |
586 ngx_msleep(500); | |
587 } | |
588 | |
589 if (failed) { | |
590 ngx_log_error(NGX_LOG_EMERG, log, 0, "still can not bind()"); | |
591 return NGX_ERROR; | |
592 } | |
593 | |
594 return NGX_OK; | |
595 } | |
596 | |
597 | |
598 #endif | |
599 | |
600 | |
601 void ngx_reopen_files(ngx_cycle_t *cycle) | 365 void ngx_reopen_files(ngx_cycle_t *cycle) |
602 { | 366 { |
603 ngx_fd_t fd; | 367 ngx_fd_t fd; |
604 ngx_int_t i; | 368 ngx_int_t i; |
605 ngx_open_file_t *file; | 369 ngx_open_file_t *file; |
662 file[i].fd = fd; | 426 file[i].fd = fd; |
663 } | 427 } |
664 } | 428 } |
665 | 429 |
666 | 430 |
667 #if 0 | |
668 | |
669 static void ngx_close_listening_sockets(ngx_cycle_t *cycle) | |
670 { | |
671 ngx_int_t i; | |
672 ngx_socket_t fd; | |
673 ngx_listening_t *ls; | |
674 | |
675 if (ngx_event_flags & NGX_USE_IOCP_EVENT) { | |
676 return; | |
677 } | |
678 | |
679 ls = cycle->listening.elts; | |
680 for (i = 0; i < cycle->listening.nelts; i++) { | |
681 fd = ls[i].fd; | |
682 | |
683 #if (WIN32) | |
684 /* | |
685 * Winsock assignes a socket number divisible by 4 | |
686 * so to find a connection we divide a socket number by 4. | |
687 */ | |
688 | |
689 fd /= 4; | |
690 #endif | |
691 | |
692 ngx_del_event(&cycle->read_events[fd], NGX_READ_EVENT, NGX_CLOSE_EVENT); | |
693 | |
694 if (ngx_close_socket(ls[i].fd) == -1) { | |
695 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, | |
696 ngx_close_socket_n " %s failed", | |
697 ls[i].addr_text.data); | |
698 } | |
699 | |
700 cycle->connections[fd].fd = -1; | |
701 } | |
702 } | |
703 | |
704 #endif | |
705 | |
706 | |
707 static void ngx_clean_old_cycles(ngx_event_t *ev) | 431 static void ngx_clean_old_cycles(ngx_event_t *ev) |
708 { | 432 { |
709 int i, n, found, live; | 433 int i, n, found, live; |
710 ngx_log_t *log; | 434 ngx_log_t *log; |
711 ngx_cycle_t **cycle; | 435 ngx_cycle_t **cycle; |