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;