Deleted
Added
nxt_sockaddr.c (1909:d6a5090da2ea) | nxt_sockaddr.c (1935:ba08638c3259) |
---|---|
1 2/* 3 * Copyright (C) Igor Sysoev 4 * Copyright (C) NGINX, Inc. 5 */ 6 7#include <nxt_main.h> 8 --- 591 unchanged lines hidden (view full) --- 600#endif 601 602 603nxt_sockaddr_t * 604nxt_sockaddr_parse(nxt_mp_t *mp, nxt_str_t *addr) 605{ 606 nxt_sockaddr_t *sa; 607 | 1 2/* 3 * Copyright (C) Igor Sysoev 4 * Copyright (C) NGINX, Inc. 5 */ 6 7#include <nxt_main.h> 8 --- 591 unchanged lines hidden (view full) --- 600#endif 601 602 603nxt_sockaddr_t * 604nxt_sockaddr_parse(nxt_mp_t *mp, nxt_str_t *addr) 605{ 606 nxt_sockaddr_t *sa; 607 |
608 sa = nxt_sockaddr_parse_optport(mp, addr); 609 610 if (sa != NULL 611 && sa->u.sockaddr.sa_family != AF_UNIX 612 && nxt_sockaddr_port_number(sa) == 0) 613 { 614 nxt_thread_log_error(NXT_LOG_ERR, 615 "The address \"%V\" must specify a port.", addr); 616 return NULL; 617 } 618 619 return sa; 620} 621 622 623nxt_sockaddr_t * 624nxt_sockaddr_parse_optport(nxt_mp_t *mp, nxt_str_t *addr) 625{ 626 nxt_sockaddr_t *sa; 627 628 if (addr->length == 0) { 629 nxt_thread_log_error(NXT_LOG_ERR, "socket address cannot be empty"); 630 return NULL; 631 } 632 |
|
608 if (addr->length > 6 && nxt_memcmp(addr->start, "unix:", 5) == 0) { 609 sa = nxt_sockaddr_unix_parse(mp, addr); 610 | 633 if (addr->length > 6 && nxt_memcmp(addr->start, "unix:", 5) == 0) { 634 sa = nxt_sockaddr_unix_parse(mp, addr); 635 |
611 } else if (addr->length != 0 && addr->start[0] == '[') { | 636 } else if (addr->start[0] == '[' || nxt_inet6_probe(addr)) { |
612 sa = nxt_sockaddr_inet6_parse(mp, addr); 613 614 } else { 615 sa = nxt_sockaddr_inet_parse(mp, addr); 616 } 617 618 if (nxt_fast_path(sa != NULL)) { 619 nxt_sockaddr_text(sa); --- 78 unchanged lines hidden (view full) --- 698nxt_sockaddr_inet6_parse(nxt_mp_t *mp, nxt_str_t *addr) 699{ 700#if (NXT_INET6) 701 u_char *p, *start, *end; 702 size_t length; 703 nxt_int_t ret, port; 704 nxt_sockaddr_t *sa; 705 | 637 sa = nxt_sockaddr_inet6_parse(mp, addr); 638 639 } else { 640 sa = nxt_sockaddr_inet_parse(mp, addr); 641 } 642 643 if (nxt_fast_path(sa != NULL)) { 644 nxt_sockaddr_text(sa); --- 78 unchanged lines hidden (view full) --- 723nxt_sockaddr_inet6_parse(nxt_mp_t *mp, nxt_str_t *addr) 724{ 725#if (NXT_INET6) 726 u_char *p, *start, *end; 727 size_t length; 728 nxt_int_t ret, port; 729 nxt_sockaddr_t *sa; 730 |
706 length = addr->length - 1; 707 start = addr->start + 1; | 731 if (addr->start[0] == '[') { 732 length = addr->length - 1; 733 start = addr->start + 1; |
708 | 734 |
709 end = nxt_memchr(start, ']', length); 710 711 if (end != NULL) { 712 sa = nxt_sockaddr_alloc(mp, sizeof(struct sockaddr_in6), 713 NXT_INET6_ADDR_STR_LEN); 714 if (nxt_slow_path(sa == NULL)) { | 735 end = nxt_memchr(start, ']', length); 736 if (nxt_slow_path(end == NULL)) { |
715 return NULL; 716 } 717 | 737 return NULL; 738 } 739 |
718 ret = nxt_inet6_addr(&sa->u.sockaddr_in6.sin6_addr, start, end - start); | 740 p = end + 1; |
719 | 741 |
720 if (nxt_fast_path(ret == NXT_OK)) { 721 p = end + 1; 722 length = (start + length) - p; | 742 } else { 743 length = addr->length; 744 start = addr->start; 745 end = addr->start + addr->length; 746 p = NULL; 747 } |
723 | 748 |
724 if (length > 2 && *p == ':') { 725 port = nxt_int_parse(p + 1, length - 1); | 749 port = 0; |
726 | 750 |
727 if (port > 0 && port < 65536) { 728 sa->u.sockaddr_in6.sin6_port = htons((in_port_t) port); 729 sa->u.sockaddr_in6.sin6_family = AF_INET6; | 751 if (p != NULL) { 752 length = (start + length) - p; |
730 | 753 |
731 return sa; 732 } 733 } | 754 if (length < 2 || *p != ':') { 755 nxt_thread_log_error(NXT_LOG_ERR, "invalid IPv6 address in \"%V\"", 756 addr); 757 return NULL; 758 } |
734 | 759 |
735 nxt_thread_log_error(NXT_LOG_ERR, "invalid port in \"%V\"", addr); | 760 port = nxt_int_parse(p + 1, length - 1); |
736 | 761 |
762 if (port < 1 || port > 65535) { 763 nxt_thread_log_error(NXT_LOG_ERR, "invalid port in \"%V\"", addr); |
|
737 return NULL; 738 } 739 } 740 | 764 return NULL; 765 } 766 } 767 |
741 nxt_thread_log_error(NXT_LOG_ERR, "invalid IPv6 address in \"%V\"", addr); | 768 sa = nxt_sockaddr_alloc(mp, sizeof(struct sockaddr_in6), 769 NXT_INET6_ADDR_STR_LEN); 770 if (nxt_slow_path(sa == NULL)) { 771 return NULL; 772 } |
742 | 773 |
743 return NULL; | 774 ret = nxt_inet6_addr(&sa->u.sockaddr_in6.sin6_addr, start, end - start); 775 if (nxt_slow_path(ret != NXT_OK)) { 776 nxt_thread_log_error(NXT_LOG_ERR, "invalid IPv6 address in \"%V\"", 777 addr); 778 return NULL; 779 } |
744 | 780 |
781 sa->u.sockaddr_in6.sin6_family = AF_INET6; 782 sa->u.sockaddr_in6.sin6_port = htons((in_port_t) port); 783 784 return sa; 785 |
|
745#else /* !(NXT_INET6) */ 746 747 nxt_thread_log_error(NXT_LOG_ERR, "IPv6 socket \"%V\" is not supported", 748 addr); 749 return NULL; 750 751#endif 752} --- 5 unchanged lines hidden (view full) --- 758 u_char *p; 759 size_t length; 760 nxt_int_t port; 761 in_addr_t inaddr; 762 nxt_sockaddr_t *sa; 763 764 p = nxt_memchr(addr->start, ':', addr->length); 765 | 786#else /* !(NXT_INET6) */ 787 788 nxt_thread_log_error(NXT_LOG_ERR, "IPv6 socket \"%V\" is not supported", 789 addr); 790 return NULL; 791 792#endif 793} --- 5 unchanged lines hidden (view full) --- 799 u_char *p; 800 size_t length; 801 nxt_int_t port; 802 in_addr_t inaddr; 803 nxt_sockaddr_t *sa; 804 805 p = nxt_memchr(addr->start, ':', addr->length); 806 |
766 if (nxt_fast_path(p != NULL)) { 767 inaddr = INADDR_ANY; | 807 if (p == NULL) { 808 length = addr->length; 809 810 } else { |
768 length = p - addr->start; | 811 length = p - addr->start; |
812 } |
|
769 | 813 |
770 if (length != 1 || addr->start[0] != '*') { 771 inaddr = nxt_inet_addr(addr->start, length); | 814 inaddr = INADDR_ANY; |
772 | 815 |
773 if (nxt_slow_path(inaddr == INADDR_NONE)) { 774 nxt_thread_log_error(NXT_LOG_ERR, "invalid address \"%V\"", 775 addr); 776 return NULL; 777 } | 816 if (length != 1 || addr->start[0] != '*') { 817 inaddr = nxt_inet_addr(addr->start, length); 818 if (nxt_slow_path(inaddr == INADDR_NONE)) { 819 nxt_thread_log_error(NXT_LOG_ERR, "invalid address \"%V\"", addr); 820 return NULL; |
778 } | 821 } |
822 } |
|
779 | 823 |
824 port = 0; 825 826 if (p != NULL) { |
|
780 p++; 781 length = (addr->start + addr->length) - p; | 827 p++; 828 length = (addr->start + addr->length) - p; |
829 |
|
782 port = nxt_int_parse(p, length); 783 | 830 port = nxt_int_parse(p, length); 831 |
784 if (port > 0 && port < 65536) { 785 sa = nxt_sockaddr_alloc(mp, sizeof(struct sockaddr_in), 786 NXT_INET_ADDR_STR_LEN); 787 788 if (nxt_fast_path(sa != NULL)) { 789 sa->u.sockaddr_in.sin_family = AF_INET; 790 sa->u.sockaddr_in.sin_port = htons((in_port_t) port); 791 sa->u.sockaddr_in.sin_addr.s_addr = inaddr; 792 } 793 794 return sa; | 832 if (port < 1 || port > 65535) { 833 nxt_thread_log_error(NXT_LOG_ERR, "invalid port in \"%V\"", addr); 834 return NULL; |
795 } 796 } 797 | 835 } 836 } 837 |
798 nxt_thread_log_error(NXT_LOG_ERR, "invalid port in \"%V\"", addr); | 838 sa = nxt_sockaddr_alloc(mp, sizeof(struct sockaddr_in), 839 NXT_INET_ADDR_STR_LEN); 840 if (nxt_slow_path(sa == NULL)) { 841 return NULL; 842 } |
799 | 843 |
800 return NULL; | 844 sa->u.sockaddr_in.sin_family = AF_INET; 845 sa->u.sockaddr_in.sin_addr.s_addr = inaddr; 846 sa->u.sockaddr_in.sin_port = htons((in_port_t) port); 847 848 return sa; |
801} 802 803 804void 805nxt_job_sockaddr_parse(nxt_job_sockaddr_parse_t *jbs) 806{ 807 u_char *p; 808 size_t length; --- 506 unchanged lines hidden (view full) --- 1315 return NXT_OK; 1316 } 1317 } 1318 1319 return NXT_ERROR; 1320} 1321 1322#endif | 849} 850 851 852void 853nxt_job_sockaddr_parse(nxt_job_sockaddr_parse_t *jbs) 854{ 855 u_char *p; 856 size_t length; --- 506 unchanged lines hidden (view full) --- 1363 return NXT_OK; 1364 } 1365 } 1366 1367 return NXT_ERROR; 1368} 1369 1370#endif |
1371 1372 1373nxt_bool_t 1374nxt_inet6_probe(nxt_str_t *str) 1375{ 1376 u_char *colon, *end; 1377 1378 colon = nxt_memchr(str->start, ':', str->length); 1379 1380 if (colon != NULL) { 1381 end = str->start + str->length; 1382 colon = nxt_memchr(colon + 1, ':', end - (colon + 1)); 1383 } 1384 1385 return (colon != NULL); 1386} |
|