From 14d8b0570e33504c342407d6a3c0492a41f2128c Mon Sep 17 00:00:00 2001 From: Vicente Date: Sun, 9 Jun 2013 16:34:27 +0200 Subject: [PATCH] Update and clean Tomato RAF files --- release/src/router/glib/gmodule/ChangeLog | 236 - release/src/router/libusb10/Makefile | 757 --- release/src/router/lzo/src/Makefile | 600 -- release/src/router/lzo/src/Makefile.am | 68 - release/src/router/lzo/src/Makefile.in | 600 -- release/src/router/lzo/tests/Makefile | 468 -- release/src/router/lzo/tests/Makefile.am | 17 - release/src/router/lzo/tests/Makefile.in | 468 -- release/src/router/nginx/CHANGES | 6267 ++++++++++++++++++ release/src/router/nginx/CHANGES.ru | 6364 +++++++++++++++++++ release/src/router/nginx/LICENSE | 26 + release/src/router/nginx/README | 3 + release/src/router/nginx/auto/cc/acc | 15 + release/src/router/nginx/auto/cc/bcc | 72 + release/src/router/nginx/auto/cc/ccc | 46 + release/src/router/nginx/auto/cc/clang | 98 + release/src/router/nginx/auto/cc/conf | 195 + release/src/router/nginx/auto/cc/gcc | 181 + release/src/router/nginx/auto/cc/icc | 121 + release/src/router/nginx/auto/cc/msvc | 135 + release/src/router/nginx/auto/cc/name | 89 + release/src/router/nginx/auto/cc/owc | 104 + release/src/router/nginx/auto/cc/sunc | 158 + release/src/router/nginx/auto/define | 12 + release/src/router/nginx/auto/endianness | 45 + release/src/router/nginx/auto/feature | 123 + release/src/router/nginx/auto/have | 12 + release/src/router/nginx/auto/have_headers | 12 + release/src/router/nginx/auto/headers | 13 + release/src/router/nginx/auto/include | 61 + release/src/router/nginx/auto/init | 51 + release/src/router/nginx/auto/install | 184 + release/src/router/nginx/auto/lib/conf | 83 + release/src/router/nginx/auto/lib/geoip/conf | 94 + .../router/nginx/auto/lib/google-perftools/conf | 61 + release/src/router/nginx/auto/lib/libatomic/conf | 43 + release/src/router/nginx/auto/lib/libatomic/make | 14 + release/src/router/nginx/auto/lib/libgd/conf | 83 + release/src/router/nginx/auto/lib/libxslt/conf | 156 + release/src/router/nginx/auto/lib/make | 32 + release/src/router/nginx/auto/lib/md5/conf | 103 + release/src/router/nginx/auto/lib/md5/make | 96 + release/src/router/nginx/auto/lib/md5/makefile.bcc | 22 + .../src/router/nginx/auto/lib/md5/makefile.msvc | 22 + release/src/router/nginx/auto/lib/md5/makefile.owc | 11 + release/src/router/nginx/auto/lib/openssl/conf | 74 + release/src/router/nginx/auto/lib/openssl/make | 70 + .../src/router/nginx/auto/lib/openssl/makefile.bcc | 18 + .../router/nginx/auto/lib/openssl/makefile.msvc | 14 + release/src/router/nginx/auto/lib/pcre/conf | 198 + release/src/router/nginx/auto/lib/pcre/make | 64 + .../src/router/nginx/auto/lib/pcre/makefile.bcc | 26 + .../src/router/nginx/auto/lib/pcre/makefile.msvc | 22 + .../src/router/nginx/auto/lib/pcre/makefile.owc | 24 + release/src/router/nginx/auto/lib/perl/conf | 70 + release/src/router/nginx/auto/lib/perl/make | 40 + release/src/router/nginx/auto/lib/sha1/conf | 79 + release/src/router/nginx/auto/lib/sha1/make | 96 + .../src/router/nginx/auto/lib/sha1/makefile.bcc | 22 + .../src/router/nginx/auto/lib/sha1/makefile.msvc | 22 + .../src/router/nginx/auto/lib/sha1/makefile.owc | 11 + release/src/router/nginx/auto/lib/test | 40 + release/src/router/nginx/auto/lib/zlib/conf | 79 + release/src/router/nginx/auto/lib/zlib/make | 114 + .../src/router/nginx/auto/lib/zlib/makefile.bcc | 17 + .../src/router/nginx/auto/lib/zlib/makefile.msvc | 17 + .../src/router/nginx/auto/lib/zlib/makefile.owc | 14 + .../src/router/nginx/auto/lib/zlib/patch.zlib.h | 10 + release/src/router/nginx/auto/make | 417 ++ release/src/router/nginx/auto/modules | 521 ++ release/src/router/nginx/auto/nohave | 12 + release/src/router/nginx/auto/options | 517 ++ release/src/router/nginx/auto/os/conf | 107 + release/src/router/nginx/auto/os/darwin | 116 + release/src/router/nginx/auto/os/freebsd | 144 + release/src/router/nginx/auto/os/linux | 153 + release/src/router/nginx/auto/os/solaris | 61 + release/src/router/nginx/auto/os/win32 | 29 + release/src/router/nginx/auto/sources | 545 ++ release/src/router/nginx/auto/stubs | 8 + release/src/router/nginx/auto/summary | 116 + release/src/router/nginx/auto/types/sizeof | 89 + release/src/router/nginx/auto/types/typedef | 77 + release/src/router/nginx/auto/types/uintptr_t | 45 + release/src/router/nginx/auto/types/value | 12 + release/src/router/nginx/auto/unix | 794 +++ release/src/router/nginx/conf/fastcgi.conf | 25 + release/src/router/nginx/conf/fastcgi_params | 24 + release/src/router/nginx/conf/koi-utf | 109 + release/src/router/nginx/conf/koi-win | 103 + release/src/router/nginx/conf/mime.types | 80 + release/src/router/nginx/conf/nginx.conf | 118 + release/src/router/nginx/conf/scgi_params | 16 + release/src/router/nginx/conf/uwsgi_params | 16 + release/src/router/nginx/conf/win-utf | 126 + release/src/router/nginx/configure | 111 + release/src/router/nginx/contrib/README | 15 + release/src/router/nginx/contrib/geo2nginx.pl | 58 + .../src/router/nginx/contrib/unicode2nginx/koi-utf | 131 + .../contrib/unicode2nginx/unicode-to-nginx.pl | 45 + .../src/router/nginx/contrib/unicode2nginx/win-utf | 130 + release/src/router/nginx/html/50x.html | 21 + release/src/router/nginx/html/index.html | 25 + release/src/router/nginx/man/nginx.8 | 202 + release/src/router/nginx/src/core/nginx.c | 1368 ++++ release/src/router/nginx/src/core/nginx.h | 20 + release/src/router/nginx/src/core/ngx_array.c | 141 + release/src/router/nginx/src/core/ngx_array.h | 53 + release/src/router/nginx/src/core/ngx_buf.c | 220 + release/src/router/nginx/src/core/ngx_buf.h | 162 + release/src/router/nginx/src/core/ngx_conf_file.c | 1480 +++++ release/src/router/nginx/src/core/ngx_conf_file.h | 340 + release/src/router/nginx/src/core/ngx_config.h | 134 + release/src/router/nginx/src/core/ngx_connection.c | 1133 ++++ release/src/router/nginx/src/core/ngx_connection.h | 200 + release/src/router/nginx/src/core/ngx_core.h | 99 + release/src/router/nginx/src/core/ngx_cpuinfo.c | 139 + release/src/router/nginx/src/core/ngx_crc.h | 39 + release/src/router/nginx/src/core/ngx_crc32.c | 129 + release/src/router/nginx/src/core/ngx_crc32.h | 79 + release/src/router/nginx/src/core/ngx_crypt.c | 283 + release/src/router/nginx/src/core/ngx_crypt.h | 20 + release/src/router/nginx/src/core/ngx_cycle.c | 1366 ++++ release/src/router/nginx/src/core/ngx_cycle.h | 142 + release/src/router/nginx/src/core/ngx_file.c | 993 +++ release/src/router/nginx/src/core/ngx_file.h | 151 + release/src/router/nginx/src/core/ngx_hash.c | 978 +++ release/src/router/nginx/src/core/ngx_hash.h | 122 + release/src/router/nginx/src/core/ngx_inet.c | 1183 ++++ release/src/router/nginx/src/core/ngx_inet.h | 120 + release/src/router/nginx/src/core/ngx_list.c | 71 + release/src/router/nginx/src/core/ngx_list.h | 83 + release/src/router/nginx/src/core/ngx_log.c | 459 ++ release/src/router/nginx/src/core/ngx_log.h | 250 + release/src/router/nginx/src/core/ngx_md5.c | 289 + release/src/router/nginx/src/core/ngx_md5.h | 60 + release/src/router/nginx/src/core/ngx_murmurhash.c | 50 + release/src/router/nginx/src/core/ngx_murmurhash.h | 19 + .../router/nginx/src/core/ngx_open_file_cache.c | 1187 ++++ .../router/nginx/src/core/ngx_open_file_cache.h | 129 + .../src/router/nginx/src/core/ngx_output_chain.c | 674 ++ release/src/router/nginx/src/core/ngx_palloc.c | 433 ++ release/src/router/nginx/src/core/ngx_palloc.h | 95 + release/src/router/nginx/src/core/ngx_parse.c | 249 + release/src/router/nginx/src/core/ngx_parse.h | 21 + release/src/router/nginx/src/core/ngx_queue.c | 80 + release/src/router/nginx/src/core/ngx_queue.h | 112 + release/src/router/nginx/src/core/ngx_radix_tree.c | 488 ++ release/src/router/nginx/src/core/ngx_radix_tree.h | 55 + release/src/router/nginx/src/core/ngx_rbtree.c | 382 ++ release/src/router/nginx/src/core/ngx_rbtree.h | 84 + release/src/router/nginx/src/core/ngx_regex.c | 464 ++ release/src/router/nginx/src/core/ngx_regex.h | 60 + release/src/router/nginx/src/core/ngx_resolver.c | 2313 +++++++ release/src/router/nginx/src/core/ngx_resolver.h | 148 + release/src/router/nginx/src/core/ngx_sha1.h | 31 + release/src/router/nginx/src/core/ngx_shmtx.c | 309 + release/src/router/nginx/src/core/ngx_shmtx.h | 49 + release/src/router/nginx/src/core/ngx_slab.c | 697 +++ release/src/router/nginx/src/core/ngx_slab.h | 54 + release/src/router/nginx/src/core/ngx_spinlock.c | 53 + release/src/router/nginx/src/core/ngx_string.c | 1840 ++++++ release/src/router/nginx/src/core/ngx_string.h | 231 + release/src/router/nginx/src/core/ngx_times.c | 411 ++ release/src/router/nginx/src/core/ngx_times.h | 51 + .../nginx/src/event/modules/ngx_aio_module.c | 171 + .../nginx/src/event/modules/ngx_devpoll_module.c | 575 ++ .../nginx/src/event/modules/ngx_epoll_module.c | 837 +++ .../nginx/src/event/modules/ngx_eventport_module.c | 633 ++ .../nginx/src/event/modules/ngx_kqueue_module.c | 785 +++ .../nginx/src/event/modules/ngx_poll_module.c | 443 ++ .../nginx/src/event/modules/ngx_rtsig_module.c | 747 +++ .../nginx/src/event/modules/ngx_select_module.c | 435 ++ .../src/event/modules/ngx_win32_select_module.c | 400 ++ release/src/router/nginx/src/event/ngx_event.c | 1329 ++++ release/src/router/nginx/src/event/ngx_event.h | 568 ++ .../src/router/nginx/src/event/ngx_event_accept.c | 505 ++ .../router/nginx/src/event/ngx_event_busy_lock.c | 286 + .../router/nginx/src/event/ngx_event_busy_lock.h | 65 + .../src/router/nginx/src/event/ngx_event_connect.c | 258 + .../src/router/nginx/src/event/ngx_event_connect.h | 76 + .../src/router/nginx/src/event/ngx_event_mutex.c | 70 + .../src/router/nginx/src/event/ngx_event_openssl.c | 2564 ++++++++ .../src/router/nginx/src/event/ngx_event_openssl.h | 178 + .../nginx/src/event/ngx_event_openssl_stapling.c | 1749 ++++++ .../src/router/nginx/src/event/ngx_event_pipe.c | 1026 +++ .../src/router/nginx/src/event/ngx_event_pipe.h | 94 + .../src/router/nginx/src/event/ngx_event_posted.c | 173 + .../src/router/nginx/src/event/ngx_event_posted.h | 75 + .../src/router/nginx/src/event/ngx_event_timer.c | 158 + .../src/router/nginx/src/event/ngx_event_timer.h | 102 + .../src/http/modules/ngx_http_access_module.c | 389 ++ .../http/modules/ngx_http_addition_filter_module.c | 251 + .../src/http/modules/ngx_http_auth_basic_module.c | 467 ++ .../src/http/modules/ngx_http_autoindex_module.c | 704 +++ .../src/http/modules/ngx_http_browser_module.c | 715 +++ .../http/modules/ngx_http_charset_filter_module.c | 1681 +++++ .../http/modules/ngx_http_chunked_filter_module.c | 243 + .../nginx/src/http/modules/ngx_http_dav_module.c | 1146 ++++ .../src/http/modules/ngx_http_degradation_module.c | 243 + .../src/http/modules/ngx_http_empty_gif_module.c | 140 + .../src/http/modules/ngx_http_fastcgi_module.c | 3053 +++++++++ .../nginx/src/http/modules/ngx_http_flv_module.c | 266 + .../nginx/src/http/modules/ngx_http_geo_module.c | 1644 +++++ .../nginx/src/http/modules/ngx_http_geoip_module.c | 919 +++ .../http/modules/ngx_http_gunzip_filter_module.c | 677 ++ .../src/http/modules/ngx_http_gzip_filter_module.c | 1227 ++++ .../src/http/modules/ngx_http_gzip_static_module.c | 333 + .../http/modules/ngx_http_headers_filter_module.c | 631 ++ .../http/modules/ngx_http_image_filter_module.c | 1514 +++++ .../nginx/src/http/modules/ngx_http_index_module.c | 540 ++ .../src/http/modules/ngx_http_limit_conn_module.c | 767 +++ .../src/http/modules/ngx_http_limit_req_module.c | 985 +++ .../nginx/src/http/modules/ngx_http_log_module.c | 1689 +++++ .../nginx/src/http/modules/ngx_http_map_module.c | 567 ++ .../src/http/modules/ngx_http_memcached_module.c | 692 ++ .../nginx/src/http/modules/ngx_http_mp4_module.c | 3028 +++++++++ .../modules/ngx_http_not_modified_filter_module.c | 240 + .../nginx/src/http/modules/ngx_http_proxy_module.c | 3798 +++++++++++ .../http/modules/ngx_http_random_index_module.c | 317 + .../http/modules/ngx_http_range_filter_module.c | 883 +++ .../src/http/modules/ngx_http_realip_module.c | 423 ++ .../src/http/modules/ngx_http_referer_module.c | 613 ++ .../src/http/modules/ngx_http_rewrite_module.c | 1025 +++ .../nginx/src/http/modules/ngx_http_scgi_module.c | 1804 ++++++ .../src/http/modules/ngx_http_secure_link_module.c | 368 ++ .../http/modules/ngx_http_split_clients_module.c | 246 + .../src/http/modules/ngx_http_ssi_filter_module.c | 2925 +++++++++ .../src/http/modules/ngx_http_ssi_filter_module.h | 114 + .../nginx/src/http/modules/ngx_http_ssl_module.c | 803 +++ .../nginx/src/http/modules/ngx_http_ssl_module.h | 58 + .../src/http/modules/ngx_http_static_module.c | 290 + .../src/http/modules/ngx_http_stub_status_module.c | 231 + .../src/http/modules/ngx_http_sub_filter_module.c | 717 +++ .../modules/ngx_http_upstream_ip_hash_module.c | 269 + .../modules/ngx_http_upstream_keepalive_module.c | 539 ++ .../modules/ngx_http_upstream_least_conn_module.c | 405 ++ .../http/modules/ngx_http_userid_filter_module.c | 842 +++ .../nginx/src/http/modules/ngx_http_uwsgi_module.c | 1840 ++++++ .../src/http/modules/ngx_http_xslt_filter_module.c | 1119 ++++ .../router/nginx/src/http/modules/perl/Makefile.PL | 33 + .../router/nginx/src/http/modules/perl/nginx.pm | 138 + .../router/nginx/src/http/modules/perl/nginx.xs | 1023 +++ .../src/http/modules/perl/ngx_http_perl_module.c | 1076 ++++ .../src/http/modules/perl/ngx_http_perl_module.h | 67 + .../src/router/nginx/src/http/modules/perl/typemap | 3 + release/src/router/nginx/src/http/ngx_http.c | 2108 +++++++ release/src/router/nginx/src/http/ngx_http.h | 184 + .../src/router/nginx/src/http/ngx_http_busy_lock.c | 307 + .../src/router/nginx/src/http/ngx_http_busy_lock.h | 54 + release/src/router/nginx/src/http/ngx_http_cache.h | 159 + .../src/router/nginx/src/http/ngx_http_config.h | 75 + .../nginx/src/http/ngx_http_copy_filter_module.c | 301 + .../router/nginx/src/http/ngx_http_core_module.c | 5235 ++++++++++++++++ .../router/nginx/src/http/ngx_http_core_module.h | 583 ++ .../router/nginx/src/http/ngx_http_file_cache.c | 1887 ++++++ .../nginx/src/http/ngx_http_header_filter_module.c | 630 ++ release/src/router/nginx/src/http/ngx_http_parse.c | 2224 +++++++ .../router/nginx/src/http/ngx_http_parse_time.c | 277 + .../src/http/ngx_http_postpone_filter_module.c | 178 + .../src/router/nginx/src/http/ngx_http_request.c | 3563 +++++++++++ .../src/router/nginx/src/http/ngx_http_request.h | 592 ++ .../router/nginx/src/http/ngx_http_request_body.c | 1082 ++++ .../src/router/nginx/src/http/ngx_http_script.c | 1753 ++++++ .../src/router/nginx/src/http/ngx_http_script.h | 257 + release/src/router/nginx/src/http/ngx_http_spdy.c | 2882 +++++++++ release/src/router/nginx/src/http/ngx_http_spdy.h | 235 + .../nginx/src/http/ngx_http_spdy_filter_module.c | 999 +++ .../router/nginx/src/http/ngx_http_spdy_module.c | 351 ++ .../router/nginx/src/http/ngx_http_spdy_module.h | 36 + .../nginx/src/http/ngx_http_special_response.c | 792 +++ .../src/router/nginx/src/http/ngx_http_upstream.c | 5137 +++++++++++++++ .../src/router/nginx/src/http/ngx_http_upstream.h | 379 ++ .../nginx/src/http/ngx_http_upstream_round_robin.c | 678 ++ .../nginx/src/http/ngx_http_upstream_round_robin.h | 89 + .../src/router/nginx/src/http/ngx_http_variables.c | 2542 ++++++++ .../src/router/nginx/src/http/ngx_http_variables.h | 112 + .../nginx/src/http/ngx_http_write_filter_module.c | 311 + release/src/router/nginx/src/mail/ngx_mail.c | 566 ++ release/src/router/nginx/src/mail/ngx_mail.h | 419 ++ .../nginx/src/mail/ngx_mail_auth_http_module.c | 1462 +++++ .../router/nginx/src/mail/ngx_mail_core_module.c | 652 ++ .../src/router/nginx/src/mail/ngx_mail_handler.c | 771 +++ .../router/nginx/src/mail/ngx_mail_imap_handler.c | 457 ++ .../router/nginx/src/mail/ngx_mail_imap_module.c | 253 + .../router/nginx/src/mail/ngx_mail_imap_module.h | 39 + release/src/router/nginx/src/mail/ngx_mail_parse.c | 888 +++ .../router/nginx/src/mail/ngx_mail_pop3_handler.c | 500 ++ .../router/nginx/src/mail/ngx_mail_pop3_module.c | 264 + .../router/nginx/src/mail/ngx_mail_pop3_module.h | 38 + .../router/nginx/src/mail/ngx_mail_proxy_module.c | 1089 ++++ .../router/nginx/src/mail/ngx_mail_smtp_handler.c | 872 +++ .../router/nginx/src/mail/ngx_mail_smtp_module.c | 308 + .../router/nginx/src/mail/ngx_mail_smtp_module.h | 45 + .../router/nginx/src/mail/ngx_mail_ssl_module.c | 491 ++ .../router/nginx/src/mail/ngx_mail_ssl_module.h | 52 + .../router/nginx/src/misc/ngx_cpp_test_module.cpp | 29 + .../nginx/src/misc/ngx_google_perftools_module.c | 126 + .../src/router/nginx/src/os/unix/ngx_aio_read.c | 109 + .../router/nginx/src/os/unix/ngx_aio_read_chain.c | 78 + .../src/router/nginx/src/os/unix/ngx_aio_write.c | 109 + .../router/nginx/src/os/unix/ngx_aio_write_chain.c | 100 + release/src/router/nginx/src/os/unix/ngx_alloc.c | 90 + release/src/router/nginx/src/os/unix/ngx_alloc.h | 45 + release/src/router/nginx/src/os/unix/ngx_atomic.h | 313 + release/src/router/nginx/src/os/unix/ngx_channel.c | 258 + release/src/router/nginx/src/os/unix/ngx_channel.h | 34 + release/src/router/nginx/src/os/unix/ngx_daemon.c | 70 + release/src/router/nginx/src/os/unix/ngx_darwin.h | 23 + .../router/nginx/src/os/unix/ngx_darwin_config.h | 97 + .../src/router/nginx/src/os/unix/ngx_darwin_init.c | 196 + .../nginx/src/os/unix/ngx_darwin_sendfile_chain.c | 372 ++ release/src/router/nginx/src/os/unix/ngx_errno.c | 90 + release/src/router/nginx/src/os/unix/ngx_errno.h | 75 + .../router/nginx/src/os/unix/ngx_file_aio_read.c | 208 + release/src/router/nginx/src/os/unix/ngx_files.c | 564 ++ release/src/router/nginx/src/os/unix/ngx_files.h | 392 ++ release/src/router/nginx/src/os/unix/ngx_freebsd.h | 25 + .../router/nginx/src/os/unix/ngx_freebsd_config.h | 121 + .../router/nginx/src/os/unix/ngx_freebsd_init.c | 260 + .../nginx/src/os/unix/ngx_freebsd_rfork_thread.c | 756 +++ .../nginx/src/os/unix/ngx_freebsd_rfork_thread.h | 122 + .../nginx/src/os/unix/ngx_freebsd_sendfile_chain.c | 442 ++ .../nginx/src/os/unix/ngx_gcc_atomic_amd64.h | 82 + .../router/nginx/src/os/unix/ngx_gcc_atomic_ppc.h | 155 + .../nginx/src/os/unix/ngx_gcc_atomic_sparc64.h | 82 + .../router/nginx/src/os/unix/ngx_gcc_atomic_x86.h | 127 + release/src/router/nginx/src/os/unix/ngx_linux.h | 18 + .../router/nginx/src/os/unix/ngx_linux_aio_read.c | 137 + .../router/nginx/src/os/unix/ngx_linux_config.h | 118 + .../src/router/nginx/src/os/unix/ngx_linux_init.c | 91 + .../nginx/src/os/unix/ngx_linux_sendfile_chain.c | 380 ++ release/src/router/nginx/src/os/unix/ngx_os.h | 83 + .../router/nginx/src/os/unix/ngx_posix_config.h | 157 + .../src/router/nginx/src/os/unix/ngx_posix_init.c | 128 + release/src/router/nginx/src/os/unix/ngx_process.c | 625 ++ release/src/router/nginx/src/os/unix/ngx_process.h | 88 + .../router/nginx/src/os/unix/ngx_process_cycle.c | 1394 +++++ .../router/nginx/src/os/unix/ngx_process_cycle.h | 61 + .../router/nginx/src/os/unix/ngx_pthread_thread.c | 278 + .../src/router/nginx/src/os/unix/ngx_readv_chain.c | 266 + release/src/router/nginx/src/os/unix/ngx_recv.c | 180 + release/src/router/nginx/src/os/unix/ngx_send.c | 73 + .../src/router/nginx/src/os/unix/ngx_setaffinity.c | 69 + .../src/router/nginx/src/os/unix/ngx_setaffinity.h | 23 + .../router/nginx/src/os/unix/ngx_setproctitle.c | 135 + .../router/nginx/src/os/unix/ngx_setproctitle.h | 52 + release/src/router/nginx/src/os/unix/ngx_shmem.c | 126 + release/src/router/nginx/src/os/unix/ngx_shmem.h | 29 + release/src/router/nginx/src/os/unix/ngx_socket.c | 116 + release/src/router/nginx/src/os/unix/ngx_socket.h | 64 + release/src/router/nginx/src/os/unix/ngx_solaris.h | 16 + .../router/nginx/src/os/unix/ngx_solaris_config.h | 109 + .../router/nginx/src/os/unix/ngx_solaris_init.c | 75 + .../src/os/unix/ngx_solaris_sendfilev_chain.c | 262 + .../router/nginx/src/os/unix/ngx_sunpro_amd64.il | 43 + .../nginx/src/os/unix/ngx_sunpro_atomic_sparc64.h | 61 + .../router/nginx/src/os/unix/ngx_sunpro_sparc64.il | 36 + .../src/router/nginx/src/os/unix/ngx_sunpro_x86.il | 44 + release/src/router/nginx/src/os/unix/ngx_thread.h | 128 + release/src/router/nginx/src/os/unix/ngx_time.c | 104 + release/src/router/nginx/src/os/unix/ngx_time.h | 66 + .../src/router/nginx/src/os/unix/ngx_udp_recv.c | 115 + release/src/router/nginx/src/os/unix/ngx_user.c | 108 + release/src/router/nginx/src/os/unix/ngx_user.h | 24 + .../router/nginx/src/os/unix/ngx_writev_chain.c | 185 + .../src/router/nginx/src/os/unix/rfork_thread.S | 73 + release/src/router/openssl/VMS/install.com | 79 - release/src/router/openssl/apps/install.com | 65 - release/src/router/openssl/apps/openssl | Bin 153792 -> 0 bytes release/src/router/openssl/crypto/aes/lib | 0 release/src/router/openssl/crypto/asn1/lib | 0 release/src/router/openssl/crypto/bf/lib | 0 release/src/router/openssl/crypto/bio/lib | 0 release/src/router/openssl/crypto/bn/bn-mips.s | 2177 ------- release/src/router/openssl/crypto/bn/lib | 0 release/src/router/openssl/crypto/buffer/lib | 0 release/src/router/openssl/crypto/buildinf.h | 6 - release/src/router/openssl/crypto/cast/lib | 0 release/src/router/openssl/crypto/cmac/lib | 0 release/src/router/openssl/crypto/comp/lib | 0 release/src/router/openssl/crypto/conf/lib | 0 release/src/router/openssl/crypto/des/lib | 0 release/src/router/openssl/crypto/dh/lib | 0 release/src/router/openssl/crypto/dsa/lib | 0 release/src/router/openssl/crypto/dso/lib | 0 release/src/router/openssl/crypto/engine/lib | 0 release/src/router/openssl/crypto/err/lib | 0 release/src/router/openssl/crypto/evp/lib | 0 release/src/router/openssl/crypto/hmac/lib | 0 release/src/router/openssl/crypto/idea/lib | 0 release/src/router/openssl/crypto/install.com | 150 - release/src/router/openssl/crypto/lhash/lib | 0 release/src/router/openssl/crypto/lib | 0 release/src/router/openssl/crypto/md4/lib | 0 release/src/router/openssl/crypto/md5/lib | 0 release/src/router/openssl/crypto/modes/lib | 0 release/src/router/openssl/crypto/objects/lib | 0 release/src/router/openssl/crypto/ocsp/lib | 0 release/src/router/openssl/crypto/pem/lib | 0 release/src/router/openssl/crypto/pkcs12/lib | 0 release/src/router/openssl/crypto/pkcs7/lib | 0 release/src/router/openssl/crypto/pqueue/lib | 0 release/src/router/openssl/crypto/rand/lib | 0 release/src/router/openssl/crypto/rc2/lib | 0 release/src/router/openssl/crypto/rc4/lib | 0 release/src/router/openssl/crypto/rc5/lib | 0 release/src/router/openssl/crypto/rsa/lib | 0 release/src/router/openssl/crypto/sha/lib | 0 release/src/router/openssl/crypto/srp/lib | 0 release/src/router/openssl/crypto/stack/lib | 0 release/src/router/openssl/crypto/txt_db/lib | 0 release/src/router/openssl/crypto/ui/lib | 0 release/src/router/openssl/crypto/whrlpool/lib | 0 release/src/router/openssl/crypto/x509/lib | 0 release/src/router/openssl/crypto/x509v3/lib | 0 release/src/router/openssl/libcrypto.pc | 12 - release/src/router/openssl/libcrypto.so.1.0.0 | Bin 1336264 -> 0 bytes release/src/router/openssl/libssl.pc | 12 - release/src/router/openssl/libssl.so.1.0.0 | Bin 329898 -> 0 bytes release/src/router/openssl/openssl.pc | 12 - release/src/router/openssl/ssl/install.com | 90 - release/src/router/openssl/ssl/lib | 0 release/src/router/openssl/stamp-h1 | 0 release/src/router/pptpd/.gitignore | 9 + release/src/router/pptpd/AUTHORS | 52 + release/src/router/pptpd/COPYING | 339 + release/src/router/pptpd/ChangeLog | 635 ++ release/src/router/pptpd/ChangeLog-0.8 | 196 + release/src/router/pptpd/ChangeLog-0.9 | 130 + release/src/router/pptpd/INSTALL | 188 + release/src/router/pptpd/Makefile.am | 109 + release/src/router/pptpd/NEWS | 121 + release/src/router/pptpd/README.portslave | 12 + release/src/router/pptpd/README.slirp | 29 + release/src/router/pptpd/autom4te.cache/output.0 | 6620 ++++++++++++++++++++ release/src/router/pptpd/autom4te.cache/output.1 | 6586 +++++++++++++++++++ release/src/router/pptpd/autom4te.cache/requests | 76 + release/src/router/pptpd/autom4te.cache/traces.0 | 514 ++ release/src/router/pptpd/autom4te.cache/traces.1 | 514 ++ release/src/router/pptpd/compat.c | 201 + release/src/router/pptpd/conf | 1 + release/src/router/pptpd/config.embed.h | 15 + release/src/router/pptpd/config.h.in | 188 + release/src/router/pptpd/configfile.h | 14 + release/src/router/pptpd/configure | 6620 ++++++++++++++++++++ release/src/router/pptpd/defaults.h | 81 + release/src/router/pptpd/getopt.c | 1064 ++++ release/src/router/pptpd/inststr.h | 17 + release/src/router/pptpd/mkinstalldirs | 40 + release/src/router/pptpd/our_getopt.h | 177 + release/src/router/pptpd/our_syslog.h | 44 + release/src/router/pptpd/plugins/Makefile | 34 + release/src/router/pptpd/plugins/patchlevel.h | 1 + release/src/router/pptpd/plugins/pppd.h | 1 + release/src/router/pptpd/plugins/pptpd-logwtmp.c | 66 + release/src/router/pptpd/ppphdlc.c | 96 + release/src/router/pptpd/ppphdlc.h | 17 + release/src/router/pptpd/pptpctrl.8 | 134 + release/src/router/pptpd/pptpctrl.c | 793 +++ release/src/router/pptpd/pptpd.8 | 194 + release/src/router/pptpd/pptpd.c | 867 +++ release/src/router/pptpd/pptpd.conf.5 | 238 + release/src/router/pptpd/pptpd.init | 58 + release/src/router/pptpd/pptpdefs.h | 324 + release/src/router/pptpd/pptpgre.h | 65 + release/src/router/pptpd/pptpmanager.h | 24 + release/src/router/pptpd/pqueue.c | 233 + release/src/router/pptpd/pqueue.h | 30 + release/src/router/pptpd/reconf | 61 + release/src/router/pptpd/samples/chap-secrets | 3 + release/src/router/pptpd/samples/options.pptpd | 108 + release/src/router/pptpd/samples/pptpd.conf | 80 + 473 files changed, 190430 insertions(+), 5817 deletions(-) delete mode 100644 release/src/router/glib/gmodule/ChangeLog delete mode 100644 release/src/router/libusb10/Makefile delete mode 100644 release/src/router/lzo/src/Makefile delete mode 100644 release/src/router/lzo/src/Makefile.am delete mode 100644 release/src/router/lzo/src/Makefile.in delete mode 100644 release/src/router/lzo/tests/Makefile delete mode 100644 release/src/router/lzo/tests/Makefile.am delete mode 100644 release/src/router/lzo/tests/Makefile.in create mode 100644 release/src/router/nginx/CHANGES create mode 100644 release/src/router/nginx/CHANGES.ru create mode 100644 release/src/router/nginx/LICENSE create mode 100644 release/src/router/nginx/README create mode 100644 release/src/router/nginx/auto/cc/acc create mode 100644 release/src/router/nginx/auto/cc/bcc create mode 100644 release/src/router/nginx/auto/cc/ccc create mode 100644 release/src/router/nginx/auto/cc/clang create mode 100644 release/src/router/nginx/auto/cc/conf create mode 100644 release/src/router/nginx/auto/cc/gcc create mode 100644 release/src/router/nginx/auto/cc/icc create mode 100644 release/src/router/nginx/auto/cc/msvc create mode 100644 release/src/router/nginx/auto/cc/name create mode 100644 release/src/router/nginx/auto/cc/owc create mode 100644 release/src/router/nginx/auto/cc/sunc create mode 100644 release/src/router/nginx/auto/define create mode 100644 release/src/router/nginx/auto/endianness create mode 100644 release/src/router/nginx/auto/feature create mode 100644 release/src/router/nginx/auto/have create mode 100644 release/src/router/nginx/auto/have_headers create mode 100644 release/src/router/nginx/auto/headers create mode 100644 release/src/router/nginx/auto/include create mode 100644 release/src/router/nginx/auto/init create mode 100644 release/src/router/nginx/auto/install create mode 100644 release/src/router/nginx/auto/lib/conf create mode 100644 release/src/router/nginx/auto/lib/geoip/conf create mode 100644 release/src/router/nginx/auto/lib/google-perftools/conf create mode 100644 release/src/router/nginx/auto/lib/libatomic/conf create mode 100644 release/src/router/nginx/auto/lib/libatomic/make create mode 100644 release/src/router/nginx/auto/lib/libgd/conf create mode 100644 release/src/router/nginx/auto/lib/libxslt/conf create mode 100644 release/src/router/nginx/auto/lib/make create mode 100644 release/src/router/nginx/auto/lib/md5/conf create mode 100644 release/src/router/nginx/auto/lib/md5/make create mode 100644 release/src/router/nginx/auto/lib/md5/makefile.bcc create mode 100644 release/src/router/nginx/auto/lib/md5/makefile.msvc create mode 100644 release/src/router/nginx/auto/lib/md5/makefile.owc create mode 100644 release/src/router/nginx/auto/lib/openssl/conf create mode 100644 release/src/router/nginx/auto/lib/openssl/make create mode 100644 release/src/router/nginx/auto/lib/openssl/makefile.bcc create mode 100644 release/src/router/nginx/auto/lib/openssl/makefile.msvc create mode 100644 release/src/router/nginx/auto/lib/pcre/conf create mode 100644 release/src/router/nginx/auto/lib/pcre/make create mode 100644 release/src/router/nginx/auto/lib/pcre/makefile.bcc create mode 100644 release/src/router/nginx/auto/lib/pcre/makefile.msvc create mode 100644 release/src/router/nginx/auto/lib/pcre/makefile.owc create mode 100644 release/src/router/nginx/auto/lib/perl/conf create mode 100644 release/src/router/nginx/auto/lib/perl/make create mode 100644 release/src/router/nginx/auto/lib/sha1/conf create mode 100644 release/src/router/nginx/auto/lib/sha1/make create mode 100644 release/src/router/nginx/auto/lib/sha1/makefile.bcc create mode 100644 release/src/router/nginx/auto/lib/sha1/makefile.msvc create mode 100644 release/src/router/nginx/auto/lib/sha1/makefile.owc create mode 100644 release/src/router/nginx/auto/lib/test create mode 100644 release/src/router/nginx/auto/lib/zlib/conf create mode 100644 release/src/router/nginx/auto/lib/zlib/make create mode 100644 release/src/router/nginx/auto/lib/zlib/makefile.bcc create mode 100644 release/src/router/nginx/auto/lib/zlib/makefile.msvc create mode 100644 release/src/router/nginx/auto/lib/zlib/makefile.owc create mode 100644 release/src/router/nginx/auto/lib/zlib/patch.zlib.h create mode 100644 release/src/router/nginx/auto/make create mode 100644 release/src/router/nginx/auto/modules create mode 100644 release/src/router/nginx/auto/nohave create mode 100644 release/src/router/nginx/auto/options create mode 100644 release/src/router/nginx/auto/os/conf create mode 100644 release/src/router/nginx/auto/os/darwin create mode 100644 release/src/router/nginx/auto/os/freebsd create mode 100644 release/src/router/nginx/auto/os/linux create mode 100644 release/src/router/nginx/auto/os/solaris create mode 100644 release/src/router/nginx/auto/os/win32 create mode 100644 release/src/router/nginx/auto/sources create mode 100644 release/src/router/nginx/auto/stubs create mode 100644 release/src/router/nginx/auto/summary create mode 100644 release/src/router/nginx/auto/types/sizeof create mode 100644 release/src/router/nginx/auto/types/typedef create mode 100644 release/src/router/nginx/auto/types/uintptr_t create mode 100644 release/src/router/nginx/auto/types/value create mode 100755 release/src/router/nginx/auto/unix create mode 100644 release/src/router/nginx/conf/fastcgi.conf create mode 100644 release/src/router/nginx/conf/fastcgi_params create mode 100644 release/src/router/nginx/conf/koi-utf create mode 100644 release/src/router/nginx/conf/koi-win create mode 100644 release/src/router/nginx/conf/mime.types create mode 100644 release/src/router/nginx/conf/nginx.conf create mode 100644 release/src/router/nginx/conf/scgi_params create mode 100644 release/src/router/nginx/conf/uwsgi_params create mode 100644 release/src/router/nginx/conf/win-utf create mode 100755 release/src/router/nginx/configure create mode 100644 release/src/router/nginx/contrib/README create mode 100644 release/src/router/nginx/contrib/geo2nginx.pl create mode 100644 release/src/router/nginx/contrib/unicode2nginx/koi-utf create mode 100755 release/src/router/nginx/contrib/unicode2nginx/unicode-to-nginx.pl create mode 100644 release/src/router/nginx/contrib/unicode2nginx/win-utf create mode 100644 release/src/router/nginx/html/50x.html create mode 100644 release/src/router/nginx/html/index.html create mode 100644 release/src/router/nginx/man/nginx.8 create mode 100644 release/src/router/nginx/src/core/nginx.c create mode 100644 release/src/router/nginx/src/core/nginx.h create mode 100644 release/src/router/nginx/src/core/ngx_array.c create mode 100644 release/src/router/nginx/src/core/ngx_array.h create mode 100644 release/src/router/nginx/src/core/ngx_buf.c create mode 100644 release/src/router/nginx/src/core/ngx_buf.h create mode 100644 release/src/router/nginx/src/core/ngx_conf_file.c create mode 100644 release/src/router/nginx/src/core/ngx_conf_file.h create mode 100644 release/src/router/nginx/src/core/ngx_config.h create mode 100644 release/src/router/nginx/src/core/ngx_connection.c create mode 100644 release/src/router/nginx/src/core/ngx_connection.h create mode 100644 release/src/router/nginx/src/core/ngx_core.h create mode 100644 release/src/router/nginx/src/core/ngx_cpuinfo.c create mode 100644 release/src/router/nginx/src/core/ngx_crc.h create mode 100644 release/src/router/nginx/src/core/ngx_crc32.c create mode 100644 release/src/router/nginx/src/core/ngx_crc32.h create mode 100644 release/src/router/nginx/src/core/ngx_crypt.c create mode 100644 release/src/router/nginx/src/core/ngx_crypt.h create mode 100644 release/src/router/nginx/src/core/ngx_cycle.c create mode 100644 release/src/router/nginx/src/core/ngx_cycle.h create mode 100644 release/src/router/nginx/src/core/ngx_file.c create mode 100644 release/src/router/nginx/src/core/ngx_file.h create mode 100644 release/src/router/nginx/src/core/ngx_hash.c create mode 100644 release/src/router/nginx/src/core/ngx_hash.h create mode 100644 release/src/router/nginx/src/core/ngx_inet.c create mode 100644 release/src/router/nginx/src/core/ngx_inet.h create mode 100644 release/src/router/nginx/src/core/ngx_list.c create mode 100644 release/src/router/nginx/src/core/ngx_list.h create mode 100644 release/src/router/nginx/src/core/ngx_log.c create mode 100644 release/src/router/nginx/src/core/ngx_log.h create mode 100644 release/src/router/nginx/src/core/ngx_md5.c create mode 100644 release/src/router/nginx/src/core/ngx_md5.h create mode 100644 release/src/router/nginx/src/core/ngx_murmurhash.c create mode 100644 release/src/router/nginx/src/core/ngx_murmurhash.h create mode 100644 release/src/router/nginx/src/core/ngx_open_file_cache.c create mode 100644 release/src/router/nginx/src/core/ngx_open_file_cache.h create mode 100644 release/src/router/nginx/src/core/ngx_output_chain.c create mode 100644 release/src/router/nginx/src/core/ngx_palloc.c create mode 100644 release/src/router/nginx/src/core/ngx_palloc.h create mode 100644 release/src/router/nginx/src/core/ngx_parse.c create mode 100644 release/src/router/nginx/src/core/ngx_parse.h create mode 100644 release/src/router/nginx/src/core/ngx_queue.c create mode 100644 release/src/router/nginx/src/core/ngx_queue.h create mode 100644 release/src/router/nginx/src/core/ngx_radix_tree.c create mode 100644 release/src/router/nginx/src/core/ngx_radix_tree.h create mode 100644 release/src/router/nginx/src/core/ngx_rbtree.c create mode 100644 release/src/router/nginx/src/core/ngx_rbtree.h create mode 100644 release/src/router/nginx/src/core/ngx_regex.c create mode 100644 release/src/router/nginx/src/core/ngx_regex.h create mode 100644 release/src/router/nginx/src/core/ngx_resolver.c create mode 100644 release/src/router/nginx/src/core/ngx_resolver.h create mode 100644 release/src/router/nginx/src/core/ngx_sha1.h create mode 100644 release/src/router/nginx/src/core/ngx_shmtx.c create mode 100644 release/src/router/nginx/src/core/ngx_shmtx.h create mode 100644 release/src/router/nginx/src/core/ngx_slab.c create mode 100644 release/src/router/nginx/src/core/ngx_slab.h create mode 100644 release/src/router/nginx/src/core/ngx_spinlock.c create mode 100644 release/src/router/nginx/src/core/ngx_string.c create mode 100644 release/src/router/nginx/src/core/ngx_string.h create mode 100644 release/src/router/nginx/src/core/ngx_times.c create mode 100644 release/src/router/nginx/src/core/ngx_times.h create mode 100644 release/src/router/nginx/src/event/modules/ngx_aio_module.c create mode 100644 release/src/router/nginx/src/event/modules/ngx_devpoll_module.c create mode 100644 release/src/router/nginx/src/event/modules/ngx_epoll_module.c create mode 100644 release/src/router/nginx/src/event/modules/ngx_eventport_module.c create mode 100644 release/src/router/nginx/src/event/modules/ngx_kqueue_module.c create mode 100644 release/src/router/nginx/src/event/modules/ngx_poll_module.c create mode 100644 release/src/router/nginx/src/event/modules/ngx_rtsig_module.c create mode 100644 release/src/router/nginx/src/event/modules/ngx_select_module.c create mode 100644 release/src/router/nginx/src/event/modules/ngx_win32_select_module.c create mode 100644 release/src/router/nginx/src/event/ngx_event.c create mode 100644 release/src/router/nginx/src/event/ngx_event.h create mode 100644 release/src/router/nginx/src/event/ngx_event_accept.c create mode 100644 release/src/router/nginx/src/event/ngx_event_busy_lock.c create mode 100644 release/src/router/nginx/src/event/ngx_event_busy_lock.h create mode 100644 release/src/router/nginx/src/event/ngx_event_connect.c create mode 100644 release/src/router/nginx/src/event/ngx_event_connect.h create mode 100644 release/src/router/nginx/src/event/ngx_event_mutex.c create mode 100644 release/src/router/nginx/src/event/ngx_event_openssl.c create mode 100644 release/src/router/nginx/src/event/ngx_event_openssl.h create mode 100644 release/src/router/nginx/src/event/ngx_event_openssl_stapling.c create mode 100644 release/src/router/nginx/src/event/ngx_event_pipe.c create mode 100644 release/src/router/nginx/src/event/ngx_event_pipe.h create mode 100644 release/src/router/nginx/src/event/ngx_event_posted.c create mode 100644 release/src/router/nginx/src/event/ngx_event_posted.h create mode 100644 release/src/router/nginx/src/event/ngx_event_timer.c create mode 100644 release/src/router/nginx/src/event/ngx_event_timer.h create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_access_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_addition_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_auth_basic_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_autoindex_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_browser_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_charset_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_chunked_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_dav_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_degradation_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_empty_gif_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_fastcgi_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_flv_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_geo_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_geoip_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_gunzip_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_gzip_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_gzip_static_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_headers_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_image_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_index_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_limit_conn_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_limit_req_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_log_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_map_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_memcached_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_mp4_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_not_modified_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_proxy_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_random_index_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_range_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_realip_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_referer_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_rewrite_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_scgi_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_secure_link_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_split_clients_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_ssi_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_ssi_filter_module.h create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_ssl_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_ssl_module.h create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_static_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_stub_status_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_sub_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_upstream_ip_hash_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_upstream_keepalive_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_upstream_least_conn_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_userid_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_uwsgi_module.c create mode 100644 release/src/router/nginx/src/http/modules/ngx_http_xslt_filter_module.c create mode 100644 release/src/router/nginx/src/http/modules/perl/Makefile.PL create mode 100644 release/src/router/nginx/src/http/modules/perl/nginx.pm create mode 100644 release/src/router/nginx/src/http/modules/perl/nginx.xs create mode 100644 release/src/router/nginx/src/http/modules/perl/ngx_http_perl_module.c create mode 100644 release/src/router/nginx/src/http/modules/perl/ngx_http_perl_module.h create mode 100644 release/src/router/nginx/src/http/modules/perl/typemap create mode 100644 release/src/router/nginx/src/http/ngx_http.c create mode 100644 release/src/router/nginx/src/http/ngx_http.h create mode 100644 release/src/router/nginx/src/http/ngx_http_busy_lock.c create mode 100644 release/src/router/nginx/src/http/ngx_http_busy_lock.h create mode 100644 release/src/router/nginx/src/http/ngx_http_cache.h create mode 100644 release/src/router/nginx/src/http/ngx_http_config.h create mode 100644 release/src/router/nginx/src/http/ngx_http_copy_filter_module.c create mode 100644 release/src/router/nginx/src/http/ngx_http_core_module.c create mode 100644 release/src/router/nginx/src/http/ngx_http_core_module.h create mode 100644 release/src/router/nginx/src/http/ngx_http_file_cache.c create mode 100644 release/src/router/nginx/src/http/ngx_http_header_filter_module.c create mode 100644 release/src/router/nginx/src/http/ngx_http_parse.c create mode 100644 release/src/router/nginx/src/http/ngx_http_parse_time.c create mode 100644 release/src/router/nginx/src/http/ngx_http_postpone_filter_module.c create mode 100644 release/src/router/nginx/src/http/ngx_http_request.c create mode 100644 release/src/router/nginx/src/http/ngx_http_request.h create mode 100644 release/src/router/nginx/src/http/ngx_http_request_body.c create mode 100644 release/src/router/nginx/src/http/ngx_http_script.c create mode 100644 release/src/router/nginx/src/http/ngx_http_script.h create mode 100644 release/src/router/nginx/src/http/ngx_http_spdy.c create mode 100644 release/src/router/nginx/src/http/ngx_http_spdy.h create mode 100644 release/src/router/nginx/src/http/ngx_http_spdy_filter_module.c create mode 100644 release/src/router/nginx/src/http/ngx_http_spdy_module.c create mode 100644 release/src/router/nginx/src/http/ngx_http_spdy_module.h create mode 100644 release/src/router/nginx/src/http/ngx_http_special_response.c create mode 100644 release/src/router/nginx/src/http/ngx_http_upstream.c create mode 100644 release/src/router/nginx/src/http/ngx_http_upstream.h create mode 100644 release/src/router/nginx/src/http/ngx_http_upstream_round_robin.c create mode 100644 release/src/router/nginx/src/http/ngx_http_upstream_round_robin.h create mode 100644 release/src/router/nginx/src/http/ngx_http_variables.c create mode 100644 release/src/router/nginx/src/http/ngx_http_variables.h create mode 100644 release/src/router/nginx/src/http/ngx_http_write_filter_module.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail.h create mode 100644 release/src/router/nginx/src/mail/ngx_mail_auth_http_module.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail_core_module.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail_handler.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail_imap_handler.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail_imap_module.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail_imap_module.h create mode 100644 release/src/router/nginx/src/mail/ngx_mail_parse.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail_pop3_handler.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail_pop3_module.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail_pop3_module.h create mode 100644 release/src/router/nginx/src/mail/ngx_mail_proxy_module.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail_smtp_handler.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail_smtp_module.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail_smtp_module.h create mode 100644 release/src/router/nginx/src/mail/ngx_mail_ssl_module.c create mode 100644 release/src/router/nginx/src/mail/ngx_mail_ssl_module.h create mode 100644 release/src/router/nginx/src/misc/ngx_cpp_test_module.cpp create mode 100644 release/src/router/nginx/src/misc/ngx_google_perftools_module.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_aio_read.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_aio_read_chain.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_aio_write.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_aio_write_chain.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_alloc.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_alloc.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_atomic.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_channel.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_channel.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_daemon.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_darwin.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_darwin_config.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_darwin_init.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_darwin_sendfile_chain.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_errno.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_errno.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_file_aio_read.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_files.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_files.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_freebsd.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_freebsd_config.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_freebsd_init.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_freebsd_rfork_thread.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_freebsd_rfork_thread.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_freebsd_sendfile_chain.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_gcc_atomic_amd64.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_gcc_atomic_ppc.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_gcc_atomic_sparc64.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_gcc_atomic_x86.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_linux.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_linux_aio_read.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_linux_config.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_linux_init.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_linux_sendfile_chain.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_os.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_posix_config.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_posix_init.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_process.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_process.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_process_cycle.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_process_cycle.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_pthread_thread.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_readv_chain.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_recv.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_send.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_setaffinity.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_setaffinity.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_setproctitle.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_setproctitle.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_shmem.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_shmem.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_socket.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_socket.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_solaris.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_solaris_config.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_solaris_init.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_solaris_sendfilev_chain.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_sunpro_amd64.il create mode 100644 release/src/router/nginx/src/os/unix/ngx_sunpro_atomic_sparc64.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_sunpro_sparc64.il create mode 100644 release/src/router/nginx/src/os/unix/ngx_sunpro_x86.il create mode 100644 release/src/router/nginx/src/os/unix/ngx_thread.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_time.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_time.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_udp_recv.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_user.c create mode 100644 release/src/router/nginx/src/os/unix/ngx_user.h create mode 100644 release/src/router/nginx/src/os/unix/ngx_writev_chain.c create mode 100644 release/src/router/nginx/src/os/unix/rfork_thread.S delete mode 100644 release/src/router/openssl/VMS/install.com delete mode 100644 release/src/router/openssl/apps/install.com delete mode 100755 release/src/router/openssl/apps/openssl delete mode 100644 release/src/router/openssl/crypto/aes/lib delete mode 100644 release/src/router/openssl/crypto/asn1/lib delete mode 100644 release/src/router/openssl/crypto/bf/lib delete mode 100644 release/src/router/openssl/crypto/bio/lib delete mode 100644 release/src/router/openssl/crypto/bn/bn-mips.s delete mode 100644 release/src/router/openssl/crypto/bn/lib delete mode 100644 release/src/router/openssl/crypto/buffer/lib delete mode 100644 release/src/router/openssl/crypto/buildinf.h delete mode 100644 release/src/router/openssl/crypto/cast/lib delete mode 100644 release/src/router/openssl/crypto/cmac/lib delete mode 100644 release/src/router/openssl/crypto/comp/lib delete mode 100644 release/src/router/openssl/crypto/conf/lib delete mode 100644 release/src/router/openssl/crypto/des/lib delete mode 100644 release/src/router/openssl/crypto/dh/lib delete mode 100644 release/src/router/openssl/crypto/dsa/lib delete mode 100644 release/src/router/openssl/crypto/dso/lib delete mode 100644 release/src/router/openssl/crypto/engine/lib delete mode 100644 release/src/router/openssl/crypto/err/lib delete mode 100644 release/src/router/openssl/crypto/evp/lib delete mode 100644 release/src/router/openssl/crypto/hmac/lib delete mode 100644 release/src/router/openssl/crypto/idea/lib delete mode 100644 release/src/router/openssl/crypto/install.com delete mode 100644 release/src/router/openssl/crypto/lhash/lib delete mode 100644 release/src/router/openssl/crypto/lib delete mode 100644 release/src/router/openssl/crypto/md4/lib delete mode 100644 release/src/router/openssl/crypto/md5/lib delete mode 100644 release/src/router/openssl/crypto/modes/lib delete mode 100644 release/src/router/openssl/crypto/objects/lib delete mode 100644 release/src/router/openssl/crypto/ocsp/lib delete mode 100644 release/src/router/openssl/crypto/pem/lib delete mode 100644 release/src/router/openssl/crypto/pkcs12/lib delete mode 100644 release/src/router/openssl/crypto/pkcs7/lib delete mode 100644 release/src/router/openssl/crypto/pqueue/lib delete mode 100644 release/src/router/openssl/crypto/rand/lib delete mode 100644 release/src/router/openssl/crypto/rc2/lib delete mode 100644 release/src/router/openssl/crypto/rc4/lib delete mode 100644 release/src/router/openssl/crypto/rc5/lib delete mode 100644 release/src/router/openssl/crypto/rsa/lib delete mode 100644 release/src/router/openssl/crypto/sha/lib delete mode 100644 release/src/router/openssl/crypto/srp/lib delete mode 100644 release/src/router/openssl/crypto/stack/lib delete mode 100644 release/src/router/openssl/crypto/txt_db/lib delete mode 100644 release/src/router/openssl/crypto/ui/lib delete mode 100644 release/src/router/openssl/crypto/whrlpool/lib delete mode 100644 release/src/router/openssl/crypto/x509/lib delete mode 100644 release/src/router/openssl/crypto/x509v3/lib delete mode 100644 release/src/router/openssl/libcrypto.pc delete mode 100755 release/src/router/openssl/libcrypto.so.1.0.0 delete mode 100644 release/src/router/openssl/libssl.pc delete mode 100755 release/src/router/openssl/libssl.so.1.0.0 delete mode 100644 release/src/router/openssl/openssl.pc delete mode 100644 release/src/router/openssl/ssl/install.com delete mode 100644 release/src/router/openssl/ssl/lib delete mode 100644 release/src/router/openssl/stamp-h1 create mode 100644 release/src/router/pptpd/.gitignore create mode 100644 release/src/router/pptpd/AUTHORS create mode 100644 release/src/router/pptpd/COPYING create mode 100644 release/src/router/pptpd/ChangeLog create mode 100644 release/src/router/pptpd/ChangeLog-0.8 create mode 100644 release/src/router/pptpd/ChangeLog-0.9 create mode 100644 release/src/router/pptpd/INSTALL create mode 100644 release/src/router/pptpd/Makefile.am create mode 100644 release/src/router/pptpd/NEWS create mode 100644 release/src/router/pptpd/README.portslave create mode 100644 release/src/router/pptpd/README.slirp create mode 100644 release/src/router/pptpd/autom4te.cache/output.0 create mode 100644 release/src/router/pptpd/autom4te.cache/output.1 create mode 100644 release/src/router/pptpd/autom4te.cache/requests create mode 100644 release/src/router/pptpd/autom4te.cache/traces.0 create mode 100644 release/src/router/pptpd/autom4te.cache/traces.1 create mode 100644 release/src/router/pptpd/compat.c create mode 100644 release/src/router/pptpd/conf create mode 100644 release/src/router/pptpd/config.embed.h create mode 100644 release/src/router/pptpd/config.h.in create mode 100644 release/src/router/pptpd/configfile.h create mode 100755 release/src/router/pptpd/configure create mode 100644 release/src/router/pptpd/defaults.h create mode 100644 release/src/router/pptpd/getopt.c create mode 100644 release/src/router/pptpd/inststr.h create mode 100644 release/src/router/pptpd/mkinstalldirs create mode 100644 release/src/router/pptpd/our_getopt.h create mode 100644 release/src/router/pptpd/our_syslog.h create mode 100644 release/src/router/pptpd/plugins/Makefile create mode 120000 release/src/router/pptpd/plugins/patchlevel.h create mode 120000 release/src/router/pptpd/plugins/pppd.h create mode 100644 release/src/router/pptpd/plugins/pptpd-logwtmp.c create mode 100644 release/src/router/pptpd/ppphdlc.c create mode 100644 release/src/router/pptpd/ppphdlc.h create mode 100644 release/src/router/pptpd/pptpctrl.8 create mode 100644 release/src/router/pptpd/pptpctrl.c create mode 100644 release/src/router/pptpd/pptpd.8 create mode 100644 release/src/router/pptpd/pptpd.c create mode 100644 release/src/router/pptpd/pptpd.conf.5 create mode 100644 release/src/router/pptpd/pptpd.init create mode 100644 release/src/router/pptpd/pptpdefs.h create mode 100644 release/src/router/pptpd/pptpgre.h create mode 100644 release/src/router/pptpd/pptpmanager.h create mode 100644 release/src/router/pptpd/pqueue.c create mode 100644 release/src/router/pptpd/pqueue.h create mode 100644 release/src/router/pptpd/reconf create mode 100644 release/src/router/pptpd/samples/chap-secrets create mode 100644 release/src/router/pptpd/samples/options.pptpd create mode 100644 release/src/router/pptpd/samples/pptpd.conf diff --git a/release/src/router/glib/gmodule/ChangeLog b/release/src/router/glib/gmodule/ChangeLog deleted file mode 100644 index d806882a5f..0000000000 --- a/release/src/router/glib/gmodule/ChangeLog +++ /dev/null @@ -1,236 +0,0 @@ -2001-03-07 Sebastian Wilhelmi - - * Makefile.am: Set G_LOG_DOMAIN to \"GModule\" instead of - g_log_domain_gmodule. - - * gmodule.c, gmodule.def, gmodule.h: Removed - g_log_domain_gmodule. This fixes Bug #51643 for good. - -Sat Feb 17 07:33:21 2001 Tim Janik - - * gmodule-dl.c: fix systems with broken RTLD_GLOBAL. - -2000-07-19 Sebastian Wilhelmi - - * gmodule.h: include glib.h before doing extern "C". Makes some - C++ compiler happy. Reported by Denis Vakatov - . - -Wed Mar 1 05:34:47 2000 Tim Janik - - * gmodule-beos.c (_g_module_symbol): do not return NULL symbols. - - * gmodule-os2.c: removed NetBSD specific defines. - (_g_module_self): set an error message for unsupported behaviour. - - * gmodule-beos.c: many coding style fixups. - (_g_module_open): - (_g_module_self): - (_g_module_close): - (_g_module_symbol): bunch of memory leaks plugged. - - * gmodule-dl.c: make sure the error message returned from dlerror() - is always != NULL, by using a wrapper function fetch_dlerror(). based - on a patch to fix _g_module_symbol() for NetBSD from Scott Presnell - . - - * gmodule-dld.c: minor indentation. - - * gmodule-win32.c: minor cleanups. - -Sat Feb 19 19:43:29 2000 Tim Janik - - * testgmodule.c (main): added test to check that not yet bound symbols - in shared libraries of the main module are retrievable, from David Gero. - - * gmodule-dld.c (_g_module_symbol): applied patch by David Gero - , so lookups for module_self also return - library symbols on AIX. - -Sat May 1 10:24:02 PDT 1999 Manish Singh - - * Makefile.am: use -avoid-version and -module for test plugins - -Fri Apr 23 09:03:48 1999 Tim Janik - - * gmodule.c (g_module_symbol): removed inline variable assignment. - s/CHECK_ERROR/SUPPORT_OR_RETURN/ to make the code more self descriptive. - -Wed Feb 10 12:06:30 1999 Tim Janik - - * gmodule.c (CHECK_ERROR): be more descriptive on unsupported systems. - -Wed Feb 10 07:56:33 1999 Tim Janik - - * gmodule.c (g_module_error): fixed errernerous code wrt to thread - specific error string allocation handling. - -Thu Jan 21 12:40:11 EST 1999 Jeff Garzik - - * gmodule-dl.c (_g_module_build_path): - Add braces to eliminate an ambiguous else warning. - -1999-01-16 Tor Lillqvist - - * gmodule-dl.c gmodule-dld.c: In - _g_module_build_path, don't add the "lib" prefix and - ".so" or ".sl" suffix if already there. - - * gmodule-win32.c: Likewise for the ".dll" suffix. - -1998-12-10 Sebastian Wilhelmi - - * gmodule.c: Made it MT safe, the g_module_error() is now thread - specific. - -Fri Nov 20 14:43:44 1998 Tim Janik - - * gmodule.c (_g_module_build_path): added empty default imlementation - so gmodule.so compiles on systems that are not yet supported, fix from - Erik Bagfors . - -1998-11-13 Nuno Ferreira - - * Makefile.am (INCLUDES): The previous commit message is wrong - about the -I$(top_srcdir) being redundant. I put it back. - -Wed Nov 11 23:23:22 EST 1998 Jeff Garzik - - * Makefile.am : INCLUDES is the right way to add to CFLAGS, not - DEFS. Also there are bugs with '+=' in makefiles. - Got rid of DEFS line by moving G_LOG_DOMAIN setting into INCLUDES. - Removed redundant -I from INCLUDES. - -Tue Oct 27 04:00:11 1998 Tim Janik - - * testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32, - this needs to be more constistent throughout the code, do we go for - NATIVE_WIN32 or WIN32? - - * gmodule.c (LibMain): special cased the #ifdef __LCC__ case for - NATIVE_WIN32, since lcc maybe used on other platforms as well. - * libgplugin_a.c (LibMain): - * libgplugin_b.c (LibMain): - likewise. not sure i like this special requirement for lcc in here. - - * gmodule-dl.c (_g_module_build_path): - feature empty "" directories and prepend the module name with "lib". - - * gmodule-dld.c (_g_module_build_path): - * gmodule-win32.c (_g_module_build_path): - feature empty "" directories. - - * we need some more magic in the _g_module_build_path variants - so we don't append/prepend lib and .so, .sl or .dll for those names - that already contain it. - - * applied patch from Tor Lillqvist for g_module_build_path() and - windows support. - -1998-10-20: Tor Lillqvist - - * gmodule/gmodule-win32.c: - New file. - - * gmodule/gmodule.c gmodule/gmodule.h: - Added the funcion g_module_build_path that builds the path to - a module file, decorating the name according to the system's - conventions. Added the Windows implementation. - - * gmodule/libgplugin_a.c gmodule/libgplugin_b.c: - Added LibMain for LCC-Win32. - - * gmodule/testgmodule.c: - Handle Windows dll names. - -1998-10-25 Raja R Harinath - - * gmodule.h: Remove `#pragma }'. - * gmoduleconf.h.in: Likewise. - -Wed Oct 21 19:58:27 1998 Tim Janik - - * gmodule.c (g_module_symbol): fixed a string pointer bug that could - cause garbage error messages from g_module_symbol() for systems that - NEED_USCORE. - -Mon Sep 21 01:54:48 1998 Tim Janik - - * gmodule.h: - * gmodule.c: renamed old _de_init functionality to _unload. - modules are now expected to export: - G_MODULE_EXPORT const gchar* g_module_check_init (GModule *module); - and - G_MODULE_EXPORT void g_module_unload (GModule *module); - returning a string other than NULL from g_module_check_init() will - prevent the module from being loaded. a call to g_module_make_resident() - from g_module_unload() will prevent the module from being unloaded and - still make it resident. - -Thu Sep 17 06:34:22 1998 Tim Janik - - * gmodule.h: - * gmodule.c: implemented g_module_make_resident() which can be - used to make modules resident. - fixed a buglet about the optional "g_module_de_init" function in - modules, which could get invoked twice on very obscure occasions. - -Tue Sep 15 14:57:30 1998 Owen Taylor - - * Makefile.am: Update to libtool-1.2b, - change library versioning scheme to drop LT_RELEASE - from the -l line, while keeping it in the soname. - -Thu Aug 20 07:08:16 1998 Tim Janik - - * gmodule.c: provide no operation implementation for the underlying - _g_module_* functions, so we at least compile on systems that have - neither of G_MODULE_IMPL_DL or G_MODULE_IMPL_DLD. - -Mon Aug 17 03:41:52 1998 Tim Janik - - * gmodule.h: - * gmodule.c (g_module_open): changed the return type for the - GModuleCheckInit function to be a string, describing the error - condition. - (g_module_symbol): show the failing symbol on error messages. - -Fri Aug 14 02:24:39 1998 Tim Janik - - * Makefile.am: feature the G_LOG_DOMAIN macro to set the log domain - to "GModule" upon compilation. we currently have to add this definition - to the DEFS variable. - * testgmodule.c: we need an ugly #undef G_LOG_DOMAIN at the start - of this file currently, since automake doesn't support per target - _CFLAGS yet. - -Mon Aug 10 03:35:57 1998 Tim Janik - - * gmodule.c: minor changes to internal interface. - * gmodule-dl.c: - * gmodule-dld.c: put some comments into the files, and provided - better error checking for shl_findsym(). whish i had a system to - test this stuff on. - -Mon Aug 10 02:18:31 1998 Tim Janik - - * Makefile.am (lib_LTLIBRARIES): for now, skip the dependency on - -lglib for libgmodule-1.1.la, libgplugin_a.la and libgplugin_b.la - since this clashes with inter-library-dependencies for not installed - libraries. glib-config takes care of this for the usuall case, but - there needs to be a better way... - -Sun Aug 9 15:57:38 1998 Tim Janik - - * testgmodule.c: test program for GModule. - * libgplugin_a.c: - * libgplugin_b.c: test plugins for testgmodule.c. - - * gmodule.h: - * gmodule.c: GModule library implementation, which is basically - a wrapper about system specifc dynamic loading facilities. - - -Sun Aug 9 10:31:05 1998 Tim Janik - - * ChangeLog start for gmodule. diff --git a/release/src/router/libusb10/Makefile b/release/src/router/libusb10/Makefile deleted file mode 100644 index df379495cc..0000000000 --- a/release/src/router/libusb10/Makefile +++ /dev/null @@ -1,757 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# Makefile. Generated from Makefile.in by configure. - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - - - -pkgdatadir = $(datadir)/libusb -pkgincludedir = $(includedir)/libusb -pkglibdir = $(libdir)/libusb -pkglibexecdir = $(libexecdir)/libusb -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = x86_64-pc-linux-gnu -host_triplet = mipsel-unknown-linux-gnu -#am__append_1 = examples -subdir = . -DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(srcdir)/config.h.in \ - $(srcdir)/libusb-1.0.pc.in $(top_srcdir)/configure AUTHORS \ - COPYING ChangeLog INSTALL NEWS THANKS TODO compile \ - config.guess config.sub depcomp install-sh ltmain.sh missing -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno config.status.lineno -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = libusb-1.0.pc -CONFIG_CLEAN_VPATH_FILES = -AM_V_GEN = $(am__v_GEN_$(V)) -am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) -am__v_GEN_0 = @echo " GEN " $@; -AM_V_at = $(am__v_at_$(V)) -am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) -am__v_at_0 = @ -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(pkgconfigdir)" -DATA = $(pkgconfig_DATA) -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ - distdir dist dist-all distcheck -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = libusb doc examples -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - { test ! -d "$(distdir)" \ - || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr "$(distdir)"; }; } -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -GZIP_ENV = --best -DIST_ARCHIVES = $(distdir).tar.bz2 -distuninstallcheck_listfiles = find . -type f -print -distcleancheck_listfiles = find . -type f -print -ACLOCAL = ${SHELL} /home/vicente/tomato/release/src/router/libusb10/missing --run aclocal-1.11 -AMTAR = ${SHELL} /home/vicente/tomato/release/src/router/libusb10/missing --run tar -AM_CFLAGS = -std=gnu99 -fgnu89-inline -Wall -Wundef -Wunused -Wstrict-prototypes -Werror-implicit-function-declaration -Wno-pointer-sign -Wshadow -AM_DEFAULT_VERBOSITY = 0 -AM_LDFLAGS = -AR = mipsel-uclibc-ar -AUTOCONF = ${SHELL} /home/vicente/tomato/release/src/router/libusb10/missing --run autoconf -AUTOHEADER = ${SHELL} /home/vicente/tomato/release/src/router/libusb10/missing --run autoheader -AUTOMAKE = ${SHELL} /home/vicente/tomato/release/src/router/libusb10/missing --run automake-1.11 -AWK = gawk -CC = mipsel-uclibc-gcc -CCDEPMODE = depmode=gcc3 -CFLAGS = -Os -Wall -DLINUX26 -DCONFIG_BCMWL5 -pipe -DBCMWPA2 -funit-at-a-time -Wno-pointer-sign -mtune=mips32 -mips32 -CPP = mipsel-uclibc-gcc -E -CPPFLAGS = -CYGPATH_W = echo -DEFS = -DHAVE_CONFIG_H -DEPDIR = .deps -DSYMUTIL = -DUMPBIN = -ECHO_C = -ECHO_N = -n -ECHO_T = -EGREP = /bin/grep -E -EXEEXT = -FGREP = /bin/grep -F -GREP = /bin/grep -INSTALL = /usr/bin/install -c -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_PROGRAM = ${INSTALL} -INSTALL_SCRIPT = ${INSTALL} -INSTALL_STRIP_PROGRAM = $(install_sh) -c -s -LD = mipsel-uclibc-ld -LDFLAGS = -LIBOBJS = -LIBS = -lpthread -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LIPO = -LN_S = ln -s -LTLIBOBJS = -MAKEINFO = ${SHELL} /home/vicente/tomato/release/src/router/libusb10/missing --run makeinfo -MKDIR_P = /bin/mkdir -p -NM = mipsel-uclibc-nm -NMEDIT = -OBJDUMP = mipsel-linux-objdump -OBJEXT = o -OS_DARWIN = -OS_LINUX = -OTOOL = -OTOOL64 = -PACKAGE = libusb -PACKAGE_BUGREPORT = -PACKAGE_NAME = libusb -PACKAGE_STRING = libusb 1.0.8 -PACKAGE_TARNAME = libusb -PACKAGE_URL = -PACKAGE_VERSION = 1.0.8 -PATH_SEPARATOR = : -RANLIB = mipsel-uclibc-ranlib -SED = /bin/sed -SET_MAKE = -SHELL = /bin/sh -STRIP = mipsel-uclibc-strip -R .note -R .comment -VERSION = 1.0.8 -VISIBILITY_CFLAGS = -fvisibility=hidden -abs_builddir = /home/vicente/tomato/release/src/router/libusb10 -abs_srcdir = /home/vicente/tomato/release/src/router/libusb10 -abs_top_builddir = /home/vicente/tomato/release/src/router/libusb10 -abs_top_srcdir = /home/vicente/tomato/release/src/router/libusb10 -ac_ct_CC = -ac_ct_DUMPBIN = -am__include = include -am__leading_dot = . -am__quote = -am__tar = ${AMTAR} chof - "$$tardir" -am__untar = ${AMTAR} xf - -bindir = ${exec_prefix}/bin -build = x86_64-pc-linux-gnu -build_alias = x86_64-linux-gnu -build_cpu = x86_64 -build_os = linux-gnu -build_vendor = pc -builddir = . -datadir = ${datarootdir} -datarootdir = ${prefix}/share -docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} -dvidir = ${docdir} -exec_prefix = ${prefix} -host = mipsel-unknown-linux-gnu -host_alias = mipsel-linux -host_cpu = mipsel -host_os = linux-gnu -host_vendor = unknown -htmldir = ${docdir} -includedir = ${prefix}/include -infodir = ${datarootdir}/info -install_sh = ${SHELL} /home/vicente/tomato/release/src/router/libusb10/install-sh -libdir = ${exec_prefix}/lib -libexecdir = ${exec_prefix}/libexec -localedir = ${datarootdir}/locale -localstatedir = ${prefix}/var -lt_ECHO = echo -lt_age = 0 -lt_major = 0 -lt_revision = 0 -mandir = ${datarootdir}/man -mkdir_p = /bin/mkdir -p -oldincludedir = /usr/include -pdfdir = ${docdir} -prefix = /usr -program_transform_name = s,x,x, -psdir = ${docdir} -sbindir = ${exec_prefix}/sbin -sharedstatedir = ${prefix}/com -srcdir = . -sysconfdir = ${prefix}/etc -target_alias = -top_build_prefix = -top_builddir = . -top_srcdir = . -AUTOMAKE_OPTIONS = dist-bzip2 no-dist-gzip -ACLOCAL_AMFLAGS = -I m4 -DISTCLEANFILES = ChangeLog libusb-1.0.pc -EXTRA_DIST = TODO PORTING -SUBDIRS = libusb doc $(am__append_1) -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libusb-1.0.pc -reldir = .release/$(distdir) -all: config.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -.SUFFIXES: -am--refresh: - @: -.PRECIOUS: Makefile - -distclean-hdr: - -rm -f config.h stamp-h1 -libusb-1.0.pc: $(top_builddir)/config.status $(srcdir)/libusb-1.0.pc.in - cd $(top_builddir) && $(SHELL) ./config.status $@ - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool config.lt -install-pkgconfigDATA: $(pkgconfig_DATA) - @$(NORMAL_INSTALL) - test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ - done - -uninstall-pkgconfigDATA: - @$(NORMAL_UNINSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - $(am__remove_distdir) - test -d "$(distdir)" || mkdir "$(distdir)" - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook - -test -n "$(am__skip_mode_fix)" \ - || find "$(distdir)" -type d ! -perm -755 \ - -exec chmod u+rwx,go+rx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r "$(distdir)" -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) - -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__remove_distdir) - -dist-xz: distdir - tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz - $(am__remove_distdir) - -dist-tarZ: distdir - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) - -dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) - -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ - *.tar.xz*) \ - xz -dc $(distdir).tar.xz | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir); chmod a+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst - chmod a-w $(distdir) - test -d $(distdir)/_build || exit 0; \ - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ - && cd "$$am__cwd" \ - || exit 1 - $(am__remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' -distuninstallcheck: - @$(am__cd) '$(distuninstallcheck_dir)' \ - && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 -check-am: all-am -check: check-recursive -all-am: Makefile $(DATA) config.h -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-hdr \ - distclean-libtool distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: install-pkgconfigDATA - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-pkgconfigDATA - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ - ctags-recursive install-am install-strip tags-recursive - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am clean clean-generic \ - clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ - dist-gzip dist-hook dist-lzma dist-shar dist-tarZ dist-xz \ - dist-zip distcheck distclean distclean-generic distclean-hdr \ - distclean-libtool distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-pkgconfigDATA install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-pkgconfigDATA - - -.PHONY: ChangeLog dist-up -ChangeLog: - git --git-dir $(top_srcdir)/.git log > ChangeLog || touch ChangeLog - -dist-hook: ChangeLog -dist-up: dist - rm -rf $(reldir) - mkdir -p $(reldir) - cp $(distdir).tar.bz2 $(reldir) - rsync -rv $(reldir) dsd_,libusb@frs.sourceforge.net:/home/frs/project/l/li/libusb/libusb-1.0/ - rm -rf $(reldir) - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/release/src/router/lzo/src/Makefile b/release/src/router/lzo/src/Makefile deleted file mode 100644 index e648f541d0..0000000000 --- a/release/src/router/lzo/src/Makefile +++ /dev/null @@ -1,600 +0,0 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. -# src/Makefile. Generated from Makefile.in by configure. - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - - -# -# Copyright (C) 1996-2008 Markus F.X.J. Oberhumer -# - -srcdir = . -top_srcdir = .. -pkgdatadir = $(datadir)/lzo -pkglibdir = $(libdir)/lzo -pkgincludedir = $(includedir)/lzo -top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = /usr/bin/install -c -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = i686-pc-linux-gnu -host_triplet = mipsel-unknown-linux-gnu -target_triplet = mipsel-unknown-linux-gnu -subdir = src -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/autoconf/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -am__installdirs = "$(DESTDIR)$(libdir)" -libLTLIBRARIES_INSTALL = $(INSTALL) -LTLIBRARIES = $(lib_LTLIBRARIES) -#am__DEPENDENCIES_1 = lzo1c_s1.lo lzo1c_s2.lo \ -# lzo1f_f1.lo lzo1f_f2.lo lzo1x_f1.lo \ -# lzo1x_f2.lo lzo1x_s1.lo lzo1x_s2.lo \ -# lzo1y_f1.lo lzo1y_f2.lo lzo1y_s1.lo \ -# lzo1y_s2.lo -am_liblzo2_la_OBJECTS = lzo_crc.lo lzo_init.lo lzo_ptr.lo lzo_str.lo \ - lzo_util.lo lzo1.lo lzo1_99.lo lzo1a.lo lzo1a_99.lo lzo1b_1.lo \ - lzo1b_2.lo lzo1b_3.lo lzo1b_4.lo lzo1b_5.lo lzo1b_6.lo \ - lzo1b_7.lo lzo1b_8.lo lzo1b_9.lo lzo1b_99.lo lzo1b_9x.lo \ - lzo1b_cc.lo lzo1b_d1.lo lzo1b_d2.lo lzo1b_rr.lo lzo1b_xx.lo \ - lzo1c_1.lo lzo1c_2.lo lzo1c_3.lo lzo1c_4.lo lzo1c_5.lo \ - lzo1c_6.lo lzo1c_7.lo lzo1c_8.lo lzo1c_9.lo lzo1c_99.lo \ - lzo1c_9x.lo lzo1c_cc.lo lzo1c_d1.lo lzo1c_d2.lo lzo1c_rr.lo \ - lzo1c_xx.lo lzo1f_1.lo lzo1f_9x.lo lzo1f_d1.lo lzo1f_d2.lo \ - lzo1x_1.lo lzo1x_9x.lo lzo1x_d1.lo lzo1x_d2.lo lzo1x_d3.lo \ - lzo1x_o.lo lzo1x_1k.lo lzo1x_1l.lo lzo1x_1o.lo lzo1y_1.lo \ - lzo1y_9x.lo lzo1y_d1.lo lzo1y_d2.lo lzo1y_d3.lo lzo1y_o.lo \ - lzo1z_9x.lo lzo1z_d1.lo lzo1z_d2.lo lzo1z_d3.lo lzo2a_9x.lo \ - lzo2a_d1.lo lzo2a_d2.lo -liblzo2_la_OBJECTS = $(am_liblzo2_la_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/autoconf/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(liblzo2_la_SOURCES) -DIST_SOURCES = $(liblzo2_la_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -VPATH = -ACLOCAL = ${SHELL} /home/keith/firmware/release/src/router/lzo/autoconf/missing --run aclocal-1.9 -AMDEP_FALSE = # -AMDEP_TRUE = -AMTAR = ${SHELL} /home/keith/firmware/release/src/router/lzo/autoconf/missing --run tar -AR = mipsel-uclibc-ar -AUTOCONF = ${SHELL} /home/keith/firmware/release/src/router/lzo/autoconf/missing --run autoconf -AUTOHEADER = ${SHELL} /home/keith/firmware/release/src/router/lzo/autoconf/missing --run autoheader -AUTOMAKE = ${SHELL} /home/keith/firmware/release/src/router/lzo/autoconf/missing --run automake-1.9 -AWK = mawk -CC = mipsel-uclibc-gcc -CCDEPMODE = depmode=gcc3 -CFLAGS = $(LZO_CFLAGS) $(configure_CFLAGS) $(LZO_EXTRA_CFLAGS) -CPP = mipsel-uclibc-gcc -E -CPPFLAGS = $(LZO_CPPFLAGS) $(configure_CPPFLAGS) $(LZO_EXTRA_CPPFLAGS) -CXX = mipsel-linux-g++ -CXXCPP = mipsel-linux-g++ -E -CXXDEPMODE = depmode=gcc3 -CXXFLAGS = -g -O2 -CYGPATH_W = echo -DEFS = -DHAVE_CONFIG_H -DEPDIR = .deps -ECHO = echo -ECHO_C = -ECHO_N = -n -ECHO_T = -EGREP = grep -E -EXEEXT = -F77 = -FFLAGS = -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_PROGRAM = ${INSTALL} -INSTALL_SCRIPT = ${INSTALL} -INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s -LDFLAGS = -LIBOBJS = -LIBS = -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LN_S = ln -s -LTLIBOBJS = -LZO_ASM_VPATH = -LZO_CFLAGS = -LZO_CPPFLAGS = -LZO_EXTRA_CFLAGS = -LZO_EXTRA_CPPFLAGS = -LZO_USE_ASM_FALSE = -LZO_USE_ASM_TRUE = # -MAINT = # -MAINTAINER_MODE_FALSE = -MAINTAINER_MODE_TRUE = # -MAKEINFO = ${SHELL} /home/keith/firmware/release/src/router/lzo/autoconf/missing --run makeinfo -OBJEXT = o -PACKAGE = lzo -PACKAGE_BUGREPORT = markus@oberhumer.com -PACKAGE_NAME = lzo -PACKAGE_STRING = lzo 2.03 -PACKAGE_TARNAME = lzo -PACKAGE_VERSION = 2.03 -PATH_SEPARATOR = : -RANLIB = mipsel-uclibc-ranlib -SET_MAKE = -SHELL = /bin/sh -STRIP = mipsel-uclibc-strip -VERSION = 2.03 -ac_ct_AR = -ac_ct_CC = -ac_ct_CXX = -ac_ct_F77 = -ac_ct_RANLIB = -ac_ct_STRIP = -am__fastdepCC_FALSE = # -am__fastdepCC_TRUE = -am__fastdepCXX_FALSE = # -am__fastdepCXX_TRUE = -am__include = include -am__leading_dot = . -am__quote = -am__tar = ${AMTAR} chof - "$$tardir" -am__untar = ${AMTAR} xf - -bindir = ${exec_prefix}/bin -build = i686-pc-linux-gnu -build_alias = -build_cpu = i686 -build_os = linux-gnu -build_vendor = pc -configure_CFLAGS = -mips2 -O3 -Wall -configure_CPPFLAGS = -DLZO_HAVE_CONFIG_H -datadir = ${prefix}/share -exec_prefix = ${prefix} -host = mipsel-unknown-linux-gnu -host_alias = mipsel-linux -host_cpu = mipsel -host_os = linux-gnu -host_vendor = unknown -includedir = ${prefix}/include -infodir = ${prefix}/info -install_sh = /home/keith/firmware/release/src/router/lzo/autoconf/install-sh -libdir = ${exec_prefix}/lib -libexecdir = ${exec_prefix}/libexec -localstatedir = ${prefix}/var -mandir = ${prefix}/man -mkdir_p = mkdir -p -- -oldincludedir = /usr/include -prefix = /usr/local -program_transform_name = s,x,x, -sbindir = ${exec_prefix}/sbin -sharedstatedir = ${prefix}/com -sysconfdir = ${prefix}/etc -target = mipsel-unknown-linux-gnu -target_alias = -target_cpu = mipsel -target_os = linux-gnu -target_vendor = unknown -SUFFIXES = .S -INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir) -lib_LTLIBRARIES = liblzo2.la -liblzo2_la_LDFLAGS = -version-info 2:0:0 -liblzo2_la_SOURCES = \ - lzo_crc.c lzo_init.c lzo_ptr.c lzo_str.c lzo_util.c \ - lzo1.c lzo1_99.c \ - lzo1a.c lzo1a_99.c \ - lzo1b_1.c lzo1b_2.c lzo1b_3.c lzo1b_4.c lzo1b_5.c lzo1b_6.c \ - lzo1b_7.c lzo1b_8.c lzo1b_9.c lzo1b_99.c lzo1b_9x.c \ - lzo1b_cc.c lzo1b_d1.c lzo1b_d2.c lzo1b_rr.c lzo1b_xx.c \ - lzo1c_1.c lzo1c_2.c lzo1c_3.c lzo1c_4.c lzo1c_5.c lzo1c_6.c \ - lzo1c_7.c lzo1c_8.c lzo1c_9.c lzo1c_99.c lzo1c_9x.c \ - lzo1c_cc.c lzo1c_d1.c lzo1c_d2.c lzo1c_rr.c lzo1c_xx.c \ - lzo1f_1.c lzo1f_9x.c lzo1f_d1.c lzo1f_d2.c \ - lzo1x_1.c lzo1x_9x.c lzo1x_d1.c lzo1x_d2.c lzo1x_d3.c \ - lzo1x_o.c lzo1x_1k.c lzo1x_1l.c lzo1x_1o.c \ - lzo1y_1.c lzo1y_9x.c lzo1y_d1.c lzo1y_d2.c lzo1y_d3.c lzo1y_o.c \ - lzo1z_9x.c lzo1z_d1.c lzo1z_d2.c lzo1z_d3.c \ - lzo2a_9x.c lzo2a_d1.c lzo2a_d2.c - -EXTRA_DIST = \ - lzo1_cm.ch lzo1_d.ch lzo1a_cm.ch lzo1a_cr.ch lzo1b_c.ch \ - lzo1b_cm.ch lzo1b_cr.ch lzo1b_d.ch lzo1b_r.ch \ - lzo1b_sm.ch lzo1b_tm.ch lzo1f_d.ch lzo1x_c.ch \ - lzo1x_d.ch lzo1x_oo.ch lzo2a_d.ch \ - lzo_dll.ch lzo_mchw.ch lzo_swd.ch \ - compr1b.h compr1c.h config1.h config1a.h config1b.h config1c.h \ - config1f.h config1x.h config1y.h config1z.h config2a.h \ - lzo1a_de.h lzo1b_cc.h lzo1b_de.h lzo1c_cc.h lzo_conf.h lzo_dict.h \ - lzo_ptr.h stats1a.h stats1b.h stats1c.h miniacc.h - -liblzo2_la_LIBADD = $(LZO_ASM_OBJECTS) -liblzo2_la_DEPENDENCIES = $(liblzo2_la_LIBADD) - -# /*********************************************************************** -# // assembler support -# ************************************************************************/ -#LZO_ASM_OBJECTS = \ -# lzo1c_s1.lo lzo1c_s2.lo \ -# lzo1f_f1.lo lzo1f_f2.lo \ -# lzo1x_f1.lo lzo1x_f2.lo lzo1x_s1.lo lzo1x_s2.lo \ -# lzo1y_f1.lo lzo1y_f2.lo lzo1y_s1.lo lzo1y_s2.lo - -all: all-am - -.SUFFIXES: -.SUFFIXES: .S .c .lo .o .obj -$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: # $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): # $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - if test -f $$p; then \ - f=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ - else :; fi; \ - done - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - p=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ - $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ - done - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -liblzo2.la: $(liblzo2_la_OBJECTS) $(liblzo2_la_DEPENDENCIES) - $(LINK) -rpath $(libdir) $(liblzo2_la_LDFLAGS) $(liblzo2_la_OBJECTS) $(liblzo2_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -include ./$(DEPDIR)/lzo1.Plo -include ./$(DEPDIR)/lzo1_99.Plo -include ./$(DEPDIR)/lzo1a.Plo -include ./$(DEPDIR)/lzo1a_99.Plo -include ./$(DEPDIR)/lzo1b_1.Plo -include ./$(DEPDIR)/lzo1b_2.Plo -include ./$(DEPDIR)/lzo1b_3.Plo -include ./$(DEPDIR)/lzo1b_4.Plo -include ./$(DEPDIR)/lzo1b_5.Plo -include ./$(DEPDIR)/lzo1b_6.Plo -include ./$(DEPDIR)/lzo1b_7.Plo -include ./$(DEPDIR)/lzo1b_8.Plo -include ./$(DEPDIR)/lzo1b_9.Plo -include ./$(DEPDIR)/lzo1b_99.Plo -include ./$(DEPDIR)/lzo1b_9x.Plo -include ./$(DEPDIR)/lzo1b_cc.Plo -include ./$(DEPDIR)/lzo1b_d1.Plo -include ./$(DEPDIR)/lzo1b_d2.Plo -include ./$(DEPDIR)/lzo1b_rr.Plo -include ./$(DEPDIR)/lzo1b_xx.Plo -include ./$(DEPDIR)/lzo1c_1.Plo -include ./$(DEPDIR)/lzo1c_2.Plo -include ./$(DEPDIR)/lzo1c_3.Plo -include ./$(DEPDIR)/lzo1c_4.Plo -include ./$(DEPDIR)/lzo1c_5.Plo -include ./$(DEPDIR)/lzo1c_6.Plo -include ./$(DEPDIR)/lzo1c_7.Plo -include ./$(DEPDIR)/lzo1c_8.Plo -include ./$(DEPDIR)/lzo1c_9.Plo -include ./$(DEPDIR)/lzo1c_99.Plo -include ./$(DEPDIR)/lzo1c_9x.Plo -include ./$(DEPDIR)/lzo1c_cc.Plo -include ./$(DEPDIR)/lzo1c_d1.Plo -include ./$(DEPDIR)/lzo1c_d2.Plo -include ./$(DEPDIR)/lzo1c_rr.Plo -include ./$(DEPDIR)/lzo1c_xx.Plo -include ./$(DEPDIR)/lzo1f_1.Plo -include ./$(DEPDIR)/lzo1f_9x.Plo -include ./$(DEPDIR)/lzo1f_d1.Plo -include ./$(DEPDIR)/lzo1f_d2.Plo -include ./$(DEPDIR)/lzo1x_1.Plo -include ./$(DEPDIR)/lzo1x_1k.Plo -include ./$(DEPDIR)/lzo1x_1l.Plo -include ./$(DEPDIR)/lzo1x_1o.Plo -include ./$(DEPDIR)/lzo1x_9x.Plo -include ./$(DEPDIR)/lzo1x_d1.Plo -include ./$(DEPDIR)/lzo1x_d2.Plo -include ./$(DEPDIR)/lzo1x_d3.Plo -include ./$(DEPDIR)/lzo1x_o.Plo -include ./$(DEPDIR)/lzo1y_1.Plo -include ./$(DEPDIR)/lzo1y_9x.Plo -include ./$(DEPDIR)/lzo1y_d1.Plo -include ./$(DEPDIR)/lzo1y_d2.Plo -include ./$(DEPDIR)/lzo1y_d3.Plo -include ./$(DEPDIR)/lzo1y_o.Plo -include ./$(DEPDIR)/lzo1z_9x.Plo -include ./$(DEPDIR)/lzo1z_d1.Plo -include ./$(DEPDIR)/lzo1z_d2.Plo -include ./$(DEPDIR)/lzo1z_d3.Plo -include ./$(DEPDIR)/lzo2a_9x.Plo -include ./$(DEPDIR)/lzo2a_d1.Plo -include ./$(DEPDIR)/lzo2a_d2.Plo -include ./$(DEPDIR)/lzo_crc.Plo -include ./$(DEPDIR)/lzo_init.Plo -include ./$(DEPDIR)/lzo_ptr.Plo -include ./$(DEPDIR)/lzo_str.Plo -include ./$(DEPDIR)/lzo_util.Plo - -.c.o: - if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ - then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -# source='$<' object='$@' libtool=no \ -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ -# $(COMPILE) -c $< - -.c.obj: - if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ - then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -# source='$<' object='$@' libtool=no \ -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ -# $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: - if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ - then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -# source='$<' object='$@' libtool=yes \ -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ -# $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LTLIBRARIES) -installdirs: - for dir in "$(DESTDIR)$(libdir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: install-libLTLIBRARIES - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libtool ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am \ - install-libLTLIBRARIES install-man install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-info-am \ - uninstall-libLTLIBRARIES - - -#.S.o: -# $(CC) -c $< - -#.S.lo: -# $(LIBTOOL) --mode=compile $(CC) -c $< -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/release/src/router/lzo/src/Makefile.am b/release/src/router/lzo/src/Makefile.am deleted file mode 100644 index e5f6ca0188..0000000000 --- a/release/src/router/lzo/src/Makefile.am +++ /dev/null @@ -1,68 +0,0 @@ -## Process this file with automake to create Makefile.in -# -# Copyright (C) 1996-2008 Markus F.X.J. Oberhumer -# - -VPATH = @srcdir@@LZO_ASM_VPATH@ -SUFFIXES = .S - -INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir) -CPPFLAGS = $(LZO_CPPFLAGS) $(configure_CPPFLAGS) $(LZO_EXTRA_CPPFLAGS) -CFLAGS = $(LZO_CFLAGS) $(configure_CFLAGS) $(LZO_EXTRA_CFLAGS) - -lib_LTLIBRARIES = liblzo2.la - -liblzo2_la_LDFLAGS = -version-info 2:0:0 - -liblzo2_la_SOURCES = \ - lzo_crc.c lzo_init.c lzo_ptr.c lzo_str.c lzo_util.c \ - lzo1.c lzo1_99.c \ - lzo1a.c lzo1a_99.c \ - lzo1b_1.c lzo1b_2.c lzo1b_3.c lzo1b_4.c lzo1b_5.c lzo1b_6.c \ - lzo1b_7.c lzo1b_8.c lzo1b_9.c lzo1b_99.c lzo1b_9x.c \ - lzo1b_cc.c lzo1b_d1.c lzo1b_d2.c lzo1b_rr.c lzo1b_xx.c \ - lzo1c_1.c lzo1c_2.c lzo1c_3.c lzo1c_4.c lzo1c_5.c lzo1c_6.c \ - lzo1c_7.c lzo1c_8.c lzo1c_9.c lzo1c_99.c lzo1c_9x.c \ - lzo1c_cc.c lzo1c_d1.c lzo1c_d2.c lzo1c_rr.c lzo1c_xx.c \ - lzo1f_1.c lzo1f_9x.c lzo1f_d1.c lzo1f_d2.c \ - lzo1x_1.c lzo1x_9x.c lzo1x_d1.c lzo1x_d2.c lzo1x_d3.c \ - lzo1x_o.c lzo1x_1k.c lzo1x_1l.c lzo1x_1o.c \ - lzo1y_1.c lzo1y_9x.c lzo1y_d1.c lzo1y_d2.c lzo1y_d3.c lzo1y_o.c \ - lzo1z_9x.c lzo1z_d1.c lzo1z_d2.c lzo1z_d3.c \ - lzo2a_9x.c lzo2a_d1.c lzo2a_d2.c - -EXTRA_DIST = \ - lzo1_cm.ch lzo1_d.ch lzo1a_cm.ch lzo1a_cr.ch lzo1b_c.ch \ - lzo1b_cm.ch lzo1b_cr.ch lzo1b_d.ch lzo1b_r.ch \ - lzo1b_sm.ch lzo1b_tm.ch lzo1f_d.ch lzo1x_c.ch \ - lzo1x_d.ch lzo1x_oo.ch lzo2a_d.ch \ - lzo_dll.ch lzo_mchw.ch lzo_swd.ch \ - compr1b.h compr1c.h config1.h config1a.h config1b.h config1c.h \ - config1f.h config1x.h config1y.h config1z.h config2a.h \ - lzo1a_de.h lzo1b_cc.h lzo1b_de.h lzo1c_cc.h lzo_conf.h lzo_dict.h \ - lzo_ptr.h stats1a.h stats1b.h stats1c.h miniacc.h - -liblzo2_la_LIBADD = $(LZO_ASM_OBJECTS) -liblzo2_la_DEPENDENCIES = $(liblzo2_la_LIBADD) - - -# /*********************************************************************** -# // assembler support -# ************************************************************************/ - -if LZO_USE_ASM - -LZO_ASM_OBJECTS = \ - lzo1c_s1.lo lzo1c_s2.lo \ - lzo1f_f1.lo lzo1f_f2.lo \ - lzo1x_f1.lo lzo1x_f2.lo lzo1x_s1.lo lzo1x_s2.lo \ - lzo1y_f1.lo lzo1y_f2.lo lzo1y_s1.lo lzo1y_s2.lo - -.S.o: - $(CC) -c $< - -.S.lo: - $(LIBTOOL) --mode=compile $(CC) -c $< - -endif - diff --git a/release/src/router/lzo/src/Makefile.in b/release/src/router/lzo/src/Makefile.in deleted file mode 100644 index 90cf4e229c..0000000000 --- a/release/src/router/lzo/src/Makefile.in +++ /dev/null @@ -1,600 +0,0 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -# -# Copyright (C) 1996-2008 Markus F.X.J. Oberhumer -# - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = src -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/autoconf/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -am__installdirs = "$(DESTDIR)$(libdir)" -libLTLIBRARIES_INSTALL = $(INSTALL) -LTLIBRARIES = $(lib_LTLIBRARIES) -@LZO_USE_ASM_TRUE@am__DEPENDENCIES_1 = lzo1c_s1.lo lzo1c_s2.lo \ -@LZO_USE_ASM_TRUE@ lzo1f_f1.lo lzo1f_f2.lo lzo1x_f1.lo \ -@LZO_USE_ASM_TRUE@ lzo1x_f2.lo lzo1x_s1.lo lzo1x_s2.lo \ -@LZO_USE_ASM_TRUE@ lzo1y_f1.lo lzo1y_f2.lo lzo1y_s1.lo \ -@LZO_USE_ASM_TRUE@ lzo1y_s2.lo -am_liblzo2_la_OBJECTS = lzo_crc.lo lzo_init.lo lzo_ptr.lo lzo_str.lo \ - lzo_util.lo lzo1.lo lzo1_99.lo lzo1a.lo lzo1a_99.lo lzo1b_1.lo \ - lzo1b_2.lo lzo1b_3.lo lzo1b_4.lo lzo1b_5.lo lzo1b_6.lo \ - lzo1b_7.lo lzo1b_8.lo lzo1b_9.lo lzo1b_99.lo lzo1b_9x.lo \ - lzo1b_cc.lo lzo1b_d1.lo lzo1b_d2.lo lzo1b_rr.lo lzo1b_xx.lo \ - lzo1c_1.lo lzo1c_2.lo lzo1c_3.lo lzo1c_4.lo lzo1c_5.lo \ - lzo1c_6.lo lzo1c_7.lo lzo1c_8.lo lzo1c_9.lo lzo1c_99.lo \ - lzo1c_9x.lo lzo1c_cc.lo lzo1c_d1.lo lzo1c_d2.lo lzo1c_rr.lo \ - lzo1c_xx.lo lzo1f_1.lo lzo1f_9x.lo lzo1f_d1.lo lzo1f_d2.lo \ - lzo1x_1.lo lzo1x_9x.lo lzo1x_d1.lo lzo1x_d2.lo lzo1x_d3.lo \ - lzo1x_o.lo lzo1x_1k.lo lzo1x_1l.lo lzo1x_1o.lo lzo1y_1.lo \ - lzo1y_9x.lo lzo1y_d1.lo lzo1y_d2.lo lzo1y_d3.lo lzo1y_o.lo \ - lzo1z_9x.lo lzo1z_d1.lo lzo1z_d2.lo lzo1z_d3.lo lzo2a_9x.lo \ - lzo2a_d1.lo lzo2a_d2.lo -liblzo2_la_OBJECTS = $(am_liblzo2_la_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/autoconf/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(liblzo2_la_SOURCES) -DIST_SOURCES = $(liblzo2_la_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -VPATH = @srcdir@@LZO_ASM_VPATH@ -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = $(LZO_CFLAGS) $(configure_CFLAGS) $(LZO_EXTRA_CFLAGS) -CPP = @CPP@ -CPPFLAGS = $(LZO_CPPFLAGS) $(configure_CPPFLAGS) $(LZO_EXTRA_CPPFLAGS) -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -LZO_ASM_VPATH = @LZO_ASM_VPATH@ -LZO_CFLAGS = @LZO_CFLAGS@ -LZO_CPPFLAGS = @LZO_CPPFLAGS@ -LZO_EXTRA_CFLAGS = @LZO_EXTRA_CFLAGS@ -LZO_EXTRA_CPPFLAGS = @LZO_EXTRA_CPPFLAGS@ -LZO_USE_ASM_FALSE = @LZO_USE_ASM_FALSE@ -LZO_USE_ASM_TRUE = @LZO_USE_ASM_TRUE@ -MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ -MAKEINFO = @MAKEINFO@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -configure_CFLAGS = @configure_CFLAGS@ -configure_CPPFLAGS = @configure_CPPFLAGS@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -SUFFIXES = .S -INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir) -lib_LTLIBRARIES = liblzo2.la -liblzo2_la_LDFLAGS = -version-info 2:0:0 -liblzo2_la_SOURCES = \ - lzo_crc.c lzo_init.c lzo_ptr.c lzo_str.c lzo_util.c \ - lzo1.c lzo1_99.c \ - lzo1a.c lzo1a_99.c \ - lzo1b_1.c lzo1b_2.c lzo1b_3.c lzo1b_4.c lzo1b_5.c lzo1b_6.c \ - lzo1b_7.c lzo1b_8.c lzo1b_9.c lzo1b_99.c lzo1b_9x.c \ - lzo1b_cc.c lzo1b_d1.c lzo1b_d2.c lzo1b_rr.c lzo1b_xx.c \ - lzo1c_1.c lzo1c_2.c lzo1c_3.c lzo1c_4.c lzo1c_5.c lzo1c_6.c \ - lzo1c_7.c lzo1c_8.c lzo1c_9.c lzo1c_99.c lzo1c_9x.c \ - lzo1c_cc.c lzo1c_d1.c lzo1c_d2.c lzo1c_rr.c lzo1c_xx.c \ - lzo1f_1.c lzo1f_9x.c lzo1f_d1.c lzo1f_d2.c \ - lzo1x_1.c lzo1x_9x.c lzo1x_d1.c lzo1x_d2.c lzo1x_d3.c \ - lzo1x_o.c lzo1x_1k.c lzo1x_1l.c lzo1x_1o.c \ - lzo1y_1.c lzo1y_9x.c lzo1y_d1.c lzo1y_d2.c lzo1y_d3.c lzo1y_o.c \ - lzo1z_9x.c lzo1z_d1.c lzo1z_d2.c lzo1z_d3.c \ - lzo2a_9x.c lzo2a_d1.c lzo2a_d2.c - -EXTRA_DIST = \ - lzo1_cm.ch lzo1_d.ch lzo1a_cm.ch lzo1a_cr.ch lzo1b_c.ch \ - lzo1b_cm.ch lzo1b_cr.ch lzo1b_d.ch lzo1b_r.ch \ - lzo1b_sm.ch lzo1b_tm.ch lzo1f_d.ch lzo1x_c.ch \ - lzo1x_d.ch lzo1x_oo.ch lzo2a_d.ch \ - lzo_dll.ch lzo_mchw.ch lzo_swd.ch \ - compr1b.h compr1c.h config1.h config1a.h config1b.h config1c.h \ - config1f.h config1x.h config1y.h config1z.h config2a.h \ - lzo1a_de.h lzo1b_cc.h lzo1b_de.h lzo1c_cc.h lzo_conf.h lzo_dict.h \ - lzo_ptr.h stats1a.h stats1b.h stats1c.h miniacc.h - -liblzo2_la_LIBADD = $(LZO_ASM_OBJECTS) -liblzo2_la_DEPENDENCIES = $(liblzo2_la_LIBADD) - -# /*********************************************************************** -# // assembler support -# ************************************************************************/ -@LZO_USE_ASM_TRUE@LZO_ASM_OBJECTS = \ -@LZO_USE_ASM_TRUE@ lzo1c_s1.lo lzo1c_s2.lo \ -@LZO_USE_ASM_TRUE@ lzo1f_f1.lo lzo1f_f2.lo \ -@LZO_USE_ASM_TRUE@ lzo1x_f1.lo lzo1x_f2.lo lzo1x_s1.lo lzo1x_s2.lo \ -@LZO_USE_ASM_TRUE@ lzo1y_f1.lo lzo1y_f2.lo lzo1y_s1.lo lzo1y_s2.lo - -all: all-am - -.SUFFIXES: -.SUFFIXES: .S .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - if test -f $$p; then \ - f=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ - else :; fi; \ - done - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - p=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ - $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ - done - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -liblzo2.la: $(liblzo2_la_OBJECTS) $(liblzo2_la_DEPENDENCIES) - $(LINK) -rpath $(libdir) $(liblzo2_la_LDFLAGS) $(liblzo2_la_OBJECTS) $(liblzo2_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1_99.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1a.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1a_99.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_3.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_4.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_5.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_6.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_7.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_8.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_9.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_99.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_9x.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_cc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_d1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_d2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_rr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1b_xx.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_3.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_4.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_5.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_6.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_7.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_8.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_9.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_99.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_9x.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_cc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_d1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_d2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_rr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1c_xx.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1f_1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1f_9x.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1f_d1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1f_d2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1x_1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1x_1k.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1x_1l.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1x_1o.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1x_9x.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1x_d1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1x_d2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1x_d3.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1x_o.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1y_1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1y_9x.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1y_d1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1y_d2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1y_d3.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1y_o.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1z_9x.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1z_d1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1z_d2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo1z_d3.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo2a_9x.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo2a_d1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo2a_d2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo_crc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo_init.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo_ptr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo_str.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzo_util.Plo@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LTLIBRARIES) -installdirs: - for dir in "$(DESTDIR)$(libdir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: install-libLTLIBRARIES - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libtool ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am \ - install-libLTLIBRARIES install-man install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-info-am \ - uninstall-libLTLIBRARIES - - -@LZO_USE_ASM_TRUE@.S.o: -@LZO_USE_ASM_TRUE@ $(CC) -c $< - -@LZO_USE_ASM_TRUE@.S.lo: -@LZO_USE_ASM_TRUE@ $(LIBTOOL) --mode=compile $(CC) -c $< -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/release/src/router/lzo/tests/Makefile b/release/src/router/lzo/tests/Makefile deleted file mode 100644 index 6fac27d4be..0000000000 --- a/release/src/router/lzo/tests/Makefile +++ /dev/null @@ -1,468 +0,0 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. -# tests/Makefile. Generated from Makefile.in by configure. - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - - -# -# Copyright (C) 1996-2008 Markus F.X.J. Oberhumer -# - -srcdir = . -top_srcdir = .. - -pkgdatadir = $(datadir)/lzo -pkglibdir = $(libdir)/lzo -pkgincludedir = $(includedir)/lzo -top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = /usr/bin/install -c -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = i686-pc-linux-gnu -host_triplet = mipsel-unknown-linux-gnu -target_triplet = mipsel-unknown-linux-gnu -noinst_PROGRAMS = align$(EXEEXT) chksum$(EXEEXT) promote$(EXEEXT) \ - sizes$(EXEEXT) -subdir = tests -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/autoconf/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -PROGRAMS = $(noinst_PROGRAMS) -am_align_OBJECTS = align.$(OBJEXT) -align_OBJECTS = $(am_align_OBJECTS) -align_DEPENDENCIES = ../src/liblzo2.la -am_chksum_OBJECTS = chksum.$(OBJEXT) -chksum_OBJECTS = $(am_chksum_OBJECTS) -chksum_DEPENDENCIES = ../src/liblzo2.la -am_promote_OBJECTS = promote.$(OBJEXT) -promote_OBJECTS = $(am_promote_OBJECTS) -promote_LDADD = $(LDADD) -am_sizes_OBJECTS = sizes.$(OBJEXT) -sizes_OBJECTS = $(am_sizes_OBJECTS) -sizes_LDADD = $(LDADD) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/autoconf/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(align_SOURCES) $(chksum_SOURCES) $(promote_SOURCES) \ - $(sizes_SOURCES) -DIST_SOURCES = $(align_SOURCES) $(chksum_SOURCES) $(promote_SOURCES) \ - $(sizes_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /home/keith/firmware/release/src/router/lzo/autoconf/missing --run aclocal-1.9 -AMDEP_FALSE = # -AMDEP_TRUE = -AMTAR = ${SHELL} /home/keith/firmware/release/src/router/lzo/autoconf/missing --run tar -AR = mipsel-uclibc-ar -AUTOCONF = ${SHELL} /home/keith/firmware/release/src/router/lzo/autoconf/missing --run autoconf -AUTOHEADER = ${SHELL} /home/keith/firmware/release/src/router/lzo/autoconf/missing --run autoheader -AUTOMAKE = ${SHELL} /home/keith/firmware/release/src/router/lzo/autoconf/missing --run automake-1.9 -AWK = mawk -CC = mipsel-uclibc-gcc -CCDEPMODE = depmode=gcc3 -CFLAGS = -mips2 -O3 -Wall -CPP = mipsel-uclibc-gcc -E -CPPFLAGS = -DLZO_HAVE_CONFIG_H -CXX = mipsel-linux-g++ -CXXCPP = mipsel-linux-g++ -E -CXXDEPMODE = depmode=gcc3 -CXXFLAGS = -g -O2 -CYGPATH_W = echo -DEFS = -DHAVE_CONFIG_H -DEPDIR = .deps -ECHO = echo -ECHO_C = -ECHO_N = -n -ECHO_T = -EGREP = grep -E -EXEEXT = -F77 = -FFLAGS = -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_PROGRAM = ${INSTALL} -INSTALL_SCRIPT = ${INSTALL} -INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s -LDFLAGS = -LIBOBJS = -LIBS = -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LN_S = ln -s -LTLIBOBJS = -LZO_ASM_VPATH = -LZO_CFLAGS = -LZO_CPPFLAGS = -LZO_EXTRA_CFLAGS = -LZO_EXTRA_CPPFLAGS = -LZO_USE_ASM_FALSE = -LZO_USE_ASM_TRUE = # -MAINT = # -MAINTAINER_MODE_FALSE = -MAINTAINER_MODE_TRUE = # -MAKEINFO = ${SHELL} /home/keith/firmware/release/src/router/lzo/autoconf/missing --run makeinfo -OBJEXT = o -PACKAGE = lzo -PACKAGE_BUGREPORT = markus@oberhumer.com -PACKAGE_NAME = lzo -PACKAGE_STRING = lzo 2.03 -PACKAGE_TARNAME = lzo -PACKAGE_VERSION = 2.03 -PATH_SEPARATOR = : -RANLIB = mipsel-uclibc-ranlib -SET_MAKE = -SHELL = /bin/sh -STRIP = mipsel-uclibc-strip -VERSION = 2.03 -ac_ct_AR = -ac_ct_CC = -ac_ct_CXX = -ac_ct_F77 = -ac_ct_RANLIB = -ac_ct_STRIP = -am__fastdepCC_FALSE = # -am__fastdepCC_TRUE = -am__fastdepCXX_FALSE = # -am__fastdepCXX_TRUE = -am__include = include -am__leading_dot = . -am__quote = -am__tar = ${AMTAR} chof - "$$tardir" -am__untar = ${AMTAR} xf - -bindir = ${exec_prefix}/bin -build = i686-pc-linux-gnu -build_alias = -build_cpu = i686 -build_os = linux-gnu -build_vendor = pc -configure_CFLAGS = -mips2 -O3 -Wall -configure_CPPFLAGS = -DLZO_HAVE_CONFIG_H -datadir = ${prefix}/share -exec_prefix = ${prefix} -host = mipsel-unknown-linux-gnu -host_alias = mipsel-linux -host_cpu = mipsel -host_os = linux-gnu -host_vendor = unknown -includedir = ${prefix}/include -infodir = ${prefix}/info -install_sh = /home/keith/firmware/release/src/router/lzo/autoconf/install-sh -libdir = ${exec_prefix}/lib -libexecdir = ${exec_prefix}/libexec -localstatedir = ${prefix}/var -mandir = ${prefix}/man -mkdir_p = mkdir -p -- -oldincludedir = /usr/include -prefix = /usr/local -program_transform_name = s,x,x, -sbindir = ${exec_prefix}/sbin -sharedstatedir = ${prefix}/com -sysconfdir = ${prefix}/etc -target = mipsel-unknown-linux-gnu -target_alias = -target_cpu = mipsel -target_os = linux-gnu -target_vendor = unknown -INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir) -align_SOURCES = align.c -chksum_SOURCES = chksum.c -promote_SOURCES = promote.c -sizes_SOURCES = sizes.c -align_LDADD = ../src/liblzo2.la -chksum_LDADD = ../src/liblzo2.la -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu tests/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: # $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): # $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -align$(EXEEXT): $(align_OBJECTS) $(align_DEPENDENCIES) - @rm -f align$(EXEEXT) - $(LINK) $(align_LDFLAGS) $(align_OBJECTS) $(align_LDADD) $(LIBS) -chksum$(EXEEXT): $(chksum_OBJECTS) $(chksum_DEPENDENCIES) - @rm -f chksum$(EXEEXT) - $(LINK) $(chksum_LDFLAGS) $(chksum_OBJECTS) $(chksum_LDADD) $(LIBS) -promote$(EXEEXT): $(promote_OBJECTS) $(promote_DEPENDENCIES) - @rm -f promote$(EXEEXT) - $(LINK) $(promote_LDFLAGS) $(promote_OBJECTS) $(promote_LDADD) $(LIBS) -sizes$(EXEEXT): $(sizes_OBJECTS) $(sizes_DEPENDENCIES) - @rm -f sizes$(EXEEXT) - $(LINK) $(sizes_LDFLAGS) $(sizes_OBJECTS) $(sizes_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -include ./$(DEPDIR)/align.Po -include ./$(DEPDIR)/chksum.Po -include ./$(DEPDIR)/promote.Po -include ./$(DEPDIR)/sizes.Po - -.c.o: - if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ - then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -# source='$<' object='$@' libtool=no \ -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ -# $(COMPILE) -c $< - -.c.obj: - if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ - then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -# source='$<' object='$@' libtool=no \ -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ -# $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: - if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ - then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -# source='$<' object='$@' libtool=yes \ -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ -# $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/release/src/router/lzo/tests/Makefile.am b/release/src/router/lzo/tests/Makefile.am deleted file mode 100644 index 08246b333a..0000000000 --- a/release/src/router/lzo/tests/Makefile.am +++ /dev/null @@ -1,17 +0,0 @@ -## Process this file with automake to create Makefile.in -# -# Copyright (C) 1996-2008 Markus F.X.J. Oberhumer -# - -INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir) - -noinst_PROGRAMS = align chksum promote sizes - -align_SOURCES = align.c -chksum_SOURCES = chksum.c -promote_SOURCES = promote.c -sizes_SOURCES = sizes.c - -align_LDADD = ../src/liblzo2.la -chksum_LDADD = ../src/liblzo2.la - diff --git a/release/src/router/lzo/tests/Makefile.in b/release/src/router/lzo/tests/Makefile.in deleted file mode 100644 index d86aa1f4e5..0000000000 --- a/release/src/router/lzo/tests/Makefile.in +++ /dev/null @@ -1,468 +0,0 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -# -# Copyright (C) 1996-2008 Markus F.X.J. Oberhumer -# - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -noinst_PROGRAMS = align$(EXEEXT) chksum$(EXEEXT) promote$(EXEEXT) \ - sizes$(EXEEXT) -subdir = tests -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/autoconf/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -PROGRAMS = $(noinst_PROGRAMS) -am_align_OBJECTS = align.$(OBJEXT) -align_OBJECTS = $(am_align_OBJECTS) -align_DEPENDENCIES = ../src/liblzo2.la -am_chksum_OBJECTS = chksum.$(OBJEXT) -chksum_OBJECTS = $(am_chksum_OBJECTS) -chksum_DEPENDENCIES = ../src/liblzo2.la -am_promote_OBJECTS = promote.$(OBJEXT) -promote_OBJECTS = $(am_promote_OBJECTS) -promote_LDADD = $(LDADD) -am_sizes_OBJECTS = sizes.$(OBJEXT) -sizes_OBJECTS = $(am_sizes_OBJECTS) -sizes_LDADD = $(LDADD) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/autoconf/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(align_SOURCES) $(chksum_SOURCES) $(promote_SOURCES) \ - $(sizes_SOURCES) -DIST_SOURCES = $(align_SOURCES) $(chksum_SOURCES) $(promote_SOURCES) \ - $(sizes_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -LZO_ASM_VPATH = @LZO_ASM_VPATH@ -LZO_CFLAGS = @LZO_CFLAGS@ -LZO_CPPFLAGS = @LZO_CPPFLAGS@ -LZO_EXTRA_CFLAGS = @LZO_EXTRA_CFLAGS@ -LZO_EXTRA_CPPFLAGS = @LZO_EXTRA_CPPFLAGS@ -LZO_USE_ASM_FALSE = @LZO_USE_ASM_FALSE@ -LZO_USE_ASM_TRUE = @LZO_USE_ASM_TRUE@ -MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ -MAKEINFO = @MAKEINFO@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -configure_CFLAGS = @configure_CFLAGS@ -configure_CPPFLAGS = @configure_CPPFLAGS@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir) -align_SOURCES = align.c -chksum_SOURCES = chksum.c -promote_SOURCES = promote.c -sizes_SOURCES = sizes.c -align_LDADD = ../src/liblzo2.la -chksum_LDADD = ../src/liblzo2.la -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu tests/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -align$(EXEEXT): $(align_OBJECTS) $(align_DEPENDENCIES) - @rm -f align$(EXEEXT) - $(LINK) $(align_LDFLAGS) $(align_OBJECTS) $(align_LDADD) $(LIBS) -chksum$(EXEEXT): $(chksum_OBJECTS) $(chksum_DEPENDENCIES) - @rm -f chksum$(EXEEXT) - $(LINK) $(chksum_LDFLAGS) $(chksum_OBJECTS) $(chksum_LDADD) $(LIBS) -promote$(EXEEXT): $(promote_OBJECTS) $(promote_DEPENDENCIES) - @rm -f promote$(EXEEXT) - $(LINK) $(promote_LDFLAGS) $(promote_OBJECTS) $(promote_LDADD) $(LIBS) -sizes$(EXEEXT): $(sizes_OBJECTS) $(sizes_DEPENDENCIES) - @rm -f sizes$(EXEEXT) - $(LINK) $(sizes_LDFLAGS) $(sizes_OBJECTS) $(sizes_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/align.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chksum.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/promote.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sizes.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/release/src/router/nginx/CHANGES b/release/src/router/nginx/CHANGES new file mode 100644 index 0000000000..56aaf478fb --- /dev/null +++ b/release/src/router/nginx/CHANGES @@ -0,0 +1,6267 @@ + +Changes with nginx 1.4.0 24 Apr 2013 + + *) Bugfix: nginx could not be built with the ngx_http_perl_module if the + --with-openssl option was used; the bug had appeared in 1.3.16. + + *) Bugfix: in a request body handling in the ngx_http_perl_module; the + bug had appeared in 1.3.9. + + +Changes with nginx 1.3.16 16 Apr 2013 + + *) Bugfix: a segmentation fault might occur in a worker process if + subrequests were used; the bug had appeared in 1.3.9. + + *) Bugfix: the "tcp_nodelay" directive caused an error if a WebSocket + connection was proxied into a unix domain socket. + + *) Bugfix: the $upstream_response_length variable has an incorrect value + "0" if buffering was not used. + Thanks to Piotr Sikora. + + *) Bugfix: in the eventport and /dev/poll methods. + + +Changes with nginx 1.3.15 26 Mar 2013 + + *) Change: opening and closing a connection without sending any data in + it is no longer logged to access_log with error code 400. + + *) Feature: the ngx_http_spdy_module. + Thanks to Automattic for sponsoring this work. + + *) Feature: the "limit_req_status" and "limit_conn_status" directives. + Thanks to Nick Marden. + + *) Feature: the "image_filter_interlace" directive. + Thanks to Ian Babrou. + + *) Feature: $connections_waiting variable in the + ngx_http_stub_status_module. + + *) Feature: the mail proxy module now supports IPv6 backends. + + *) Bugfix: request body might be transmitted incorrectly when retrying a + request to the next upstream server; the bug had appeared in 1.3.9. + Thanks to Piotr Sikora. + + *) Bugfix: in the "client_body_in_file_only" directive; the bug had + appeared in 1.3.9. + + *) Bugfix: responses might hang if subrequests were used and a DNS error + happened during subrequest processing. + Thanks to Lanshun Zhou. + + *) Bugfix: in backend usage accounting. + + +Changes with nginx 1.3.14 05 Mar 2013 + + *) Feature: $connections_active, $connections_reading, and + $connections_writing variables in the ngx_http_stub_status_module. + + *) Feature: support of WebSocket connections in the + ngx_http_uwsgi_module and ngx_http_scgi_module. + + *) Bugfix: in virtual servers handling with SNI. + + *) Bugfix: new sessions were not always stored if the "ssl_session_cache + shared" directive was used and there was no free space in shared + memory. + Thanks to Piotr Sikora. + + *) Bugfix: multiple X-Forwarded-For headers were handled incorrectly. + Thanks to Neal Poole for sponsoring this work. + + *) Bugfix: in the ngx_http_mp4_module. + Thanks to Gernot Vormayr. + + +Changes with nginx 1.3.13 19 Feb 2013 + + *) Change: a compiler with name "cc" is now used by default. + + *) Feature: support for proxying of WebSocket connections. + Thanks to Apcera and CloudBees for sponsoring this work. + + *) Feature: the "auth_basic_user_file" directive supports "{SHA}" + password encryption method. + Thanks to Louis Opter. + + +Changes with nginx 1.3.12 05 Feb 2013 + + *) Feature: variables support in the "proxy_bind", "fastcgi_bind", + "memcached_bind", "scgi_bind", and "uwsgi_bind" directives. + + *) Feature: the $pipe, $request_length, $time_iso8601, and $time_local + variables can now be used not only in the "log_format" directive. + Thanks to Kiril Kalchev. + + *) Feature: IPv6 support in the ngx_http_geoip_module. + Thanks to Gregor Kališnik. + + *) Bugfix: in the "proxy_method" directive. + + *) Bugfix: a segmentation fault might occur in a worker process if + resolver was used with the poll method. + + *) Bugfix: nginx might hog CPU during SSL handshake with a backend if + the select, poll, or /dev/poll methods were used. + + *) Bugfix: the "[crit] SSL_write() failed (SSL:)" error. + + *) Bugfix: in the "client_body_in_file_only" directive; the bug had + appeared in 1.3.9. + + *) Bugfix: in the "fastcgi_keep_conn" directive. + + +Changes with nginx 1.3.11 10 Jan 2013 + + *) Bugfix: a segmentation fault might occur if logging was used; the bug + had appeared in 1.3.10. + + *) Bugfix: the "proxy_pass" directive did not work with IP addresses + without port specified; the bug had appeared in 1.3.10. + + *) Bugfix: a segmentation fault occurred on start or during + reconfiguration if the "keepalive" directive was specified more than + once in a single upstream block. + + *) Bugfix: parameter "default" of the "geo" directive did not set + default value for IPv6 addresses. + + +Changes with nginx 1.3.10 25 Dec 2012 + + *) Change: domain names specified in configuration file are now resolved + to IPv6 addresses as well as IPv4 ones. + + *) Change: now if the "include" directive with mask is used on Unix + systems, included files are sorted in alphabetical order. + + *) Change: the "add_header" directive adds headers to 201 responses. + + *) Feature: the "geo" directive now supports IPv6 addresses in CIDR + notation. + + *) Feature: the "flush" and "gzip" parameters of the "access_log" + directive. + + *) Feature: variables support in the "auth_basic" directive. + + *) Bugfix: nginx could not be built with the ngx_http_perl_module in + some cases. + + *) Bugfix: a segmentation fault might occur in a worker process if the + ngx_http_xslt_module was used. + + *) Bugfix: nginx could not be built on MacOSX in some cases. + Thanks to Piotr Sikora. + + *) Bugfix: the "limit_rate" directive with high rates might result in + truncated responses on 32-bit platforms. + Thanks to Alexey Antropov. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "if" directive was used. + Thanks to Piotr Sikora. + + *) Bugfix: a "100 Continue" response was issued with "413 Request Entity + Too Large" responses. + + *) Bugfix: the "image_filter", "image_filter_jpeg_quality" and + "image_filter_sharpen" directives might be inherited incorrectly. + Thanks to Ian Babrou. + + *) Bugfix: "crypt_r() failed" errors might appear if the "auth_basic" + directive was used on Linux. + + *) Bugfix: in backup servers handling. + Thanks to Thomas Chen. + + *) Bugfix: proxied HEAD requests might return incorrect response if the + "gzip" directive was used. + + +Changes with nginx 1.3.9 27 Nov 2012 + + *) Feature: support for chunked transfer encoding while reading client + request body. + + *) Feature: the $request_time and $msec variables can now be used not + only in the "log_format" directive. + + *) Bugfix: cache manager and cache loader processes might not be able to + start if more than 512 listen sockets were used. + + *) Bugfix: in the ngx_http_dav_module. + + +Changes with nginx 1.3.8 30 Oct 2012 + + *) Feature: the "optional_no_ca" parameter of the "ssl_verify_client" + directive. + Thanks to Mike Kazantsev and Eric O'Connor. + + *) Feature: the $bytes_sent, $connection, and $connection_requests + variables can now be used not only in the "log_format" directive. + Thanks to Benjamin Grössing. + + *) Feature: the "auto" parameter of the "worker_processes" directive. + + *) Bugfix: "cache file ... has md5 collision" alert. + + *) Bugfix: in the ngx_http_gunzip_filter_module. + + *) Bugfix: in the "ssl_stapling" directive. + + +Changes with nginx 1.3.7 02 Oct 2012 + + *) Feature: OCSP stapling support. + Thanks to Comodo, DigiCert and GlobalSign for sponsoring this work. + + *) Feature: the "ssl_trusted_certificate" directive. + + *) Feature: resolver now randomly rotates addresses returned from cache. + Thanks to Anton Jouline. + + *) Bugfix: OpenSSL 0.9.7 compatibility. + + +Changes with nginx 1.3.6 12 Sep 2012 + + *) Feature: the ngx_http_gunzip_filter_module. + + *) Feature: the "memcached_gzip_flag" directive. + + *) Feature: the "always" parameter of the "gzip_static" directive. + + *) Bugfix: in the "limit_req" directive; the bug had appeared in 1.1.14. + Thanks to Charles Chen. + + *) Bugfix: nginx could not be built by gcc 4.7 with -O2 optimization if + the --with-ipv6 option was used. + + +Changes with nginx 1.3.5 21 Aug 2012 + + *) Change: the ngx_http_mp4_module module no longer skips tracks in + formats other than H.264 and AAC. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "map" directive was used with variables as values. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "geo" directive was used with the "ranges" parameter but without the + "default" parameter; the bug had appeared in 0.8.43. + Thanks to Zhen Chen and Weibin Yao. + + *) Bugfix: in the -p command-line parameter handling. + + *) Bugfix: in the mail proxy server. + + *) Bugfix: of minor potential bugs. + Thanks to Coverity. + + *) Bugfix: nginx/Windows could not be built with Visual Studio 2005 + Express. + Thanks to HAYASHI Kentaro. + + +Changes with nginx 1.3.4 31 Jul 2012 + + *) Change: the "ipv6only" parameter is now turned on by default for + listening IPv6 sockets. + + *) Feature: the Clang compiler support. + + *) Bugfix: extra listening sockets might be created. + Thanks to Roman Odaisky. + + *) Bugfix: nginx/Windows might hog CPU if a worker process failed to + start. + Thanks to Ricardo Villalobos Guevara. + + *) Bugfix: the "proxy_pass_header", "fastcgi_pass_header", + "scgi_pass_header", "uwsgi_pass_header", "proxy_hide_header", + "fastcgi_hide_header", "scgi_hide_header", and "uwsgi_hide_header" + directives might be inherited incorrectly. + + +Changes with nginx 1.3.3 10 Jul 2012 + + *) Feature: entity tags support and the "etag" directive. + + *) Bugfix: trailing dot in a source value was not ignored if the "map" + directive was used with the "hostnames" parameter. + + *) Bugfix: incorrect location might be used to process a request if a + URI was changed via a "rewrite" directive before an internal redirect + to a named location. + + +Changes with nginx 1.3.2 26 Jun 2012 + + *) Change: the "single" parameter of the "keepalive" directive is now + ignored. + + *) Change: SSL compression is now disabled when using all versions of + OpenSSL, including ones prior to 1.0.0. + + *) Feature: it is now possible to use the "ip_hash" directive to balance + IPv6 clients. + + *) Feature: the $status variable can now be used not only in the + "log_format" directive. + + *) Bugfix: a segmentation fault might occur in a worker process on + shutdown if the "resolver" directive was used. + + *) Bugfix: a segmentation fault might occur in a worker process if the + ngx_http_mp4_module was used. + + *) Bugfix: in the ngx_http_mp4_module. + + *) Bugfix: a segmentation fault might occur in a worker process if + conflicting wildcard server names were used. + + *) Bugfix: nginx might be terminated abnormally on a SIGBUS signal on + ARM platform. + + *) Bugfix: an alert "sendmsg() failed (9: Bad file number)" on HP-UX + while reconfiguration. + + +Changes with nginx 1.3.1 05 Jun 2012 + + *) Security: now nginx/Windows ignores trailing dot in URI path + component, and does not allow URIs with ":$" in it. + Thanks to Vladimir Kochetkov, Positive Research Center. + + *) Feature: the "proxy_pass", "fastcgi_pass", "scgi_pass", "uwsgi_pass" + directives, and the "server" directive inside the "upstream" block, + now support IPv6 addresses. + + *) Feature: the "resolver" directive now supports IPv6 addresses and an + optional port specification. + + *) Feature: the "least_conn" directive inside the "upstream" block. + + *) Feature: it is now possible to specify a weight for servers while + using the "ip_hash" directive. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "image_filter" directive was used; the bug had appeared in 1.3.0. + + *) Bugfix: nginx could not be built with ngx_cpp_test_module; the bug + had appeared in 1.1.12. + + *) Bugfix: access to variables from SSI and embedded perl module might + not work after reconfiguration. + Thanks to Yichun Zhang. + + *) Bugfix: in the ngx_http_xslt_filter_module. + Thanks to Kuramoto Eiji. + + *) Bugfix: memory leak if $geoip_org variable was used. + Thanks to Denis F. Latypoff. + + *) Bugfix: in the "proxy_cookie_domain" and "proxy_cookie_path" + directives. + + +Changes with nginx 1.3.0 15 May 2012 + + *) Feature: the "debug_connection" directive now supports IPv6 addresses + and the "unix:" parameter. + + *) Feature: the "set_real_ip_from" directive and the "proxy" parameter + of the "geo" directive now support IPv6 addresses. + + *) Feature: the "real_ip_recursive", "geoip_proxy", and + "geoip_proxy_recursive" directives. + + *) Feature: the "proxy_recursive" parameter of the "geo" directive. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "resolver" directive was used. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "fastcgi_pass", "scgi_pass", or "uwsgi_pass" directives were used and + backend returned incorrect response. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "rewrite" directive was used and new request arguments in a + replacement used variables. + + *) Bugfix: nginx might hog CPU if the open file resource limit was + reached. + + *) Bugfix: nginx might loop infinitely over backends if the + "proxy_next_upstream" directive with the "http_404" parameter was + used and there were backup servers specified in an upstream block. + + *) Bugfix: adding the "down" parameter of the "server" directive might + cause unneeded client redistribution among backend servers if the + "ip_hash" directive was used. + + *) Bugfix: socket leak. + Thanks to Yichun Zhang. + + *) Bugfix: in the ngx_http_fastcgi_module. + + +Changes with nginx 1.2.0 23 Apr 2012 + + *) Bugfix: a segmentation fault might occur in a worker process if the + "try_files" directive was used; the bug had appeared in 1.1.19. + + *) Bugfix: response might be truncated if there were more than IOV_MAX + buffers used. + + *) Bugfix: in the "crop" parameter of the "image_filter" directive. + Thanks to Maxim Bublis. + + +Changes with nginx 1.1.19 12 Apr 2012 + + *) Security: specially crafted mp4 file might allow to overwrite memory + locations in a worker process if the ngx_http_mp4_module was used, + potentially resulting in arbitrary code execution (CVE-2012-2089). + Thanks to Matthew Daley. + + *) Bugfix: nginx/Windows might be terminated abnormally. + Thanks to Vincent Lee. + + *) Bugfix: nginx hogged CPU if all servers in an upstream were marked as + "backup". + + *) Bugfix: the "allow" and "deny" directives might be inherited + incorrectly if they were used with IPv6 addresses. + + *) Bugfix: the "modern_browser" and "ancient_browser" directives might + be inherited incorrectly. + + *) Bugfix: timeouts might be handled incorrectly on Solaris/SPARC. + + *) Bugfix: in the ngx_http_mp4_module. + + +Changes with nginx 1.1.18 28 Mar 2012 + + *) Change: keepalive connections are no longer disabled for Safari by + default. + + *) Feature: the $connection_requests variable. + + *) Feature: $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd and + $tcpinfo_rcv_space variables. + + *) Feature: the "worker_cpu_affinity" directive now works on FreeBSD. + + *) Feature: the "xslt_param" and "xslt_string_param" directives. + Thanks to Samuel Behan. + + *) Bugfix: in configure tests. + Thanks to Piotr Sikora. + + *) Bugfix: in the ngx_http_xslt_filter_module. + + *) Bugfix: nginx could not be built on Debian GNU/Hurd. + + +Changes with nginx 1.1.17 15 Mar 2012 + + *) Security: content of previously freed memory might be sent to a + client if backend returned specially crafted response. + Thanks to Matthew Daley. + + *) Bugfix: in the embedded perl module if used from SSI. + Thanks to Matthew Daley. + + *) Bugfix: in the ngx_http_uwsgi_module. + + +Changes with nginx 1.1.16 29 Feb 2012 + + *) Change: the simultaneous subrequest limit has been raised to 200. + + *) Feature: the "from" parameter of the "disable_symlinks" directive. + + *) Feature: the "return" and "error_page" directives can now be used to + return 307 redirections. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "resolver" directive was used and there was no "error_log" directive + specified at global level. + Thanks to Roman Arutyunyan. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "proxy_http_version 1.1" or "fastcgi_keep_conn on" directives were + used. + + *) Bugfix: memory leaks. + Thanks to Lanshun Zhou. + + *) Bugfix: in the "disable_symlinks" directive. + + *) Bugfix: on ZFS filesystem disk cache size might be calculated + incorrectly; the bug had appeared in 1.0.1. + + *) Bugfix: nginx could not be built by the icc 12.1 compiler. + + *) Bugfix: nginx could not be built by gcc on Solaris; the bug had + appeared in 1.1.15. + + +Changes with nginx 1.1.15 15 Feb 2012 + + *) Feature: the "disable_symlinks" directive. + + *) Feature: the "proxy_cookie_domain" and "proxy_cookie_path" + directives. + + *) Bugfix: nginx might log incorrect error "upstream prematurely closed + connection" instead of correct "upstream sent too big header" one. + Thanks to Feibo Li. + + *) Bugfix: nginx could not be built with the ngx_http_perl_module if the + --with-openssl option was used. + + *) Bugfix: the number of internal redirects to named locations was not + limited. + + *) Bugfix: calling $r->flush() multiple times might cause errors in the + ngx_http_gzip_filter_module. + + *) Bugfix: temporary files might be not removed if the "proxy_store" + directive was used with SSI includes. + + *) Bugfix: in some cases non-cacheable variables (such as the $args + variable) returned old empty cached value. + + *) Bugfix: a segmentation fault might occur in a worker process if too + many SSI subrequests were issued simultaneously; the bug had appeared + in 0.7.25. + + +Changes with nginx 1.1.14 30 Jan 2012 + + *) Feature: multiple "limit_req" limits may be used simultaneously. + + *) Bugfix: in error handling while connecting to a backend. + Thanks to Piotr Sikora. + + *) Bugfix: in AIO error handling on FreeBSD. + + *) Bugfix: in the OpenSSL library initialization. + + *) Bugfix: the "proxy_redirect" directives might be inherited + incorrectly. + + *) Bugfix: memory leak during reconfiguration if the "pcre_jit" + directive was used. + + +Changes with nginx 1.1.13 16 Jan 2012 + + *) Feature: the "TLSv1.1" and "TLSv1.2" parameters of the + "ssl_protocols" directive. + + *) Bugfix: the "limit_req" directive parameters were not inherited + correctly; the bug had appeared in 1.1.12. + + *) Bugfix: the "proxy_redirect" directive incorrectly processed + "Refresh" header if regular expression were used. + + *) Bugfix: the "proxy_cache_use_stale" directive with "error" parameter + did not return answer from cache if there were no live upstreams. + + *) Bugfix: the "worker_cpu_affinity" directive might not work. + + *) Bugfix: nginx could not be built on Solaris; the bug had appeared in + 1.1.12. + + *) Bugfix: in the ngx_http_mp4_module. + + +Changes with nginx 1.1.12 26 Dec 2011 + + *) Change: a "proxy_pass" directive without URI part now uses changed + URI after redirection with the "error_page" directive. + Thanks to Lanshun Zhou. + + *) Feature: the "proxy/fastcgi/scgi/uwsgi_cache_lock", + "proxy/fastcgi/scgi/uwsgi_cache_lock_timeout" directives. + + *) Feature: the "pcre_jit" directive. + + *) Feature: the "if" SSI command supports captures in regular + expressions. + + *) Bugfix: the "if" SSI command did not work inside the "block" command. + + *) Bugfix: the "limit_conn_log_level" and "limit_req_log_level" + directives might not work. + + *) Bugfix: the "limit_rate" directive did not allow to use full + throughput, even if limit value was very high. + + *) Bugfix: the "sendfile_max_chunk" directive did not work, if the + "limit_rate" directive was used. + + *) Bugfix: a "proxy_pass" directive without URI part always used + original request URI if variables were used. + + *) Bugfix: a "proxy_pass" directive without URI part might use original + request after redirection with the "try_files" directive. + Thanks to Lanshun Zhou. + + *) Bugfix: in the ngx_http_scgi_module. + + *) Bugfix: in the ngx_http_mp4_module. + + *) Bugfix: nginx could not be built on Solaris; the bug had appeared in + 1.1.9. + + +Changes with nginx 1.1.11 12 Dec 2011 + + *) Feature: the "so_keepalive" parameter of the "listen" directive. + Thanks to Vsevolod Stakhov. + + *) Feature: the "if_not_empty" parameter of the + "fastcgi/scgi/uwsgi_param" directives. + + *) Feature: the $https variable. + + *) Feature: the "proxy_redirect" directive supports variables in the + first parameter. + + *) Feature: the "proxy_redirect" directive supports regular expressions. + + *) Bugfix: the $sent_http_cache_control variable might contain a wrong + value if the "expires" directive was used. + Thanks to Yichun Zhang. + + *) Bugfix: the "read_ahead" directive might not work combined with + "try_files" and "open_file_cache". + + *) Bugfix: a segmentation fault might occur in a worker process if small + time was used in the "inactive" parameter of the "proxy_cache_path" + directive. + + *) Bugfix: responses from cache might hang. + + +Changes with nginx 1.1.10 30 Nov 2011 + + *) Bugfix: a segmentation fault occured in a worker process if AIO was + used on Linux; the bug had appeared in 1.1.9. + + +Changes with nginx 1.1.9 28 Nov 2011 + + *) Change: now double quotes are encoded in an "echo" SSI-command + output. + Thanks to Zaur Abasmirzoev. + + *) Feature: the "valid" parameter of the "resolver" directive. By + default TTL returned by a DNS server is used. + Thanks to Kirill A. Korinskiy. + + *) Bugfix: nginx might hang after a worker process abnormal termination. + + *) Bugfix: a segmentation fault might occur in a worker process if SNI + was used; the bug had appeared in 1.1.2. + + *) Bugfix: in the "keepalive_disable" directive; the bug had appeared in + 1.1.8. + Thanks to Alexander Usov. + + *) Bugfix: SIGWINCH signal did not work after first binary upgrade; the + bug had appeared in 1.1.1. + + *) Bugfix: backend responses with length not matching "Content-Length" + header line are no longer cached. + + *) Bugfix: in the "scgi_param" directive, if complex parameters were + used. + + *) Bugfix: in the "epoll" event method. + Thanks to Yichun Zhang. + + *) Bugfix: in the ngx_http_flv_module. + Thanks to Piotr Sikora. + + *) Bugfix: in the ngx_http_mp4_module. + + *) Bugfix: IPv6 addresses are now handled properly in a request line and + in a "Host" request header line. + + *) Bugfix: "add_header" and "expires" directives did not work if a + request was proxied and response status code was 206. + + *) Bugfix: nginx could not be built on FreeBSD 10. + + *) Bugfix: nginx could not be built on AIX. + + +Changes with nginx 1.1.8 14 Nov 2011 + + *) Change: the ngx_http_limit_zone_module was renamed to the + ngx_http_limit_conn_module. + + *) Change: the "limit_zone" directive was superseded by the + "limit_conn_zone" directive with a new syntax. + + *) Feature: support for multiple "limit_conn" limits on the same level. + + *) Feature: the "image_filter_sharpen" directive. + + *) Bugfix: a segmentation fault might occur in a worker process if + resolver got a big DNS response. + Thanks to Ben Hawkes. + + *) Bugfix: in cache key calculation if internal MD5 implementation was + used; the bug had appeared in 1.0.4. + + *) Bugfix: the "If-Modified-Since", "If-Range", etc. client request + header lines might be passed to backend while caching; or not passed + without caching if caching was enabled in another part of the + configuration. + + *) Bugfix: the module ngx_http_mp4_module sent incorrect + "Content-Length" response header line if the "start" argument was + used. + Thanks to Piotr Sikora. + + +Changes with nginx 1.1.7 31 Oct 2011 + + *) Feature: support of several DNS servers in the "resolver" directive. + Thanks to Kirill A. Korinskiy. + + *) Bugfix: a segmentation fault occurred on start or during + reconfiguration if the "ssl" directive was used at http level and + there was no "ssl_certificate" defined. + + *) Bugfix: reduced memory consumption while proxying big files if they + were buffered to disk. + + *) Bugfix: a segmentation fault might occur in a worker process if + "proxy_http_version 1.1" directive was used. + + *) Bugfix: in the "expires @time" directive. + + +Changes with nginx 1.1.6 17 Oct 2011 + + *) Change in internal API: now module context data are cleared while + internal redirect to named location. + Requested by Yichun Zhang. + + *) Change: if a server in an upstream failed, only one request will be + sent to it after fail_timeout; the server will be considered alive if + it will successfully respond to the request. + + *) Change: now the 0x7F-0x1F characters are escaped as \xXX in an + access_log. + + *) Feature: "proxy/fastcgi/scgi/uwsgi_ignore_headers" directives support + the following additional values: X-Accel-Limit-Rate, + X-Accel-Buffering, X-Accel-Charset. + + *) Feature: decrease of memory consumption if SSL is used. + + *) Bugfix: some UTF-8 characters were processed incorrectly. + Thanks to Alexey Kuts. + + *) Bugfix: the ngx_http_rewrite_module directives specified at "server" + level were executed twice if no matching locations were defined. + + *) Bugfix: a socket leak might occurred if "aio sendfile" was used. + + *) Bugfix: connections with fast clients might be closed after + send_timeout if file AIO was used. + + *) Bugfix: in the ngx_http_autoindex_module. + + *) Bugfix: the module ngx_http_mp4_module did not support seeking on + 32-bit platforms. + + +Changes with nginx 1.1.5 05 Oct 2011 + + *) Feature: the "uwsgi_buffering" and "scgi_buffering" directives. + Thanks to Peter Smit. + + *) Bugfix: non-cacheable responses might be cached if + "proxy_cache_bypass" directive was used. + Thanks to John Ferlito. + + *) Bugfix: in HTTP/1.1 support in the ngx_http_proxy_module. + + *) Bugfix: cached responses with an empty body were returned + incorrectly; the bug had appeared in 0.8.31. + + *) Bugfix: 201 responses of the ngx_http_dav_module were incorrect; the + bug had appeared in 0.8.32. + + *) Bugfix: in the "return" directive. + + *) Bugfix: the "ssl_session_cache builtin" directive caused segmentation + fault; the bug had appeared in 1.1.1. + + +Changes with nginx 1.1.4 20 Sep 2011 + + *) Feature: the ngx_http_upstream_keepalive module. + + *) Feature: the "proxy_http_version" directive. + + *) Feature: the "fastcgi_keep_conn" directive. + + *) Feature: the "worker_aio_requests" directive. + + *) Bugfix: if nginx was built --with-file-aio it could not be run on + Linux kernel which did not support AIO. + + *) Bugfix: in Linux AIO error processing. + Thanks to Hagai Avrahami. + + *) Bugfix: reduced memory consumption for long-lived requests. + + *) Bugfix: the module ngx_http_mp4_module did not support 64-bit MP4 + "co64" atom. + + +Changes with nginx 1.1.3 14 Sep 2011 + + *) Feature: the module ngx_http_mp4_module. + + *) Bugfix: in Linux AIO combined with open_file_cache. + + *) Bugfix: open_file_cache did not update file info on retest if file + was not atomically changed. + + *) Bugfix: nginx could not be built on MacOSX 10.7. + + +Changes with nginx 1.1.2 05 Sep 2011 + + *) Change: now if total size of all ranges is greater than source + response size, then nginx disables ranges and returns just the source + response. + + *) Feature: the "max_ranges" directive. + + *) Bugfix: the "ssl_verify_client", "ssl_verify_depth", and + "ssl_prefer_server_ciphers" directives might work incorrectly if SNI + was used. + + *) Bugfix: in the "proxy/fastcgi/scgi/uwsgi_ignore_client_abort" + directives. + + +Changes with nginx 1.1.1 22 Aug 2011 + + *) Change: now cache loader processes either as many files as specified + by "loader_files" parameter or works no longer than time specified by + the "loader_threshold" parameter during each iteration. + + *) Change: now SIGWINCH signal works only in daemon mode. + + *) Feature: now shared zones and caches use POSIX semaphores on Solaris. + Thanks to Den Ivanov. + + *) Feature: accept filters are now supported on NetBSD. + + *) Bugfix: nginx could not be built on Linux 3.0. + + *) Bugfix: nginx did not use gzipping in some cases; the bug had + appeared in 1.1.0. + + *) Bugfix: request body might be processed incorrectly if client used + pipelining. + + *) Bugfix: in the "request_body_in_single_buf" directive. + + *) Bugfix: in "proxy_set_body" and "proxy_pass_request_body" directives + if SSL connection to backend was used. + + *) Bugfix: nginx hogged CPU if all servers in an upstream were marked as + "down". + + *) Bugfix: a segmentation fault might occur during reconfiguration if + ssl_session_cache was defined but not used in previous configuration. + + *) Bugfix: a segmentation fault might occur in a worker process if many + backup servers were used in an upstream. + + *) Bugfix: a segmentation fault might occur in a worker process if + "fastcgi/scgi/uwsgi_param" directives were used with values starting + with "HTTP_"; the bug had appeared in 0.8.40. + + +Changes with nginx 1.1.0 01 Aug 2011 + + *) Feature: cache loader run time decrease. + + *) Feature: "loader_files", "loader_sleep", and "loader_threshold" + options of the "proxy/fastcgi/scgi/uwsgi_cache_path" directives. + + *) Feature: loading time decrease of configuration with large number of + HTTPS sites. + + *) Feature: now nginx supports ECDHE key exchange ciphers. + Thanks to Adrian Kotelba. + + *) Feature: the "lingering_close" directive. + Thanks to Maxim Dounin. + + *) Bugfix: in closing connection for pipelined requests. + Thanks to Maxim Dounin. + + *) Bugfix: nginx did not disable gzipping if client sent "gzip;q=0" in + "Accept-Encoding" request header line. + + *) Bugfix: in timeout in unbuffered proxied mode. + Thanks to Maxim Dounin. + + *) Bugfix: memory leaks when a "proxy_pass" directive contains variables + and proxies to an HTTPS backend. + Thanks to Maxim Dounin. + + *) Bugfix: in parameter validaiton of a "proxy_pass" directive with + variables. + Thanks to Lanshun Zhou. + + *) Bugfix: SSL did not work on QNX. + Thanks to Maxim Dounin. + + *) Bugfix: SSL modules could not be built by gcc 4.6 without + --with-debug option. + + +Changes with nginx 1.0.5 19 Jul 2011 + + *) Change: now default SSL ciphers are "HIGH:!aNULL:!MD5". + Thanks to Rob Stradling. + + *) Feature: the "referer_hash_max_size" and "referer_hash_bucket_size" + directives. + Thanks to Witold Filipczyk. + + *) Feature: $uid_reset variable. + + *) Bugfix: a segmentation fault might occur in a worker process, if a + caching was used. + Thanks to Lanshun Zhou. + + *) Bugfix: worker processes may got caught in an endless loop during + reconfiguration, if a caching was used; the bug had appeared in + 0.8.48. + Thanks to Maxim Dounin. + + *) Bugfix: "stalled cache updating" alert. + Thanks to Maxim Dounin. + + +Changes with nginx 1.0.4 01 Jun 2011 + + *) Change: now regular expressions case sensitivity in the "map" + directive is given by prefixes "~" or "~*". + + *) Feature: now shared zones and caches use POSIX semaphores on Linux. + Thanks to Denis F. Latypoff. + + *) Bugfix: "stalled cache updating" alert. + + *) Bugfix: nginx could not be built --without-http_auth_basic_module; + the bug had appeared in 1.0.3. + + +Changes with nginx 1.0.3 25 May 2011 + + *) Feature: the "auth_basic_user_file" directive supports "$apr1", + "{PLAIN}", and "{SSHA}" password encryption methods. + Thanks to Maxim Dounin. + + *) Feature: the "geoip_org" directive and $geoip_org variable. + Thanks to Alexander Uskov, Arnaud Granal, and Denis F. Latypoff. + + *) Feature: ngx_http_geo_module and ngx_http_geoip_module support IPv4 + addresses mapped to IPv6 addresses. + + *) Bugfix: a segmentation fault occurred in a worker process during + testing IPv4 address mapped to IPv6 address, if access or deny rules + were defined only for IPv6; the bug had appeared in 0.8.22. + + *) Bugfix: a cached response may be broken if "proxy/fastcgi/scgi/ + uwsgi_cache_bypass" and "proxy/fastcgi/scgi/uwsgi_no_cache" directive + values were different; the bug had appeared in 0.8.46. + + +Changes with nginx 1.0.2 10 May 2011 + + *) Feature: now shared zones and caches use POSIX semaphores. + + *) Bugfix: in the "rotate" parameter of the "image_filter" directive. + Thanks to Adam Bocim. + + *) Bugfix: nginx could not be built on Solaris; the bug had appeared in + 1.0.1. + + +Changes with nginx 1.0.1 03 May 2011 + + *) Change: now the "split_clients" directive uses MurmurHash2 algorithm + because of better distribution. + Thanks to Oleg Mamontov. + + *) Change: now long strings starting with zero are not considered as + false values. + Thanks to Maxim Dounin. + + *) Change: now nginx uses a default listen backlog value 511 on Linux. + + *) Feature: the $upstream_... variables may be used in the SSI and perl + modules. + + *) Bugfix: now nginx limits better disk cache size. + Thanks to Oleg Mamontov. + + *) Bugfix: a segmentation fault might occur while parsing incorrect IPv4 + address; the bug had appeared in 0.9.3. + Thanks to Maxim Dounin. + + *) Bugfix: nginx could not be built by gcc 4.6 without --with-debug + option. + + *) Bugfix: nginx could not be built on Solaris 9 and earlier; the bug + had appeared in 0.9.3. + Thanks to Dagobert Michelsen. + + *) Bugfix: $request_time variable had invalid values if subrequests were + used; the bug had appeared in 0.8.47. + Thanks to Igor A. Valcov. + + +Changes with nginx 1.0.0 12 Apr 2011 + + *) Bugfix: a cache manager might hog CPU after reload. + Thanks to Maxim Dounin. + + *) Bugfix: an "image_filter crop" directive worked incorrectly coupled + with an "image_filter rotate 180" directive. + + *) Bugfix: a "satisfy any" directive disabled custom 401 error page. + + +Changes with nginx 0.9.7 04 Apr 2011 + + *) Feature: now keepalive connections may be closed premature, if there + are no free worker connections. + Thanks to Maxim Dounin. + + *) Feature: the "rotate" parameter of the "image_filter" directive. + Thanks to Adam Bocim. + + *) Bugfix: a case when a backend in "fastcgi_pass", "scgi_pass", or + "uwsgi_pass" directives is given by expression and refers to a + defined upstream. + + +Changes with nginx 0.9.6 21 Mar 2011 + + *) Feature: the "map" directive supports regular expressions as value of + the first parameter. + + *) Feature: $time_iso8601 access_log variable. + Thanks to Michael Lustfield. + + +Changes with nginx 0.9.5 21 Feb 2011 + + *) Change: now nginx uses a default listen backlog value -1 on Linux. + Thanks to Andrei Nigmatulin. + + *) Feature: the "utf8" parameter of "geoip_country" and "geoip_city" + directives. + Thanks to Denis F. Latypoff. + + *) Bugfix: in a default "proxy_redirect" directive if "proxy_pass" + directive has no URI part. + Thanks to Maxim Dounin. + + *) Bugfix: an "error_page" directive did not work with nonstandard error + codes; the bug had appeared in 0.8.53. + Thanks to Maxim Dounin. + + +Changes with nginx 0.9.4 21 Jan 2011 + + *) Feature: the "server_name" directive supports the $hostname variable. + + *) Feature: 494 code for "Request Header Too Large" error. + + +Changes with nginx 0.9.3 13 Dec 2010 + + *) Bugfix: if there was a single server for given IPv6 address:port + pair, then captures in regular expressions in a "server_name" + directive did not work. + + *) Bugfix: nginx could not be built on Solaris; the bug had appeared in + 0.9.0. + + +Changes with nginx 0.9.2 06 Dec 2010 + + *) Feature: the "If-Unmodified-Since" client request header line + support. + + *) Workaround: fallback to accept() syscall if accept4() was not + implemented; the issue had appeared in 0.9.0. + + *) Bugfix: nginx could not be built on Cygwin; the bug had appeared in + 0.9.0. + + *) Bugfix: for OpenSSL vulnerability CVE-2010-4180. + Thanks to Maxim Dounin. + + +Changes with nginx 0.9.1 30 Nov 2010 + + *) Bugfix: "return CODE message" directives did not work; the bug had + appeared in 0.9.0. + + +Changes with nginx 0.9.0 29 Nov 2010 + + *) Feature: the "keepalive_disable" directive. + + *) Feature: the "map" directive supports variables as value of a defined + variable. + + *) Feature: the "map" directive supports empty strings as value of the + first parameter. + + *) Feature: the "map" directive supports expressions as the first + parameter. + + *) Feature: nginx(8) manual page. + Thanks to Sergey Osokin. + + *) Feature: Linux accept4() support. + Thanks to Simon Liu. + + *) Workaround: elimination of Linux linker warning about "sys_errlist" + and "sys_nerr"; the warning had appeared in 0.8.35. + + *) Bugfix: a segmentation fault might occur in a worker process, if the + "auth_basic" directive was used. + Thanks to Michail Laletin. + + *) Bugfix: compatibility with ngx_http_eval_module; the bug had appeared + in 0.8.42. + + +Changes with nginx 0.8.53 18 Oct 2010 + + *) Feature: now the "error_page" directive allows to change a status + code in a redirect. + + *) Feature: the "gzip_disable" directive supports special "degradation" + mask. + + *) Bugfix: a socket leak might occurred if file AIO was used. + Thanks to Maxim Dounin. + + *) Bugfix: if the first server had no "listen" directive and there was + no explicit default server, then a next server with a "listen" + directive became the default server; the bug had appeared in 0.8.21. + + +Changes with nginx 0.8.52 28 Sep 2010 + + *) Bugfix: nginx used SSL mode for a listen socket if any listen option + was set; the bug had appeared in 0.8.51. + + +Changes with nginx 0.8.51 27 Sep 2010 + + *) Change: the "secure_link_expires" directive has been canceled. + + *) Change: a logging level of resolver errors has been lowered from + "alert" to "error". + + *) Feature: now a listen socket "ssl" parameter may be set several + times. + + +Changes with nginx 0.8.50 02 Sep 2010 + + *) Feature: the "secure_link", "secure_link_md5", and + "secure_link_expires" directives of the ngx_http_secure_link_module. + + *) Feature: the -q switch. + Thanks to Gena Makhomed. + + *) Bugfix: worker processes may got caught in an endless loop during + reconfiguration, if a caching was used; the bug had appeared in + 0.8.48. + + *) Bugfix: in the "gzip_disable" directive. + Thanks to Derrick Petzold. + + *) Bugfix: nginx/Windows could not send stop, quit, reopen, and reload + signals to a process run in other session. + + +Changes with nginx 0.8.49 09 Aug 2010 + + *) Feature: the "image_filter_jpeg_quality" directive supports + variables. + + *) Bugfix: a segmentation fault might occur in a worker process, if the + $geoip_region_name variables was used; the bug had appeared in + 0.8.48. + + *) Bugfix: errors intercepted by error_page were cached only for next + request; the bug had appeared in 0.8.48. + + +Changes with nginx 0.8.48 03 Aug 2010 + + *) Change: now the "server_name" directive default value is an empty + name "". + Thanks to Gena Makhomed. + + *) Change: now the "server_name_in_redirect" directive default value is + "off". + + *) Feature: the $geoip_dma_code, $geoip_area_code, and + $geoip_region_name variables. + Thanks to Christine McGonagle. + + *) Bugfix: the "proxy_pass", "fastcgi_pass", "uwsgi_pass", and + "scgi_pass" directives were not inherited inside "limit_except" + blocks. + + *) Bugfix: the "proxy_cache_min_uses", "fastcgi_cache_min_uses" + "uwsgi_cache_min_uses", and "scgi_cache_min_uses" directives did not + work; the bug had appeared in 0.8.46. + + *) Bugfix: the "fastcgi_split_path_info" directive used incorrectly + captures, if only parts of an URI were captured. + Thanks to Yuriy Taraday and Frank Enderle. + + *) Bugfix: the "rewrite" directive did not escape a ";" character during + copying from URI to query string. + Thanks to Daisuke Murase. + + *) Bugfix: the ngx_http_image_filter_module closed a connection, if an + image was larger than "image_filter_buffer" size. + + +Changes with nginx 0.8.47 28 Jul 2010 + + *) Bugfix: $request_time variable had invalid values for subrequests. + + *) Bugfix: errors intercepted by error_page could not be cached. + + *) Bugfix: a cache manager process may got caught in an endless loop, if + max_size parameter was used; the bug had appeared in 0.8.46. + + +Changes with nginx 0.8.46 19 Jul 2010 + + *) Change: now the "proxy_no_cache", "fastcgi_no_cache", + "uwsgi_no_cache", and "scgi_no_cache" directives affect on a cached + response saving only. + + *) Feature: the "proxy_cache_bypass", "fastcgi_cache_bypass", + "uwsgi_cache_bypass", and "scgi_cache_bypass" directives. + + *) Bugfix: nginx did not free memory in cache keys zones if there was an + error during working with backend: the memory was freed only after + inactivity time or on memory low condition. + + +Changes with nginx 0.8.45 13 Jul 2010 + + *) Feature: ngx_http_xslt_filter improvements. + Thanks to Laurence Rowe. + + *) Bugfix: SSI response might be truncated after include with + wait="yes"; the bug had appeared in 0.7.25. + Thanks to Maxim Dounin. + + *) Bugfix: the "listen" directive did not support the "setfib=0" + parameter. + + +Changes with nginx 0.8.44 05 Jul 2010 + + *) Change: now nginx does not cache by default backend responses, if + they have a "Set-Cookie" header line. + + *) Feature: the "listen" directive supports the "setfib" parameter. + Thanks to Andrew Filonov. + + *) Bugfix: the "sub_filter" directive might change character case on + partial match. + + *) Bugfix: compatibility with HP/UX. + + *) Bugfix: compatibility with AIX xlC_r compiler. + + *) Bugfix: nginx treated large SSLv2 packets as plain requests. + Thanks to Miroslaw Jaworski. + + +Changes with nginx 0.8.43 30 Jun 2010 + + *) Feature: large geo ranges base loading speed-up. + + *) Bugfix: an error_page redirection to "location /zero {return 204;}" + without changing status code kept the error body; the bug had + appeared in 0.8.42. + + *) Bugfix: nginx might close IPv6 listen socket during reconfiguration. + Thanks to Maxim Dounin. + + *) Bugfix: the $uid_set variable may be used at any request processing + stage. + + +Changes with nginx 0.8.42 21 Jun 2010 + + *) Change: now nginx tests locations given by regular expressions, if + request was matched exactly by a location given by a prefix string. + The previous behavior has been introduced in 0.7.1. + + *) Feature: the ngx_http_scgi_module. + Thanks to Manlio Perillo. + + *) Feature: a text answer may be added to a "return" directive. + + +Changes with nginx 0.8.41 15 Jun 2010 + + *) Security: nginx/Windows worker might be terminated abnormally if a + requested file name has invalid UTF-8 encoding. + + *) Change: now nginx allows to use spaces in a request line. + + *) Bugfix: the "proxy_redirect" directive changed incorrectly a backend + "Refresh" response header line. + Thanks to Andrey Andreew and Max Sogin. + + *) Bugfix: nginx did not support path without host name in "Destination" + request header line. + + +Changes with nginx 0.8.40 07 Jun 2010 + + *) Security: now nginx/Windows ignores default file stream name. + Thanks to Jose Antonio Vazquez Gonzalez. + + *) Feature: the ngx_http_uwsgi_module. + Thanks to Roberto De Ioris. + + *) Feature: a "fastcgi_param" directive with value starting with "HTTP_" + overrides a client request header line. + + *) Bugfix: the "If-Modified-Since", "If-Range", etc. client request + header lines were passed to FastCGI-server while caching. + + *) Bugfix: listen unix domain socket could not be changed during + reconfiguration. + Thanks to Maxim Dounin. + + +Changes with nginx 0.8.39 31 May 2010 + + *) Bugfix: an inherited "alias" directive worked incorrectly in + inclusive location. + + *) Bugfix: in "alias" with variables and "try_files" directives + combination. + + *) Bugfix: listen unix domain and IPv6 sockets did not inherit while + online upgrade. + Thanks to Maxim Dounin. + + +Changes with nginx 0.8.38 24 May 2010 + + *) Feature: the "proxy_no_cache" and "fastcgi_no_cache" directives. + + *) Feature: now the "rewrite" directive does a redirect automatically if + the $scheme variable is used. + Thanks to Piotr Sikora. + + *) Bugfix: now "limit_req" delay directive conforms to the described + algorithm. + Thanks to Maxim Dounin. + + *) Bugfix: the $uid_got variable might not be used in the SSI and perl + modules. + + +Changes with nginx 0.8.37 17 May 2010 + + *) Feature: the ngx_http_split_clients_module. + + *) Feature: the "map" directive supports keys more than 255 characters. + + *) Bugfix: nginx ignored the "private" and "no-store" values in the + "Cache-Control" backend response header line. + + *) Bugfix: a "stub" parameter of an "include" SSI directive was not + used, if empty response has 200 status code. + + *) Bugfix: if a proxied or FastCGI request was internally redirected to + another proxied or FastCGI location, then a segmentation fault might + occur in a worker process; the bug had appeared in 0.8.33. + Thanks to Yichun Zhang. + + *) Bugfix: IMAP connections may hang until they timed out while talking + to Zimbra server. + Thanks to Alan Batie. + + +Changes with nginx 0.8.36 22 Apr 2010 + + *) Bugfix: the ngx_http_dav_module handled incorrectly the DELETE, COPY, + and MOVE methods for symlinks. + + *) Bugfix: values of the $query_string, $arg_..., etc. variables cached + in main request were used by the SSI module in subrequests. + + *) Bugfix: a variable value was repeatedly encoded after each an "echo" + SSI-command output; the bug had appeared in 0.6.14. + + *) Bugfix: a worker process hung if a FIFO file was requested. + Thanks to Vicente Aguilar and Maxim Dounin. + + *) Bugfix: OpenSSL-1.0.0 compatibility on 64-bit Linux. + Thanks to Maxim Dounin. + + *) Bugfix: nginx could not be built --without-http-cache; the bug had + appeared in 0.8.35. + + +Changes with nginx 0.8.35 01 Apr 2010 + + *) Change: now the charset filter runs before the SSI filter. + + *) Feature: the "chunked_transfer_encoding" directive. + + *) Bugfix: an "&" character was not escaped when it was copied in + arguments part in a rewrite rule. + + *) Bugfix: nginx might be terminated abnormally while a signal + processing or if the directive "timer_resolution" was used on + platforms which do not support kqueue or eventport notification + methods. + Thanks to George Xie and Maxim Dounin. + + *) Bugfix: if temporary files and permanent storage area resided at + different file systems, then permanent file modification times were + incorrect. + Thanks to Maxim Dounin. + + *) Bugfix: ngx_http_memcached_module might issue the error message + "memcached sent invalid trailer". + Thanks to Maxim Dounin. + + *) Bugfix: nginx could not built zlib-1.2.4 library using the library + sources. + Thanks to Maxim Dounin. + + *) Bugfix: a segmentation fault occurred in a worker process, if there + was large stderr output before FastCGI response; the bug had appeared + in 0.8.34. + Thanks to Maxim Dounin. + + +Changes with nginx 0.8.34 03 Mar 2010 + + *) Bugfix: nginx did not support all ciphers and digests used in client + certificates. + Thanks to Innocenty Enikeew. + + *) Bugfix: nginx cached incorrectly FastCGI responses if there was large + stderr output before response. + + *) Bugfix: nginx did not support HTTPS referrers. + + *) Bugfix: nginx/Windows might not find file if path in configuration + was given in other character case; the bug had appeared in 0.8.33. + + *) Bugfix: the $date_local variable has an incorrect value, if the "%s" + format was used. + Thanks to Maxim Dounin. + + *) Bugfix: if ssl_session_cache was not set or was set to "none", then + during client certificate verify the error "session id context + uninitialized" might occur; the bug had appeared in 0.7.1. + + *) Bugfix: a geo range returned default value if the range included two + or more /16 networks and did not begin at /16 network boundary. + + *) Bugfix: a block used in a "stub" parameter of an "include" SSI + directive was output with "text/plain" MIME type. + + *) Bugfix: $r->sleep() did not work; the bug had appeared in 0.8.11. + + +Changes with nginx 0.8.33 01 Feb 2010 + + *) Security: now nginx/Windows ignores trailing spaces in URI. + Thanks to Dan Crowley, Core Security Technologies. + + *) Security: now nginx/Windows ignores short files names. + Thanks to Dan Crowley, Core Security Technologies. + + *) Change: now keepalive connections after POST requests are not + disabled for MSIE 7.0+. + Thanks to Adam Lounds. + + *) Workaround: now keepalive connections are disabled for Safari. + Thanks to Joshua Sierles. + + *) Bugfix: if a proxied or FastCGI request was internally redirected to + another proxied or FastCGI location, then $upstream_response_time + variable may have abnormally large value; the bug had appeared in + 0.8.7. + + *) Bugfix: a segmentation fault might occur in a worker process, while + discarding a request body; the bug had appeared in 0.8.11. + + +Changes with nginx 0.8.32 11 Jan 2010 + + *) Bugfix: UTF-8 encoding usage in the ngx_http_autoindex_module. + Thanks to Maxim Dounin. + + *) Bugfix: regular expression named captures worked for two names only. + Thanks to Maxim Dounin. + + *) Bugfix: now the "localhost" name is used in the "Host" request header + line, if an unix domain socket is defined in the "auth_http" + directive. + Thanks to Maxim Dounin. + + *) Bugfix: nginx did not support chunked transfer encoding for 201 + responses. + Thanks to Julian Reich. + + *) Bugfix: if the "expires modified" set date in the past, then a + negative number was set in the "Cache-Control" response header line. + Thanks to Alex Kapranoff. + + +Changes with nginx 0.8.31 23 Dec 2009 + + *) Feature: now the "error_page" directive may redirect the 301 and 302 + responses. + + *) Feature: the $geoip_city_continent_code, $geoip_latitude, and + $geoip_longitude variables. + Thanks to Arvind Sundararajan. + + *) Feature: now the ngx_http_image_filter_module deletes always EXIF and + other application specific data if the data consume more than 5% of a + JPEG file. + + *) Bugfix: nginx closed a connection if a cached response had an empty + body. + Thanks to Piotr Sikora. + + *) Bugfix: nginx might not be built by gcc 4.x if the -O2 or higher + optimization option was used. + Thanks to Maxim Dounin and Denis F. Latypoff. + + *) Bugfix: regular expressions in location were always tested in + case-sensitive mode; the bug had appeared in 0.8.25. + + *) Bugfix: nginx cached a 304 response if there was the "If-None-Match" + header line in a proxied request. + Thanks to Tim Dettrick and David Kostal. + + *) Bugfix: nginx/Windows tried to delete a temporary file twice if the + file should replace an already existent file. + + +Changes with nginx 0.8.30 15 Dec 2009 + + *) Change: now the default buffer size of the + "large_client_header_buffers" directive is 8K. + Thanks to Andrew Cholakian. + + *) Feature: the conf/fastcgi.conf for simple FastCGI configurations. + + *) Bugfix: nginx/Windows tried to rename a temporary file twice if the + file should replace an already existent file. + + *) Bugfix: of "double free or corruption" error issued if host could not + be resolved; the bug had appeared in 0.8.22. + Thanks to Konstantin Svist. + + *) Bugfix: in libatomic usage on some platforms. + Thanks to W-Mark Kubacki. + + +Changes with nginx 0.8.29 30 Nov 2009 + + *) Change: now the "009" status code is written to an access log for + proxied HTTP/0.9 responses. + + *) Feature: the "addition_types", "charset_types", "gzip_types", + "ssi_types", "sub_filter_types", and "xslt_types" directives support + an "*" parameter. + + *) Feature: GCC 4.1+ built-in atomic operations usage. + Thanks to W-Mark Kubacki. + + *) Feature: the --with-libatomic[=DIR] option in the configure. + Thanks to W-Mark Kubacki. + + *) Bugfix: listen unix domain socket had limited access rights. + + *) Bugfix: cached HTTP/0.9 responses were handled incorrectly. + + *) Bugfix: regular expression named captures given by "?P<...>" did not + work in a "server_name" directive. + Thanks to Maxim Dounin. + + +Changes with nginx 0.8.28 23 Nov 2009 + + *) Bugfix: nginx could not be built with the --without-pcre parameter; + the bug had appeared in 0.8.25. + + +Changes with nginx 0.8.27 17 Nov 2009 + + *) Bugfix: regular expressions did not work in nginx/Windows; the bug + had appeared in 0.8.25. + + +Changes with nginx 0.8.26 16 Nov 2009 + + *) Bugfix: in captures usage in "rewrite" directive; the bug had + appeared in 0.8.25. + + *) Bugfix: nginx could not be built without the --with-debug option; the + bug had appeared in 0.8.25. + + +Changes with nginx 0.8.25 16 Nov 2009 + + *) Change: now no message is written in an error log if a variable is + not found by $r->variable() method. + + *) Feature: the ngx_http_degradation_module. + + *) Feature: regular expression named captures. + + *) Feature: now URI part is not required a "proxy_pass" directive if + variables are used. + + *) Feature: now the "msie_padding" directive works for Chrome too. + + *) Bugfix: a segmentation fault occurred in a worker process on low + memory condition; the bug had appeared in 0.8.18. + + *) Bugfix: nginx sent gzipped responses to clients those do not support + gzip, if "gzip_static on" and "gzip_vary off"; the bug had appeared + in 0.8.16. + + +Changes with nginx 0.8.24 11 Nov 2009 + + *) Bugfix: nginx always added "Content-Encoding: gzip" response header + line in 304 responses sent by ngx_http_gzip_static_module. + + *) Bugfix: nginx could not be built without the --with-debug option; the + bug had appeared in 0.8.23. + + *) Bugfix: the "unix:" parameter of the "set_real_ip_from" directive + inherited incorrectly from previous level. + + *) Bugfix: in resolving empty name. + + +Changes with nginx 0.8.23 11 Nov 2009 + + *) Security: now SSL/TLS renegotiation is disabled. + Thanks to Maxim Dounin. + + *) Bugfix: listen unix domain socket did not inherit while online + upgrade. + + *) Bugfix: the "unix:" parameter of the "set_real_ip_from" directive did + not without yet another directive with any IP address. + + *) Bugfix: segmentation fault and infinite looping in resolver. + + *) Bugfix: in resolver. + Thanks to Artem Bokhan. + + +Changes with nginx 0.8.22 03 Nov 2009 + + *) Feature: the "proxy_bind", "fastcgi_bind", and "memcached_bind" + directives. + + *) Feature: the "access" and the "deny" directives support IPv6. + + *) Feature: the "set_real_ip_from" directive supports IPv6 addresses in + request headers. + + *) Feature: the "unix:" parameter of the "set_real_ip_from" directive. + + *) Bugfix: nginx did not delete unix domain socket after configuration + testing. + + *) Bugfix: nginx deleted unix domain socket while online upgrade. + + *) Bugfix: the "!-x" operator did not work. + Thanks to Maxim Dounin. + + *) Bugfix: a segmentation fault might occur in a worker process, if + limit_rate was used in HTTPS server. + Thanks to Maxim Dounin. + + *) Bugfix: a segmentation fault might occur in a worker process while + $limit_rate logging. + Thanks to Maxim Dounin. + + *) Bugfix: a segmentation fault might occur in a worker process, if + there was no "listen" directive in "server" block; the bug had + appeared in 0.8.21. + + +Changes with nginx 0.8.21 26 Oct 2009 + + *) Feature: now the "-V" switch shows TLS SNI support. + + *) Feature: the "listen" directive of the HTTP module supports unix + domain sockets. + Thanks to Hongli Lai. + + *) Feature: the "default_server" parameter of the "listen" directive. + + *) Feature: now a "default" parameter is not required to set listen + socket options. + + *) Bugfix: nginx did not support dates in 2038 year on 32-bit platforms; + + *) Bugfix: socket leak; the bug had appeared in 0.8.11. + + +Changes with nginx 0.8.20 14 Oct 2009 + + *) Change: now default SSL ciphers are "HIGH:!ADH:!MD5". + + *) Bugfix: the ngx_http_autoindex_module did not show the trailing slash + in links to a directory; the bug had appeared in 0.7.15. + + *) Bugfix: nginx did not close a log file set by the --error-log-path + configuration option; the bug had appeared in 0.7.53. + + *) Bugfix: nginx did not treat a comma as separator in the + "Cache-Control" backend response header line. + + *) Bugfix: nginx/Windows might not create temporary file, a cache file, + or "proxy/fastcgi_store"d file if a worker had no enough access + rights for top level directories. + + *) Bugfix: the "Set-Cookie" and "P3P" FastCGI response header lines were + not hidden while caching if no "fastcgi_hide_header" directives were + used with any parameters. + + *) Bugfix: nginx counted incorrectly disk cache size. + + +Changes with nginx 0.8.19 06 Oct 2009 + + *) Change: now SSLv2 protocol is disabled by default. + + *) Change: now default SSL ciphers are "ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM". + + *) Bugfix: a "limit_req" directive did not work; the bug had appeared in + 0.8.18. + + +Changes with nginx 0.8.18 06 Oct 2009 + + *) Feature: the "read_ahead" directive. + + *) Feature: now several "perl_modules" directives may be used. + + *) Feature: the "limit_req_log_level" and "limit_conn_log_level" + directives. + + *) Bugfix: now "limit_req" directive conforms to the leaky bucket + algorithm. + Thanks to Maxim Dounin. + + *) Bugfix: nginx did not work on Linux/sparc. + Thanks to Marcus Ramberg. + + *) Bugfix: nginx sent '\0' in a "Location" response header line on MKCOL + request. + Thanks to Xie Zhenye. + + *) Bugfix: zero status code was logged instead of 499 status code; the + bug had appeared in 0.8.11. + + *) Bugfix: socket leak; the bug had appeared in 0.8.11. + + +Changes with nginx 0.8.17 28 Sep 2009 + + *) Security: now "/../" are disabled in "Destination" request header + line. + + *) Change: now $host variable value is always low case. + + *) Feature: the $ssl_session_id variable. + + *) Bugfix: socket leak; the bug had appeared in 0.8.11. + + +Changes with nginx 0.8.16 22 Sep 2009 + + *) Feature: the "image_filter_transparency" directive. + + *) Bugfix: "addition_types" directive was incorrectly named + "addtion_types". + + *) Bugfix: resolver cache poisoning. + Thanks to Matthew Dempsky. + + *) Bugfix: memory leak in resolver. + Thanks to Matthew Dempsky. + + *) Bugfix: invalid request line in $request variable was written in + access_log only if error_log was set to "info" or "debug" level. + + *) Bugfix: in PNG alpha-channel support in the + ngx_http_image_filter_module. + + *) Bugfix: nginx always added "Vary: Accept-Encoding" response header + line, if both "gzip_static" and "gzip_vary" were on. + + *) Bugfix: in UTF-8 encoding support by "try_files" directive in + nginx/Windows. + + *) Bugfix: in "post_action" directive usage; the bug had appeared in + 0.8.11. + Thanks to Igor Artemiev. + + +Changes with nginx 0.8.15 14 Sep 2009 + + *) Security: a segmentation fault might occur in worker process while + specially crafted request handling. + Thanks to Chris Ries. + + *) Bugfix: if names .domain.tld, .sub.domain.tld, and .domain-some.tld + were defined, then the name .sub.domain.tld was matched by + .domain.tld. + + *) Bugfix: in transparency support in the ngx_http_image_filter_module. + + *) Bugfix: in file AIO. + + *) Bugfix: in X-Accel-Redirect usage; the bug had appeared in 0.8.11. + + *) Bugfix: in embedded perl module; the bug had appeared in 0.8.11. + + +Changes with nginx 0.8.14 07 Sep 2009 + + *) Bugfix: an expired cached response might stick in the "UPDATING" + state. + + *) Bugfix: a segmentation fault might occur in worker process, if + error_log was set to info or debug level. + Thanks to Sergey Bochenkov. + + *) Bugfix: in embedded perl module; the bug had appeared in 0.8.11. + + *) Bugfix: an "error_page" directive did not redirect a 413 error; the + bug had appeared in 0.6.10. + + +Changes with nginx 0.8.13 31 Aug 2009 + + *) Bugfix: in the "aio sendfile" directive; the bug had appeared in + 0.8.12. + + *) Bugfix: nginx could not be built without the --with-file-aio option + on FreeBSD; the bug had appeared in 0.8.12. + + +Changes with nginx 0.8.12 31 Aug 2009 + + *) Feature: the "sendfile" parameter in the "aio" directive on FreeBSD. + + *) Bugfix: in try_files; the bug had appeared in 0.8.11. + + *) Bugfix: in memcached; the bug had appeared in 0.8.11. + + +Changes with nginx 0.8.11 28 Aug 2009 + + *) Change: now directive "gzip_disable msie6" does not disable gzipping + for MSIE 6.0 SV1. + + *) Feature: file AIO support on FreeBSD and Linux. + + *) Feature: the "directio_alignment" directive. + + +Changes with nginx 0.8.10 24 Aug 2009 + + *) Bugfix: memory leaks if GeoIP City database was used. + + *) Bugfix: in copying temporary files to permanent storage area; the bug + had appeared in 0.8.9. + + +Changes with nginx 0.8.9 17 Aug 2009 + + *) Feature: now the start cache loader runs in a separate process; this + should improve large caches handling. + + *) Feature: now temporary files and permanent storage area may reside at + different file systems. + + +Changes with nginx 0.8.8 10 Aug 2009 + + *) Bugfix: in handling FastCGI headers split in records. + + *) Bugfix: a segmentation fault occurred in worker process, if a request + was handled in two proxied or FastCGIed locations and a caching was + enabled in the first location; the bug had appeared in 0.8.7. + + +Changes with nginx 0.8.7 27 Jul 2009 + + *) Change: minimum supported OpenSSL version is 0.9.7. + + *) Change: the "ask" parameter of the "ssl_verify_client" directive was + changed to the "optional" parameter and now it checks a client + certificate if it was offered. + Thanks to Brice Figureau. + + *) Feature: the $ssl_client_verify variable. + Thanks to Brice Figureau. + + *) Feature: the "ssl_crl" directive. + Thanks to Brice Figureau. + + *) Feature: the "proxy" parameter of the "geo" directive. + + *) Feature: the "image_filter" directive supports variables for setting + size. + + *) Bugfix: the $ssl_client_cert variable usage corrupted memory; the bug + had appeared in 0.7.7. + Thanks to Sergey Zhuravlev. + + *) Bugfix: "proxy_pass_header" and "fastcgi_pass_header" directives did + not pass to a client the "X-Accel-Redirect", "X-Accel-Limit-Rate", + "X-Accel-Buffering", and "X-Accel-Charset" lines from backend + response header. + Thanks to Maxim Dounin. + + *) Bugfix: in handling "Last-Modified" and "Accept-Ranges" backend + response header lines; the bug had appeared in 0.7.44. + Thanks to Maxim Dounin. + + *) Bugfix: the "[alert] zero size buf" error if subrequest returns an + empty response; the bug had appeared in 0.8.5. + + +Changes with nginx 0.8.6 20 Jul 2009 + + *) Feature: the ngx_http_geoip_module. + + *) Bugfix: XSLT filter may fail with message "not well formed XML + document" for valid XML document. + Thanks to Kuramoto Eiji. + + *) Bugfix: now in MacOSX, Cygwin, and nginx/Windows locations given by a + regular expression are always tested in case insensitive mode. + + *) Bugfix: now nginx/Windows ignores trailing dots in URI. + Thanks to Hugo Leisink. + + *) Bugfix: name of file specified in --conf-path was not honored during + installation; the bug had appeared in 0.6.6. + Thanks to Maxim Dounin. + + +Changes with nginx 0.8.5 13 Jul 2009 + + *) Bugfix: now nginx allows underscores in a request method. + + *) Bugfix: a 500 error code was returned for invalid login/password + while HTTP Basic authentication on Windows. + + *) Bugfix: ngx_http_perl_module responses did not work in subrequests. + + *) Bugfix: in ngx_http_limit_req_module. + Thanks to Maxim Dounin. + + +Changes with nginx 0.8.4 22 Jun 2009 + + *) Bugfix: nginx could not be built --without-http-cache; the bug had + appeared in 0.8.3. + + +Changes with nginx 0.8.3 19 Jun 2009 + + *) Feature: the $upstream_cache_status variable. + + *) Bugfix: nginx could not be built on MacOSX 10.6. + + *) Bugfix: nginx could not be built --without-http-cache; the bug had + appeared in 0.8.2. + + *) Bugfix: a segmentation fault occurred in worker process, if a backend + 401 error was intercepted and the backend did not set the + "WWW-Authenticate" response header line. + Thanks to Eugene Mychlo. + + +Changes with nginx 0.8.2 15 Jun 2009 + + *) Bugfix: in open_file_cache and proxy/fastcgi cache interaction on + start up. + + *) Bugfix: open_file_cache might cache open file descriptors too long; + the bug had appeared in 0.7.4. + + +Changes with nginx 0.8.1 08 Jun 2009 + + *) Feature: the "updating" parameter in "proxy_cache_use_stale" and + "fastcgi_cache_use_stale" directives. + + *) Bugfix: the "If-Modified-Since", "If-Range", etc. client request + header lines were passed to backend while caching if no + "proxy_set_header" directive was used with any parameters. + + *) Bugfix: the "Set-Cookie" and "P3P" response header lines were not + hidden while caching if no "proxy_hide_header/fastcgi_hide_header" + directives were used with any parameters. + + *) Bugfix: the ngx_http_image_filter_module did not support GIF87a + format. + Thanks to Denis Ilyinyh. + + *) Bugfix: nginx could not be built modules on Solaris 10 and early; the + bug had appeared in 0.7.56. + + +Changes with nginx 0.8.0 02 Jun 2009 + + *) Feature: the "keepalive_requests" directive. + + *) Feature: the "limit_rate_after" directive. + Thanks to Ivan Debnar. + + *) Bugfix: XLST filter did not work in subrequests. + + *) Bugfix: in relative paths handling in nginx/Windows. + + *) Bugfix: in proxy_store, fastcgi_store, proxy_cache, and fastcgi_cache + in nginx/Windows. + + *) Bugfix: in memory allocation error handling. + Thanks to Maxim Dounin and Kirill A. Korinskiy. + + +Changes with nginx 0.7.59 25 May 2009 + + *) Feature: the "proxy_cache_methods" and "fastcgi_cache_methods" + directives. + + *) Bugfix: socket leak; the bug had appeared in 0.7.25. + Thanks to Maxim Dounin. + + *) Bugfix: a segmentation fault occurred in worker process, if a request + had no body and the $request_body variable was used; + the bug had appeared in 0.7.58. + + *) Bugfix: the SSL modules might not built on Solaris and Linux; + the bug had appeared in 0.7.56. + + *) Bugfix: ngx_http_xslt_filter_module responses were not handled by + SSI, charset, and gzip filters. + + *) Bugfix: a "charset" directive did not set a charset to + ngx_http_gzip_static_module responses. + + +Changes with nginx 0.7.58 18 May 2009 + + *) Feature: a "listen" directive of the mail proxy module supports IPv6. + + *) Feature: the "image_filter_jpeg_quality" directive. + + *) Feature: the "client_body_in_single_buffer" directive. + + *) Feature: the $request_body variable. + + *) Bugfix: in ngx_http_autoindex_module in file name links having a ":" + symbol in the name. + + *) Bugfix: "make upgrade" procedure did not work; the bug had appeared + in 0.7.53. + Thanks to Denis F. Latypoff. + + +Changes with nginx 0.7.57 12 May 2009 + + *) Bugfix: a floating-point fault occurred in worker process, if the + ngx_http_image_filter_module errors were redirected to named + location; the bug had appeared in 0.7.56. + + +Changes with nginx 0.7.56 11 May 2009 + + *) Feature: nginx/Windows supports IPv6 in a "listen" directive of the + HTTP module. + + *) Bugfix: in ngx_http_image_filter_module. + + +Changes with nginx 0.7.55 06 May 2009 + + *) Bugfix: the http_XXX parameters in "proxy_cache_use_stale" and + "fastcgi_cache_use_stale" directives did not work. + + *) Bugfix: fastcgi cache did not cache header only responses. + + *) Bugfix: of "select() failed (9: Bad file descriptor)" error in + nginx/Unix and "select() failed (10038: ...)" error in nginx/Windows. + + *) Bugfix: a segmentation fault might occur in worker process, if an + "debug_connection" directive was used; the bug had appeared in + 0.7.54. + + *) Bugfix: fix ngx_http_image_filter_module building errors. + + *) Bugfix: the files bigger than 2G could not be transferred using + $r->sendfile. + Thanks to Maxim Dounin. + + +Changes with nginx 0.7.54 01 May 2009 + + *) Feature: the ngx_http_image_filter_module. + + *) Feature: the "proxy_ignore_headers" and "fastcgi_ignore_headers" + directives. + + *) Bugfix: a segmentation fault might occur in worker process, if an + "open_file_cache_errors off" directive was used; the bug had appeared + in 0.7.53. + + *) Bugfix: the "port_in_redirect off" directive did not work; the bug + had appeared in 0.7.39. + + *) Bugfix: improve handling of "select" method errors. + + *) Bugfix: of "select() failed (10022: ...)" error in nginx/Windows. + + *) Bugfix: in error text descriptions in nginx/Windows; the bug had + appeared in 0.7.53. + + +Changes with nginx 0.7.53 27 Apr 2009 + + *) Change: now a log set by --error-log-path is created from the very + start-up. + + *) Feature: now the start up errors and warnings are outputted to an + error_log and stderr. + + *) Feature: the empty --prefix= configure parameter forces nginx to use + a directory where it was run as prefix. + + *) Feature: the -p switch. + + *) Feature: the -s switch on Unix platforms. + + *) Feature: the -? and -h switches. + Thanks to Jerome Loyet. + + *) Feature: now switches may be set in condensed form. + + *) Bugfix: nginx/Windows did not work if configuration file was given by + the -c switch. + + *) Bugfix: temporary files might be not removed if the "proxy_store", + "fastcgi_store", "proxy_cache", or "fastcgi_cache" were used. + Thanks to Maxim Dounin. + + *) Bugfix: an incorrect value was passed to mail proxy authentication + server in "Auth-Method" header line; the bug had appeared + in 0.7.34. + Thanks to Simon Lecaille. + + *) Bugfix: system error text descriptions were not logged on Linux; + the bug had appeared in 0.7.45. + + *) Bugfix: the "fastcgi_cache_min_uses" directive did not work. + Thanks to Andrew Vorobyoff. + + +Changes with nginx 0.7.52 20 Apr 2009 + + *) Feature: the first native Windows binary release. + + *) Bugfix: in processing HEAD method while caching. + + *) Bugfix: in processing the "If-Modified-Since", "If-Range", etc. + client request header lines while caching. + + *) Bugfix: now the "Set-Cookie" and "P3P" header lines are hidden in + cacheable responses. + + *) Bugfix: if nginx was built with the ngx_http_perl_module and with a + perl which supports threads, then during a master process exit the + message "panic: MUTEX_LOCK" might be issued. + + *) Bugfix: nginx could not be built --without-http-cache; the bug had + appeared in 0.7.48. + + *) Bugfix: nginx could not be built on platforms different from i386, + amd64, sparc, and ppc; the bug had appeared in 0.7.42. + + +Changes with nginx 0.7.51 12 Apr 2009 + + *) Feature: the "try_files" directive supports a response code in the + fallback parameter. + + *) Feature: now any response code can be used in the "return" directive. + + *) Bugfix: the "error_page" directive made an external redirect without + query string; the bug had appeared in 0.7.44. + + *) Bugfix: if servers listened on several defined explicitly addresses, + then virtual servers might not work; the bug had appeared in 0.7.39. + + +Changes with nginx 0.7.50 06 Apr 2009 + + *) Bugfix: the $arg_... variables did not work; the bug had appeared in + 0.7.49. + + +Changes with nginx 0.7.49 06 Apr 2009 + + *) Bugfix: a segmentation fault might occur in worker process, if the + $arg_... variables were used; the bug had appeared in 0.7.48. + + +Changes with nginx 0.7.48 06 Apr 2009 + + *) Feature: the "proxy_cache_key" directive. + + *) Bugfix: now nginx takes into account the "X-Accel-Expires", + "Expires", and "Cache-Control" header lines in a backend response. + + *) Bugfix: now nginx caches responses for the GET requests only. + + *) Bugfix: the "fastcgi_cache_key" directive was not inherited. + + *) Bugfix: the $arg_... variables did not work with SSI subrequests. + Thanks to Maxim Dounin. + + *) Bugfix: nginx could not be built with uclibc library. + Thanks to Timothy Redaelli. + + *) Bugfix: nginx could not be built on OpenBSD; the bug had + appeared in 0.7.46. + + +Changes with nginx 0.7.47 01 Apr 2009 + + *) Bugfix: nginx could not be built on FreeBSD 6 and early versions; the + bug had appeared in 0.7.46. + + *) Bugfix: nginx could not be built on MacOSX; the bug had + appeared in 0.7.46. + + *) Bugfix: if the "max_size" parameter was set, then the cache manager + might purge a whole cache; the bug had appeared in 0.7.46. + + *) Change: a segmentation fault might occur in worker process, if the + "proxy_cache"/"fastcgi_cache" and the "proxy_cache_valid"/ + "fastcgi_cache_valid" were set on different levels; the bug had + appeared in 0.7.46. + + *) Bugfix: a segmentation fault might occur in worker process, if a + request was redirected to a proxied or FastCGI server via error_page + or try_files; the bug had appeared in 0.7.44. + + +Changes with nginx 0.7.46 30 Mar 2009 + + *) Bugfix: the previous release tarball was incorrect. + + +Changes with nginx 0.7.45 30 Mar 2009 + + *) Change: now the "proxy_cache" and the "proxy_cache_valid" directives + can be set on different levels. + + *) Change: the "clean_time" parameter of the "proxy_cache_path" + directive is canceled. + + *) Feature: the "max_size" parameter of the "proxy_cache_path" + directive. + + *) Feature: the ngx_http_fastcgi_module preliminary cache support. + + *) Feature: now on shared memory allocation errors directive and zone + names are logged. + + *) Bugfix: the directive "add_header last-modified ''" did not delete a + "Last-Modified" response header line; the bug had appeared in 0.7.44. + + *) Bugfix: a relative path in the "auth_basic_user_file" directive given + without variables did not work; the bug had appeared in 0.7.44. + Thanks to Jerome Loyet. + + *) Bugfix: in an "alias" directive given using variables without + references to captures of regular expressions; the bug had appeared + in 0.7.42. + + +Changes with nginx 0.7.44 23 Mar 2009 + + *) Feature: the ngx_http_proxy_module preliminary cache support. + + *) Feature: the --with-pcre option in the configure. + + *) Feature: the "try_files" directive is now allowed on the server block + level. + + *) Bugfix: the "try_files" directive handled incorrectly a query string + in a fallback parameter. + + *) Bugfix: the "try_files" directive might test incorrectly directories. + + *) Bugfix: if there was a single server for given address:port pair, + then captures in regular expressions in a "server_name" directive did + not work. + + +Changes with nginx 0.7.43 18 Mar 2009 + + *) Bugfix: a request was handled incorrectly, if a "root" directive used + variables; the bug had appeared in 0.7.42. + + *) Bugfix: if a server listened on wildcard address, then the + $server_addr variable value was "0.0.0.0"; the bug had appeared in + 0.7.36. + + +Changes with nginx 0.7.42 16 Mar 2009 + + *) Change: now the "Invalid argument" error returned by + setsockopt(TCP_NODELAY) on Solaris, is ignored. + + *) Change: now if a file specified in a "auth_basic_user_file" directive + is absent, then the 403 error is returned instead of the 500 one. + + *) Feature: the "auth_basic_user_file" directive supports variables. + Thanks to Kirill A. Korinskiy. + + *) Feature: the "listen" directive supports the "ipv6only" parameter. + Thanks to Zhang Hua. + + *) Bugfix: in an "alias" directive with references to captures of + regular expressions; the bug had appeared in 0.7.40. + + *) Bugfix: compatibility with Tru64 UNIX. + Thanks to Dustin Marquess. + + *) Bugfix: nginx could not be built without PCRE library; the bug had + appeared in 0.7.41. + + +Changes with nginx 0.7.41 11 Mar 2009 + + *) Bugfix: a segmentation fault might occur in worker process, if a + "server_name" or a "location" directives had captures in regular + expressions; the issue had appeared in 0.7.40. + Thanks to Vladimir Sopot. + + +Changes with nginx 0.7.40 09 Mar 2009 + + *) Feature: the "location" directive supports captures in regular + expressions. + + *) Feature: an "alias" directive with capture references may be used + inside a location given by a regular expression with captures. + + *) Feature: the "server_name" directive supports captures in regular + expressions. + + *) Workaround: the ngx_http_autoindex_module did not show the trailing + slash in directories on XFS filesystem; the issue had appeared in + 0.7.15. + Thanks to Dmitry Kuzmenko. + + +Changes with nginx 0.7.39 02 Mar 2009 + + *) Bugfix: large response with SSI might hang, if gzipping was enabled; + the bug had appeared in 0.7.28. + Thanks to Artem Bokhan. + + *) Bugfix: a segmentation fault might occur in worker process, if short + static variants are used in a "try_files" directive. + + +Changes with nginx 0.7.38 23 Feb 2009 + + *) Feature: authentication failures logging. + + *) Bugfix: name/password in auth_basic_user_file were ignored after odd + number of empty lines. + Thanks to Alexander Zagrebin. + + *) Bugfix: a segmentation fault occurred in a master process, if long + path was used in unix domain socket; the bug had appeared in 0.7.36. + + +Changes with nginx 0.7.37 21 Feb 2009 + + *) Bugfix: directives using upstreams did not work; the bug had appeared + in 0.7.36. + + +Changes with nginx 0.7.36 21 Feb 2009 + + *) Feature: a preliminary IPv6 support; the "listen" directive of the + HTTP module supports IPv6. + + *) Bugfix: the $ancient_browser variable did not work for browsers + preset by a "modern_browser" directives. + + +Changes with nginx 0.7.35 16 Feb 2009 + + *) Bugfix: a "ssl_engine" directive did not use a SSL-accelerator for + asymmetric ciphers. + Thanks to Marcin Gozdalik. + + *) Bugfix: a "try_files" directive set MIME type depending on an + original request extension. + + *) Bugfix: "*domain.tld" names were handled incorrectly in + "server_name", "valid_referers", and "map" directives, if + ".domain.tld" and ".subdomain.domain.tld" wildcards were used; + the bug had appeared in 0.7.9. + + +Changes with nginx 0.7.34 10 Feb 2009 + + *) Feature: the "off" parameter of the "if_modified_since" directive. + + *) Feature: now nginx sends an HELO/EHLO command after a XCLIENT + command. + Thanks to Maxim Dounin. + + *) Feature: Microsoft specific "AUTH LOGIN with User Name" mode support + in mail proxy server. + Thanks to Maxim Dounin. + + *) Bugfix: in a redirect rewrite directive original arguments were + concatenated with new arguments by a "?" rather than an "&"; + the bug had appeared in 0.1.18. + Thanks to Maxim Dounin. + + *) Bugfix: nginx could not be built on AIX. + + +Changes with nginx 0.7.33 02 Feb 2009 + + *) Bugfix: a double response might be returned if the epoll or rtsig + methods are used and a redirect was returned to a request with body. + Thanks to Eden Li. + + *) Bugfix: the $sent_http_location variable was empty for some redirects + types. + + *) Bugfix: a segmentation fault might occur in worker process if + "resolver" directive was used in SMTP proxy. + + +Changes with nginx 0.7.32 26 Jan 2009 + + *) Feature: now a directory existence testing can be set explicitly in + the "try_files" directive. + + *) Bugfix: fastcgi_store stored files not always. + + *) Bugfix: in geo ranges. + + *) Bugfix: in shared memory allocations if nginx was built without + debugging. + Thanks to Andrey Kvasov. + + +Changes with nginx 0.7.31 19 Jan 2009 + + *) Change: now the "try_files" directive tests files only and ignores + directories. + + *) Feature: the "fastcgi_split_path_info" directive. + + *) Bugfixes in an "Expect" request header line support. + + *) Bugfixes in geo ranges. + + *) Bugfix: in a miss case ngx_http_memcached_module returned the "END" + line as response body instead of default 404 page body; the bug had + appeared in 0.7.18. + Thanks to Maxim Dounin. + + *) Bugfix: while SMTP proxying nginx issued message "250 2.0.0 OK" + instead of "235 2.0.0 OK"; the bug had appeared in 0.7.22. + Thanks to Maxim Dounin. + + +Changes with nginx 0.7.30 24 Dec 2008 + + *) Bugfix: a segmentation fault occurred in worker process, if variables + were used in the "fastcgi_pass" or "proxy_pass" directives and host + name must be resolved; the bug had appeared in 0.7.29. + + +Changes with nginx 0.7.29 24 Dec 2008 + + *) Bugfix: the "fastcgi_pass" and "proxy_pass" directives did not + support variables if unix domain sockets were used. + + *) Bugfixes in subrequest processing; the bugs had appeared in 0.7.25. + + *) Bugfix: a "100 Continue" response was issued for HTTP/1.0 requests; + Thanks to Maxim Dounin. + + *) Bugfix: in memory allocation in the ngx_http_gzip_filter_module on + Cygwin. + + +Changes with nginx 0.7.28 22 Dec 2008 + + *) Change: in memory allocation in the ngx_http_gzip_filter_module. + + *) Change: the default "gzip_buffers" directive values have been changed + to 32 4k or 16 8k from 4 4k/8k. + + +Changes with nginx 0.7.27 15 Dec 2008 + + *) Feature: the "try_files" directive. + + *) Feature: variables support in the "fastcgi_pass" directive. + + *) Feature: now the $geo variable may get an address from a variable. + Thanks to Andrei Nigmatulin. + + *) Feature: now a location's modifier may be used without space before + name. + + *) Feature: the $upstream_response_length variable. + + *) Bugfix: now a "add_header" directive does not add an empty value. + + *) Bugfix: if zero length static file was requested, then nginx just + closed connection; the bug had appeared in 0.7.25. + + *) Bugfix: a MOVE method could not move file in non-existent directory. + + *) Bugfix: a segmentation fault occurred in worker process, if no one + named location was defined in server, but some one was used in an + error_page directive. + Thanks to Sergey Bochenkov. + + +Changes with nginx 0.7.26 08 Dec 2008 + + *) Bugfix: in subrequest processing; the bug had appeared in 0.7.25. + + +Changes with nginx 0.7.25 08 Dec 2008 + + *) Change: in subrequest processing. + + *) Change: now POSTs without "Content-Length" header line are allowed. + + *) Bugfix: now the "limit_req" and "limit_conn" directives log a + prohibition reason. + + *) Bugfix: in the "delete" parameter of the "geo" directive. + + +Changes with nginx 0.7.24 01 Dec 2008 + + *) Feature: the "if_modified_since" directive. + + *) Bugfix: nginx did not process a FastCGI server response, if the + server send too many messages to stderr before response. + + *) Bugfix: the "$cookie_..." variables did not work in the SSI and the + perl module. + + +Changes with nginx 0.7.23 27 Nov 2008 + + *) Feature: the "delete" and "ranges" parameters in the "geo" directive. + + *) Feature: speeding up loading of geo base with large number of values. + + *) Feature: decrease of memory required for geo base load. + + +Changes with nginx 0.7.22 20 Nov 2008 + + *) Feature: the "none" parameter in the "smtp_auth" directive. + Thanks to Maxim Dounin. + + *) Feature: the "$cookie_..." variables. + + *) Bugfix: the "directio" directive did not work in XFS filesystem. + + *) Bugfix: the resolver did not understand big DNS responses. + Thanks to Zyb. + + +Changes with nginx 0.7.21 11 Nov 2008 + + *) Changes in the ngx_http_limit_req_module. + + *) Feature: the EXSLT support in the ngx_http_xslt_module. + Thanks to Denis F. Latypoff. + + *) Workaround: compatibility with glibc 2.3. + Thanks to Eric Benson and Maxim Dounin. + + *) Bugfix: nginx could not run on MacOSX 10.4 and earlier; the bug had + appeared in 0.7.6. + + +Changes with nginx 0.7.20 10 Nov 2008 + + *) Changes in the ngx_http_gzip_filter_module. + + *) Feature: the ngx_http_limit_req_module. + + *) Bugfix: worker processes might exit on a SIGBUS signal on sparc and + ppc platforms; the bug had appeared in 0.7.3. + Thanks to Maxim Dounin. + + *) Bugfix: the "proxy_pass http://host/some:uri" directives did not + work; the bug had appeared in 0.7.12. + + *) Bugfix: in HTTPS mode requests might fail with the "bad write retry" + error. + + *) Bugfix: the ngx_http_secure_link_module did not work inside + locations, whose names are less than 3 characters. + + *) Bugfix: $server_addr variable might have no value. + + +Changes with nginx 0.7.19 13 Oct 2008 + + *) Bugfix: version number update. + + +Changes with nginx 0.7.18 13 Oct 2008 + + *) Change: the "underscores_in_headers" directive; now nginx does not + allows underscores in a client request header line names. + + *) Feature: the ngx_http_secure_link_module. + + *) Feature: the "real_ip_header" directive supports any header. + + *) Feature: the "log_subrequest" directive. + + *) Feature: the $realpath_root variable. + + *) Feature: the "http_502" and "http_504" parameters of the + "proxy_next_upstream" directive. + + *) Bugfix: the "http_503" parameter of the "proxy_next_upstream" or + "fastcgi_next_upstream" directives did not work. + + *) Bugfix: nginx might send a "Transfer-Encoding: chunked" header line + for HEAD requests. + + *) Bugfix: now accept threshold depends on worker_connections. + + +Changes with nginx 0.7.17 15 Sep 2008 + + *) Feature: now the "directio" directive works on Linux. + + *) Feature: the $pid variable. + + *) Bugfix: the "directio" optimization that had appeared in 0.7.15 did + not work with open_file_cache. + + *) Bugfix: the "access_log" with variables did not work on Linux; the + bug had appeared in 0.7.7. + + *) Bugfix: the ngx_http_charset_module did not understand quoted charset + name received from backend. + + +Changes with nginx 0.7.16 08 Sep 2008 + + *) Bugfix: nginx could not be built on 64-bit platforms; the bug had + appeared in 0.7.15. + + +Changes with nginx 0.7.15 08 Sep 2008 + + *) Feature: the ngx_http_random_index_module. + + *) Feature: the "directio" directive has been optimized for file + requests starting from arbitrary position. + + *) Feature: the "directio" directive turns off sendfile if it is + necessary. + + *) Feature: now nginx allows underscores in a client request header line + names. + + +Changes with nginx 0.7.14 01 Sep 2008 + + *) Change: now the ssl_certificate and ssl_certificate_key directives + have no default values. + + *) Feature: the "listen" directive supports the "ssl" parameter. + + *) Feature: now nginx takes into account a time zone change while + reconfiguration on FreeBSD and Linux. + + *) Bugfix: the "listen" directive parameters such as "backlog", + "rcvbuf", etc. were not set, if a default server was not the first + one. + + *) Bugfix: if URI part captured by a "rewrite" directive was used as a + query string, then the query string was not escaped. + + *) Bugfix: configuration file validity test improvements. + + +Changes with nginx 0.7.13 26 Aug 2008 + + *) Bugfix: nginx could not be built on Linux and Solaris; the bug had + appeared in 0.7.12. + + +Changes with nginx 0.7.12 26 Aug 2008 + + *) Feature: the "server_name" directive supports empty name "". + + *) Feature: the "gzip_disable" directive supports special "msie6" mask. + + *) Bugfix: if the "max_fails=0" parameter was used in upstream with + several servers, then a worker process exited on a SIGFPE signal. + Thanks to Maxim Dounin. + + *) Bugfix: a request body was dropped while redirection via an + "error_page" directive. + + *) Bugfix: a full response was returned for request method HEAD while + redirection via an "error_page" directive. + + *) Bugfix: the $r->header_in() method did not return value of the + "Host", "User-Agent", and "Connection" request header lines; the bug + had appeared in 0.7.0. + + +Changes with nginx 0.7.11 18 Aug 2008 + + *) Change: now ngx_http_charset_module does not work by default with + text/css MIME type. + + *) Feature: now nginx returns the 405 status code for POST method + requesting a static file only if the file exists. + + *) Feature: the "proxy_ssl_session_reuse" directive. + + *) Bugfix: a "proxy_pass" directive without URI part might use original + request after the "X-Accel-Redirect" redirection was used; + + *) Bugfix: if a directory has search only rights and the first index + file was absent, then nginx returned the 500 status code. + + *) Bugfix: in inclusive locations; the bugs had appeared in 0.7.1. + + +Changes with nginx 0.7.10 13 Aug 2008 + + *) Bugfix: in the "addition_types", "charset_types", "gzip_types", + "ssi_types", "sub_filter_types", and "xslt_types" directives; the + bugs had appeared in 0.7.9. + + *) Bugfix: of recursive error_page for 500 status code. + + *) Bugfix: now the ngx_http_realip_module sets address not for whole + keepalive connection, but for each request passed via the connection. + + +Changes with nginx 0.7.9 12 Aug 2008 + + *) Change: now ngx_http_charset_module works by default with following + MIME types: text/html, text/css, text/xml, text/plain, + text/vnd.wap.wml, application/x-javascript, and application/rss+xml. + + *) Feature: the "charset_types" and "addition_types" directives. + + *) Feature: now the "gzip_types", "ssi_types", and "sub_filter_types" + directives use hash. + + *) Feature: the ngx_cpp_test_module. + + *) Feature: the "expires" directive supports daily time. + + *) Feature: the ngx_http_xslt_module improvements and bug fixing. + Thanks to Denis F. Latypoff and Maxim Dounin. + + *) Bugfix: the "log_not_found" directive did not work for index files + tests. + + *) Bugfix: HTTPS connections might hang, if kqueue, epoll, rtsig, or + eventport methods were used; the bug had appeared in 0.7.7. + + *) Bugfix: if the "server_name", "valid_referers", and "map" directives + used an "*.domain.tld" wildcard and exact name "domain.tld" was not + set, then the exact name was matched by the wildcard; the bug had + appeared in 0.3.18. + + +Changes with nginx 0.7.8 04 Aug 2008 + + *) Feature: the ngx_http_xslt_module. + + *) Feature: the "$arg_..." variables. + + *) Feature: Solaris directio support. + Thanks to Ivan Debnar. + + *) Bugfix: now if FastCGI server sends a "Location" header line without + status line, then nginx uses 302 status code. + Thanks to Maxim Dounin. + + +Changes with nginx 0.7.7 30 Jul 2008 + + *) Change: now the EAGAIN error returned by connect() is not considered + as temporary error. + + *) Change: now the $ssl_client_cert variable value is a certificate with + TAB character intended before each line except first one; an + unchanged certificate is available in the $ssl_client_raw_cert + variable. + + *) Feature: the "ask" parameter in the "ssl_verify_client" directive. + + *) Feature: byte-range processing improvements. + Thanks to Maxim Dounin. + + *) Feature: the "directio" directive. + Thanks to Jiang Hong. + + *) Feature: MacOSX 10.5 sendfile() support. + + *) Bugfix: now in MacOSX and Cygwin locations are tested in case + insensitive mode; however, the compare is provided by single-byte + locales only. + + *) Bugfix: mail proxy SSL connections hanged, if select, poll, or + /dev/poll methods were used. + + *) Bugfix: UTF-8 encoding usage in the ngx_http_autoindex_module. + + +Changes with nginx 0.7.6 07 Jul 2008 + + *) Bugfix: now if variables are used in the "access_log" directive a + request root existence is always tested. + + *) Bugfix: the ngx_http_flv_module did not support several values in a + query string. + + +Changes with nginx 0.7.5 01 Jul 2008 + + *) Bugfixes in variables support in the "access_log" directive; the bugs + had appeared in 0.7.4. + + *) Bugfix: nginx could not be built --without-http_gzip_module; the bug + had appeared in 0.7.3. + Thanks to Kirill A. Korinskiy. + + *) Bugfix: if sub_filter and SSI were used together, then responses + might were transferred incorrectly. + + +Changes with nginx 0.7.4 30 Jun 2008 + + *) Feature: variables support in the "access_log" directive. + + *) Feature: the "open_log_file_cache" directive. + + *) Feature: the -g switch. + + *) Feature: the "Expect" request header line support. + + *) Bugfix: large SSI inclusions might be truncated. + + +Changes with nginx 0.7.3 23 Jun 2008 + + *) Change: the "rss" extension MIME type has been changed to + "application/rss+xml". + + *) Change: now the "gzip_vary" directive turned on issues a + "Vary: Accept-Encoding" header line for uncompressed responses too. + + *) Feature: now the "rewrite" directive does a redirect automatically if + the "https://" protocol is used. + + *) Bugfix: the "proxy_pass" directive did not work with the HTTPS + protocol; the bug had appeared in 0.6.9. + + +Changes with nginx 0.7.2 16 Jun 2008 + + *) Feature: now nginx supports EDH key exchange ciphers. + + *) Feature: the "ssl_dhparam" directive. + + *) Feature: the $ssl_client_cert variable. + Thanks to Manlio Perillo. + + *) Bugfix: after changing URI via a "rewrite" directive nginx did not + search a new location; the bug had appeared in 0.7.1. + Thanks to Maxim Dounin. + + *) Bugfix: nginx could not be built without PCRE library; the bug had + appeared in 0.7.1. + + *) Bugfix: when a request to a directory was redirected with the slash + added, nginx dropped a query string from the original request. + + +Changes with nginx 0.7.1 26 May 2008 + + *) Change: now locations are searched in a tree. + + *) Change: the "optimize_server_names" directive was canceled due to the + "server_name_in_redirect" directive introduction. + + *) Change: some long deprecated directives are not supported anymore. + + *) Change: the "none" parameter in the "ssl_session_cache" directive; + now this is default parameter. + Thanks to Rob Mueller. + + *) Bugfix: worker processes might not catch reconfiguration and log + rotation signals. + + *) Bugfix: nginx could not be built on latest Fedora 9 Linux. + Thanks to Roxis. + + +Changes with nginx 0.7.0 19 May 2008 + + *) Change: now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX + in an access_log. + Thanks to Maxim Dounin. + + *) Change: now nginx allows several "Host" request header line. + + *) Feature: the "modified" flag in the "expires" directive. + + *) Feature: the $uid_got and $uid_set variables may be used at any + request processing stage. + + *) Feature: the $hostname variable. + Thanks to Andrei Nigmatulin. + + *) Feature: DESTDIR support. + Thanks to Todd A. Fisher and Andras Voroskoi. + + *) Bugfix: a segmentation fault might occur in worker process on Linux, + if keepalive was enabled. + + +Changes with nginx 0.6.31 12 May 2008 + + *) Bugfix: nginx did not process FastCGI response if header was at the + end of FastCGI record; the bug had appeared in 0.6.2. + Thanks to Sergey Serov. + + *) Bugfix: a segmentation fault might occur in worker process if a file + was deleted and the "open_file_cache_errors" directive was off. + + +Changes with nginx 0.6.30 29 Apr 2008 + + *) Change: now if an "include" directive pattern does not match any + file, then nginx does not issue an error. + + *) Feature: now the time in directives may be specified without spaces, + for example, "1h50m". + + *) Bugfix: memory leaks if the "ssl_verify_client" directive was on. + Thanks to Chavelle Vincent. + + *) Bugfix: the "sub_filter" directive might set text to change into + output. + + *) Bugfix: the "error_page" directive did not take into account + arguments in redirected URI. + + *) Bugfix: now nginx always opens files in binary mode under Cygwin. + + *) Bugfix: nginx could not be built on OpenBSD; the bug had appeared in + 0.6.15. + + +Changes with nginx 0.6.29 18 Mar 2008 + + *) Feature: the ngx_google_perftools_module. + + *) Bugfix: the ngx_http_perl_module could not be built on 64-bit + platforms; the bug had appeared in 0.6.27. + + +Changes with nginx 0.6.28 13 Mar 2008 + + *) Bugfix: the rtsig method could not be built; the bug had appeared in + 0.6.27. + + +Changes with nginx 0.6.27 12 Mar 2008 + + *) Change: now by default the rtsig method is not built on + Linux 2.6.18+. + + *) Change: now a request method is not changed while redirection to a + named location via an "error_page" directive. + + *) Feature: the "resolver" and "resolver_timeout" directives in SMTP + proxy. + + *) Feature: the "post_action" directive supports named locations. + + *) Bugfix: a segmentation fault occurred in worker process, if a request + was redirected from proxy, FastCGI, or memcached location to static + named locations. + + *) Bugfix: browsers did not repeat SSL handshake if there is no valid + client certificate in first handshake. + Thanks to Alexander V. Inyukhin. + + *) Bugfix: if response code 495-497 was redirected via an "error_page" + directive without code change, then nginx tried to allocate too many + memory. + + *) Bugfix: memory leak in long-lived non buffered connections. + + *) Bugfix: memory leak in resolver. + + *) Bugfix: a segmentation fault occurred in worker process, if a request + was redirected from proxy, FastCGI, or memcached location to static + named locations. + + *) Bugfix: in the $proxy_host and $proxy_port variables caching. + Thanks to Sergey Bochenkov. + + *) Bugfix: a "proxy_pass" directive with variables used incorrectly the + same port as in another "proxy_pass" directive with the same host + name and without variables. + Thanks to Sergey Bochenkov. + + *) Bugfix: an alert "sendmsg() failed (9: Bad file descriptor)" on some + 64-bit platforms while reconfiguration. + + *) Bugfix: a segmentation fault occurred in worker process, if empty + stub block was used second time in SSI. + + *) Bugfix: in copying URI part contained escaped symbols into arguments. + + +Changes with nginx 0.6.26 11 Feb 2008 + + *) Bugfix: the "proxy_store" and "fastcgi_store" directives did not + check a response length. + + *) Bugfix: a segmentation fault occurred in worker process, if big value + was used in a "expires" directive. + Thanks to Joaquin Cuenca Abela. + + *) Bugfix: nginx incorrectly detected cache line size on Pentium 4. + Thanks to Gena Makhomed. + + *) Bugfix: in proxied or FastCGI subrequests a client original method + was used instead of the GET method. + + *) Bugfix: socket leak in HTTPS mode if deferred accept was used. + Thanks to Ben Maurer. + + *) Bugfix: nginx issued the bogus error message "SSL_shutdown() failed + (SSL: )"; the bug had appeared in 0.6.23. + + *) Bugfix: in HTTPS mode requests might fail with the "bad write retry" + error; the bug had appeared in 0.6.23. + + +Changes with nginx 0.6.25 08 Jan 2008 + + *) Change: now the "server_name_in_redirect" directive is used instead + of the "server_name" directive's special "*" parameter. + + *) Change: now wildcard and regex names can be used as main name in a + "server_name" directive. + + *) Change: the "satisfy_any" directive was replaced by the "satisfy" + directive. + + *) Workaround: old worker processes might hog CPU after reconfiguration + if they was run under Linux OpenVZ. + + *) Feature: the "min_delete_depth" directive. + + *) Bugfix: the COPY and MOVE methods did not work with single files. + + *) Bugfix: the ngx_http_gzip_static_module did not allow the + ngx_http_dav_module to work; the bug had appeared in 0.6.23. + + *) Bugfix: socket leak in HTTPS mode if deferred accept was used. + Thanks to Ben Maurer. + + *) Bugfix: nginx could not be built without PCRE library; the bug had + appeared in 0.6.23. + + +Changes with nginx 0.6.24 27 Dec 2007 + + *) Bugfix: a segmentation fault might occur in worker process if HTTPS + was used; the bug had appeared in 0.6.23. + + +Changes with nginx 0.6.23 27 Dec 2007 + + *) Change: the "off" parameter in the "ssl_session_cache" directive; now + this is default parameter. + + *) Change: the "open_file_cache_retest" directive was renamed to the + "open_file_cache_valid". + + *) Feature: the "open_file_cache_min_uses" directive. + + *) Feature: the ngx_http_gzip_static_module. + + *) Feature: the "gzip_disable" directive. + + *) Feature: the "memcached_pass" directive may be used inside the "if" + block. + + *) Bugfix: a segmentation fault occurred in worker process, if the + "memcached_pass" and "if" directives were used in the same location. + + *) Bugfix: if a "satisfy_any on" directive was used and not all access + and auth modules directives were set, then other given access and + auth directives were not tested; + + *) Bugfix: regex parameters in a "valid_referers" directive were not + inherited from previous level. + + *) Bugfix: a "post_action" directive did run if a request was completed + with 499 status code. + + *) Bugfix: optimization of 16K buffer usage in a SSL connection. + Thanks to Ben Maurer. + + *) Bugfix: the STARTTLS in SMTP mode did not work. + Thanks to Oleg Motienko. + + *) Bugfix: in HTTPS mode requests might fail with the "bad write retry" + error; the bug had appeared in 0.5.13. + + +Changes with nginx 0.6.22 19 Dec 2007 + + *) Change: now all ngx_http_perl_module methods return values copied to + perl's allocated memory. + + *) Bugfix: if nginx was built with ngx_http_perl_module, the perl before + 5.8.6 was used, and perl supported threads, then during + reconfiguration the master process aborted; the bug had appeared in + 0.5.9. + Thanks to Boris Zhmurov. + + *) Bugfix: the ngx_http_perl_module methods may get invalid values of + the regex captures. + + *) Bugfix: a segmentation fault occurred in worker process, if the + $r->has_request_body() method was called for a request whose small + request body was already received. + + *) Bugfix: large_client_header_buffers did not freed before going to + keep-alive state. + Thanks to Olexander Shtepa. + + *) Bugfix: the last address was missed in the $upstream_addr variable; + the bug had appeared in 0.6.18. + + *) Bugfix: the "fastcgi_catch_stderr" directive did return error code; + now it returns 502 code, that can be rerouted to a next server using + the "fastcgi_next_upstream invalid_header" directive. + + *) Bugfix: a segmentation fault occurred in master process if the + "fastcgi_catch_stderr" directive was used; the bug had appeared in + 0.6.10. + Thanks to Manlio Perillo. + + +Changes with nginx 0.6.21 03 Dec 2007 + + *) Change: if variable values used in a "proxy_pass" directive contain + IP-addresses only, then a "resolver" directive is not mandatory. + + *) Bugfix: a segmentation fault might occur in worker process if a + "proxy_pass" directive with URI-part was used; the bug had appeared + in 0.6.19. + + *) Bugfix: if resolver was used on platform that does not support + kqueue, then nginx issued an alert "name is out of response". + Thanks to Andrei Nigmatulin. + + *) Bugfix: if the $server_protocol was used in FastCGI parameters and a + request line length was near to the "client_header_buffer_size" + directive value, then nginx issued an alert "fastcgi: the request + record is too big". + + *) Bugfix: if a plain text HTTP/0.9 version request was made to HTTPS + server, then nginx returned usual response. + + +Changes with nginx 0.6.20 28 Nov 2007 + + *) Bugfix: a segmentation fault might occur in worker process if a + "proxy_pass" directive with URI-part was used; the bug had appeared + in 0.6.19. + + +Changes with nginx 0.6.19 27 Nov 2007 + + *) Bugfix: the 0.6.18 version could not be built. + + +Changes with nginx 0.6.18 27 Nov 2007 + + *) Change: now the ngx_http_userid_module adds start time microseconds + to the cookie field contains a pid value. + + *) Change: now the full request line instead of URI only is written to + error_log. + + *) Feature: variables support in the "proxy_pass" directive. + + *) Feature: the "resolver" and "resolver_timeout" directives. + + *) Feature: now the directive "add_header last-modified ''" deletes a + "Last-Modified" response header line. + + *) Bugfix: the "limit_rate" directive did not allow to use full + throughput, even if limit value was very high. + + +Changes with nginx 0.6.17 15 Nov 2007 + + *) Feature: the "If-Range" request header line support. + Thanks to Alexander V. Inyukhin. + + *) Bugfix: URL double escaping in a redirect of the "msie_refresh" + directive; the bug had appeared in 0.6.4. + + *) Bugfix: the "autoindex" directive did not work with the "alias /" + directive. + + *) Bugfix: a segmentation fault might occur in worker process if + subrequests were used. + + *) Bugfix: the big responses may be transferred truncated if SSL and + gzip were used. + + *) Bugfix: the $status variable was equal to 0 if a proxied server + returned response in HTTP/0.9 version. + + +Changes with nginx 0.6.16 29 Oct 2007 + + *) Change: now the uname(2) is used on Linux instead of procfs. + Thanks to Ilya Novikov. + + *) Bugfix: if the "?" character was in a "error_page" directive, then it + was escaped in a proxied request; the bug had appeared in 0.6.11. + + *) Bugfix: compatibility with mget. + + +Changes with nginx 0.6.15 22 Oct 2007 + + *) Feature: Cygwin compatibility. + Thanks to Vladimir Kutakov. + + *) Feature: the "merge_slashes" directive. + + *) Feature: the "gzip_vary" directive. + + *) Feature: the "server_tokens" directive. + + *) Bugfix: nginx did not unescape URI in the "include" SSI command. + + *) Bugfix: the segmentation fault was occurred on start or while + reconfiguration if variable was used in the "charset" or + "source_charset" directives. + + *) Bugfix: nginx returned the 400 response on requests like + "GET http://www.domain.com HTTP/1.0". + Thanks to James Oakley. + + *) Bugfix: if request with request body was redirected using the + "error_page" directive, then nginx tried to read the request body + again; the bug had appeared in 0.6.7. + + *) Bugfix: a segmentation fault occurred in worker process if no + server_name was explicitly defined for server processing request; the + bug had appeared in 0.6.7. + + +Changes with nginx 0.6.14 15 Oct 2007 + + *) Change: now by default the "echo" SSI command uses entity encoding. + + *) Feature: the "encoding" parameter in the "echo" SSI command. + + *) Feature: the "access_log" directive may be used inside the + "limit_except" block. + + *) Bugfix: if all upstream servers were failed, then all servers had got + weight the was equal one until servers became alive; the bug had + appeared in 0.6.6. + + *) Bugfix: a segmentation fault occurred in worker process if + $date_local and $date_gmt were used outside the + ngx_http_ssi_filter_module. + + *) Bugfix: a segmentation fault might occur in worker process if debug + log was enabled. + Thanks to Andrei Nigmatulin. + + *) Bugfix: ngx_http_memcached_module did not set + $upstream_response_time. + Thanks to Maxim Dounin. + + *) Bugfix: a worker process may got caught in an endless loop, if the + memcached was used. + + *) Bugfix: nginx supported low case only "close" and "keep-alive" values + in the "Connection" request header line; the bug had appeared in + 0.6.11. + + *) Bugfix: sub_filter did not work with empty substitution. + + *) Bugfix: in sub_filter parsing. + + +Changes with nginx 0.6.13 24 Sep 2007 + + *) Bugfix: nginx did not close directory file on HEAD request if + autoindex was used. + Thanks to Arkadiusz Patyk. + + +Changes with nginx 0.6.12 21 Sep 2007 + + *) Change: mail proxy was split on three modules: pop3, imap and smtp. + + *) Feature: the --without-mail_pop3_module, --without-mail_imap_module, + and --without-mail_smtp_module configuration parameters. + + *) Feature: the "smtp_greeting_delay" and "smtp_client_buffer" + directives of the ngx_mail_smtp_module. + + *) Bugfix: the trailing wildcards did not work; the bug had appeared in + 0.6.9. + + *) Bugfix: nginx could not start on Solaris if the shared PCRE library + located in non-standard place was used. + + *) Bugfix: the "proxy_hide_header" and "fastcgi_hide_header" directives + did not hide response header lines whose name was longer than 32 + characters. + Thanks to Manlio Perillo. + + +Changes with nginx 0.6.11 11 Sep 2007 + + *) Bugfix: active connection counter always increased if mail proxy was + used. + + *) Bugfix: if backend returned response header only using non-buffered + proxy, then nginx closed backend connection on timeout. + + *) Bugfix: nginx did not support several "Connection" request header + lines. + + *) Bugfix: if the "max_fails" was set for upstream server, then after + first failure server weight was always one; the bug had appeared in + 0.6.6. + + +Changes with nginx 0.6.10 03 Sep 2007 + + *) Feature: the "open_file_cache", "open_file_cache_retest", and + "open_file_cache_errors" directives. + + *) Bugfix: socket leak; the bug had appeared in 0.6.7. + + *) Bugfix: a charset set by the "charset" directive was not appended to + the "Content-Type" header set by $r->send_http_header(). + + *) Bugfix: a segmentation fault might occur in worker process if + /dev/poll method was used. + + +Changes with nginx 0.6.9 28 Aug 2007 + + *) Bugfix: a worker process may got caught in an endless loop, if the + HTTPS protocol was used; the bug had appeared in 0.6.7. + + *) Bugfix: if server listened on two addresses or ports and trailing + wildcard was used, then nginx did not run. + + *) Bugfix: the "ip_hash" directive might incorrectly mark servers as + down. + + *) Bugfix: nginx could not be built on amd64; the bug had appeared in + 0.6.8. + + +Changes with nginx 0.6.8 20 Aug 2007 + + *) Change: now nginx tries to set the "worker_priority", + "worker_rlimit_nofile", "worker_rlimit_core", and + "worker_rlimit_sigpending" without super-user privileges. + + *) Change: now nginx escapes space and "%" in request to a mail proxy + authentication server. + + *) Change: now nginx escapes "%" in $memcached_key variable. + + *) Bugfix: nginx used path relative to configuration prefix for + non-absolute configuration file path specified in the "-c" key; the + bug had appeared in 0.6.6. + + *) Bugfix: nginx did not work on FreeBSD/sparc64. + + +Changes with nginx 0.6.7 15 Aug 2007 + + *) Change: now the paths specified in the "include", + "auth_basic_user_file", "perl_modules", "ssl_certificate", + "ssl_certificate_key", and "ssl_client_certificate" directives are + relative to directory of nginx configuration file nginx.conf, but not + to nginx prefix directory. + + *) Change: the --sysconfdir=PATH option in configure was canceled. + + *) Change: the special make target "upgrade1" was defined for online + upgrade of 0.1.x versions. + + *) Feature: the "server_name" and "valid_referers" directives support + regular expressions. + + *) Feature: the "server" directive in the "upstream" context supports + the "backup" parameter. + + *) Feature: the ngx_http_perl_module supports the + $r->discard_request_body. + + *) Feature: the "add_header Last-Modified ..." directive changes the + "Last-Modified" response header line. + + *) Bugfix: if a response different than 200 was returned to a request + with body and connection went to the keep-alive state after the + request, then nginx returned 400 for the next request. + + *) Bugfix: a segmentation fault occurred in worker process if invalid + address was set in the "auth_http" directive. + + *) Bugfix: now nginx uses default listen backlog value 511 on all + platforms except FreeBSD. + Thanks to Jiang Hong. + + *) Bugfix: a worker process may got caught in an endless loop, if a + "server" inside "upstream" block was marked as "down"; the bug had + appeared in 0.6.6. + + *) Bugfix: now Solaris sendfilev() is not used to transfer the client + request body to FastCGI-server via the unix domain socket. + + +Changes with nginx 0.6.6 30 Jul 2007 + + *) Feature: the --sysconfdir=PATH option in configure. + + *) Feature: named locations. + + *) Feature: the $args variable can be set with the "set" directive. + + *) Feature: the $is_args variable. + + *) Bugfix: fair big weight upstream balancer. + + *) Bugfix: if a client has closed connection to mail proxy then nginx + might not close connection to backend. + + *) Bugfix: if the same host without specified port was used as backend + for HTTP and HTTPS, then nginx used only one port - 80 or 443. + + *) Bugfix: fix building on Solaris/amd64 by Sun Studio 11 and early + versions; the bug had appeared in 0.6.4. + + +Changes with nginx 0.6.5 23 Jul 2007 + + *) Feature: $nginx_version variable. + Thanks to Nick S. Grechukh. + + *) Feature: the mail proxy supports AUTHENTICATE in IMAP mode. + Thanks to Maxim Dounin. + + *) Feature: the mail proxy supports STARTTLS in SMTP mode. + Thanks to Maxim Dounin. + + *) Bugfix: now nginx escapes space in $memcached_key variable. + + *) Bugfix: nginx was incorrectly built by Sun Studio on Solaris/amd64. + Thanks to Jiang Hong. + + *) Bugfix: of minor potential bugs. + Thanks to Coverity's Scan. + + +Changes with nginx 0.6.4 17 Jul 2007 + + *) Security: the "msie_refresh" directive allowed XSS. + Thanks to Maxim Boguk. + + *) Change: the "proxy_store" and "fastcgi_store" directives were + changed. + + *) Feature: the "proxy_store_access" and "fastcgi_store_access" + directives. + + *) Bugfix: nginx did not work on Solaris/sparc64 if it was built by Sun + Studio. + Thanks to Andrei Nigmatulin. + + *) Workaround: for Sun Studio 12. + Thanks to Jiang Hong. + + +Changes with nginx 0.6.3 12 Jul 2007 + + *) Feature: the "proxy_store" and "fastcgi_store" directives. + + *) Bugfix: a segmentation fault might occur in worker process if the + "auth_http_header" directive was used. + Thanks to Maxim Dounin. + + *) Bugfix: a segmentation fault occurred in worker process if the + CRAM-MD5 authentication method was used, but it was not enabled. + + *) Bugfix: a segmentation fault might occur in worker process when the + HTTPS protocol was used in the "proxy_pass" directive. + + *) Bugfix: a segmentation fault might occur in worker process if the + eventport method was used. + + *) Bugfix: the "proxy_ignore_client_abort" and + "fastcgi_ignore_client_abort" directives did not work; the bug had + appeared in 0.5.13. + + +Changes with nginx 0.6.2 09 Jul 2007 + + *) Bugfix: if the FastCGI header was split in records, then nginx passed + garbage in the header to a client. + + +Changes with nginx 0.6.1 17 Jun 2007 + + *) Bugfix: in SSI parsing. + + *) Bugfix: if remote SSI subrequest was used, then posterior local file + subrequest might transferred to client in wrong order. + + *) Bugfix: large SSI inclusions buffered in temporary files were + truncated. + + *) Bugfix: the perl $$ variable value in ngx_http_perl_module was equal + to the master process identification number. + + +Changes with nginx 0.6.0 14 Jun 2007 + + *) Feature: the "server_name", "map", and "valid_referers" directives + support the "www.example.*" wildcards. + + +Changes with nginx 0.5.25 11 Jun 2007 + + *) Bugfix: nginx could not be built with the + --without-http_rewrite_module parameter; the bug had appeared in + 0.5.24. + + +Changes with nginx 0.5.24 06 Jun 2007 + + *) Security: the "ssl_verify_client" directive did not work if request + was made using HTTP/0.9. + + *) Bugfix: a part of response body might be passed uncompressed if gzip + was used; the bug had appeared in 0.5.23. + + +Changes with nginx 0.5.23 04 Jun 2007 + + *) Feature: the ngx_http_ssl_module supports Server Name Indication TLS + extension. + + *) Feature: the "fastcgi_catch_stderr" directive. + Thanks to Nick S. Grechukh, OWOX project. + + *) Bugfix: a segmentation fault occurred in master process if two + virtual servers should bind() to the overlapping ports. + + *) Bugfix: if nginx was built with ngx_http_perl_module and perl + supported threads, then during second reconfiguration the error + messages "panic: MUTEX_LOCK" and "perl_parse() failed" were issued. + + *) Bugfix: in the HTTPS protocol in the "proxy_pass" directive. + + +Changes with nginx 0.5.22 29 May 2007 + + *) Bugfix: a big request body might not be passed to backend; the bug + had appeared in 0.5.21. + + +Changes with nginx 0.5.21 28 May 2007 + + *) Bugfix: if server has more than about ten locations, then regex + locations might be choosen not in that order as they were specified. + + *) Bugfix: a worker process may got caught in an endless loop on 64-bit + platform, if the 33-rd or next in succession backend has failed. + Thanks to Anton Povarov. + + *) Bugfix: a bus error might occur on Solaris/sparc64 if the PCRE + library was used. + Thanks to Andrei Nigmatulin. + + *) Bugfix: in the HTTPS protocol in the "proxy_pass" directive. + + +Changes with nginx 0.5.20 07 May 2007 + + *) Feature: the "sendfile_max_chunk" directive. + + *) Feature: the "$http_...", "$sent_http_...", and "$upstream_http_..." + variables may be changed using the "set" directive. + + *) Bugfix: a segmentation fault might occur in worker process if the SSI + command 'if expr="$var = /"' was used. + + *) Bugfix: trailing boundary of multipart range response was transferred + incorrectly. + Thanks to Evan Miller. + + *) Bugfix: nginx did not work on Solaris/sparc64 if it was built by Sun + Studio. + Thanks to Andrei Nigmatulin. + + *) Bugfix: the ngx_http_perl_module could not be built by Solaris make. + Thanks to Andrei Nigmatulin. + + +Changes with nginx 0.5.19 24 Apr 2007 + + *) Change: now the $request_time variable has millisecond precision. + + *) Change: the method $r->rflush of ngx_http_perl_module was renamed to + the $r->flush. + + *) Feature: the $upstream_addr variable. + + *) Feature: the "proxy_headers_hash_max_size" and + "proxy_headers_hash_bucket_size" directives. + Thanks to Volodymyr Kostyrko. + + *) Bugfix: the files more than 2G could not be transferred using + sendfile and limit_rate on 64-bit platforms. + + *) Bugfix: the files more than 2G could not be transferred using + sendfile on 64-bit Linux. + + +Changes with nginx 0.5.18 19 Apr 2007 + + *) Feature: the ngx_http_sub_filter_module. + + *) Feature: the "$upstream_http_..." variables. + + *) Feature: now the $upstream_status and $upstream_response_time + variables keep data about all upstreams before X-Accel-Redirect. + + *) Bugfix: a segmentation fault occurred in master process after first + reconfiguration and receiving any signal if nginx was built with + ngx_http_perl_module and perl did not support multiplicity; the bug + had appeared in 0.5.9. + + *) Bugfix: if perl did not support multiplicity, then after + reconfiguration perl code did not work; the bug had appeared in + 0.3.38. + + +Changes with nginx 0.5.17 02 Apr 2007 + + *) Change: now nginx always returns the 405 status for the TRACE method. + + *) Feature: now nginx supports the "include" directive inside the + "types" block. + + *) Bugfix: the $document_root variable usage in the "root" and "alias" + directives is disabled: this caused recursive stack overflow. + + *) Bugfix: in the HTTPS protocol in the "proxy_pass" directive. + + *) Bugfix: in some cases non-cachable variables (such as $uri variable) + returned old cached value. + + +Changes with nginx 0.5.16 26 Mar 2007 + + *) Bugfix: the C-class network was not used as hash key in the "ip_hash" + directive. + Thanks to Pavel Yarkovoy. + + *) Bugfix: a segmentation fault might occur in worker process if a + charset was set in the "Content-Type" header line and the line has + trailing ";"; the bug had appeared in 0.3.50. + + *) Bugfix: the "[alert] zero size buf" error when FastCGI server was + used and a request body written in a temporary file was multiple of + 32K. + + *) Bugfix: nginx could not be built on Solaris without the --with-debug + option; the bug had appeared in 0.5.15. + + +Changes with nginx 0.5.15 19 Mar 2007 + + *) Feature: the mail proxy supports authenticated SMTP proxying and the + "smtp_auth", "smtp_capablities", and "xclient" directives. + Thanks to Anton Yuzhaninov and Maxim Dounin. + + *) Feature: now the keep-alive connections are closed just after + receiving the reconfiguration signal. + + *) Change: the "imap" and "auth" directives were renamed to the "mail" + and "pop3_auth" directives. + + *) Bugfix: a segmentation fault occurred in worker process if the + CRAM-MD5 authentication method was used and the APOP method was + disabled. + + *) Bugfix: if the "starttls only" directive was used in POP3 protocol, + then nginx allowed authentication without switching to the SSL mode. + + *) Bugfix: worker processes did not exit after reconfiguration and did + not rotate logs if the eventport method was used. + + *) Bugfix: a worker process may got caught in an endless loop, if the + "ip_hash" directive was used. + + *) Bugfix: now nginx does not log some alerts if eventport or /dev/poll + methods are used. + + +Changes with nginx 0.5.14 23 Feb 2007 + + *) Bugfix: nginx ignored superfluous closing "}" in the end of + configuration file. + + +Changes with nginx 0.5.13 19 Feb 2007 + + *) Feature: the COPY and MOVE methods. + + *) Bugfix: the ngx_http_realip_module set garbage for requests passed + via keep-alive connection. + + *) Bugfix: nginx did not work on big-endian 64-bit Linux. + Thanks to Andrei Nigmatulin. + + *) Bugfix: now when IMAP/POP3 proxy receives too long command it closes + the connection right away, but not after timeout. + + *) Bugfix: if the "epoll" method was used and a client closed a + connection prematurely, then nginx closed the connection after a send + timeout only. + + *) Bugfix: nginx could not be built on platforms different from i386, + amd64, sparc, and ppc; the bug had appeared in 0.5.8. + + +Changes with nginx 0.5.12 12 Feb 2007 + + *) Bugfix: nginx could not be built on platforms different from i386, + amd64, sparc, and ppc; the bug had appeared in 0.5.8. + + *) Bugfix: a segmentation fault might occur in worker process if the + temporary files were used while working with FastCGI server; the bug + had appeared in 0.5.8. + + *) Bugfix: a segmentation fault might occur in worker process if the + $fastcgi_script_name variable was logged. + + *) Bugfix: ngx_http_perl_module could not be built on Solaris. + + +Changes with nginx 0.5.11 05 Feb 2007 + + *) Feature: now configure detects system PCRE library in MacPorts. + Thanks to Chris McGrath. + + *) Bugfix: the response was incorrect if several ranges were requested; + the bug had appeared in 0.5.6. + + *) Bugfix: the "create_full_put_path" directive could not create the + intermediate directories if no "dav_access" directive was set. + Thanks to Evan Miller. + + *) Bugfix: the "0" response code might be logged in the access_log + instead of the "400" and "408" error codes. + + *) Bugfix: a segmentation fault might occur in worker process if nginx + was built with -O2 optimization. + + +Changes with nginx 0.5.10 26 Jan 2007 + + *) Bugfix: while online executable file upgrade the new master process + did not inherit the listening sockets; the bug had appeared in 0.5.9. + + *) Bugfix: a segmentation fault might occur in worker process if nginx + was built with -O2 optimization; the bug had appeared in 0.5.1. + + +Changes with nginx 0.5.9 25 Jan 2007 + + *) Change: now the ngx_http_memcached_module uses the $memcached_key + variable value as a key. + + *) Feature: the $memcached_key variable. + + *) Feature: the "clean" parameter in the "client_body_in_file_only" + directive. + + *) Feature: the "env" directive. + + *) Feature: the "sendfile" directive is available inside the "if" block. + + *) Feature: now on failure of the writing to access nginx logs a message + to error_log, but not more often than once a minute. + + *) Bugfix: the "access_log off" directive did not always turn off the + logging. + + +Changes with nginx 0.5.8 19 Jan 2007 + + *) Bugfix: a segmentation fault might occur if + "client_body_in_file_only on" was used and a request body was small. + + *) Bugfix: a segmentation fault occurred if + "client_body_in_file_only on" and "proxy_pass_request_body off" or + "fastcgi_pass_request_body off" directives were used, and nginx + switched to a next upstream. + + *) Bugfix: if the "proxy_buffering off" directive was used and a client + connection was non-active, then the connection was closed after send + timeout; the bug had appeared in 0.4.7. + + *) Bugfix: if the "epoll" method was used and a client closed a + connection prematurely, then nginx closed the connection after a send + timeout only. + + *) Bugfix: the "[alert] zero size buf" error when FastCGI server was + used. + + *) Bugfixes in the "limit_zone" directive. + + +Changes with nginx 0.5.7 15 Jan 2007 + + *) Feature: the ssl_session_cache storage optimization. + + *) Bugfixes in the "ssl_session_cache" and "limit_zone" directives. + + *) Bugfix: the segmentation fault was occurred on start or while + reconfiguration if the "ssl_session_cache" or "limit_zone" directives + were used on 64-bit platforms. + + *) Bugfix: a segmentation fault occurred if the "add_before_body" or + "add_after_body" directives were used and there was no "Content-Type" + header line in response. + + *) Bugfix: the OpenSSL library was always built with the threads + support. + Thanks to Den Ivanov. + + *) Bugfix: the PCRE-6.5+ library and the icc compiler compatibility. + + +Changes with nginx 0.5.6 09 Jan 2007 + + *) Change: now the ngx_http_index_module ignores all methods except the + GET, HEAD, and POST methods. + + *) Feature: the ngx_http_limit_zone_module. + + *) Feature: the $binary_remote_addr variable. + + *) Feature: the "ssl_session_cache" directives of the + ngx_http_ssl_module and ngx_imap_ssl_module. + + *) Feature: the DELETE method supports recursive removal. + + *) Bugfix: the byte-ranges were transferred incorrectly if the + $r->sendfile() was used. + + +Changes with nginx 0.5.5 24 Dec 2006 + + *) Change: the -v switch does not show compiler information any more. + + *) Feature: the -V switch. + + *) Feature: the "worker_rlimit_core" directive supports size in K, M, + and G. + + *) Bugfix: the nginx.pm module now could be installed by an unprivileged + user. + + *) Bugfix: a segmentation fault might occur if the $r->request_body or + $r->request_body_file methods were used. + + *) Bugfix: the ppc platform specific bugs. + + +Changes with nginx 0.5.4 15 Dec 2006 + + *) Feature: the "perl" directive may be used inside the "limit_except" + block. + + *) Bugfix: the ngx_http_dav_module required the "Date" request header + line for the DELETE method. + + *) Bugfix: if one only parameter was used in the "dav_access" directive, + then nginx might report about configuration error. + + *) Bugfix: a segmentation fault might occur if the $host variable was + used; the bug had appeared in 0.4.14. + + +Changes with nginx 0.5.3 13 Dec 2006 + + *) Feature: the ngx_http_perl_module supports the $r->status, + $r->log_error, and $r->sleep methods. + + *) Feature: the $r->variable method supports variables that do not exist + in nginx configuration. + + *) Bugfix: the $r->has_request_body method did not work. + + +Changes with nginx 0.5.2 11 Dec 2006 + + *) Bugfix: if the "proxy_pass" directive used the name of the "upstream" + block, then nginx tried to resolve the name; the bug had appeared in + 0.5.1. + + +Changes with nginx 0.5.1 11 Dec 2006 + + *) Bugfix: the "post_action" directive might not run after a + unsuccessful completion of a request. + + *) Workaround: for Eudora for Mac; the bug had appeared in 0.4.11. + Thanks to Bron Gondwana. + + *) Bugfix: if the "upstream" name was used in the "fastcgi_pass", then + the message "no port in upstream" was issued; the bug had appeared in + 0.5.0. + + *) Bugfix: if the "proxy_pass" and "fastcgi_pass" directives used the + same servers but different ports, then these directives uses the + first described port; the bug had appeared in 0.5.0. + + *) Bugfix: if the "proxy_pass" and "fastcgi_pass" directives used the + unix domain sockets, then these directives used first described + socket; the bug had appeared in 0.5.0. + + *) Bugfix: ngx_http_auth_basic_module ignored the user if it was in the + last line in the password file and there was no the carriage return, + the line feed, or the ":" symbol after the password. + + *) Bugfix: the $upstream_response_time variable might be equal to + "0.000", although response time was more than 1 millisecond. + + +Changes with nginx 0.5.0 04 Dec 2006 + + *) Change: the parameters in the "%name" form in the "log_format" + directive are not supported anymore. + + *) Change: the "proxy_upstream_max_fails", + "proxy_upstream_fail_timeout", "fastcgi_upstream_max_fails", + "fastcgi_upstream_fail_timeout", "memcached_upstream_max_fails", and + "memcached_upstream_fail_timeout" directives are not supported + anymore. + + *) Feature: the "server" directive in the "upstream" context supports + the "max_fails", "fail_timeout", and "down" parameters. + + *) Feature: the "ip_hash" directive inside the "upstream" block. + + *) Feature: the WAIT status in the "Auth-Status" header line of the + IMAP/POP3 proxy authentication server response. + + *) Bugfix: nginx could not be built on 64-bit platforms; the bug had + appeared in 0.4.14. + + +Changes with nginx 0.4.14 27 Nov 2006 + + *) Feature: the "proxy_pass_error_message" directive in IMAP/POP3 proxy. + + *) Feature: now configure detects system PCRE library on FreeBSD, Linux, + and NetBSD. + + *) Bugfix: ngx_http_perl_module did not work with perl built with the + threads support; the bug had appeared in 0.3.38. + + *) Bugfix: ngx_http_perl_module did not work if perl was called + recursively. + + *) Bugfix: nginx ignored a host name in a request line. + + *) Bugfix: a worker process may got caught in an endless loop, if a + FastCGI server sent too many data to the stderr. + + *) Bugfix: the $upstream_response_time variable may be negative if the + system time was changed backward. + + *) Bugfix: the "Auth-Login-Attempt" parameter was not sent to IMAP/POP3 + proxy authentication server when POP3 was used. + + *) Bugfix: a segmentation fault might occur if connect to IMAP/POP3 + proxy authentication server failed. + + +Changes with nginx 0.4.13 15 Nov 2006 + + *) Feature: the "proxy_pass" directive may be used inside the + "limit_except" block. + + *) Feature: the "limit_except" directive supports all WebDAV methods. + + *) Bugfix: if the "add_before_body" directive was used without the + "add_after_body" directive, then a response did not transferred + complete. + + *) Bugfix: a large request body did not receive if the epoll method and + the deferred accept() were used. + + *) Bugfix: a charset could not be set for ngx_http_autoindex_module + responses; the bug had appeared in 0.3.50. + + *) Bugfix: the "[alert] zero size buf" error when FastCGI server was + used; + + *) Bugfix: the --group= configuration parameter was ignored. + Thanks to Thomas Moschny. + + *) Bugfix: the 50th subrequest in SSI response did not work; the bug had + appeared in 0.3.50. + + +Changes with nginx 0.4.12 31 Oct 2006 + + *) Feature: the ngx_http_perl_module supports the $r->variable method. + + *) Bugfix: if a big static file was included using SSI in a response, + then the response may be transferred incomplete. + + *) Bugfix: nginx did not omit the "#fragment" part in URI. + + +Changes with nginx 0.4.11 25 Oct 2006 + + *) Feature: the POP3 proxy supports the AUTH LOGIN PLAIN and CRAM-MD5. + + *) Feature: the ngx_http_perl_module supports the $r->allow_ranges + method. + + *) Bugfix: if the APOP was enabled in the POP3 proxy, then the USER/PASS + commands might not work; the bug had appeared in 0.4.10. + + +Changes with nginx 0.4.10 23 Oct 2006 + + *) Feature: the POP3 proxy supports the APOP command. + + *) Bugfix: if the select, poll or /dev/poll methods were used, then + while waiting authentication server response the IMAP/POP3 proxy + hogged CPU. + + *) Bugfix: a segmentation fault might occur if the $server_addr variable + was used in the "map" directive. + + *) Bugfix: the ngx_http_flv_module did not support the byte ranges for + full responses; the bug had appeared in 0.4.7. + + *) Bugfix: nginx could not be built on Debian amd64; the bug had + appeared in 0.4.9. + + +Changes with nginx 0.4.9 13 Oct 2006 + + *) Feature: the "set" parameter in the "include" SSI command. + + *) Feature: the ngx_http_perl_module now tests the nginx.pm module + version. + + +Changes with nginx 0.4.8 11 Oct 2006 + + *) Bugfix: if an "include" SSI command were before another "include" SSI + command with a "wait" parameter, then the "wait" parameter might not + work. + + *) Bugfix: the ngx_http_flv_module added the FLV header to the full + responses. + Thanks to Alexey Kovyrin. + + +Changes with nginx 0.4.7 10 Oct 2006 + + *) Feature: the ngx_http_flv_module. + + *) Feature: the $request_body_file variable. + + *) Feature: the "charset" and "source_charset" directives support the + variables. + + *) Bugfix: if an "include" SSI command were before another "include" SSI + command with a "wait" parameter, then the "wait" parameter might not + work. + + *) Bugfix: if the "proxy_buffering off" directive was used or while + working with memcached the connections might not be closed on + timeout. + + *) Bugfix: nginx did not run on 64-bit platforms except amd64, sparc64, + and ppc64. + + +Changes with nginx 0.4.6 06 Oct 2006 + + *) Bugfix: nginx did not run on 64-bit platforms except amd64, sparc64, + and ppc64. + + *) Bugfix: nginx sent the chunked response for HTTP/1.1 request, + if its length was set by text string in the + $r->headers_out("Content-Length", ...) method. + + *) Bugfix: after redirecting error by an "error_page" directive any + ngx_http_rewrite_module directive returned this error code; the bug + had appeared in 0.4.4. + + +Changes with nginx 0.4.5 02 Oct 2006 + + *) Bugfix: nginx could not be built on Linux and Solaris; the bug had + appeared in 0.4.4. + + +Changes with nginx 0.4.4 02 Oct 2006 + + *) Feature: the $scheme variable. + + *) Feature: the "expires" directive supports the "max" parameter. + + *) Feature: the "include" directive supports the "*" mask. + Thanks to Jonathan Dance. + + *) Bugfix: the "return" directive always overrode the "error_page" + response code redirected by the "error_page" directive. + + *) Bugfix: a segmentation fault occurred if zero-length body was in PUT + method. + + *) Bugfix: the redirect was changed incorrectly if the variables were + used in the "proxy_redirect" directive. + + +Changes with nginx 0.4.3 26 Sep 2006 + + *) Change: now the 499 error could not be redirected using an + "error_page" directive. + + *) Feature: the Solaris 10 event ports support. + + *) Feature: the ngx_http_browser_module. + + *) Bugfix: a segmentation fault may occur while redirecting the 400 + error to the proxied server using a "proxy_pass" directive. + + *) Bugfix: a segmentation fault occurred if an unix domain socket was + used in a "proxy_pass" directive; the bug had appeared in 0.3.47. + + *) Bugfix: SSI did work with memcached and nonbuffered responses. + + *) Workaround: of the Sun Studio PAUSE hardware capability bug. + + +Changes with nginx 0.4.2 14 Sep 2006 + + *) Bugfix: the O_NOATIME flag support on Linux was canceled; the bug had + appeared in 0.4.1. + + +Changes with nginx 0.4.1 14 Sep 2006 + + *) Bugfix: the DragonFlyBSD compatibility. + Thanks to Pavel Nazarov. + + *) Workaround: of bug in 64-bit Linux sendfile(), when file is more than + 2G. + + *) Feature: now on Linux nginx uses O_NOATIME flag for static requests. + Thanks to Yusuf Goolamabbas. + + +Changes with nginx 0.4.0 30 Aug 2006 + + *) Change in internal API: the HTTP modules initialization was moved + from the init module phase to the HTTP postconfiguration phase. + + *) Change: now the request body is not read beforehand for the + ngx_http_perl_module: it's required to start the reading using the + $r->has_request_body method. + + *) Feature: the ngx_http_perl_module supports the DECLINED return code. + + *) Feature: the ngx_http_dav_module supports the incoming "Date" header + line for the PUT method. + + *) Feature: the "ssi" directive is available inside the "if" block. + + *) Bugfix: a segmentation fault occurred if there was an "index" + directive with variables and the first index name was without + variables; the bug had appeared in 0.1.29. + + +Changes with nginx 0.3.61 28 Aug 2006 + + *) Change: now the "tcp_nodelay" directive is turned on by default. + + *) Feature: the "msie_refresh" directive. + + *) Feature: the "recursive_error_pages" directive. + + *) Bugfix: the "rewrite" directive returned incorrect redirect, if the + redirect had the captured escaped symbols from original URI. + + +Changes with nginx 0.3.60 18 Aug 2006 + + *) Bugfix: a worker process may got caught in an endless loop while an + error redirection; the bug had appeared in 0.3.59. + + +Changes with nginx 0.3.59 16 Aug 2006 + + *) Feature: now is possible to do several redirection using the + "error_page" directive. + + *) Bugfix: the "dav_access" directive did not support three parameters. + + *) Bugfix: the "error_page" directive did not changes the "Content-Type" + header line after the "X-Accel-Redirect" was used; the bug had + appeared in 0.3.58. + + +Changes with nginx 0.3.58 14 Aug 2006 + + *) Feature: the "error_page" directive supports the variables. + + *) Change: now the procfs interface instead of sysctl is used on Linux. + + *) Change: now the "Content-Type" header line is inherited from first + response when the "X-Accel-Redirect" was used. + + *) Bugfix: the "error_page" directive did not redirect the 413 error. + + *) Bugfix: the trailing "?" did not remove old arguments if no new + arguments were added to a rewritten URI. + + *) Bugfix: nginx could not run on 64-bit FreeBSD 7.0-CURRENT. + + +Changes with nginx 0.3.57 09 Aug 2006 + + *) Feature: the $ssl_client_serial variable. + + *) Bugfix: in the "!-e" operator of the "if" directive. + Thanks to Andrian Budanstov. + + *) Bugfix: while a client certificate verification nginx did not send to + a client the required certificates information. + + *) Bugfix: the $document_root variable did not support the variables in + the "root" directive. + + +Changes with nginx 0.3.56 04 Aug 2006 + + *) Feature: the "dav_access" directive. + + *) Feature: the "if" directive supports the "-d", "!-d", "-e", "!-e", + "-x", and "!-x" operators. + + *) Bugfix: a segmentation fault occurred if a request returned a + redirect and some sent to client header lines were logged in the + access log. + + +Changes with nginx 0.3.55 28 Jul 2006 + + *) Feature: the "stub" parameter in the "include" SSI command. + + *) Feature: the "block" SSI command. + + *) Feature: the unicode2nginx script was added to contrib. + + *) Bugfix: if a "root" was specified by variable only, then the root was + relative to a server prefix. + + *) Bugfix: if the request contained "//" or "/./" and escaped symbols + after them, then the proxied request was sent unescaped. + + *) Bugfix: the $r->header_in("Cookie") of the ngx_http_perl_module now + returns all "Cookie" header lines. + + *) Bugfix: a segmentation fault occurred if + "client_body_in_file_only on" was used and nginx switched to a next + upstream. + + *) Bugfix: on some condition while reconfiguration character codes + inside the "charset_map" may be treated invalid; the bug had appeared + in 0.3.50. + + +Changes with nginx 0.3.54 11 Jul 2006 + + *) Feature: nginx now logs the subrequest information to the error log. + + *) Feature: the "proxy_next_upstream", "fastcgi_next_upstream", and + "memcached_next_upstream" directives support the "off" parameter. + + *) Feature: the "debug_connection" directive supports the CIDR address + form. + + *) Bugfix: if a response of proxied server or FastCGI server was + converted from UTF-8 or back, then it may be transferred incomplete. + + *) Bugfix: the $upstream_response_time variable had the time of the + first request to a backend only. + + *) Bugfix: nginx could not be built on amd64 platform; the bug had + appeared in 0.3.53. + + +Changes with nginx 0.3.53 07 Jul 2006 + + *) Change: the "add_header" directive adds the string to 204, 301, and + 302 responses. + + *) Feature: the "server" directive in the "upstream" context supports + the "weight" parameter. + + *) Feature: the "server_name" directive supports the "*" wildcard. + + *) Feature: nginx supports the request body size more than 2G. + + *) Bugfix: if a client was successfully authorized using "satisfy_any + on", then anyway the message "access forbidden by rule" was written + in the log. + + *) Bugfix: the "PUT" method may erroneously not create a file and return + the 409 code. + + *) Bugfix: if the IMAP/POP3 backend returned an error, then nginx + continued proxying anyway. + + +Changes with nginx 0.3.52 03 Jul 2006 + + *) Change: the ngx_http_index_module behavior for the "POST /" requests + is reverted to the 0.3.40 version state: the module now does not + return the 405 error. + + *) Bugfix: the worker process may got caught in an endless loop if the + limit rate was used; the bug had appeared in 0.3.37. + + *) Bugfix: ngx_http_charset_module logged "unknown charset" alert, even + if the recoding was not needed; the bug had appeared in 0.3.50. + + *) Bugfix: if a code response of the PUT request was 409, then a + temporary file was not removed. + + +Changes with nginx 0.3.51 30 Jun 2006 + + *) Bugfix: the "<" symbols might disappeared some conditions in the SSI; + the bug had appeared in 0.3.50. + + +Changes with nginx 0.3.50 28 Jun 2006 + + *) Change: the "proxy_redirect_errors" and "fastcgi_redirect_errors" + directives was renamed to the "proxy_intercept_errors" and + "fastcgi_intercept_errors" directives. + + *) Feature: the ngx_http_charset_module supports the recoding from the + single byte encodings to the UTF-8 encoding and back. + + *) Feature: the "X-Accel-Charset" response header line is supported in + proxy and FastCGI mode. + + *) Bugfix: the "\" escape symbol in the "\"" and "\'" pairs in the SSI + command was removed only if the command also has the "$" symbol. + + *) Bugfix: the "" CRLF +"" CRLF +"" CRLF +"" CRLF +"" CRLF +"" CRLF +; + + +static u_char ngx_http_msie_refresh_head[] = +"" CRLF; + + +static char ngx_http_error_301_page[] = +"" CRLF +"301 Moved Permanently" CRLF +"" CRLF +"

301 Moved Permanently

" CRLF +; + + +static char ngx_http_error_302_page[] = +"" CRLF +"302 Found" CRLF +"" CRLF +"

302 Found

" CRLF +; + + +static char ngx_http_error_303_page[] = +"" CRLF +"303 See Other" CRLF +"" CRLF +"

303 See Other

" CRLF +; + + +static char ngx_http_error_307_page[] = +"" CRLF +"307 Temporary Redirect" CRLF +"" CRLF +"

307 Temporary Redirect

" CRLF +; + + +static char ngx_http_error_400_page[] = +"" CRLF +"400 Bad Request" CRLF +"" CRLF +"

400 Bad Request

" CRLF +; + + +static char ngx_http_error_401_page[] = +"" CRLF +"401 Authorization Required" CRLF +"" CRLF +"

401 Authorization Required

" CRLF +; + + +static char ngx_http_error_402_page[] = +"" CRLF +"402 Payment Required" CRLF +"" CRLF +"

402 Payment Required

" CRLF +; + + +static char ngx_http_error_403_page[] = +"" CRLF +"403 Forbidden" CRLF +"" CRLF +"

403 Forbidden

" CRLF +; + + +static char ngx_http_error_404_page[] = +"" CRLF +"404 Not Found" CRLF +"" CRLF +"

404 Not Found

" CRLF +; + + +static char ngx_http_error_405_page[] = +"" CRLF +"405 Not Allowed" CRLF +"" CRLF +"

405 Not Allowed

" CRLF +; + + +static char ngx_http_error_406_page[] = +"" CRLF +"406 Not Acceptable" CRLF +"" CRLF +"

406 Not Acceptable

" CRLF +; + + +static char ngx_http_error_408_page[] = +"" CRLF +"408 Request Time-out" CRLF +"" CRLF +"

408 Request Time-out

" CRLF +; + + +static char ngx_http_error_409_page[] = +"" CRLF +"409 Conflict" CRLF +"" CRLF +"

409 Conflict

" CRLF +; + + +static char ngx_http_error_410_page[] = +"" CRLF +"410 Gone" CRLF +"" CRLF +"

410 Gone

" CRLF +; + + +static char ngx_http_error_411_page[] = +"" CRLF +"411 Length Required" CRLF +"" CRLF +"

411 Length Required

" CRLF +; + + +static char ngx_http_error_412_page[] = +"" CRLF +"412 Precondition Failed" CRLF +"" CRLF +"

412 Precondition Failed

" CRLF +; + + +static char ngx_http_error_413_page[] = +"" CRLF +"413 Request Entity Too Large" CRLF +"" CRLF +"

413 Request Entity Too Large

" CRLF +; + + +static char ngx_http_error_414_page[] = +"" CRLF +"414 Request-URI Too Large" CRLF +"" CRLF +"

414 Request-URI Too Large

" CRLF +; + + +static char ngx_http_error_415_page[] = +"" CRLF +"415 Unsupported Media Type" CRLF +"" CRLF +"

415 Unsupported Media Type

" CRLF +; + + +static char ngx_http_error_416_page[] = +"" CRLF +"416 Requested Range Not Satisfiable" CRLF +"" CRLF +"

416 Requested Range Not Satisfiable

" CRLF +; + + +static char ngx_http_error_494_page[] = +"" CRLF +"400 Request Header Or Cookie Too Large" +CRLF +"" CRLF +"

400 Bad Request

" CRLF +"
Request Header Or Cookie Too Large
" CRLF +; + + +static char ngx_http_error_495_page[] = +"" CRLF +"400 The SSL certificate error" +CRLF +"" CRLF +"

400 Bad Request

" CRLF +"
The SSL certificate error
" CRLF +; + + +static char ngx_http_error_496_page[] = +"" CRLF +"400 No required SSL certificate was sent" +CRLF +"" CRLF +"

400 Bad Request

" CRLF +"
No required SSL certificate was sent
" CRLF +; + + +static char ngx_http_error_497_page[] = +"" CRLF +"400 The plain HTTP request was sent to HTTPS port" +CRLF +"" CRLF +"

400 Bad Request

" CRLF +"
The plain HTTP request was sent to HTTPS port
" CRLF +; + + +static char ngx_http_error_500_page[] = +"" CRLF +"500 Internal Server Error" CRLF +"" CRLF +"

500 Internal Server Error

" CRLF +; + + +static char ngx_http_error_501_page[] = +"" CRLF +"501 Not Implemented" CRLF +"" CRLF +"

501 Not Implemented

" CRLF +; + + +static char ngx_http_error_502_page[] = +"" CRLF +"502 Bad Gateway" CRLF +"" CRLF +"

502 Bad Gateway

" CRLF +; + + +static char ngx_http_error_503_page[] = +"" CRLF +"503 Service Temporarily Unavailable" CRLF +"" CRLF +"

503 Service Temporarily Unavailable

" CRLF +; + + +static char ngx_http_error_504_page[] = +"" CRLF +"504 Gateway Time-out" CRLF +"" CRLF +"

504 Gateway Time-out

" CRLF +; + + +static char ngx_http_error_507_page[] = +"" CRLF +"507 Insufficient Storage" CRLF +"" CRLF +"

507 Insufficient Storage

" CRLF +; + + +static ngx_str_t ngx_http_error_pages[] = { + + ngx_null_string, /* 201, 204 */ + +#define NGX_HTTP_LAST_2XX 202 +#define NGX_HTTP_OFF_3XX (NGX_HTTP_LAST_2XX - 201) + + /* ngx_null_string, */ /* 300 */ + ngx_string(ngx_http_error_301_page), + ngx_string(ngx_http_error_302_page), + ngx_string(ngx_http_error_303_page), + ngx_null_string, /* 304 */ + ngx_null_string, /* 305 */ + ngx_null_string, /* 306 */ + ngx_string(ngx_http_error_307_page), + +#define NGX_HTTP_LAST_3XX 308 +#define NGX_HTTP_OFF_4XX (NGX_HTTP_LAST_3XX - 301 + NGX_HTTP_OFF_3XX) + + ngx_string(ngx_http_error_400_page), + ngx_string(ngx_http_error_401_page), + ngx_string(ngx_http_error_402_page), + ngx_string(ngx_http_error_403_page), + ngx_string(ngx_http_error_404_page), + ngx_string(ngx_http_error_405_page), + ngx_string(ngx_http_error_406_page), + ngx_null_string, /* 407 */ + ngx_string(ngx_http_error_408_page), + ngx_string(ngx_http_error_409_page), + ngx_string(ngx_http_error_410_page), + ngx_string(ngx_http_error_411_page), + ngx_string(ngx_http_error_412_page), + ngx_string(ngx_http_error_413_page), + ngx_string(ngx_http_error_414_page), + ngx_string(ngx_http_error_415_page), + ngx_string(ngx_http_error_416_page), + +#define NGX_HTTP_LAST_4XX 417 +#define NGX_HTTP_OFF_5XX (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX) + + ngx_string(ngx_http_error_494_page), /* 494, request header too large */ + ngx_string(ngx_http_error_495_page), /* 495, https certificate error */ + ngx_string(ngx_http_error_496_page), /* 496, https no certificate */ + ngx_string(ngx_http_error_497_page), /* 497, http to https */ + ngx_string(ngx_http_error_404_page), /* 498, canceled */ + ngx_null_string, /* 499, client has closed connection */ + + ngx_string(ngx_http_error_500_page), + ngx_string(ngx_http_error_501_page), + ngx_string(ngx_http_error_502_page), + ngx_string(ngx_http_error_503_page), + ngx_string(ngx_http_error_504_page), + ngx_null_string, /* 505 */ + ngx_null_string, /* 506 */ + ngx_string(ngx_http_error_507_page) + +#define NGX_HTTP_LAST_5XX 508 + +}; + + +static ngx_str_t ngx_http_get_name = { 3, (u_char *) "GET " }; + + +ngx_int_t +ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error) +{ + ngx_uint_t i, err; + ngx_http_err_page_t *err_page; + ngx_http_core_loc_conf_t *clcf; + + ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http special response: %d, \"%V?%V\"", + error, &r->uri, &r->args); + + r->err_status = error; + + if (r->keepalive) { + switch (error) { + case NGX_HTTP_BAD_REQUEST: + case NGX_HTTP_REQUEST_ENTITY_TOO_LARGE: + case NGX_HTTP_REQUEST_URI_TOO_LARGE: + case NGX_HTTP_TO_HTTPS: + case NGX_HTTPS_CERT_ERROR: + case NGX_HTTPS_NO_CERT: + case NGX_HTTP_INTERNAL_SERVER_ERROR: + case NGX_HTTP_NOT_IMPLEMENTED: + r->keepalive = 0; + } + } + + if (r->lingering_close) { + switch (error) { + case NGX_HTTP_BAD_REQUEST: + case NGX_HTTP_TO_HTTPS: + case NGX_HTTPS_CERT_ERROR: + case NGX_HTTPS_NO_CERT: + r->lingering_close = 0; + } + } + + r->headers_out.content_type.len = 0; + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (!r->error_page && clcf->error_pages && r->uri_changes != 0) { + + if (clcf->recursive_error_pages == 0) { + r->error_page = 1; + } + + err_page = clcf->error_pages->elts; + + for (i = 0; i < clcf->error_pages->nelts; i++) { + if (err_page[i].status == error) { + return ngx_http_send_error_page(r, &err_page[i]); + } + } + } + + r->expect_tested = 1; + + if (ngx_http_discard_request_body(r) != NGX_OK) { + r->keepalive = 0; + } + + if (clcf->msie_refresh + && r->headers_in.msie + && (error == NGX_HTTP_MOVED_PERMANENTLY + || error == NGX_HTTP_MOVED_TEMPORARILY)) + { + return ngx_http_send_refresh(r); + } + + if (error == NGX_HTTP_CREATED) { + /* 201 */ + err = 0; + + } else if (error == NGX_HTTP_NO_CONTENT) { + /* 204 */ + err = 0; + + } else if (error >= NGX_HTTP_MOVED_PERMANENTLY + && error < NGX_HTTP_LAST_3XX) + { + /* 3XX */ + err = error - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_OFF_3XX; + + } else if (error >= NGX_HTTP_BAD_REQUEST + && error < NGX_HTTP_LAST_4XX) + { + /* 4XX */ + err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_OFF_4XX; + + } else if (error >= NGX_HTTP_NGINX_CODES + && error < NGX_HTTP_LAST_5XX) + { + /* 49X, 5XX */ + err = error - NGX_HTTP_NGINX_CODES + NGX_HTTP_OFF_5XX; + switch (error) { + case NGX_HTTP_TO_HTTPS: + case NGX_HTTPS_CERT_ERROR: + case NGX_HTTPS_NO_CERT: + case NGX_HTTP_REQUEST_HEADER_TOO_LARGE: + r->err_status = NGX_HTTP_BAD_REQUEST; + break; + } + + } else { + /* unknown code, zero body */ + err = 0; + } + + return ngx_http_send_special_response(r, clcf, err); +} + + +ngx_int_t +ngx_http_filter_finalize_request(ngx_http_request_t *r, ngx_module_t *m, + ngx_int_t error) +{ + void *ctx; + ngx_int_t rc; + + ngx_http_clean_header(r); + + ctx = NULL; + + if (m) { + ctx = r->ctx[m->ctx_index]; + } + + /* clear the modules contexts */ + ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module); + + if (m) { + r->ctx[m->ctx_index] = ctx; + } + + r->filter_finalize = 1; + + rc = ngx_http_special_response_handler(r, error); + + /* NGX_ERROR resets any pending data */ + + switch (rc) { + + case NGX_OK: + case NGX_DONE: + return NGX_ERROR; + + default: + return rc; + } +} + + +void +ngx_http_clean_header(ngx_http_request_t *r) +{ + ngx_memzero(&r->headers_out.status, + sizeof(ngx_http_headers_out_t) + - offsetof(ngx_http_headers_out_t, status)); + + r->headers_out.headers.part.nelts = 0; + r->headers_out.headers.part.next = NULL; + r->headers_out.headers.last = &r->headers_out.headers.part; + + r->headers_out.content_length_n = -1; + r->headers_out.last_modified_time = -1; +} + + +static ngx_int_t +ngx_http_send_error_page(ngx_http_request_t *r, ngx_http_err_page_t *err_page) +{ + ngx_int_t overwrite; + ngx_str_t uri, args; + ngx_table_elt_t *location; + ngx_http_core_loc_conf_t *clcf; + + overwrite = err_page->overwrite; + + if (overwrite && overwrite != NGX_HTTP_OK) { + r->expect_tested = 1; + } + + if (overwrite >= 0) { + r->err_status = overwrite; + } + + if (ngx_http_complex_value(r, &err_page->value, &uri) != NGX_OK) { + return NGX_ERROR; + } + + if (uri.data[0] == '/') { + + if (err_page->value.lengths) { + ngx_http_split_args(r, &uri, &args); + + } else { + args = err_page->args; + } + + if (r->method != NGX_HTTP_HEAD) { + r->method = NGX_HTTP_GET; + r->method_name = ngx_http_get_name; + } + + return ngx_http_internal_redirect(r, &uri, &args); + } + + if (uri.data[0] == '@') { + return ngx_http_named_location(r, &uri); + } + + location = ngx_list_push(&r->headers_out.headers); + + if (location == NULL) { + return NGX_ERROR; + } + + if (overwrite != NGX_HTTP_MOVED_PERMANENTLY + && overwrite != NGX_HTTP_MOVED_TEMPORARILY + && overwrite != NGX_HTTP_SEE_OTHER + && overwrite != NGX_HTTP_TEMPORARY_REDIRECT) + { + r->err_status = NGX_HTTP_MOVED_TEMPORARILY; + } + + location->hash = 1; + ngx_str_set(&location->key, "Location"); + location->value = uri; + + ngx_http_clear_location(r); + + r->headers_out.location = location; + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (clcf->msie_refresh && r->headers_in.msie) { + return ngx_http_send_refresh(r); + } + + return ngx_http_send_special_response(r, clcf, r->err_status + - NGX_HTTP_MOVED_PERMANENTLY + + NGX_HTTP_OFF_3XX); +} + + +static ngx_int_t +ngx_http_send_special_response(ngx_http_request_t *r, + ngx_http_core_loc_conf_t *clcf, ngx_uint_t err) +{ + u_char *tail; + size_t len; + ngx_int_t rc; + ngx_buf_t *b; + ngx_uint_t msie_padding; + ngx_chain_t out[3]; + + if (clcf->server_tokens) { + len = sizeof(ngx_http_error_full_tail) - 1; + tail = ngx_http_error_full_tail; + + } else { + len = sizeof(ngx_http_error_tail) - 1; + tail = ngx_http_error_tail; + } + + msie_padding = 0; + + if (ngx_http_error_pages[err].len) { + r->headers_out.content_length_n = ngx_http_error_pages[err].len + len; + if (clcf->msie_padding + && (r->headers_in.msie || r->headers_in.chrome) + && r->http_version >= NGX_HTTP_VERSION_10 + && err >= NGX_HTTP_OFF_4XX) + { + r->headers_out.content_length_n += + sizeof(ngx_http_msie_padding) - 1; + msie_padding = 1; + } + + r->headers_out.content_type_len = sizeof("text/html") - 1; + ngx_str_set(&r->headers_out.content_type, "text/html"); + r->headers_out.content_type_lowcase = NULL; + + } else { + r->headers_out.content_length_n = 0; + } + + if (r->headers_out.content_length) { + r->headers_out.content_length->hash = 0; + r->headers_out.content_length = NULL; + } + + ngx_http_clear_accept_ranges(r); + ngx_http_clear_last_modified(r); + ngx_http_clear_etag(r); + + rc = ngx_http_send_header(r); + + if (rc == NGX_ERROR || r->header_only) { + return rc; + } + + if (ngx_http_error_pages[err].len == 0) { + return ngx_http_send_special(r, NGX_HTTP_LAST); + } + + b = ngx_calloc_buf(r->pool); + if (b == NULL) { + return NGX_ERROR; + } + + b->memory = 1; + b->pos = ngx_http_error_pages[err].data; + b->last = ngx_http_error_pages[err].data + ngx_http_error_pages[err].len; + + out[0].buf = b; + out[0].next = &out[1]; + + b = ngx_calloc_buf(r->pool); + if (b == NULL) { + return NGX_ERROR; + } + + b->memory = 1; + + b->pos = tail; + b->last = tail + len; + + out[1].buf = b; + out[1].next = NULL; + + if (msie_padding) { + b = ngx_calloc_buf(r->pool); + if (b == NULL) { + return NGX_ERROR; + } + + b->memory = 1; + b->pos = ngx_http_msie_padding; + b->last = ngx_http_msie_padding + sizeof(ngx_http_msie_padding) - 1; + + out[1].next = &out[2]; + out[2].buf = b; + out[2].next = NULL; + } + + if (r == r->main) { + b->last_buf = 1; + } + + b->last_in_chain = 1; + + return ngx_http_output_filter(r, &out[0]); +} + + +static ngx_int_t +ngx_http_send_refresh(ngx_http_request_t *r) +{ + u_char *p, *location; + size_t len, size; + uintptr_t escape; + ngx_int_t rc; + ngx_buf_t *b; + ngx_chain_t out; + + len = r->headers_out.location->value.len; + location = r->headers_out.location->value.data; + + escape = 2 * ngx_escape_uri(NULL, location, len, NGX_ESCAPE_REFRESH); + + size = sizeof(ngx_http_msie_refresh_head) - 1 + + escape + len + + sizeof(ngx_http_msie_refresh_tail) - 1; + + r->err_status = NGX_HTTP_OK; + + r->headers_out.content_type_len = sizeof("text/html") - 1; + ngx_str_set(&r->headers_out.content_type, "text/html"); + r->headers_out.content_type_lowcase = NULL; + + r->headers_out.location->hash = 0; + r->headers_out.location = NULL; + + r->headers_out.content_length_n = size; + + if (r->headers_out.content_length) { + r->headers_out.content_length->hash = 0; + r->headers_out.content_length = NULL; + } + + ngx_http_clear_accept_ranges(r); + ngx_http_clear_last_modified(r); + ngx_http_clear_etag(r); + + rc = ngx_http_send_header(r); + + if (rc == NGX_ERROR || r->header_only) { + return rc; + } + + b = ngx_create_temp_buf(r->pool, size); + if (b == NULL) { + return NGX_ERROR; + } + + p = ngx_cpymem(b->pos, ngx_http_msie_refresh_head, + sizeof(ngx_http_msie_refresh_head) - 1); + + if (escape == 0) { + p = ngx_cpymem(p, location, len); + + } else { + p = (u_char *) ngx_escape_uri(p, location, len, NGX_ESCAPE_REFRESH); + } + + b->last = ngx_cpymem(p, ngx_http_msie_refresh_tail, + sizeof(ngx_http_msie_refresh_tail) - 1); + + b->last_buf = 1; + b->last_in_chain = 1; + + out.buf = b; + out.next = NULL; + + return ngx_http_output_filter(r, &out); +} diff --git a/release/src/router/nginx/src/http/ngx_http_upstream.c b/release/src/router/nginx/src/http/ngx_http_upstream.c new file mode 100644 index 0000000000..45e2eb7b96 --- /dev/null +++ b/release/src/router/nginx/src/http/ngx_http_upstream.c @@ -0,0 +1,5137 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +#if (NGX_HTTP_CACHE) +static ngx_int_t ngx_http_upstream_cache(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static ngx_int_t ngx_http_upstream_cache_send(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static ngx_int_t ngx_http_upstream_cache_status(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +#endif + +static void ngx_http_upstream_init_request(ngx_http_request_t *r); +static void ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx); +static void ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r); +static void ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r); +static void ngx_http_upstream_check_broken_connection(ngx_http_request_t *r, + ngx_event_t *ev); +static void ngx_http_upstream_connect(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static ngx_int_t ngx_http_upstream_reinit(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void ngx_http_upstream_send_request(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void ngx_http_upstream_send_request_handler(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void ngx_http_upstream_process_header(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static ngx_int_t ngx_http_upstream_test_next(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static ngx_int_t ngx_http_upstream_intercept_errors(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static ngx_int_t ngx_http_upstream_test_connect(ngx_connection_t *c); +static ngx_int_t ngx_http_upstream_process_headers(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void ngx_http_upstream_send_response(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void ngx_http_upstream_upgrade(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void ngx_http_upstream_upgraded_read_downstream(ngx_http_request_t *r); +static void ngx_http_upstream_upgraded_write_downstream(ngx_http_request_t *r); +static void ngx_http_upstream_upgraded_read_upstream(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void ngx_http_upstream_upgraded_write_upstream(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void ngx_http_upstream_process_upgraded(ngx_http_request_t *r, + ngx_uint_t from_upstream, ngx_uint_t do_write); +static void + ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r); +static void + ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void + ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r, + ngx_uint_t do_write); +static ngx_int_t ngx_http_upstream_non_buffered_filter_init(void *data); +static ngx_int_t ngx_http_upstream_non_buffered_filter(void *data, + ssize_t bytes); +static void ngx_http_upstream_process_downstream(ngx_http_request_t *r); +static void ngx_http_upstream_process_upstream(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void ngx_http_upstream_process_request(ngx_http_request_t *r); +static void ngx_http_upstream_store(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void ngx_http_upstream_dummy_handler(ngx_http_request_t *r, + ngx_http_upstream_t *u); +static void ngx_http_upstream_next(ngx_http_request_t *r, + ngx_http_upstream_t *u, ngx_uint_t ft_type); +static void ngx_http_upstream_cleanup(void *data); +static void ngx_http_upstream_finalize_request(ngx_http_request_t *r, + ngx_http_upstream_t *u, ngx_int_t rc); + +static ngx_int_t ngx_http_upstream_process_header_line(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_process_content_length(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_process_set_cookie(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t + ngx_http_upstream_process_cache_control(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_ignore_header_line(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_process_expires(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_process_accel_expires(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_process_limit_rate(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_process_buffering(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_process_charset(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_process_connection(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t + ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_copy_header_line(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t + ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_copy_content_type(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_copy_last_modified(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_rewrite_location(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +static ngx_int_t ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); + +#if (NGX_HTTP_GZIP) +static ngx_int_t ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset); +#endif + +static ngx_int_t ngx_http_upstream_add_variables(ngx_conf_t *cf); +static ngx_int_t ngx_http_upstream_addr_variable(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_upstream_status_variable(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_upstream_response_time_variable(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_upstream_response_length_variable( + ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); + +static char *ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy); +static char *ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); + +static ngx_addr_t *ngx_http_upstream_get_local(ngx_http_request_t *r, + ngx_http_upstream_local_t *local); + +static void *ngx_http_upstream_create_main_conf(ngx_conf_t *cf); +static char *ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf); + +#if (NGX_HTTP_SSL) +static void ngx_http_upstream_ssl_init_connection(ngx_http_request_t *, + ngx_http_upstream_t *u, ngx_connection_t *c); +static void ngx_http_upstream_ssl_handshake(ngx_connection_t *c); +#endif + + +ngx_http_upstream_header_t ngx_http_upstream_headers_in[] = { + + { ngx_string("Status"), + ngx_http_upstream_process_header_line, + offsetof(ngx_http_upstream_headers_in_t, status), + ngx_http_upstream_copy_header_line, 0, 0 }, + + { ngx_string("Content-Type"), + ngx_http_upstream_process_header_line, + offsetof(ngx_http_upstream_headers_in_t, content_type), + ngx_http_upstream_copy_content_type, 0, 1 }, + + { ngx_string("Content-Length"), + ngx_http_upstream_process_content_length, + offsetof(ngx_http_upstream_headers_in_t, content_length), + ngx_http_upstream_ignore_header_line, 0, 0 }, + + { ngx_string("Date"), + ngx_http_upstream_process_header_line, + offsetof(ngx_http_upstream_headers_in_t, date), + ngx_http_upstream_copy_header_line, + offsetof(ngx_http_headers_out_t, date), 0 }, + + { ngx_string("Last-Modified"), + ngx_http_upstream_process_header_line, + offsetof(ngx_http_upstream_headers_in_t, last_modified), + ngx_http_upstream_copy_last_modified, 0, 0 }, + + { ngx_string("ETag"), + ngx_http_upstream_process_header_line, + offsetof(ngx_http_upstream_headers_in_t, etag), + ngx_http_upstream_copy_header_line, + offsetof(ngx_http_headers_out_t, etag), 0 }, + + { ngx_string("Server"), + ngx_http_upstream_process_header_line, + offsetof(ngx_http_upstream_headers_in_t, server), + ngx_http_upstream_copy_header_line, + offsetof(ngx_http_headers_out_t, server), 0 }, + + { ngx_string("WWW-Authenticate"), + ngx_http_upstream_process_header_line, + offsetof(ngx_http_upstream_headers_in_t, www_authenticate), + ngx_http_upstream_copy_header_line, 0, 0 }, + + { ngx_string("Location"), + ngx_http_upstream_process_header_line, + offsetof(ngx_http_upstream_headers_in_t, location), + ngx_http_upstream_rewrite_location, 0, 0 }, + + { ngx_string("Refresh"), + ngx_http_upstream_ignore_header_line, 0, + ngx_http_upstream_rewrite_refresh, 0, 0 }, + + { ngx_string("Set-Cookie"), + ngx_http_upstream_process_set_cookie, 0, + ngx_http_upstream_rewrite_set_cookie, 0, 1 }, + + { ngx_string("Content-Disposition"), + ngx_http_upstream_ignore_header_line, 0, + ngx_http_upstream_copy_header_line, 0, 1 }, + + { ngx_string("Cache-Control"), + ngx_http_upstream_process_cache_control, 0, + ngx_http_upstream_copy_multi_header_lines, + offsetof(ngx_http_headers_out_t, cache_control), 1 }, + + { ngx_string("Expires"), + ngx_http_upstream_process_expires, 0, + ngx_http_upstream_copy_header_line, + offsetof(ngx_http_headers_out_t, expires), 1 }, + + { ngx_string("Accept-Ranges"), + ngx_http_upstream_process_header_line, + offsetof(ngx_http_upstream_headers_in_t, accept_ranges), + ngx_http_upstream_copy_allow_ranges, + offsetof(ngx_http_headers_out_t, accept_ranges), 1 }, + + { ngx_string("Connection"), + ngx_http_upstream_process_connection, 0, + ngx_http_upstream_ignore_header_line, 0, 0 }, + + { ngx_string("Keep-Alive"), + ngx_http_upstream_ignore_header_line, 0, + ngx_http_upstream_ignore_header_line, 0, 0 }, + + { ngx_string("X-Powered-By"), + ngx_http_upstream_ignore_header_line, 0, + ngx_http_upstream_copy_header_line, 0, 0 }, + + { ngx_string("X-Accel-Expires"), + ngx_http_upstream_process_accel_expires, 0, + ngx_http_upstream_copy_header_line, 0, 0 }, + + { ngx_string("X-Accel-Redirect"), + ngx_http_upstream_process_header_line, + offsetof(ngx_http_upstream_headers_in_t, x_accel_redirect), + ngx_http_upstream_copy_header_line, 0, 0 }, + + { ngx_string("X-Accel-Limit-Rate"), + ngx_http_upstream_process_limit_rate, 0, + ngx_http_upstream_copy_header_line, 0, 0 }, + + { ngx_string("X-Accel-Buffering"), + ngx_http_upstream_process_buffering, 0, + ngx_http_upstream_copy_header_line, 0, 0 }, + + { ngx_string("X-Accel-Charset"), + ngx_http_upstream_process_charset, 0, + ngx_http_upstream_copy_header_line, 0, 0 }, + + { ngx_string("Transfer-Encoding"), + ngx_http_upstream_process_transfer_encoding, 0, + ngx_http_upstream_ignore_header_line, 0, 0 }, + +#if (NGX_HTTP_GZIP) + { ngx_string("Content-Encoding"), + ngx_http_upstream_process_header_line, + offsetof(ngx_http_upstream_headers_in_t, content_encoding), + ngx_http_upstream_copy_content_encoding, 0, 0 }, +#endif + + { ngx_null_string, NULL, 0, NULL, 0, 0 } +}; + + +static ngx_command_t ngx_http_upstream_commands[] = { + + { ngx_string("upstream"), + NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1, + ngx_http_upstream, + 0, + 0, + NULL }, + + { ngx_string("server"), + NGX_HTTP_UPS_CONF|NGX_CONF_1MORE, + ngx_http_upstream_server, + NGX_HTTP_SRV_CONF_OFFSET, + 0, + NULL }, + + ngx_null_command +}; + + +static ngx_http_module_t ngx_http_upstream_module_ctx = { + ngx_http_upstream_add_variables, /* preconfiguration */ + NULL, /* postconfiguration */ + + ngx_http_upstream_create_main_conf, /* create main configuration */ + ngx_http_upstream_init_main_conf, /* init main configuration */ + + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + + NULL, /* create location configuration */ + NULL /* merge location configuration */ +}; + + +ngx_module_t ngx_http_upstream_module = { + NGX_MODULE_V1, + &ngx_http_upstream_module_ctx, /* module context */ + ngx_http_upstream_commands, /* module directives */ + NGX_HTTP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_http_variable_t ngx_http_upstream_vars[] = { + + { ngx_string("upstream_addr"), NULL, + ngx_http_upstream_addr_variable, 0, + NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("upstream_status"), NULL, + ngx_http_upstream_status_variable, 0, + NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("upstream_response_time"), NULL, + ngx_http_upstream_response_time_variable, 0, + NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("upstream_response_length"), NULL, + ngx_http_upstream_response_length_variable, 0, + NGX_HTTP_VAR_NOCACHEABLE, 0 }, + +#if (NGX_HTTP_CACHE) + + { ngx_string("upstream_cache_status"), NULL, + ngx_http_upstream_cache_status, 0, + NGX_HTTP_VAR_NOCACHEABLE, 0 }, + +#endif + + { ngx_null_string, NULL, NULL, 0, 0, 0 } +}; + + +static ngx_http_upstream_next_t ngx_http_upstream_next_errors[] = { + { 500, NGX_HTTP_UPSTREAM_FT_HTTP_500 }, + { 502, NGX_HTTP_UPSTREAM_FT_HTTP_502 }, + { 503, NGX_HTTP_UPSTREAM_FT_HTTP_503 }, + { 504, NGX_HTTP_UPSTREAM_FT_HTTP_504 }, + { 404, NGX_HTTP_UPSTREAM_FT_HTTP_404 }, + { 0, 0 } +}; + + +ngx_conf_bitmask_t ngx_http_upstream_cache_method_mask[] = { + { ngx_string("GET"), NGX_HTTP_GET}, + { ngx_string("HEAD"), NGX_HTTP_HEAD }, + { ngx_string("POST"), NGX_HTTP_POST }, + { ngx_null_string, 0 } +}; + + +ngx_conf_bitmask_t ngx_http_upstream_ignore_headers_masks[] = { + { ngx_string("X-Accel-Redirect"), NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT }, + { ngx_string("X-Accel-Expires"), NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES }, + { ngx_string("X-Accel-Limit-Rate"), NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE }, + { ngx_string("X-Accel-Buffering"), NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING }, + { ngx_string("X-Accel-Charset"), NGX_HTTP_UPSTREAM_IGN_XA_CHARSET }, + { ngx_string("Expires"), NGX_HTTP_UPSTREAM_IGN_EXPIRES }, + { ngx_string("Cache-Control"), NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL }, + { ngx_string("Set-Cookie"), NGX_HTTP_UPSTREAM_IGN_SET_COOKIE }, + { ngx_null_string, 0 } +}; + + +ngx_int_t +ngx_http_upstream_create(ngx_http_request_t *r) +{ + ngx_http_upstream_t *u; + + u = r->upstream; + + if (u && u->cleanup) { + r->main->count++; + ngx_http_upstream_cleanup(r); + } + + u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t)); + if (u == NULL) { + return NGX_ERROR; + } + + r->upstream = u; + + u->peer.log = r->connection->log; + u->peer.log_error = NGX_ERROR_ERR; +#if (NGX_THREADS) + u->peer.lock = &r->connection->lock; +#endif + +#if (NGX_HTTP_CACHE) + r->cache = NULL; +#endif + + u->headers_in.content_length_n = -1; + + return NGX_OK; +} + + +void +ngx_http_upstream_init(ngx_http_request_t *r) +{ + ngx_connection_t *c; + + c = r->connection; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http init upstream, client timer: %d", c->read->timer_set); + +#if (NGX_HTTP_SPDY) + if (r->spdy_stream) { + ngx_http_upstream_init_request(r); + return; + } +#endif + + if (c->read->timer_set) { + ngx_del_timer(c->read); + } + + if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { + + if (!c->write->active) { + if (ngx_add_event(c->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT) + == NGX_ERROR) + { + ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + } + } + + ngx_http_upstream_init_request(r); +} + + +static void +ngx_http_upstream_init_request(ngx_http_request_t *r) +{ + ngx_str_t *host; + ngx_uint_t i; + ngx_resolver_ctx_t *ctx, temp; + ngx_http_cleanup_t *cln; + ngx_http_upstream_t *u; + ngx_http_core_loc_conf_t *clcf; + ngx_http_upstream_srv_conf_t *uscf, **uscfp; + ngx_http_upstream_main_conf_t *umcf; + + if (r->aio) { + return; + } + + u = r->upstream; + +#if (NGX_HTTP_CACHE) + + if (u->conf->cache) { + ngx_int_t rc; + + rc = ngx_http_upstream_cache(r, u); + + if (rc == NGX_BUSY) { + r->write_event_handler = ngx_http_upstream_init_request; + return; + } + + r->write_event_handler = ngx_http_request_empty_handler; + + if (rc == NGX_DONE) { + return; + } + + if (rc != NGX_DECLINED) { + ngx_http_finalize_request(r, rc); + return; + } + } + +#endif + + u->store = (u->conf->store || u->conf->store_lengths); + + if (!u->store && !r->post_action && !u->conf->ignore_client_abort) { + r->read_event_handler = ngx_http_upstream_rd_check_broken_connection; + r->write_event_handler = ngx_http_upstream_wr_check_broken_connection; + } + + if (r->request_body) { + u->request_bufs = r->request_body->bufs; + } + + if (u->create_request(r) != NGX_OK) { + ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + u->peer.local = ngx_http_upstream_get_local(r, u->conf->local); + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + u->output.alignment = clcf->directio_alignment; + u->output.pool = r->pool; + u->output.bufs.num = 1; + u->output.bufs.size = clcf->client_body_buffer_size; + u->output.output_filter = ngx_chain_writer; + u->output.filter_ctx = &u->writer; + + u->writer.pool = r->pool; + + if (r->upstream_states == NULL) { + + r->upstream_states = ngx_array_create(r->pool, 1, + sizeof(ngx_http_upstream_state_t)); + if (r->upstream_states == NULL) { + ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + } else { + + u->state = ngx_array_push(r->upstream_states); + if (u->state == NULL) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t)); + } + + cln = ngx_http_cleanup_add(r, 0); + if (cln == NULL) { + ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + cln->handler = ngx_http_upstream_cleanup; + cln->data = r; + u->cleanup = &cln->handler; + + if (u->resolved == NULL) { + + uscf = u->conf->upstream; + + } else { + + if (u->resolved->sockaddr) { + + if (ngx_http_upstream_create_round_robin_peer(r, u->resolved) + != NGX_OK) + { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + ngx_http_upstream_connect(r, u); + + return; + } + + host = &u->resolved->host; + + umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); + + uscfp = umcf->upstreams.elts; + + for (i = 0; i < umcf->upstreams.nelts; i++) { + + uscf = uscfp[i]; + + if (uscf->host.len == host->len + && ((uscf->port == 0 && u->resolved->no_port) + || uscf->port == u->resolved->port) + && ngx_memcmp(uscf->host.data, host->data, host->len) == 0) + { + goto found; + } + } + + if (u->resolved->port == 0) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "no port in upstream \"%V\"", host); + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + temp.name = *host; + + ctx = ngx_resolve_start(clcf->resolver, &temp); + if (ctx == NULL) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + if (ctx == NGX_NO_RESOLVER) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "no resolver defined to resolve %V", host); + + ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY); + return; + } + + ctx->name = *host; + ctx->type = NGX_RESOLVE_A; + ctx->handler = ngx_http_upstream_resolve_handler; + ctx->data = r; + ctx->timeout = clcf->resolver_timeout; + + u->resolved->ctx = ctx; + + if (ngx_resolve_name(ctx) != NGX_OK) { + u->resolved->ctx = NULL; + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + return; + } + +found: + + if (uscf == NULL) { + ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, + "no upstream configuration"); + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + if (uscf->peer.init(r, uscf) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + ngx_http_upstream_connect(r, u); +} + + +#if (NGX_HTTP_CACHE) + +static ngx_int_t +ngx_http_upstream_cache(ngx_http_request_t *r, ngx_http_upstream_t *u) +{ + ngx_int_t rc; + ngx_http_cache_t *c; + + c = r->cache; + + if (c == NULL) { + + if (!(r->method & u->conf->cache_methods)) { + return NGX_DECLINED; + } + + if (r->method & NGX_HTTP_HEAD) { + u->method = ngx_http_core_get_method; + } + + if (ngx_http_file_cache_new(r) != NGX_OK) { + return NGX_ERROR; + } + + if (u->create_key(r) != NGX_OK) { + return NGX_ERROR; + } + + /* TODO: add keys */ + + ngx_http_file_cache_create_key(r); + + if (r->cache->header_start + 256 >= u->conf->buffer_size) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "%V_buffer_size %uz is not enough for cache key, " + "it should increased at least to %uz", + &u->conf->module, u->conf->buffer_size, + ngx_align(r->cache->header_start + 256, 1024)); + + r->cache = NULL; + return NGX_DECLINED; + } + + u->cacheable = 1; + + switch (ngx_http_test_predicates(r, u->conf->cache_bypass)) { + + case NGX_ERROR: + return NGX_ERROR; + + case NGX_DECLINED: + u->cache_status = NGX_HTTP_CACHE_BYPASS; + return NGX_DECLINED; + + default: /* NGX_OK */ + break; + } + + c = r->cache; + + c->min_uses = u->conf->cache_min_uses; + c->body_start = u->conf->buffer_size; + c->file_cache = u->conf->cache->data; + + c->lock = u->conf->cache_lock; + c->lock_timeout = u->conf->cache_lock_timeout; + + u->cache_status = NGX_HTTP_CACHE_MISS; + } + + rc = ngx_http_file_cache_open(r); + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http upstream cache: %i", rc); + + switch (rc) { + + case NGX_HTTP_CACHE_UPDATING: + + if (u->conf->cache_use_stale & NGX_HTTP_UPSTREAM_FT_UPDATING) { + u->cache_status = rc; + rc = NGX_OK; + + } else { + rc = NGX_HTTP_CACHE_STALE; + } + + break; + + case NGX_OK: + u->cache_status = NGX_HTTP_CACHE_HIT; + } + + switch (rc) { + + case NGX_OK: + + rc = ngx_http_upstream_cache_send(r, u); + + if (rc != NGX_HTTP_UPSTREAM_INVALID_HEADER) { + return rc; + } + + break; + + case NGX_HTTP_CACHE_STALE: + + c->valid_sec = 0; + u->buffer.start = NULL; + u->cache_status = NGX_HTTP_CACHE_EXPIRED; + + break; + + case NGX_DECLINED: + + if ((size_t) (u->buffer.end - u->buffer.start) < u->conf->buffer_size) { + u->buffer.start = NULL; + + } else { + u->buffer.pos = u->buffer.start + c->header_start; + u->buffer.last = u->buffer.pos; + } + + break; + + case NGX_HTTP_CACHE_SCARCE: + + u->cacheable = 0; + + break; + + case NGX_AGAIN: + + return NGX_BUSY; + + case NGX_ERROR: + + return NGX_ERROR; + + default: + + /* cached NGX_HTTP_BAD_GATEWAY, NGX_HTTP_GATEWAY_TIME_OUT, etc. */ + + u->cache_status = NGX_HTTP_CACHE_HIT; + + return rc; + } + + r->cached = 0; + + return NGX_DECLINED; +} + + +static ngx_int_t +ngx_http_upstream_cache_send(ngx_http_request_t *r, ngx_http_upstream_t *u) +{ + ngx_int_t rc; + ngx_http_cache_t *c; + + r->cached = 1; + c = r->cache; + + if (c->header_start == c->body_start) { + r->http_version = NGX_HTTP_VERSION_9; + return ngx_http_cache_send(r); + } + + /* TODO: cache stack */ + + u->buffer = *c->buf; + u->buffer.pos += c->header_start; + + ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t)); + u->headers_in.content_length_n = -1; + + if (ngx_list_init(&u->headers_in.headers, r->pool, 8, + sizeof(ngx_table_elt_t)) + != NGX_OK) + { + return NGX_ERROR; + } + + rc = u->process_header(r); + + if (rc == NGX_OK) { + + if (ngx_http_upstream_process_headers(r, u) != NGX_OK) { + return NGX_DONE; + } + + return ngx_http_cache_send(r); + } + + if (rc == NGX_ERROR) { + return NGX_ERROR; + } + + /* rc == NGX_HTTP_UPSTREAM_INVALID_HEADER */ + + /* TODO: delete file */ + + return rc; +} + +#endif + + +static void +ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx) +{ + ngx_connection_t *c; + ngx_http_request_t *r; + ngx_http_upstream_t *u; + ngx_http_upstream_resolved_t *ur; + + r = ctx->data; + c = r->connection; + + u = r->upstream; + ur = u->resolved; + + if (ctx->state) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "%V could not be resolved (%i: %s)", + &ctx->name, ctx->state, + ngx_resolver_strerror(ctx->state)); + + ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY); + goto failed; + } + + ur->naddrs = ctx->naddrs; + ur->addrs = ctx->addrs; + +#if (NGX_DEBUG) + { + in_addr_t addr; + ngx_uint_t i; + + for (i = 0; i < ctx->naddrs; i++) { + addr = ntohl(ur->addrs[i]); + + ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "name was resolved to %ud.%ud.%ud.%ud", + (addr >> 24) & 0xff, (addr >> 16) & 0xff, + (addr >> 8) & 0xff, addr & 0xff); + } + } +#endif + + if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + goto failed; + } + + ngx_resolve_name_done(ctx); + ur->ctx = NULL; + + ngx_http_upstream_connect(r, u); + +failed: + + ngx_http_run_posted_requests(c); +} + + +static void +ngx_http_upstream_handler(ngx_event_t *ev) +{ + ngx_connection_t *c; + ngx_http_request_t *r; + ngx_http_log_ctx_t *ctx; + ngx_http_upstream_t *u; + + c = ev->data; + r = c->data; + + u = r->upstream; + c = r->connection; + + ctx = c->log->data; + ctx->current_request = r; + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http upstream request: \"%V?%V\"", &r->uri, &r->args); + + if (ev->write) { + u->write_event_handler(r, u); + + } else { + u->read_event_handler(r, u); + } + + ngx_http_run_posted_requests(c); +} + + +static void +ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r) +{ + ngx_http_upstream_check_broken_connection(r, r->connection->read); +} + + +static void +ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r) +{ + ngx_http_upstream_check_broken_connection(r, r->connection->write); +} + + +static void +ngx_http_upstream_check_broken_connection(ngx_http_request_t *r, + ngx_event_t *ev) +{ + int n; + char buf[1]; + ngx_err_t err; + ngx_int_t event; + ngx_connection_t *c; + ngx_http_upstream_t *u; + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0, + "http upstream check client, write event:%d, \"%V\"", + ev->write, &r->uri); + + c = r->connection; + u = r->upstream; + + if (c->error) { + if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) { + + event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT; + + if (ngx_del_event(ev, event, 0) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + } + + if (!u->cacheable) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_CLIENT_CLOSED_REQUEST); + } + + return; + } + +#if (NGX_HTTP_SPDY) + if (r->spdy_stream) { + return; + } +#endif + +#if (NGX_HAVE_KQUEUE) + + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { + + if (!ev->pending_eof) { + return; + } + + ev->eof = 1; + c->error = 1; + + if (ev->kq_errno) { + ev->error = 1; + } + + if (!u->cacheable && u->peer.connection) { + ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno, + "kevent() reported that client prematurely closed " + "connection, so upstream connection is closed too"); + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_CLIENT_CLOSED_REQUEST); + return; + } + + ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno, + "kevent() reported that client prematurely closed " + "connection"); + + if (u->peer.connection == NULL) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_CLIENT_CLOSED_REQUEST); + } + + return; + } + +#endif + + n = recv(c->fd, buf, 1, MSG_PEEK); + + err = ngx_socket_errno; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err, + "http upstream recv(): %d", n); + + if (ev->write && (n >= 0 || err == NGX_EAGAIN)) { + return; + } + + if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) { + + event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT; + + if (ngx_del_event(ev, event, 0) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + } + + if (n > 0) { + return; + } + + if (n == -1) { + if (err == NGX_EAGAIN) { + return; + } + + ev->error = 1; + + } else { /* n == 0 */ + err = 0; + } + + ev->eof = 1; + c->error = 1; + + if (!u->cacheable && u->peer.connection) { + ngx_log_error(NGX_LOG_INFO, ev->log, err, + "client prematurely closed connection, " + "so upstream connection is closed too"); + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_CLIENT_CLOSED_REQUEST); + return; + } + + ngx_log_error(NGX_LOG_INFO, ev->log, err, + "client prematurely closed connection"); + + if (u->peer.connection == NULL) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_CLIENT_CLOSED_REQUEST); + } +} + + +static void +ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u) +{ + ngx_int_t rc; + ngx_time_t *tp; + ngx_connection_t *c; + + r->connection->log->action = "connecting to upstream"; + + if (u->state && u->state->response_sec) { + tp = ngx_timeofday(); + u->state->response_sec = tp->sec - u->state->response_sec; + u->state->response_msec = tp->msec - u->state->response_msec; + } + + u->state = ngx_array_push(r->upstream_states); + if (u->state == NULL) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t)); + + tp = ngx_timeofday(); + u->state->response_sec = tp->sec; + u->state->response_msec = tp->msec; + + rc = ngx_event_connect_peer(&u->peer); + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http upstream connect: %i", rc); + + if (rc == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + u->state->peer = u->peer.name; + + if (rc == NGX_BUSY) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no live upstreams"); + ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_NOLIVE); + return; + } + + if (rc == NGX_DECLINED) { + ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); + return; + } + + /* rc == NGX_OK || rc == NGX_AGAIN */ + + c = u->peer.connection; + + c->data = r; + + c->write->handler = ngx_http_upstream_handler; + c->read->handler = ngx_http_upstream_handler; + + u->write_event_handler = ngx_http_upstream_send_request_handler; + u->read_event_handler = ngx_http_upstream_process_header; + + c->sendfile &= r->connection->sendfile; + u->output.sendfile = c->sendfile; + + if (c->pool == NULL) { + + /* we need separate pool here to be able to cache SSL connections */ + + c->pool = ngx_create_pool(128, r->connection->log); + if (c->pool == NULL) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + } + + c->log = r->connection->log; + c->pool->log = c->log; + c->read->log = c->log; + c->write->log = c->log; + + /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */ + + u->writer.out = NULL; + u->writer.last = &u->writer.out; + u->writer.connection = c; + u->writer.limit = 0; + + if (u->request_sent) { + if (ngx_http_upstream_reinit(r, u) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + } + + if (r->request_body + && r->request_body->buf + && r->request_body->temp_file + && r == r->main) + { + /* + * the r->request_body->buf can be reused for one request only, + * the subrequests should allocate their own temporary bufs + */ + + u->output.free = ngx_alloc_chain_link(r->pool); + if (u->output.free == NULL) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + u->output.free->buf = r->request_body->buf; + u->output.free->next = NULL; + u->output.allocated = 1; + + r->request_body->buf->pos = r->request_body->buf->start; + r->request_body->buf->last = r->request_body->buf->start; + r->request_body->buf->tag = u->output.tag; + } + + u->request_sent = 0; + + if (rc == NGX_AGAIN) { + ngx_add_timer(c->write, u->conf->connect_timeout); + return; + } + +#if (NGX_HTTP_SSL) + + if (u->ssl && c->ssl == NULL) { + ngx_http_upstream_ssl_init_connection(r, u, c); + return; + } + +#endif + + ngx_http_upstream_send_request(r, u); +} + + +#if (NGX_HTTP_SSL) + +static void +ngx_http_upstream_ssl_init_connection(ngx_http_request_t *r, + ngx_http_upstream_t *u, ngx_connection_t *c) +{ + ngx_int_t rc; + + if (ngx_ssl_create_connection(u->conf->ssl, c, + NGX_SSL_BUFFER|NGX_SSL_CLIENT) + != NGX_OK) + { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + c->sendfile = 0; + u->output.sendfile = 0; + + if (u->conf->ssl_session_reuse) { + if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + } + + r->connection->log->action = "SSL handshaking to upstream"; + + rc = ngx_ssl_handshake(c); + + if (rc == NGX_AGAIN) { + c->ssl->handler = ngx_http_upstream_ssl_handshake; + return; + } + + ngx_http_upstream_ssl_handshake(c); +} + + +static void +ngx_http_upstream_ssl_handshake(ngx_connection_t *c) +{ + ngx_http_request_t *r; + ngx_http_upstream_t *u; + + r = c->data; + u = r->upstream; + + if (c->ssl->handshaked) { + + if (u->conf->ssl_session_reuse) { + u->peer.save_session(&u->peer, u->peer.data); + } + + c->write->handler = ngx_http_upstream_handler; + c->read->handler = ngx_http_upstream_handler; + + ngx_http_upstream_send_request(r, u); + + return; + } + + ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); + +} + +#endif + + +static ngx_int_t +ngx_http_upstream_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u) +{ + ngx_chain_t *cl; + + if (u->reinit_request(r) != NGX_OK) { + return NGX_ERROR; + } + + u->keepalive = 0; + u->upgrade = 0; + + ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t)); + u->headers_in.content_length_n = -1; + + if (ngx_list_init(&u->headers_in.headers, r->pool, 8, + sizeof(ngx_table_elt_t)) + != NGX_OK) + { + return NGX_ERROR; + } + + /* reinit the request chain */ + + for (cl = u->request_bufs; cl; cl = cl->next) { + cl->buf->pos = cl->buf->start; + cl->buf->file_pos = 0; + } + + /* reinit the subrequest's ngx_output_chain() context */ + + if (r->request_body && r->request_body->temp_file + && r != r->main && u->output.buf) + { + u->output.free = ngx_alloc_chain_link(r->pool); + if (u->output.free == NULL) { + return NGX_ERROR; + } + + u->output.free->buf = u->output.buf; + u->output.free->next = NULL; + + u->output.buf->pos = u->output.buf->start; + u->output.buf->last = u->output.buf->start; + } + + u->output.buf = NULL; + u->output.in = NULL; + u->output.busy = NULL; + + /* reinit u->buffer */ + + u->buffer.pos = u->buffer.start; + +#if (NGX_HTTP_CACHE) + + if (r->cache) { + u->buffer.pos += r->cache->header_start; + } + +#endif + + u->buffer.last = u->buffer.pos; + + return NGX_OK; +} + + +static void +ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u) +{ + ngx_int_t rc; + ngx_connection_t *c; + + c = u->peer.connection; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http upstream send request"); + + if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) { + ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); + return; + } + + c->log->action = "sending request to upstream"; + + rc = ngx_output_chain(&u->output, u->request_sent ? NULL : u->request_bufs); + + u->request_sent = 1; + + if (rc == NGX_ERROR) { + ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); + return; + } + + if (c->write->timer_set) { + ngx_del_timer(c->write); + } + + if (rc == NGX_AGAIN) { + ngx_add_timer(c->write, u->conf->send_timeout); + + if (ngx_handle_write_event(c->write, u->conf->send_lowat) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + return; + } + + /* rc == NGX_OK */ + + if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) { + if (ngx_tcp_push(c->fd) == NGX_ERROR) { + ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno, + ngx_tcp_push_n " failed"); + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + c->tcp_nopush = NGX_TCP_NOPUSH_UNSET; + } + + ngx_add_timer(c->read, u->conf->read_timeout); + +#if 1 + if (c->read->ready) { + + /* post aio operation */ + + /* + * TODO comment + * although we can post aio operation just in the end + * of ngx_http_upstream_connect() CHECK IT !!! + * it's better to do here because we postpone header buffer allocation + */ + + ngx_http_upstream_process_header(r, u); + return; + } +#endif + + u->write_event_handler = ngx_http_upstream_dummy_handler; + + if (ngx_handle_write_event(c->write, 0) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } +} + + +static void +ngx_http_upstream_send_request_handler(ngx_http_request_t *r, + ngx_http_upstream_t *u) +{ + ngx_connection_t *c; + + c = u->peer.connection; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http upstream send request handler"); + + if (c->write->timedout) { + ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT); + return; + } + +#if (NGX_HTTP_SSL) + + if (u->ssl && c->ssl == NULL) { + ngx_http_upstream_ssl_init_connection(r, u, c); + return; + } + +#endif + + if (u->header_sent) { + u->write_event_handler = ngx_http_upstream_dummy_handler; + + (void) ngx_handle_write_event(c->write, 0); + + return; + } + + ngx_http_upstream_send_request(r, u); +} + + +static void +ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u) +{ + ssize_t n; + ngx_int_t rc; + ngx_connection_t *c; + + c = u->peer.connection; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http upstream process header"); + + c->log->action = "reading response header from upstream"; + + if (c->read->timedout) { + ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT); + return; + } + + if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) { + ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); + return; + } + + if (u->buffer.start == NULL) { + u->buffer.start = ngx_palloc(r->pool, u->conf->buffer_size); + if (u->buffer.start == NULL) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + u->buffer.pos = u->buffer.start; + u->buffer.last = u->buffer.start; + u->buffer.end = u->buffer.start + u->conf->buffer_size; + u->buffer.temporary = 1; + + u->buffer.tag = u->output.tag; + + if (ngx_list_init(&u->headers_in.headers, r->pool, 8, + sizeof(ngx_table_elt_t)) + != NGX_OK) + { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + +#if (NGX_HTTP_CACHE) + + if (r->cache) { + u->buffer.pos += r->cache->header_start; + u->buffer.last = u->buffer.pos; + } +#endif + } + + for ( ;; ) { + + n = c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last); + + if (n == NGX_AGAIN) { +#if 0 + ngx_add_timer(rev, u->read_timeout); +#endif + + if (ngx_handle_read_event(c->read, 0) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + return; + } + + if (n == 0) { + ngx_log_error(NGX_LOG_ERR, c->log, 0, + "upstream prematurely closed connection"); + } + + if (n == NGX_ERROR || n == 0) { + ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); + return; + } + + u->buffer.last += n; + +#if 0 + u->valid_header_in = 0; + + u->peer.cached = 0; +#endif + + rc = u->process_header(r); + + if (rc == NGX_AGAIN) { + + if (u->buffer.last == u->buffer.end) { + ngx_log_error(NGX_LOG_ERR, c->log, 0, + "upstream sent too big header"); + + ngx_http_upstream_next(r, u, + NGX_HTTP_UPSTREAM_FT_INVALID_HEADER); + return; + } + + continue; + } + + break; + } + + if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) { + ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER); + return; + } + + if (rc == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + /* rc == NGX_OK */ + + if (u->headers_in.status_n > NGX_HTTP_SPECIAL_RESPONSE) { + + if (r->subrequest_in_memory) { + u->buffer.last = u->buffer.pos; + } + + if (ngx_http_upstream_test_next(r, u) == NGX_OK) { + return; + } + + if (ngx_http_upstream_intercept_errors(r, u) == NGX_OK) { + return; + } + } + + if (ngx_http_upstream_process_headers(r, u) != NGX_OK) { + return; + } + + if (!r->subrequest_in_memory) { + ngx_http_upstream_send_response(r, u); + return; + } + + /* subrequest content in memory */ + + if (u->input_filter == NULL) { + u->input_filter_init = ngx_http_upstream_non_buffered_filter_init; + u->input_filter = ngx_http_upstream_non_buffered_filter; + u->input_filter_ctx = r; + } + + if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + n = u->buffer.last - u->buffer.pos; + + if (n) { + u->buffer.last -= n; + + u->state->response_length += n; + + if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, NGX_ERROR); + return; + } + + if (u->length == 0) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + } + + u->read_event_handler = ngx_http_upstream_process_body_in_memory; + + ngx_http_upstream_process_body_in_memory(r, u); +} + + +static ngx_int_t +ngx_http_upstream_test_next(ngx_http_request_t *r, ngx_http_upstream_t *u) +{ + ngx_uint_t status; + ngx_http_upstream_next_t *un; + + status = u->headers_in.status_n; + + for (un = ngx_http_upstream_next_errors; un->status; un++) { + + if (status != un->status) { + continue; + } + + if (u->peer.tries > 1 && (u->conf->next_upstream & un->mask)) { + ngx_http_upstream_next(r, u, un->mask); + return NGX_OK; + } + +#if (NGX_HTTP_CACHE) + + if (u->cache_status == NGX_HTTP_CACHE_EXPIRED + && (u->conf->cache_use_stale & un->mask)) + { + ngx_int_t rc; + + rc = u->reinit_request(r); + + if (rc == NGX_OK) { + u->cache_status = NGX_HTTP_CACHE_STALE; + rc = ngx_http_upstream_cache_send(r, u); + } + + ngx_http_upstream_finalize_request(r, u, rc); + return NGX_OK; + } + +#endif + } + + return NGX_DECLINED; +} + + +static ngx_int_t +ngx_http_upstream_intercept_errors(ngx_http_request_t *r, + ngx_http_upstream_t *u) +{ + ngx_int_t status; + ngx_uint_t i; + ngx_table_elt_t *h; + ngx_http_err_page_t *err_page; + ngx_http_core_loc_conf_t *clcf; + + status = u->headers_in.status_n; + + if (status == NGX_HTTP_NOT_FOUND && u->conf->intercept_404) { + ngx_http_upstream_finalize_request(r, u, NGX_HTTP_NOT_FOUND); + return NGX_OK; + } + + if (!u->conf->intercept_errors) { + return NGX_DECLINED; + } + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (clcf->error_pages == NULL) { + return NGX_DECLINED; + } + + err_page = clcf->error_pages->elts; + for (i = 0; i < clcf->error_pages->nelts; i++) { + + if (err_page[i].status == status) { + + if (status == NGX_HTTP_UNAUTHORIZED + && u->headers_in.www_authenticate) + { + h = ngx_list_push(&r->headers_out.headers); + + if (h == NULL) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return NGX_OK; + } + + *h = *u->headers_in.www_authenticate; + + r->headers_out.www_authenticate = h; + } + +#if (NGX_HTTP_CACHE) + + if (r->cache) { + time_t valid; + + valid = ngx_http_file_cache_valid(u->conf->cache_valid, status); + + if (valid) { + r->cache->valid_sec = ngx_time() + valid; + r->cache->error = status; + } + + ngx_http_file_cache_free(r->cache, u->pipe->temp_file); + } +#endif + ngx_http_upstream_finalize_request(r, u, status); + + return NGX_OK; + } + } + + return NGX_DECLINED; +} + + +static ngx_int_t +ngx_http_upstream_test_connect(ngx_connection_t *c) +{ + int err; + socklen_t len; + +#if (NGX_HAVE_KQUEUE) + + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { + if (c->write->pending_eof || c->read->pending_eof) { + if (c->write->pending_eof) { + err = c->write->kq_errno; + + } else { + err = c->read->kq_errno; + } + + c->log->action = "connecting to upstream"; + (void) ngx_connection_error(c, err, + "kevent() reported that connect() failed"); + return NGX_ERROR; + } + + } else +#endif + { + err = 0; + len = sizeof(int); + + /* + * BSDs and Linux return 0 and set a pending error in err + * Solaris returns -1 and sets errno + */ + + if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len) + == -1) + { + err = ngx_errno; + } + + if (err) { + c->log->action = "connecting to upstream"; + (void) ngx_connection_error(c, err, "connect() failed"); + return NGX_ERROR; + } + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_process_headers(ngx_http_request_t *r, ngx_http_upstream_t *u) +{ + ngx_str_t *uri, args; + ngx_uint_t i, flags; + ngx_list_part_t *part; + ngx_table_elt_t *h; + ngx_http_upstream_header_t *hh; + ngx_http_upstream_main_conf_t *umcf; + + umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); + + if (u->headers_in.x_accel_redirect + && !(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT)) + { + ngx_http_upstream_finalize_request(r, u, NGX_DECLINED); + + part = &u->headers_in.headers.part; + h = part->elts; + + for (i = 0; /* void */; i++) { + + if (i >= part->nelts) { + if (part->next == NULL) { + break; + } + + part = part->next; + h = part->elts; + i = 0; + } + + hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash, + h[i].lowcase_key, h[i].key.len); + + if (hh && hh->redirect) { + if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) { + ngx_http_finalize_request(r, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return NGX_DONE; + } + } + } + + uri = &u->headers_in.x_accel_redirect->value; + ngx_str_null(&args); + flags = NGX_HTTP_LOG_UNSAFE; + + if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) { + ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND); + return NGX_DONE; + } + + if (r->method != NGX_HTTP_HEAD) { + r->method = NGX_HTTP_GET; + } + + ngx_http_internal_redirect(r, uri, &args); + ngx_http_finalize_request(r, NGX_DONE); + return NGX_DONE; + } + + part = &u->headers_in.headers.part; + h = part->elts; + + for (i = 0; /* void */; i++) { + + if (i >= part->nelts) { + if (part->next == NULL) { + break; + } + + part = part->next; + h = part->elts; + i = 0; + } + + if (ngx_hash_find(&u->conf->hide_headers_hash, h[i].hash, + h[i].lowcase_key, h[i].key.len)) + { + continue; + } + + hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash, + h[i].lowcase_key, h[i].key.len); + + if (hh) { + if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return NGX_DONE; + } + + continue; + } + + if (ngx_http_upstream_copy_header_line(r, &h[i], 0) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return NGX_DONE; + } + } + + if (r->headers_out.server && r->headers_out.server->value.data == NULL) { + r->headers_out.server->hash = 0; + } + + if (r->headers_out.date && r->headers_out.date->value.data == NULL) { + r->headers_out.date->hash = 0; + } + + r->headers_out.status = u->headers_in.status_n; + r->headers_out.status_line = u->headers_in.status_line; + + r->headers_out.content_length_n = u->headers_in.content_length_n; + + u->length = u->headers_in.content_length_n; + + return NGX_OK; +} + + +static void +ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r, + ngx_http_upstream_t *u) +{ + size_t size; + ssize_t n; + ngx_buf_t *b; + ngx_event_t *rev; + ngx_connection_t *c; + + c = u->peer.connection; + rev = c->read; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http upstream process body on memory"); + + if (rev->timedout) { + ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out"); + ngx_http_upstream_finalize_request(r, u, NGX_ETIMEDOUT); + return; + } + + b = &u->buffer; + + for ( ;; ) { + + size = b->end - b->last; + + if (size == 0) { + ngx_log_error(NGX_LOG_ALERT, c->log, 0, + "upstream buffer is too small to read response"); + ngx_http_upstream_finalize_request(r, u, NGX_ERROR); + return; + } + + n = c->recv(c, b->last, size); + + if (n == NGX_AGAIN) { + break; + } + + if (n == 0 || n == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, n); + return; + } + + u->state->response_length += n; + + if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, NGX_ERROR); + return; + } + + if (!rev->ready) { + break; + } + } + + if (u->length == 0) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + if (ngx_handle_read_event(rev, 0) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, NGX_ERROR); + return; + } + + if (rev->active) { + ngx_add_timer(rev, u->conf->read_timeout); + + } else if (rev->timer_set) { + ngx_del_timer(rev); + } +} + + +static void +ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u) +{ + int tcp_nodelay; + ssize_t n; + ngx_int_t rc; + ngx_event_pipe_t *p; + ngx_connection_t *c; + ngx_http_core_loc_conf_t *clcf; + + rc = ngx_http_send_header(r); + + if (rc == NGX_ERROR || rc > NGX_OK || r->post_action) { + ngx_http_upstream_finalize_request(r, u, rc); + return; + } + + if (u->upgrade) { + ngx_http_upstream_upgrade(r, u); + return; + } + + c = r->connection; + + if (r->header_only) { + + if (u->cacheable || u->store) { + + if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) { + ngx_connection_error(c, ngx_socket_errno, + ngx_shutdown_socket_n " failed"); + } + + r->read_event_handler = ngx_http_request_empty_handler; + r->write_event_handler = ngx_http_request_empty_handler; + c->error = 1; + + } else { + ngx_http_upstream_finalize_request(r, u, rc); + return; + } + } + + u->header_sent = 1; + + if (r->request_body && r->request_body->temp_file) { + ngx_pool_run_cleanup_file(r->pool, r->request_body->temp_file->file.fd); + r->request_body->temp_file->file.fd = NGX_INVALID_FILE; + } + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (!u->buffering) { + + if (u->input_filter == NULL) { + u->input_filter_init = ngx_http_upstream_non_buffered_filter_init; + u->input_filter = ngx_http_upstream_non_buffered_filter; + u->input_filter_ctx = r; + } + + u->read_event_handler = ngx_http_upstream_process_non_buffered_upstream; + r->write_event_handler = + ngx_http_upstream_process_non_buffered_downstream; + + r->limit_rate = 0; + + if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay"); + + tcp_nodelay = 1; + + if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, + (const void *) &tcp_nodelay, sizeof(int)) == -1) + { + ngx_connection_error(c, ngx_socket_errno, + "setsockopt(TCP_NODELAY) failed"); + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + c->tcp_nodelay = NGX_TCP_NODELAY_SET; + } + + n = u->buffer.last - u->buffer.pos; + + if (n) { + u->buffer.last = u->buffer.pos; + + u->state->response_length += n; + + if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + ngx_http_upstream_process_non_buffered_downstream(r); + + } else { + u->buffer.pos = u->buffer.start; + u->buffer.last = u->buffer.start; + + if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + if (u->peer.connection->read->ready || u->length == 0) { + ngx_http_upstream_process_non_buffered_upstream(r, u); + } + } + + return; + } + + /* TODO: preallocate event_pipe bufs, look "Content-Length" */ + +#if (NGX_HTTP_CACHE) + + if (r->cache && r->cache->file.fd != NGX_INVALID_FILE) { + ngx_pool_run_cleanup_file(r->pool, r->cache->file.fd); + r->cache->file.fd = NGX_INVALID_FILE; + } + + switch (ngx_http_test_predicates(r, u->conf->no_cache)) { + + case NGX_ERROR: + ngx_http_upstream_finalize_request(r, u, 0); + return; + + case NGX_DECLINED: + u->cacheable = 0; + break; + + default: /* NGX_OK */ + + if (u->cache_status == NGX_HTTP_CACHE_BYPASS) { + + r->cache->min_uses = u->conf->cache_min_uses; + r->cache->body_start = u->conf->buffer_size; + r->cache->file_cache = u->conf->cache->data; + + if (ngx_http_file_cache_create(r) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + } + + break; + } + + if (u->cacheable) { + time_t now, valid; + + now = ngx_time(); + + valid = r->cache->valid_sec; + + if (valid == 0) { + valid = ngx_http_file_cache_valid(u->conf->cache_valid, + u->headers_in.status_n); + if (valid) { + r->cache->valid_sec = now + valid; + } + } + + if (valid) { + r->cache->last_modified = r->headers_out.last_modified_time; + r->cache->date = now; + r->cache->body_start = (u_short) (u->buffer.pos - u->buffer.start); + + ngx_http_file_cache_set_header(r, u->buffer.start); + + } else { + u->cacheable = 0; + r->headers_out.last_modified_time = -1; + } + } + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http cacheable: %d", u->cacheable); + + if (u->cacheable == 0 && r->cache) { + ngx_http_file_cache_free(r->cache, u->pipe->temp_file); + } + +#endif + + p = u->pipe; + + p->output_filter = (ngx_event_pipe_output_filter_pt) ngx_http_output_filter; + p->output_ctx = r; + p->tag = u->output.tag; + p->bufs = u->conf->bufs; + p->busy_size = u->conf->busy_buffers_size; + p->upstream = u->peer.connection; + p->downstream = c; + p->pool = r->pool; + p->log = c->log; + + p->cacheable = u->cacheable || u->store; + + p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)); + if (p->temp_file == NULL) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + p->temp_file->file.fd = NGX_INVALID_FILE; + p->temp_file->file.log = c->log; + p->temp_file->path = u->conf->temp_path; + p->temp_file->pool = r->pool; + + if (p->cacheable) { + p->temp_file->persistent = 1; + + } else { + p->temp_file->log_level = NGX_LOG_WARN; + p->temp_file->warn = "an upstream response is buffered " + "to a temporary file"; + } + + p->max_temp_file_size = u->conf->max_temp_file_size; + p->temp_file_write_size = u->conf->temp_file_write_size; + + p->preread_bufs = ngx_alloc_chain_link(r->pool); + if (p->preread_bufs == NULL) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + p->preread_bufs->buf = &u->buffer; + p->preread_bufs->next = NULL; + u->buffer.recycled = 1; + + p->preread_size = u->buffer.last - u->buffer.pos; + + if (u->cacheable) { + + p->buf_to_file = ngx_calloc_buf(r->pool); + if (p->buf_to_file == NULL) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + p->buf_to_file->start = u->buffer.start; + p->buf_to_file->pos = u->buffer.start; + p->buf_to_file->last = u->buffer.pos; + p->buf_to_file->temporary = 1; + } + + if (ngx_event_flags & NGX_USE_AIO_EVENT) { + /* the posted aio operation may corrupt a shadow buffer */ + p->single_buf = 1; + } + + /* TODO: p->free_bufs = 0 if use ngx_create_chain_of_bufs() */ + p->free_bufs = 1; + + /* + * event_pipe would do u->buffer.last += p->preread_size + * as though these bytes were read + */ + u->buffer.last = u->buffer.pos; + + if (u->conf->cyclic_temp_file) { + + /* + * we need to disable the use of sendfile() if we use cyclic temp file + * because the writing a new data may interfere with sendfile() + * that uses the same kernel file pages (at least on FreeBSD) + */ + + p->cyclic_temp_file = 1; + c->sendfile = 0; + + } else { + p->cyclic_temp_file = 0; + } + + p->read_timeout = u->conf->read_timeout; + p->send_timeout = clcf->send_timeout; + p->send_lowat = clcf->send_lowat; + + p->length = -1; + + if (u->input_filter_init + && u->input_filter_init(p->input_ctx) != NGX_OK) + { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + u->read_event_handler = ngx_http_upstream_process_upstream; + r->write_event_handler = ngx_http_upstream_process_downstream; + + ngx_http_upstream_process_upstream(r, u); +} + + +static void +ngx_http_upstream_upgrade(ngx_http_request_t *r, ngx_http_upstream_t *u) +{ + int tcp_nodelay; + ngx_connection_t *c; + ngx_http_core_loc_conf_t *clcf; + + c = r->connection; + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + /* TODO: prevent upgrade if not requested or not possible */ + + r->keepalive = 0; + c->log->action = "proxying upgraded connection"; + + u->read_event_handler = ngx_http_upstream_upgraded_read_upstream; + u->write_event_handler = ngx_http_upstream_upgraded_write_upstream; + r->read_event_handler = ngx_http_upstream_upgraded_read_downstream; + r->write_event_handler = ngx_http_upstream_upgraded_write_downstream; + + if (clcf->tcp_nodelay) { + tcp_nodelay = 1; + + if (c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay"); + + if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, + (const void *) &tcp_nodelay, sizeof(int)) == -1) + { + ngx_connection_error(c, ngx_socket_errno, + "setsockopt(TCP_NODELAY) failed"); + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + c->tcp_nodelay = NGX_TCP_NODELAY_SET; + } + + if (u->peer.connection->tcp_nodelay == NGX_TCP_NODELAY_UNSET) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, u->peer.connection->log, 0, + "tcp_nodelay"); + + if (setsockopt(u->peer.connection->fd, IPPROTO_TCP, TCP_NODELAY, + (const void *) &tcp_nodelay, sizeof(int)) == -1) + { + ngx_connection_error(u->peer.connection, ngx_socket_errno, + "setsockopt(TCP_NODELAY) failed"); + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + u->peer.connection->tcp_nodelay = NGX_TCP_NODELAY_SET; + } + } + + if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + if (u->peer.connection->read->ready + || u->buffer.pos != u->buffer.last) + { + ngx_http_upstream_process_upgraded(r, 1, 1); + } + + if (c->read->ready + || r->header_in->pos != r->header_in->last) + { + ngx_http_upstream_process_upgraded(r, 0, 1); + } +} + + +static void +ngx_http_upstream_upgraded_read_downstream(ngx_http_request_t *r) +{ + ngx_http_upstream_process_upgraded(r, 0, 0); +} + + +static void +ngx_http_upstream_upgraded_write_downstream(ngx_http_request_t *r) +{ + ngx_http_upstream_process_upgraded(r, 1, 1); +} + + +static void +ngx_http_upstream_upgraded_read_upstream(ngx_http_request_t *r, + ngx_http_upstream_t *u) +{ + ngx_http_upstream_process_upgraded(r, 1, 0); +} + + +static void +ngx_http_upstream_upgraded_write_upstream(ngx_http_request_t *r, + ngx_http_upstream_t *u) +{ + ngx_http_upstream_process_upgraded(r, 0, 1); +} + + +static void +ngx_http_upstream_process_upgraded(ngx_http_request_t *r, + ngx_uint_t from_upstream, ngx_uint_t do_write) +{ + size_t size; + ssize_t n; + ngx_buf_t *b; + ngx_connection_t *c, *downstream, *upstream, *dst, *src; + ngx_http_upstream_t *u; + ngx_http_core_loc_conf_t *clcf; + + c = r->connection; + u = r->upstream; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http upstream process upgraded, fu:%ui", from_upstream); + + downstream = c; + upstream = u->peer.connection; + + if (downstream->write->timedout) { + c->timedout = 1; + ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out"); + ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT); + return; + } + + if (upstream->read->timedout || upstream->write->timedout) { + ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out"); + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + if (from_upstream) { + src = upstream; + dst = downstream; + b = &u->buffer; + + } else { + src = downstream; + dst = upstream; + b = &u->from_client; + + if (r->header_in->last > r->header_in->pos) { + b = r->header_in; + b->end = b->last; + do_write = 1; + } + + if (b->start == NULL) { + b->start = ngx_palloc(r->pool, u->conf->buffer_size); + if (b->start == NULL) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + b->pos = b->start; + b->last = b->start; + b->end = b->start + u->conf->buffer_size; + b->temporary = 1; + b->tag = u->output.tag; + } + } + + for ( ;; ) { + + if (do_write) { + + size = b->last - b->pos; + + if (size && dst->write->ready) { + + n = dst->send(dst, b->pos, size); + + if (n == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + if (n > 0) { + b->pos += n; + + if (b->pos == b->last) { + b->pos = b->start; + b->last = b->start; + } + } + } + } + + size = b->end - b->last; + + if (size && src->read->ready) { + + n = src->recv(src, b->last, size); + + if (n == NGX_AGAIN || n == 0) { + break; + } + + if (n > 0) { + do_write = 1; + b->last += n; + + continue; + } + + if (n == NGX_ERROR) { + src->read->eof = 1; + } + } + + break; + } + + if ((upstream->read->eof && u->buffer.pos == u->buffer.last) + || (downstream->read->eof && u->from_client.pos == u->from_client.last) + || (downstream->read->eof && upstream->read->eof)) + { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http upstream upgraded done"); + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (ngx_handle_write_event(upstream->write, u->conf->send_lowat) + != NGX_OK) + { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + if (upstream->write->active && !upstream->write->ready) { + ngx_add_timer(upstream->write, u->conf->send_timeout); + + } else if (upstream->write->timer_set) { + ngx_del_timer(upstream->write); + } + + if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + if (upstream->read->active && !upstream->read->ready) { + ngx_add_timer(upstream->read, u->conf->read_timeout); + + } else if (upstream->read->timer_set) { + ngx_del_timer(upstream->read); + } + + if (ngx_handle_write_event(downstream->write, clcf->send_lowat) + != NGX_OK) + { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + if (ngx_handle_read_event(downstream->read, 0) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + if (downstream->write->active && !downstream->write->ready) { + ngx_add_timer(downstream->write, clcf->send_timeout); + + } else if (downstream->write->timer_set) { + ngx_del_timer(downstream->write); + } +} + + +static void +ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r) +{ + ngx_event_t *wev; + ngx_connection_t *c; + ngx_http_upstream_t *u; + + c = r->connection; + u = r->upstream; + wev = c->write; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http upstream process non buffered downstream"); + + c->log->action = "sending to client"; + + if (wev->timedout) { + c->timedout = 1; + ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out"); + ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT); + return; + } + + ngx_http_upstream_process_non_buffered_request(r, 1); +} + + +static void +ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r, + ngx_http_upstream_t *u) +{ + ngx_connection_t *c; + + c = u->peer.connection; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http upstream process non buffered upstream"); + + c->log->action = "reading upstream"; + + if (c->read->timedout) { + ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out"); + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + ngx_http_upstream_process_non_buffered_request(r, 0); +} + + +static void +ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r, + ngx_uint_t do_write) +{ + size_t size; + ssize_t n; + ngx_buf_t *b; + ngx_int_t rc; + ngx_connection_t *downstream, *upstream; + ngx_http_upstream_t *u; + ngx_http_core_loc_conf_t *clcf; + + u = r->upstream; + downstream = r->connection; + upstream = u->peer.connection; + + b = &u->buffer; + + do_write = do_write || u->length == 0; + + for ( ;; ) { + + if (do_write) { + + if (u->out_bufs || u->busy_bufs) { + rc = ngx_http_output_filter(r, u->out_bufs); + + if (rc == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs, + &u->out_bufs, u->output.tag); + } + + if (u->busy_bufs == NULL) { + + if (u->length == 0 + || upstream->read->eof + || upstream->read->error) + { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + b->pos = b->start; + b->last = b->start; + } + } + + size = b->end - b->last; + + if (size && upstream->read->ready) { + + n = upstream->recv(upstream, b->last, size); + + if (n == NGX_AGAIN) { + break; + } + + if (n > 0) { + u->state->response_length += n; + + if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + } + + do_write = 1; + + continue; + } + + break; + } + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (downstream->data == r) { + if (ngx_handle_write_event(downstream->write, clcf->send_lowat) + != NGX_OK) + { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + } + + if (downstream->write->active && !downstream->write->ready) { + ngx_add_timer(downstream->write, clcf->send_timeout); + + } else if (downstream->write->timer_set) { + ngx_del_timer(downstream->write); + } + + if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + if (upstream->read->active && !upstream->read->ready) { + ngx_add_timer(upstream->read, u->conf->read_timeout); + + } else if (upstream->read->timer_set) { + ngx_del_timer(upstream->read); + } +} + + +static ngx_int_t +ngx_http_upstream_non_buffered_filter_init(void *data) +{ + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_non_buffered_filter(void *data, ssize_t bytes) +{ + ngx_http_request_t *r = data; + + ngx_buf_t *b; + ngx_chain_t *cl, **ll; + ngx_http_upstream_t *u; + + u = r->upstream; + + for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) { + ll = &cl->next; + } + + cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs); + if (cl == NULL) { + return NGX_ERROR; + } + + *ll = cl; + + cl->buf->flush = 1; + cl->buf->memory = 1; + + b = &u->buffer; + + cl->buf->pos = b->last; + b->last += bytes; + cl->buf->last = b->last; + cl->buf->tag = u->output.tag; + + if (u->length == -1) { + return NGX_OK; + } + + u->length -= bytes; + + return NGX_OK; +} + + +static void +ngx_http_upstream_process_downstream(ngx_http_request_t *r) +{ + ngx_event_t *wev; + ngx_connection_t *c; + ngx_event_pipe_t *p; + ngx_http_upstream_t *u; + + c = r->connection; + u = r->upstream; + p = u->pipe; + wev = c->write; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http upstream process downstream"); + + c->log->action = "sending to client"; + + if (wev->timedout) { + + if (wev->delayed) { + + wev->timedout = 0; + wev->delayed = 0; + + if (!wev->ready) { + ngx_add_timer(wev, p->send_timeout); + + if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, 0); + } + + return; + } + + if (ngx_event_pipe(p, wev->write) == NGX_ABORT) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + + } else { + p->downstream_error = 1; + c->timedout = 1; + ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out"); + } + + } else { + + if (wev->delayed) { + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http downstream delayed"); + + if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) { + ngx_http_upstream_finalize_request(r, u, 0); + } + + return; + } + + if (ngx_event_pipe(p, 1) == NGX_ABORT) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + } + + ngx_http_upstream_process_request(r); +} + + +static void +ngx_http_upstream_process_upstream(ngx_http_request_t *r, + ngx_http_upstream_t *u) +{ + ngx_connection_t *c; + + c = u->peer.connection; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http upstream process upstream"); + + c->log->action = "reading upstream"; + + if (c->read->timedout) { + u->pipe->upstream_error = 1; + ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out"); + + } else { + if (ngx_event_pipe(u->pipe, 0) == NGX_ABORT) { + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + } + + ngx_http_upstream_process_request(r); +} + + +static void +ngx_http_upstream_process_request(ngx_http_request_t *r) +{ + ngx_temp_file_t *tf; + ngx_event_pipe_t *p; + ngx_http_upstream_t *u; + + u = r->upstream; + p = u->pipe; + + if (u->peer.connection) { + + if (u->store) { + + if (p->upstream_eof || p->upstream_done) { + + tf = u->pipe->temp_file; + + if (u->headers_in.status_n == NGX_HTTP_OK + && (u->headers_in.content_length_n == -1 + || (u->headers_in.content_length_n == tf->offset))) + { + ngx_http_upstream_store(r, u); + u->store = 0; + } + } + } + +#if (NGX_HTTP_CACHE) + + if (u->cacheable) { + + if (p->upstream_done) { + ngx_http_file_cache_update(r, u->pipe->temp_file); + + } else if (p->upstream_eof) { + + tf = u->pipe->temp_file; + + if (u->headers_in.content_length_n == -1 + || u->headers_in.content_length_n + == tf->offset - (off_t) r->cache->body_start) + { + ngx_http_file_cache_update(r, tf); + + } else { + ngx_http_file_cache_free(r->cache, tf); + } + + } else if (p->upstream_error) { + ngx_http_file_cache_free(r->cache, u->pipe->temp_file); + } + } + +#endif + + if (p->upstream_done || p->upstream_eof || p->upstream_error) { + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http upstream exit: %p", p->out); +#if 0 + ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock); +#endif + ngx_http_upstream_finalize_request(r, u, 0); + return; + } + } + + if (p->downstream_error) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http upstream downstream error"); + + if (!u->cacheable && !u->store && u->peer.connection) { + ngx_http_upstream_finalize_request(r, u, 0); + } + } +} + + +static void +ngx_http_upstream_store(ngx_http_request_t *r, ngx_http_upstream_t *u) +{ + size_t root; + time_t lm; + ngx_str_t path; + ngx_temp_file_t *tf; + ngx_ext_rename_file_t ext; + + tf = u->pipe->temp_file; + + if (tf->file.fd == NGX_INVALID_FILE) { + + /* create file for empty 200 response */ + + tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)); + if (tf == NULL) { + return; + } + + tf->file.fd = NGX_INVALID_FILE; + tf->file.log = r->connection->log; + tf->path = u->conf->temp_path; + tf->pool = r->pool; + tf->persistent = 1; + + if (ngx_create_temp_file(&tf->file, tf->path, tf->pool, + tf->persistent, tf->clean, tf->access) + != NGX_OK) + { + return; + } + + u->pipe->temp_file = tf; + } + + ext.access = u->conf->store_access; + ext.path_access = u->conf->store_access; + ext.time = -1; + ext.create_path = 1; + ext.delete_file = 1; + ext.log = r->connection->log; + + if (u->headers_in.last_modified) { + + lm = ngx_http_parse_time(u->headers_in.last_modified->value.data, + u->headers_in.last_modified->value.len); + + if (lm != NGX_ERROR) { + ext.time = lm; + ext.fd = tf->file.fd; + } + } + + if (u->conf->store_lengths == NULL) { + + ngx_http_map_uri_to_path(r, &path, &root, 0); + + } else { + if (ngx_http_script_run(r, &path, u->conf->store_lengths->elts, 0, + u->conf->store_values->elts) + == NULL) + { + return; + } + } + + path.len--; + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "upstream stores \"%s\" to \"%s\"", + tf->file.name.data, path.data); + + (void) ngx_ext_rename_file(&tf->file.name, &path, &ext); +} + + +static void +ngx_http_upstream_dummy_handler(ngx_http_request_t *r, ngx_http_upstream_t *u) +{ + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http upstream dummy handler"); +} + + +static void +ngx_http_upstream_next(ngx_http_request_t *r, ngx_http_upstream_t *u, + ngx_uint_t ft_type) +{ + ngx_uint_t status, state; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http next upstream, %xi", ft_type); + +#if 0 + ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock); +#endif + + if (u->peer.sockaddr) { + + if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404) { + state = NGX_PEER_NEXT; + } else { + state = NGX_PEER_FAILED; + } + + u->peer.free(&u->peer, u->peer.data, state); + u->peer.sockaddr = NULL; + } + + if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT, + "upstream timed out"); + } + + if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) { + status = 0; + + /* TODO: inform balancer instead */ + + u->peer.tries++; + + } else { + switch(ft_type) { + + case NGX_HTTP_UPSTREAM_FT_TIMEOUT: + status = NGX_HTTP_GATEWAY_TIME_OUT; + break; + + case NGX_HTTP_UPSTREAM_FT_HTTP_500: + status = NGX_HTTP_INTERNAL_SERVER_ERROR; + break; + + case NGX_HTTP_UPSTREAM_FT_HTTP_404: + status = NGX_HTTP_NOT_FOUND; + break; + + /* + * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING + * never reach here + */ + + default: + status = NGX_HTTP_BAD_GATEWAY; + } + } + + if (r->connection->error) { + ngx_http_upstream_finalize_request(r, u, + NGX_HTTP_CLIENT_CLOSED_REQUEST); + return; + } + + if (status) { + u->state->status = status; + + if (u->peer.tries == 0 || !(u->conf->next_upstream & ft_type)) { + +#if (NGX_HTTP_CACHE) + + if (u->cache_status == NGX_HTTP_CACHE_EXPIRED + && (u->conf->cache_use_stale & ft_type)) + { + ngx_int_t rc; + + rc = u->reinit_request(r); + + if (rc == NGX_OK) { + u->cache_status = NGX_HTTP_CACHE_STALE; + rc = ngx_http_upstream_cache_send(r, u); + } + + ngx_http_upstream_finalize_request(r, u, rc); + return; + } +#endif + + ngx_http_upstream_finalize_request(r, u, status); + return; + } + } + + if (u->peer.connection) { + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "close http upstream connection: %d", + u->peer.connection->fd); +#if (NGX_HTTP_SSL) + + if (u->peer.connection->ssl) { + u->peer.connection->ssl->no_wait_shutdown = 1; + u->peer.connection->ssl->no_send_shutdown = 1; + + (void) ngx_ssl_shutdown(u->peer.connection); + } +#endif + + if (u->peer.connection->pool) { + ngx_destroy_pool(u->peer.connection->pool); + } + + ngx_close_connection(u->peer.connection); + u->peer.connection = NULL; + } + +#if 0 + if (u->conf->busy_lock && !u->busy_locked) { + ngx_http_upstream_busy_lock(p); + return; + } +#endif + + ngx_http_upstream_connect(r, u); +} + + +static void +ngx_http_upstream_cleanup(void *data) +{ + ngx_http_request_t *r = data; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "cleanup http upstream request: \"%V\"", &r->uri); + + ngx_http_upstream_finalize_request(r, r->upstream, NGX_DONE); +} + + +static void +ngx_http_upstream_finalize_request(ngx_http_request_t *r, + ngx_http_upstream_t *u, ngx_int_t rc) +{ + ngx_time_t *tp; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "finalize http upstream request: %i", rc); + + if (u->cleanup) { + *u->cleanup = NULL; + u->cleanup = NULL; + } + + if (u->resolved && u->resolved->ctx) { + ngx_resolve_name_done(u->resolved->ctx); + u->resolved->ctx = NULL; + } + + if (u->state && u->state->response_sec) { + tp = ngx_timeofday(); + u->state->response_sec = tp->sec - u->state->response_sec; + u->state->response_msec = tp->msec - u->state->response_msec; + + if (u->pipe && u->pipe->read_length) { + u->state->response_length = u->pipe->read_length; + } + } + + u->finalize_request(r, rc); + + if (u->peer.free && u->peer.sockaddr) { + u->peer.free(&u->peer, u->peer.data, 0); + u->peer.sockaddr = NULL; + } + + if (u->peer.connection) { + +#if (NGX_HTTP_SSL) + + /* TODO: do not shutdown persistent connection */ + + if (u->peer.connection->ssl) { + + /* + * We send the "close notify" shutdown alert to the upstream only + * and do not wait its "close notify" shutdown alert. + * It is acceptable according to the TLS standard. + */ + + u->peer.connection->ssl->no_wait_shutdown = 1; + + (void) ngx_ssl_shutdown(u->peer.connection); + } +#endif + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "close http upstream connection: %d", + u->peer.connection->fd); + + if (u->peer.connection->pool) { + ngx_destroy_pool(u->peer.connection->pool); + } + + ngx_close_connection(u->peer.connection); + } + + u->peer.connection = NULL; + + if (u->pipe && u->pipe->temp_file) { + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http upstream temp fd: %d", + u->pipe->temp_file->file.fd); + } + + if (u->store && u->pipe && u->pipe->temp_file + && u->pipe->temp_file->file.fd != NGX_INVALID_FILE) + { + if (ngx_delete_file(u->pipe->temp_file->file.name.data) + == NGX_FILE_ERROR) + { + ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, + ngx_delete_file_n " \"%s\" failed", + u->pipe->temp_file->file.name.data); + } + } + +#if (NGX_HTTP_CACHE) + + if (r->cache) { + + if (u->cacheable) { + + if (rc == NGX_HTTP_BAD_GATEWAY || rc == NGX_HTTP_GATEWAY_TIME_OUT) { + time_t valid; + + valid = ngx_http_file_cache_valid(u->conf->cache_valid, rc); + + if (valid) { + r->cache->valid_sec = ngx_time() + valid; + r->cache->error = rc; + } + } + } + + ngx_http_file_cache_free(r->cache, u->pipe->temp_file); + } + +#endif + + if (u->header_sent + && rc != NGX_HTTP_REQUEST_TIME_OUT + && (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE)) + { + rc = 0; + } + + if (rc == NGX_DECLINED) { + return; + } + + r->connection->log->action = "sending to client"; + + if (rc == 0 + && !r->header_only +#if (NGX_HTTP_CACHE) + && !r->cached +#endif + ) + { + rc = ngx_http_send_special(r, NGX_HTTP_LAST); + } + + ngx_http_finalize_request(r, rc); +} + + +static ngx_int_t +ngx_http_upstream_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + ngx_table_elt_t **ph; + + ph = (ngx_table_elt_t **) ((char *) &r->upstream->headers_in + offset); + + if (*ph == NULL) { + *ph = h; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_ignore_header_line(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_process_content_length(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset) +{ + ngx_http_upstream_t *u; + + u = r->upstream; + + u->headers_in.content_length = h; + u->headers_in.content_length_n = ngx_atoof(h->value.data, h->value.len); + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_process_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ +#if (NGX_HTTP_CACHE) + ngx_http_upstream_t *u; + + u = r->upstream; + + if (!(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_SET_COOKIE)) { + u->cacheable = 0; + } +#endif + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_process_cache_control(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset) +{ + ngx_array_t *pa; + ngx_table_elt_t **ph; + ngx_http_upstream_t *u; + + u = r->upstream; + pa = &u->headers_in.cache_control; + + if (pa->elts == NULL) { + if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK) + { + return NGX_ERROR; + } + } + + ph = ngx_array_push(pa); + if (ph == NULL) { + return NGX_ERROR; + } + + *ph = h; + +#if (NGX_HTTP_CACHE) + { + u_char *p, *last; + ngx_int_t n; + + if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL) { + return NGX_OK; + } + + if (r->cache == NULL) { + return NGX_OK; + } + + if (r->cache->valid_sec != 0) { + return NGX_OK; + } + + p = h->value.data; + last = p + h->value.len; + + if (ngx_strlcasestrn(p, last, (u_char *) "no-cache", 8 - 1) != NULL + || ngx_strlcasestrn(p, last, (u_char *) "no-store", 8 - 1) != NULL + || ngx_strlcasestrn(p, last, (u_char *) "private", 7 - 1) != NULL) + { + u->cacheable = 0; + return NGX_OK; + } + + p = ngx_strlcasestrn(p, last, (u_char *) "max-age=", 8 - 1); + + if (p == NULL) { + return NGX_OK; + } + + n = 0; + + for (p += 8; p < last; p++) { + if (*p == ',' || *p == ';' || *p == ' ') { + break; + } + + if (*p >= '0' && *p <= '9') { + n = n * 10 + *p - '0'; + continue; + } + + u->cacheable = 0; + return NGX_OK; + } + + if (n == 0) { + u->cacheable = 0; + return NGX_OK; + } + + r->cache->valid_sec = ngx_time() + n; + } +#endif + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_process_expires(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + ngx_http_upstream_t *u; + + u = r->upstream; + u->headers_in.expires = h; + +#if (NGX_HTTP_CACHE) + { + time_t expires; + + if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_EXPIRES) { + return NGX_OK; + } + + if (r->cache == NULL) { + return NGX_OK; + } + + if (r->cache->valid_sec != 0) { + return NGX_OK; + } + + expires = ngx_http_parse_time(h->value.data, h->value.len); + + if (expires == NGX_ERROR || expires < ngx_time()) { + u->cacheable = 0; + return NGX_OK; + } + + r->cache->valid_sec = expires; + } +#endif + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_process_accel_expires(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset) +{ + ngx_http_upstream_t *u; + + u = r->upstream; + u->headers_in.x_accel_expires = h; + +#if (NGX_HTTP_CACHE) + { + u_char *p; + size_t len; + ngx_int_t n; + + if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES) { + return NGX_OK; + } + + if (r->cache == NULL) { + return NGX_OK; + } + + len = h->value.len; + p = h->value.data; + + if (p[0] != '@') { + n = ngx_atoi(p, len); + + switch (n) { + case 0: + u->cacheable = 0; + /* fall through */ + + case NGX_ERROR: + return NGX_OK; + + default: + r->cache->valid_sec = ngx_time() + n; + return NGX_OK; + } + } + + p++; + len--; + + n = ngx_atoi(p, len); + + if (n != NGX_ERROR) { + r->cache->valid_sec = n; + } + } +#endif + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_process_limit_rate(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + ngx_int_t n; + ngx_http_upstream_t *u; + + u = r->upstream; + u->headers_in.x_accel_limit_rate = h; + + if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE) { + return NGX_OK; + } + + n = ngx_atoi(h->value.data, h->value.len); + + if (n != NGX_ERROR) { + r->limit_rate = (size_t) n; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_process_buffering(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + u_char c0, c1, c2; + ngx_http_upstream_t *u; + + u = r->upstream; + + if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING) { + return NGX_OK; + } + + if (u->conf->change_buffering) { + + if (h->value.len == 2) { + c0 = ngx_tolower(h->value.data[0]); + c1 = ngx_tolower(h->value.data[1]); + + if (c0 == 'n' && c1 == 'o') { + u->buffering = 0; + } + + } else if (h->value.len == 3) { + c0 = ngx_tolower(h->value.data[0]); + c1 = ngx_tolower(h->value.data[1]); + c2 = ngx_tolower(h->value.data[2]); + + if (c0 == 'y' && c1 == 'e' && c2 == 's') { + u->buffering = 1; + } + } + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_process_charset(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + if (r->upstream->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_CHARSET) { + return NGX_OK; + } + + r->headers_out.override_charset = &h->value; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + r->upstream->headers_in.connection = h; + + if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len, + (u_char *) "close", 5 - 1) + != NULL) + { + r->upstream->headers_in.connection_close = 1; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset) +{ + r->upstream->headers_in.transfer_encoding = h; + + if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len, + (u_char *) "chunked", 7 - 1) + != NULL) + { + r->upstream->headers_in.chunked = 1; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_copy_header_line(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + ngx_table_elt_t *ho, **ph; + + ho = ngx_list_push(&r->headers_out.headers); + if (ho == NULL) { + return NGX_ERROR; + } + + *ho = *h; + + if (offset) { + ph = (ngx_table_elt_t **) ((char *) &r->headers_out + offset); + *ph = ho; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset) +{ + ngx_array_t *pa; + ngx_table_elt_t *ho, **ph; + + pa = (ngx_array_t *) ((char *) &r->headers_out + offset); + + if (pa->elts == NULL) { + if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK) + { + return NGX_ERROR; + } + } + + ph = ngx_array_push(pa); + if (ph == NULL) { + return NGX_ERROR; + } + + ho = ngx_list_push(&r->headers_out.headers); + if (ho == NULL) { + return NGX_ERROR; + } + + *ho = *h; + *ph = ho; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_copy_content_type(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + u_char *p, *last; + + r->headers_out.content_type_len = h->value.len; + r->headers_out.content_type = h->value; + r->headers_out.content_type_lowcase = NULL; + + for (p = h->value.data; *p; p++) { + + if (*p != ';') { + continue; + } + + last = p; + + while (*++p == ' ') { /* void */ } + + if (*p == '\0') { + return NGX_OK; + } + + if (ngx_strncasecmp(p, (u_char *) "charset=", 8) != 0) { + continue; + } + + p += 8; + + r->headers_out.content_type_len = last - h->value.data; + + if (*p == '"') { + p++; + } + + last = h->value.data + h->value.len; + + if (*(last - 1) == '"') { + last--; + } + + r->headers_out.charset.len = last - p; + r->headers_out.charset.data = p; + + return NGX_OK; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_copy_last_modified(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + ngx_table_elt_t *ho; + + ho = ngx_list_push(&r->headers_out.headers); + if (ho == NULL) { + return NGX_ERROR; + } + + *ho = *h; + + r->headers_out.last_modified = ho; + +#if (NGX_HTTP_CACHE) + + if (r->upstream->cacheable) { + r->headers_out.last_modified_time = ngx_http_parse_time(h->value.data, + h->value.len); + } + +#endif + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_rewrite_location(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + ngx_int_t rc; + ngx_table_elt_t *ho; + + ho = ngx_list_push(&r->headers_out.headers); + if (ho == NULL) { + return NGX_ERROR; + } + + *ho = *h; + + if (r->upstream->rewrite_redirect) { + rc = r->upstream->rewrite_redirect(r, ho, 0); + + if (rc == NGX_DECLINED) { + return NGX_OK; + } + + if (rc == NGX_OK) { + r->headers_out.location = ho; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "rewritten location: \"%V\"", &ho->value); + } + + return rc; + } + + if (ho->value.data[0] != '/') { + r->headers_out.location = ho; + } + + /* + * we do not set r->headers_out.location here to avoid the handling + * the local redirects without a host name by ngx_http_header_filter() + */ + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + u_char *p; + ngx_int_t rc; + ngx_table_elt_t *ho; + + ho = ngx_list_push(&r->headers_out.headers); + if (ho == NULL) { + return NGX_ERROR; + } + + *ho = *h; + + if (r->upstream->rewrite_redirect) { + + p = ngx_strcasestrn(ho->value.data, "url=", 4 - 1); + + if (p) { + rc = r->upstream->rewrite_redirect(r, ho, p + 4 - ho->value.data); + + } else { + return NGX_OK; + } + + if (rc == NGX_DECLINED) { + return NGX_OK; + } + + if (rc == NGX_OK) { + r->headers_out.refresh = ho; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "rewritten refresh: \"%V\"", &ho->value); + } + + return rc; + } + + r->headers_out.refresh = ho; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h, + ngx_uint_t offset) +{ + ngx_int_t rc; + ngx_table_elt_t *ho; + + ho = ngx_list_push(&r->headers_out.headers); + if (ho == NULL) { + return NGX_ERROR; + } + + *ho = *h; + + if (r->upstream->rewrite_cookie) { + rc = r->upstream->rewrite_cookie(r, ho); + + if (rc == NGX_DECLINED) { + return NGX_OK; + } + +#if (NGX_DEBUG) + if (rc == NGX_OK) { + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "rewritten cookie: \"%V\"", &ho->value); + } +#endif + + return rc; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset) +{ + ngx_table_elt_t *ho; + +#if (NGX_HTTP_CACHE) + + if (r->cached) { + r->allow_ranges = 1; + return NGX_OK; + + } + +#endif + + ho = ngx_list_push(&r->headers_out.headers); + if (ho == NULL) { + return NGX_ERROR; + } + + *ho = *h; + + r->headers_out.accept_ranges = ho; + + return NGX_OK; +} + + +#if (NGX_HTTP_GZIP) + +static ngx_int_t +ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r, + ngx_table_elt_t *h, ngx_uint_t offset) +{ + ngx_table_elt_t *ho; + + ho = ngx_list_push(&r->headers_out.headers); + if (ho == NULL) { + return NGX_ERROR; + } + + *ho = *h; + + r->headers_out.content_encoding = ho; + + return NGX_OK; +} + +#endif + + +static ngx_int_t +ngx_http_upstream_add_variables(ngx_conf_t *cf) +{ + ngx_http_variable_t *var, *v; + + for (v = ngx_http_upstream_vars; v->name.len; v++) { + var = ngx_http_add_variable(cf, &v->name, v->flags); + if (var == NULL) { + return NGX_ERROR; + } + + var->get_handler = v->get_handler; + var->data = v->data; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_addr_variable(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + size_t len; + ngx_uint_t i; + ngx_http_upstream_state_t *state; + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + if (r->upstream_states == NULL || r->upstream_states->nelts == 0) { + v->not_found = 1; + return NGX_OK; + } + + len = 0; + state = r->upstream_states->elts; + + for (i = 0; i < r->upstream_states->nelts; i++) { + if (state[i].peer) { + len += state[i].peer->len + 2; + + } else { + len += 3; + } + } + + p = ngx_pnalloc(r->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + + v->data = p; + + i = 0; + + for ( ;; ) { + if (state[i].peer) { + p = ngx_cpymem(p, state[i].peer->data, state[i].peer->len); + } + + if (++i == r->upstream_states->nelts) { + break; + } + + if (state[i].peer) { + *p++ = ','; + *p++ = ' '; + + } else { + *p++ = ' '; + *p++ = ':'; + *p++ = ' '; + + if (++i == r->upstream_states->nelts) { + break; + } + + continue; + } + } + + v->len = p - v->data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_status_variable(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + size_t len; + ngx_uint_t i; + ngx_http_upstream_state_t *state; + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + if (r->upstream_states == NULL || r->upstream_states->nelts == 0) { + v->not_found = 1; + return NGX_OK; + } + + len = r->upstream_states->nelts * (3 + 2); + + p = ngx_pnalloc(r->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + + v->data = p; + + i = 0; + state = r->upstream_states->elts; + + for ( ;; ) { + if (state[i].status) { + p = ngx_sprintf(p, "%ui", state[i].status); + + } else { + *p++ = '-'; + } + + if (++i == r->upstream_states->nelts) { + break; + } + + if (state[i].peer) { + *p++ = ','; + *p++ = ' '; + + } else { + *p++ = ' '; + *p++ = ':'; + *p++ = ' '; + + if (++i == r->upstream_states->nelts) { + break; + } + + continue; + } + } + + v->len = p - v->data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_response_time_variable(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + size_t len; + ngx_uint_t i; + ngx_msec_int_t ms; + ngx_http_upstream_state_t *state; + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + if (r->upstream_states == NULL || r->upstream_states->nelts == 0) { + v->not_found = 1; + return NGX_OK; + } + + len = r->upstream_states->nelts * (NGX_TIME_T_LEN + 4 + 2); + + p = ngx_pnalloc(r->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + + v->data = p; + + i = 0; + state = r->upstream_states->elts; + + for ( ;; ) { + if (state[i].status) { + ms = (ngx_msec_int_t) + (state[i].response_sec * 1000 + state[i].response_msec); + ms = ngx_max(ms, 0); + p = ngx_sprintf(p, "%d.%03d", ms / 1000, ms % 1000); + + } else { + *p++ = '-'; + } + + if (++i == r->upstream_states->nelts) { + break; + } + + if (state[i].peer) { + *p++ = ','; + *p++ = ' '; + + } else { + *p++ = ' '; + *p++ = ':'; + *p++ = ' '; + + if (++i == r->upstream_states->nelts) { + break; + } + + continue; + } + } + + v->len = p - v->data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_upstream_response_length_variable(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + size_t len; + ngx_uint_t i; + ngx_http_upstream_state_t *state; + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + if (r->upstream_states == NULL || r->upstream_states->nelts == 0) { + v->not_found = 1; + return NGX_OK; + } + + len = r->upstream_states->nelts * (NGX_OFF_T_LEN + 2); + + p = ngx_pnalloc(r->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + + v->data = p; + + i = 0; + state = r->upstream_states->elts; + + for ( ;; ) { + p = ngx_sprintf(p, "%O", state[i].response_length); + + if (++i == r->upstream_states->nelts) { + break; + } + + if (state[i].peer) { + *p++ = ','; + *p++ = ' '; + + } else { + *p++ = ' '; + *p++ = ':'; + *p++ = ' '; + + if (++i == r->upstream_states->nelts) { + break; + } + + continue; + } + } + + v->len = p - v->data; + + return NGX_OK; +} + + +ngx_int_t +ngx_http_upstream_header_variable(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + if (r->upstream == NULL) { + v->not_found = 1; + return NGX_OK; + } + + return ngx_http_variable_unknown_header(v, (ngx_str_t *) data, + &r->upstream->headers_in.headers.part, + sizeof("upstream_http_") - 1); +} + + +#if (NGX_HTTP_CACHE) + +ngx_int_t +ngx_http_upstream_cache_status(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ngx_uint_t n; + + if (r->upstream == NULL || r->upstream->cache_status == 0) { + v->not_found = 1; + return NGX_OK; + } + + n = r->upstream->cache_status - 1; + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->len = ngx_http_cache_status[n].len; + v->data = ngx_http_cache_status[n].data; + + return NGX_OK; +} + +#endif + + +static char * +ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy) +{ + char *rv; + void *mconf; + ngx_str_t *value; + ngx_url_t u; + ngx_uint_t m; + ngx_conf_t pcf; + ngx_http_module_t *module; + ngx_http_conf_ctx_t *ctx, *http_ctx; + ngx_http_upstream_srv_conf_t *uscf; + + ngx_memzero(&u, sizeof(ngx_url_t)); + + value = cf->args->elts; + u.host = value[1]; + u.no_resolve = 1; + u.no_port = 1; + + uscf = ngx_http_upstream_add(cf, &u, NGX_HTTP_UPSTREAM_CREATE + |NGX_HTTP_UPSTREAM_WEIGHT + |NGX_HTTP_UPSTREAM_MAX_FAILS + |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT + |NGX_HTTP_UPSTREAM_DOWN + |NGX_HTTP_UPSTREAM_BACKUP); + if (uscf == NULL) { + return NGX_CONF_ERROR; + } + + + ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t)); + if (ctx == NULL) { + return NGX_CONF_ERROR; + } + + http_ctx = cf->ctx; + ctx->main_conf = http_ctx->main_conf; + + /* the upstream{}'s srv_conf */ + + ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); + if (ctx->srv_conf == NULL) { + return NGX_CONF_ERROR; + } + + ctx->srv_conf[ngx_http_upstream_module.ctx_index] = uscf; + + uscf->srv_conf = ctx->srv_conf; + + + /* the upstream{}'s loc_conf */ + + ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); + if (ctx->loc_conf == NULL) { + return NGX_CONF_ERROR; + } + + for (m = 0; ngx_modules[m]; m++) { + if (ngx_modules[m]->type != NGX_HTTP_MODULE) { + continue; + } + + module = ngx_modules[m]->ctx; + + if (module->create_srv_conf) { + mconf = module->create_srv_conf(cf); + if (mconf == NULL) { + return NGX_CONF_ERROR; + } + + ctx->srv_conf[ngx_modules[m]->ctx_index] = mconf; + } + + if (module->create_loc_conf) { + mconf = module->create_loc_conf(cf); + if (mconf == NULL) { + return NGX_CONF_ERROR; + } + + ctx->loc_conf[ngx_modules[m]->ctx_index] = mconf; + } + } + + + /* parse inside upstream{} */ + + pcf = *cf; + cf->ctx = ctx; + cf->cmd_type = NGX_HTTP_UPS_CONF; + + rv = ngx_conf_parse(cf, NULL); + + *cf = pcf; + + if (rv != NGX_CONF_OK) { + return rv; + } + + if (uscf->servers == NULL) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "no servers are inside upstream"); + return NGX_CONF_ERROR; + } + + return rv; +} + + +static char * +ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_http_upstream_srv_conf_t *uscf = conf; + + time_t fail_timeout; + ngx_str_t *value, s; + ngx_url_t u; + ngx_int_t weight, max_fails; + ngx_uint_t i; + ngx_http_upstream_server_t *us; + + if (uscf->servers == NULL) { + uscf->servers = ngx_array_create(cf->pool, 4, + sizeof(ngx_http_upstream_server_t)); + if (uscf->servers == NULL) { + return NGX_CONF_ERROR; + } + } + + us = ngx_array_push(uscf->servers); + if (us == NULL) { + return NGX_CONF_ERROR; + } + + ngx_memzero(us, sizeof(ngx_http_upstream_server_t)); + + value = cf->args->elts; + + ngx_memzero(&u, sizeof(ngx_url_t)); + + u.url = value[1]; + u.default_port = 80; + + if (ngx_parse_url(cf->pool, &u) != NGX_OK) { + if (u.err) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "%s in upstream \"%V\"", u.err, &u.url); + } + + return NGX_CONF_ERROR; + } + + weight = 1; + max_fails = 1; + fail_timeout = 10; + + for (i = 2; i < cf->args->nelts; i++) { + + if (ngx_strncmp(value[i].data, "weight=", 7) == 0) { + + if (!(uscf->flags & NGX_HTTP_UPSTREAM_WEIGHT)) { + goto invalid; + } + + weight = ngx_atoi(&value[i].data[7], value[i].len - 7); + + if (weight == NGX_ERROR || weight == 0) { + goto invalid; + } + + continue; + } + + if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) { + + if (!(uscf->flags & NGX_HTTP_UPSTREAM_MAX_FAILS)) { + goto invalid; + } + + max_fails = ngx_atoi(&value[i].data[10], value[i].len - 10); + + if (max_fails == NGX_ERROR) { + goto invalid; + } + + continue; + } + + if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) { + + if (!(uscf->flags & NGX_HTTP_UPSTREAM_FAIL_TIMEOUT)) { + goto invalid; + } + + s.len = value[i].len - 13; + s.data = &value[i].data[13]; + + fail_timeout = ngx_parse_time(&s, 1); + + if (fail_timeout == (time_t) NGX_ERROR) { + goto invalid; + } + + continue; + } + + if (ngx_strncmp(value[i].data, "backup", 6) == 0) { + + if (!(uscf->flags & NGX_HTTP_UPSTREAM_BACKUP)) { + goto invalid; + } + + us->backup = 1; + + continue; + } + + if (ngx_strncmp(value[i].data, "down", 4) == 0) { + + if (!(uscf->flags & NGX_HTTP_UPSTREAM_DOWN)) { + goto invalid; + } + + us->down = 1; + + continue; + } + + goto invalid; + } + + us->addrs = u.addrs; + us->naddrs = u.naddrs; + us->weight = weight; + us->max_fails = max_fails; + us->fail_timeout = fail_timeout; + + return NGX_CONF_OK; + +invalid: + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid parameter \"%V\"", &value[i]); + + return NGX_CONF_ERROR; +} + + +ngx_http_upstream_srv_conf_t * +ngx_http_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags) +{ + ngx_uint_t i; + ngx_http_upstream_server_t *us; + ngx_http_upstream_srv_conf_t *uscf, **uscfp; + ngx_http_upstream_main_conf_t *umcf; + + if (!(flags & NGX_HTTP_UPSTREAM_CREATE)) { + + if (ngx_parse_url(cf->pool, u) != NGX_OK) { + if (u->err) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "%s in upstream \"%V\"", u->err, &u->url); + } + + return NULL; + } + } + + umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module); + + uscfp = umcf->upstreams.elts; + + for (i = 0; i < umcf->upstreams.nelts; i++) { + + if (uscfp[i]->host.len != u->host.len + || ngx_strncasecmp(uscfp[i]->host.data, u->host.data, u->host.len) + != 0) + { + continue; + } + + if ((flags & NGX_HTTP_UPSTREAM_CREATE) + && (uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE)) + { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "duplicate upstream \"%V\"", &u->host); + return NULL; + } + + if ((uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE) && !u->no_port) { + ngx_conf_log_error(NGX_LOG_WARN, cf, 0, + "upstream \"%V\" may not have port %d", + &u->host, u->port); + return NULL; + } + + if ((flags & NGX_HTTP_UPSTREAM_CREATE) && !uscfp[i]->no_port) { + ngx_log_error(NGX_LOG_WARN, cf->log, 0, + "upstream \"%V\" may not have port %d in %s:%ui", + &u->host, uscfp[i]->port, + uscfp[i]->file_name, uscfp[i]->line); + return NULL; + } + + if (uscfp[i]->port && u->port + && uscfp[i]->port != u->port) + { + continue; + } + + if (uscfp[i]->default_port && u->default_port + && uscfp[i]->default_port != u->default_port) + { + continue; + } + + if (flags & NGX_HTTP_UPSTREAM_CREATE) { + uscfp[i]->flags = flags; + } + + return uscfp[i]; + } + + uscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_srv_conf_t)); + if (uscf == NULL) { + return NULL; + } + + uscf->flags = flags; + uscf->host = u->host; + uscf->file_name = cf->conf_file->file.name.data; + uscf->line = cf->conf_file->line; + uscf->port = u->port; + uscf->default_port = u->default_port; + uscf->no_port = u->no_port; + + if (u->naddrs == 1) { + uscf->servers = ngx_array_create(cf->pool, 1, + sizeof(ngx_http_upstream_server_t)); + if (uscf->servers == NULL) { + return NULL; + } + + us = ngx_array_push(uscf->servers); + if (us == NULL) { + return NULL; + } + + ngx_memzero(us, sizeof(ngx_http_upstream_server_t)); + + us->addrs = u->addrs; + us->naddrs = 1; + } + + uscfp = ngx_array_push(&umcf->upstreams); + if (uscfp == NULL) { + return NULL; + } + + *uscfp = uscf; + + return uscf; +} + + +char * +ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf) +{ + char *p = conf; + + ngx_int_t rc; + ngx_str_t *value; + ngx_http_complex_value_t cv; + ngx_http_upstream_local_t **plocal, *local; + ngx_http_compile_complex_value_t ccv; + + plocal = (ngx_http_upstream_local_t **) (p + cmd->offset); + + if (*plocal != NGX_CONF_UNSET_PTR) { + return "is duplicate"; + } + + value = cf->args->elts; + + if (ngx_strcmp(value[1].data, "off") == 0) { + *plocal = NULL; + return NGX_CONF_OK; + } + + ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); + + ccv.cf = cf; + ccv.value = &value[1]; + ccv.complex_value = &cv; + + if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { + return NGX_CONF_ERROR; + } + + local = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_local_t)); + if (local == NULL) { + return NGX_CONF_ERROR; + } + + *plocal = local; + + if (cv.lengths) { + local->value = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t)); + if (local->value == NULL) { + return NGX_CONF_ERROR; + } + + *local->value = cv; + + return NGX_CONF_OK; + } + + local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t)); + if (local->addr == NULL) { + return NGX_CONF_ERROR; + } + + rc = ngx_parse_addr(cf->pool, local->addr, value[1].data, value[1].len); + + switch (rc) { + case NGX_OK: + local->addr->name = value[1]; + return NGX_CONF_OK; + + case NGX_DECLINED: + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid address \"%V\"", &value[1]); + /* fall through */ + + default: + return NGX_CONF_ERROR; + } +} + + +static ngx_addr_t * +ngx_http_upstream_get_local(ngx_http_request_t *r, + ngx_http_upstream_local_t *local) +{ + ngx_int_t rc; + ngx_str_t val; + ngx_addr_t *addr; + + if (local == NULL) { + return NULL; + } + + if (local->value == NULL) { + return local->addr; + } + + if (ngx_http_complex_value(r, local->value, &val) != NGX_OK) { + return NULL; + } + + if (val.len == 0) { + return NULL; + } + + addr = ngx_palloc(r->pool, sizeof(ngx_addr_t)); + if (addr == NULL) { + return NULL; + } + + rc = ngx_parse_addr(r->pool, addr, val.data, val.len); + + switch (rc) { + case NGX_OK: + addr->name = val; + return addr; + + case NGX_DECLINED: + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "invalid local address \"%V\"", &val); + /* fall through */ + + default: + return NULL; + } +} + + +char * +ngx_http_upstream_param_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf) +{ + char *p = conf; + + ngx_str_t *value; + ngx_array_t **a; + ngx_http_upstream_param_t *param; + + a = (ngx_array_t **) (p + cmd->offset); + + if (*a == NULL) { + *a = ngx_array_create(cf->pool, 4, sizeof(ngx_http_upstream_param_t)); + if (*a == NULL) { + return NGX_CONF_ERROR; + } + } + + param = ngx_array_push(*a); + if (param == NULL) { + return NGX_CONF_ERROR; + } + + value = cf->args->elts; + + param->key = value[1]; + param->value = value[2]; + param->skip_empty = 0; + + if (cf->args->nelts == 4) { + if (ngx_strcmp(value[3].data, "if_not_empty") != 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid parameter \"%V\"", &value[3]); + return NGX_CONF_ERROR; + } + + param->skip_empty = 1; + } + + return NGX_CONF_OK; +} + + +ngx_int_t +ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf, + ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev, + ngx_str_t *default_hide_headers, ngx_hash_init_t *hash) +{ + ngx_str_t *h; + ngx_uint_t i, j; + ngx_array_t hide_headers; + ngx_hash_key_t *hk; + + if (conf->hide_headers == NGX_CONF_UNSET_PTR + && conf->pass_headers == NGX_CONF_UNSET_PTR) + { + conf->hide_headers = prev->hide_headers; + conf->pass_headers = prev->pass_headers; + + conf->hide_headers_hash = prev->hide_headers_hash; + + if (conf->hide_headers_hash.buckets +#if (NGX_HTTP_CACHE) + && ((conf->cache == NULL) == (prev->cache == NULL)) +#endif + ) + { + return NGX_OK; + } + + } else { + if (conf->hide_headers == NGX_CONF_UNSET_PTR) { + conf->hide_headers = prev->hide_headers; + } + + if (conf->pass_headers == NGX_CONF_UNSET_PTR) { + conf->pass_headers = prev->pass_headers; + } + } + + if (ngx_array_init(&hide_headers, cf->temp_pool, 4, sizeof(ngx_hash_key_t)) + != NGX_OK) + { + return NGX_ERROR; + } + + for (h = default_hide_headers; h->len; h++) { + hk = ngx_array_push(&hide_headers); + if (hk == NULL) { + return NGX_ERROR; + } + + hk->key = *h; + hk->key_hash = ngx_hash_key_lc(h->data, h->len); + hk->value = (void *) 1; + } + + if (conf->hide_headers != NGX_CONF_UNSET_PTR) { + + h = conf->hide_headers->elts; + + for (i = 0; i < conf->hide_headers->nelts; i++) { + + hk = hide_headers.elts; + + for (j = 0; j < hide_headers.nelts; j++) { + if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) { + goto exist; + } + } + + hk = ngx_array_push(&hide_headers); + if (hk == NULL) { + return NGX_ERROR; + } + + hk->key = h[i]; + hk->key_hash = ngx_hash_key_lc(h[i].data, h[i].len); + hk->value = (void *) 1; + + exist: + + continue; + } + } + + if (conf->pass_headers != NGX_CONF_UNSET_PTR) { + + h = conf->pass_headers->elts; + hk = hide_headers.elts; + + for (i = 0; i < conf->pass_headers->nelts; i++) { + for (j = 0; j < hide_headers.nelts; j++) { + + if (hk[j].key.data == NULL) { + continue; + } + + if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) { + hk[j].key.data = NULL; + break; + } + } + } + } + + hash->hash = &conf->hide_headers_hash; + hash->key = ngx_hash_key_lc; + hash->pool = cf->pool; + hash->temp_pool = NULL; + + return ngx_hash_init(hash, hide_headers.elts, hide_headers.nelts); +} + + +static void * +ngx_http_upstream_create_main_conf(ngx_conf_t *cf) +{ + ngx_http_upstream_main_conf_t *umcf; + + umcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_main_conf_t)); + if (umcf == NULL) { + return NULL; + } + + if (ngx_array_init(&umcf->upstreams, cf->pool, 4, + sizeof(ngx_http_upstream_srv_conf_t *)) + != NGX_OK) + { + return NULL; + } + + return umcf; +} + + +static char * +ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf) +{ + ngx_http_upstream_main_conf_t *umcf = conf; + + ngx_uint_t i; + ngx_array_t headers_in; + ngx_hash_key_t *hk; + ngx_hash_init_t hash; + ngx_http_upstream_init_pt init; + ngx_http_upstream_header_t *header; + ngx_http_upstream_srv_conf_t **uscfp; + + uscfp = umcf->upstreams.elts; + + for (i = 0; i < umcf->upstreams.nelts; i++) { + + init = uscfp[i]->peer.init_upstream ? uscfp[i]->peer.init_upstream: + ngx_http_upstream_init_round_robin; + + if (init(cf, uscfp[i]) != NGX_OK) { + return NGX_CONF_ERROR; + } + } + + + /* upstream_headers_in_hash */ + + if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t)) + != NGX_OK) + { + return NGX_CONF_ERROR; + } + + for (header = ngx_http_upstream_headers_in; header->name.len; header++) { + hk = ngx_array_push(&headers_in); + if (hk == NULL) { + return NGX_CONF_ERROR; + } + + hk->key = header->name; + hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len); + hk->value = header; + } + + hash.hash = &umcf->headers_in_hash; + hash.key = ngx_hash_key_lc; + hash.max_size = 512; + hash.bucket_size = ngx_align(64, ngx_cacheline_size); + hash.name = "upstream_headers_in_hash"; + hash.pool = cf->pool; + hash.temp_pool = NULL; + + if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) { + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} diff --git a/release/src/router/nginx/src/http/ngx_http_upstream.h b/release/src/router/nginx/src/http/ngx_http_upstream.h new file mode 100644 index 0000000000..29ebf9bd92 --- /dev/null +++ b/release/src/router/nginx/src/http/ngx_http_upstream.h @@ -0,0 +1,379 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_HTTP_UPSTREAM_H_INCLUDED_ +#define _NGX_HTTP_UPSTREAM_H_INCLUDED_ + + +#include +#include +#include +#include +#include +#include + + +#define NGX_HTTP_UPSTREAM_FT_ERROR 0x00000002 +#define NGX_HTTP_UPSTREAM_FT_TIMEOUT 0x00000004 +#define NGX_HTTP_UPSTREAM_FT_INVALID_HEADER 0x00000008 +#define NGX_HTTP_UPSTREAM_FT_HTTP_500 0x00000010 +#define NGX_HTTP_UPSTREAM_FT_HTTP_502 0x00000020 +#define NGX_HTTP_UPSTREAM_FT_HTTP_503 0x00000040 +#define NGX_HTTP_UPSTREAM_FT_HTTP_504 0x00000080 +#define NGX_HTTP_UPSTREAM_FT_HTTP_404 0x00000100 +#define NGX_HTTP_UPSTREAM_FT_UPDATING 0x00000200 +#define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK 0x00000400 +#define NGX_HTTP_UPSTREAM_FT_MAX_WAITING 0x00000800 +#define NGX_HTTP_UPSTREAM_FT_NOLIVE 0x40000000 +#define NGX_HTTP_UPSTREAM_FT_OFF 0x80000000 + +#define NGX_HTTP_UPSTREAM_FT_STATUS (NGX_HTTP_UPSTREAM_FT_HTTP_500 \ + |NGX_HTTP_UPSTREAM_FT_HTTP_502 \ + |NGX_HTTP_UPSTREAM_FT_HTTP_503 \ + |NGX_HTTP_UPSTREAM_FT_HTTP_504 \ + |NGX_HTTP_UPSTREAM_FT_HTTP_404) + +#define NGX_HTTP_UPSTREAM_INVALID_HEADER 40 + + +#define NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT 0x00000002 +#define NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES 0x00000004 +#define NGX_HTTP_UPSTREAM_IGN_EXPIRES 0x00000008 +#define NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL 0x00000010 +#define NGX_HTTP_UPSTREAM_IGN_SET_COOKIE 0x00000020 +#define NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE 0x00000040 +#define NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING 0x00000080 +#define NGX_HTTP_UPSTREAM_IGN_XA_CHARSET 0x00000100 + + +typedef struct { + ngx_msec_t bl_time; + ngx_uint_t bl_state; + + ngx_uint_t status; + time_t response_sec; + ngx_uint_t response_msec; + off_t response_length; + + ngx_str_t *peer; +} ngx_http_upstream_state_t; + + +typedef struct { + ngx_hash_t headers_in_hash; + ngx_array_t upstreams; + /* ngx_http_upstream_srv_conf_t */ +} ngx_http_upstream_main_conf_t; + +typedef struct ngx_http_upstream_srv_conf_s ngx_http_upstream_srv_conf_t; + +typedef ngx_int_t (*ngx_http_upstream_init_pt)(ngx_conf_t *cf, + ngx_http_upstream_srv_conf_t *us); +typedef ngx_int_t (*ngx_http_upstream_init_peer_pt)(ngx_http_request_t *r, + ngx_http_upstream_srv_conf_t *us); + + +typedef struct { + ngx_http_upstream_init_pt init_upstream; + ngx_http_upstream_init_peer_pt init; + void *data; +} ngx_http_upstream_peer_t; + + +typedef struct { + ngx_addr_t *addrs; + ngx_uint_t naddrs; + ngx_uint_t weight; + ngx_uint_t max_fails; + time_t fail_timeout; + + unsigned down:1; + unsigned backup:1; +} ngx_http_upstream_server_t; + + +#define NGX_HTTP_UPSTREAM_CREATE 0x0001 +#define NGX_HTTP_UPSTREAM_WEIGHT 0x0002 +#define NGX_HTTP_UPSTREAM_MAX_FAILS 0x0004 +#define NGX_HTTP_UPSTREAM_FAIL_TIMEOUT 0x0008 +#define NGX_HTTP_UPSTREAM_DOWN 0x0010 +#define NGX_HTTP_UPSTREAM_BACKUP 0x0020 + + +struct ngx_http_upstream_srv_conf_s { + ngx_http_upstream_peer_t peer; + void **srv_conf; + + ngx_array_t *servers; /* ngx_http_upstream_server_t */ + + ngx_uint_t flags; + ngx_str_t host; + u_char *file_name; + ngx_uint_t line; + in_port_t port; + in_port_t default_port; + ngx_uint_t no_port; /* unsigned no_port:1 */ +}; + + +typedef struct { + ngx_addr_t *addr; + ngx_http_complex_value_t *value; +} ngx_http_upstream_local_t; + + +typedef struct { + ngx_http_upstream_srv_conf_t *upstream; + + ngx_msec_t connect_timeout; + ngx_msec_t send_timeout; + ngx_msec_t read_timeout; + ngx_msec_t timeout; + + size_t send_lowat; + size_t buffer_size; + + size_t busy_buffers_size; + size_t max_temp_file_size; + size_t temp_file_write_size; + + size_t busy_buffers_size_conf; + size_t max_temp_file_size_conf; + size_t temp_file_write_size_conf; + + ngx_bufs_t bufs; + + ngx_uint_t ignore_headers; + ngx_uint_t next_upstream; + ngx_uint_t store_access; + ngx_flag_t buffering; + ngx_flag_t pass_request_headers; + ngx_flag_t pass_request_body; + + ngx_flag_t ignore_client_abort; + ngx_flag_t intercept_errors; + ngx_flag_t cyclic_temp_file; + + ngx_path_t *temp_path; + + ngx_hash_t hide_headers_hash; + ngx_array_t *hide_headers; + ngx_array_t *pass_headers; + + ngx_http_upstream_local_t *local; + +#if (NGX_HTTP_CACHE) + ngx_shm_zone_t *cache; + + ngx_uint_t cache_min_uses; + ngx_uint_t cache_use_stale; + ngx_uint_t cache_methods; + + ngx_flag_t cache_lock; + ngx_msec_t cache_lock_timeout; + + ngx_array_t *cache_valid; + ngx_array_t *cache_bypass; + ngx_array_t *no_cache; +#endif + + ngx_array_t *store_lengths; + ngx_array_t *store_values; + + signed store:2; + unsigned intercept_404:1; + unsigned change_buffering:1; + +#if (NGX_HTTP_SSL) + ngx_ssl_t *ssl; + ngx_flag_t ssl_session_reuse; +#endif + + ngx_str_t module; +} ngx_http_upstream_conf_t; + + +typedef struct { + ngx_str_t name; + ngx_http_header_handler_pt handler; + ngx_uint_t offset; + ngx_http_header_handler_pt copy_handler; + ngx_uint_t conf; + ngx_uint_t redirect; /* unsigned redirect:1; */ +} ngx_http_upstream_header_t; + + +typedef struct { + ngx_list_t headers; + + ngx_uint_t status_n; + ngx_str_t status_line; + + ngx_table_elt_t *status; + ngx_table_elt_t *date; + ngx_table_elt_t *server; + ngx_table_elt_t *connection; + + ngx_table_elt_t *expires; + ngx_table_elt_t *etag; + ngx_table_elt_t *x_accel_expires; + ngx_table_elt_t *x_accel_redirect; + ngx_table_elt_t *x_accel_limit_rate; + + ngx_table_elt_t *content_type; + ngx_table_elt_t *content_length; + + ngx_table_elt_t *last_modified; + ngx_table_elt_t *location; + ngx_table_elt_t *accept_ranges; + ngx_table_elt_t *www_authenticate; + ngx_table_elt_t *transfer_encoding; + +#if (NGX_HTTP_GZIP) + ngx_table_elt_t *content_encoding; +#endif + + off_t content_length_n; + + ngx_array_t cache_control; + + unsigned connection_close:1; + unsigned chunked:1; +} ngx_http_upstream_headers_in_t; + + +typedef struct { + ngx_str_t host; + in_port_t port; + ngx_uint_t no_port; /* unsigned no_port:1 */ + + ngx_uint_t naddrs; + in_addr_t *addrs; + + struct sockaddr *sockaddr; + socklen_t socklen; + + ngx_resolver_ctx_t *ctx; +} ngx_http_upstream_resolved_t; + + +typedef void (*ngx_http_upstream_handler_pt)(ngx_http_request_t *r, + ngx_http_upstream_t *u); + + +struct ngx_http_upstream_s { + ngx_http_upstream_handler_pt read_event_handler; + ngx_http_upstream_handler_pt write_event_handler; + + ngx_peer_connection_t peer; + + ngx_event_pipe_t *pipe; + + ngx_chain_t *request_bufs; + + ngx_output_chain_ctx_t output; + ngx_chain_writer_ctx_t writer; + + ngx_http_upstream_conf_t *conf; + + ngx_http_upstream_headers_in_t headers_in; + + ngx_http_upstream_resolved_t *resolved; + + ngx_buf_t from_client; + + ngx_buf_t buffer; + off_t length; + + ngx_chain_t *out_bufs; + ngx_chain_t *busy_bufs; + ngx_chain_t *free_bufs; + + ngx_int_t (*input_filter_init)(void *data); + ngx_int_t (*input_filter)(void *data, ssize_t bytes); + void *input_filter_ctx; + +#if (NGX_HTTP_CACHE) + ngx_int_t (*create_key)(ngx_http_request_t *r); +#endif + ngx_int_t (*create_request)(ngx_http_request_t *r); + ngx_int_t (*reinit_request)(ngx_http_request_t *r); + ngx_int_t (*process_header)(ngx_http_request_t *r); + void (*abort_request)(ngx_http_request_t *r); + void (*finalize_request)(ngx_http_request_t *r, + ngx_int_t rc); + ngx_int_t (*rewrite_redirect)(ngx_http_request_t *r, + ngx_table_elt_t *h, size_t prefix); + ngx_int_t (*rewrite_cookie)(ngx_http_request_t *r, + ngx_table_elt_t *h); + + ngx_msec_t timeout; + + ngx_http_upstream_state_t *state; + + ngx_str_t method; + ngx_str_t schema; + ngx_str_t uri; + + ngx_http_cleanup_pt *cleanup; + + unsigned store:1; + unsigned cacheable:1; + unsigned accel:1; + unsigned ssl:1; +#if (NGX_HTTP_CACHE) + unsigned cache_status:3; +#endif + + unsigned buffering:1; + unsigned keepalive:1; + unsigned upgrade:1; + + unsigned request_sent:1; + unsigned header_sent:1; +}; + + +typedef struct { + ngx_uint_t status; + ngx_uint_t mask; +} ngx_http_upstream_next_t; + + +typedef struct { + ngx_str_t key; + ngx_str_t value; + ngx_uint_t skip_empty; +} ngx_http_upstream_param_t; + + +ngx_int_t ngx_http_upstream_header_variable(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); + +ngx_int_t ngx_http_upstream_create(ngx_http_request_t *r); +void ngx_http_upstream_init(ngx_http_request_t *r); +ngx_http_upstream_srv_conf_t *ngx_http_upstream_add(ngx_conf_t *cf, + ngx_url_t *u, ngx_uint_t flags); +char *ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +char *ngx_http_upstream_param_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +ngx_int_t ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf, + ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev, + ngx_str_t *default_hide_headers, ngx_hash_init_t *hash); + + +#define ngx_http_conf_upstream_srv_conf(uscf, module) \ + uscf->srv_conf[module.ctx_index] + + +extern ngx_module_t ngx_http_upstream_module; +extern ngx_conf_bitmask_t ngx_http_upstream_cache_method_mask[]; +extern ngx_conf_bitmask_t ngx_http_upstream_ignore_headers_masks[]; + + +#endif /* _NGX_HTTP_UPSTREAM_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/http/ngx_http_upstream_round_robin.c b/release/src/router/nginx/src/http/ngx_http_upstream_round_robin.c new file mode 100644 index 0000000000..d786ed1425 --- /dev/null +++ b/release/src/router/nginx/src/http/ngx_http_upstream_round_robin.c @@ -0,0 +1,678 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +static ngx_http_upstream_rr_peer_t *ngx_http_upstream_get_peer( + ngx_http_upstream_rr_peer_data_t *rrp); + +#if (NGX_HTTP_SSL) + +static ngx_int_t ngx_http_upstream_empty_set_session(ngx_peer_connection_t *pc, + void *data); +static void ngx_http_upstream_empty_save_session(ngx_peer_connection_t *pc, + void *data); + +#endif + + +ngx_int_t +ngx_http_upstream_init_round_robin(ngx_conf_t *cf, + ngx_http_upstream_srv_conf_t *us) +{ + ngx_url_t u; + ngx_uint_t i, j, n, w; + ngx_http_upstream_server_t *server; + ngx_http_upstream_rr_peers_t *peers, *backup; + + us->peer.init = ngx_http_upstream_init_round_robin_peer; + + if (us->servers) { + server = us->servers->elts; + + n = 0; + w = 0; + + for (i = 0; i < us->servers->nelts; i++) { + if (server[i].backup) { + continue; + } + + n += server[i].naddrs; + w += server[i].naddrs * server[i].weight; + } + + if (n == 0) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "no servers in upstream \"%V\" in %s:%ui", + &us->host, us->file_name, us->line); + return NGX_ERROR; + } + + peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t) + + sizeof(ngx_http_upstream_rr_peer_t) * (n - 1)); + if (peers == NULL) { + return NGX_ERROR; + } + + peers->single = (n == 1); + peers->number = n; + peers->weighted = (w != n); + peers->total_weight = w; + peers->name = &us->host; + + n = 0; + + for (i = 0; i < us->servers->nelts; i++) { + for (j = 0; j < server[i].naddrs; j++) { + if (server[i].backup) { + continue; + } + + peers->peer[n].sockaddr = server[i].addrs[j].sockaddr; + peers->peer[n].socklen = server[i].addrs[j].socklen; + peers->peer[n].name = server[i].addrs[j].name; + peers->peer[n].max_fails = server[i].max_fails; + peers->peer[n].fail_timeout = server[i].fail_timeout; + peers->peer[n].down = server[i].down; + peers->peer[n].weight = server[i].weight; + peers->peer[n].effective_weight = server[i].weight; + peers->peer[n].current_weight = 0; + n++; + } + } + + us->peer.data = peers; + + /* backup servers */ + + n = 0; + w = 0; + + for (i = 0; i < us->servers->nelts; i++) { + if (!server[i].backup) { + continue; + } + + n += server[i].naddrs; + w += server[i].naddrs * server[i].weight; + } + + if (n == 0) { + return NGX_OK; + } + + backup = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t) + + sizeof(ngx_http_upstream_rr_peer_t) * (n - 1)); + if (backup == NULL) { + return NGX_ERROR; + } + + peers->single = 0; + backup->single = 0; + backup->number = n; + backup->weighted = (w != n); + backup->total_weight = w; + backup->name = &us->host; + + n = 0; + + for (i = 0; i < us->servers->nelts; i++) { + for (j = 0; j < server[i].naddrs; j++) { + if (!server[i].backup) { + continue; + } + + backup->peer[n].sockaddr = server[i].addrs[j].sockaddr; + backup->peer[n].socklen = server[i].addrs[j].socklen; + backup->peer[n].name = server[i].addrs[j].name; + backup->peer[n].weight = server[i].weight; + backup->peer[n].effective_weight = server[i].weight; + backup->peer[n].current_weight = 0; + backup->peer[n].max_fails = server[i].max_fails; + backup->peer[n].fail_timeout = server[i].fail_timeout; + backup->peer[n].down = server[i].down; + n++; + } + } + + peers->next = backup; + + return NGX_OK; + } + + + /* an upstream implicitly defined by proxy_pass, etc. */ + + if (us->port == 0) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "no port in upstream \"%V\" in %s:%ui", + &us->host, us->file_name, us->line); + return NGX_ERROR; + } + + ngx_memzero(&u, sizeof(ngx_url_t)); + + u.host = us->host; + u.port = us->port; + + if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) { + if (u.err) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "%s in upstream \"%V\" in %s:%ui", + u.err, &us->host, us->file_name, us->line); + } + + return NGX_ERROR; + } + + n = u.naddrs; + + peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t) + + sizeof(ngx_http_upstream_rr_peer_t) * (n - 1)); + if (peers == NULL) { + return NGX_ERROR; + } + + peers->single = (n == 1); + peers->number = n; + peers->weighted = 0; + peers->total_weight = n; + peers->name = &us->host; + + for (i = 0; i < u.naddrs; i++) { + peers->peer[i].sockaddr = u.addrs[i].sockaddr; + peers->peer[i].socklen = u.addrs[i].socklen; + peers->peer[i].name = u.addrs[i].name; + peers->peer[i].weight = 1; + peers->peer[i].effective_weight = 1; + peers->peer[i].current_weight = 0; + peers->peer[i].max_fails = 1; + peers->peer[i].fail_timeout = 10; + } + + us->peer.data = peers; + + /* implicitly defined upstream has no backup servers */ + + return NGX_OK; +} + + +ngx_int_t +ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r, + ngx_http_upstream_srv_conf_t *us) +{ + ngx_uint_t n; + ngx_http_upstream_rr_peer_data_t *rrp; + + rrp = r->upstream->peer.data; + + if (rrp == NULL) { + rrp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_rr_peer_data_t)); + if (rrp == NULL) { + return NGX_ERROR; + } + + r->upstream->peer.data = rrp; + } + + rrp->peers = us->peer.data; + rrp->current = 0; + + n = rrp->peers->number; + + if (rrp->peers->next && rrp->peers->next->number > n) { + n = rrp->peers->next->number; + } + + if (n <= 8 * sizeof(uintptr_t)) { + rrp->tried = &rrp->data; + rrp->data = 0; + + } else { + n = (n + (8 * sizeof(uintptr_t) - 1)) / (8 * sizeof(uintptr_t)); + + rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t)); + if (rrp->tried == NULL) { + return NGX_ERROR; + } + } + + r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer; + r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer; + r->upstream->peer.tries = rrp->peers->number; +#if (NGX_HTTP_SSL) + r->upstream->peer.set_session = + ngx_http_upstream_set_round_robin_peer_session; + r->upstream->peer.save_session = + ngx_http_upstream_save_round_robin_peer_session; +#endif + + return NGX_OK; +} + + +ngx_int_t +ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, + ngx_http_upstream_resolved_t *ur) +{ + u_char *p; + size_t len; + ngx_uint_t i, n; + struct sockaddr_in *sin; + ngx_http_upstream_rr_peers_t *peers; + ngx_http_upstream_rr_peer_data_t *rrp; + + rrp = r->upstream->peer.data; + + if (rrp == NULL) { + rrp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_rr_peer_data_t)); + if (rrp == NULL) { + return NGX_ERROR; + } + + r->upstream->peer.data = rrp; + } + + peers = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peers_t) + + sizeof(ngx_http_upstream_rr_peer_t) * (ur->naddrs - 1)); + if (peers == NULL) { + return NGX_ERROR; + } + + peers->single = (ur->naddrs == 1); + peers->number = ur->naddrs; + peers->name = &ur->host; + + if (ur->sockaddr) { + peers->peer[0].sockaddr = ur->sockaddr; + peers->peer[0].socklen = ur->socklen; + peers->peer[0].name = ur->host; + peers->peer[0].weight = 1; + peers->peer[0].effective_weight = 1; + peers->peer[0].current_weight = 0; + peers->peer[0].max_fails = 1; + peers->peer[0].fail_timeout = 10; + + } else { + + for (i = 0; i < ur->naddrs; i++) { + + len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1; + + p = ngx_pnalloc(r->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + + len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN); + len = ngx_sprintf(&p[len], ":%d", ur->port) - p; + + sin = ngx_pcalloc(r->pool, sizeof(struct sockaddr_in)); + if (sin == NULL) { + return NGX_ERROR; + } + + sin->sin_family = AF_INET; + sin->sin_port = htons(ur->port); + sin->sin_addr.s_addr = ur->addrs[i]; + + peers->peer[i].sockaddr = (struct sockaddr *) sin; + peers->peer[i].socklen = sizeof(struct sockaddr_in); + peers->peer[i].name.len = len; + peers->peer[i].name.data = p; + peers->peer[i].weight = 1; + peers->peer[i].effective_weight = 1; + peers->peer[i].current_weight = 0; + peers->peer[i].max_fails = 1; + peers->peer[i].fail_timeout = 10; + } + } + + rrp->peers = peers; + rrp->current = 0; + + if (rrp->peers->number <= 8 * sizeof(uintptr_t)) { + rrp->tried = &rrp->data; + rrp->data = 0; + + } else { + n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1)) + / (8 * sizeof(uintptr_t)); + + rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t)); + if (rrp->tried == NULL) { + return NGX_ERROR; + } + } + + r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer; + r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer; + r->upstream->peer.tries = rrp->peers->number; +#if (NGX_HTTP_SSL) + r->upstream->peer.set_session = ngx_http_upstream_empty_set_session; + r->upstream->peer.save_session = ngx_http_upstream_empty_save_session; +#endif + + return NGX_OK; +} + + +ngx_int_t +ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) +{ + ngx_http_upstream_rr_peer_data_t *rrp = data; + + ngx_int_t rc; + ngx_uint_t i, n; + ngx_http_upstream_rr_peer_t *peer; + ngx_http_upstream_rr_peers_t *peers; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "get rr peer, try: %ui", pc->tries); + + /* ngx_lock_mutex(rrp->peers->mutex); */ + + pc->cached = 0; + pc->connection = NULL; + + if (rrp->peers->single) { + peer = &rrp->peers->peer[0]; + + if (peer->down) { + goto failed; + } + + } else { + + /* there are several peers */ + + peer = ngx_http_upstream_get_peer(rrp); + + if (peer == NULL) { + goto failed; + } + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "get rr peer, current: %ui %i", + rrp->current, peer->current_weight); + } + + pc->sockaddr = peer->sockaddr; + pc->socklen = peer->socklen; + pc->name = &peer->name; + + /* ngx_unlock_mutex(rrp->peers->mutex); */ + + if (pc->tries == 1 && rrp->peers->next) { + pc->tries += rrp->peers->next->number; + } + + return NGX_OK; + +failed: + + peers = rrp->peers; + + if (peers->next) { + + /* ngx_unlock_mutex(peers->mutex); */ + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers"); + + rrp->peers = peers->next; + pc->tries = rrp->peers->number; + + n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1)) + / (8 * sizeof(uintptr_t)); + + for (i = 0; i < n; i++) { + rrp->tried[i] = 0; + } + + rc = ngx_http_upstream_get_round_robin_peer(pc, rrp); + + if (rc != NGX_BUSY) { + return rc; + } + + /* ngx_lock_mutex(peers->mutex); */ + } + + /* all peers failed, mark them as live for quick recovery */ + + for (i = 0; i < peers->number; i++) { + peers->peer[i].fails = 0; + } + + /* ngx_unlock_mutex(peers->mutex); */ + + pc->name = peers->name; + + return NGX_BUSY; +} + + +static ngx_http_upstream_rr_peer_t * +ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp) +{ + time_t now; + uintptr_t m; + ngx_int_t total; + ngx_uint_t i, n; + ngx_http_upstream_rr_peer_t *peer, *best; + + now = ngx_time(); + + best = NULL; + total = 0; + + for (i = 0; i < rrp->peers->number; i++) { + + n = i / (8 * sizeof(uintptr_t)); + m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); + + if (rrp->tried[n] & m) { + continue; + } + + peer = &rrp->peers->peer[i]; + + if (peer->down) { + continue; + } + + if (peer->max_fails + && peer->fails >= peer->max_fails + && now - peer->checked <= peer->fail_timeout) + { + continue; + } + + peer->current_weight += peer->effective_weight; + total += peer->effective_weight; + + if (peer->effective_weight < peer->weight) { + peer->effective_weight++; + } + + if (best == NULL || peer->current_weight > best->current_weight) { + best = peer; + } + } + + if (best == NULL) { + return NULL; + } + + i = best - &rrp->peers->peer[0]; + + rrp->current = i; + + n = i / (8 * sizeof(uintptr_t)); + m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); + + rrp->tried[n] |= m; + + best->current_weight -= total; + best->checked = now; + + return best; +} + + +void +ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data, + ngx_uint_t state) +{ + ngx_http_upstream_rr_peer_data_t *rrp = data; + + time_t now; + ngx_http_upstream_rr_peer_t *peer; + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "free rr peer %ui %ui", pc->tries, state); + + /* TODO: NGX_PEER_KEEPALIVE */ + + if (rrp->peers->single) { + pc->tries = 0; + return; + } + + peer = &rrp->peers->peer[rrp->current]; + + if (state & NGX_PEER_FAILED) { + now = ngx_time(); + + /* ngx_lock_mutex(rrp->peers->mutex); */ + + peer->fails++; + peer->accessed = now; + peer->checked = now; + + if (peer->max_fails) { + peer->effective_weight -= peer->weight / peer->max_fails; + } + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "free rr peer failed: %ui %i", + rrp->current, peer->effective_weight); + + if (peer->effective_weight < 0) { + peer->effective_weight = 0; + } + + /* ngx_unlock_mutex(rrp->peers->mutex); */ + + } else { + + /* mark peer live if check passed */ + + if (peer->accessed < peer->checked) { + peer->fails = 0; + } + } + + if (pc->tries) { + pc->tries--; + } + + /* ngx_unlock_mutex(rrp->peers->mutex); */ +} + + +#if (NGX_HTTP_SSL) + +ngx_int_t +ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc, + void *data) +{ + ngx_http_upstream_rr_peer_data_t *rrp = data; + + ngx_int_t rc; + ngx_ssl_session_t *ssl_session; + ngx_http_upstream_rr_peer_t *peer; + + peer = &rrp->peers->peer[rrp->current]; + + /* TODO: threads only mutex */ + /* ngx_lock_mutex(rrp->peers->mutex); */ + + ssl_session = peer->ssl_session; + + rc = ngx_ssl_set_session(pc->connection, ssl_session); + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "set session: %p:%d", + ssl_session, ssl_session ? ssl_session->references : 0); + + /* ngx_unlock_mutex(rrp->peers->mutex); */ + + return rc; +} + + +void +ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc, + void *data) +{ + ngx_http_upstream_rr_peer_data_t *rrp = data; + + ngx_ssl_session_t *old_ssl_session, *ssl_session; + ngx_http_upstream_rr_peer_t *peer; + + ssl_session = ngx_ssl_get_session(pc->connection); + + if (ssl_session == NULL) { + return; + } + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "save session: %p:%d", ssl_session, ssl_session->references); + + peer = &rrp->peers->peer[rrp->current]; + + /* TODO: threads only mutex */ + /* ngx_lock_mutex(rrp->peers->mutex); */ + + old_ssl_session = peer->ssl_session; + peer->ssl_session = ssl_session; + + /* ngx_unlock_mutex(rrp->peers->mutex); */ + + if (old_ssl_session) { + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "old session: %p:%d", + old_ssl_session, old_ssl_session->references); + + /* TODO: may block */ + + ngx_ssl_free_session(old_ssl_session); + } +} + + +static ngx_int_t +ngx_http_upstream_empty_set_session(ngx_peer_connection_t *pc, void *data) +{ + return NGX_OK; +} + + +static void +ngx_http_upstream_empty_save_session(ngx_peer_connection_t *pc, void *data) +{ + return; +} + +#endif diff --git a/release/src/router/nginx/src/http/ngx_http_upstream_round_robin.h b/release/src/router/nginx/src/http/ngx_http_upstream_round_robin.h new file mode 100644 index 0000000000..ea90ab9181 --- /dev/null +++ b/release/src/router/nginx/src/http/ngx_http_upstream_round_robin.h @@ -0,0 +1,89 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ +#define _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ + + +#include +#include +#include + + +typedef struct { + struct sockaddr *sockaddr; + socklen_t socklen; + ngx_str_t name; + + ngx_int_t current_weight; + ngx_int_t effective_weight; + ngx_int_t weight; + + ngx_uint_t fails; + time_t accessed; + time_t checked; + + ngx_uint_t max_fails; + time_t fail_timeout; + + ngx_uint_t down; /* unsigned down:1; */ + +#if (NGX_HTTP_SSL) + ngx_ssl_session_t *ssl_session; /* local to a process */ +#endif +} ngx_http_upstream_rr_peer_t; + + +typedef struct ngx_http_upstream_rr_peers_s ngx_http_upstream_rr_peers_t; + +struct ngx_http_upstream_rr_peers_s { + ngx_uint_t number; + + /* ngx_mutex_t *mutex; */ + + ngx_uint_t total_weight; + + unsigned single:1; + unsigned weighted:1; + + ngx_str_t *name; + + ngx_http_upstream_rr_peers_t *next; + + ngx_http_upstream_rr_peer_t peer[1]; +}; + + +typedef struct { + ngx_http_upstream_rr_peers_t *peers; + ngx_uint_t current; + uintptr_t *tried; + uintptr_t data; +} ngx_http_upstream_rr_peer_data_t; + + +ngx_int_t ngx_http_upstream_init_round_robin(ngx_conf_t *cf, + ngx_http_upstream_srv_conf_t *us); +ngx_int_t ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r, + ngx_http_upstream_srv_conf_t *us); +ngx_int_t ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, + ngx_http_upstream_resolved_t *ur); +ngx_int_t ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, + void *data); +void ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, + void *data, ngx_uint_t state); + +#if (NGX_HTTP_SSL) +ngx_int_t + ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc, + void *data); +void ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc, + void *data); +#endif + + +#endif /* _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/http/ngx_http_variables.c b/release/src/router/nginx/src/http/ngx_http_variables.c new file mode 100644 index 0000000000..6f1e0344dd --- /dev/null +++ b/release/src/router/nginx/src/http/ngx_http_variables.c @@ -0,0 +1,2542 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include + + +static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static void ngx_http_variable_request_set(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_request_get_size(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static void ngx_http_variable_request_set_size(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); + +static ngx_int_t ngx_http_variable_cookies(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_headers_internal(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data, u_char sep); + +static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_request_line(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_cookie(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_argument(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +#if (NGX_HAVE_TCP_INFO) +static ngx_int_t ngx_http_variable_tcpinfo(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +#endif + +static ngx_int_t ngx_http_variable_content_length(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_remote_addr(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_remote_port(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_server_addr(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_server_port(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_scheme(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_https(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_is_args(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_document_root(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_realpath_root(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_request_filename(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_server_name(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_request_method(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_remote_user(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_bytes_sent(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_body_bytes_sent(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_pipe(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_request_completion(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_request_body(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_request_body_file(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_request_length(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_request_time(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_status(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); + +static ngx_int_t ngx_http_variable_sent_content_type(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_sent_content_length(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_sent_location(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_sent_last_modified(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_sent_connection(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_sent_keep_alive(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); + +static ngx_int_t ngx_http_variable_connection(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_connection_requests(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); + +static ngx_int_t ngx_http_variable_nginx_version(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_hostname(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_pid(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_msec(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_time_iso8601(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_time_local(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); + +/* + * TODO: + * Apache CGI: AUTH_TYPE, PATH_INFO (null), PATH_TRANSLATED + * REMOTE_HOST (null), REMOTE_IDENT (null), + * SERVER_SOFTWARE + * + * Apache SSI: DOCUMENT_NAME, LAST_MODIFIED, USER_NAME (file owner) + */ + +/* + * the $http_host, $http_user_agent, $http_referer, and $http_via + * variables may be handled by generic + * ngx_http_variable_unknown_header_in(), but for performance reasons + * they are handled using dedicated entries + */ + +static ngx_http_variable_t ngx_http_core_variables[] = { + + { ngx_string("http_host"), NULL, ngx_http_variable_header, + offsetof(ngx_http_request_t, headers_in.host), 0, 0 }, + + { ngx_string("http_user_agent"), NULL, ngx_http_variable_header, + offsetof(ngx_http_request_t, headers_in.user_agent), 0, 0 }, + + { ngx_string("http_referer"), NULL, ngx_http_variable_header, + offsetof(ngx_http_request_t, headers_in.referer), 0, 0 }, + +#if (NGX_HTTP_GZIP) + { ngx_string("http_via"), NULL, ngx_http_variable_header, + offsetof(ngx_http_request_t, headers_in.via), 0, 0 }, +#endif + +#if (NGX_HTTP_X_FORWARDED_FOR) + { ngx_string("http_x_forwarded_for"), NULL, ngx_http_variable_headers, + offsetof(ngx_http_request_t, headers_in.x_forwarded_for), 0, 0 }, +#endif + + { ngx_string("http_cookie"), NULL, ngx_http_variable_cookies, + offsetof(ngx_http_request_t, headers_in.cookies), 0, 0 }, + + { ngx_string("content_length"), NULL, ngx_http_variable_content_length, + 0, 0, 0 }, + + { ngx_string("content_type"), NULL, ngx_http_variable_header, + offsetof(ngx_http_request_t, headers_in.content_type), 0, 0 }, + + { ngx_string("host"), NULL, ngx_http_variable_host, 0, 0, 0 }, + + { ngx_string("binary_remote_addr"), NULL, + ngx_http_variable_binary_remote_addr, 0, 0, 0 }, + + { ngx_string("remote_addr"), NULL, ngx_http_variable_remote_addr, 0, 0, 0 }, + + { ngx_string("remote_port"), NULL, ngx_http_variable_remote_port, 0, 0, 0 }, + + { ngx_string("server_addr"), NULL, ngx_http_variable_server_addr, 0, 0, 0 }, + + { ngx_string("server_port"), NULL, ngx_http_variable_server_port, 0, 0, 0 }, + + { ngx_string("server_protocol"), NULL, ngx_http_variable_request, + offsetof(ngx_http_request_t, http_protocol), 0, 0 }, + + { ngx_string("scheme"), NULL, ngx_http_variable_scheme, 0, 0, 0 }, + + { ngx_string("https"), NULL, ngx_http_variable_https, 0, 0, 0 }, + + { ngx_string("request_uri"), NULL, ngx_http_variable_request, + offsetof(ngx_http_request_t, unparsed_uri), 0, 0 }, + + { ngx_string("uri"), NULL, ngx_http_variable_request, + offsetof(ngx_http_request_t, uri), + NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("document_uri"), NULL, ngx_http_variable_request, + offsetof(ngx_http_request_t, uri), + NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("request"), NULL, ngx_http_variable_request_line, 0, 0, 0 }, + + { ngx_string("document_root"), NULL, + ngx_http_variable_document_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("realpath_root"), NULL, + ngx_http_variable_realpath_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("query_string"), NULL, ngx_http_variable_request, + offsetof(ngx_http_request_t, args), + NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("args"), + ngx_http_variable_request_set, + ngx_http_variable_request, + offsetof(ngx_http_request_t, args), + NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("is_args"), NULL, ngx_http_variable_is_args, + 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("request_filename"), NULL, + ngx_http_variable_request_filename, 0, + NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("server_name"), NULL, ngx_http_variable_server_name, 0, 0, 0 }, + + { ngx_string("request_method"), NULL, + ngx_http_variable_request_method, 0, + NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("remote_user"), NULL, ngx_http_variable_remote_user, 0, 0, 0 }, + + { ngx_string("bytes_sent"), NULL, ngx_http_variable_bytes_sent, + 0, 0, 0 }, + + { ngx_string("body_bytes_sent"), NULL, ngx_http_variable_body_bytes_sent, + 0, 0, 0 }, + + { ngx_string("pipe"), NULL, ngx_http_variable_pipe, + 0, 0, 0 }, + + { ngx_string("request_completion"), NULL, + ngx_http_variable_request_completion, + 0, 0, 0 }, + + { ngx_string("request_body"), NULL, + ngx_http_variable_request_body, + 0, 0, 0 }, + + { ngx_string("request_body_file"), NULL, + ngx_http_variable_request_body_file, + 0, 0, 0 }, + + { ngx_string("request_length"), NULL, ngx_http_variable_request_length, + 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("request_time"), NULL, ngx_http_variable_request_time, + 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("status"), NULL, + ngx_http_variable_status, 0, + NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("sent_http_content_type"), NULL, + ngx_http_variable_sent_content_type, 0, 0, 0 }, + + { ngx_string("sent_http_content_length"), NULL, + ngx_http_variable_sent_content_length, 0, 0, 0 }, + + { ngx_string("sent_http_location"), NULL, + ngx_http_variable_sent_location, 0, 0, 0 }, + + { ngx_string("sent_http_last_modified"), NULL, + ngx_http_variable_sent_last_modified, 0, 0, 0 }, + + { ngx_string("sent_http_connection"), NULL, + ngx_http_variable_sent_connection, 0, 0, 0 }, + + { ngx_string("sent_http_keep_alive"), NULL, + ngx_http_variable_sent_keep_alive, 0, 0, 0 }, + + { ngx_string("sent_http_transfer_encoding"), NULL, + ngx_http_variable_sent_transfer_encoding, 0, 0, 0 }, + + { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_headers, + offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 }, + + { ngx_string("limit_rate"), ngx_http_variable_request_set_size, + ngx_http_variable_request_get_size, + offsetof(ngx_http_request_t, limit_rate), + NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("connection"), NULL, + ngx_http_variable_connection, 0, 0, 0 }, + + { ngx_string("connection_requests"), NULL, + ngx_http_variable_connection_requests, 0, 0, 0 }, + + { ngx_string("nginx_version"), NULL, ngx_http_variable_nginx_version, + 0, 0, 0 }, + + { ngx_string("hostname"), NULL, ngx_http_variable_hostname, + 0, 0, 0 }, + + { ngx_string("pid"), NULL, ngx_http_variable_pid, + 0, 0, 0 }, + + { ngx_string("msec"), NULL, ngx_http_variable_msec, + 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("time_iso8601"), NULL, ngx_http_variable_time_iso8601, + 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("time_local"), NULL, ngx_http_variable_time_local, + 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, + +#if (NGX_HAVE_TCP_INFO) + { ngx_string("tcpinfo_rtt"), NULL, ngx_http_variable_tcpinfo, + 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("tcpinfo_rttvar"), NULL, ngx_http_variable_tcpinfo, + 1, NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("tcpinfo_snd_cwnd"), NULL, ngx_http_variable_tcpinfo, + 2, NGX_HTTP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("tcpinfo_rcv_space"), NULL, ngx_http_variable_tcpinfo, + 3, NGX_HTTP_VAR_NOCACHEABLE, 0 }, +#endif + + { ngx_null_string, NULL, NULL, 0, 0, 0 } +}; + + +ngx_http_variable_value_t ngx_http_variable_null_value = + ngx_http_variable(""); +ngx_http_variable_value_t ngx_http_variable_true_value = + ngx_http_variable("1"); + + +ngx_http_variable_t * +ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags) +{ + ngx_int_t rc; + ngx_uint_t i; + ngx_hash_key_t *key; + ngx_http_variable_t *v; + ngx_http_core_main_conf_t *cmcf; + + if (name->len == 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid variable name \"$\""); + return NULL; + } + + cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); + + key = cmcf->variables_keys->keys.elts; + for (i = 0; i < cmcf->variables_keys->keys.nelts; i++) { + if (name->len != key[i].key.len + || ngx_strncasecmp(name->data, key[i].key.data, name->len) != 0) + { + continue; + } + + v = key[i].value; + + if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the duplicate \"%V\" variable", name); + return NULL; + } + + return v; + } + + v = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t)); + if (v == NULL) { + return NULL; + } + + v->name.len = name->len; + v->name.data = ngx_pnalloc(cf->pool, name->len); + if (v->name.data == NULL) { + return NULL; + } + + ngx_strlow(v->name.data, name->data, name->len); + + v->set_handler = NULL; + v->get_handler = NULL; + v->data = 0; + v->flags = flags; + v->index = 0; + + rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v, 0); + + if (rc == NGX_ERROR) { + return NULL; + } + + if (rc == NGX_BUSY) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "conflicting variable name \"%V\"", name); + return NULL; + } + + return v; +} + + +ngx_int_t +ngx_http_get_variable_index(ngx_conf_t *cf, ngx_str_t *name) +{ + ngx_uint_t i; + ngx_http_variable_t *v; + ngx_http_core_main_conf_t *cmcf; + + if (name->len == 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid variable name \"$\""); + return NGX_ERROR; + } + + cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); + + v = cmcf->variables.elts; + + if (v == NULL) { + if (ngx_array_init(&cmcf->variables, cf->pool, 4, + sizeof(ngx_http_variable_t)) + != NGX_OK) + { + return NGX_ERROR; + } + + } else { + for (i = 0; i < cmcf->variables.nelts; i++) { + if (name->len != v[i].name.len + || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0) + { + continue; + } + + return i; + } + } + + v = ngx_array_push(&cmcf->variables); + if (v == NULL) { + return NGX_ERROR; + } + + v->name.len = name->len; + v->name.data = ngx_pnalloc(cf->pool, name->len); + if (v->name.data == NULL) { + return NGX_ERROR; + } + + ngx_strlow(v->name.data, name->data, name->len); + + v->set_handler = NULL; + v->get_handler = NULL; + v->data = 0; + v->flags = 0; + v->index = cmcf->variables.nelts - 1; + + return v->index; +} + + +ngx_http_variable_value_t * +ngx_http_get_indexed_variable(ngx_http_request_t *r, ngx_uint_t index) +{ + ngx_http_variable_t *v; + ngx_http_core_main_conf_t *cmcf; + + cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); + + if (cmcf->variables.nelts <= index) { + ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, + "unknown variable index: %d", index); + return NULL; + } + + if (r->variables[index].not_found || r->variables[index].valid) { + return &r->variables[index]; + } + + v = cmcf->variables.elts; + + if (v[index].get_handler(r, &r->variables[index], v[index].data) + == NGX_OK) + { + if (v[index].flags & NGX_HTTP_VAR_NOCACHEABLE) { + r->variables[index].no_cacheable = 1; + } + + return &r->variables[index]; + } + + r->variables[index].valid = 0; + r->variables[index].not_found = 1; + + return NULL; +} + + +ngx_http_variable_value_t * +ngx_http_get_flushed_variable(ngx_http_request_t *r, ngx_uint_t index) +{ + ngx_http_variable_value_t *v; + + v = &r->variables[index]; + + if (v->valid || v->not_found) { + if (!v->no_cacheable) { + return v; + } + + v->valid = 0; + v->not_found = 0; + } + + return ngx_http_get_indexed_variable(r, index); +} + + +ngx_http_variable_value_t * +ngx_http_get_variable(ngx_http_request_t *r, ngx_str_t *name, ngx_uint_t key) +{ + ngx_http_variable_t *v; + ngx_http_variable_value_t *vv; + ngx_http_core_main_conf_t *cmcf; + + cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); + + v = ngx_hash_find(&cmcf->variables_hash, key, name->data, name->len); + + if (v) { + if (v->flags & NGX_HTTP_VAR_INDEXED) { + return ngx_http_get_flushed_variable(r, v->index); + + } else { + + vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t)); + + if (vv && v->get_handler(r, vv, v->data) == NGX_OK) { + return vv; + } + + return NULL; + } + } + + vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t)); + if (vv == NULL) { + return NULL; + } + + if (ngx_strncmp(name->data, "http_", 5) == 0) { + + if (ngx_http_variable_unknown_header_in(r, vv, (uintptr_t) name) + == NGX_OK) + { + return vv; + } + + return NULL; + } + + if (ngx_strncmp(name->data, "sent_http_", 10) == 0) { + + if (ngx_http_variable_unknown_header_out(r, vv, (uintptr_t) name) + == NGX_OK) + { + return vv; + } + + return NULL; + } + + if (ngx_strncmp(name->data, "upstream_http_", 14) == 0) { + + if (ngx_http_upstream_header_variable(r, vv, (uintptr_t) name) + == NGX_OK) + { + return vv; + } + + return NULL; + } + + if (ngx_strncmp(name->data, "cookie_", 7) == 0) { + + if (ngx_http_variable_cookie(r, vv, (uintptr_t) name) == NGX_OK) { + return vv; + } + + return NULL; + } + + if (ngx_strncmp(name->data, "arg_", 4) == 0) { + + if (ngx_http_variable_argument(r, vv, (uintptr_t) name) == NGX_OK) { + return vv; + } + + return NULL; + } + + vv->not_found = 1; + + return vv; +} + + +static ngx_int_t +ngx_http_variable_request(ngx_http_request_t *r, ngx_http_variable_value_t *v, + uintptr_t data) +{ + ngx_str_t *s; + + s = (ngx_str_t *) ((char *) r + data); + + if (s->data) { + v->len = s->len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = s->data; + + } else { + v->not_found = 1; + } + + return NGX_OK; +} + + +static void +ngx_http_variable_request_set(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ngx_str_t *s; + + s = (ngx_str_t *) ((char *) r + data); + + s->len = v->len; + s->data = v->data; +} + + +static ngx_int_t +ngx_http_variable_request_get_size(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + size_t *sp; + + sp = (size_t *) ((char *) r + data); + + v->data = ngx_pnalloc(r->pool, NGX_SIZE_T_LEN); + if (v->data == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(v->data, "%uz", *sp) - v->data; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; +} + + +static void +ngx_http_variable_request_set_size(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ssize_t s, *sp; + ngx_str_t val; + + val.len = v->len; + val.data = v->data; + + s = ngx_parse_size(&val); + + if (s == NGX_ERROR) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "invalid size \"%V\"", &val); + return; + } + + sp = (ssize_t *) ((char *) r + data); + + *sp = s; + + return; +} + + +static ngx_int_t +ngx_http_variable_header(ngx_http_request_t *r, ngx_http_variable_value_t *v, + uintptr_t data) +{ + ngx_table_elt_t *h; + + h = *(ngx_table_elt_t **) ((char *) r + data); + + if (h) { + v->len = h->value.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = h->value.data; + + } else { + v->not_found = 1; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_cookies(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + return ngx_http_variable_headers_internal(r, v, data, ';'); +} + + +static ngx_int_t +ngx_http_variable_headers(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + return ngx_http_variable_headers_internal(r, v, data, ','); +} + + +static ngx_int_t +ngx_http_variable_headers_internal(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data, u_char sep) +{ + size_t len; + u_char *p, *end; + ngx_uint_t i, n; + ngx_array_t *a; + ngx_table_elt_t **h; + + a = (ngx_array_t *) ((char *) r + data); + + n = a->nelts; + h = a->elts; + + len = 0; + + for (i = 0; i < n; i++) { + + if (h[i]->hash == 0) { + continue; + } + + len += h[i]->value.len + 2; + } + + if (len == 0) { + v->not_found = 1; + return NGX_OK; + } + + len -= 2; + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + if (n == 1) { + v->len = (*h)->value.len; + v->data = (*h)->value.data; + + return NGX_OK; + } + + p = ngx_pnalloc(r->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = len; + v->data = p; + + end = p + len; + + for (i = 0; /* void */ ; i++) { + + if (h[i]->hash == 0) { + continue; + } + + p = ngx_copy(p, h[i]->value.data, h[i]->value.len); + + if (p == end) { + break; + } + + *p++ = sep; *p++ = ' '; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_unknown_header_in(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + return ngx_http_variable_unknown_header(v, (ngx_str_t *) data, + &r->headers_in.headers.part, + sizeof("http_") - 1); +} + + +static ngx_int_t +ngx_http_variable_unknown_header_out(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + return ngx_http_variable_unknown_header(v, (ngx_str_t *) data, + &r->headers_out.headers.part, + sizeof("sent_http_") - 1); +} + + +ngx_int_t +ngx_http_variable_unknown_header(ngx_http_variable_value_t *v, ngx_str_t *var, + ngx_list_part_t *part, size_t prefix) +{ + u_char ch; + ngx_uint_t i, n; + ngx_table_elt_t *header; + + header = part->elts; + + for (i = 0; /* void */ ; i++) { + + if (i >= part->nelts) { + if (part->next == NULL) { + break; + } + + part = part->next; + header = part->elts; + i = 0; + } + + if (header[i].hash == 0) { + continue; + } + + for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) { + ch = header[i].key.data[n]; + + if (ch >= 'A' && ch <= 'Z') { + ch |= 0x20; + + } else if (ch == '-') { + ch = '_'; + } + + if (var->data[n + prefix] != ch) { + break; + } + } + + if (n + prefix == var->len && n == header[i].key.len) { + v->len = header[i].value.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = header[i].value.data; + + return NGX_OK; + } + } + + v->not_found = 1; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_request_line(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p, *s; + + s = r->request_line.data; + + if (s == NULL) { + s = r->request_start; + + if (s == NULL) { + v->not_found = 1; + return NGX_OK; + } + + for (p = s; p < r->header_in->last; p++) { + if (*p == CR || *p == LF) { + break; + } + } + + r->request_line.len = p - s; + r->request_line.data = s; + } + + v->len = r->request_line.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = s; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_cookie(ngx_http_request_t *r, ngx_http_variable_value_t *v, + uintptr_t data) +{ + ngx_str_t *name = (ngx_str_t *) data; + + ngx_str_t cookie, s; + + s.len = name->len - (sizeof("cookie_") - 1); + s.data = name->data + sizeof("cookie_") - 1; + + if (ngx_http_parse_multi_header_lines(&r->headers_in.cookies, &s, &cookie) + == NGX_DECLINED) + { + v->not_found = 1; + return NGX_OK; + } + + v->len = cookie.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = cookie.data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_argument(ngx_http_request_t *r, ngx_http_variable_value_t *v, + uintptr_t data) +{ + ngx_str_t *name = (ngx_str_t *) data; + + u_char *arg; + size_t len; + ngx_str_t value; + + len = name->len - (sizeof("arg_") - 1); + arg = name->data + sizeof("arg_") - 1; + + if (ngx_http_arg(r, arg, len, &value) != NGX_OK) { + v->not_found = 1; + return NGX_OK; + } + + v->data = value.data; + v->len = value.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; +} + + +#if (NGX_HAVE_TCP_INFO) + +static ngx_int_t +ngx_http_variable_tcpinfo(ngx_http_request_t *r, ngx_http_variable_value_t *v, + uintptr_t data) +{ + struct tcp_info ti; + socklen_t len; + uint32_t value; + + len = sizeof(struct tcp_info); + if (getsockopt(r->connection->fd, IPPROTO_TCP, TCP_INFO, &ti, &len) == -1) { + v->not_found = 1; + return NGX_OK; + } + + v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN); + if (v->data == NULL) { + return NGX_ERROR; + } + + switch (data) { + case 0: + value = ti.tcpi_rtt; + break; + + case 1: + value = ti.tcpi_rttvar; + break; + + case 2: + value = ti.tcpi_snd_cwnd; + break; + + case 3: + value = ti.tcpi_rcv_space; + break; + + /* suppress warning */ + default: + value = 0; + break; + } + + v->len = ngx_sprintf(v->data, "%uD", value) - v->data; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; +} + +#endif + + +static ngx_int_t +ngx_http_variable_content_length(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + if (r->headers_in.content_length) { + v->len = r->headers_in.content_length->value.len; + v->data = r->headers_in.content_length->value.data; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + } else if (r->headers_in.content_length_n >= 0) { + p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%O", r->headers_in.content_length_n) - p; + v->data = p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + } else { + v->not_found = 1; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_host(ngx_http_request_t *r, ngx_http_variable_value_t *v, + uintptr_t data) +{ + ngx_http_core_srv_conf_t *cscf; + + if (r->headers_in.server.len) { + v->len = r->headers_in.server.len; + v->data = r->headers_in.server.data; + + } else { + cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); + + v->len = cscf->server_name.len; + v->data = cscf->server_name.data; + } + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + struct sockaddr_in *sin; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; +#endif + + switch (r->connection->sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) r->connection->sockaddr; + + v->len = sizeof(struct in6_addr); + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = sin6->sin6_addr.s6_addr; + + break; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) r->connection->sockaddr; + + v->len = sizeof(in_addr_t); + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) &sin->sin_addr; + + break; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_remote_addr(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + v->len = r->connection->addr_text.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = r->connection->addr_text.data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_remote_port(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ngx_uint_t port; + struct sockaddr_in *sin; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; +#endif + + v->len = 0; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); + if (v->data == NULL) { + return NGX_ERROR; + } + + switch (r->connection->sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) r->connection->sockaddr; + port = ntohs(sin6->sin6_port); + break; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) r->connection->sockaddr; + port = ntohs(sin->sin_port); + break; + } + + if (port > 0 && port < 65536) { + v->len = ngx_sprintf(v->data, "%ui", port) - v->data; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_server_addr(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ngx_str_t s; + u_char addr[NGX_SOCKADDR_STRLEN]; + + s.len = NGX_SOCKADDR_STRLEN; + s.data = addr; + + if (ngx_connection_local_sockaddr(r->connection, &s, 0) != NGX_OK) { + return NGX_ERROR; + } + + s.data = ngx_pnalloc(r->pool, s.len); + if (s.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(s.data, addr, s.len); + + v->len = s.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = s.data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_server_port(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ngx_uint_t port; + struct sockaddr_in *sin; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; +#endif + + v->len = 0; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + if (ngx_connection_local_sockaddr(r->connection, NULL, 0) != NGX_OK) { + return NGX_ERROR; + } + + v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); + if (v->data == NULL) { + return NGX_ERROR; + } + + switch (r->connection->local_sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) r->connection->local_sockaddr; + port = ntohs(sin6->sin6_port); + break; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) r->connection->local_sockaddr; + port = ntohs(sin->sin_port); + break; + } + + if (port > 0 && port < 65536) { + v->len = ngx_sprintf(v->data, "%ui", port) - v->data; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_scheme(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ +#if (NGX_HTTP_SSL) + + if (r->connection->ssl) { + v->len = sizeof("https") - 1; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) "https"; + + return NGX_OK; + } + +#endif + + v->len = sizeof("http") - 1; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) "http"; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_https(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ +#if (NGX_HTTP_SSL) + + if (r->connection->ssl) { + v->len = sizeof("on") - 1; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) "on"; + + return NGX_OK; + } + +#endif + + *v = ngx_http_variable_null_value; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_is_args(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + if (r->args.len == 0) { + v->len = 0; + v->data = NULL; + return NGX_OK; + } + + v->len = 1; + v->data = (u_char *) "?"; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_document_root(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ngx_str_t path; + ngx_http_core_loc_conf_t *clcf; + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (clcf->root_lengths == NULL) { + v->len = clcf->root.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = clcf->root.data; + + } else { + if (ngx_http_script_run(r, &path, clcf->root_lengths->elts, 0, + clcf->root_values->elts) + == NULL) + { + return NGX_ERROR; + } + + if (ngx_conf_full_name((ngx_cycle_t *) ngx_cycle, &path, 0) != NGX_OK) { + return NGX_ERROR; + } + + v->len = path.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = path.data; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_realpath_root(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *real; + size_t len; + ngx_str_t path; + ngx_http_core_loc_conf_t *clcf; +#if (NGX_HAVE_MAX_PATH) + u_char buffer[NGX_MAX_PATH]; +#endif + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (clcf->root_lengths == NULL) { + path = clcf->root; + + } else { + if (ngx_http_script_run(r, &path, clcf->root_lengths->elts, 1, + clcf->root_values->elts) + == NULL) + { + return NGX_ERROR; + } + + path.data[path.len - 1] = '\0'; + + if (ngx_conf_full_name((ngx_cycle_t *) ngx_cycle, &path, 0) != NGX_OK) { + return NGX_ERROR; + } + } + +#if (NGX_HAVE_MAX_PATH) + real = buffer; +#else + real = NULL; +#endif + + real = ngx_realpath(path.data, real); + + if (real == NULL) { + ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, + ngx_realpath_n " \"%s\" failed", path.data); + return NGX_ERROR; + } + + len = ngx_strlen(real); + + v->data = ngx_pnalloc(r->pool, len); + if (v->data == NULL) { +#if !(NGX_HAVE_MAX_PATH) + ngx_free(real); +#endif + return NGX_ERROR; + } + + v->len = len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + ngx_memcpy(v->data, real, len); + +#if !(NGX_HAVE_MAX_PATH) + ngx_free(real); +#endif + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_request_filename(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + size_t root; + ngx_str_t path; + + if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) { + return NGX_ERROR; + } + + /* ngx_http_map_uri_to_path() allocates memory for terminating '\0' */ + + v->len = path.len - 1; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = path.data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_server_name(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ngx_http_core_srv_conf_t *cscf; + + cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); + + v->len = cscf->server_name.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = cscf->server_name.data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_request_method(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + if (r->main->method_name.data) { + v->len = r->main->method_name.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = r->main->method_name.data; + + } else { + v->not_found = 1; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_remote_user(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ngx_int_t rc; + + rc = ngx_http_auth_basic_user(r); + + if (rc == NGX_DECLINED) { + v->not_found = 1; + return NGX_OK; + } + + if (rc == NGX_ERROR) { + return NGX_ERROR; + } + + v->len = r->headers_in.user.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = r->headers_in.user.data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_bytes_sent(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%O", r->connection->sent) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_body_bytes_sent(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + off_t sent; + u_char *p; + + sent = r->connection->sent - r->header_size; + + if (sent < 0) { + sent = 0; + } + + p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%O", sent) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_pipe(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + v->data = (u_char *) (r->pipeline ? "p" : "."); + v->len = 1; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_status(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ngx_uint_t status; + + v->data = ngx_pnalloc(r->pool, NGX_INT_T_LEN); + if (v->data == NULL) { + return NGX_ERROR; + } + + if (r->err_status) { + status = r->err_status; + + } else if (r->headers_out.status) { + status = r->headers_out.status; + + } else if (r->http_version == NGX_HTTP_VERSION_9) { + status = 9; + + } else { + status = 0; + } + + v->len = ngx_sprintf(v->data, "%03ui", status) - v->data; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_sent_content_type(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + if (r->headers_out.content_type.len) { + v->len = r->headers_out.content_type.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = r->headers_out.content_type.data; + + } else { + v->not_found = 1; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_sent_content_length(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + if (r->headers_out.content_length) { + v->len = r->headers_out.content_length->value.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = r->headers_out.content_length->value.data; + + return NGX_OK; + } + + if (r->headers_out.content_length_n >= 0) { + p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%O", r->headers_out.content_length_n) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; + } + + v->not_found = 1; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_sent_location(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ngx_str_t name; + + if (r->headers_out.location) { + v->len = r->headers_out.location->value.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = r->headers_out.location->value.data; + + return NGX_OK; + } + + ngx_str_set(&name, "sent_http_location"); + + return ngx_http_variable_unknown_header(v, &name, + &r->headers_out.headers.part, + sizeof("sent_http_") - 1); +} + + +static ngx_int_t +ngx_http_variable_sent_last_modified(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + if (r->headers_out.last_modified) { + v->len = r->headers_out.last_modified->value.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = r->headers_out.last_modified->value.data; + + return NGX_OK; + } + + if (r->headers_out.last_modified_time >= 0) { + p = ngx_pnalloc(r->pool, + sizeof("Last-Modified: Mon, 28 Sep 1970 06:00:00 GMT") - 1); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_http_time(p, r->headers_out.last_modified_time) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; + } + + v->not_found = 1; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_sent_connection(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + size_t len; + char *p; + + if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) { + len = sizeof("upgrade") - 1; + p = "upgrade"; + + } else if (r->keepalive) { + len = sizeof("keep-alive") - 1; + p = "keep-alive"; + + } else { + len = sizeof("close") - 1; + p = "close"; + } + + v->len = len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_sent_keep_alive(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + ngx_http_core_loc_conf_t *clcf; + + if (r->keepalive) { + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (clcf->keepalive_header) { + + p = ngx_pnalloc(r->pool, sizeof("timeout=") - 1 + NGX_TIME_T_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "timeout=%T", clcf->keepalive_header) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; + } + } + + v->not_found = 1; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + if (r->chunked) { + v->len = sizeof("chunked") - 1; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) "chunked"; + + } else { + v->not_found = 1; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_request_completion(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + if (r->request_complete) { + v->len = 2; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) "OK"; + + return NGX_OK; + } + + v->len = 0; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) ""; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_request_body(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + size_t len; + ngx_buf_t *buf; + ngx_chain_t *cl; + + if (r->request_body == NULL + || r->request_body->bufs == NULL + || r->request_body->temp_file) + { + v->not_found = 1; + + return NGX_OK; + } + + cl = r->request_body->bufs; + buf = cl->buf; + + if (cl->next == NULL) { + v->len = buf->last - buf->pos; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = buf->pos; + + return NGX_OK; + } + + len = buf->last - buf->pos; + cl = cl->next; + + for ( /* void */ ; cl; cl = cl->next) { + buf = cl->buf; + len += buf->last - buf->pos; + } + + p = ngx_pnalloc(r->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + + v->data = p; + cl = r->request_body->bufs; + + for ( /* void */ ; cl; cl = cl->next) { + buf = cl->buf; + p = ngx_cpymem(p, buf->pos, buf->last - buf->pos); + } + + v->len = len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_request_body_file(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + if (r->request_body == NULL || r->request_body->temp_file == NULL) { + v->not_found = 1; + + return NGX_OK; + } + + v->len = r->request_body->temp_file->file.name.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = r->request_body->temp_file->file.name.data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_request_length(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%O", r->request_length) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_request_time(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + ngx_time_t *tp; + ngx_msec_int_t ms; + + p = ngx_pnalloc(r->pool, NGX_TIME_T_LEN + 4); + if (p == NULL) { + return NGX_ERROR; + } + + tp = ngx_timeofday(); + + ms = (ngx_msec_int_t) + ((tp->sec - r->start_sec) * 1000 + (tp->msec - r->start_msec)); + ms = ngx_max(ms, 0); + + v->len = ngx_sprintf(p, "%T.%03M", ms / 1000, ms % 1000) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_connection(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + p = ngx_pnalloc(r->pool, NGX_ATOMIC_T_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%uA", r->connection->number) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_connection_requests(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + p = ngx_pnalloc(r->pool, NGX_INT_T_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%ui", r->connection->requests) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_nginx_version(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + v->len = sizeof(NGINX_VERSION) - 1; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) NGINX_VERSION; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_hostname(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + v->len = ngx_cycle->hostname.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = ngx_cycle->hostname.data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_pid(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + p = ngx_pnalloc(r->pool, NGX_INT64_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%P", ngx_pid) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_msec(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + ngx_time_t *tp; + + p = ngx_pnalloc(r->pool, NGX_TIME_T_LEN + 4); + if (p == NULL) { + return NGX_ERROR; + } + + tp = ngx_timeofday(); + + v->len = ngx_sprintf(p, "%T.%03M", tp->sec, tp->msec) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_time_iso8601(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + p = ngx_pnalloc(r->pool, ngx_cached_http_log_iso8601.len); + if (p == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(p, ngx_cached_http_log_iso8601.data, + ngx_cached_http_log_iso8601.len); + + v->len = ngx_cached_http_log_iso8601.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_time_local(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + p = ngx_pnalloc(r->pool, ngx_cached_http_log_time.len); + if (p == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(p, ngx_cached_http_log_time.data, ngx_cached_http_log_time.len); + + v->len = ngx_cached_http_log_time.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +void * +ngx_http_map_find(ngx_http_request_t *r, ngx_http_map_t *map, ngx_str_t *match) +{ + void *value; + u_char *low; + size_t len; + ngx_uint_t key; + + len = match->len; + + if (len) { + low = ngx_pnalloc(r->pool, len); + if (low == NULL) { + return NULL; + } + + } else { + low = NULL; + } + + key = ngx_hash_strlow(low, match->data, len); + + value = ngx_hash_find_combined(&map->hash, key, low, len); + if (value) { + return value; + } + +#if (NGX_PCRE) + + if (len && map->nregex) { + ngx_int_t n; + ngx_uint_t i; + ngx_http_map_regex_t *reg; + + reg = map->regex; + + for (i = 0; i < map->nregex; i++) { + + n = ngx_http_regex_exec(r, reg[i].regex, match); + + if (n == NGX_OK) { + return reg[i].value; + } + + if (n == NGX_DECLINED) { + continue; + } + + /* NGX_ERROR */ + + return NULL; + } + } + +#endif + + return NULL; +} + + +#if (NGX_PCRE) + +static ngx_int_t +ngx_http_variable_not_found(ngx_http_request_t *r, ngx_http_variable_value_t *v, + uintptr_t data) +{ + v->not_found = 1; + return NGX_OK; +} + + +ngx_http_regex_t * +ngx_http_regex_compile(ngx_conf_t *cf, ngx_regex_compile_t *rc) +{ + u_char *p; + size_t size; + ngx_str_t name; + ngx_uint_t i, n; + ngx_http_variable_t *v; + ngx_http_regex_t *re; + ngx_http_regex_variable_t *rv; + ngx_http_core_main_conf_t *cmcf; + + rc->pool = cf->pool; + + if (ngx_regex_compile(rc) != NGX_OK) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc->err); + return NULL; + } + + re = ngx_pcalloc(cf->pool, sizeof(ngx_http_regex_t)); + if (re == NULL) { + return NULL; + } + + re->regex = rc->regex; + re->ncaptures = rc->captures; + + cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); + cmcf->ncaptures = ngx_max(cmcf->ncaptures, re->ncaptures); + + n = (ngx_uint_t) rc->named_captures; + + if (n == 0) { + return re; + } + + rv = ngx_palloc(rc->pool, n * sizeof(ngx_http_regex_variable_t)); + if (rv == NULL) { + return NULL; + } + + re->variables = rv; + re->nvariables = n; + re->name = rc->pattern; + + size = rc->name_size; + p = rc->names; + + for (i = 0; i < n; i++) { + rv[i].capture = 2 * ((p[0] << 8) + p[1]); + + name.data = &p[2]; + name.len = ngx_strlen(name.data); + + v = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE); + if (v == NULL) { + return NULL; + } + + rv[i].index = ngx_http_get_variable_index(cf, &name); + if (rv[i].index == NGX_ERROR) { + return NULL; + } + + v->get_handler = ngx_http_variable_not_found; + + p += size; + } + + return re; +} + + +ngx_int_t +ngx_http_regex_exec(ngx_http_request_t *r, ngx_http_regex_t *re, ngx_str_t *s) +{ + ngx_int_t rc, index; + ngx_uint_t i, n, len; + ngx_http_variable_value_t *vv; + ngx_http_core_main_conf_t *cmcf; + + cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); + + if (re->ncaptures) { + len = cmcf->ncaptures; + + if (r->captures == NULL) { + r->captures = ngx_palloc(r->pool, len * sizeof(int)); + if (r->captures == NULL) { + return NGX_ERROR; + } + } + + } else { + len = 0; + } + + rc = ngx_regex_exec(re->regex, s, r->captures, len); + + if (rc == NGX_REGEX_NO_MATCHED) { + return NGX_DECLINED; + } + + if (rc < 0) { + ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, + ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"", + rc, s, &re->name); + return NGX_ERROR; + } + + for (i = 0; i < re->nvariables; i++) { + + n = re->variables[i].capture; + index = re->variables[i].index; + vv = &r->variables[index]; + + vv->len = r->captures[n + 1] - r->captures[n]; + vv->valid = 1; + vv->no_cacheable = 0; + vv->not_found = 0; + vv->data = &s->data[r->captures[n]]; + +#if (NGX_DEBUG) + { + ngx_http_variable_t *v; + + v = cmcf->variables.elts; + + ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http regex set $%V to \"%*s\"", + &v[index].name, vv->len, vv->data); + } +#endif + } + + r->ncaptures = rc * 2; + r->captures_data = s->data; + + return NGX_OK; +} + +#endif + + +ngx_int_t +ngx_http_variables_add_core_vars(ngx_conf_t *cf) +{ + ngx_int_t rc; + ngx_http_variable_t *cv, *v; + ngx_http_core_main_conf_t *cmcf; + + cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); + + cmcf->variables_keys = ngx_pcalloc(cf->temp_pool, + sizeof(ngx_hash_keys_arrays_t)); + if (cmcf->variables_keys == NULL) { + return NGX_ERROR; + } + + cmcf->variables_keys->pool = cf->pool; + cmcf->variables_keys->temp_pool = cf->pool; + + if (ngx_hash_keys_array_init(cmcf->variables_keys, NGX_HASH_SMALL) + != NGX_OK) + { + return NGX_ERROR; + } + + for (cv = ngx_http_core_variables; cv->name.len; cv++) { + v = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t)); + if (v == NULL) { + return NGX_ERROR; + } + + *v = *cv; + + rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v, + NGX_HASH_READONLY_KEY); + + if (rc == NGX_OK) { + continue; + } + + if (rc == NGX_BUSY) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "conflicting variable name \"%V\"", &v->name); + } + + return NGX_ERROR; + } + + return NGX_OK; +} + + +ngx_int_t +ngx_http_variables_init_vars(ngx_conf_t *cf) +{ + ngx_uint_t i, n; + ngx_hash_key_t *key; + ngx_hash_init_t hash; + ngx_http_variable_t *v, *av; + ngx_http_core_main_conf_t *cmcf; + + /* set the handlers for the indexed http variables */ + + cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); + + v = cmcf->variables.elts; + key = cmcf->variables_keys->keys.elts; + + for (i = 0; i < cmcf->variables.nelts; i++) { + + for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) { + + av = key[n].value; + + if (av->get_handler + && v[i].name.len == key[n].key.len + && ngx_strncmp(v[i].name.data, key[n].key.data, v[i].name.len) + == 0) + { + v[i].get_handler = av->get_handler; + v[i].data = av->data; + + av->flags |= NGX_HTTP_VAR_INDEXED; + v[i].flags = av->flags; + + av->index = i; + + goto next; + } + } + + if (ngx_strncmp(v[i].name.data, "http_", 5) == 0) { + v[i].get_handler = ngx_http_variable_unknown_header_in; + v[i].data = (uintptr_t) &v[i].name; + + continue; + } + + if (ngx_strncmp(v[i].name.data, "sent_http_", 10) == 0) { + v[i].get_handler = ngx_http_variable_unknown_header_out; + v[i].data = (uintptr_t) &v[i].name; + + continue; + } + + if (ngx_strncmp(v[i].name.data, "upstream_http_", 14) == 0) { + v[i].get_handler = ngx_http_upstream_header_variable; + v[i].data = (uintptr_t) &v[i].name; + v[i].flags = NGX_HTTP_VAR_NOCACHEABLE; + + continue; + } + + if (ngx_strncmp(v[i].name.data, "cookie_", 7) == 0) { + v[i].get_handler = ngx_http_variable_cookie; + v[i].data = (uintptr_t) &v[i].name; + + continue; + } + + if (ngx_strncmp(v[i].name.data, "arg_", 4) == 0) { + v[i].get_handler = ngx_http_variable_argument; + v[i].data = (uintptr_t) &v[i].name; + v[i].flags = NGX_HTTP_VAR_NOCACHEABLE; + + continue; + } + + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "unknown \"%V\" variable", &v[i].name); + + return NGX_ERROR; + + next: + continue; + } + + + for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) { + av = key[n].value; + + if (av->flags & NGX_HTTP_VAR_NOHASH) { + key[n].key.data = NULL; + } + } + + + hash.hash = &cmcf->variables_hash; + hash.key = ngx_hash_key; + hash.max_size = cmcf->variables_hash_max_size; + hash.bucket_size = cmcf->variables_hash_bucket_size; + hash.name = "variables_hash"; + hash.pool = cf->pool; + hash.temp_pool = NULL; + + if (ngx_hash_init(&hash, cmcf->variables_keys->keys.elts, + cmcf->variables_keys->keys.nelts) + != NGX_OK) + { + return NGX_ERROR; + } + + cmcf->variables_keys = NULL; + + return NGX_OK; +} diff --git a/release/src/router/nginx/src/http/ngx_http_variables.h b/release/src/router/nginx/src/http/ngx_http_variables.h new file mode 100644 index 0000000000..829fab31e6 --- /dev/null +++ b/release/src/router/nginx/src/http/ngx_http_variables.h @@ -0,0 +1,112 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_HTTP_VARIABLES_H_INCLUDED_ +#define _NGX_HTTP_VARIABLES_H_INCLUDED_ + + +#include +#include +#include + + +typedef ngx_variable_value_t ngx_http_variable_value_t; + +#define ngx_http_variable(v) { sizeof(v) - 1, 1, 0, 0, 0, (u_char *) v } + +typedef struct ngx_http_variable_s ngx_http_variable_t; + +typedef void (*ngx_http_set_variable_pt) (ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +typedef ngx_int_t (*ngx_http_get_variable_pt) (ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); + + +#define NGX_HTTP_VAR_CHANGEABLE 1 +#define NGX_HTTP_VAR_NOCACHEABLE 2 +#define NGX_HTTP_VAR_INDEXED 4 +#define NGX_HTTP_VAR_NOHASH 8 + + +struct ngx_http_variable_s { + ngx_str_t name; /* must be first to build the hash */ + ngx_http_set_variable_pt set_handler; + ngx_http_get_variable_pt get_handler; + uintptr_t data; + ngx_uint_t flags; + ngx_uint_t index; +}; + + +ngx_http_variable_t *ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name, + ngx_uint_t flags); +ngx_int_t ngx_http_get_variable_index(ngx_conf_t *cf, ngx_str_t *name); +ngx_http_variable_value_t *ngx_http_get_indexed_variable(ngx_http_request_t *r, + ngx_uint_t index); +ngx_http_variable_value_t *ngx_http_get_flushed_variable(ngx_http_request_t *r, + ngx_uint_t index); + +ngx_http_variable_value_t *ngx_http_get_variable(ngx_http_request_t *r, + ngx_str_t *name, ngx_uint_t key); + +ngx_int_t ngx_http_variable_unknown_header(ngx_http_variable_value_t *v, + ngx_str_t *var, ngx_list_part_t *part, size_t prefix); + + +#if (NGX_PCRE) + +typedef struct { + ngx_uint_t capture; + ngx_int_t index; +} ngx_http_regex_variable_t; + + +typedef struct { + ngx_regex_t *regex; + ngx_uint_t ncaptures; + ngx_http_regex_variable_t *variables; + ngx_uint_t nvariables; + ngx_str_t name; +} ngx_http_regex_t; + + +typedef struct { + ngx_http_regex_t *regex; + void *value; +} ngx_http_map_regex_t; + + +ngx_http_regex_t *ngx_http_regex_compile(ngx_conf_t *cf, + ngx_regex_compile_t *rc); +ngx_int_t ngx_http_regex_exec(ngx_http_request_t *r, ngx_http_regex_t *re, + ngx_str_t *s); + +#endif + + +typedef struct { + ngx_hash_combined_t hash; +#if (NGX_PCRE) + ngx_http_map_regex_t *regex; + ngx_uint_t nregex; +#endif +} ngx_http_map_t; + + +void *ngx_http_map_find(ngx_http_request_t *r, ngx_http_map_t *map, + ngx_str_t *match); + + +ngx_int_t ngx_http_variables_add_core_vars(ngx_conf_t *cf); +ngx_int_t ngx_http_variables_init_vars(ngx_conf_t *cf); + + +extern ngx_http_variable_value_t ngx_http_variable_null_value; +extern ngx_http_variable_value_t ngx_http_variable_true_value; + + +#endif /* _NGX_HTTP_VARIABLES_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/http/ngx_http_write_filter_module.c b/release/src/router/nginx/src/http/ngx_http_write_filter_module.c new file mode 100644 index 0000000000..5594c7faaa --- /dev/null +++ b/release/src/router/nginx/src/http/ngx_http_write_filter_module.c @@ -0,0 +1,311 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +static ngx_int_t ngx_http_write_filter_init(ngx_conf_t *cf); + + +static ngx_http_module_t ngx_http_write_filter_module_ctx = { + NULL, /* preconfiguration */ + ngx_http_write_filter_init, /* postconfiguration */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + + NULL, /* create location configuration */ + NULL, /* merge location configuration */ +}; + + +ngx_module_t ngx_http_write_filter_module = { + NGX_MODULE_V1, + &ngx_http_write_filter_module_ctx, /* module context */ + NULL, /* module directives */ + NGX_HTTP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +ngx_int_t +ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in) +{ + off_t size, sent, nsent, limit; + ngx_uint_t last, flush; + ngx_msec_t delay; + ngx_chain_t *cl, *ln, **ll, *chain; + ngx_connection_t *c; + ngx_http_core_loc_conf_t *clcf; + + c = r->connection; + + if (c->error) { + return NGX_ERROR; + } + + size = 0; + flush = 0; + last = 0; + ll = &r->out; + + /* find the size, the flush point and the last link of the saved chain */ + + for (cl = r->out; cl; cl = cl->next) { + ll = &cl->next; + + ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, + "write old buf t:%d f:%d %p, pos %p, size: %z " + "file: %O, size: %z", + cl->buf->temporary, cl->buf->in_file, + cl->buf->start, cl->buf->pos, + cl->buf->last - cl->buf->pos, + cl->buf->file_pos, + cl->buf->file_last - cl->buf->file_pos); + +#if 1 + if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { + ngx_log_error(NGX_LOG_ALERT, c->log, 0, + "zero size buf in writer " + "t:%d r:%d f:%d %p %p-%p %p %O-%O", + cl->buf->temporary, + cl->buf->recycled, + cl->buf->in_file, + cl->buf->start, + cl->buf->pos, + cl->buf->last, + cl->buf->file, + cl->buf->file_pos, + cl->buf->file_last); + + ngx_debug_point(); + return NGX_ERROR; + } +#endif + + size += ngx_buf_size(cl->buf); + + if (cl->buf->flush || cl->buf->recycled) { + flush = 1; + } + + if (cl->buf->last_buf) { + last = 1; + } + } + + /* add the new chain to the existent one */ + + for (ln = in; ln; ln = ln->next) { + cl = ngx_alloc_chain_link(r->pool); + if (cl == NULL) { + return NGX_ERROR; + } + + cl->buf = ln->buf; + *ll = cl; + ll = &cl->next; + + ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, + "write new buf t:%d f:%d %p, pos %p, size: %z " + "file: %O, size: %z", + cl->buf->temporary, cl->buf->in_file, + cl->buf->start, cl->buf->pos, + cl->buf->last - cl->buf->pos, + cl->buf->file_pos, + cl->buf->file_last - cl->buf->file_pos); + +#if 1 + if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { + ngx_log_error(NGX_LOG_ALERT, c->log, 0, + "zero size buf in writer " + "t:%d r:%d f:%d %p %p-%p %p %O-%O", + cl->buf->temporary, + cl->buf->recycled, + cl->buf->in_file, + cl->buf->start, + cl->buf->pos, + cl->buf->last, + cl->buf->file, + cl->buf->file_pos, + cl->buf->file_last); + + ngx_debug_point(); + return NGX_ERROR; + } +#endif + + size += ngx_buf_size(cl->buf); + + if (cl->buf->flush || cl->buf->recycled) { + flush = 1; + } + + if (cl->buf->last_buf) { + last = 1; + } + } + + *ll = NULL; + + ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http write filter: l:%d f:%d s:%O", last, flush, size); + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + /* + * avoid the output if there are no last buf, no flush point, + * there are the incoming bufs and the size of all bufs + * is smaller than "postpone_output" directive + */ + + if (!last && !flush && in && size < (off_t) clcf->postpone_output) { + return NGX_OK; + } + + if (c->write->delayed) { + c->buffered |= NGX_HTTP_WRITE_BUFFERED; + return NGX_AGAIN; + } + + if (size == 0 && !(c->buffered & NGX_LOWLEVEL_BUFFERED)) { + if (last || flush) { + for (cl = r->out; cl; /* void */) { + ln = cl; + cl = cl->next; + ngx_free_chain(r->pool, ln); + } + + r->out = NULL; + c->buffered &= ~NGX_HTTP_WRITE_BUFFERED; + + return NGX_OK; + } + + ngx_log_error(NGX_LOG_ALERT, c->log, 0, + "the http output chain is empty"); + + ngx_debug_point(); + + return NGX_ERROR; + } + + if (r->limit_rate) { + limit = (off_t) r->limit_rate * (ngx_time() - r->start_sec + 1) + - (c->sent - clcf->limit_rate_after); + + if (limit <= 0) { + c->write->delayed = 1; + ngx_add_timer(c->write, + (ngx_msec_t) (- limit * 1000 / r->limit_rate + 1)); + + c->buffered |= NGX_HTTP_WRITE_BUFFERED; + + return NGX_AGAIN; + } + + if (clcf->sendfile_max_chunk + && (off_t) clcf->sendfile_max_chunk < limit) + { + limit = clcf->sendfile_max_chunk; + } + + } else { + limit = clcf->sendfile_max_chunk; + } + + sent = c->sent; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http write filter limit %O", limit); + + chain = c->send_chain(c, r->out, limit); + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http write filter %p", chain); + + if (chain == NGX_CHAIN_ERROR) { + c->error = 1; + return NGX_ERROR; + } + + if (r->limit_rate) { + + nsent = c->sent; + + if (clcf->limit_rate_after) { + + sent -= clcf->limit_rate_after; + if (sent < 0) { + sent = 0; + } + + nsent -= clcf->limit_rate_after; + if (nsent < 0) { + nsent = 0; + } + } + + delay = (ngx_msec_t) ((nsent - sent) * 1000 / r->limit_rate); + + if (delay > 0) { + limit = 0; + c->write->delayed = 1; + ngx_add_timer(c->write, delay); + } + } + + if (limit + && c->write->ready + && c->sent - sent >= limit - (off_t) (2 * ngx_pagesize)) + { + c->write->delayed = 1; + ngx_add_timer(c->write, 1); + } + + for (cl = r->out; cl && cl != chain; /* void */) { + ln = cl; + cl = cl->next; + ngx_free_chain(r->pool, ln); + } + + r->out = chain; + + if (chain) { + c->buffered |= NGX_HTTP_WRITE_BUFFERED; + return NGX_AGAIN; + } + + c->buffered &= ~NGX_HTTP_WRITE_BUFFERED; + + if ((c->buffered & NGX_LOWLEVEL_BUFFERED) && r->postponed == NULL) { + return NGX_AGAIN; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_write_filter_init(ngx_conf_t *cf) +{ + ngx_http_top_body_filter = ngx_http_write_filter; + + return NGX_OK; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail.c b/release/src/router/nginx/src/mail/ngx_mail.c new file mode 100644 index 0000000000..3812e15179 --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail.c @@ -0,0 +1,566 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include + + +static char *ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); +static ngx_int_t ngx_mail_add_ports(ngx_conf_t *cf, ngx_array_t *ports, + ngx_mail_listen_t *listen); +static char *ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports); +static ngx_int_t ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport, + ngx_mail_conf_addr_t *addr); +#if (NGX_HAVE_INET6) +static ngx_int_t ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport, + ngx_mail_conf_addr_t *addr); +#endif +static ngx_int_t ngx_mail_cmp_conf_addrs(const void *one, const void *two); + + +ngx_uint_t ngx_mail_max_module; + + +static ngx_command_t ngx_mail_commands[] = { + + { ngx_string("mail"), + NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, + ngx_mail_block, + 0, + 0, + NULL }, + + { ngx_string("imap"), + NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, + ngx_mail_block, + 0, + 0, + NULL }, + + ngx_null_command +}; + + +static ngx_core_module_t ngx_mail_module_ctx = { + ngx_string("mail"), + NULL, + NULL +}; + + +ngx_module_t ngx_mail_module = { + NGX_MODULE_V1, + &ngx_mail_module_ctx, /* module context */ + ngx_mail_commands, /* module directives */ + NGX_CORE_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static char * +ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *rv; + ngx_uint_t i, m, mi, s; + ngx_conf_t pcf; + ngx_array_t ports; + ngx_mail_listen_t *listen; + ngx_mail_module_t *module; + ngx_mail_conf_ctx_t *ctx; + ngx_mail_core_srv_conf_t **cscfp; + ngx_mail_core_main_conf_t *cmcf; + + if (cmd->name.data[0] == 'i') { + ngx_conf_log_error(NGX_LOG_WARN, cf, 0, + "the \"imap\" directive is deprecated, " + "use the \"mail\" directive instead"); + } + + /* the main mail context */ + + ctx = ngx_pcalloc(cf->pool, sizeof(ngx_mail_conf_ctx_t)); + if (ctx == NULL) { + return NGX_CONF_ERROR; + } + + *(ngx_mail_conf_ctx_t **) conf = ctx; + + /* count the number of the http modules and set up their indices */ + + ngx_mail_max_module = 0; + for (m = 0; ngx_modules[m]; m++) { + if (ngx_modules[m]->type != NGX_MAIL_MODULE) { + continue; + } + + ngx_modules[m]->ctx_index = ngx_mail_max_module++; + } + + + /* the mail main_conf context, it is the same in the all mail contexts */ + + ctx->main_conf = ngx_pcalloc(cf->pool, + sizeof(void *) * ngx_mail_max_module); + if (ctx->main_conf == NULL) { + return NGX_CONF_ERROR; + } + + + /* + * the mail null srv_conf context, it is used to merge + * the server{}s' srv_conf's + */ + + ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_mail_max_module); + if (ctx->srv_conf == NULL) { + return NGX_CONF_ERROR; + } + + + /* + * create the main_conf's, the null srv_conf's, and the null loc_conf's + * of the all mail modules + */ + + for (m = 0; ngx_modules[m]; m++) { + if (ngx_modules[m]->type != NGX_MAIL_MODULE) { + continue; + } + + module = ngx_modules[m]->ctx; + mi = ngx_modules[m]->ctx_index; + + if (module->create_main_conf) { + ctx->main_conf[mi] = module->create_main_conf(cf); + if (ctx->main_conf[mi] == NULL) { + return NGX_CONF_ERROR; + } + } + + if (module->create_srv_conf) { + ctx->srv_conf[mi] = module->create_srv_conf(cf); + if (ctx->srv_conf[mi] == NULL) { + return NGX_CONF_ERROR; + } + } + } + + + /* parse inside the mail{} block */ + + pcf = *cf; + cf->ctx = ctx; + + cf->module_type = NGX_MAIL_MODULE; + cf->cmd_type = NGX_MAIL_MAIN_CONF; + rv = ngx_conf_parse(cf, NULL); + + if (rv != NGX_CONF_OK) { + *cf = pcf; + return rv; + } + + + /* init mail{} main_conf's, merge the server{}s' srv_conf's */ + + cmcf = ctx->main_conf[ngx_mail_core_module.ctx_index]; + cscfp = cmcf->servers.elts; + + for (m = 0; ngx_modules[m]; m++) { + if (ngx_modules[m]->type != NGX_MAIL_MODULE) { + continue; + } + + module = ngx_modules[m]->ctx; + mi = ngx_modules[m]->ctx_index; + + /* init mail{} main_conf's */ + + cf->ctx = ctx; + + if (module->init_main_conf) { + rv = module->init_main_conf(cf, ctx->main_conf[mi]); + if (rv != NGX_CONF_OK) { + *cf = pcf; + return rv; + } + } + + for (s = 0; s < cmcf->servers.nelts; s++) { + + /* merge the server{}s' srv_conf's */ + + cf->ctx = cscfp[s]->ctx; + + if (module->merge_srv_conf) { + rv = module->merge_srv_conf(cf, + ctx->srv_conf[mi], + cscfp[s]->ctx->srv_conf[mi]); + if (rv != NGX_CONF_OK) { + *cf = pcf; + return rv; + } + } + } + } + + *cf = pcf; + + + if (ngx_array_init(&ports, cf->temp_pool, 4, sizeof(ngx_mail_conf_port_t)) + != NGX_OK) + { + return NGX_CONF_ERROR; + } + + listen = cmcf->listen.elts; + + for (i = 0; i < cmcf->listen.nelts; i++) { + if (ngx_mail_add_ports(cf, &ports, &listen[i]) != NGX_OK) { + return NGX_CONF_ERROR; + } + } + + return ngx_mail_optimize_servers(cf, &ports); +} + + +static ngx_int_t +ngx_mail_add_ports(ngx_conf_t *cf, ngx_array_t *ports, + ngx_mail_listen_t *listen) +{ + in_port_t p; + ngx_uint_t i; + struct sockaddr *sa; + struct sockaddr_in *sin; + ngx_mail_conf_port_t *port; + ngx_mail_conf_addr_t *addr; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; +#endif + + sa = (struct sockaddr *) &listen->sockaddr; + + switch (sa->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) sa; + p = sin6->sin6_port; + break; +#endif + +#if (NGX_HAVE_UNIX_DOMAIN) + case AF_UNIX: + p = 0; + break; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) sa; + p = sin->sin_port; + break; + } + + port = ports->elts; + for (i = 0; i < ports->nelts; i++) { + if (p == port[i].port && sa->sa_family == port[i].family) { + + /* a port is already in the port list */ + + port = &port[i]; + goto found; + } + } + + /* add a port to the port list */ + + port = ngx_array_push(ports); + if (port == NULL) { + return NGX_ERROR; + } + + port->family = sa->sa_family; + port->port = p; + + if (ngx_array_init(&port->addrs, cf->temp_pool, 2, + sizeof(ngx_mail_conf_addr_t)) + != NGX_OK) + { + return NGX_ERROR; + } + +found: + + addr = ngx_array_push(&port->addrs); + if (addr == NULL) { + return NGX_ERROR; + } + + addr->sockaddr = (struct sockaddr *) &listen->sockaddr; + addr->socklen = listen->socklen; + addr->ctx = listen->ctx; + addr->bind = listen->bind; + addr->wildcard = listen->wildcard; + addr->so_keepalive = listen->so_keepalive; +#if (NGX_HAVE_KEEPALIVE_TUNABLE) + addr->tcp_keepidle = listen->tcp_keepidle; + addr->tcp_keepintvl = listen->tcp_keepintvl; + addr->tcp_keepcnt = listen->tcp_keepcnt; +#endif +#if (NGX_MAIL_SSL) + addr->ssl = listen->ssl; +#endif +#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) + addr->ipv6only = listen->ipv6only; +#endif + + return NGX_OK; +} + + +static char * +ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports) +{ + ngx_uint_t i, p, last, bind_wildcard; + ngx_listening_t *ls; + ngx_mail_port_t *mport; + ngx_mail_conf_port_t *port; + ngx_mail_conf_addr_t *addr; + + port = ports->elts; + for (p = 0; p < ports->nelts; p++) { + + ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts, + sizeof(ngx_mail_conf_addr_t), ngx_mail_cmp_conf_addrs); + + addr = port[p].addrs.elts; + last = port[p].addrs.nelts; + + /* + * if there is the binding to the "*:port" then we need to bind() + * to the "*:port" only and ignore the other bindings + */ + + if (addr[last - 1].wildcard) { + addr[last - 1].bind = 1; + bind_wildcard = 1; + + } else { + bind_wildcard = 0; + } + + i = 0; + + while (i < last) { + + if (bind_wildcard && !addr[i].bind) { + i++; + continue; + } + + ls = ngx_create_listening(cf, addr[i].sockaddr, addr[i].socklen); + if (ls == NULL) { + return NGX_CONF_ERROR; + } + + ls->addr_ntop = 1; + ls->handler = ngx_mail_init_connection; + ls->pool_size = 256; + + /* TODO: error_log directive */ + ls->logp = &cf->cycle->new_log; + ls->log.data = &ls->addr_text; + ls->log.handler = ngx_accept_log_error; + + ls->keepalive = addr[i].so_keepalive; +#if (NGX_HAVE_KEEPALIVE_TUNABLE) + ls->keepidle = addr[i].tcp_keepidle; + ls->keepintvl = addr[i].tcp_keepintvl; + ls->keepcnt = addr[i].tcp_keepcnt; +#endif + +#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) + ls->ipv6only = addr[i].ipv6only; +#endif + + mport = ngx_palloc(cf->pool, sizeof(ngx_mail_port_t)); + if (mport == NULL) { + return NGX_CONF_ERROR; + } + + ls->servers = mport; + + if (i == last - 1) { + mport->naddrs = last; + + } else { + mport->naddrs = 1; + i = 0; + } + + switch (ls->sockaddr->sa_family) { +#if (NGX_HAVE_INET6) + case AF_INET6: + if (ngx_mail_add_addrs6(cf, mport, addr) != NGX_OK) { + return NGX_CONF_ERROR; + } + break; +#endif + default: /* AF_INET */ + if (ngx_mail_add_addrs(cf, mport, addr) != NGX_OK) { + return NGX_CONF_ERROR; + } + break; + } + + addr++; + last--; + } + } + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport, + ngx_mail_conf_addr_t *addr) +{ + u_char *p; + size_t len; + ngx_uint_t i; + ngx_mail_in_addr_t *addrs; + struct sockaddr_in *sin; + u_char buf[NGX_SOCKADDR_STRLEN]; + + mport->addrs = ngx_pcalloc(cf->pool, + mport->naddrs * sizeof(ngx_mail_in_addr_t)); + if (mport->addrs == NULL) { + return NGX_ERROR; + } + + addrs = mport->addrs; + + for (i = 0; i < mport->naddrs; i++) { + + sin = (struct sockaddr_in *) addr[i].sockaddr; + addrs[i].addr = sin->sin_addr.s_addr; + + addrs[i].conf.ctx = addr[i].ctx; +#if (NGX_MAIL_SSL) + addrs[i].conf.ssl = addr[i].ssl; +#endif + + len = ngx_sock_ntop(addr[i].sockaddr, buf, NGX_SOCKADDR_STRLEN, 1); + + p = ngx_pnalloc(cf->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(p, buf, len); + + addrs[i].conf.addr_text.len = len; + addrs[i].conf.addr_text.data = p; + } + + return NGX_OK; +} + + +#if (NGX_HAVE_INET6) + +static ngx_int_t +ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport, + ngx_mail_conf_addr_t *addr) +{ + u_char *p; + size_t len; + ngx_uint_t i; + ngx_mail_in6_addr_t *addrs6; + struct sockaddr_in6 *sin6; + u_char buf[NGX_SOCKADDR_STRLEN]; + + mport->addrs = ngx_pcalloc(cf->pool, + mport->naddrs * sizeof(ngx_mail_in6_addr_t)); + if (mport->addrs == NULL) { + return NGX_ERROR; + } + + addrs6 = mport->addrs; + + for (i = 0; i < mport->naddrs; i++) { + + sin6 = (struct sockaddr_in6 *) addr[i].sockaddr; + addrs6[i].addr6 = sin6->sin6_addr; + + addrs6[i].conf.ctx = addr[i].ctx; +#if (NGX_MAIL_SSL) + addrs6[i].conf.ssl = addr[i].ssl; +#endif + + len = ngx_sock_ntop(addr[i].sockaddr, buf, NGX_SOCKADDR_STRLEN, 1); + + p = ngx_pnalloc(cf->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(p, buf, len); + + addrs6[i].conf.addr_text.len = len; + addrs6[i].conf.addr_text.data = p; + } + + return NGX_OK; +} + +#endif + + +static ngx_int_t +ngx_mail_cmp_conf_addrs(const void *one, const void *two) +{ + ngx_mail_conf_addr_t *first, *second; + + first = (ngx_mail_conf_addr_t *) one; + second = (ngx_mail_conf_addr_t *) two; + + if (first->wildcard) { + /* a wildcard must be the last resort, shift it to the end */ + return 1; + } + + if (second->wildcard) { + /* a wildcard must be the last resort, shift it to the end */ + return -1; + } + + if (first->bind && !second->bind) { + /* shift explicit bind()ed addresses to the start */ + return -1; + } + + if (!first->bind && second->bind) { + /* shift explicit bind()ed addresses to the start */ + return 1; + } + + /* do not sort by default */ + + return 0; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail.h b/release/src/router/nginx/src/mail/ngx_mail.h new file mode 100644 index 0000000000..ccdfb8c6f1 --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail.h @@ -0,0 +1,419 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_MAIL_H_INCLUDED_ +#define _NGX_MAIL_H_INCLUDED_ + + +#include +#include +#include +#include + +#if (NGX_MAIL_SSL) +#include +#endif + + + +typedef struct { + void **main_conf; + void **srv_conf; +} ngx_mail_conf_ctx_t; + + +typedef struct { + u_char sockaddr[NGX_SOCKADDRLEN]; + socklen_t socklen; + + /* server ctx */ + ngx_mail_conf_ctx_t *ctx; + + unsigned bind:1; + unsigned wildcard:1; +#if (NGX_MAIL_SSL) + unsigned ssl:1; +#endif +#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) + unsigned ipv6only:1; +#endif + unsigned so_keepalive:2; +#if (NGX_HAVE_KEEPALIVE_TUNABLE) + int tcp_keepidle; + int tcp_keepintvl; + int tcp_keepcnt; +#endif +} ngx_mail_listen_t; + + +typedef struct { + ngx_mail_conf_ctx_t *ctx; + ngx_str_t addr_text; +#if (NGX_MAIL_SSL) + ngx_uint_t ssl; /* unsigned ssl:1; */ +#endif +} ngx_mail_addr_conf_t; + +typedef struct { + in_addr_t addr; + ngx_mail_addr_conf_t conf; +} ngx_mail_in_addr_t; + + +#if (NGX_HAVE_INET6) + +typedef struct { + struct in6_addr addr6; + ngx_mail_addr_conf_t conf; +} ngx_mail_in6_addr_t; + +#endif + + +typedef struct { + /* ngx_mail_in_addr_t or ngx_mail_in6_addr_t */ + void *addrs; + ngx_uint_t naddrs; +} ngx_mail_port_t; + + +typedef struct { + int family; + in_port_t port; + ngx_array_t addrs; /* array of ngx_mail_conf_addr_t */ +} ngx_mail_conf_port_t; + + +typedef struct { + struct sockaddr *sockaddr; + socklen_t socklen; + + ngx_mail_conf_ctx_t *ctx; + + unsigned bind:1; + unsigned wildcard:1; +#if (NGX_MAIL_SSL) + unsigned ssl:1; +#endif +#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) + unsigned ipv6only:1; +#endif + unsigned so_keepalive:2; +#if (NGX_HAVE_KEEPALIVE_TUNABLE) + int tcp_keepidle; + int tcp_keepintvl; + int tcp_keepcnt; +#endif +} ngx_mail_conf_addr_t; + + +typedef struct { + ngx_array_t servers; /* ngx_mail_core_srv_conf_t */ + ngx_array_t listen; /* ngx_mail_listen_t */ +} ngx_mail_core_main_conf_t; + + +#define NGX_MAIL_POP3_PROTOCOL 0 +#define NGX_MAIL_IMAP_PROTOCOL 1 +#define NGX_MAIL_SMTP_PROTOCOL 2 + + +typedef struct ngx_mail_protocol_s ngx_mail_protocol_t; + + +typedef struct { + ngx_mail_protocol_t *protocol; + + ngx_msec_t timeout; + ngx_msec_t resolver_timeout; + + ngx_flag_t so_keepalive; + + ngx_str_t server_name; + + u_char *file_name; + ngx_int_t line; + + ngx_resolver_t *resolver; + + /* server ctx */ + ngx_mail_conf_ctx_t *ctx; +} ngx_mail_core_srv_conf_t; + + +typedef enum { + ngx_pop3_start = 0, + ngx_pop3_user, + ngx_pop3_passwd, + ngx_pop3_auth_login_username, + ngx_pop3_auth_login_password, + ngx_pop3_auth_plain, + ngx_pop3_auth_cram_md5 +} ngx_pop3_state_e; + + +typedef enum { + ngx_imap_start = 0, + ngx_imap_auth_login_username, + ngx_imap_auth_login_password, + ngx_imap_auth_plain, + ngx_imap_auth_cram_md5, + ngx_imap_login, + ngx_imap_user, + ngx_imap_passwd +} ngx_imap_state_e; + + +typedef enum { + ngx_smtp_start = 0, + ngx_smtp_auth_login_username, + ngx_smtp_auth_login_password, + ngx_smtp_auth_plain, + ngx_smtp_auth_cram_md5, + ngx_smtp_helo, + ngx_smtp_helo_xclient, + ngx_smtp_helo_from, + ngx_smtp_xclient, + ngx_smtp_xclient_from, + ngx_smtp_xclient_helo, + ngx_smtp_from, + ngx_smtp_to +} ngx_smtp_state_e; + + +typedef struct { + ngx_peer_connection_t upstream; + ngx_buf_t *buffer; +} ngx_mail_proxy_ctx_t; + + +typedef struct { + uint32_t signature; /* "MAIL" */ + + ngx_connection_t *connection; + + ngx_str_t out; + ngx_buf_t *buffer; + + void **ctx; + void **main_conf; + void **srv_conf; + + ngx_resolver_ctx_t *resolver_ctx; + + ngx_mail_proxy_ctx_t *proxy; + + ngx_uint_t mail_state; + + unsigned protocol:3; + unsigned blocked:1; + unsigned quit:1; + unsigned quoted:1; + unsigned backslash:1; + unsigned no_sync_literal:1; + unsigned starttls:1; + unsigned esmtp:1; + unsigned auth_method:3; + unsigned auth_wait:1; + + ngx_str_t login; + ngx_str_t passwd; + + ngx_str_t salt; + ngx_str_t tag; + ngx_str_t tagged_line; + ngx_str_t text; + + ngx_str_t *addr_text; + ngx_str_t host; + ngx_str_t smtp_helo; + ngx_str_t smtp_from; + ngx_str_t smtp_to; + + ngx_uint_t command; + ngx_array_t args; + + ngx_uint_t login_attempt; + + /* used to parse POP3/IMAP/SMTP command */ + + ngx_uint_t state; + u_char *cmd_start; + u_char *arg_start; + u_char *arg_end; + ngx_uint_t literal_len; +} ngx_mail_session_t; + + +typedef struct { + ngx_str_t *client; + ngx_mail_session_t *session; +} ngx_mail_log_ctx_t; + + +#define NGX_POP3_USER 1 +#define NGX_POP3_PASS 2 +#define NGX_POP3_CAPA 3 +#define NGX_POP3_QUIT 4 +#define NGX_POP3_NOOP 5 +#define NGX_POP3_STLS 6 +#define NGX_POP3_APOP 7 +#define NGX_POP3_AUTH 8 +#define NGX_POP3_STAT 9 +#define NGX_POP3_LIST 10 +#define NGX_POP3_RETR 11 +#define NGX_POP3_DELE 12 +#define NGX_POP3_RSET 13 +#define NGX_POP3_TOP 14 +#define NGX_POP3_UIDL 15 + + +#define NGX_IMAP_LOGIN 1 +#define NGX_IMAP_LOGOUT 2 +#define NGX_IMAP_CAPABILITY 3 +#define NGX_IMAP_NOOP 4 +#define NGX_IMAP_STARTTLS 5 + +#define NGX_IMAP_NEXT 6 + +#define NGX_IMAP_AUTHENTICATE 7 + + +#define NGX_SMTP_HELO 1 +#define NGX_SMTP_EHLO 2 +#define NGX_SMTP_AUTH 3 +#define NGX_SMTP_QUIT 4 +#define NGX_SMTP_NOOP 5 +#define NGX_SMTP_MAIL 6 +#define NGX_SMTP_RSET 7 +#define NGX_SMTP_RCPT 8 +#define NGX_SMTP_DATA 9 +#define NGX_SMTP_VRFY 10 +#define NGX_SMTP_EXPN 11 +#define NGX_SMTP_HELP 12 +#define NGX_SMTP_STARTTLS 13 + + +#define NGX_MAIL_AUTH_PLAIN 0 +#define NGX_MAIL_AUTH_LOGIN 1 +#define NGX_MAIL_AUTH_LOGIN_USERNAME 2 +#define NGX_MAIL_AUTH_APOP 3 +#define NGX_MAIL_AUTH_CRAM_MD5 4 +#define NGX_MAIL_AUTH_NONE 5 + + +#define NGX_MAIL_AUTH_PLAIN_ENABLED 0x0002 +#define NGX_MAIL_AUTH_LOGIN_ENABLED 0x0004 +#define NGX_MAIL_AUTH_APOP_ENABLED 0x0008 +#define NGX_MAIL_AUTH_CRAM_MD5_ENABLED 0x0010 +#define NGX_MAIL_AUTH_NONE_ENABLED 0x0020 + + +#define NGX_MAIL_PARSE_INVALID_COMMAND 20 + + +typedef void (*ngx_mail_init_session_pt)(ngx_mail_session_t *s, + ngx_connection_t *c); +typedef void (*ngx_mail_init_protocol_pt)(ngx_event_t *rev); +typedef void (*ngx_mail_auth_state_pt)(ngx_event_t *rev); +typedef ngx_int_t (*ngx_mail_parse_command_pt)(ngx_mail_session_t *s); + + +struct ngx_mail_protocol_s { + ngx_str_t name; + in_port_t port[4]; + ngx_uint_t type; + + ngx_mail_init_session_pt init_session; + ngx_mail_init_protocol_pt init_protocol; + ngx_mail_parse_command_pt parse_command; + ngx_mail_auth_state_pt auth_state; + + ngx_str_t internal_server_error; +}; + + +typedef struct { + ngx_mail_protocol_t *protocol; + + void *(*create_main_conf)(ngx_conf_t *cf); + char *(*init_main_conf)(ngx_conf_t *cf, void *conf); + + void *(*create_srv_conf)(ngx_conf_t *cf); + char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, + void *conf); +} ngx_mail_module_t; + + +#define NGX_MAIL_MODULE 0x4C49414D /* "MAIL" */ + +#define NGX_MAIL_MAIN_CONF 0x02000000 +#define NGX_MAIL_SRV_CONF 0x04000000 + + +#define NGX_MAIL_MAIN_CONF_OFFSET offsetof(ngx_mail_conf_ctx_t, main_conf) +#define NGX_MAIL_SRV_CONF_OFFSET offsetof(ngx_mail_conf_ctx_t, srv_conf) + + +#define ngx_mail_get_module_ctx(s, module) (s)->ctx[module.ctx_index] +#define ngx_mail_set_ctx(s, c, module) s->ctx[module.ctx_index] = c; +#define ngx_mail_delete_ctx(s, module) s->ctx[module.ctx_index] = NULL; + + +#define ngx_mail_get_module_main_conf(s, module) \ + (s)->main_conf[module.ctx_index] +#define ngx_mail_get_module_srv_conf(s, module) (s)->srv_conf[module.ctx_index] + +#define ngx_mail_conf_get_module_main_conf(cf, module) \ + ((ngx_mail_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index] +#define ngx_mail_conf_get_module_srv_conf(cf, module) \ + ((ngx_mail_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index] + + +#if (NGX_MAIL_SSL) +void ngx_mail_starttls_handler(ngx_event_t *rev); +ngx_int_t ngx_mail_starttls_only(ngx_mail_session_t *s, ngx_connection_t *c); +#endif + + +void ngx_mail_init_connection(ngx_connection_t *c); + +ngx_int_t ngx_mail_salt(ngx_mail_session_t *s, ngx_connection_t *c, + ngx_mail_core_srv_conf_t *cscf); +ngx_int_t ngx_mail_auth_plain(ngx_mail_session_t *s, ngx_connection_t *c, + ngx_uint_t n); +ngx_int_t ngx_mail_auth_login_username(ngx_mail_session_t *s, + ngx_connection_t *c, ngx_uint_t n); +ngx_int_t ngx_mail_auth_login_password(ngx_mail_session_t *s, + ngx_connection_t *c); +ngx_int_t ngx_mail_auth_cram_md5_salt(ngx_mail_session_t *s, + ngx_connection_t *c, char *prefix, size_t len); +ngx_int_t ngx_mail_auth_cram_md5(ngx_mail_session_t *s, ngx_connection_t *c); +ngx_int_t ngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c); + +void ngx_mail_send(ngx_event_t *wev); +ngx_int_t ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c); +void ngx_mail_auth(ngx_mail_session_t *s, ngx_connection_t *c); +void ngx_mail_close_connection(ngx_connection_t *c); +void ngx_mail_session_internal_server_error(ngx_mail_session_t *s); +u_char *ngx_mail_log_error(ngx_log_t *log, u_char *buf, size_t len); + + +char *ngx_mail_capabilities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); + + +/* STUB */ +void ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_addr_t *peer); +void ngx_mail_auth_http_init(ngx_mail_session_t *s); +/**/ + + +extern ngx_uint_t ngx_mail_max_module; +extern ngx_module_t ngx_mail_core_module; + + +#endif /* _NGX_MAIL_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/mail/ngx_mail_auth_http_module.c b/release/src/router/nginx/src/mail/ngx_mail_auth_http_module.c new file mode 100644 index 0000000000..2e9b9f24da --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_auth_http_module.c @@ -0,0 +1,1462 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include +#include + + +typedef struct { + ngx_addr_t *peer; + + ngx_msec_t timeout; + + ngx_str_t host_header; + ngx_str_t uri; + ngx_str_t header; + + ngx_array_t *headers; + + u_char *file; + ngx_uint_t line; +} ngx_mail_auth_http_conf_t; + + +typedef struct ngx_mail_auth_http_ctx_s ngx_mail_auth_http_ctx_t; + +typedef void (*ngx_mail_auth_http_handler_pt)(ngx_mail_session_t *s, + ngx_mail_auth_http_ctx_t *ctx); + +struct ngx_mail_auth_http_ctx_s { + ngx_buf_t *request; + ngx_buf_t *response; + ngx_peer_connection_t peer; + + ngx_mail_auth_http_handler_pt handler; + + ngx_uint_t state; + + u_char *header_name_start; + u_char *header_name_end; + u_char *header_start; + u_char *header_end; + + ngx_str_t addr; + ngx_str_t port; + ngx_str_t err; + ngx_str_t errmsg; + ngx_str_t errcode; + + time_t sleep; + + ngx_pool_t *pool; +}; + + +static void ngx_mail_auth_http_write_handler(ngx_event_t *wev); +static void ngx_mail_auth_http_read_handler(ngx_event_t *rev); +static void ngx_mail_auth_http_ignore_status_line(ngx_mail_session_t *s, + ngx_mail_auth_http_ctx_t *ctx); +static void ngx_mail_auth_http_process_headers(ngx_mail_session_t *s, + ngx_mail_auth_http_ctx_t *ctx); +static void ngx_mail_auth_sleep_handler(ngx_event_t *rev); +static ngx_int_t ngx_mail_auth_http_parse_header_line(ngx_mail_session_t *s, + ngx_mail_auth_http_ctx_t *ctx); +static void ngx_mail_auth_http_block_read(ngx_event_t *rev); +static void ngx_mail_auth_http_dummy_handler(ngx_event_t *ev); +static ngx_buf_t *ngx_mail_auth_http_create_request(ngx_mail_session_t *s, + ngx_pool_t *pool, ngx_mail_auth_http_conf_t *ahcf); +static ngx_int_t ngx_mail_auth_http_escape(ngx_pool_t *pool, ngx_str_t *text, + ngx_str_t *escaped); + +static void *ngx_mail_auth_http_create_conf(ngx_conf_t *cf); +static char *ngx_mail_auth_http_merge_conf(ngx_conf_t *cf, void *parent, + void *child); +static char *ngx_mail_auth_http(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); +static char *ngx_mail_auth_http_header(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); + + +static ngx_command_t ngx_mail_auth_http_commands[] = { + + { ngx_string("auth_http"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_mail_auth_http, + NGX_MAIL_SRV_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("auth_http_timeout"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_auth_http_conf_t, timeout), + NULL }, + + { ngx_string("auth_http_header"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE2, + ngx_mail_auth_http_header, + NGX_MAIL_SRV_CONF_OFFSET, + 0, + NULL }, + + ngx_null_command +}; + + +static ngx_mail_module_t ngx_mail_auth_http_module_ctx = { + NULL, /* protocol */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + ngx_mail_auth_http_create_conf, /* create server configuration */ + ngx_mail_auth_http_merge_conf /* merge server configuration */ +}; + + +ngx_module_t ngx_mail_auth_http_module = { + NGX_MODULE_V1, + &ngx_mail_auth_http_module_ctx, /* module context */ + ngx_mail_auth_http_commands, /* module directives */ + NGX_MAIL_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_str_t ngx_mail_auth_http_method[] = { + ngx_string("plain"), + ngx_string("plain"), + ngx_string("plain"), + ngx_string("apop"), + ngx_string("cram-md5"), + ngx_string("none") +}; + +static ngx_str_t ngx_mail_smtp_errcode = ngx_string("535 5.7.0"); + + +void +ngx_mail_auth_http_init(ngx_mail_session_t *s) +{ + ngx_int_t rc; + ngx_pool_t *pool; + ngx_mail_auth_http_ctx_t *ctx; + ngx_mail_auth_http_conf_t *ahcf; + + s->connection->log->action = "in http auth state"; + + pool = ngx_create_pool(2048, s->connection->log); + if (pool == NULL) { + ngx_mail_session_internal_server_error(s); + return; + } + + ctx = ngx_pcalloc(pool, sizeof(ngx_mail_auth_http_ctx_t)); + if (ctx == NULL) { + ngx_destroy_pool(pool); + ngx_mail_session_internal_server_error(s); + return; + } + + ctx->pool = pool; + + ahcf = ngx_mail_get_module_srv_conf(s, ngx_mail_auth_http_module); + + ctx->request = ngx_mail_auth_http_create_request(s, pool, ahcf); + if (ctx->request == NULL) { + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + ngx_mail_set_ctx(s, ctx, ngx_mail_auth_http_module); + + ctx->peer.sockaddr = ahcf->peer->sockaddr; + ctx->peer.socklen = ahcf->peer->socklen; + ctx->peer.name = &ahcf->peer->name; + ctx->peer.get = ngx_event_get_peer; + ctx->peer.log = s->connection->log; + ctx->peer.log_error = NGX_ERROR_ERR; + + rc = ngx_event_connect_peer(&ctx->peer); + + if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) { + if (ctx->peer.connection) { + ngx_close_connection(ctx->peer.connection); + } + + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + ctx->peer.connection->data = s; + ctx->peer.connection->pool = s->connection->pool; + + s->connection->read->handler = ngx_mail_auth_http_block_read; + ctx->peer.connection->read->handler = ngx_mail_auth_http_read_handler; + ctx->peer.connection->write->handler = ngx_mail_auth_http_write_handler; + + ctx->handler = ngx_mail_auth_http_ignore_status_line; + + ngx_add_timer(ctx->peer.connection->read, ahcf->timeout); + ngx_add_timer(ctx->peer.connection->write, ahcf->timeout); + + if (rc == NGX_OK) { + ngx_mail_auth_http_write_handler(ctx->peer.connection->write); + return; + } +} + + +static void +ngx_mail_auth_http_write_handler(ngx_event_t *wev) +{ + ssize_t n, size; + ngx_connection_t *c; + ngx_mail_session_t *s; + ngx_mail_auth_http_ctx_t *ctx; + ngx_mail_auth_http_conf_t *ahcf; + + c = wev->data; + s = c->data; + + ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module); + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, wev->log, 0, + "mail auth http write handler"); + + if (wev->timedout) { + ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT, + "auth http server %V timed out", ctx->peer.name); + ngx_close_connection(c); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + size = ctx->request->last - ctx->request->pos; + + n = ngx_send(c, ctx->request->pos, size); + + if (n == NGX_ERROR) { + ngx_close_connection(c); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + if (n > 0) { + ctx->request->pos += n; + + if (n == size) { + wev->handler = ngx_mail_auth_http_dummy_handler; + + if (wev->timer_set) { + ngx_del_timer(wev); + } + + if (ngx_handle_write_event(wev, 0) != NGX_OK) { + ngx_close_connection(c); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + } + + return; + } + } + + if (!wev->timer_set) { + ahcf = ngx_mail_get_module_srv_conf(s, ngx_mail_auth_http_module); + ngx_add_timer(wev, ahcf->timeout); + } +} + + +static void +ngx_mail_auth_http_read_handler(ngx_event_t *rev) +{ + ssize_t n, size; + ngx_connection_t *c; + ngx_mail_session_t *s; + ngx_mail_auth_http_ctx_t *ctx; + + c = rev->data; + s = c->data; + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, + "mail auth http read handler"); + + ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module); + + if (rev->timedout) { + ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT, + "auth http server %V timed out", ctx->peer.name); + ngx_close_connection(c); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + if (ctx->response == NULL) { + ctx->response = ngx_create_temp_buf(ctx->pool, 1024); + if (ctx->response == NULL) { + ngx_close_connection(c); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + } + + size = ctx->response->end - ctx->response->last; + + n = ngx_recv(c, ctx->response->pos, size); + + if (n > 0) { + ctx->response->last += n; + + ctx->handler(s, ctx); + return; + } + + if (n == NGX_AGAIN) { + return; + } + + ngx_close_connection(c); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); +} + + +static void +ngx_mail_auth_http_ignore_status_line(ngx_mail_session_t *s, + ngx_mail_auth_http_ctx_t *ctx) +{ + u_char *p, ch; + enum { + sw_start = 0, + sw_H, + sw_HT, + sw_HTT, + sw_HTTP, + sw_skip, + sw_almost_done + } state; + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, + "mail auth http process status line"); + + state = ctx->state; + + for (p = ctx->response->pos; p < ctx->response->last; p++) { + ch = *p; + + switch (state) { + + /* "HTTP/" */ + case sw_start: + if (ch == 'H') { + state = sw_H; + break; + } + goto next; + + case sw_H: + if (ch == 'T') { + state = sw_HT; + break; + } + goto next; + + case sw_HT: + if (ch == 'T') { + state = sw_HTT; + break; + } + goto next; + + case sw_HTT: + if (ch == 'P') { + state = sw_HTTP; + break; + } + goto next; + + case sw_HTTP: + if (ch == '/') { + state = sw_skip; + break; + } + goto next; + + /* any text until end of line */ + case sw_skip: + switch (ch) { + case CR: + state = sw_almost_done; + + break; + case LF: + goto done; + } + break; + + /* end of status line */ + case sw_almost_done: + if (ch == LF) { + goto done; + } + + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "auth http server &V sent invalid response", + ctx->peer.name); + ngx_close_connection(ctx->peer.connection); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + } + + ctx->response->pos = p; + ctx->state = state; + + return; + +next: + + p = ctx->response->start - 1; + +done: + + ctx->response->pos = p + 1; + ctx->state = 0; + ctx->handler = ngx_mail_auth_http_process_headers; + ctx->handler(s, ctx); +} + + +static void +ngx_mail_auth_http_process_headers(ngx_mail_session_t *s, + ngx_mail_auth_http_ctx_t *ctx) +{ + u_char *p; + time_t timer; + size_t len, size; + ngx_int_t rc, port, n; + ngx_addr_t *peer; + struct sockaddr_in *sin; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; +#endif + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, + "mail auth http process headers"); + + for ( ;; ) { + rc = ngx_mail_auth_http_parse_header_line(s, ctx); + + if (rc == NGX_OK) { + +#if (NGX_DEBUG) + { + ngx_str_t key, value; + + key.len = ctx->header_name_end - ctx->header_name_start; + key.data = ctx->header_name_start; + value.len = ctx->header_end - ctx->header_start; + value.data = ctx->header_start; + + ngx_log_debug2(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, + "mail auth http header: \"%V: %V\"", + &key, &value); + } +#endif + + len = ctx->header_name_end - ctx->header_name_start; + + if (len == sizeof("Auth-Status") - 1 + && ngx_strncasecmp(ctx->header_name_start, + (u_char *) "Auth-Status", + sizeof("Auth-Status") - 1) + == 0) + { + len = ctx->header_end - ctx->header_start; + + if (len == 2 + && ctx->header_start[0] == 'O' + && ctx->header_start[1] == 'K') + { + continue; + } + + if (len == 4 + && ctx->header_start[0] == 'W' + && ctx->header_start[1] == 'A' + && ctx->header_start[2] == 'I' + && ctx->header_start[3] == 'T') + { + s->auth_wait = 1; + continue; + } + + ctx->errmsg.len = len; + ctx->errmsg.data = ctx->header_start; + + switch (s->protocol) { + + case NGX_MAIL_POP3_PROTOCOL: + size = sizeof("-ERR ") - 1 + len + sizeof(CRLF) - 1; + break; + + case NGX_MAIL_IMAP_PROTOCOL: + size = s->tag.len + sizeof("NO ") - 1 + len + + sizeof(CRLF) - 1; + break; + + default: /* NGX_MAIL_SMTP_PROTOCOL */ + ctx->err = ctx->errmsg; + continue; + } + + p = ngx_pnalloc(s->connection->pool, size); + if (p == NULL) { + ngx_close_connection(ctx->peer.connection); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + ctx->err.data = p; + + switch (s->protocol) { + + case NGX_MAIL_POP3_PROTOCOL: + *p++ = '-'; *p++ = 'E'; *p++ = 'R'; *p++ = 'R'; *p++ = ' '; + break; + + case NGX_MAIL_IMAP_PROTOCOL: + p = ngx_cpymem(p, s->tag.data, s->tag.len); + *p++ = 'N'; *p++ = 'O'; *p++ = ' '; + break; + + default: /* NGX_MAIL_SMTP_PROTOCOL */ + break; + } + + p = ngx_cpymem(p, ctx->header_start, len); + *p++ = CR; *p++ = LF; + + ctx->err.len = p - ctx->err.data; + + continue; + } + + if (len == sizeof("Auth-Server") - 1 + && ngx_strncasecmp(ctx->header_name_start, + (u_char *) "Auth-Server", + sizeof("Auth-Server") - 1) + == 0) + { + ctx->addr.len = ctx->header_end - ctx->header_start; + ctx->addr.data = ctx->header_start; + + continue; + } + + if (len == sizeof("Auth-Port") - 1 + && ngx_strncasecmp(ctx->header_name_start, + (u_char *) "Auth-Port", + sizeof("Auth-Port") - 1) + == 0) + { + ctx->port.len = ctx->header_end - ctx->header_start; + ctx->port.data = ctx->header_start; + + continue; + } + + if (len == sizeof("Auth-User") - 1 + && ngx_strncasecmp(ctx->header_name_start, + (u_char *) "Auth-User", + sizeof("Auth-User") - 1) + == 0) + { + s->login.len = ctx->header_end - ctx->header_start; + + s->login.data = ngx_pnalloc(s->connection->pool, s->login.len); + if (s->login.data == NULL) { + ngx_close_connection(ctx->peer.connection); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + ngx_memcpy(s->login.data, ctx->header_start, s->login.len); + + continue; + } + + if (len == sizeof("Auth-Pass") - 1 + && ngx_strncasecmp(ctx->header_name_start, + (u_char *) "Auth-Pass", + sizeof("Auth-Pass") - 1) + == 0) + { + s->passwd.len = ctx->header_end - ctx->header_start; + + s->passwd.data = ngx_pnalloc(s->connection->pool, + s->passwd.len); + if (s->passwd.data == NULL) { + ngx_close_connection(ctx->peer.connection); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + ngx_memcpy(s->passwd.data, ctx->header_start, s->passwd.len); + + continue; + } + + if (len == sizeof("Auth-Wait") - 1 + && ngx_strncasecmp(ctx->header_name_start, + (u_char *) "Auth-Wait", + sizeof("Auth-Wait") - 1) + == 0) + { + n = ngx_atoi(ctx->header_start, + ctx->header_end - ctx->header_start); + + if (n != NGX_ERROR) { + ctx->sleep = n; + } + + continue; + } + + if (len == sizeof("Auth-Error-Code") - 1 + && ngx_strncasecmp(ctx->header_name_start, + (u_char *) "Auth-Error-Code", + sizeof("Auth-Error-Code") - 1) + == 0) + { + ctx->errcode.len = ctx->header_end - ctx->header_start; + + ctx->errcode.data = ngx_pnalloc(s->connection->pool, + ctx->errcode.len); + if (ctx->errcode.data == NULL) { + ngx_close_connection(ctx->peer.connection); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + ngx_memcpy(ctx->errcode.data, ctx->header_start, + ctx->errcode.len); + + continue; + } + + /* ignore other headers */ + + continue; + } + + if (rc == NGX_DONE) { + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, + "mail auth http header done"); + + ngx_close_connection(ctx->peer.connection); + + if (ctx->err.len) { + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "client login failed: \"%V\"", &ctx->errmsg); + + if (s->protocol == NGX_MAIL_SMTP_PROTOCOL) { + + if (ctx->errcode.len == 0) { + ctx->errcode = ngx_mail_smtp_errcode; + } + + ctx->err.len = ctx->errcode.len + ctx->errmsg.len + + sizeof(" " CRLF) - 1; + + p = ngx_pnalloc(s->connection->pool, ctx->err.len); + if (p == NULL) { + ngx_close_connection(ctx->peer.connection); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + ctx->err.data = p; + + p = ngx_cpymem(p, ctx->errcode.data, ctx->errcode.len); + *p++ = ' '; + p = ngx_cpymem(p, ctx->errmsg.data, ctx->errmsg.len); + *p++ = CR; *p = LF; + } + + s->out = ctx->err; + timer = ctx->sleep; + + ngx_destroy_pool(ctx->pool); + + if (timer == 0) { + s->quit = 1; + ngx_mail_send(s->connection->write); + return; + } + + ngx_add_timer(s->connection->read, (ngx_msec_t) (timer * 1000)); + + s->connection->read->handler = ngx_mail_auth_sleep_handler; + + return; + } + + if (s->auth_wait) { + timer = ctx->sleep; + + ngx_destroy_pool(ctx->pool); + + if (timer == 0) { + ngx_mail_auth_http_init(s); + return; + } + + ngx_add_timer(s->connection->read, (ngx_msec_t) (timer * 1000)); + + s->connection->read->handler = ngx_mail_auth_sleep_handler; + + return; + } + + if (ctx->addr.len == 0 || ctx->port.len == 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "auth http server %V did not send server or port", + ctx->peer.name); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + if (s->passwd.data == NULL + && s->protocol != NGX_MAIL_SMTP_PROTOCOL) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "auth http server %V did not send password", + ctx->peer.name); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + peer = ngx_pcalloc(s->connection->pool, sizeof(ngx_addr_t)); + if (peer == NULL) { + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + rc = ngx_parse_addr(s->connection->pool, peer, + ctx->addr.data, ctx->addr.len); + + switch (rc) { + case NGX_OK: + break; + + case NGX_DECLINED: + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "auth http server %V sent invalid server " + "address:\"%V\"", + ctx->peer.name, &ctx->addr); + /* fall through */ + + default: + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + port = ngx_atoi(ctx->port.data, ctx->port.len); + if (port == NGX_ERROR || port < 1 || port > 65535) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "auth http server %V sent invalid server " + "port:\"%V\"", + ctx->peer.name, &ctx->port); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + switch (peer->sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) peer->sockaddr; + sin6->sin6_port = htons((in_port_t) port); + break; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) peer->sockaddr; + sin->sin_port = htons((in_port_t) port); + break; + } + + len = ctx->addr.len + 1 + ctx->port.len; + + peer->name.len = len; + + peer->name.data = ngx_pnalloc(s->connection->pool, len); + if (peer->name.data == NULL) { + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + return; + } + + len = ctx->addr.len; + + ngx_memcpy(peer->name.data, ctx->addr.data, len); + + peer->name.data[len++] = ':'; + + ngx_memcpy(peer->name.data + len, ctx->port.data, ctx->port.len); + + ngx_destroy_pool(ctx->pool); + ngx_mail_proxy_init(s, peer); + + return; + } + + if (rc == NGX_AGAIN ) { + return; + } + + /* rc == NGX_ERROR */ + + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "auth http server %V sent invalid header in response", + ctx->peer.name); + ngx_close_connection(ctx->peer.connection); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + + return; + } +} + + +static void +ngx_mail_auth_sleep_handler(ngx_event_t *rev) +{ + ngx_connection_t *c; + ngx_mail_session_t *s; + ngx_mail_core_srv_conf_t *cscf; + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail auth sleep handler"); + + c = rev->data; + s = c->data; + + if (rev->timedout) { + + rev->timedout = 0; + + if (s->auth_wait) { + s->auth_wait = 0; + ngx_mail_auth_http_init(s); + return; + } + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + rev->handler = cscf->protocol->auth_state; + + s->mail_state = 0; + s->auth_method = NGX_MAIL_AUTH_PLAIN; + + c->log->action = "in auth state"; + + ngx_mail_send(c->write); + + if (c->destroyed) { + return; + } + + ngx_add_timer(rev, cscf->timeout); + + if (rev->ready) { + rev->handler(rev); + return; + } + + if (ngx_handle_read_event(rev, 0) != NGX_OK) { + ngx_mail_close_connection(c); + } + + return; + } + + if (rev->active) { + if (ngx_handle_read_event(rev, 0) != NGX_OK) { + ngx_mail_close_connection(c); + } + } +} + + +static ngx_int_t +ngx_mail_auth_http_parse_header_line(ngx_mail_session_t *s, + ngx_mail_auth_http_ctx_t *ctx) +{ + u_char c, ch, *p; + enum { + sw_start = 0, + sw_name, + sw_space_before_value, + sw_value, + sw_space_after_value, + sw_almost_done, + sw_header_almost_done + } state; + + state = ctx->state; + + for (p = ctx->response->pos; p < ctx->response->last; p++) { + ch = *p; + + switch (state) { + + /* first char */ + case sw_start: + + switch (ch) { + case CR: + ctx->header_end = p; + state = sw_header_almost_done; + break; + case LF: + ctx->header_end = p; + goto header_done; + default: + state = sw_name; + ctx->header_name_start = p; + + c = (u_char) (ch | 0x20); + if (c >= 'a' && c <= 'z') { + break; + } + + if (ch >= '0' && ch <= '9') { + break; + } + + return NGX_ERROR; + } + break; + + /* header name */ + case sw_name: + c = (u_char) (ch | 0x20); + if (c >= 'a' && c <= 'z') { + break; + } + + if (ch == ':') { + ctx->header_name_end = p; + state = sw_space_before_value; + break; + } + + if (ch == '-') { + break; + } + + if (ch >= '0' && ch <= '9') { + break; + } + + if (ch == CR) { + ctx->header_name_end = p; + ctx->header_start = p; + ctx->header_end = p; + state = sw_almost_done; + break; + } + + if (ch == LF) { + ctx->header_name_end = p; + ctx->header_start = p; + ctx->header_end = p; + goto done; + } + + return NGX_ERROR; + + /* space* before header value */ + case sw_space_before_value: + switch (ch) { + case ' ': + break; + case CR: + ctx->header_start = p; + ctx->header_end = p; + state = sw_almost_done; + break; + case LF: + ctx->header_start = p; + ctx->header_end = p; + goto done; + default: + ctx->header_start = p; + state = sw_value; + break; + } + break; + + /* header value */ + case sw_value: + switch (ch) { + case ' ': + ctx->header_end = p; + state = sw_space_after_value; + break; + case CR: + ctx->header_end = p; + state = sw_almost_done; + break; + case LF: + ctx->header_end = p; + goto done; + } + break; + + /* space* before end of header line */ + case sw_space_after_value: + switch (ch) { + case ' ': + break; + case CR: + state = sw_almost_done; + break; + case LF: + goto done; + default: + state = sw_value; + break; + } + break; + + /* end of header line */ + case sw_almost_done: + switch (ch) { + case LF: + goto done; + default: + return NGX_ERROR; + } + + /* end of header */ + case sw_header_almost_done: + switch (ch) { + case LF: + goto header_done; + default: + return NGX_ERROR; + } + } + } + + ctx->response->pos = p; + ctx->state = state; + + return NGX_AGAIN; + +done: + + ctx->response->pos = p + 1; + ctx->state = sw_start; + + return NGX_OK; + +header_done: + + ctx->response->pos = p + 1; + ctx->state = sw_start; + + return NGX_DONE; +} + + +static void +ngx_mail_auth_http_block_read(ngx_event_t *rev) +{ + ngx_connection_t *c; + ngx_mail_session_t *s; + ngx_mail_auth_http_ctx_t *ctx; + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, + "mail auth http block read"); + + if (ngx_handle_read_event(rev, 0) != NGX_OK) { + c = rev->data; + s = c->data; + + ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module); + + ngx_close_connection(ctx->peer.connection); + ngx_destroy_pool(ctx->pool); + ngx_mail_session_internal_server_error(s); + } +} + + +static void +ngx_mail_auth_http_dummy_handler(ngx_event_t *ev) +{ + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, ev->log, 0, + "mail auth http dummy handler"); +} + + +static ngx_buf_t * +ngx_mail_auth_http_create_request(ngx_mail_session_t *s, ngx_pool_t *pool, + ngx_mail_auth_http_conf_t *ahcf) +{ + size_t len; + ngx_buf_t *b; + ngx_str_t login, passwd; + ngx_mail_core_srv_conf_t *cscf; + + if (ngx_mail_auth_http_escape(pool, &s->login, &login) != NGX_OK) { + return NULL; + } + + if (ngx_mail_auth_http_escape(pool, &s->passwd, &passwd) != NGX_OK) { + return NULL; + } + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + len = sizeof("GET ") - 1 + ahcf->uri.len + sizeof(" HTTP/1.0" CRLF) - 1 + + sizeof("Host: ") - 1 + ahcf->host_header.len + sizeof(CRLF) - 1 + + sizeof("Auth-Method: ") - 1 + + ngx_mail_auth_http_method[s->auth_method].len + + sizeof(CRLF) - 1 + + sizeof("Auth-User: ") - 1 + login.len + sizeof(CRLF) - 1 + + sizeof("Auth-Pass: ") - 1 + passwd.len + sizeof(CRLF) - 1 + + sizeof("Auth-Salt: ") - 1 + s->salt.len + + sizeof("Auth-Protocol: ") - 1 + cscf->protocol->name.len + + sizeof(CRLF) - 1 + + sizeof("Auth-Login-Attempt: ") - 1 + NGX_INT_T_LEN + + sizeof(CRLF) - 1 + + sizeof("Client-IP: ") - 1 + s->connection->addr_text.len + + sizeof(CRLF) - 1 + + sizeof("Client-Host: ") - 1 + s->host.len + sizeof(CRLF) - 1 + + sizeof("Auth-SMTP-Helo: ") - 1 + s->smtp_helo.len + + sizeof("Auth-SMTP-From: ") - 1 + s->smtp_from.len + + sizeof("Auth-SMTP-To: ") - 1 + s->smtp_to.len + + ahcf->header.len + + sizeof(CRLF) - 1; + + b = ngx_create_temp_buf(pool, len); + if (b == NULL) { + return NULL; + } + + b->last = ngx_cpymem(b->last, "GET ", sizeof("GET ") - 1); + b->last = ngx_copy(b->last, ahcf->uri.data, ahcf->uri.len); + b->last = ngx_cpymem(b->last, " HTTP/1.0" CRLF, + sizeof(" HTTP/1.0" CRLF) - 1); + + b->last = ngx_cpymem(b->last, "Host: ", sizeof("Host: ") - 1); + b->last = ngx_copy(b->last, ahcf->host_header.data, + ahcf->host_header.len); + *b->last++ = CR; *b->last++ = LF; + + b->last = ngx_cpymem(b->last, "Auth-Method: ", + sizeof("Auth-Method: ") - 1); + b->last = ngx_cpymem(b->last, + ngx_mail_auth_http_method[s->auth_method].data, + ngx_mail_auth_http_method[s->auth_method].len); + *b->last++ = CR; *b->last++ = LF; + + b->last = ngx_cpymem(b->last, "Auth-User: ", sizeof("Auth-User: ") - 1); + b->last = ngx_copy(b->last, login.data, login.len); + *b->last++ = CR; *b->last++ = LF; + + b->last = ngx_cpymem(b->last, "Auth-Pass: ", sizeof("Auth-Pass: ") - 1); + b->last = ngx_copy(b->last, passwd.data, passwd.len); + *b->last++ = CR; *b->last++ = LF; + + if (s->auth_method != NGX_MAIL_AUTH_PLAIN && s->salt.len) { + b->last = ngx_cpymem(b->last, "Auth-Salt: ", sizeof("Auth-Salt: ") - 1); + b->last = ngx_copy(b->last, s->salt.data, s->salt.len); + + s->passwd.data = NULL; + } + + b->last = ngx_cpymem(b->last, "Auth-Protocol: ", + sizeof("Auth-Protocol: ") - 1); + b->last = ngx_cpymem(b->last, cscf->protocol->name.data, + cscf->protocol->name.len); + *b->last++ = CR; *b->last++ = LF; + + b->last = ngx_sprintf(b->last, "Auth-Login-Attempt: %ui" CRLF, + s->login_attempt); + + b->last = ngx_cpymem(b->last, "Client-IP: ", sizeof("Client-IP: ") - 1); + b->last = ngx_copy(b->last, s->connection->addr_text.data, + s->connection->addr_text.len); + *b->last++ = CR; *b->last++ = LF; + + if (s->host.len) { + b->last = ngx_cpymem(b->last, "Client-Host: ", + sizeof("Client-Host: ") - 1); + b->last = ngx_copy(b->last, s->host.data, s->host.len); + *b->last++ = CR; *b->last++ = LF; + } + + if (s->auth_method == NGX_MAIL_AUTH_NONE) { + + /* HELO, MAIL FROM, and RCPT TO can't contain CRLF, no need to escape */ + + b->last = ngx_cpymem(b->last, "Auth-SMTP-Helo: ", + sizeof("Auth-SMTP-Helo: ") - 1); + b->last = ngx_copy(b->last, s->smtp_helo.data, s->smtp_helo.len); + *b->last++ = CR; *b->last++ = LF; + + b->last = ngx_cpymem(b->last, "Auth-SMTP-From: ", + sizeof("Auth-SMTP-From: ") - 1); + b->last = ngx_copy(b->last, s->smtp_from.data, s->smtp_from.len); + *b->last++ = CR; *b->last++ = LF; + + b->last = ngx_cpymem(b->last, "Auth-SMTP-To: ", + sizeof("Auth-SMTP-To: ") - 1); + b->last = ngx_copy(b->last, s->smtp_to.data, s->smtp_to.len); + *b->last++ = CR; *b->last++ = LF; + + } + + if (ahcf->header.len) { + b->last = ngx_copy(b->last, ahcf->header.data, ahcf->header.len); + } + + /* add "\r\n" at the header end */ + *b->last++ = CR; *b->last++ = LF; + +#if (NGX_DEBUG_MAIL_PASSWD) + { + ngx_str_t l; + + l.len = b->last - b->pos; + l.data = b->pos; + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, + "mail auth http header:\n\"%V\"", &l); + } +#endif + + return b; +} + + +static ngx_int_t +ngx_mail_auth_http_escape(ngx_pool_t *pool, ngx_str_t *text, ngx_str_t *escaped) +{ + u_char *p; + uintptr_t n; + + n = ngx_escape_uri(NULL, text->data, text->len, NGX_ESCAPE_MAIL_AUTH); + + if (n == 0) { + *escaped = *text; + return NGX_OK; + } + + escaped->len = text->len + n * 2; + + p = ngx_pnalloc(pool, escaped->len); + if (p == NULL) { + return NGX_ERROR; + } + + (void) ngx_escape_uri(p, text->data, text->len, NGX_ESCAPE_MAIL_AUTH); + + escaped->data = p; + + return NGX_OK; +} + + +static void * +ngx_mail_auth_http_create_conf(ngx_conf_t *cf) +{ + ngx_mail_auth_http_conf_t *ahcf; + + ahcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_auth_http_conf_t)); + if (ahcf == NULL) { + return NULL; + } + + ahcf->timeout = NGX_CONF_UNSET_MSEC; + + ahcf->file = cf->conf_file->file.name.data; + ahcf->line = cf->conf_file->line; + + return ahcf; +} + + +static char * +ngx_mail_auth_http_merge_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_mail_auth_http_conf_t *prev = parent; + ngx_mail_auth_http_conf_t *conf = child; + + u_char *p; + size_t len; + ngx_uint_t i; + ngx_table_elt_t *header; + + if (conf->peer == NULL) { + conf->peer = prev->peer; + conf->host_header = prev->host_header; + conf->uri = prev->uri; + + if (conf->peer == NULL) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "no \"auth_http\" is defined for server in %s:%ui", + conf->file, conf->line); + + return NGX_CONF_ERROR; + } + } + + ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000); + + if (conf->headers == NULL) { + conf->headers = prev->headers; + conf->header = prev->header; + } + + if (conf->headers && conf->header.len == 0) { + len = 0; + header = conf->headers->elts; + for (i = 0; i < conf->headers->nelts; i++) { + len += header[i].key.len + 2 + header[i].value.len + 2; + } + + p = ngx_pnalloc(cf->pool, len); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->header.len = len; + conf->header.data = p; + + for (i = 0; i < conf->headers->nelts; i++) { + p = ngx_cpymem(p, header[i].key.data, header[i].key.len); + *p++ = ':'; *p++ = ' '; + p = ngx_cpymem(p, header[i].value.data, header[i].value.len); + *p++ = CR; *p++ = LF; + } + } + + return NGX_CONF_OK; +} + + +static char * +ngx_mail_auth_http(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_mail_auth_http_conf_t *ahcf = conf; + + ngx_str_t *value; + ngx_url_t u; + + value = cf->args->elts; + + ngx_memzero(&u, sizeof(ngx_url_t)); + + u.url = value[1]; + u.default_port = 80; + u.uri_part = 1; + + if (ngx_strncmp(u.url.data, "http://", 7) == 0) { + u.url.len -= 7; + u.url.data += 7; + } + + if (ngx_parse_url(cf->pool, &u) != NGX_OK) { + if (u.err) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "%s in auth_http \"%V\"", u.err, &u.url); + } + + return NGX_CONF_ERROR; + } + + ahcf->peer = u.addrs; + + if (u.family != AF_UNIX) { + ahcf->host_header = u.host; + + } else { + ngx_str_set(&ahcf->host_header, "localhost"); + } + + ahcf->uri = u.uri; + + if (ahcf->uri.len == 0) { + ngx_str_set(&ahcf->uri, "/"); + } + + return NGX_CONF_OK; +} + + +static char * +ngx_mail_auth_http_header(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_mail_auth_http_conf_t *ahcf = conf; + + ngx_str_t *value; + ngx_table_elt_t *header; + + if (ahcf->headers == NULL) { + ahcf->headers = ngx_array_create(cf->pool, 1, sizeof(ngx_table_elt_t)); + if (ahcf->headers == NULL) { + return NGX_CONF_ERROR; + } + } + + header = ngx_array_push(ahcf->headers); + if (header == NULL) { + return NGX_CONF_ERROR; + } + + value = cf->args->elts; + + header->key = value[1]; + header->value = value[2]; + + return NGX_CONF_OK; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail_core_module.c b/release/src/router/nginx/src/mail/ngx_mail_core_module.c new file mode 100644 index 0000000000..be8673c299 --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_core_module.c @@ -0,0 +1,652 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include + + +static void *ngx_mail_core_create_main_conf(ngx_conf_t *cf); +static void *ngx_mail_core_create_srv_conf(ngx_conf_t *cf); +static char *ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent, + void *child); +static char *ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_mail_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); + + +static ngx_conf_deprecated_t ngx_conf_deprecated_so_keepalive = { + ngx_conf_deprecated, "so_keepalive", + "so_keepalive\" parameter of the \"listen" +}; + + +static ngx_command_t ngx_mail_core_commands[] = { + + { ngx_string("server"), + NGX_MAIL_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, + ngx_mail_core_server, + 0, + 0, + NULL }, + + { ngx_string("listen"), + NGX_MAIL_SRV_CONF|NGX_CONF_TAKE12, + ngx_mail_core_listen, + NGX_MAIL_SRV_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("protocol"), + NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_mail_core_protocol, + NGX_MAIL_SRV_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("so_keepalive"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, + ngx_conf_set_flag_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_core_srv_conf_t, so_keepalive), + &ngx_conf_deprecated_so_keepalive }, + + { ngx_string("timeout"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_core_srv_conf_t, timeout), + NULL }, + + { ngx_string("server_name"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_core_srv_conf_t, server_name), + NULL }, + + { ngx_string("resolver"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, + ngx_mail_core_resolver, + NGX_MAIL_SRV_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("resolver_timeout"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_core_srv_conf_t, resolver_timeout), + NULL }, + + ngx_null_command +}; + + +static ngx_mail_module_t ngx_mail_core_module_ctx = { + NULL, /* protocol */ + + ngx_mail_core_create_main_conf, /* create main configuration */ + NULL, /* init main configuration */ + + ngx_mail_core_create_srv_conf, /* create server configuration */ + ngx_mail_core_merge_srv_conf /* merge server configuration */ +}; + + +ngx_module_t ngx_mail_core_module = { + NGX_MODULE_V1, + &ngx_mail_core_module_ctx, /* module context */ + ngx_mail_core_commands, /* module directives */ + NGX_MAIL_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_mail_core_create_main_conf(ngx_conf_t *cf) +{ + ngx_mail_core_main_conf_t *cmcf; + + cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_core_main_conf_t)); + if (cmcf == NULL) { + return NULL; + } + + if (ngx_array_init(&cmcf->servers, cf->pool, 4, + sizeof(ngx_mail_core_srv_conf_t *)) + != NGX_OK) + { + return NULL; + } + + if (ngx_array_init(&cmcf->listen, cf->pool, 4, sizeof(ngx_mail_listen_t)) + != NGX_OK) + { + return NULL; + } + + return cmcf; +} + + +static void * +ngx_mail_core_create_srv_conf(ngx_conf_t *cf) +{ + ngx_mail_core_srv_conf_t *cscf; + + cscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_core_srv_conf_t)); + if (cscf == NULL) { + return NULL; + } + + /* + * set by ngx_pcalloc(): + * + * cscf->protocol = NULL; + */ + + cscf->timeout = NGX_CONF_UNSET_MSEC; + cscf->resolver_timeout = NGX_CONF_UNSET_MSEC; + cscf->so_keepalive = NGX_CONF_UNSET; + + cscf->resolver = NGX_CONF_UNSET_PTR; + + cscf->file_name = cf->conf_file->file.name.data; + cscf->line = cf->conf_file->line; + + return cscf; +} + + +static char * +ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_mail_core_srv_conf_t *prev = parent; + ngx_mail_core_srv_conf_t *conf = child; + + ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000); + ngx_conf_merge_msec_value(conf->resolver_timeout, prev->resolver_timeout, + 30000); + + ngx_conf_merge_value(conf->so_keepalive, prev->so_keepalive, 0); + + + ngx_conf_merge_str_value(conf->server_name, prev->server_name, ""); + + if (conf->server_name.len == 0) { + conf->server_name = cf->cycle->hostname; + } + + if (conf->protocol == NULL) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "unknown mail protocol for server in %s:%ui", + conf->file_name, conf->line); + return NGX_CONF_ERROR; + } + + ngx_conf_merge_ptr_value(conf->resolver, prev->resolver, NULL); + + return NGX_CONF_OK; +} + + +static char * +ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *rv; + void *mconf; + ngx_uint_t m; + ngx_conf_t pcf; + ngx_mail_module_t *module; + ngx_mail_conf_ctx_t *ctx, *mail_ctx; + ngx_mail_core_srv_conf_t *cscf, **cscfp; + ngx_mail_core_main_conf_t *cmcf; + + ctx = ngx_pcalloc(cf->pool, sizeof(ngx_mail_conf_ctx_t)); + if (ctx == NULL) { + return NGX_CONF_ERROR; + } + + mail_ctx = cf->ctx; + ctx->main_conf = mail_ctx->main_conf; + + /* the server{}'s srv_conf */ + + ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_mail_max_module); + if (ctx->srv_conf == NULL) { + return NGX_CONF_ERROR; + } + + for (m = 0; ngx_modules[m]; m++) { + if (ngx_modules[m]->type != NGX_MAIL_MODULE) { + continue; + } + + module = ngx_modules[m]->ctx; + + if (module->create_srv_conf) { + mconf = module->create_srv_conf(cf); + if (mconf == NULL) { + return NGX_CONF_ERROR; + } + + ctx->srv_conf[ngx_modules[m]->ctx_index] = mconf; + } + } + + /* the server configuration context */ + + cscf = ctx->srv_conf[ngx_mail_core_module.ctx_index]; + cscf->ctx = ctx; + + cmcf = ctx->main_conf[ngx_mail_core_module.ctx_index]; + + cscfp = ngx_array_push(&cmcf->servers); + if (cscfp == NULL) { + return NGX_CONF_ERROR; + } + + *cscfp = cscf; + + + /* parse inside server{} */ + + pcf = *cf; + cf->ctx = ctx; + cf->cmd_type = NGX_MAIL_SRV_CONF; + + rv = ngx_conf_parse(cf, NULL); + + *cf = pcf; + + return rv; +} + + +static char * +ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_mail_core_srv_conf_t *cscf = conf; + + size_t len, off; + in_port_t port; + ngx_str_t *value; + ngx_url_t u; + ngx_uint_t i, m; + struct sockaddr *sa; + ngx_mail_listen_t *ls; + ngx_mail_module_t *module; + struct sockaddr_in *sin; + ngx_mail_core_main_conf_t *cmcf; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; +#endif + + value = cf->args->elts; + + ngx_memzero(&u, sizeof(ngx_url_t)); + + u.url = value[1]; + u.listen = 1; + + if (ngx_parse_url(cf->pool, &u) != NGX_OK) { + if (u.err) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "%s in \"%V\" of the \"listen\" directive", + u.err, &u.url); + } + + return NGX_CONF_ERROR; + } + + cmcf = ngx_mail_conf_get_module_main_conf(cf, ngx_mail_core_module); + + ls = cmcf->listen.elts; + + for (i = 0; i < cmcf->listen.nelts; i++) { + + sa = (struct sockaddr *) ls[i].sockaddr; + + if (sa->sa_family != u.family) { + continue; + } + + switch (sa->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + off = offsetof(struct sockaddr_in6, sin6_addr); + len = 16; + sin6 = (struct sockaddr_in6 *) sa; + port = sin6->sin6_port; + break; +#endif + +#if (NGX_HAVE_UNIX_DOMAIN) + case AF_UNIX: + off = offsetof(struct sockaddr_un, sun_path); + len = sizeof(((struct sockaddr_un *) sa)->sun_path); + port = 0; + break; +#endif + + default: /* AF_INET */ + off = offsetof(struct sockaddr_in, sin_addr); + len = 4; + sin = (struct sockaddr_in *) sa; + port = sin->sin_port; + break; + } + + if (ngx_memcmp(ls[i].sockaddr + off, u.sockaddr + off, len) != 0) { + continue; + } + + if (port != u.port) { + continue; + } + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "duplicate \"%V\" address and port pair", &u.url); + return NGX_CONF_ERROR; + } + + ls = ngx_array_push(&cmcf->listen); + if (ls == NULL) { + return NGX_CONF_ERROR; + } + + ngx_memzero(ls, sizeof(ngx_mail_listen_t)); + + ngx_memcpy(ls->sockaddr, u.sockaddr, u.socklen); + + ls->socklen = u.socklen; + ls->wildcard = u.wildcard; + ls->ctx = cf->ctx; + +#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) + ls->ipv6only = 1; +#endif + + if (cscf->protocol == NULL) { + for (m = 0; ngx_modules[m]; m++) { + if (ngx_modules[m]->type != NGX_MAIL_MODULE) { + continue; + } + + module = ngx_modules[m]->ctx; + + if (module->protocol == NULL) { + continue; + } + + for (i = 0; module->protocol->port[i]; i++) { + if (module->protocol->port[i] == u.port) { + cscf->protocol = module->protocol; + break; + } + } + } + } + + for (i = 2; i < cf->args->nelts; i++) { + + if (ngx_strcmp(value[i].data, "bind") == 0) { + ls->bind = 1; + continue; + } + + if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) { +#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) + struct sockaddr *sa; + u_char buf[NGX_SOCKADDR_STRLEN]; + + sa = (struct sockaddr *) ls->sockaddr; + + if (sa->sa_family == AF_INET6) { + + if (ngx_strcmp(&value[i].data[10], "n") == 0) { + ls->ipv6only = 1; + + } else if (ngx_strcmp(&value[i].data[10], "ff") == 0) { + ls->ipv6only = 0; + + } else { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid ipv6only flags \"%s\"", + &value[i].data[9]); + return NGX_CONF_ERROR; + } + + ls->bind = 1; + + } else { + len = ngx_sock_ntop(sa, buf, NGX_SOCKADDR_STRLEN, 1); + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "ipv6only is not supported " + "on addr \"%*s\", ignored", len, buf); + } + + continue; +#else + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "bind ipv6only is not supported " + "on this platform"); + return NGX_CONF_ERROR; +#endif + } + + if (ngx_strcmp(value[i].data, "ssl") == 0) { +#if (NGX_MAIL_SSL) + ls->ssl = 1; + continue; +#else + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the \"ssl\" parameter requires " + "ngx_mail_ssl_module"); + return NGX_CONF_ERROR; +#endif + } + + if (ngx_strncmp(value[i].data, "so_keepalive=", 13) == 0) { + + if (ngx_strcmp(&value[i].data[13], "on") == 0) { + ls->so_keepalive = 1; + + } else if (ngx_strcmp(&value[i].data[13], "off") == 0) { + ls->so_keepalive = 2; + + } else { + +#if (NGX_HAVE_KEEPALIVE_TUNABLE) + u_char *p, *end; + ngx_str_t s; + + end = value[i].data + value[i].len; + s.data = value[i].data + 13; + + p = ngx_strlchr(s.data, end, ':'); + if (p == NULL) { + p = end; + } + + if (p > s.data) { + s.len = p - s.data; + + ls->tcp_keepidle = ngx_parse_time(&s, 1); + if (ls->tcp_keepidle == (time_t) NGX_ERROR) { + goto invalid_so_keepalive; + } + } + + s.data = (p < end) ? (p + 1) : end; + + p = ngx_strlchr(s.data, end, ':'); + if (p == NULL) { + p = end; + } + + if (p > s.data) { + s.len = p - s.data; + + ls->tcp_keepintvl = ngx_parse_time(&s, 1); + if (ls->tcp_keepintvl == (time_t) NGX_ERROR) { + goto invalid_so_keepalive; + } + } + + s.data = (p < end) ? (p + 1) : end; + + if (s.data < end) { + s.len = end - s.data; + + ls->tcp_keepcnt = ngx_atoi(s.data, s.len); + if (ls->tcp_keepcnt == NGX_ERROR) { + goto invalid_so_keepalive; + } + } + + if (ls->tcp_keepidle == 0 && ls->tcp_keepintvl == 0 + && ls->tcp_keepcnt == 0) + { + goto invalid_so_keepalive; + } + + ls->so_keepalive = 1; + +#else + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the \"so_keepalive\" parameter accepts " + "only \"on\" or \"off\" on this platform"); + return NGX_CONF_ERROR; + +#endif + } + + ls->bind = 1; + + continue; + +#if (NGX_HAVE_KEEPALIVE_TUNABLE) + invalid_so_keepalive: + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid so_keepalive value: \"%s\"", + &value[i].data[13]); + return NGX_CONF_ERROR; +#endif + } + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the invalid \"%V\" parameter", &value[i]); + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} + + +static char * +ngx_mail_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_mail_core_srv_conf_t *cscf = conf; + + ngx_str_t *value; + ngx_uint_t m; + ngx_mail_module_t *module; + + value = cf->args->elts; + + for (m = 0; ngx_modules[m]; m++) { + if (ngx_modules[m]->type != NGX_MAIL_MODULE) { + continue; + } + + module = ngx_modules[m]->ctx; + + if (module->protocol + && ngx_strcmp(module->protocol->name.data, value[1].data) == 0) + { + cscf->protocol = module->protocol; + + return NGX_CONF_OK; + } + } + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "unknown protocol \"%V\"", &value[1]); + return NGX_CONF_ERROR; +} + + +static char * +ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_mail_core_srv_conf_t *cscf = conf; + + ngx_str_t *value; + + value = cf->args->elts; + + if (cscf->resolver != NGX_CONF_UNSET_PTR) { + return "is duplicate"; + } + + if (ngx_strcmp(value[1].data, "off") == 0) { + cscf->resolver = NULL; + return NGX_CONF_OK; + } + + cscf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1); + if (cscf->resolver == NULL) { + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} + + +char * +ngx_mail_capabilities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *p = conf; + + ngx_str_t *c, *value; + ngx_uint_t i; + ngx_array_t *a; + + a = (ngx_array_t *) (p + cmd->offset); + + value = cf->args->elts; + + for (i = 1; i < cf->args->nelts; i++) { + c = ngx_array_push(a); + if (c == NULL) { + return NGX_CONF_ERROR; + } + + *c = value[i]; + } + + return NGX_CONF_OK; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail_handler.c b/release/src/router/nginx/src/mail/ngx_mail_handler.c new file mode 100644 index 0000000000..ae955f9c6a --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_handler.c @@ -0,0 +1,771 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include + + +static void ngx_mail_init_session(ngx_connection_t *c); + +#if (NGX_MAIL_SSL) +static void ngx_mail_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c); +static void ngx_mail_ssl_handshake_handler(ngx_connection_t *c); +#endif + + +void +ngx_mail_init_connection(ngx_connection_t *c) +{ + ngx_uint_t i; + ngx_mail_port_t *port; + struct sockaddr *sa; + struct sockaddr_in *sin; + ngx_mail_log_ctx_t *ctx; + ngx_mail_in_addr_t *addr; + ngx_mail_session_t *s; + ngx_mail_addr_conf_t *addr_conf; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; + ngx_mail_in6_addr_t *addr6; +#endif + + + /* find the server configuration for the address:port */ + + port = c->listening->servers; + + if (port->naddrs > 1) { + + /* + * There are several addresses on this port and one of them + * is the "*:port" wildcard so getsockname() is needed to determine + * the server address. + * + * AcceptEx() already gave this address. + */ + + if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) { + ngx_mail_close_connection(c); + return; + } + + sa = c->local_sockaddr; + + switch (sa->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) sa; + + addr6 = port->addrs; + + /* the last address is "*" */ + + for (i = 0; i < port->naddrs - 1; i++) { + if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) { + break; + } + } + + addr_conf = &addr6[i].conf; + + break; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) sa; + + addr = port->addrs; + + /* the last address is "*" */ + + for (i = 0; i < port->naddrs - 1; i++) { + if (addr[i].addr == sin->sin_addr.s_addr) { + break; + } + } + + addr_conf = &addr[i].conf; + + break; + } + + } else { + switch (c->local_sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + addr6 = port->addrs; + addr_conf = &addr6[0].conf; + break; +#endif + + default: /* AF_INET */ + addr = port->addrs; + addr_conf = &addr[0].conf; + break; + } + } + + s = ngx_pcalloc(c->pool, sizeof(ngx_mail_session_t)); + if (s == NULL) { + ngx_mail_close_connection(c); + return; + } + + s->main_conf = addr_conf->ctx->main_conf; + s->srv_conf = addr_conf->ctx->srv_conf; + + s->addr_text = &addr_conf->addr_text; + + c->data = s; + s->connection = c; + + ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%ui client %V connected to %V", + c->number, &c->addr_text, s->addr_text); + + ctx = ngx_palloc(c->pool, sizeof(ngx_mail_log_ctx_t)); + if (ctx == NULL) { + ngx_mail_close_connection(c); + return; + } + + ctx->client = &c->addr_text; + ctx->session = s; + + c->log->connection = c->number; + c->log->handler = ngx_mail_log_error; + c->log->data = ctx; + c->log->action = "sending client greeting line"; + + c->log_error = NGX_ERROR_INFO; + +#if (NGX_MAIL_SSL) + { + ngx_mail_ssl_conf_t *sslcf; + + sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); + + if (sslcf->enable) { + c->log->action = "SSL handshaking"; + + ngx_mail_ssl_init_connection(&sslcf->ssl, c); + return; + } + + if (addr_conf->ssl) { + + c->log->action = "SSL handshaking"; + + if (sslcf->ssl.ctx == NULL) { + ngx_log_error(NGX_LOG_ERR, c->log, 0, + "no \"ssl_certificate\" is defined " + "in server listening on SSL port"); + ngx_mail_close_connection(c); + return; + } + + ngx_mail_ssl_init_connection(&sslcf->ssl, c); + return; + } + + } +#endif + + ngx_mail_init_session(c); +} + + +#if (NGX_MAIL_SSL) + +void +ngx_mail_starttls_handler(ngx_event_t *rev) +{ + ngx_connection_t *c; + ngx_mail_session_t *s; + ngx_mail_ssl_conf_t *sslcf; + + c = rev->data; + s = c->data; + s->starttls = 1; + + c->log->action = "in starttls state"; + + sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); + + ngx_mail_ssl_init_connection(&sslcf->ssl, c); +} + + +static void +ngx_mail_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c) +{ + ngx_mail_session_t *s; + ngx_mail_core_srv_conf_t *cscf; + + if (ngx_ssl_create_connection(ssl, c, 0) == NGX_ERROR) { + ngx_mail_close_connection(c); + return; + } + + if (ngx_ssl_handshake(c) == NGX_AGAIN) { + + s = c->data; + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + ngx_add_timer(c->read, cscf->timeout); + + c->ssl->handler = ngx_mail_ssl_handshake_handler; + + return; + } + + ngx_mail_ssl_handshake_handler(c); +} + + +static void +ngx_mail_ssl_handshake_handler(ngx_connection_t *c) +{ + ngx_mail_session_t *s; + ngx_mail_core_srv_conf_t *cscf; + + if (c->ssl->handshaked) { + + s = c->data; + + if (s->starttls) { + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + c->read->handler = cscf->protocol->init_protocol; + c->write->handler = ngx_mail_send; + + cscf->protocol->init_protocol(c->read); + + return; + } + + c->read->ready = 0; + + ngx_mail_init_session(c); + return; + } + + ngx_mail_close_connection(c); +} + +#endif + + +static void +ngx_mail_init_session(ngx_connection_t *c) +{ + ngx_mail_session_t *s; + ngx_mail_core_srv_conf_t *cscf; + + s = c->data; + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + s->protocol = cscf->protocol->type; + + s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_mail_max_module); + if (s->ctx == NULL) { + ngx_mail_session_internal_server_error(s); + return; + } + + c->write->handler = ngx_mail_send; + + cscf->protocol->init_session(s, c); +} + + +ngx_int_t +ngx_mail_salt(ngx_mail_session_t *s, ngx_connection_t *c, + ngx_mail_core_srv_conf_t *cscf) +{ + s->salt.data = ngx_pnalloc(c->pool, + sizeof(" <18446744073709551616.@>" CRLF) - 1 + + NGX_TIME_T_LEN + + cscf->server_name.len); + if (s->salt.data == NULL) { + return NGX_ERROR; + } + + s->salt.len = ngx_sprintf(s->salt.data, "<%ul.%T@%V>" CRLF, + ngx_random(), ngx_time(), &cscf->server_name) + - s->salt.data; + + return NGX_OK; +} + + +#if (NGX_MAIL_SSL) + +ngx_int_t +ngx_mail_starttls_only(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_mail_ssl_conf_t *sslcf; + + if (c->ssl) { + return 0; + } + + sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); + + if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) { + return 1; + } + + return 0; +} + +#endif + + +ngx_int_t +ngx_mail_auth_plain(ngx_mail_session_t *s, ngx_connection_t *c, ngx_uint_t n) +{ + u_char *p, *last; + ngx_str_t *arg, plain; + + arg = s->args.elts; + +#if (NGX_DEBUG_MAIL_PASSWD) + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "mail auth plain: \"%V\"", &arg[n]); +#endif + + plain.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[n].len)); + if (plain.data == NULL) { + return NGX_ERROR; + } + + if (ngx_decode_base64(&plain, &arg[n]) != NGX_OK) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "client sent invalid base64 encoding in AUTH PLAIN command"); + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + p = plain.data; + last = p + plain.len; + + while (p < last && *p++) { /* void */ } + + if (p == last) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "client sent invalid login in AUTH PLAIN command"); + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + s->login.data = p; + + while (p < last && *p) { p++; } + + if (p == last) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "client sent invalid password in AUTH PLAIN command"); + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + s->login.len = p++ - s->login.data; + + s->passwd.len = last - p; + s->passwd.data = p; + +#if (NGX_DEBUG_MAIL_PASSWD) + ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0, + "mail auth plain: \"%V\" \"%V\"", &s->login, &s->passwd); +#endif + + return NGX_DONE; +} + + +ngx_int_t +ngx_mail_auth_login_username(ngx_mail_session_t *s, ngx_connection_t *c, + ngx_uint_t n) +{ + ngx_str_t *arg; + + arg = s->args.elts; + + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "mail auth login username: \"%V\"", &arg[n]); + + s->login.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[n].len)); + if (s->login.data == NULL) { + return NGX_ERROR; + } + + if (ngx_decode_base64(&s->login, &arg[n]) != NGX_OK) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "client sent invalid base64 encoding in AUTH LOGIN command"); + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "mail auth login username: \"%V\"", &s->login); + + return NGX_OK; +} + + +ngx_int_t +ngx_mail_auth_login_password(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_str_t *arg; + + arg = s->args.elts; + +#if (NGX_DEBUG_MAIL_PASSWD) + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "mail auth login password: \"%V\"", &arg[0]); +#endif + + s->passwd.data = ngx_pnalloc(c->pool, + ngx_base64_decoded_length(arg[0].len)); + if (s->passwd.data == NULL) { + return NGX_ERROR; + } + + if (ngx_decode_base64(&s->passwd, &arg[0]) != NGX_OK) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "client sent invalid base64 encoding in AUTH LOGIN command"); + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + +#if (NGX_DEBUG_MAIL_PASSWD) + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "mail auth login password: \"%V\"", &s->passwd); +#endif + + return NGX_DONE; +} + + +ngx_int_t +ngx_mail_auth_cram_md5_salt(ngx_mail_session_t *s, ngx_connection_t *c, + char *prefix, size_t len) +{ + u_char *p; + ngx_str_t salt; + ngx_uint_t n; + + p = ngx_pnalloc(c->pool, len + ngx_base64_encoded_length(s->salt.len) + 2); + if (p == NULL) { + return NGX_ERROR; + } + + salt.data = ngx_cpymem(p, prefix, len); + s->salt.len -= 2; + + ngx_encode_base64(&salt, &s->salt); + + s->salt.len += 2; + n = len + salt.len; + p[n++] = CR; p[n++] = LF; + + s->out.len = n; + s->out.data = p; + + return NGX_OK; +} + + +ngx_int_t +ngx_mail_auth_cram_md5(ngx_mail_session_t *s, ngx_connection_t *c) +{ + u_char *p, *last; + ngx_str_t *arg; + + arg = s->args.elts; + + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "mail auth cram-md5: \"%V\"", &arg[0]); + + s->login.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[0].len)); + if (s->login.data == NULL) { + return NGX_ERROR; + } + + if (ngx_decode_base64(&s->login, &arg[0]) != NGX_OK) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "client sent invalid base64 encoding in AUTH CRAM-MD5 command"); + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + p = s->login.data; + last = p + s->login.len; + + while (p < last) { + if (*p++ == ' ') { + s->login.len = p - s->login.data - 1; + s->passwd.len = last - p; + s->passwd.data = p; + break; + } + } + + if (s->passwd.len != 32) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "client sent invalid CRAM-MD5 hash in AUTH CRAM-MD5 command"); + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0, + "mail auth cram-md5: \"%V\" \"%V\"", &s->login, &s->passwd); + + s->auth_method = NGX_MAIL_AUTH_CRAM_MD5; + + return NGX_DONE; +} + + +void +ngx_mail_send(ngx_event_t *wev) +{ + ngx_int_t n; + ngx_connection_t *c; + ngx_mail_session_t *s; + ngx_mail_core_srv_conf_t *cscf; + + c = wev->data; + s = c->data; + + if (wev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); + c->timedout = 1; + ngx_mail_close_connection(c); + return; + } + + if (s->out.len == 0) { + if (ngx_handle_write_event(c->write, 0) != NGX_OK) { + ngx_mail_close_connection(c); + } + + return; + } + + n = c->send(c, s->out.data, s->out.len); + + if (n > 0) { + s->out.len -= n; + + if (wev->timer_set) { + ngx_del_timer(wev); + } + + if (s->quit) { + ngx_mail_close_connection(c); + return; + } + + if (s->blocked) { + c->read->handler(c->read); + } + + return; + } + + if (n == NGX_ERROR) { + ngx_mail_close_connection(c); + return; + } + + /* n == NGX_AGAIN */ + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + ngx_add_timer(c->write, cscf->timeout); + + if (ngx_handle_write_event(c->write, 0) != NGX_OK) { + ngx_mail_close_connection(c); + return; + } +} + + +ngx_int_t +ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ssize_t n; + ngx_int_t rc; + ngx_str_t l; + ngx_mail_core_srv_conf_t *cscf; + + n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last); + + if (n == NGX_ERROR || n == 0) { + ngx_mail_close_connection(c); + return NGX_ERROR; + } + + if (n > 0) { + s->buffer->last += n; + } + + if (n == NGX_AGAIN) { + if (ngx_handle_read_event(c->read, 0) != NGX_OK) { + ngx_mail_session_internal_server_error(s); + return NGX_ERROR; + } + + return NGX_AGAIN; + } + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + rc = cscf->protocol->parse_command(s); + + if (rc == NGX_AGAIN) { + + if (s->buffer->last < s->buffer->end) { + return rc; + } + + l.len = s->buffer->last - s->buffer->start; + l.data = s->buffer->start; + + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "client sent too long command \"%V\"", &l); + + s->quit = 1; + + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + if (rc == NGX_IMAP_NEXT || rc == NGX_MAIL_PARSE_INVALID_COMMAND) { + return rc; + } + + if (rc == NGX_ERROR) { + ngx_mail_close_connection(c); + return NGX_ERROR; + } + + return NGX_OK; +} + + +void +ngx_mail_auth(ngx_mail_session_t *s, ngx_connection_t *c) +{ + s->args.nelts = 0; + s->buffer->pos = s->buffer->start; + s->buffer->last = s->buffer->start; + s->state = 0; + + if (c->read->timer_set) { + ngx_del_timer(c->read); + } + + s->login_attempt++; + + ngx_mail_auth_http_init(s); +} + + +void +ngx_mail_session_internal_server_error(ngx_mail_session_t *s) +{ + ngx_mail_core_srv_conf_t *cscf; + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + s->out = cscf->protocol->internal_server_error; + s->quit = 1; + + ngx_mail_send(s->connection->write); +} + + +void +ngx_mail_close_connection(ngx_connection_t *c) +{ + ngx_pool_t *pool; + + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "close mail connection: %d", c->fd); + +#if (NGX_MAIL_SSL) + + if (c->ssl) { + if (ngx_ssl_shutdown(c) == NGX_AGAIN) { + c->ssl->handler = ngx_mail_close_connection; + return; + } + } + +#endif + +#if (NGX_STAT_STUB) + (void) ngx_atomic_fetch_add(ngx_stat_active, -1); +#endif + + c->destroyed = 1; + + pool = c->pool; + + ngx_close_connection(c); + + ngx_destroy_pool(pool); +} + + +u_char * +ngx_mail_log_error(ngx_log_t *log, u_char *buf, size_t len) +{ + u_char *p; + ngx_mail_session_t *s; + ngx_mail_log_ctx_t *ctx; + + if (log->action) { + p = ngx_snprintf(buf, len, " while %s", log->action); + len -= p - buf; + buf = p; + } + + ctx = log->data; + + p = ngx_snprintf(buf, len, ", client: %V", ctx->client); + len -= p - buf; + buf = p; + + s = ctx->session; + + if (s == NULL) { + return p; + } + + p = ngx_snprintf(buf, len, "%s, server: %V", + s->starttls ? " using starttls" : "", + s->addr_text); + len -= p - buf; + buf = p; + + if (s->login.len == 0) { + return p; + } + + p = ngx_snprintf(buf, len, ", login: \"%V\"", &s->login); + len -= p - buf; + buf = p; + + if (s->proxy == NULL) { + return p; + } + + p = ngx_snprintf(buf, len, ", upstream: %V", s->proxy->upstream.name); + + return p; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail_imap_handler.c b/release/src/router/nginx/src/mail/ngx_mail_imap_handler.c new file mode 100644 index 0000000000..57e2fb77da --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_imap_handler.c @@ -0,0 +1,457 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include +#include + + +static ngx_int_t ngx_mail_imap_login(ngx_mail_session_t *s, + ngx_connection_t *c); +static ngx_int_t ngx_mail_imap_authenticate(ngx_mail_session_t *s, + ngx_connection_t *c); +static ngx_int_t ngx_mail_imap_capability(ngx_mail_session_t *s, + ngx_connection_t *c); +static ngx_int_t ngx_mail_imap_starttls(ngx_mail_session_t *s, + ngx_connection_t *c); + + +static u_char imap_greeting[] = "* OK IMAP4 ready" CRLF; +static u_char imap_star[] = "* "; +static u_char imap_ok[] = "OK completed" CRLF; +static u_char imap_next[] = "+ OK" CRLF; +static u_char imap_plain_next[] = "+ " CRLF; +static u_char imap_username[] = "+ VXNlcm5hbWU6" CRLF; +static u_char imap_password[] = "+ UGFzc3dvcmQ6" CRLF; +static u_char imap_bye[] = "* BYE" CRLF; +static u_char imap_invalid_command[] = "BAD invalid command" CRLF; + + +void +ngx_mail_imap_init_session(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_mail_core_srv_conf_t *cscf; + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + ngx_str_set(&s->out, imap_greeting); + + c->read->handler = ngx_mail_imap_init_protocol; + + ngx_add_timer(c->read, cscf->timeout); + + if (ngx_handle_read_event(c->read, 0) != NGX_OK) { + ngx_mail_close_connection(c); + } + + ngx_mail_send(c->write); +} + + +void +ngx_mail_imap_init_protocol(ngx_event_t *rev) +{ + ngx_connection_t *c; + ngx_mail_session_t *s; + ngx_mail_imap_srv_conf_t *iscf; + + c = rev->data; + + c->log->action = "in auth state"; + + if (rev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); + c->timedout = 1; + ngx_mail_close_connection(c); + return; + } + + s = c->data; + + if (s->buffer == NULL) { + if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t)) + == NGX_ERROR) + { + ngx_mail_session_internal_server_error(s); + return; + } + + iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module); + + s->buffer = ngx_create_temp_buf(c->pool, iscf->client_buffer_size); + if (s->buffer == NULL) { + ngx_mail_session_internal_server_error(s); + return; + } + } + + s->mail_state = ngx_imap_start; + c->read->handler = ngx_mail_imap_auth_state; + + ngx_mail_imap_auth_state(rev); +} + + +void +ngx_mail_imap_auth_state(ngx_event_t *rev) +{ + u_char *p, *dst, *src, *end; + ngx_str_t *arg; + ngx_int_t rc; + ngx_uint_t tag, i; + ngx_connection_t *c; + ngx_mail_session_t *s; + + c = rev->data; + s = c->data; + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth state"); + + if (rev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); + c->timedout = 1; + ngx_mail_close_connection(c); + return; + } + + if (s->out.len) { + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap send handler busy"); + s->blocked = 1; + return; + } + + s->blocked = 0; + + rc = ngx_mail_read_command(s, c); + + if (rc == NGX_AGAIN || rc == NGX_ERROR) { + return; + } + + tag = 1; + s->text.len = 0; + ngx_str_set(&s->out, imap_ok); + + if (rc == NGX_OK) { + + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth command: %i", + s->command); + + if (s->backslash) { + + arg = s->args.elts; + + for (i = 0; i < s->args.nelts; i++) { + dst = arg[i].data; + end = dst + arg[i].len; + + for (src = dst; src < end; dst++) { + *dst = *src; + if (*src++ == '\\') { + *dst = *src++; + } + } + + arg[i].len = dst - arg[i].data; + } + + s->backslash = 0; + } + + switch (s->mail_state) { + + case ngx_imap_start: + + switch (s->command) { + + case NGX_IMAP_LOGIN: + rc = ngx_mail_imap_login(s, c); + break; + + case NGX_IMAP_AUTHENTICATE: + rc = ngx_mail_imap_authenticate(s, c); + tag = (rc != NGX_OK); + break; + + case NGX_IMAP_CAPABILITY: + rc = ngx_mail_imap_capability(s, c); + break; + + case NGX_IMAP_LOGOUT: + s->quit = 1; + ngx_str_set(&s->text, imap_bye); + break; + + case NGX_IMAP_NOOP: + break; + + case NGX_IMAP_STARTTLS: + rc = ngx_mail_imap_starttls(s, c); + break; + + default: + rc = NGX_MAIL_PARSE_INVALID_COMMAND; + break; + } + + break; + + case ngx_imap_auth_login_username: + rc = ngx_mail_auth_login_username(s, c, 0); + + tag = 0; + ngx_str_set(&s->out, imap_password); + s->mail_state = ngx_imap_auth_login_password; + + break; + + case ngx_imap_auth_login_password: + rc = ngx_mail_auth_login_password(s, c); + break; + + case ngx_imap_auth_plain: + rc = ngx_mail_auth_plain(s, c, 0); + break; + + case ngx_imap_auth_cram_md5: + rc = ngx_mail_auth_cram_md5(s, c); + break; + } + + } else if (rc == NGX_IMAP_NEXT) { + tag = 0; + ngx_str_set(&s->out, imap_next); + } + + switch (rc) { + + case NGX_DONE: + ngx_mail_auth(s, c); + return; + + case NGX_ERROR: + ngx_mail_session_internal_server_error(s); + return; + + case NGX_MAIL_PARSE_INVALID_COMMAND: + s->state = 0; + ngx_str_set(&s->out, imap_invalid_command); + s->mail_state = ngx_imap_start; + break; + } + + if (tag) { + if (s->tag.len == 0) { + ngx_str_set(&s->tag, imap_star); + } + + if (s->tagged_line.len < s->tag.len + s->text.len + s->out.len) { + s->tagged_line.len = s->tag.len + s->text.len + s->out.len; + s->tagged_line.data = ngx_pnalloc(c->pool, s->tagged_line.len); + if (s->tagged_line.data == NULL) { + ngx_mail_close_connection(c); + return; + } + } + + p = s->tagged_line.data; + + if (s->text.len) { + p = ngx_cpymem(p, s->text.data, s->text.len); + } + + p = ngx_cpymem(p, s->tag.data, s->tag.len); + ngx_memcpy(p, s->out.data, s->out.len); + + s->out.len = s->text.len + s->tag.len + s->out.len; + s->out.data = s->tagged_line.data; + } + + if (rc != NGX_IMAP_NEXT) { + s->args.nelts = 0; + + if (s->state) { + /* preserve tag */ + s->arg_start = s->buffer->start + s->tag.len; + s->buffer->pos = s->arg_start; + s->buffer->last = s->arg_start; + + } else { + s->buffer->pos = s->buffer->start; + s->buffer->last = s->buffer->start; + s->tag.len = 0; + } + } + + ngx_mail_send(c->write); +} + + +static ngx_int_t +ngx_mail_imap_login(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_str_t *arg; + +#if (NGX_MAIL_SSL) + if (ngx_mail_starttls_only(s, c)) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } +#endif + + arg = s->args.elts; + + if (s->args.nelts != 2 || arg[0].len == 0) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + s->login.len = arg[0].len; + s->login.data = ngx_pnalloc(c->pool, s->login.len); + if (s->login.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(s->login.data, arg[0].data, s->login.len); + + s->passwd.len = arg[1].len; + s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len); + if (s->passwd.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len); + +#if (NGX_DEBUG_MAIL_PASSWD) + ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0, + "imap login:\"%V\" passwd:\"%V\"", + &s->login, &s->passwd); +#else + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "imap login:\"%V\"", &s->login); +#endif + + return NGX_DONE; +} + + +static ngx_int_t +ngx_mail_imap_authenticate(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_int_t rc; + ngx_mail_core_srv_conf_t *cscf; + ngx_mail_imap_srv_conf_t *iscf; + +#if (NGX_MAIL_SSL) + if (ngx_mail_starttls_only(s, c)) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } +#endif + + rc = ngx_mail_auth_parse(s, c); + + switch (rc) { + + case NGX_MAIL_AUTH_LOGIN: + + ngx_str_set(&s->out, imap_username); + s->mail_state = ngx_imap_auth_login_username; + + return NGX_OK; + + case NGX_MAIL_AUTH_LOGIN_USERNAME: + + ngx_str_set(&s->out, imap_password); + s->mail_state = ngx_imap_auth_login_password; + + return ngx_mail_auth_login_username(s, c, 1); + + case NGX_MAIL_AUTH_PLAIN: + + ngx_str_set(&s->out, imap_plain_next); + s->mail_state = ngx_imap_auth_plain; + + return NGX_OK; + + case NGX_MAIL_AUTH_CRAM_MD5: + + iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module); + + if (!(iscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + if (s->salt.data == NULL) { + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + if (ngx_mail_salt(s, c, cscf) != NGX_OK) { + return NGX_ERROR; + } + } + + if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) { + s->mail_state = ngx_imap_auth_cram_md5; + return NGX_OK; + } + + return NGX_ERROR; + } + + return rc; +} + + +static ngx_int_t +ngx_mail_imap_capability(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_mail_imap_srv_conf_t *iscf; + + iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module); + +#if (NGX_MAIL_SSL) + + if (c->ssl == NULL) { + ngx_mail_ssl_conf_t *sslcf; + + sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); + + if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) { + s->text = iscf->starttls_capability; + return NGX_OK; + } + + if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) { + s->text = iscf->starttls_only_capability; + return NGX_OK; + } + } +#endif + + s->text = iscf->capability; + + return NGX_OK; +} + + +static ngx_int_t +ngx_mail_imap_starttls(ngx_mail_session_t *s, ngx_connection_t *c) +{ +#if (NGX_MAIL_SSL) + ngx_mail_ssl_conf_t *sslcf; + + if (c->ssl == NULL) { + sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); + if (sslcf->starttls) { + c->read->handler = ngx_mail_starttls_handler; + return NGX_OK; + } + } + +#endif + + return NGX_MAIL_PARSE_INVALID_COMMAND; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail_imap_module.c b/release/src/router/nginx/src/mail/ngx_mail_imap_module.c new file mode 100644 index 0000000000..dc80b4fb4c --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_imap_module.c @@ -0,0 +1,253 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include +#include + + +static void *ngx_mail_imap_create_srv_conf(ngx_conf_t *cf); +static char *ngx_mail_imap_merge_srv_conf(ngx_conf_t *cf, void *parent, + void *child); + + +static ngx_str_t ngx_mail_imap_default_capabilities[] = { + ngx_string("IMAP4"), + ngx_string("IMAP4rev1"), + ngx_string("UIDPLUS"), + ngx_null_string +}; + + +static ngx_conf_bitmask_t ngx_mail_imap_auth_methods[] = { + { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, + { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED }, + { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, + { ngx_null_string, 0 } +}; + + +static ngx_str_t ngx_mail_imap_auth_methods_names[] = { + ngx_string("AUTH=PLAIN"), + ngx_string("AUTH=LOGIN"), + ngx_null_string, /* APOP */ + ngx_string("AUTH=CRAM-MD5"), + ngx_null_string /* NONE */ +}; + + +static ngx_mail_protocol_t ngx_mail_imap_protocol = { + ngx_string("imap"), + { 143, 993, 0, 0 }, + NGX_MAIL_IMAP_PROTOCOL, + + ngx_mail_imap_init_session, + ngx_mail_imap_init_protocol, + ngx_mail_imap_parse_command, + ngx_mail_imap_auth_state, + + ngx_string("* BAD internal server error" CRLF) +}; + + +static ngx_command_t ngx_mail_imap_commands[] = { + + { ngx_string("imap_client_buffer"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_imap_srv_conf_t, client_buffer_size), + NULL }, + + { ngx_string("imap_capabilities"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, + ngx_mail_capabilities, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_imap_srv_conf_t, capabilities), + NULL }, + + { ngx_string("imap_auth"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, + ngx_conf_set_bitmask_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_imap_srv_conf_t, auth_methods), + &ngx_mail_imap_auth_methods }, + + ngx_null_command +}; + + +static ngx_mail_module_t ngx_mail_imap_module_ctx = { + &ngx_mail_imap_protocol, /* protocol */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + ngx_mail_imap_create_srv_conf, /* create server configuration */ + ngx_mail_imap_merge_srv_conf /* merge server configuration */ +}; + + +ngx_module_t ngx_mail_imap_module = { + NGX_MODULE_V1, + &ngx_mail_imap_module_ctx, /* module context */ + ngx_mail_imap_commands, /* module directives */ + NGX_MAIL_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_mail_imap_create_srv_conf(ngx_conf_t *cf) +{ + ngx_mail_imap_srv_conf_t *iscf; + + iscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_imap_srv_conf_t)); + if (iscf == NULL) { + return NULL; + } + + iscf->client_buffer_size = NGX_CONF_UNSET_SIZE; + + if (ngx_array_init(&iscf->capabilities, cf->pool, 4, sizeof(ngx_str_t)) + != NGX_OK) + { + return NULL; + } + + return iscf; +} + + +static char * +ngx_mail_imap_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_mail_imap_srv_conf_t *prev = parent; + ngx_mail_imap_srv_conf_t *conf = child; + + u_char *p, *auth; + size_t size; + ngx_str_t *c, *d; + ngx_uint_t i, m; + + ngx_conf_merge_size_value(conf->client_buffer_size, + prev->client_buffer_size, + (size_t) ngx_pagesize); + + ngx_conf_merge_bitmask_value(conf->auth_methods, + prev->auth_methods, + (NGX_CONF_BITMASK_SET + |NGX_MAIL_AUTH_PLAIN_ENABLED)); + + + if (conf->capabilities.nelts == 0) { + conf->capabilities = prev->capabilities; + } + + if (conf->capabilities.nelts == 0) { + + for (d = ngx_mail_imap_default_capabilities; d->len; d++) { + c = ngx_array_push(&conf->capabilities); + if (c == NULL) { + return NGX_CONF_ERROR; + } + + *c = *d; + } + } + + size = sizeof("* CAPABILITY" CRLF) - 1; + + c = conf->capabilities.elts; + for (i = 0; i < conf->capabilities.nelts; i++) { + size += 1 + c[i].len; + } + + for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; + m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED; + m <<= 1, i++) + { + if (m & conf->auth_methods) { + size += 1 + ngx_mail_imap_auth_methods_names[i].len; + } + } + + p = ngx_pnalloc(cf->pool, size); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->capability.len = size; + conf->capability.data = p; + + p = ngx_cpymem(p, "* CAPABILITY", sizeof("* CAPABILITY") - 1); + + for (i = 0; i < conf->capabilities.nelts; i++) { + *p++ = ' '; + p = ngx_cpymem(p, c[i].data, c[i].len); + } + + auth = p; + + for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; + m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED; + m <<= 1, i++) + { + if (m & conf->auth_methods) { + *p++ = ' '; + p = ngx_cpymem(p, ngx_mail_imap_auth_methods_names[i].data, + ngx_mail_imap_auth_methods_names[i].len); + } + } + + *p++ = CR; *p = LF; + + + size += sizeof(" STARTTLS") - 1; + + p = ngx_pnalloc(cf->pool, size); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->starttls_capability.len = size; + conf->starttls_capability.data = p; + + p = ngx_cpymem(p, conf->capability.data, + conf->capability.len - (sizeof(CRLF) - 1)); + p = ngx_cpymem(p, " STARTTLS", sizeof(" STARTTLS") - 1); + *p++ = CR; *p = LF; + + + size = (auth - conf->capability.data) + sizeof(CRLF) - 1 + + sizeof(" STARTTLS LOGINDISABLED") - 1; + + p = ngx_pnalloc(cf->pool, size); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->starttls_only_capability.len = size; + conf->starttls_only_capability.data = p; + + p = ngx_cpymem(p, conf->capability.data, + auth - conf->capability.data); + p = ngx_cpymem(p, " STARTTLS LOGINDISABLED", + sizeof(" STARTTLS LOGINDISABLED") - 1); + *p++ = CR; *p = LF; + + return NGX_CONF_OK; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail_imap_module.h b/release/src/router/nginx/src/mail/ngx_mail_imap_module.h new file mode 100644 index 0000000000..131b44597f --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_imap_module.h @@ -0,0 +1,39 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_MAIL_IMAP_MODULE_H_INCLUDED_ +#define _NGX_MAIL_IMAP_MODULE_H_INCLUDED_ + + +#include +#include +#include + + +typedef struct { + size_t client_buffer_size; + + ngx_str_t capability; + ngx_str_t starttls_capability; + ngx_str_t starttls_only_capability; + + ngx_uint_t auth_methods; + + ngx_array_t capabilities; +} ngx_mail_imap_srv_conf_t; + + +void ngx_mail_imap_init_session(ngx_mail_session_t *s, ngx_connection_t *c); +void ngx_mail_imap_init_protocol(ngx_event_t *rev); +void ngx_mail_imap_auth_state(ngx_event_t *rev); +ngx_int_t ngx_mail_imap_parse_command(ngx_mail_session_t *s); + + +extern ngx_module_t ngx_mail_imap_module; + + +#endif /* _NGX_MAIL_IMAP_MODULE_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/mail/ngx_mail_parse.c b/release/src/router/nginx/src/mail/ngx_mail_parse.c new file mode 100644 index 0000000000..eb16d5b4fe --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_parse.c @@ -0,0 +1,888 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include +#include +#include +#include + + +ngx_int_t +ngx_mail_pop3_parse_command(ngx_mail_session_t *s) +{ + u_char ch, *p, *c, c0, c1, c2, c3; + ngx_str_t *arg; + enum { + sw_start = 0, + sw_spaces_before_argument, + sw_argument, + sw_almost_done + } state; + + state = s->state; + + for (p = s->buffer->pos; p < s->buffer->last; p++) { + ch = *p; + + switch (state) { + + /* POP3 command */ + case sw_start: + if (ch == ' ' || ch == CR || ch == LF) { + c = s->buffer->start; + + if (p - c == 4) { + + c0 = ngx_toupper(c[0]); + c1 = ngx_toupper(c[1]); + c2 = ngx_toupper(c[2]); + c3 = ngx_toupper(c[3]); + + if (c0 == 'U' && c1 == 'S' && c2 == 'E' && c3 == 'R') + { + s->command = NGX_POP3_USER; + + } else if (c0 == 'P' && c1 == 'A' && c2 == 'S' && c3 == 'S') + { + s->command = NGX_POP3_PASS; + + } else if (c0 == 'A' && c1 == 'P' && c2 == 'O' && c3 == 'P') + { + s->command = NGX_POP3_APOP; + + } else if (c0 == 'Q' && c1 == 'U' && c2 == 'I' && c3 == 'T') + { + s->command = NGX_POP3_QUIT; + + } else if (c0 == 'C' && c1 == 'A' && c2 == 'P' && c3 == 'A') + { + s->command = NGX_POP3_CAPA; + + } else if (c0 == 'A' && c1 == 'U' && c2 == 'T' && c3 == 'H') + { + s->command = NGX_POP3_AUTH; + + } else if (c0 == 'N' && c1 == 'O' && c2 == 'O' && c3 == 'P') + { + s->command = NGX_POP3_NOOP; +#if (NGX_MAIL_SSL) + } else if (c0 == 'S' && c1 == 'T' && c2 == 'L' && c3 == 'S') + { + s->command = NGX_POP3_STLS; +#endif + } else { + goto invalid; + } + + } else { + goto invalid; + } + + switch (ch) { + case ' ': + state = sw_spaces_before_argument; + break; + case CR: + state = sw_almost_done; + break; + case LF: + goto done; + } + break; + } + + if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) { + goto invalid; + } + + break; + + case sw_spaces_before_argument: + switch (ch) { + case ' ': + break; + case CR: + state = sw_almost_done; + s->arg_end = p; + break; + case LF: + s->arg_end = p; + goto done; + default: + if (s->args.nelts <= 2) { + state = sw_argument; + s->arg_start = p; + break; + } + goto invalid; + } + break; + + case sw_argument: + switch (ch) { + + case ' ': + + /* + * the space should be considered as part of the at username + * or password, but not of argument in other commands + */ + + if (s->command == NGX_POP3_USER + || s->command == NGX_POP3_PASS) + { + break; + } + + /* fall through */ + + case CR: + case LF: + arg = ngx_array_push(&s->args); + if (arg == NULL) { + return NGX_ERROR; + } + arg->len = p - s->arg_start; + arg->data = s->arg_start; + s->arg_start = NULL; + + switch (ch) { + case ' ': + state = sw_spaces_before_argument; + break; + case CR: + state = sw_almost_done; + break; + case LF: + goto done; + } + break; + + default: + break; + } + break; + + case sw_almost_done: + switch (ch) { + case LF: + goto done; + default: + goto invalid; + } + } + } + + s->buffer->pos = p; + s->state = state; + + return NGX_AGAIN; + +done: + + s->buffer->pos = p + 1; + + if (s->arg_start) { + arg = ngx_array_push(&s->args); + if (arg == NULL) { + return NGX_ERROR; + } + arg->len = s->arg_end - s->arg_start; + arg->data = s->arg_start; + s->arg_start = NULL; + } + + s->state = (s->command != NGX_POP3_AUTH) ? sw_start : sw_argument; + + return NGX_OK; + +invalid: + + s->state = sw_start; + s->arg_start = NULL; + + return NGX_MAIL_PARSE_INVALID_COMMAND; +} + + +ngx_int_t +ngx_mail_imap_parse_command(ngx_mail_session_t *s) +{ + u_char ch, *p, *c; + ngx_str_t *arg; + enum { + sw_start = 0, + sw_spaces_before_command, + sw_command, + sw_spaces_before_argument, + sw_argument, + sw_backslash, + sw_literal, + sw_no_sync_literal_argument, + sw_start_literal_argument, + sw_literal_argument, + sw_end_literal_argument, + sw_almost_done + } state; + + state = s->state; + + for (p = s->buffer->pos; p < s->buffer->last; p++) { + ch = *p; + + switch (state) { + + /* IMAP tag */ + case sw_start: + switch (ch) { + case ' ': + s->tag.len = p - s->buffer->start + 1; + s->tag.data = s->buffer->start; + state = sw_spaces_before_command; + break; + case CR: + s->state = sw_start; + return NGX_MAIL_PARSE_INVALID_COMMAND; + case LF: + s->state = sw_start; + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + break; + + case sw_spaces_before_command: + switch (ch) { + case ' ': + break; + case CR: + s->state = sw_start; + return NGX_MAIL_PARSE_INVALID_COMMAND; + case LF: + s->state = sw_start; + return NGX_MAIL_PARSE_INVALID_COMMAND; + default: + s->cmd_start = p; + state = sw_command; + break; + } + break; + + case sw_command: + if (ch == ' ' || ch == CR || ch == LF) { + + c = s->cmd_start; + + switch (p - c) { + + case 4: + if ((c[0] == 'N' || c[0] == 'n') + && (c[1] == 'O'|| c[1] == 'o') + && (c[2] == 'O'|| c[2] == 'o') + && (c[3] == 'P'|| c[3] == 'p')) + { + s->command = NGX_IMAP_NOOP; + + } else { + goto invalid; + } + break; + + case 5: + if ((c[0] == 'L'|| c[0] == 'l') + && (c[1] == 'O'|| c[1] == 'o') + && (c[2] == 'G'|| c[2] == 'g') + && (c[3] == 'I'|| c[3] == 'i') + && (c[4] == 'N'|| c[4] == 'n')) + { + s->command = NGX_IMAP_LOGIN; + + } else { + goto invalid; + } + break; + + case 6: + if ((c[0] == 'L'|| c[0] == 'l') + && (c[1] == 'O'|| c[1] == 'o') + && (c[2] == 'G'|| c[2] == 'g') + && (c[3] == 'O'|| c[3] == 'o') + && (c[4] == 'U'|| c[4] == 'u') + && (c[5] == 'T'|| c[5] == 't')) + { + s->command = NGX_IMAP_LOGOUT; + + } else { + goto invalid; + } + break; + +#if (NGX_MAIL_SSL) + case 8: + if ((c[0] == 'S'|| c[0] == 's') + && (c[1] == 'T'|| c[1] == 't') + && (c[2] == 'A'|| c[2] == 'a') + && (c[3] == 'R'|| c[3] == 'r') + && (c[4] == 'T'|| c[4] == 't') + && (c[5] == 'T'|| c[5] == 't') + && (c[6] == 'L'|| c[6] == 'l') + && (c[7] == 'S'|| c[7] == 's')) + { + s->command = NGX_IMAP_STARTTLS; + + } else { + goto invalid; + } + break; +#endif + + case 10: + if ((c[0] == 'C'|| c[0] == 'c') + && (c[1] == 'A'|| c[1] == 'a') + && (c[2] == 'P'|| c[2] == 'p') + && (c[3] == 'A'|| c[3] == 'a') + && (c[4] == 'B'|| c[4] == 'b') + && (c[5] == 'I'|| c[5] == 'i') + && (c[6] == 'L'|| c[6] == 'l') + && (c[7] == 'I'|| c[7] == 'i') + && (c[8] == 'T'|| c[8] == 't') + && (c[9] == 'Y'|| c[9] == 'y')) + { + s->command = NGX_IMAP_CAPABILITY; + + } else { + goto invalid; + } + break; + + case 12: + if ((c[0] == 'A'|| c[0] == 'a') + && (c[1] == 'U'|| c[1] == 'u') + && (c[2] == 'T'|| c[2] == 't') + && (c[3] == 'H'|| c[3] == 'h') + && (c[4] == 'E'|| c[4] == 'e') + && (c[5] == 'N'|| c[5] == 'n') + && (c[6] == 'T'|| c[6] == 't') + && (c[7] == 'I'|| c[7] == 'i') + && (c[8] == 'C'|| c[8] == 'c') + && (c[9] == 'A'|| c[9] == 'a') + && (c[10] == 'T'|| c[10] == 't') + && (c[11] == 'E'|| c[11] == 'e')) + { + s->command = NGX_IMAP_AUTHENTICATE; + + } else { + goto invalid; + } + break; + + default: + goto invalid; + } + + switch (ch) { + case ' ': + state = sw_spaces_before_argument; + break; + case CR: + state = sw_almost_done; + break; + case LF: + goto done; + } + break; + } + + if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) { + goto invalid; + } + + break; + + case sw_spaces_before_argument: + switch (ch) { + case ' ': + break; + case CR: + state = sw_almost_done; + s->arg_end = p; + break; + case LF: + s->arg_end = p; + goto done; + case '"': + if (s->args.nelts <= 2) { + s->quoted = 1; + s->arg_start = p + 1; + state = sw_argument; + break; + } + goto invalid; + case '{': + if (s->args.nelts <= 2) { + state = sw_literal; + break; + } + goto invalid; + default: + if (s->args.nelts <= 2) { + s->arg_start = p; + state = sw_argument; + break; + } + goto invalid; + } + break; + + case sw_argument: + if (ch == ' ' && s->quoted) { + break; + } + + switch (ch) { + case '"': + if (!s->quoted) { + break; + } + s->quoted = 0; + /* fall through */ + case ' ': + case CR: + case LF: + arg = ngx_array_push(&s->args); + if (arg == NULL) { + return NGX_ERROR; + } + arg->len = p - s->arg_start; + arg->data = s->arg_start; + s->arg_start = NULL; + + switch (ch) { + case '"': + case ' ': + state = sw_spaces_before_argument; + break; + case CR: + state = sw_almost_done; + break; + case LF: + goto done; + } + break; + case '\\': + if (s->quoted) { + s->backslash = 1; + state = sw_backslash; + } + break; + } + break; + + case sw_backslash: + switch (ch) { + case CR: + case LF: + goto invalid; + default: + state = sw_argument; + } + break; + + case sw_literal: + if (ch >= '0' && ch <= '9') { + s->literal_len = s->literal_len * 10 + (ch - '0'); + break; + } + if (ch == '}') { + state = sw_start_literal_argument; + break; + } + if (ch == '+') { + state = sw_no_sync_literal_argument; + break; + } + goto invalid; + + case sw_no_sync_literal_argument: + if (ch == '}') { + s->no_sync_literal = 1; + state = sw_start_literal_argument; + break; + } + goto invalid; + + case sw_start_literal_argument: + switch (ch) { + case CR: + break; + case LF: + s->buffer->pos = p + 1; + s->arg_start = p + 1; + if (s->no_sync_literal == 0) { + s->state = sw_literal_argument; + return NGX_IMAP_NEXT; + } + state = sw_literal_argument; + s->no_sync_literal = 0; + break; + default: + goto invalid; + } + break; + + case sw_literal_argument: + if (s->literal_len && --s->literal_len) { + break; + } + + arg = ngx_array_push(&s->args); + if (arg == NULL) { + return NGX_ERROR; + } + arg->len = p + 1 - s->arg_start; + arg->data = s->arg_start; + s->arg_start = NULL; + state = sw_end_literal_argument; + + break; + + case sw_end_literal_argument: + switch (ch) { + case '{': + if (s->args.nelts <= 2) { + state = sw_literal; + break; + } + goto invalid; + case CR: + state = sw_almost_done; + break; + case LF: + goto done; + default: + state = sw_spaces_before_argument; + break; + } + break; + + case sw_almost_done: + switch (ch) { + case LF: + goto done; + default: + goto invalid; + } + } + } + + s->buffer->pos = p; + s->state = state; + + return NGX_AGAIN; + +done: + + s->buffer->pos = p + 1; + + if (s->arg_start) { + arg = ngx_array_push(&s->args); + if (arg == NULL) { + return NGX_ERROR; + } + arg->len = s->arg_end - s->arg_start; + arg->data = s->arg_start; + + s->arg_start = NULL; + s->cmd_start = NULL; + s->quoted = 0; + s->no_sync_literal = 0; + s->literal_len = 0; + } + + s->state = (s->command != NGX_IMAP_AUTHENTICATE) ? sw_start : sw_argument; + + return NGX_OK; + +invalid: + + s->state = sw_start; + s->quoted = 0; + s->no_sync_literal = 0; + s->literal_len = 0; + + return NGX_MAIL_PARSE_INVALID_COMMAND; +} + + +ngx_int_t +ngx_mail_smtp_parse_command(ngx_mail_session_t *s) +{ + u_char ch, *p, *c, c0, c1, c2, c3; + ngx_str_t *arg; + enum { + sw_start = 0, + sw_spaces_before_argument, + sw_argument, + sw_almost_done + } state; + + state = s->state; + + for (p = s->buffer->pos; p < s->buffer->last; p++) { + ch = *p; + + switch (state) { + + /* SMTP command */ + case sw_start: + if (ch == ' ' || ch == CR || ch == LF) { + c = s->buffer->start; + + if (p - c == 4) { + + c0 = ngx_toupper(c[0]); + c1 = ngx_toupper(c[1]); + c2 = ngx_toupper(c[2]); + c3 = ngx_toupper(c[3]); + + if (c0 == 'H' && c1 == 'E' && c2 == 'L' && c3 == 'O') + { + s->command = NGX_SMTP_HELO; + + } else if (c0 == 'E' && c1 == 'H' && c2 == 'L' && c3 == 'O') + { + s->command = NGX_SMTP_EHLO; + + } else if (c0 == 'Q' && c1 == 'U' && c2 == 'I' && c3 == 'T') + { + s->command = NGX_SMTP_QUIT; + + } else if (c0 == 'A' && c1 == 'U' && c2 == 'T' && c3 == 'H') + { + s->command = NGX_SMTP_AUTH; + + } else if (c0 == 'N' && c1 == 'O' && c2 == 'O' && c3 == 'P') + { + s->command = NGX_SMTP_NOOP; + + } else if (c0 == 'M' && c1 == 'A' && c2 == 'I' && c3 == 'L') + { + s->command = NGX_SMTP_MAIL; + + } else if (c0 == 'R' && c1 == 'S' && c2 == 'E' && c3 == 'T') + { + s->command = NGX_SMTP_RSET; + + } else if (c0 == 'R' && c1 == 'C' && c2 == 'P' && c3 == 'T') + { + s->command = NGX_SMTP_RCPT; + + } else if (c0 == 'V' && c1 == 'R' && c2 == 'F' && c3 == 'Y') + { + s->command = NGX_SMTP_VRFY; + + } else if (c0 == 'E' && c1 == 'X' && c2 == 'P' && c3 == 'N') + { + s->command = NGX_SMTP_EXPN; + + } else if (c0 == 'H' && c1 == 'E' && c2 == 'L' && c3 == 'P') + { + s->command = NGX_SMTP_HELP; + + } else { + goto invalid; + } +#if (NGX_MAIL_SSL) + } else if (p - c == 8) { + + if ((c[0] == 'S'|| c[0] == 's') + && (c[1] == 'T'|| c[1] == 't') + && (c[2] == 'A'|| c[2] == 'a') + && (c[3] == 'R'|| c[3] == 'r') + && (c[4] == 'T'|| c[4] == 't') + && (c[5] == 'T'|| c[5] == 't') + && (c[6] == 'L'|| c[6] == 'l') + && (c[7] == 'S'|| c[7] == 's')) + { + s->command = NGX_SMTP_STARTTLS; + + } else { + goto invalid; + } +#endif + } else { + goto invalid; + } + + switch (ch) { + case ' ': + state = sw_spaces_before_argument; + break; + case CR: + state = sw_almost_done; + break; + case LF: + goto done; + } + break; + } + + if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) { + goto invalid; + } + + break; + + case sw_spaces_before_argument: + switch (ch) { + case ' ': + break; + case CR: + state = sw_almost_done; + s->arg_end = p; + break; + case LF: + s->arg_end = p; + goto done; + default: + if (s->args.nelts <= 10) { + state = sw_argument; + s->arg_start = p; + break; + } + goto invalid; + } + break; + + case sw_argument: + switch (ch) { + case ' ': + case CR: + case LF: + arg = ngx_array_push(&s->args); + if (arg == NULL) { + return NGX_ERROR; + } + arg->len = p - s->arg_start; + arg->data = s->arg_start; + s->arg_start = NULL; + + switch (ch) { + case ' ': + state = sw_spaces_before_argument; + break; + case CR: + state = sw_almost_done; + break; + case LF: + goto done; + } + break; + + default: + break; + } + break; + + case sw_almost_done: + switch (ch) { + case LF: + goto done; + default: + goto invalid; + } + } + } + + s->buffer->pos = p; + s->state = state; + + return NGX_AGAIN; + +done: + + s->buffer->pos = p + 1; + + if (s->arg_start) { + arg = ngx_array_push(&s->args); + if (arg == NULL) { + return NGX_ERROR; + } + arg->len = s->arg_end - s->arg_start; + arg->data = s->arg_start; + s->arg_start = NULL; + } + + s->state = (s->command != NGX_SMTP_AUTH) ? sw_start : sw_argument; + + return NGX_OK; + +invalid: + + s->state = sw_start; + s->arg_start = NULL; + + return NGX_MAIL_PARSE_INVALID_COMMAND; +} + + +ngx_int_t +ngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_str_t *arg; + +#if (NGX_MAIL_SSL) + if (ngx_mail_starttls_only(s, c)) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } +#endif + + arg = s->args.elts; + + if (arg[0].len == 5) { + + if (ngx_strncasecmp(arg[0].data, (u_char *) "LOGIN", 5) == 0) { + + if (s->args.nelts == 1) { + return NGX_MAIL_AUTH_LOGIN; + } + + if (s->args.nelts == 2) { + return NGX_MAIL_AUTH_LOGIN_USERNAME; + } + + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + if (ngx_strncasecmp(arg[0].data, (u_char *) "PLAIN", 5) == 0) { + + if (s->args.nelts == 1) { + return NGX_MAIL_AUTH_PLAIN; + } + + if (s->args.nelts == 2) { + return ngx_mail_auth_plain(s, c, 1); + } + } + + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + if (arg[0].len == 8) { + + if (s->args.nelts != 1) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + if (ngx_strncasecmp(arg[0].data, (u_char *) "CRAM-MD5", 8) == 0) { + return NGX_MAIL_AUTH_CRAM_MD5; + } + } + + return NGX_MAIL_PARSE_INVALID_COMMAND; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail_pop3_handler.c b/release/src/router/nginx/src/mail/ngx_mail_pop3_handler.c new file mode 100644 index 0000000000..51bc257a59 --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_pop3_handler.c @@ -0,0 +1,500 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include +#include + + +static ngx_int_t ngx_mail_pop3_user(ngx_mail_session_t *s, ngx_connection_t *c); +static ngx_int_t ngx_mail_pop3_pass(ngx_mail_session_t *s, ngx_connection_t *c); +static ngx_int_t ngx_mail_pop3_capa(ngx_mail_session_t *s, ngx_connection_t *c, + ngx_int_t stls); +static ngx_int_t ngx_mail_pop3_stls(ngx_mail_session_t *s, ngx_connection_t *c); +static ngx_int_t ngx_mail_pop3_apop(ngx_mail_session_t *s, ngx_connection_t *c); +static ngx_int_t ngx_mail_pop3_auth(ngx_mail_session_t *s, ngx_connection_t *c); + + +static u_char pop3_greeting[] = "+OK POP3 ready" CRLF; +static u_char pop3_ok[] = "+OK" CRLF; +static u_char pop3_next[] = "+ " CRLF; +static u_char pop3_username[] = "+ VXNlcm5hbWU6" CRLF; +static u_char pop3_password[] = "+ UGFzc3dvcmQ6" CRLF; +static u_char pop3_invalid_command[] = "-ERR invalid command" CRLF; + + +void +ngx_mail_pop3_init_session(ngx_mail_session_t *s, ngx_connection_t *c) +{ + u_char *p; + ngx_mail_core_srv_conf_t *cscf; + ngx_mail_pop3_srv_conf_t *pscf; + + pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module); + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + if (pscf->auth_methods + & (NGX_MAIL_AUTH_APOP_ENABLED|NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) + { + if (ngx_mail_salt(s, c, cscf) != NGX_OK) { + ngx_mail_session_internal_server_error(s); + return; + } + + s->out.data = ngx_pnalloc(c->pool, sizeof(pop3_greeting) + s->salt.len); + if (s->out.data == NULL) { + ngx_mail_session_internal_server_error(s); + return; + } + + p = ngx_cpymem(s->out.data, pop3_greeting, sizeof(pop3_greeting) - 3); + *p++ = ' '; + p = ngx_cpymem(p, s->salt.data, s->salt.len); + + s->out.len = p - s->out.data; + + } else { + ngx_str_set(&s->out, pop3_greeting); + } + + c->read->handler = ngx_mail_pop3_init_protocol; + + ngx_add_timer(c->read, cscf->timeout); + + if (ngx_handle_read_event(c->read, 0) != NGX_OK) { + ngx_mail_close_connection(c); + } + + ngx_mail_send(c->write); +} + + +void +ngx_mail_pop3_init_protocol(ngx_event_t *rev) +{ + ngx_connection_t *c; + ngx_mail_session_t *s; + + c = rev->data; + + c->log->action = "in auth state"; + + if (rev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); + c->timedout = 1; + ngx_mail_close_connection(c); + return; + } + + s = c->data; + + if (s->buffer == NULL) { + if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t)) + == NGX_ERROR) + { + ngx_mail_session_internal_server_error(s); + return; + } + + s->buffer = ngx_create_temp_buf(c->pool, 128); + if (s->buffer == NULL) { + ngx_mail_session_internal_server_error(s); + return; + } + } + + s->mail_state = ngx_pop3_start; + c->read->handler = ngx_mail_pop3_auth_state; + + ngx_mail_pop3_auth_state(rev); +} + + +void +ngx_mail_pop3_auth_state(ngx_event_t *rev) +{ + ngx_int_t rc; + ngx_connection_t *c; + ngx_mail_session_t *s; + + c = rev->data; + s = c->data; + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "pop3 auth state"); + + if (rev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); + c->timedout = 1; + ngx_mail_close_connection(c); + return; + } + + if (s->out.len) { + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "pop3 send handler busy"); + s->blocked = 1; + return; + } + + s->blocked = 0; + + rc = ngx_mail_read_command(s, c); + + if (rc == NGX_AGAIN || rc == NGX_ERROR) { + return; + } + + ngx_str_set(&s->out, pop3_ok); + + if (rc == NGX_OK) { + switch (s->mail_state) { + + case ngx_pop3_start: + + switch (s->command) { + + case NGX_POP3_USER: + rc = ngx_mail_pop3_user(s, c); + break; + + case NGX_POP3_CAPA: + rc = ngx_mail_pop3_capa(s, c, 1); + break; + + case NGX_POP3_APOP: + rc = ngx_mail_pop3_apop(s, c); + break; + + case NGX_POP3_AUTH: + rc = ngx_mail_pop3_auth(s, c); + break; + + case NGX_POP3_QUIT: + s->quit = 1; + break; + + case NGX_POP3_NOOP: + break; + + case NGX_POP3_STLS: + rc = ngx_mail_pop3_stls(s, c); + break; + + default: + rc = NGX_MAIL_PARSE_INVALID_COMMAND; + break; + } + + break; + + case ngx_pop3_user: + + switch (s->command) { + + case NGX_POP3_PASS: + rc = ngx_mail_pop3_pass(s, c); + break; + + case NGX_POP3_CAPA: + rc = ngx_mail_pop3_capa(s, c, 0); + break; + + case NGX_POP3_QUIT: + s->quit = 1; + break; + + case NGX_POP3_NOOP: + break; + + default: + rc = NGX_MAIL_PARSE_INVALID_COMMAND; + break; + } + + break; + + /* suppress warnings */ + case ngx_pop3_passwd: + break; + + case ngx_pop3_auth_login_username: + rc = ngx_mail_auth_login_username(s, c, 0); + + ngx_str_set(&s->out, pop3_password); + s->mail_state = ngx_pop3_auth_login_password; + break; + + case ngx_pop3_auth_login_password: + rc = ngx_mail_auth_login_password(s, c); + break; + + case ngx_pop3_auth_plain: + rc = ngx_mail_auth_plain(s, c, 0); + break; + + case ngx_pop3_auth_cram_md5: + rc = ngx_mail_auth_cram_md5(s, c); + break; + } + } + + switch (rc) { + + case NGX_DONE: + ngx_mail_auth(s, c); + return; + + case NGX_ERROR: + ngx_mail_session_internal_server_error(s); + return; + + case NGX_MAIL_PARSE_INVALID_COMMAND: + s->mail_state = ngx_pop3_start; + s->state = 0; + + ngx_str_set(&s->out, pop3_invalid_command); + + /* fall through */ + + case NGX_OK: + + s->args.nelts = 0; + s->buffer->pos = s->buffer->start; + s->buffer->last = s->buffer->start; + + if (s->state) { + s->arg_start = s->buffer->start; + } + + ngx_mail_send(c->write); + } +} + +static ngx_int_t +ngx_mail_pop3_user(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_str_t *arg; + +#if (NGX_MAIL_SSL) + if (ngx_mail_starttls_only(s, c)) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } +#endif + + if (s->args.nelts != 1) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + arg = s->args.elts; + s->login.len = arg[0].len; + s->login.data = ngx_pnalloc(c->pool, s->login.len); + if (s->login.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(s->login.data, arg[0].data, s->login.len); + + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "pop3 login: \"%V\"", &s->login); + + s->mail_state = ngx_pop3_user; + + return NGX_OK; +} + + +static ngx_int_t +ngx_mail_pop3_pass(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_str_t *arg; + + if (s->args.nelts != 1) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + arg = s->args.elts; + s->passwd.len = arg[0].len; + s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len); + if (s->passwd.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(s->passwd.data, arg[0].data, s->passwd.len); + +#if (NGX_DEBUG_MAIL_PASSWD) + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "pop3 passwd: \"%V\"", &s->passwd); +#endif + + return NGX_DONE; +} + + +static ngx_int_t +ngx_mail_pop3_capa(ngx_mail_session_t *s, ngx_connection_t *c, ngx_int_t stls) +{ + ngx_mail_pop3_srv_conf_t *pscf; + + pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module); + +#if (NGX_MAIL_SSL) + + if (stls && c->ssl == NULL) { + ngx_mail_ssl_conf_t *sslcf; + + sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); + + if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) { + s->out = pscf->starttls_capability; + return NGX_OK; + } + + if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) { + s->out = pscf->starttls_only_capability; + return NGX_OK; + } + } + +#endif + + s->out = pscf->capability; + return NGX_OK; +} + + +static ngx_int_t +ngx_mail_pop3_stls(ngx_mail_session_t *s, ngx_connection_t *c) +{ +#if (NGX_MAIL_SSL) + ngx_mail_ssl_conf_t *sslcf; + + if (c->ssl == NULL) { + sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); + if (sslcf->starttls) { + c->read->handler = ngx_mail_starttls_handler; + return NGX_OK; + } + } + +#endif + + return NGX_MAIL_PARSE_INVALID_COMMAND; +} + + +static ngx_int_t +ngx_mail_pop3_apop(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_str_t *arg; + ngx_mail_pop3_srv_conf_t *pscf; + +#if (NGX_MAIL_SSL) + if (ngx_mail_starttls_only(s, c)) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } +#endif + + if (s->args.nelts != 2) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module); + + if (!(pscf->auth_methods & NGX_MAIL_AUTH_APOP_ENABLED)) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + arg = s->args.elts; + + s->login.len = arg[0].len; + s->login.data = ngx_pnalloc(c->pool, s->login.len); + if (s->login.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(s->login.data, arg[0].data, s->login.len); + + s->passwd.len = arg[1].len; + s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len); + if (s->passwd.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len); + + ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0, + "pop3 apop: \"%V\" \"%V\"", &s->login, &s->passwd); + + s->auth_method = NGX_MAIL_AUTH_APOP; + + return NGX_DONE; +} + + +static ngx_int_t +ngx_mail_pop3_auth(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_int_t rc; + ngx_mail_pop3_srv_conf_t *pscf; + +#if (NGX_MAIL_SSL) + if (ngx_mail_starttls_only(s, c)) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } +#endif + + pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module); + + if (s->args.nelts == 0) { + s->out = pscf->auth_capability; + s->state = 0; + + return NGX_OK; + } + + rc = ngx_mail_auth_parse(s, c); + + switch (rc) { + + case NGX_MAIL_AUTH_LOGIN: + + ngx_str_set(&s->out, pop3_username); + s->mail_state = ngx_pop3_auth_login_username; + + return NGX_OK; + + case NGX_MAIL_AUTH_LOGIN_USERNAME: + + ngx_str_set(&s->out, pop3_password); + s->mail_state = ngx_pop3_auth_login_password; + + return ngx_mail_auth_login_username(s, c, 1); + + case NGX_MAIL_AUTH_PLAIN: + + ngx_str_set(&s->out, pop3_next); + s->mail_state = ngx_pop3_auth_plain; + + return NGX_OK; + + case NGX_MAIL_AUTH_CRAM_MD5: + + if (!(pscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) { + s->mail_state = ngx_pop3_auth_cram_md5; + return NGX_OK; + } + + return NGX_ERROR; + } + + return rc; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail_pop3_module.c b/release/src/router/nginx/src/mail/ngx_mail_pop3_module.c new file mode 100644 index 0000000000..b59747290e --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_pop3_module.c @@ -0,0 +1,264 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include +#include + + +static void *ngx_mail_pop3_create_srv_conf(ngx_conf_t *cf); +static char *ngx_mail_pop3_merge_srv_conf(ngx_conf_t *cf, void *parent, + void *child); + + +static ngx_str_t ngx_mail_pop3_default_capabilities[] = { + ngx_string("TOP"), + ngx_string("USER"), + ngx_string("UIDL"), + ngx_null_string +}; + + +static ngx_conf_bitmask_t ngx_mail_pop3_auth_methods[] = { + { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, + { ngx_string("apop"), NGX_MAIL_AUTH_APOP_ENABLED }, + { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, + { ngx_null_string, 0 } +}; + + +static ngx_str_t ngx_mail_pop3_auth_plain_capability = + ngx_string("+OK methods supported:" CRLF + "LOGIN" CRLF + "PLAIN" CRLF + "." CRLF); + + +static ngx_str_t ngx_mail_pop3_auth_cram_md5_capability = + ngx_string("+OK methods supported:" CRLF + "LOGIN" CRLF + "PLAIN" CRLF + "CRAM-MD5" CRLF + "." CRLF); + + +static ngx_mail_protocol_t ngx_mail_pop3_protocol = { + ngx_string("pop3"), + { 110, 995, 0, 0 }, + NGX_MAIL_POP3_PROTOCOL, + + ngx_mail_pop3_init_session, + ngx_mail_pop3_init_protocol, + ngx_mail_pop3_parse_command, + ngx_mail_pop3_auth_state, + + ngx_string("-ERR internal server error" CRLF) +}; + + +static ngx_command_t ngx_mail_pop3_commands[] = { + + { ngx_string("pop3_capabilities"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, + ngx_mail_capabilities, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_pop3_srv_conf_t, capabilities), + NULL }, + + { ngx_string("pop3_auth"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, + ngx_conf_set_bitmask_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_pop3_srv_conf_t, auth_methods), + &ngx_mail_pop3_auth_methods }, + + ngx_null_command +}; + + +static ngx_mail_module_t ngx_mail_pop3_module_ctx = { + &ngx_mail_pop3_protocol, /* protocol */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + ngx_mail_pop3_create_srv_conf, /* create server configuration */ + ngx_mail_pop3_merge_srv_conf /* merge server configuration */ +}; + + +ngx_module_t ngx_mail_pop3_module = { + NGX_MODULE_V1, + &ngx_mail_pop3_module_ctx, /* module context */ + ngx_mail_pop3_commands, /* module directives */ + NGX_MAIL_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_mail_pop3_create_srv_conf(ngx_conf_t *cf) +{ + ngx_mail_pop3_srv_conf_t *pscf; + + pscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_pop3_srv_conf_t)); + if (pscf == NULL) { + return NULL; + } + + if (ngx_array_init(&pscf->capabilities, cf->pool, 4, sizeof(ngx_str_t)) + != NGX_OK) + { + return NULL; + } + + return pscf; +} + + +static char * +ngx_mail_pop3_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_mail_pop3_srv_conf_t *prev = parent; + ngx_mail_pop3_srv_conf_t *conf = child; + + u_char *p; + size_t size, stls_only_size; + ngx_str_t *c, *d; + ngx_uint_t i; + + ngx_conf_merge_bitmask_value(conf->auth_methods, + prev->auth_methods, + (NGX_CONF_BITMASK_SET + |NGX_MAIL_AUTH_PLAIN_ENABLED)); + + if (conf->capabilities.nelts == 0) { + conf->capabilities = prev->capabilities; + } + + if (conf->capabilities.nelts == 0) { + + for (d = ngx_mail_pop3_default_capabilities; d->len; d++) { + c = ngx_array_push(&conf->capabilities); + if (c == NULL) { + return NGX_CONF_ERROR; + } + + *c = *d; + } + } + + size = sizeof("+OK Capability list follows" CRLF) - 1 + + sizeof("." CRLF) - 1; + + stls_only_size = size + sizeof("STLS" CRLF) - 1; + + c = conf->capabilities.elts; + for (i = 0; i < conf->capabilities.nelts; i++) { + size += c[i].len + sizeof(CRLF) - 1; + + if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) { + continue; + } + + stls_only_size += c[i].len + sizeof(CRLF) - 1; + } + + if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) { + size += sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1; + + } else { + size += sizeof("SASL LOGIN PLAIN" CRLF) - 1; + } + + p = ngx_pnalloc(cf->pool, size); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->capability.len = size; + conf->capability.data = p; + + p = ngx_cpymem(p, "+OK Capability list follows" CRLF, + sizeof("+OK Capability list follows" CRLF) - 1); + + for (i = 0; i < conf->capabilities.nelts; i++) { + p = ngx_cpymem(p, c[i].data, c[i].len); + *p++ = CR; *p++ = LF; + } + + if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) { + p = ngx_cpymem(p, "SASL LOGIN PLAIN CRAM-MD5" CRLF, + sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1); + + } else { + p = ngx_cpymem(p, "SASL LOGIN PLAIN" CRLF, + sizeof("SASL LOGIN PLAIN" CRLF) - 1); + } + + *p++ = '.'; *p++ = CR; *p = LF; + + + size += sizeof("STLS" CRLF) - 1; + + p = ngx_pnalloc(cf->pool, size); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->starttls_capability.len = size; + conf->starttls_capability.data = p; + + p = ngx_cpymem(p, conf->capability.data, + conf->capability.len - (sizeof("." CRLF) - 1)); + + p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1); + *p++ = '.'; *p++ = CR; *p = LF; + + + if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) { + conf->auth_capability = ngx_mail_pop3_auth_cram_md5_capability; + + } else { + conf->auth_capability = ngx_mail_pop3_auth_plain_capability; + } + + + p = ngx_pnalloc(cf->pool, stls_only_size); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->starttls_only_capability.len = stls_only_size; + conf->starttls_only_capability.data = p; + + p = ngx_cpymem(p, "+OK Capability list follows" CRLF, + sizeof("+OK Capability list follows" CRLF) - 1); + + for (i = 0; i < conf->capabilities.nelts; i++) { + if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) { + continue; + } + + p = ngx_cpymem(p, c[i].data, c[i].len); + *p++ = CR; *p++ = LF; + } + + p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1); + *p++ = '.'; *p++ = CR; *p = LF; + + return NGX_CONF_OK; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail_pop3_module.h b/release/src/router/nginx/src/mail/ngx_mail_pop3_module.h new file mode 100644 index 0000000000..86947a7725 --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_pop3_module.h @@ -0,0 +1,38 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_MAIL_POP3_MODULE_H_INCLUDED_ +#define _NGX_MAIL_POP3_MODULE_H_INCLUDED_ + + +#include +#include +#include + + +typedef struct { + ngx_str_t capability; + ngx_str_t starttls_capability; + ngx_str_t starttls_only_capability; + ngx_str_t auth_capability; + + ngx_uint_t auth_methods; + + ngx_array_t capabilities; +} ngx_mail_pop3_srv_conf_t; + + +void ngx_mail_pop3_init_session(ngx_mail_session_t *s, ngx_connection_t *c); +void ngx_mail_pop3_init_protocol(ngx_event_t *rev); +void ngx_mail_pop3_auth_state(ngx_event_t *rev); +ngx_int_t ngx_mail_pop3_parse_command(ngx_mail_session_t *s); + + +extern ngx_module_t ngx_mail_pop3_module; + + +#endif /* _NGX_MAIL_POP3_MODULE_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/mail/ngx_mail_proxy_module.c b/release/src/router/nginx/src/mail/ngx_mail_proxy_module.c new file mode 100644 index 0000000000..4ea608ceaf --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_proxy_module.c @@ -0,0 +1,1089 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include +#include + + +typedef struct { + ngx_flag_t enable; + ngx_flag_t pass_error_message; + ngx_flag_t xclient; + size_t buffer_size; + ngx_msec_t timeout; +} ngx_mail_proxy_conf_t; + + +static void ngx_mail_proxy_block_read(ngx_event_t *rev); +static void ngx_mail_proxy_pop3_handler(ngx_event_t *rev); +static void ngx_mail_proxy_imap_handler(ngx_event_t *rev); +static void ngx_mail_proxy_smtp_handler(ngx_event_t *rev); +static void ngx_mail_proxy_dummy_handler(ngx_event_t *ev); +static ngx_int_t ngx_mail_proxy_read_response(ngx_mail_session_t *s, + ngx_uint_t state); +static void ngx_mail_proxy_handler(ngx_event_t *ev); +static void ngx_mail_proxy_upstream_error(ngx_mail_session_t *s); +static void ngx_mail_proxy_internal_server_error(ngx_mail_session_t *s); +static void ngx_mail_proxy_close_session(ngx_mail_session_t *s); +static void *ngx_mail_proxy_create_conf(ngx_conf_t *cf); +static char *ngx_mail_proxy_merge_conf(ngx_conf_t *cf, void *parent, + void *child); + + +static ngx_command_t ngx_mail_proxy_commands[] = { + + { ngx_string("proxy"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, + ngx_conf_set_flag_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_proxy_conf_t, enable), + NULL }, + + { ngx_string("proxy_buffer"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_proxy_conf_t, buffer_size), + NULL }, + + { ngx_string("proxy_timeout"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_proxy_conf_t, timeout), + NULL }, + + { ngx_string("proxy_pass_error_message"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, + ngx_conf_set_flag_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_proxy_conf_t, pass_error_message), + NULL }, + + { ngx_string("xclient"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, + ngx_conf_set_flag_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_proxy_conf_t, xclient), + NULL }, + + ngx_null_command +}; + + +static ngx_mail_module_t ngx_mail_proxy_module_ctx = { + NULL, /* protocol */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + ngx_mail_proxy_create_conf, /* create server configuration */ + ngx_mail_proxy_merge_conf /* merge server configuration */ +}; + + +ngx_module_t ngx_mail_proxy_module = { + NGX_MODULE_V1, + &ngx_mail_proxy_module_ctx, /* module context */ + ngx_mail_proxy_commands, /* module directives */ + NGX_MAIL_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static u_char smtp_auth_ok[] = "235 2.0.0 OK" CRLF; + + +void +ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_addr_t *peer) +{ + int keepalive; + ngx_int_t rc; + ngx_mail_proxy_ctx_t *p; + ngx_mail_proxy_conf_t *pcf; + ngx_mail_core_srv_conf_t *cscf; + + s->connection->log->action = "connecting to upstream"; + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + if (cscf->so_keepalive) { + keepalive = 1; + + if (setsockopt(s->connection->fd, SOL_SOCKET, SO_KEEPALIVE, + (const void *) &keepalive, sizeof(int)) + == -1) + { + ngx_log_error(NGX_LOG_ALERT, s->connection->log, ngx_socket_errno, + "setsockopt(SO_KEEPALIVE) failed"); + } + } + + p = ngx_pcalloc(s->connection->pool, sizeof(ngx_mail_proxy_ctx_t)); + if (p == NULL) { + ngx_mail_session_internal_server_error(s); + return; + } + + s->proxy = p; + + p->upstream.sockaddr = peer->sockaddr; + p->upstream.socklen = peer->socklen; + p->upstream.name = &peer->name; + p->upstream.get = ngx_event_get_peer; + p->upstream.log = s->connection->log; + p->upstream.log_error = NGX_ERROR_ERR; + + rc = ngx_event_connect_peer(&p->upstream); + + if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) { + ngx_mail_proxy_internal_server_error(s); + return; + } + + ngx_add_timer(p->upstream.connection->read, cscf->timeout); + + p->upstream.connection->data = s; + p->upstream.connection->pool = s->connection->pool; + + s->connection->read->handler = ngx_mail_proxy_block_read; + p->upstream.connection->write->handler = ngx_mail_proxy_dummy_handler; + + pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); + + s->proxy->buffer = ngx_create_temp_buf(s->connection->pool, + pcf->buffer_size); + if (s->proxy->buffer == NULL) { + ngx_mail_proxy_internal_server_error(s); + return; + } + + s->out.len = 0; + + switch (s->protocol) { + + case NGX_MAIL_POP3_PROTOCOL: + p->upstream.connection->read->handler = ngx_mail_proxy_pop3_handler; + s->mail_state = ngx_pop3_start; + break; + + case NGX_MAIL_IMAP_PROTOCOL: + p->upstream.connection->read->handler = ngx_mail_proxy_imap_handler; + s->mail_state = ngx_imap_start; + break; + + default: /* NGX_MAIL_SMTP_PROTOCOL */ + p->upstream.connection->read->handler = ngx_mail_proxy_smtp_handler; + s->mail_state = ngx_smtp_start; + break; + } +} + + +static void +ngx_mail_proxy_block_read(ngx_event_t *rev) +{ + ngx_connection_t *c; + ngx_mail_session_t *s; + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy block read"); + + if (ngx_handle_read_event(rev, 0) != NGX_OK) { + c = rev->data; + s = c->data; + + ngx_mail_proxy_close_session(s); + } +} + + +static void +ngx_mail_proxy_pop3_handler(ngx_event_t *rev) +{ + u_char *p; + ngx_int_t rc; + ngx_str_t line; + ngx_connection_t *c; + ngx_mail_session_t *s; + ngx_mail_proxy_conf_t *pcf; + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, + "mail proxy pop3 auth handler"); + + c = rev->data; + s = c->data; + + if (rev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, + "upstream timed out"); + c->timedout = 1; + ngx_mail_proxy_internal_server_error(s); + return; + } + + rc = ngx_mail_proxy_read_response(s, 0); + + if (rc == NGX_AGAIN) { + return; + } + + if (rc == NGX_ERROR) { + ngx_mail_proxy_upstream_error(s); + return; + } + + switch (s->mail_state) { + + case ngx_pop3_start: + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send user"); + + s->connection->log->action = "sending user name to upstream"; + + line.len = sizeof("USER ") - 1 + s->login.len + 2; + line.data = ngx_pnalloc(c->pool, line.len); + if (line.data == NULL) { + ngx_mail_proxy_internal_server_error(s); + return; + } + + p = ngx_cpymem(line.data, "USER ", sizeof("USER ") - 1); + p = ngx_cpymem(p, s->login.data, s->login.len); + *p++ = CR; *p = LF; + + s->mail_state = ngx_pop3_user; + break; + + case ngx_pop3_user: + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send pass"); + + s->connection->log->action = "sending password to upstream"; + + line.len = sizeof("PASS ") - 1 + s->passwd.len + 2; + line.data = ngx_pnalloc(c->pool, line.len); + if (line.data == NULL) { + ngx_mail_proxy_internal_server_error(s); + return; + } + + p = ngx_cpymem(line.data, "PASS ", sizeof("PASS ") - 1); + p = ngx_cpymem(p, s->passwd.data, s->passwd.len); + *p++ = CR; *p = LF; + + s->mail_state = ngx_pop3_passwd; + break; + + case ngx_pop3_passwd: + s->connection->read->handler = ngx_mail_proxy_handler; + s->connection->write->handler = ngx_mail_proxy_handler; + rev->handler = ngx_mail_proxy_handler; + c->write->handler = ngx_mail_proxy_handler; + + pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); + ngx_add_timer(s->connection->read, pcf->timeout); + ngx_del_timer(c->read); + + c->log->action = NULL; + ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in"); + + ngx_mail_proxy_handler(s->connection->write); + + return; + + default: +#if (NGX_SUPPRESS_WARN) + ngx_str_null(&line); +#endif + break; + } + + if (c->send(c, line.data, line.len) < (ssize_t) line.len) { + /* + * we treat the incomplete sending as NGX_ERROR + * because it is very strange here + */ + ngx_mail_proxy_internal_server_error(s); + return; + } + + s->proxy->buffer->pos = s->proxy->buffer->start; + s->proxy->buffer->last = s->proxy->buffer->start; +} + + +static void +ngx_mail_proxy_imap_handler(ngx_event_t *rev) +{ + u_char *p; + ngx_int_t rc; + ngx_str_t line; + ngx_connection_t *c; + ngx_mail_session_t *s; + ngx_mail_proxy_conf_t *pcf; + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, + "mail proxy imap auth handler"); + + c = rev->data; + s = c->data; + + if (rev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, + "upstream timed out"); + c->timedout = 1; + ngx_mail_proxy_internal_server_error(s); + return; + } + + rc = ngx_mail_proxy_read_response(s, s->mail_state); + + if (rc == NGX_AGAIN) { + return; + } + + if (rc == NGX_ERROR) { + ngx_mail_proxy_upstream_error(s); + return; + } + + switch (s->mail_state) { + + case ngx_imap_start: + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, + "mail proxy send login"); + + s->connection->log->action = "sending LOGIN command to upstream"; + + line.len = s->tag.len + sizeof("LOGIN ") - 1 + + 1 + NGX_SIZE_T_LEN + 1 + 2; + line.data = ngx_pnalloc(c->pool, line.len); + if (line.data == NULL) { + ngx_mail_proxy_internal_server_error(s); + return; + } + + line.len = ngx_sprintf(line.data, "%VLOGIN {%uz}" CRLF, + &s->tag, s->login.len) + - line.data; + + s->mail_state = ngx_imap_login; + break; + + case ngx_imap_login: + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send user"); + + s->connection->log->action = "sending user name to upstream"; + + line.len = s->login.len + 1 + 1 + NGX_SIZE_T_LEN + 1 + 2; + line.data = ngx_pnalloc(c->pool, line.len); + if (line.data == NULL) { + ngx_mail_proxy_internal_server_error(s); + return; + } + + line.len = ngx_sprintf(line.data, "%V {%uz}" CRLF, + &s->login, s->passwd.len) + - line.data; + + s->mail_state = ngx_imap_user; + break; + + case ngx_imap_user: + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, + "mail proxy send passwd"); + + s->connection->log->action = "sending password to upstream"; + + line.len = s->passwd.len + 2; + line.data = ngx_pnalloc(c->pool, line.len); + if (line.data == NULL) { + ngx_mail_proxy_internal_server_error(s); + return; + } + + p = ngx_cpymem(line.data, s->passwd.data, s->passwd.len); + *p++ = CR; *p = LF; + + s->mail_state = ngx_imap_passwd; + break; + + case ngx_imap_passwd: + s->connection->read->handler = ngx_mail_proxy_handler; + s->connection->write->handler = ngx_mail_proxy_handler; + rev->handler = ngx_mail_proxy_handler; + c->write->handler = ngx_mail_proxy_handler; + + pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); + ngx_add_timer(s->connection->read, pcf->timeout); + ngx_del_timer(c->read); + + c->log->action = NULL; + ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in"); + + ngx_mail_proxy_handler(s->connection->write); + + return; + + default: +#if (NGX_SUPPRESS_WARN) + ngx_str_null(&line); +#endif + break; + } + + if (c->send(c, line.data, line.len) < (ssize_t) line.len) { + /* + * we treat the incomplete sending as NGX_ERROR + * because it is very strange here + */ + ngx_mail_proxy_internal_server_error(s); + return; + } + + s->proxy->buffer->pos = s->proxy->buffer->start; + s->proxy->buffer->last = s->proxy->buffer->start; +} + + +static void +ngx_mail_proxy_smtp_handler(ngx_event_t *rev) +{ + u_char *p; + ngx_int_t rc; + ngx_str_t line; + ngx_buf_t *b; + ngx_connection_t *c; + ngx_mail_session_t *s; + ngx_mail_proxy_conf_t *pcf; + ngx_mail_core_srv_conf_t *cscf; + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, + "mail proxy smtp auth handler"); + + c = rev->data; + s = c->data; + + if (rev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, + "upstream timed out"); + c->timedout = 1; + ngx_mail_proxy_internal_server_error(s); + return; + } + + rc = ngx_mail_proxy_read_response(s, s->mail_state); + + if (rc == NGX_AGAIN) { + return; + } + + if (rc == NGX_ERROR) { + ngx_mail_proxy_upstream_error(s); + return; + } + + switch (s->mail_state) { + + case ngx_smtp_start: + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send ehlo"); + + s->connection->log->action = "sending HELO/EHLO to upstream"; + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + line.len = sizeof("HELO ") - 1 + cscf->server_name.len + 2; + line.data = ngx_pnalloc(c->pool, line.len); + if (line.data == NULL) { + ngx_mail_proxy_internal_server_error(s); + return; + } + + pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); + + p = ngx_cpymem(line.data, + ((s->esmtp || pcf->xclient) ? "EHLO " : "HELO "), + sizeof("HELO ") - 1); + + p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len); + *p++ = CR; *p = LF; + + if (pcf->xclient) { + s->mail_state = ngx_smtp_helo_xclient; + + } else if (s->auth_method == NGX_MAIL_AUTH_NONE) { + s->mail_state = ngx_smtp_helo_from; + + } else { + s->mail_state = ngx_smtp_helo; + } + + break; + + case ngx_smtp_helo_xclient: + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, + "mail proxy send xclient"); + + s->connection->log->action = "sending XCLIENT to upstream"; + + line.len = sizeof("XCLIENT ADDR= LOGIN= NAME=" + CRLF) - 1 + + s->connection->addr_text.len + s->login.len + s->host.len; + + line.data = ngx_pnalloc(c->pool, line.len); + if (line.data == NULL) { + ngx_mail_proxy_internal_server_error(s); + return; + } + + line.len = ngx_sprintf(line.data, + "XCLIENT ADDR=%V%s%V NAME=%V" CRLF, + &s->connection->addr_text, + (s->login.len ? " LOGIN=" : ""), &s->login, &s->host) + - line.data; + + if (s->smtp_helo.len) { + s->mail_state = ngx_smtp_xclient_helo; + + } else if (s->auth_method == NGX_MAIL_AUTH_NONE) { + s->mail_state = ngx_smtp_xclient_from; + + } else { + s->mail_state = ngx_smtp_xclient; + } + + break; + + case ngx_smtp_xclient_helo: + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, + "mail proxy send client ehlo"); + + s->connection->log->action = "sending client HELO/EHLO to upstream"; + + line.len = sizeof("HELO " CRLF) - 1 + s->smtp_helo.len; + + line.data = ngx_pnalloc(c->pool, line.len); + if (line.data == NULL) { + ngx_mail_proxy_internal_server_error(s); + return; + } + + line.len = ngx_sprintf(line.data, + ((s->esmtp) ? "EHLO %V" CRLF : "HELO %V" CRLF), + &s->smtp_helo) + - line.data; + + s->mail_state = (s->auth_method == NGX_MAIL_AUTH_NONE) ? + ngx_smtp_helo_from : ngx_smtp_helo; + + break; + + case ngx_smtp_helo_from: + case ngx_smtp_xclient_from: + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, + "mail proxy send mail from"); + + s->connection->log->action = "sending MAIL FROM to upstream"; + + line.len = s->smtp_from.len + sizeof(CRLF) - 1; + line.data = ngx_pnalloc(c->pool, line.len); + if (line.data == NULL) { + ngx_mail_proxy_internal_server_error(s); + return; + } + + p = ngx_cpymem(line.data, s->smtp_from.data, s->smtp_from.len); + *p++ = CR; *p = LF; + + s->mail_state = ngx_smtp_from; + + break; + + case ngx_smtp_from: + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, + "mail proxy send rcpt to"); + + s->connection->log->action = "sending RCPT TO to upstream"; + + line.len = s->smtp_to.len + sizeof(CRLF) - 1; + line.data = ngx_pnalloc(c->pool, line.len); + if (line.data == NULL) { + ngx_mail_proxy_internal_server_error(s); + return; + } + + p = ngx_cpymem(line.data, s->smtp_to.data, s->smtp_to.len); + *p++ = CR; *p = LF; + + s->mail_state = ngx_smtp_to; + + break; + + case ngx_smtp_helo: + case ngx_smtp_xclient: + case ngx_smtp_to: + + b = s->proxy->buffer; + + if (s->auth_method == NGX_MAIL_AUTH_NONE) { + b->pos = b->start; + + } else { + ngx_memcpy(b->start, smtp_auth_ok, sizeof(smtp_auth_ok) - 1); + b->last = b->start + sizeof(smtp_auth_ok) - 1; + } + + s->connection->read->handler = ngx_mail_proxy_handler; + s->connection->write->handler = ngx_mail_proxy_handler; + rev->handler = ngx_mail_proxy_handler; + c->write->handler = ngx_mail_proxy_handler; + + pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); + ngx_add_timer(s->connection->read, pcf->timeout); + ngx_del_timer(c->read); + + c->log->action = NULL; + ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in"); + + ngx_mail_proxy_handler(s->connection->write); + + return; + + default: +#if (NGX_SUPPRESS_WARN) + ngx_str_null(&line); +#endif + break; + } + + if (c->send(c, line.data, line.len) < (ssize_t) line.len) { + /* + * we treat the incomplete sending as NGX_ERROR + * because it is very strange here + */ + ngx_mail_proxy_internal_server_error(s); + return; + } + + s->proxy->buffer->pos = s->proxy->buffer->start; + s->proxy->buffer->last = s->proxy->buffer->start; +} + + +static void +ngx_mail_proxy_dummy_handler(ngx_event_t *wev) +{ + ngx_connection_t *c; + ngx_mail_session_t *s; + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, wev->log, 0, "mail proxy dummy handler"); + + if (ngx_handle_write_event(wev, 0) != NGX_OK) { + c = wev->data; + s = c->data; + + ngx_mail_proxy_close_session(s); + } +} + + +static ngx_int_t +ngx_mail_proxy_read_response(ngx_mail_session_t *s, ngx_uint_t state) +{ + u_char *p; + ssize_t n; + ngx_buf_t *b; + ngx_mail_proxy_conf_t *pcf; + + s->connection->log->action = "reading response from upstream"; + + b = s->proxy->buffer; + + n = s->proxy->upstream.connection->recv(s->proxy->upstream.connection, + b->last, b->end - b->last); + + if (n == NGX_ERROR || n == 0) { + return NGX_ERROR; + } + + if (n == NGX_AGAIN) { + return NGX_AGAIN; + } + + b->last += n; + + if (b->last - b->pos < 4) { + return NGX_AGAIN; + } + + if (*(b->last - 2) != CR || *(b->last - 1) != LF) { + if (b->last == b->end) { + *(b->last - 1) = '\0'; + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "upstream sent too long response line: \"%s\"", + b->pos); + return NGX_ERROR; + } + + return NGX_AGAIN; + } + + p = b->pos; + + switch (s->protocol) { + + case NGX_MAIL_POP3_PROTOCOL: + if (p[0] == '+' && p[1] == 'O' && p[2] == 'K') { + return NGX_OK; + } + break; + + case NGX_MAIL_IMAP_PROTOCOL: + switch (state) { + + case ngx_imap_start: + if (p[0] == '*' && p[1] == ' ' && p[2] == 'O' && p[3] == 'K') { + return NGX_OK; + } + break; + + case ngx_imap_login: + case ngx_imap_user: + if (p[0] == '+') { + return NGX_OK; + } + break; + + case ngx_imap_passwd: + if (ngx_strncmp(p, s->tag.data, s->tag.len) == 0) { + p += s->tag.len; + if (p[0] == 'O' && p[1] == 'K') { + return NGX_OK; + } + } + break; + } + + break; + + default: /* NGX_MAIL_SMTP_PROTOCOL */ + switch (state) { + + case ngx_smtp_start: + if (p[0] == '2' && p[1] == '2' && p[2] == '0') { + return NGX_OK; + } + break; + + case ngx_smtp_helo: + case ngx_smtp_helo_xclient: + case ngx_smtp_helo_from: + case ngx_smtp_from: + if (p[0] == '2' && p[1] == '5' && p[2] == '0') { + return NGX_OK; + } + break; + + case ngx_smtp_xclient: + case ngx_smtp_xclient_from: + case ngx_smtp_xclient_helo: + if (p[0] == '2' && (p[1] == '2' || p[1] == '5') && p[2] == '0') { + return NGX_OK; + } + break; + + case ngx_smtp_to: + return NGX_OK; + } + + break; + } + + pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); + + if (pcf->pass_error_message == 0) { + *(b->last - 2) = '\0'; + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "upstream sent invalid response: \"%s\"", p); + return NGX_ERROR; + } + + s->out.len = b->last - p - 2; + s->out.data = p; + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "upstream sent invalid response: \"%V\"", &s->out); + + s->out.len = b->last - b->pos; + s->out.data = b->pos; + + return NGX_ERROR; +} + + +static void +ngx_mail_proxy_handler(ngx_event_t *ev) +{ + char *action, *recv_action, *send_action; + size_t size; + ssize_t n; + ngx_buf_t *b; + ngx_uint_t do_write; + ngx_connection_t *c, *src, *dst; + ngx_mail_session_t *s; + ngx_mail_proxy_conf_t *pcf; + + c = ev->data; + s = c->data; + + if (ev->timedout) { + c->log->action = "proxying"; + + if (c == s->connection) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, + "client timed out"); + c->timedout = 1; + + } else { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, + "upstream timed out"); + } + + ngx_mail_proxy_close_session(s); + return; + } + + if (c == s->connection) { + if (ev->write) { + recv_action = "proxying and reading from upstream"; + send_action = "proxying and sending to client"; + src = s->proxy->upstream.connection; + dst = c; + b = s->proxy->buffer; + + } else { + recv_action = "proxying and reading from client"; + send_action = "proxying and sending to upstream"; + src = c; + dst = s->proxy->upstream.connection; + b = s->buffer; + } + + } else { + if (ev->write) { + recv_action = "proxying and reading from client"; + send_action = "proxying and sending to upstream"; + src = s->connection; + dst = c; + b = s->buffer; + + } else { + recv_action = "proxying and reading from upstream"; + send_action = "proxying and sending to client"; + src = c; + dst = s->connection; + b = s->proxy->buffer; + } + } + + do_write = ev->write ? 1 : 0; + + ngx_log_debug3(NGX_LOG_DEBUG_MAIL, ev->log, 0, + "mail proxy handler: %d, #%d > #%d", + do_write, src->fd, dst->fd); + + for ( ;; ) { + + if (do_write) { + + size = b->last - b->pos; + + if (size && dst->write->ready) { + c->log->action = send_action; + + n = dst->send(dst, b->pos, size); + + if (n == NGX_ERROR) { + ngx_mail_proxy_close_session(s); + return; + } + + if (n > 0) { + b->pos += n; + + if (b->pos == b->last) { + b->pos = b->start; + b->last = b->start; + } + } + } + } + + size = b->end - b->last; + + if (size && src->read->ready) { + c->log->action = recv_action; + + n = src->recv(src, b->last, size); + + if (n == NGX_AGAIN || n == 0) { + break; + } + + if (n > 0) { + do_write = 1; + b->last += n; + + continue; + } + + if (n == NGX_ERROR) { + src->read->eof = 1; + } + } + + break; + } + + c->log->action = "proxying"; + + if ((s->connection->read->eof && s->buffer->pos == s->buffer->last) + || (s->proxy->upstream.connection->read->eof + && s->proxy->buffer->pos == s->proxy->buffer->last) + || (s->connection->read->eof + && s->proxy->upstream.connection->read->eof)) + { + action = c->log->action; + c->log->action = NULL; + ngx_log_error(NGX_LOG_INFO, c->log, 0, "proxied session done"); + c->log->action = action; + + ngx_mail_proxy_close_session(s); + return; + } + + if (ngx_handle_write_event(dst->write, 0) != NGX_OK) { + ngx_mail_proxy_close_session(s); + return; + } + + if (ngx_handle_read_event(dst->read, 0) != NGX_OK) { + ngx_mail_proxy_close_session(s); + return; + } + + if (ngx_handle_write_event(src->write, 0) != NGX_OK) { + ngx_mail_proxy_close_session(s); + return; + } + + if (ngx_handle_read_event(src->read, 0) != NGX_OK) { + ngx_mail_proxy_close_session(s); + return; + } + + if (c == s->connection) { + pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); + ngx_add_timer(c->read, pcf->timeout); + } +} + + +static void +ngx_mail_proxy_upstream_error(ngx_mail_session_t *s) +{ + if (s->proxy->upstream.connection) { + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, + "close mail proxy connection: %d", + s->proxy->upstream.connection->fd); + + ngx_close_connection(s->proxy->upstream.connection); + } + + if (s->out.len == 0) { + ngx_mail_session_internal_server_error(s); + return; + } + + s->quit = 1; + ngx_mail_send(s->connection->write); +} + + +static void +ngx_mail_proxy_internal_server_error(ngx_mail_session_t *s) +{ + if (s->proxy->upstream.connection) { + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, + "close mail proxy connection: %d", + s->proxy->upstream.connection->fd); + + ngx_close_connection(s->proxy->upstream.connection); + } + + ngx_mail_session_internal_server_error(s); +} + + +static void +ngx_mail_proxy_close_session(ngx_mail_session_t *s) +{ + if (s->proxy->upstream.connection) { + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, + "close mail proxy connection: %d", + s->proxy->upstream.connection->fd); + + ngx_close_connection(s->proxy->upstream.connection); + } + + ngx_mail_close_connection(s->connection); +} + + +static void * +ngx_mail_proxy_create_conf(ngx_conf_t *cf) +{ + ngx_mail_proxy_conf_t *pcf; + + pcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_proxy_conf_t)); + if (pcf == NULL) { + return NULL; + } + + pcf->enable = NGX_CONF_UNSET; + pcf->pass_error_message = NGX_CONF_UNSET; + pcf->xclient = NGX_CONF_UNSET; + pcf->buffer_size = NGX_CONF_UNSET_SIZE; + pcf->timeout = NGX_CONF_UNSET_MSEC; + + return pcf; +} + + +static char * +ngx_mail_proxy_merge_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_mail_proxy_conf_t *prev = parent; + ngx_mail_proxy_conf_t *conf = child; + + ngx_conf_merge_value(conf->enable, prev->enable, 0); + ngx_conf_merge_value(conf->pass_error_message, prev->pass_error_message, 0); + ngx_conf_merge_value(conf->xclient, prev->xclient, 1); + ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size, + (size_t) ngx_pagesize); + ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 24 * 60 * 60000); + + return NGX_CONF_OK; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail_smtp_handler.c b/release/src/router/nginx/src/mail/ngx_mail_smtp_handler.c new file mode 100644 index 0000000000..21714239fc --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_smtp_handler.c @@ -0,0 +1,872 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include +#include + + +static void ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx); +static void ngx_mail_smtp_resolve_name(ngx_event_t *rev); +static void ngx_mail_smtp_resolve_name_handler(ngx_resolver_ctx_t *ctx); +static void ngx_mail_smtp_greeting(ngx_mail_session_t *s, ngx_connection_t *c); +static void ngx_mail_smtp_invalid_pipelining(ngx_event_t *rev); +static ngx_int_t ngx_mail_smtp_create_buffer(ngx_mail_session_t *s, + ngx_connection_t *c); + +static ngx_int_t ngx_mail_smtp_helo(ngx_mail_session_t *s, ngx_connection_t *c); +static ngx_int_t ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c); +static ngx_int_t ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c); +static ngx_int_t ngx_mail_smtp_starttls(ngx_mail_session_t *s, + ngx_connection_t *c); +static ngx_int_t ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c); +static ngx_int_t ngx_mail_smtp_rcpt(ngx_mail_session_t *s, ngx_connection_t *c); + +static ngx_int_t ngx_mail_smtp_discard_command(ngx_mail_session_t *s, + ngx_connection_t *c, char *err); +static void ngx_mail_smtp_log_rejected_command(ngx_mail_session_t *s, + ngx_connection_t *c, char *err); + + +static u_char smtp_ok[] = "250 2.0.0 OK" CRLF; +static u_char smtp_bye[] = "221 2.0.0 Bye" CRLF; +static u_char smtp_starttls[] = "220 2.0.0 Start TLS" CRLF; +static u_char smtp_next[] = "334 " CRLF; +static u_char smtp_username[] = "334 VXNlcm5hbWU6" CRLF; +static u_char smtp_password[] = "334 UGFzc3dvcmQ6" CRLF; +static u_char smtp_invalid_command[] = "500 5.5.1 Invalid command" CRLF; +static u_char smtp_invalid_pipelining[] = + "503 5.5.0 Improper use of SMTP command pipelining" CRLF; +static u_char smtp_invalid_argument[] = "501 5.5.4 Invalid argument" CRLF; +static u_char smtp_auth_required[] = "530 5.7.1 Authentication required" CRLF; +static u_char smtp_bad_sequence[] = "503 5.5.1 Bad sequence of commands" CRLF; + + +static ngx_str_t smtp_unavailable = ngx_string("[UNAVAILABLE]"); +static ngx_str_t smtp_tempunavail = ngx_string("[TEMPUNAVAIL]"); + + +void +ngx_mail_smtp_init_session(ngx_mail_session_t *s, ngx_connection_t *c) +{ + struct sockaddr_in *sin; + ngx_resolver_ctx_t *ctx; + ngx_mail_core_srv_conf_t *cscf; + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + if (cscf->resolver == NULL) { + s->host = smtp_unavailable; + ngx_mail_smtp_greeting(s, c); + return; + } + + if (c->sockaddr->sa_family != AF_INET) { + s->host = smtp_tempunavail; + ngx_mail_smtp_greeting(s, c); + return; + } + + c->log->action = "in resolving client address"; + + ctx = ngx_resolve_start(cscf->resolver, NULL); + if (ctx == NULL) { + ngx_mail_close_connection(c); + return; + } + + /* AF_INET only */ + + sin = (struct sockaddr_in *) c->sockaddr; + + ctx->addr = sin->sin_addr.s_addr; + ctx->handler = ngx_mail_smtp_resolve_addr_handler; + ctx->data = s; + ctx->timeout = cscf->resolver_timeout; + + if (ngx_resolve_addr(ctx) != NGX_OK) { + ngx_mail_close_connection(c); + } +} + + +static void +ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx) +{ + ngx_connection_t *c; + ngx_mail_session_t *s; + + s = ctx->data; + c = s->connection; + + if (ctx->state) { + ngx_log_error(NGX_LOG_ERR, c->log, 0, + "%V could not be resolved (%i: %s)", + &c->addr_text, ctx->state, + ngx_resolver_strerror(ctx->state)); + + if (ctx->state == NGX_RESOLVE_NXDOMAIN) { + s->host = smtp_unavailable; + + } else { + s->host = smtp_tempunavail; + } + + ngx_resolve_addr_done(ctx); + + ngx_mail_smtp_greeting(s, s->connection); + + return; + } + + c->log->action = "in resolving client hostname"; + + s->host.data = ngx_pstrdup(c->pool, &ctx->name); + if (s->host.data == NULL) { + ngx_resolve_addr_done(ctx); + ngx_mail_close_connection(c); + return; + } + + s->host.len = ctx->name.len; + + ngx_resolve_addr_done(ctx); + + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "address resolved: %V", &s->host); + + c->read->handler = ngx_mail_smtp_resolve_name; + + ngx_post_event(c->read, &ngx_posted_events); +} + + +static void +ngx_mail_smtp_resolve_name(ngx_event_t *rev) +{ + ngx_connection_t *c; + ngx_mail_session_t *s; + ngx_resolver_ctx_t *ctx; + ngx_mail_core_srv_conf_t *cscf; + + c = rev->data; + s = c->data; + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + ctx = ngx_resolve_start(cscf->resolver, NULL); + if (ctx == NULL) { + ngx_mail_close_connection(c); + return; + } + + ctx->name = s->host; + ctx->type = NGX_RESOLVE_A; + ctx->handler = ngx_mail_smtp_resolve_name_handler; + ctx->data = s; + ctx->timeout = cscf->resolver_timeout; + + if (ngx_resolve_name(ctx) != NGX_OK) { + ngx_mail_close_connection(c); + } +} + + +static void +ngx_mail_smtp_resolve_name_handler(ngx_resolver_ctx_t *ctx) +{ + in_addr_t addr; + ngx_uint_t i; + ngx_connection_t *c; + struct sockaddr_in *sin; + ngx_mail_session_t *s; + + s = ctx->data; + c = s->connection; + + if (ctx->state) { + ngx_log_error(NGX_LOG_ERR, c->log, 0, + "\"%V\" could not be resolved (%i: %s)", + &ctx->name, ctx->state, + ngx_resolver_strerror(ctx->state)); + + if (ctx->state == NGX_RESOLVE_NXDOMAIN) { + s->host = smtp_unavailable; + + } else { + s->host = smtp_tempunavail; + } + + } else { + + /* AF_INET only */ + + sin = (struct sockaddr_in *) c->sockaddr; + + for (i = 0; i < ctx->naddrs; i++) { + + addr = ctx->addrs[i]; + + ngx_log_debug4(NGX_LOG_DEBUG_MAIL, c->log, 0, + "name was resolved to %ud.%ud.%ud.%ud", + (ntohl(addr) >> 24) & 0xff, + (ntohl(addr) >> 16) & 0xff, + (ntohl(addr) >> 8) & 0xff, + ntohl(addr) & 0xff); + + if (addr == sin->sin_addr.s_addr) { + goto found; + } + } + + s->host = smtp_unavailable; + } + +found: + + ngx_resolve_name_done(ctx); + + ngx_mail_smtp_greeting(s, c); +} + + +static void +ngx_mail_smtp_greeting(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_msec_t timeout; + ngx_mail_core_srv_conf_t *cscf; + ngx_mail_smtp_srv_conf_t *sscf; + + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "smtp greeting for \"%V\"", &s->host); + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); + + timeout = sscf->greeting_delay ? sscf->greeting_delay : cscf->timeout; + ngx_add_timer(c->read, timeout); + + if (ngx_handle_read_event(c->read, 0) != NGX_OK) { + ngx_mail_close_connection(c); + } + + if (sscf->greeting_delay) { + c->read->handler = ngx_mail_smtp_invalid_pipelining; + return; + } + + c->read->handler = ngx_mail_smtp_init_protocol; + + s->out = sscf->greeting; + + ngx_mail_send(c->write); +} + + +static void +ngx_mail_smtp_invalid_pipelining(ngx_event_t *rev) +{ + ngx_connection_t *c; + ngx_mail_session_t *s; + ngx_mail_core_srv_conf_t *cscf; + ngx_mail_smtp_srv_conf_t *sscf; + + c = rev->data; + s = c->data; + + c->log->action = "in delay pipelining state"; + + if (rev->timedout) { + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "delay greeting"); + + rev->timedout = 0; + + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + c->read->handler = ngx_mail_smtp_init_protocol; + + ngx_add_timer(c->read, cscf->timeout); + + if (ngx_handle_read_event(c->read, 0) != NGX_OK) { + ngx_mail_close_connection(c); + return; + } + + sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); + + s->out = sscf->greeting; + + } else { + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "invalid pipelining"); + + if (s->buffer == NULL) { + if (ngx_mail_smtp_create_buffer(s, c) != NGX_OK) { + return; + } + } + + if (ngx_mail_smtp_discard_command(s, c, + "client was rejected before greeting: \"%V\"") + != NGX_OK) + { + return; + } + + ngx_str_set(&s->out, smtp_invalid_pipelining); + } + + ngx_mail_send(c->write); +} + + +void +ngx_mail_smtp_init_protocol(ngx_event_t *rev) +{ + ngx_connection_t *c; + ngx_mail_session_t *s; + + c = rev->data; + + c->log->action = "in auth state"; + + if (rev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); + c->timedout = 1; + ngx_mail_close_connection(c); + return; + } + + s = c->data; + + if (s->buffer == NULL) { + if (ngx_mail_smtp_create_buffer(s, c) != NGX_OK) { + return; + } + } + + s->mail_state = ngx_smtp_start; + c->read->handler = ngx_mail_smtp_auth_state; + + ngx_mail_smtp_auth_state(rev); +} + + +static ngx_int_t +ngx_mail_smtp_create_buffer(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_mail_smtp_srv_conf_t *sscf; + + if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t)) == NGX_ERROR) { + ngx_mail_session_internal_server_error(s); + return NGX_ERROR; + } + + sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); + + s->buffer = ngx_create_temp_buf(c->pool, sscf->client_buffer_size); + if (s->buffer == NULL) { + ngx_mail_session_internal_server_error(s); + return NGX_ERROR; + } + + return NGX_OK; +} + + +void +ngx_mail_smtp_auth_state(ngx_event_t *rev) +{ + ngx_int_t rc; + ngx_connection_t *c; + ngx_mail_session_t *s; + + c = rev->data; + s = c->data; + + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp auth state"); + + if (rev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); + c->timedout = 1; + ngx_mail_close_connection(c); + return; + } + + if (s->out.len) { + ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp send handler busy"); + s->blocked = 1; + return; + } + + s->blocked = 0; + + rc = ngx_mail_read_command(s, c); + + if (rc == NGX_AGAIN || rc == NGX_ERROR) { + return; + } + + ngx_str_set(&s->out, smtp_ok); + + if (rc == NGX_OK) { + switch (s->mail_state) { + + case ngx_smtp_start: + + switch (s->command) { + + case NGX_SMTP_HELO: + case NGX_SMTP_EHLO: + rc = ngx_mail_smtp_helo(s, c); + break; + + case NGX_SMTP_AUTH: + rc = ngx_mail_smtp_auth(s, c); + break; + + case NGX_SMTP_QUIT: + s->quit = 1; + ngx_str_set(&s->out, smtp_bye); + break; + + case NGX_SMTP_MAIL: + rc = ngx_mail_smtp_mail(s, c); + break; + + case NGX_SMTP_RCPT: + rc = ngx_mail_smtp_rcpt(s, c); + break; + + case NGX_SMTP_RSET: + rc = ngx_mail_smtp_rset(s, c); + break; + + case NGX_SMTP_NOOP: + break; + + case NGX_SMTP_STARTTLS: + rc = ngx_mail_smtp_starttls(s, c); + ngx_str_set(&s->out, smtp_starttls); + break; + + default: + rc = NGX_MAIL_PARSE_INVALID_COMMAND; + break; + } + + break; + + case ngx_smtp_auth_login_username: + rc = ngx_mail_auth_login_username(s, c, 0); + + ngx_str_set(&s->out, smtp_password); + s->mail_state = ngx_smtp_auth_login_password; + break; + + case ngx_smtp_auth_login_password: + rc = ngx_mail_auth_login_password(s, c); + break; + + case ngx_smtp_auth_plain: + rc = ngx_mail_auth_plain(s, c, 0); + break; + + case ngx_smtp_auth_cram_md5: + rc = ngx_mail_auth_cram_md5(s, c); + break; + } + } + + switch (rc) { + + case NGX_DONE: + ngx_mail_auth(s, c); + return; + + case NGX_ERROR: + ngx_mail_session_internal_server_error(s); + return; + + case NGX_MAIL_PARSE_INVALID_COMMAND: + s->mail_state = ngx_smtp_start; + s->state = 0; + ngx_str_set(&s->out, smtp_invalid_command); + + /* fall through */ + + case NGX_OK: + s->args.nelts = 0; + s->buffer->pos = s->buffer->start; + s->buffer->last = s->buffer->start; + + if (s->state) { + s->arg_start = s->buffer->start; + } + + ngx_mail_send(c->write); + } +} + + +static ngx_int_t +ngx_mail_smtp_helo(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_str_t *arg; + ngx_mail_smtp_srv_conf_t *sscf; + + if (s->args.nelts != 1) { + ngx_str_set(&s->out, smtp_invalid_argument); + s->state = 0; + return NGX_OK; + } + + arg = s->args.elts; + + s->smtp_helo.len = arg[0].len; + + s->smtp_helo.data = ngx_pnalloc(c->pool, arg[0].len); + if (s->smtp_helo.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(s->smtp_helo.data, arg[0].data, arg[0].len); + + ngx_str_null(&s->smtp_from); + ngx_str_null(&s->smtp_to); + + sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); + + if (s->command == NGX_SMTP_HELO) { + s->out = sscf->server_name; + + } else { + s->esmtp = 1; + +#if (NGX_MAIL_SSL) + + if (c->ssl == NULL) { + ngx_mail_ssl_conf_t *sslcf; + + sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); + + if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) { + s->out = sscf->starttls_capability; + return NGX_OK; + } + + if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) { + s->out = sscf->starttls_only_capability; + return NGX_OK; + } + } +#endif + + s->out = sscf->capability; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_int_t rc; + ngx_mail_core_srv_conf_t *cscf; + ngx_mail_smtp_srv_conf_t *sscf; + +#if (NGX_MAIL_SSL) + if (ngx_mail_starttls_only(s, c)) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } +#endif + + if (s->args.nelts == 0) { + ngx_str_set(&s->out, smtp_invalid_argument); + s->state = 0; + return NGX_OK; + } + + rc = ngx_mail_auth_parse(s, c); + + switch (rc) { + + case NGX_MAIL_AUTH_LOGIN: + + ngx_str_set(&s->out, smtp_username); + s->mail_state = ngx_smtp_auth_login_username; + + return NGX_OK; + + case NGX_MAIL_AUTH_LOGIN_USERNAME: + + ngx_str_set(&s->out, smtp_password); + s->mail_state = ngx_smtp_auth_login_password; + + return ngx_mail_auth_login_username(s, c, 1); + + case NGX_MAIL_AUTH_PLAIN: + + ngx_str_set(&s->out, smtp_next); + s->mail_state = ngx_smtp_auth_plain; + + return NGX_OK; + + case NGX_MAIL_AUTH_CRAM_MD5: + + sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); + + if (!(sscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) { + return NGX_MAIL_PARSE_INVALID_COMMAND; + } + + if (s->salt.data == NULL) { + cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); + + if (ngx_mail_salt(s, c, cscf) != NGX_OK) { + return NGX_ERROR; + } + } + + if (ngx_mail_auth_cram_md5_salt(s, c, "334 ", 4) == NGX_OK) { + s->mail_state = ngx_smtp_auth_cram_md5; + return NGX_OK; + } + + return NGX_ERROR; + } + + return rc; +} + + +static ngx_int_t +ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c) +{ + u_char ch; + ngx_str_t l; + ngx_uint_t i; + ngx_mail_smtp_srv_conf_t *sscf; + + sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); + + if (!(sscf->auth_methods & NGX_MAIL_AUTH_NONE_ENABLED)) { + ngx_mail_smtp_log_rejected_command(s, c, "client was rejected: \"%V\""); + ngx_str_set(&s->out, smtp_auth_required); + return NGX_OK; + } + + /* auth none */ + + if (s->smtp_from.len) { + ngx_str_set(&s->out, smtp_bad_sequence); + return NGX_OK; + } + + l.len = s->buffer->last - s->buffer->start; + l.data = s->buffer->start; + + for (i = 0; i < l.len; i++) { + ch = l.data[i]; + + if (ch != CR && ch != LF) { + continue; + } + + l.data[i] = ' '; + } + + while (i) { + if (l.data[i - 1] != ' ') { + break; + } + + i--; + } + + l.len = i; + + s->smtp_from.len = l.len; + + s->smtp_from.data = ngx_pnalloc(c->pool, l.len); + if (s->smtp_from.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(s->smtp_from.data, l.data, l.len); + + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "smtp mail from:\"%V\"", &s->smtp_from); + + ngx_str_set(&s->out, smtp_ok); + + return NGX_OK; +} + + +static ngx_int_t +ngx_mail_smtp_rcpt(ngx_mail_session_t *s, ngx_connection_t *c) +{ + u_char ch; + ngx_str_t l; + ngx_uint_t i; + + if (s->smtp_from.len == 0) { + ngx_str_set(&s->out, smtp_bad_sequence); + return NGX_OK; + } + + l.len = s->buffer->last - s->buffer->start; + l.data = s->buffer->start; + + for (i = 0; i < l.len; i++) { + ch = l.data[i]; + + if (ch != CR && ch != LF) { + continue; + } + + l.data[i] = ' '; + } + + while (i) { + if (l.data[i - 1] != ' ') { + break; + } + + i--; + } + + l.len = i; + + s->smtp_to.len = l.len; + + s->smtp_to.data = ngx_pnalloc(c->pool, l.len); + if (s->smtp_to.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(s->smtp_to.data, l.data, l.len); + + ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, + "smtp rcpt to:\"%V\"", &s->smtp_to); + + s->auth_method = NGX_MAIL_AUTH_NONE; + + return NGX_DONE; +} + + +static ngx_int_t +ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c) +{ + ngx_str_null(&s->smtp_from); + ngx_str_null(&s->smtp_to); + ngx_str_set(&s->out, smtp_ok); + + return NGX_OK; +} + + +static ngx_int_t +ngx_mail_smtp_starttls(ngx_mail_session_t *s, ngx_connection_t *c) +{ +#if (NGX_MAIL_SSL) + ngx_mail_ssl_conf_t *sslcf; + + if (c->ssl == NULL) { + sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); + if (sslcf->starttls) { + + /* + * RFC3207 requires us to discard any knowledge + * obtained from client before STARTTLS. + */ + + ngx_str_null(&s->smtp_helo); + ngx_str_null(&s->smtp_from); + ngx_str_null(&s->smtp_to); + + c->read->handler = ngx_mail_starttls_handler; + return NGX_OK; + } + } + +#endif + + return NGX_MAIL_PARSE_INVALID_COMMAND; +} + + +static ngx_int_t +ngx_mail_smtp_discard_command(ngx_mail_session_t *s, ngx_connection_t *c, + char *err) +{ + ssize_t n; + + n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last); + + if (n == NGX_ERROR || n == 0) { + ngx_mail_close_connection(c); + return NGX_ERROR; + } + + if (n > 0) { + s->buffer->last += n; + } + + if (n == NGX_AGAIN) { + if (ngx_handle_read_event(c->read, 0) != NGX_OK) { + ngx_mail_session_internal_server_error(s); + return NGX_ERROR; + } + + return NGX_AGAIN; + } + + ngx_mail_smtp_log_rejected_command(s, c, err); + + s->buffer->pos = s->buffer->start; + s->buffer->last = s->buffer->start; + + return NGX_OK; +} + + +static void +ngx_mail_smtp_log_rejected_command(ngx_mail_session_t *s, ngx_connection_t *c, + char *err) +{ + u_char ch; + ngx_str_t cmd; + ngx_uint_t i; + + if (c->log->log_level < NGX_LOG_INFO) { + return; + } + + cmd.len = s->buffer->last - s->buffer->start; + cmd.data = s->buffer->start; + + for (i = 0; i < cmd.len; i++) { + ch = cmd.data[i]; + + if (ch != CR && ch != LF) { + continue; + } + + cmd.data[i] = '_'; + } + + cmd.len = i; + + ngx_log_error(NGX_LOG_INFO, c->log, 0, err, &cmd); +} diff --git a/release/src/router/nginx/src/mail/ngx_mail_smtp_module.c b/release/src/router/nginx/src/mail/ngx_mail_smtp_module.c new file mode 100644 index 0000000000..cdd4e5eb18 --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_smtp_module.c @@ -0,0 +1,308 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include +#include + + +static void *ngx_mail_smtp_create_srv_conf(ngx_conf_t *cf); +static char *ngx_mail_smtp_merge_srv_conf(ngx_conf_t *cf, void *parent, + void *child); + + +static ngx_conf_bitmask_t ngx_mail_smtp_auth_methods[] = { + { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, + { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED }, + { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, + { ngx_string("none"), NGX_MAIL_AUTH_NONE_ENABLED }, + { ngx_null_string, 0 } +}; + + +static ngx_str_t ngx_mail_smtp_auth_methods_names[] = { + ngx_string("PLAIN"), + ngx_string("LOGIN"), + ngx_null_string, /* APOP */ + ngx_string("CRAM-MD5"), + ngx_null_string /* NONE */ +}; + + +static ngx_mail_protocol_t ngx_mail_smtp_protocol = { + ngx_string("smtp"), + { 25, 465, 587, 0 }, + NGX_MAIL_SMTP_PROTOCOL, + + ngx_mail_smtp_init_session, + ngx_mail_smtp_init_protocol, + ngx_mail_smtp_parse_command, + ngx_mail_smtp_auth_state, + + ngx_string("451 4.3.2 Internal server error" CRLF) +}; + + +static ngx_command_t ngx_mail_smtp_commands[] = { + + { ngx_string("smtp_client_buffer"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_smtp_srv_conf_t, client_buffer_size), + NULL }, + + { ngx_string("smtp_greeting_delay"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_smtp_srv_conf_t, greeting_delay), + NULL }, + + { ngx_string("smtp_capabilities"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, + ngx_mail_capabilities, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_smtp_srv_conf_t, capabilities), + NULL }, + + { ngx_string("smtp_auth"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, + ngx_conf_set_bitmask_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_smtp_srv_conf_t, auth_methods), + &ngx_mail_smtp_auth_methods }, + + ngx_null_command +}; + + +static ngx_mail_module_t ngx_mail_smtp_module_ctx = { + &ngx_mail_smtp_protocol, /* protocol */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + ngx_mail_smtp_create_srv_conf, /* create server configuration */ + ngx_mail_smtp_merge_srv_conf /* merge server configuration */ +}; + + +ngx_module_t ngx_mail_smtp_module = { + NGX_MODULE_V1, + &ngx_mail_smtp_module_ctx, /* module context */ + ngx_mail_smtp_commands, /* module directives */ + NGX_MAIL_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_mail_smtp_create_srv_conf(ngx_conf_t *cf) +{ + ngx_mail_smtp_srv_conf_t *sscf; + + sscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_smtp_srv_conf_t)); + if (sscf == NULL) { + return NULL; + } + + sscf->client_buffer_size = NGX_CONF_UNSET_SIZE; + sscf->greeting_delay = NGX_CONF_UNSET_MSEC; + + if (ngx_array_init(&sscf->capabilities, cf->pool, 4, sizeof(ngx_str_t)) + != NGX_OK) + { + return NULL; + } + + return sscf; +} + + +static char * +ngx_mail_smtp_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_mail_smtp_srv_conf_t *prev = parent; + ngx_mail_smtp_srv_conf_t *conf = child; + + u_char *p, *auth, *last; + size_t size; + ngx_str_t *c; + ngx_uint_t i, m, auth_enabled; + ngx_mail_core_srv_conf_t *cscf; + + ngx_conf_merge_size_value(conf->client_buffer_size, + prev->client_buffer_size, + (size_t) ngx_pagesize); + + ngx_conf_merge_msec_value(conf->greeting_delay, + prev->greeting_delay, 0); + + ngx_conf_merge_bitmask_value(conf->auth_methods, + prev->auth_methods, + (NGX_CONF_BITMASK_SET + |NGX_MAIL_AUTH_PLAIN_ENABLED + |NGX_MAIL_AUTH_LOGIN_ENABLED)); + + + cscf = ngx_mail_conf_get_module_srv_conf(cf, ngx_mail_core_module); + + size = sizeof("220 ESMTP ready" CRLF) - 1 + cscf->server_name.len; + + p = ngx_pnalloc(cf->pool, size); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->greeting.len = size; + conf->greeting.data = p; + + *p++ = '2'; *p++ = '2'; *p++ = '0'; *p++ = ' '; + p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len); + ngx_memcpy(p, " ESMTP ready" CRLF, sizeof(" ESMTP ready" CRLF) - 1); + + + size = sizeof("250 " CRLF) - 1 + cscf->server_name.len; + + p = ngx_pnalloc(cf->pool, size); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->server_name.len = size; + conf->server_name.data = p; + + *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' '; + p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len); + *p++ = CR; *p = LF; + + + if (conf->capabilities.nelts == 0) { + conf->capabilities = prev->capabilities; + } + + size = sizeof("250-") - 1 + cscf->server_name.len + sizeof(CRLF) - 1; + + c = conf->capabilities.elts; + for (i = 0; i < conf->capabilities.nelts; i++) { + size += sizeof("250 ") - 1 + c[i].len + sizeof(CRLF) - 1; + } + + auth_enabled = 0; + + for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; + m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED; + m <<= 1, i++) + { + if (m & conf->auth_methods) { + size += 1 + ngx_mail_smtp_auth_methods_names[i].len; + auth_enabled = 1; + } + } + + if (auth_enabled) { + size += sizeof("250 AUTH") - 1 + sizeof(CRLF) - 1; + } + + p = ngx_pnalloc(cf->pool, size); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->capability.len = size; + conf->capability.data = p; + + last = p; + + *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-'; + p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len); + *p++ = CR; *p++ = LF; + + for (i = 0; i < conf->capabilities.nelts; i++) { + last = p; + *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-'; + p = ngx_cpymem(p, c[i].data, c[i].len); + *p++ = CR; *p++ = LF; + } + + auth = p; + + if (auth_enabled) { + last = p; + + *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' '; + *p++ = 'A'; *p++ = 'U'; *p++ = 'T'; *p++ = 'H'; + + for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; + m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED; + m <<= 1, i++) + { + if (m & conf->auth_methods) { + *p++ = ' '; + p = ngx_cpymem(p, ngx_mail_smtp_auth_methods_names[i].data, + ngx_mail_smtp_auth_methods_names[i].len); + } + } + + *p++ = CR; *p = LF; + + } else { + last[3] = ' '; + } + + size += sizeof("250 STARTTLS" CRLF) - 1; + + p = ngx_pnalloc(cf->pool, size); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->starttls_capability.len = size; + conf->starttls_capability.data = p; + + p = ngx_cpymem(p, conf->capability.data, conf->capability.len); + + p = ngx_cpymem(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1); + *p++ = CR; *p = LF; + + p = conf->starttls_capability.data + + (last - conf->capability.data) + 3; + *p = '-'; + + size = (auth - conf->capability.data) + + sizeof("250 STARTTLS" CRLF) - 1; + + p = ngx_pnalloc(cf->pool, size); + if (p == NULL) { + return NGX_CONF_ERROR; + } + + conf->starttls_only_capability.len = size; + conf->starttls_only_capability.data = p; + + p = ngx_cpymem(p, conf->capability.data, auth - conf->capability.data); + + ngx_memcpy(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1); + + if (last < auth) { + p = conf->starttls_only_capability.data + + (last - conf->capability.data) + 3; + *p = '-'; + } + + return NGX_CONF_OK; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail_smtp_module.h b/release/src/router/nginx/src/mail/ngx_mail_smtp_module.h new file mode 100644 index 0000000000..04ffab60ad --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_smtp_module.h @@ -0,0 +1,45 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_MAIL_SMTP_MODULE_H_INCLUDED_ +#define _NGX_MAIL_SMTP_MODULE_H_INCLUDED_ + + +#include +#include +#include +#include + + +typedef struct { + ngx_msec_t greeting_delay; + + size_t client_buffer_size; + + ngx_str_t capability; + ngx_str_t starttls_capability; + ngx_str_t starttls_only_capability; + + ngx_str_t server_name; + ngx_str_t greeting; + + ngx_uint_t auth_methods; + + ngx_array_t capabilities; +} ngx_mail_smtp_srv_conf_t; + + +void ngx_mail_smtp_init_session(ngx_mail_session_t *s, ngx_connection_t *c); +void ngx_mail_smtp_init_protocol(ngx_event_t *rev); +void ngx_mail_smtp_auth_state(ngx_event_t *rev); +ngx_int_t ngx_mail_smtp_parse_command(ngx_mail_session_t *s); + + +extern ngx_module_t ngx_mail_smtp_module; + + +#endif /* _NGX_MAIL_SMTP_MODULE_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/mail/ngx_mail_ssl_module.c b/release/src/router/nginx/src/mail/ngx_mail_ssl_module.c new file mode 100644 index 0000000000..dd6f2ac416 --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_ssl_module.c @@ -0,0 +1,491 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +#define NGX_DEFAULT_CIPHERS "HIGH:!aNULL:!MD5" +#define NGX_DEFAULT_ECDH_CURVE "prime256v1" + + +static void *ngx_mail_ssl_create_conf(ngx_conf_t *cf); +static char *ngx_mail_ssl_merge_conf(ngx_conf_t *cf, void *parent, void *child); + +static char *ngx_mail_ssl_enable(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_mail_ssl_starttls(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_mail_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); + + +static ngx_conf_enum_t ngx_http_starttls_state[] = { + { ngx_string("off"), NGX_MAIL_STARTTLS_OFF }, + { ngx_string("on"), NGX_MAIL_STARTTLS_ON }, + { ngx_string("only"), NGX_MAIL_STARTTLS_ONLY }, + { ngx_null_string, 0 } +}; + + + +static ngx_conf_bitmask_t ngx_mail_ssl_protocols[] = { + { ngx_string("SSLv2"), NGX_SSL_SSLv2 }, + { ngx_string("SSLv3"), NGX_SSL_SSLv3 }, + { ngx_string("TLSv1"), NGX_SSL_TLSv1 }, + { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 }, + { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 }, + { ngx_null_string, 0 } +}; + + +static ngx_command_t ngx_mail_ssl_commands[] = { + + { ngx_string("ssl"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, + ngx_mail_ssl_enable, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_ssl_conf_t, enable), + NULL }, + + { ngx_string("starttls"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_mail_ssl_starttls, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_ssl_conf_t, starttls), + ngx_http_starttls_state }, + + { ngx_string("ssl_certificate"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_ssl_conf_t, certificate), + NULL }, + + { ngx_string("ssl_certificate_key"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_ssl_conf_t, certificate_key), + NULL }, + + { ngx_string("ssl_dhparam"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_ssl_conf_t, dhparam), + NULL }, + + { ngx_string("ssl_ecdh_curve"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_ssl_conf_t, ecdh_curve), + NULL }, + + { ngx_string("ssl_protocols"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, + ngx_conf_set_bitmask_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_ssl_conf_t, protocols), + &ngx_mail_ssl_protocols }, + + { ngx_string("ssl_ciphers"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_ssl_conf_t, ciphers), + NULL }, + + { ngx_string("ssl_prefer_server_ciphers"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, + ngx_conf_set_flag_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_ssl_conf_t, prefer_server_ciphers), + NULL }, + + { ngx_string("ssl_session_cache"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE12, + ngx_mail_ssl_session_cache, + NGX_MAIL_SRV_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("ssl_session_timeout"), + NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_sec_slot, + NGX_MAIL_SRV_CONF_OFFSET, + offsetof(ngx_mail_ssl_conf_t, session_timeout), + NULL }, + + ngx_null_command +}; + + +static ngx_mail_module_t ngx_mail_ssl_module_ctx = { + NULL, /* protocol */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + ngx_mail_ssl_create_conf, /* create server configuration */ + ngx_mail_ssl_merge_conf /* merge server configuration */ +}; + + +ngx_module_t ngx_mail_ssl_module = { + NGX_MODULE_V1, + &ngx_mail_ssl_module_ctx, /* module context */ + ngx_mail_ssl_commands, /* module directives */ + NGX_MAIL_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_str_t ngx_mail_ssl_sess_id_ctx = ngx_string("MAIL"); + + +static void * +ngx_mail_ssl_create_conf(ngx_conf_t *cf) +{ + ngx_mail_ssl_conf_t *scf; + + scf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_ssl_conf_t)); + if (scf == NULL) { + return NULL; + } + + /* + * set by ngx_pcalloc(): + * + * scf->protocols = 0; + * scf->certificate = { 0, NULL }; + * scf->certificate_key = { 0, NULL }; + * scf->dhparam = { 0, NULL }; + * scf->ecdh_curve = { 0, NULL }; + * scf->ciphers = { 0, NULL }; + * scf->shm_zone = NULL; + */ + + scf->enable = NGX_CONF_UNSET; + scf->starttls = NGX_CONF_UNSET_UINT; + scf->prefer_server_ciphers = NGX_CONF_UNSET; + scf->builtin_session_cache = NGX_CONF_UNSET; + scf->session_timeout = NGX_CONF_UNSET; + + return scf; +} + + +static char * +ngx_mail_ssl_merge_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_mail_ssl_conf_t *prev = parent; + ngx_mail_ssl_conf_t *conf = child; + + char *mode; + ngx_pool_cleanup_t *cln; + + ngx_conf_merge_value(conf->enable, prev->enable, 0); + ngx_conf_merge_uint_value(conf->starttls, prev->starttls, + NGX_MAIL_STARTTLS_OFF); + + ngx_conf_merge_value(conf->session_timeout, + prev->session_timeout, 300); + + ngx_conf_merge_value(conf->prefer_server_ciphers, + prev->prefer_server_ciphers, 0); + + ngx_conf_merge_bitmask_value(conf->protocols, prev->protocols, + (NGX_CONF_BITMASK_SET|NGX_SSL_SSLv3|NGX_SSL_TLSv1 + |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2)); + + ngx_conf_merge_str_value(conf->certificate, prev->certificate, ""); + ngx_conf_merge_str_value(conf->certificate_key, prev->certificate_key, ""); + + ngx_conf_merge_str_value(conf->dhparam, prev->dhparam, ""); + + ngx_conf_merge_str_value(conf->ecdh_curve, prev->ecdh_curve, + NGX_DEFAULT_ECDH_CURVE); + + ngx_conf_merge_str_value(conf->ciphers, prev->ciphers, NGX_DEFAULT_CIPHERS); + + + conf->ssl.log = cf->log; + + if (conf->enable) { + mode = "ssl"; + + } else if (conf->starttls != NGX_MAIL_STARTTLS_OFF) { + mode = "starttls"; + + } else { + mode = ""; + } + + if (*mode) { + + if (conf->certificate.len == 0) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "no \"ssl_certificate\" is defined for " + "the \"%s\" directive in %s:%ui", + mode, conf->file, conf->line); + return NGX_CONF_ERROR; + } + + if (conf->certificate_key.len == 0) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "no \"ssl_certificate_key\" is defined for " + "the \"%s\" directive in %s:%ui", + mode, conf->file, conf->line); + return NGX_CONF_ERROR; + } + + } else { + + if (conf->certificate.len == 0) { + return NGX_CONF_OK; + } + + if (conf->certificate_key.len == 0) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "no \"ssl_certificate_key\" is defined " + "for certificate \"%V\"", + &conf->certificate); + return NGX_CONF_ERROR; + } + } + + if (ngx_ssl_create(&conf->ssl, conf->protocols, NULL) != NGX_OK) { + return NGX_CONF_ERROR; + } + + cln = ngx_pool_cleanup_add(cf->pool, 0); + if (cln == NULL) { + return NGX_CONF_ERROR; + } + + cln->handler = ngx_ssl_cleanup_ctx; + cln->data = &conf->ssl; + + if (ngx_ssl_certificate(cf, &conf->ssl, &conf->certificate, + &conf->certificate_key) + != NGX_OK) + { + return NGX_CONF_ERROR; + } + + if (conf->ciphers.len) { + if (SSL_CTX_set_cipher_list(conf->ssl.ctx, + (const char *) conf->ciphers.data) + == 0) + { + ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0, + "SSL_CTX_set_cipher_list(\"%V\") failed", + &conf->ciphers); + } + } + + if (conf->prefer_server_ciphers) { + SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_CIPHER_SERVER_PREFERENCE); + } + + SSL_CTX_set_tmp_rsa_callback(conf->ssl.ctx, ngx_ssl_rsa512_key_callback); + + if (ngx_ssl_dhparam(cf, &conf->ssl, &conf->dhparam) != NGX_OK) { + return NGX_CONF_ERROR; + } + + ngx_conf_merge_value(conf->builtin_session_cache, + prev->builtin_session_cache, NGX_SSL_NONE_SCACHE); + + if (conf->shm_zone == NULL) { + conf->shm_zone = prev->shm_zone; + } + + if (ngx_ssl_session_cache(&conf->ssl, &ngx_mail_ssl_sess_id_ctx, + conf->builtin_session_cache, + conf->shm_zone, conf->session_timeout) + != NGX_OK) + { + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} + + +static char * +ngx_mail_ssl_enable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_mail_ssl_conf_t *scf = conf; + + char *rv; + + rv = ngx_conf_set_flag_slot(cf, cmd, conf); + + if (rv != NGX_CONF_OK) { + return rv; + } + + if (scf->enable && (ngx_int_t) scf->starttls > NGX_MAIL_STARTTLS_OFF) { + ngx_conf_log_error(NGX_LOG_WARN, cf, 0, + "\"starttls\" directive conflicts with \"ssl on\""); + return NGX_CONF_ERROR; + } + + scf->file = cf->conf_file->file.name.data; + scf->line = cf->conf_file->line; + + return NGX_CONF_OK; +} + + +static char * +ngx_mail_ssl_starttls(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_mail_ssl_conf_t *scf = conf; + + char *rv; + + rv = ngx_conf_set_enum_slot(cf, cmd, conf); + + if (rv != NGX_CONF_OK) { + return rv; + } + + if (scf->enable == 1 && (ngx_int_t) scf->starttls > NGX_MAIL_STARTTLS_OFF) { + ngx_conf_log_error(NGX_LOG_WARN, cf, 0, + "\"ssl\" directive conflicts with \"starttls\""); + return NGX_CONF_ERROR; + } + + scf->file = cf->conf_file->file.name.data; + scf->line = cf->conf_file->line; + + return NGX_CONF_OK; +} + + +static char * +ngx_mail_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_mail_ssl_conf_t *scf = conf; + + size_t len; + ngx_str_t *value, name, size; + ngx_int_t n; + ngx_uint_t i, j; + + value = cf->args->elts; + + for (i = 1; i < cf->args->nelts; i++) { + + if (ngx_strcmp(value[i].data, "off") == 0) { + scf->builtin_session_cache = NGX_SSL_NO_SCACHE; + continue; + } + + if (ngx_strcmp(value[i].data, "none") == 0) { + scf->builtin_session_cache = NGX_SSL_NONE_SCACHE; + continue; + } + + if (ngx_strcmp(value[i].data, "builtin") == 0) { + scf->builtin_session_cache = NGX_SSL_DFLT_BUILTIN_SCACHE; + continue; + } + + if (value[i].len > sizeof("builtin:") - 1 + && ngx_strncmp(value[i].data, "builtin:", sizeof("builtin:") - 1) + == 0) + { + n = ngx_atoi(value[i].data + sizeof("builtin:") - 1, + value[i].len - (sizeof("builtin:") - 1)); + + if (n == NGX_ERROR) { + goto invalid; + } + + scf->builtin_session_cache = n; + + continue; + } + + if (value[i].len > sizeof("shared:") - 1 + && ngx_strncmp(value[i].data, "shared:", sizeof("shared:") - 1) + == 0) + { + len = 0; + + for (j = sizeof("shared:") - 1; j < value[i].len; j++) { + if (value[i].data[j] == ':') { + break; + } + + len++; + } + + if (len == 0) { + goto invalid; + } + + name.len = len; + name.data = value[i].data + sizeof("shared:") - 1; + + size.len = value[i].len - j - 1; + size.data = name.data + len + 1; + + n = ngx_parse_size(&size); + + if (n == NGX_ERROR) { + goto invalid; + } + + if (n < (ngx_int_t) (8 * ngx_pagesize)) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "session cache \"%V\" is too small", + &value[i]); + + return NGX_CONF_ERROR; + } + + scf->shm_zone = ngx_shared_memory_add(cf, &name, n, + &ngx_mail_ssl_module); + if (scf->shm_zone == NULL) { + return NGX_CONF_ERROR; + } + + scf->shm_zone->init = ngx_ssl_session_cache_init; + + continue; + } + + goto invalid; + } + + if (scf->shm_zone && scf->builtin_session_cache == NGX_CONF_UNSET) { + scf->builtin_session_cache = NGX_SSL_NO_BUILTIN_SCACHE; + } + + return NGX_CONF_OK; + +invalid: + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid session cache \"%V\"", &value[i]); + + return NGX_CONF_ERROR; +} diff --git a/release/src/router/nginx/src/mail/ngx_mail_ssl_module.h b/release/src/router/nginx/src/mail/ngx_mail_ssl_module.h new file mode 100644 index 0000000000..7f59b38ae3 --- /dev/null +++ b/release/src/router/nginx/src/mail/ngx_mail_ssl_module.h @@ -0,0 +1,52 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_MAIL_SSL_H_INCLUDED_ +#define _NGX_MAIL_SSL_H_INCLUDED_ + + +#include +#include +#include + + +#define NGX_MAIL_STARTTLS_OFF 0 +#define NGX_MAIL_STARTTLS_ON 1 +#define NGX_MAIL_STARTTLS_ONLY 2 + + +typedef struct { + ngx_flag_t enable; + ngx_flag_t prefer_server_ciphers; + + ngx_ssl_t ssl; + + ngx_uint_t starttls; + ngx_uint_t protocols; + + ssize_t builtin_session_cache; + + time_t session_timeout; + + ngx_str_t certificate; + ngx_str_t certificate_key; + ngx_str_t dhparam; + ngx_str_t ecdh_curve; + + ngx_str_t ciphers; + + ngx_shm_zone_t *shm_zone; + + u_char *file; + ngx_uint_t line; +} ngx_mail_ssl_conf_t; + + +extern ngx_module_t ngx_mail_ssl_module; + + +#endif /* _NGX_MAIL_SSL_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/misc/ngx_cpp_test_module.cpp b/release/src/router/nginx/src/misc/ngx_cpp_test_module.cpp new file mode 100644 index 0000000000..3cbc0a8111 --- /dev/null +++ b/release/src/router/nginx/src/misc/ngx_cpp_test_module.cpp @@ -0,0 +1,29 @@ + +// stub module to test header files' C++ compatibilty + +extern "C" { + #include + #include + #include + #include + #include + + #include + + #include + #include + #include + #include +} + +// nginx header files should go before other, because they define 64-bit off_t +// #include + + +void ngx_cpp_test_handler(void *data); + +void +ngx_cpp_test_handler(void *data) +{ + return; +} diff --git a/release/src/router/nginx/src/misc/ngx_google_perftools_module.c b/release/src/router/nginx/src/misc/ngx_google_perftools_module.c new file mode 100644 index 0000000000..f2f8221b56 --- /dev/null +++ b/release/src/router/nginx/src/misc/ngx_google_perftools_module.c @@ -0,0 +1,126 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + +/* + * declare Profiler interface here because + * is C++ header file + */ + +int ProfilerStart(u_char* fname); +void ProfilerStop(void); +void ProfilerRegisterThread(void); + + +static void *ngx_google_perftools_create_conf(ngx_cycle_t *cycle); +static ngx_int_t ngx_google_perftools_worker(ngx_cycle_t *cycle); + + +typedef struct { + ngx_str_t profiles; +} ngx_google_perftools_conf_t; + + +static ngx_command_t ngx_google_perftools_commands[] = { + + { ngx_string("google_perftools_profiles"), + NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + 0, + offsetof(ngx_google_perftools_conf_t, profiles), + NULL }, + + ngx_null_command +}; + + +static ngx_core_module_t ngx_google_perftools_module_ctx = { + ngx_string("google_perftools"), + ngx_google_perftools_create_conf, + NULL +}; + + +ngx_module_t ngx_google_perftools_module = { + NGX_MODULE_V1, + &ngx_google_perftools_module_ctx, /* module context */ + ngx_google_perftools_commands, /* module directives */ + NGX_CORE_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + ngx_google_perftools_worker, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_google_perftools_create_conf(ngx_cycle_t *cycle) +{ + ngx_google_perftools_conf_t *gptcf; + + gptcf = ngx_pcalloc(cycle->pool, sizeof(ngx_google_perftools_conf_t)); + if (gptcf == NULL) { + return NULL; + } + + /* + * set by ngx_pcalloc() + * + * gptcf->profiles = { 0, NULL }; + */ + + return gptcf; +} + + +static ngx_int_t +ngx_google_perftools_worker(ngx_cycle_t *cycle) +{ + u_char *profile; + ngx_google_perftools_conf_t *gptcf; + + gptcf = (ngx_google_perftools_conf_t *) + ngx_get_conf(cycle->conf_ctx, ngx_google_perftools_module); + + if (gptcf->profiles.len == 0) { + return NGX_OK; + } + + profile = ngx_alloc(gptcf->profiles.len + NGX_INT_T_LEN + 2, cycle->log); + if (profile == NULL) { + return NGX_OK; + } + + if (getenv("CPUPROFILE")) { + /* disable inherited Profiler enabled in master process */ + ProfilerStop(); + } + + ngx_sprintf(profile, "%V.%d%Z", &gptcf->profiles, ngx_pid); + + if (ProfilerStart(profile)) { + /* start ITIMER_PROF timer */ + ProfilerRegisterThread(); + + } else { + ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno, + "ProfilerStart(%s) failed", profile); + } + + ngx_free(profile); + + return NGX_OK; +} + + +/* ProfilerStop() is called on Profiler destruction */ diff --git a/release/src/router/nginx/src/os/unix/ngx_aio_read.c b/release/src/router/nginx/src/os/unix/ngx_aio_read.c new file mode 100644 index 0000000000..7849881730 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_aio_read.c @@ -0,0 +1,109 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +extern int ngx_kqueue; + + +ssize_t +ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size) +{ + int n; + ngx_event_t *rev; + + rev = c->read; + + if (!rev->ready) { + ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second aio post"); + return NGX_AGAIN; + } + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, + "rev->complete: %d", rev->complete); + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, + "aio size: %d", size); + + if (!rev->complete) { + ngx_memzero(&rev->aiocb, sizeof(struct aiocb)); + + rev->aiocb.aio_fildes = c->fd; + rev->aiocb.aio_buf = buf; + rev->aiocb.aio_nbytes = size; + +#if (NGX_HAVE_KQUEUE) + rev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue; + rev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT; + rev->aiocb.aio_sigevent.sigev_value.sigval_ptr = rev; +#endif + + if (aio_read(&rev->aiocb) == -1) { + ngx_log_error(NGX_LOG_CRIT, rev->log, ngx_errno, + "aio_read() failed"); + rev->error = 1; + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, + "aio_read: #%d OK", c->fd); + + rev->active = 1; + rev->ready = 0; + } + + rev->complete = 0; + + n = aio_error(&rev->aiocb); + if (n == -1) { + ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "aio_error() failed"); + rev->error = 1; + return NGX_ERROR; + } + + if (n != 0) { + if (n == NGX_EINPROGRESS) { + if (rev->ready) { + ngx_log_error(NGX_LOG_ALERT, c->log, n, + "aio_read() still in progress"); + rev->ready = 0; + } + return NGX_AGAIN; + } + + ngx_log_error(NGX_LOG_CRIT, c->log, n, "aio_read() failed"); + rev->error = 1; + rev->ready = 0; + return NGX_ERROR; + } + + n = aio_return(&rev->aiocb); + if (n == -1) { + ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, + "aio_return() failed"); + + rev->error = 1; + rev->ready = 0; + return NGX_ERROR; + } + + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, rev->log, 0, + "aio_read: #%d %d", c->fd, n); + + if (n == 0) { + rev->eof = 1; + rev->ready = 0; + } else { + rev->ready = 1; + } + + rev->active = 0; + + return n; +} diff --git a/release/src/router/nginx/src/os/unix/ngx_aio_read_chain.c b/release/src/router/nginx/src/os/unix/ngx_aio_read_chain.c new file mode 100644 index 0000000000..8c831b9512 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_aio_read_chain.c @@ -0,0 +1,78 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +ssize_t +ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl) +{ + int n; + u_char *buf, *prev; + size_t size; + ssize_t total; + + if (c->read->pending_eof) { + c->read->ready = 0; + return 0; + } + + total = 0; + + while (cl) { + + /* we can post the single aio operation only */ + + if (!c->read->ready) { + return total ? total : NGX_AGAIN; + } + + buf = cl->buf->last; + prev = cl->buf->last; + size = 0; + + /* coalesce the neighbouring bufs */ + + while (cl && prev == cl->buf->last) { + size += cl->buf->end - cl->buf->last; + prev = cl->buf->end; + cl = cl->next; + } + + n = ngx_aio_read(c, buf, size); + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_read: %d", n); + + if (n == NGX_AGAIN) { + return total ? total : NGX_AGAIN; + } + + if (n == NGX_ERROR) { + return NGX_ERROR; + } + + if (n == 0) { + c->read->pending_eof = 1; + if (total) { + c->read->eof = 0; + c->read->ready = 1; + } + return total; + } + + if (n > 0) { + total += n; + } + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, + "aio_read total: %d", total); + } + + return total ? total : NGX_AGAIN; +} diff --git a/release/src/router/nginx/src/os/unix/ngx_aio_write.c b/release/src/router/nginx/src/os/unix/ngx_aio_write.c new file mode 100644 index 0000000000..f0d93918e3 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_aio_write.c @@ -0,0 +1,109 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +extern int ngx_kqueue; + + +ssize_t +ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size) +{ + int n; + ngx_event_t *wev; + + wev = c->write; + + if (!wev->ready) { + return NGX_AGAIN; + } + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0, + "aio: wev->complete: %d", wev->complete); + + if (!wev->complete) { + ngx_memzero(&wev->aiocb, sizeof(struct aiocb)); + + wev->aiocb.aio_fildes = c->fd; + wev->aiocb.aio_buf = buf; + wev->aiocb.aio_nbytes = size; + +#if (NGX_HAVE_KQUEUE) + wev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue; + wev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT; + wev->aiocb.aio_sigevent.sigev_value.sigval_ptr = wev; +#endif + + if (aio_write(&wev->aiocb) == -1) { + ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno, + "aio_write() failed"); + return NGX_ERROR; + } + + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: OK"); + + wev->active = 1; + wev->ready = 0; + } + + wev->complete = 0; + + n = aio_error(&wev->aiocb); + if (n == -1) { + ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno, "aio_error() failed"); + wev->error = 1; + return NGX_ERROR; + } + + if (n != 0) { + if (n == NGX_EINPROGRESS) { + if (wev->ready) { + ngx_log_error(NGX_LOG_ALERT, wev->log, n, + "aio_write() still in progress"); + wev->ready = 0; + } + return NGX_AGAIN; + } + + ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_write() failed"); + wev->error = 1; + wev->ready = 0; + +#if 1 + n = aio_return(&wev->aiocb); + if (n == -1) { + ngx_log_error(NGX_LOG_ALERT, wev->log, ngx_errno, + "aio_return() failed"); + } + + ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_return() %d", n); +#endif + + return NGX_ERROR; + } + + n = aio_return(&wev->aiocb); + if (n == -1) { + ngx_log_error(NGX_LOG_ALERT, wev->log, ngx_errno, + "aio_return() failed"); + + wev->error = 1; + wev->ready = 0; + return NGX_ERROR; + } + + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: %d", n); + + wev->active = 0; + wev->ready = 1; + + return n; +} diff --git a/release/src/router/nginx/src/os/unix/ngx_aio_write_chain.c b/release/src/router/nginx/src/os/unix/ngx_aio_write_chain.c new file mode 100644 index 0000000000..b0c25085d1 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_aio_write_chain.c @@ -0,0 +1,100 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +ngx_chain_t * +ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) +{ + u_char *buf, *prev; + off_t send, sent; + size_t len; + ssize_t n, size; + ngx_chain_t *cl; + + /* the maximum limit size is the maximum size_t value - the page size */ + + if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { + limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; + } + + send = 0; + sent = 0; + cl = in; + + while (cl) { + + if (cl->buf->pos == cl->buf->last) { + cl = cl->next; + continue; + } + + /* we can post the single aio operation only */ + + if (!c->write->ready) { + return cl; + } + + buf = cl->buf->pos; + prev = buf; + len = 0; + + /* coalesce the neighbouring bufs */ + + while (cl && prev == cl->buf->pos && send < limit) { + if (ngx_buf_special(cl->buf)) { + continue; + } + + size = cl->buf->last - cl->buf->pos; + + if (send + size > limit) { + size = limit - send; + } + + len += size; + prev = cl->buf->pos + size; + send += size; + cl = cl->next; + } + + n = ngx_aio_write(c, buf, len); + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_write: %z", n); + + if (n == NGX_ERROR) { + return NGX_CHAIN_ERROR; + } + + if (n > 0) { + sent += n; + c->sent += n; + } + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, + "aio_write sent: %O", c->sent); + + for (cl = in; cl; cl = cl->next) { + + if (sent >= cl->buf->last - cl->buf->pos) { + sent -= cl->buf->last - cl->buf->pos; + cl->buf->pos = cl->buf->last; + + continue; + } + + cl->buf->pos += sent; + + break; + } + } + + return cl; +} diff --git a/release/src/router/nginx/src/os/unix/ngx_alloc.c b/release/src/router/nginx/src/os/unix/ngx_alloc.c new file mode 100644 index 0000000000..5c2f787025 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_alloc.c @@ -0,0 +1,90 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +ngx_uint_t ngx_pagesize; +ngx_uint_t ngx_pagesize_shift; +ngx_uint_t ngx_cacheline_size; + + +void * +ngx_alloc(size_t size, ngx_log_t *log) +{ + void *p; + + p = malloc(size); + if (p == NULL) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, + "malloc(%uz) failed", size); + } + + ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size); + + return p; +} + + +void * +ngx_calloc(size_t size, ngx_log_t *log) +{ + void *p; + + p = ngx_alloc(size, log); + + if (p) { + ngx_memzero(p, size); + } + + return p; +} + + +#if (NGX_HAVE_POSIX_MEMALIGN) + +void * +ngx_memalign(size_t alignment, size_t size, ngx_log_t *log) +{ + void *p; + int err; + + err = posix_memalign(&p, alignment, size); + + if (err) { + ngx_log_error(NGX_LOG_EMERG, log, err, + "posix_memalign(%uz, %uz) failed", alignment, size); + p = NULL; + } + + ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0, + "posix_memalign: %p:%uz @%uz", p, size, alignment); + + return p; +} + +#elif (NGX_HAVE_MEMALIGN) + +void * +ngx_memalign(size_t alignment, size_t size, ngx_log_t *log) +{ + void *p; + + p = memalign(alignment, size); + if (p == NULL) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, + "memalign(%uz, %uz) failed", alignment, size); + } + + ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0, + "memalign: %p:%uz @%uz", p, size, alignment); + + return p; +} + +#endif diff --git a/release/src/router/nginx/src/os/unix/ngx_alloc.h b/release/src/router/nginx/src/os/unix/ngx_alloc.h new file mode 100644 index 0000000000..655db257f4 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_alloc.h @@ -0,0 +1,45 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_ALLOC_H_INCLUDED_ +#define _NGX_ALLOC_H_INCLUDED_ + + +#include +#include + + +void *ngx_alloc(size_t size, ngx_log_t *log); +void *ngx_calloc(size_t size, ngx_log_t *log); + +#define ngx_free free + + +/* + * Linux has memalign() or posix_memalign() + * Solaris has memalign() + * FreeBSD 7.0 has posix_memalign(), besides, early version's malloc() + * aligns allocations bigger than page size at the page boundary + */ + +#if (NGX_HAVE_POSIX_MEMALIGN || NGX_HAVE_MEMALIGN) + +void *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log); + +#else + +#define ngx_memalign(alignment, size, log) ngx_alloc(size, log) + +#endif + + +extern ngx_uint_t ngx_pagesize; +extern ngx_uint_t ngx_pagesize_shift; +extern ngx_uint_t ngx_cacheline_size; + + +#endif /* _NGX_ALLOC_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_atomic.h b/release/src/router/nginx/src/os/unix/ngx_atomic.h new file mode 100644 index 0000000000..417cd86ff2 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_atomic.h @@ -0,0 +1,313 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_ATOMIC_H_INCLUDED_ +#define _NGX_ATOMIC_H_INCLUDED_ + + +#include +#include + + +#if (NGX_HAVE_LIBATOMIC) + +#define AO_REQUIRE_CAS +#include + +#define NGX_HAVE_ATOMIC_OPS 1 + +typedef long ngx_atomic_int_t; +typedef AO_t ngx_atomic_uint_t; +typedef volatile ngx_atomic_uint_t ngx_atomic_t; + +#if (NGX_PTR_SIZE == 8) +#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1) +#else +#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) +#endif + +#define ngx_atomic_cmp_set(lock, old, new) \ + AO_compare_and_swap(lock, old, new) +#define ngx_atomic_fetch_add(value, add) \ + AO_fetch_and_add(value, add) +#define ngx_memory_barrier() AO_nop() +#define ngx_cpu_pause() + + +#elif (NGX_DARWIN_ATOMIC) + +/* + * use Darwin 8 atomic(3) and barrier(3) operations + * optimized at run-time for UP and SMP + */ + +#include + +/* "bool" conflicts with perl's CORE/handy.h */ +#if 0 +#undef bool +#endif + + +#define NGX_HAVE_ATOMIC_OPS 1 + +#if (NGX_PTR_SIZE == 8) + +typedef int64_t ngx_atomic_int_t; +typedef uint64_t ngx_atomic_uint_t; +#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1) + +#define ngx_atomic_cmp_set(lock, old, new) \ + OSAtomicCompareAndSwap64Barrier(old, new, (int64_t *) lock) + +#define ngx_atomic_fetch_add(value, add) \ + (OSAtomicAdd64(add, (int64_t *) value) - add) + +#else + +typedef int32_t ngx_atomic_int_t; +typedef uint32_t ngx_atomic_uint_t; +#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) + +#define ngx_atomic_cmp_set(lock, old, new) \ + OSAtomicCompareAndSwap32Barrier(old, new, (int32_t *) lock) + +#define ngx_atomic_fetch_add(value, add) \ + (OSAtomicAdd32(add, (int32_t *) value) - add) + +#endif + +#define ngx_memory_barrier() OSMemoryBarrier() + +#define ngx_cpu_pause() + +typedef volatile ngx_atomic_uint_t ngx_atomic_t; + + +#elif (NGX_HAVE_GCC_ATOMIC) + +/* GCC 4.1 builtin atomic operations */ + +#define NGX_HAVE_ATOMIC_OPS 1 + +typedef long ngx_atomic_int_t; +typedef unsigned long ngx_atomic_uint_t; + +#if (NGX_PTR_SIZE == 8) +#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1) +#else +#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) +#endif + +typedef volatile ngx_atomic_uint_t ngx_atomic_t; + + +#define ngx_atomic_cmp_set(lock, old, set) \ + __sync_bool_compare_and_swap(lock, old, set) + +#define ngx_atomic_fetch_add(value, add) \ + __sync_fetch_and_add(value, add) + +#define ngx_memory_barrier() __sync_synchronize() + +#if ( __i386__ || __i386 || __amd64__ || __amd64 ) +#define ngx_cpu_pause() __asm__ ("pause") +#else +#define ngx_cpu_pause() +#endif + + +#elif ( __i386__ || __i386 ) + +typedef int32_t ngx_atomic_int_t; +typedef uint32_t ngx_atomic_uint_t; +typedef volatile ngx_atomic_uint_t ngx_atomic_t; +#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) + + +#if ( __SUNPRO_C ) + +#define NGX_HAVE_ATOMIC_OPS 1 + +ngx_atomic_uint_t +ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, + ngx_atomic_uint_t set); + +ngx_atomic_int_t +ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add); + +/* + * Sun Studio 12 exits with segmentation fault on '__asm ("pause")', + * so ngx_cpu_pause is declared in src/os/unix/ngx_sunpro_x86.il + */ + +void +ngx_cpu_pause(void); + +/* the code in src/os/unix/ngx_sunpro_x86.il */ + +#define ngx_memory_barrier() __asm (".volatile"); __asm (".nonvolatile") + + +#else /* ( __GNUC__ || __INTEL_COMPILER ) */ + +#define NGX_HAVE_ATOMIC_OPS 1 + +#include "ngx_gcc_atomic_x86.h" + +#endif + + +#elif ( __amd64__ || __amd64 ) + +typedef int64_t ngx_atomic_int_t; +typedef uint64_t ngx_atomic_uint_t; +typedef volatile ngx_atomic_uint_t ngx_atomic_t; +#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1) + + +#if ( __SUNPRO_C ) + +#define NGX_HAVE_ATOMIC_OPS 1 + +ngx_atomic_uint_t +ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, + ngx_atomic_uint_t set); + +ngx_atomic_int_t +ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add); + +/* + * Sun Studio 12 exits with segmentation fault on '__asm ("pause")', + * so ngx_cpu_pause is declared in src/os/unix/ngx_sunpro_amd64.il + */ + +void +ngx_cpu_pause(void); + +/* the code in src/os/unix/ngx_sunpro_amd64.il */ + +#define ngx_memory_barrier() __asm (".volatile"); __asm (".nonvolatile") + + +#else /* ( __GNUC__ || __INTEL_COMPILER ) */ + +#define NGX_HAVE_ATOMIC_OPS 1 + +#include "ngx_gcc_atomic_amd64.h" + +#endif + + +#elif ( __sparc__ || __sparc || __sparcv9 ) + +#if (NGX_PTR_SIZE == 8) + +typedef int64_t ngx_atomic_int_t; +typedef uint64_t ngx_atomic_uint_t; +#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1) + +#else + +typedef int32_t ngx_atomic_int_t; +typedef uint32_t ngx_atomic_uint_t; +#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) + +#endif + +typedef volatile ngx_atomic_uint_t ngx_atomic_t; + + +#if ( __SUNPRO_C ) + +#define NGX_HAVE_ATOMIC_OPS 1 + +#include "ngx_sunpro_atomic_sparc64.h" + + +#else /* ( __GNUC__ || __INTEL_COMPILER ) */ + +#define NGX_HAVE_ATOMIC_OPS 1 + +#include "ngx_gcc_atomic_sparc64.h" + +#endif + + +#elif ( __powerpc__ || __POWERPC__ ) + +#define NGX_HAVE_ATOMIC_OPS 1 + +#if (NGX_PTR_SIZE == 8) + +typedef int64_t ngx_atomic_int_t; +typedef uint64_t ngx_atomic_uint_t; +#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1) + +#else + +typedef int32_t ngx_atomic_int_t; +typedef uint32_t ngx_atomic_uint_t; +#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) + +#endif + +typedef volatile ngx_atomic_uint_t ngx_atomic_t; + + +#include "ngx_gcc_atomic_ppc.h" + +#endif + + +#if !(NGX_HAVE_ATOMIC_OPS) + +#define NGX_HAVE_ATOMIC_OPS 0 + +typedef int32_t ngx_atomic_int_t; +typedef uint32_t ngx_atomic_uint_t; +typedef volatile ngx_atomic_uint_t ngx_atomic_t; +#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) + + +static ngx_inline ngx_atomic_uint_t +ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, + ngx_atomic_uint_t set) +{ + if (*lock == old) { + *lock = set; + return 1; + } + + return 0; +} + + +static ngx_inline ngx_atomic_int_t +ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) +{ + ngx_atomic_int_t old; + + old = *value; + *value += add; + + return old; +} + +#define ngx_memory_barrier() +#define ngx_cpu_pause() + +#endif + + +void ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin); + +#define ngx_trylock(lock) (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1)) +#define ngx_unlock(lock) *(lock) = 0 + + +#endif /* _NGX_ATOMIC_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_channel.c b/release/src/router/nginx/src/os/unix/ngx_channel.c new file mode 100644 index 0000000000..29c69da406 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_channel.c @@ -0,0 +1,258 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +ngx_int_t +ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, + ngx_log_t *log) +{ + ssize_t n; + ngx_err_t err; + struct iovec iov[1]; + struct msghdr msg; + +#if (NGX_HAVE_MSGHDR_MSG_CONTROL) + + union { + struct cmsghdr cm; + char space[CMSG_SPACE(sizeof(int))]; + } cmsg; + + if (ch->fd == -1) { + msg.msg_control = NULL; + msg.msg_controllen = 0; + + } else { + msg.msg_control = (caddr_t) &cmsg; + msg.msg_controllen = sizeof(cmsg); + + cmsg.cm.cmsg_len = CMSG_LEN(sizeof(int)); + cmsg.cm.cmsg_level = SOL_SOCKET; + cmsg.cm.cmsg_type = SCM_RIGHTS; + + /* + * We have to use ngx_memcpy() instead of simple + * *(int *) CMSG_DATA(&cmsg.cm) = ch->fd; + * because some gcc 4.4 with -O2/3/s optimization issues the warning: + * dereferencing type-punned pointer will break strict-aliasing rules + * + * Fortunately, gcc with -O1 compiles this ngx_memcpy() + * in the same simple assignment as in the code above + */ + + ngx_memcpy(CMSG_DATA(&cmsg.cm), &ch->fd, sizeof(int)); + } + + msg.msg_flags = 0; + +#else + + if (ch->fd == -1) { + msg.msg_accrights = NULL; + msg.msg_accrightslen = 0; + + } else { + msg.msg_accrights = (caddr_t) &ch->fd; + msg.msg_accrightslen = sizeof(int); + } + +#endif + + iov[0].iov_base = (char *) ch; + iov[0].iov_len = size; + + msg.msg_name = NULL; + msg.msg_namelen = 0; + msg.msg_iov = iov; + msg.msg_iovlen = 1; + + n = sendmsg(s, &msg, 0); + + if (n == -1) { + err = ngx_errno; + if (err == NGX_EAGAIN) { + return NGX_AGAIN; + } + + ngx_log_error(NGX_LOG_ALERT, log, err, "sendmsg() failed"); + return NGX_ERROR; + } + + return NGX_OK; +} + + +ngx_int_t +ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, ngx_log_t *log) +{ + ssize_t n; + ngx_err_t err; + struct iovec iov[1]; + struct msghdr msg; + +#if (NGX_HAVE_MSGHDR_MSG_CONTROL) + union { + struct cmsghdr cm; + char space[CMSG_SPACE(sizeof(int))]; + } cmsg; +#else + int fd; +#endif + + iov[0].iov_base = (char *) ch; + iov[0].iov_len = size; + + msg.msg_name = NULL; + msg.msg_namelen = 0; + msg.msg_iov = iov; + msg.msg_iovlen = 1; + +#if (NGX_HAVE_MSGHDR_MSG_CONTROL) + msg.msg_control = (caddr_t) &cmsg; + msg.msg_controllen = sizeof(cmsg); +#else + msg.msg_accrights = (caddr_t) &fd; + msg.msg_accrightslen = sizeof(int); +#endif + + n = recvmsg(s, &msg, 0); + + if (n == -1) { + err = ngx_errno; + if (err == NGX_EAGAIN) { + return NGX_AGAIN; + } + + ngx_log_error(NGX_LOG_ALERT, log, err, "recvmsg() failed"); + return NGX_ERROR; + } + + if (n == 0) { + ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "recvmsg() returned zero"); + return NGX_ERROR; + } + + if ((size_t) n < sizeof(ngx_channel_t)) { + ngx_log_error(NGX_LOG_ALERT, log, 0, + "recvmsg() returned not enough data: %uz", n); + return NGX_ERROR; + } + +#if (NGX_HAVE_MSGHDR_MSG_CONTROL) + + if (ch->command == NGX_CMD_OPEN_CHANNEL) { + + if (cmsg.cm.cmsg_len < (socklen_t) CMSG_LEN(sizeof(int))) { + ngx_log_error(NGX_LOG_ALERT, log, 0, + "recvmsg() returned too small ancillary data"); + return NGX_ERROR; + } + + if (cmsg.cm.cmsg_level != SOL_SOCKET || cmsg.cm.cmsg_type != SCM_RIGHTS) + { + ngx_log_error(NGX_LOG_ALERT, log, 0, + "recvmsg() returned invalid ancillary data " + "level %d or type %d", + cmsg.cm.cmsg_level, cmsg.cm.cmsg_type); + return NGX_ERROR; + } + + /* ch->fd = *(int *) CMSG_DATA(&cmsg.cm); */ + + ngx_memcpy(&ch->fd, CMSG_DATA(&cmsg.cm), sizeof(int)); + } + + if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) { + ngx_log_error(NGX_LOG_ALERT, log, 0, + "recvmsg() truncated data"); + } + +#else + + if (ch->command == NGX_CMD_OPEN_CHANNEL) { + if (msg.msg_accrightslen != sizeof(int)) { + ngx_log_error(NGX_LOG_ALERT, log, 0, + "recvmsg() returned no ancillary data"); + return NGX_ERROR; + } + + ch->fd = fd; + } + +#endif + + return n; +} + + +ngx_int_t +ngx_add_channel_event(ngx_cycle_t *cycle, ngx_fd_t fd, ngx_int_t event, + ngx_event_handler_pt handler) +{ + ngx_event_t *ev, *rev, *wev; + ngx_connection_t *c; + + c = ngx_get_connection(fd, cycle->log); + + if (c == NULL) { + return NGX_ERROR; + } + + c->pool = cycle->pool; + + rev = c->read; + wev = c->write; + + rev->log = cycle->log; + wev->log = cycle->log; + +#if (NGX_THREADS) + rev->lock = &c->lock; + wev->lock = &c->lock; + rev->own_lock = &c->lock; + wev->own_lock = &c->lock; +#endif + + rev->channel = 1; + wev->channel = 1; + + ev = (event == NGX_READ_EVENT) ? rev : wev; + + ev->handler = handler; + + if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) { + if (ngx_add_conn(c) == NGX_ERROR) { + ngx_free_connection(c); + return NGX_ERROR; + } + + } else { + if (ngx_add_event(ev, event, 0) == NGX_ERROR) { + ngx_free_connection(c); + return NGX_ERROR; + } + } + + return NGX_OK; +} + + +void +ngx_close_channel(ngx_fd_t *fd, ngx_log_t *log) +{ + if (close(fd[0]) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close() channel failed"); + } + + if (close(fd[1]) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close() channel failed"); + } +} diff --git a/release/src/router/nginx/src/os/unix/ngx_channel.h b/release/src/router/nginx/src/os/unix/ngx_channel.h new file mode 100644 index 0000000000..d7a9f6b54c --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_channel.h @@ -0,0 +1,34 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_CHANNEL_H_INCLUDED_ +#define _NGX_CHANNEL_H_INCLUDED_ + + +#include +#include +#include + + +typedef struct { + ngx_uint_t command; + ngx_pid_t pid; + ngx_int_t slot; + ngx_fd_t fd; +} ngx_channel_t; + + +ngx_int_t ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, + ngx_log_t *log); +ngx_int_t ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, + ngx_log_t *log); +ngx_int_t ngx_add_channel_event(ngx_cycle_t *cycle, ngx_fd_t fd, + ngx_int_t event, ngx_event_handler_pt handler); +void ngx_close_channel(ngx_fd_t *fd, ngx_log_t *log); + + +#endif /* _NGX_CHANNEL_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_daemon.c b/release/src/router/nginx/src/os/unix/ngx_daemon.c new file mode 100644 index 0000000000..ab67211083 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_daemon.c @@ -0,0 +1,70 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +ngx_int_t +ngx_daemon(ngx_log_t *log) +{ + int fd; + + switch (fork()) { + case -1: + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed"); + return NGX_ERROR; + + case 0: + break; + + default: + exit(0); + } + + ngx_pid = ngx_getpid(); + + if (setsid() == -1) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed"); + return NGX_ERROR; + } + + umask(0); + + fd = open("/dev/null", O_RDWR); + if (fd == -1) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, + "open(\"/dev/null\") failed"); + return NGX_ERROR; + } + + if (dup2(fd, STDIN_FILENO) == -1) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed"); + return NGX_ERROR; + } + + if (dup2(fd, STDOUT_FILENO) == -1) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed"); + return NGX_ERROR; + } + +#if 0 + if (dup2(fd, STDERR_FILENO) == -1) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed"); + return NGX_ERROR; + } +#endif + + if (fd > STDERR_FILENO) { + if (close(fd) == -1) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed"); + return NGX_ERROR; + } + } + + return NGX_OK; +} diff --git a/release/src/router/nginx/src/os/unix/ngx_darwin.h b/release/src/router/nginx/src/os/unix/ngx_darwin.h new file mode 100644 index 0000000000..4d01b26ea5 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_darwin.h @@ -0,0 +1,23 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_DARWIN_H_INCLUDED_ +#define _NGX_DARWIN_H_INCLUDED_ + + +void ngx_debug_init(void); +ngx_chain_t *ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, + off_t limit); + +extern int ngx_darwin_kern_osreldate; +extern int ngx_darwin_hw_ncpu; +extern u_long ngx_darwin_net_inet_tcp_sendspace; + +extern ngx_uint_t ngx_debug_malloc; + + +#endif /* _NGX_DARWIN_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_darwin_config.h b/release/src/router/nginx/src/os/unix/ngx_darwin_config.h new file mode 100644 index 0000000000..149778c29a --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_darwin_config.h @@ -0,0 +1,97 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_DARWIN_CONFIG_H_INCLUDED_ +#define _NGX_DARWIN_CONFIG_H_INCLUDED_ + + +#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_0 + + +#include +#include +#include +#include +#include +#include /* offsetof() */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* statfs() */ + +#include /* FIONBIO */ +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include /* TCP_NODELAY */ +#include +#include +#include + +#include +#include + + +#ifndef IOV_MAX +#define IOV_MAX 64 +#endif + + +#include + + +#if (NGX_HAVE_POSIX_SEM) +#include +#endif + + +#if (NGX_HAVE_POLL) +#include +#endif + + +#if (NGX_HAVE_KQUEUE) +#include +#endif + + +#define NGX_LISTEN_BACKLOG -1 + + +#ifndef NGX_HAVE_INHERITED_NONBLOCK +#define NGX_HAVE_INHERITED_NONBLOCK 1 +#endif + + +#ifndef NGX_HAVE_CASELESS_FILESYSTEM +#define NGX_HAVE_CASELESS_FILESYSTEM 1 +#endif + + +#define NGX_HAVE_OS_SPECIFIC_INIT 1 +#define NGX_HAVE_DEBUG_MALLOC 1 + + +extern char **environ; + + +#endif /* _NGX_DARWIN_CONFIG_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_darwin_init.c b/release/src/router/nginx/src/os/unix/ngx_darwin_init.c new file mode 100644 index 0000000000..e3cc5fe3ee --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_darwin_init.c @@ -0,0 +1,196 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +char ngx_darwin_kern_ostype[16]; +char ngx_darwin_kern_osrelease[128]; +int ngx_darwin_hw_ncpu; +int ngx_darwin_kern_ipc_somaxconn; +u_long ngx_darwin_net_inet_tcp_sendspace; + +ngx_uint_t ngx_debug_malloc; + + +static ngx_os_io_t ngx_darwin_io = { + ngx_unix_recv, + ngx_readv_chain, + ngx_udp_unix_recv, + ngx_unix_send, +#if (NGX_HAVE_SENDFILE) + ngx_darwin_sendfile_chain, + NGX_IO_SENDFILE +#else + ngx_writev_chain, + 0 +#endif +}; + + +typedef struct { + char *name; + void *value; + size_t size; + ngx_uint_t exists; +} sysctl_t; + + +sysctl_t sysctls[] = { + { "hw.ncpu", + &ngx_darwin_hw_ncpu, + sizeof(ngx_darwin_hw_ncpu), 0 }, + + { "net.inet.tcp.sendspace", + &ngx_darwin_net_inet_tcp_sendspace, + sizeof(ngx_darwin_net_inet_tcp_sendspace), 0 }, + + { "kern.ipc.somaxconn", + &ngx_darwin_kern_ipc_somaxconn, + sizeof(ngx_darwin_kern_ipc_somaxconn), 0 }, + + { NULL, NULL, 0, 0 } +}; + + +void +ngx_debug_init() +{ +#if (NGX_DEBUG_MALLOC) + + /* + * MacOSX 10.6, 10.7: MallocScribble fills freed memory with 0x55 + * and fills allocated memory with 0xAA. + * MacOSX 10.4, 10.5: MallocScribble fills freed memory with 0x55, + * MallocPreScribble fills allocated memory with 0xAA. + * MacOSX 10.3: MallocScribble fills freed memory with 0x55, + * and no way to fill allocated memory. + */ + + setenv("MallocScribble", "1", 0); + + ngx_debug_malloc = 1; + +#else + + if (getenv("MallocScribble")) { + ngx_debug_malloc = 1; + } + +#endif +} + + +ngx_int_t +ngx_os_specific_init(ngx_log_t *log) +{ + size_t size; + ngx_err_t err; + ngx_uint_t i; + + size = sizeof(ngx_darwin_kern_ostype); + if (sysctlbyname("kern.ostype", ngx_darwin_kern_ostype, &size, NULL, 0) + == -1) + { + err = ngx_errno; + + if (err != NGX_ENOENT) { + + ngx_log_error(NGX_LOG_ALERT, log, err, + "sysctlbyname(kern.ostype) failed"); + + if (err != NGX_ENOMEM) { + return NGX_ERROR; + } + + ngx_darwin_kern_ostype[size - 1] = '\0'; + } + } + + size = sizeof(ngx_darwin_kern_osrelease); + if (sysctlbyname("kern.osrelease", ngx_darwin_kern_osrelease, &size, + NULL, 0) + == -1) + { + err = ngx_errno; + + if (err != NGX_ENOENT) { + + ngx_log_error(NGX_LOG_ALERT, log, err, + "sysctlbyname(kern.osrelease) failed"); + + if (err != NGX_ENOMEM) { + return NGX_ERROR; + } + + ngx_darwin_kern_osrelease[size - 1] = '\0'; + } + } + + for (i = 0; sysctls[i].name; i++) { + size = sysctls[i].size; + + if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0) + == 0) + { + sysctls[i].exists = 1; + continue; + } + + err = ngx_errno; + + if (err == NGX_ENOENT) { + continue; + } + + ngx_log_error(NGX_LOG_ALERT, log, err, + "sysctlbyname(%s) failed", sysctls[i].name); + return NGX_ERROR; + } + + ngx_ncpu = ngx_darwin_hw_ncpu; + + if (ngx_darwin_kern_ipc_somaxconn > 32767) { + ngx_log_error(NGX_LOG_ALERT, log, 0, + "sysctl kern.ipc.somaxconn must be less than 32768"); + return NGX_ERROR; + } + + ngx_tcp_nodelay_and_tcp_nopush = 1; + + ngx_os_io = ngx_darwin_io; + + return NGX_OK; +} + + +void +ngx_os_specific_status(ngx_log_t *log) +{ + u_long value; + ngx_uint_t i; + + if (ngx_darwin_kern_ostype[0]) { + ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s", + ngx_darwin_kern_ostype, ngx_darwin_kern_osrelease); + } + + for (i = 0; sysctls[i].name; i++) { + if (sysctls[i].exists) { + if (sysctls[i].size == sizeof(long)) { + value = *(long *) sysctls[i].value; + + } else { + value = *(int *) sysctls[i].value; + } + + ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l", + sysctls[i].name, value); + } + } +} diff --git a/release/src/router/nginx/src/os/unix/ngx_darwin_sendfile_chain.c b/release/src/router/nginx/src/os/unix/ngx_darwin_sendfile_chain.c new file mode 100644 index 0000000000..078d10b242 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_darwin_sendfile_chain.c @@ -0,0 +1,372 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +/* + * It seems that Darwin 9.4 (Mac OS X 1.5) sendfile() has the same + * old bug as early FreeBSD sendfile() syscall: + * http://www.freebsd.org/cgi/query-pr.cgi?pr=33771 + * + * Besides sendfile() has another bug: if one calls sendfile() + * with both a header and a trailer, then sendfile() ignores a file part + * at all and sends only the header and the trailer together. + * For this reason we send a trailer only if there is no a header. + * + * Although sendfile() allows to pass a header or a trailer, + * it may send the header or the trailer and a part of the file + * in different packets. And FreeBSD workaround (TCP_NOPUSH option) + * does not help. + */ + + +#if (IOV_MAX > 64) +#define NGX_HEADERS 64 +#define NGX_TRAILERS 64 +#else +#define NGX_HEADERS IOV_MAX +#define NGX_TRAILERS IOV_MAX +#endif + + +ngx_chain_t * +ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) +{ + int rc; + u_char *prev; + off_t size, send, prev_send, aligned, sent, fprev; + off_t header_size, file_size; + ngx_uint_t eintr, complete; + ngx_err_t err; + ngx_buf_t *file; + ngx_array_t header, trailer; + ngx_event_t *wev; + ngx_chain_t *cl; + struct sf_hdtr hdtr; + struct iovec *iov, headers[NGX_HEADERS], trailers[NGX_TRAILERS]; + + wev = c->write; + + if (!wev->ready) { + return in; + } + +#if (NGX_HAVE_KQUEUE) + + if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) { + (void) ngx_connection_error(c, wev->kq_errno, + "kevent() reported about an closed connection"); + wev->error = 1; + return NGX_CHAIN_ERROR; + } + +#endif + + /* the maximum limit size is the maximum size_t value - the page size */ + + if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { + limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; + } + + send = 0; + + header.elts = headers; + header.size = sizeof(struct iovec); + header.nalloc = NGX_HEADERS; + header.pool = c->pool; + + trailer.elts = trailers; + trailer.size = sizeof(struct iovec); + trailer.nalloc = NGX_TRAILERS; + trailer.pool = c->pool; + + for ( ;; ) { + file = NULL; + file_size = 0; + header_size = 0; + eintr = 0; + complete = 0; + prev_send = send; + + header.nelts = 0; + trailer.nelts = 0; + + /* create the header iovec and coalesce the neighbouring bufs */ + + prev = NULL; + iov = NULL; + + for (cl = in; cl && send < limit; cl = cl->next) { + + if (ngx_buf_special(cl->buf)) { + continue; + } + + if (!ngx_buf_in_memory_only(cl->buf)) { + break; + } + + size = cl->buf->last - cl->buf->pos; + + if (send + size > limit) { + size = limit - send; + } + + if (prev == cl->buf->pos) { + iov->iov_len += (size_t) size; + + } else { + if (header.nelts >= IOV_MAX) { + break; + } + + iov = ngx_array_push(&header); + if (iov == NULL) { + return NGX_CHAIN_ERROR; + } + + iov->iov_base = (void *) cl->buf->pos; + iov->iov_len = (size_t) size; + } + + prev = cl->buf->pos + (size_t) size; + header_size += size; + send += size; + } + + + if (cl && cl->buf->in_file && send < limit) { + file = cl->buf; + + /* coalesce the neighbouring file bufs */ + + do { + size = cl->buf->file_last - cl->buf->file_pos; + + if (send + size > limit) { + size = limit - send; + + aligned = (cl->buf->file_pos + size + ngx_pagesize - 1) + & ~((off_t) ngx_pagesize - 1); + + if (aligned <= cl->buf->file_last) { + size = aligned - cl->buf->file_pos; + } + } + + file_size += size; + send += size; + fprev = cl->buf->file_pos + size; + cl = cl->next; + + } while (cl + && cl->buf->in_file + && send < limit + && file->file->fd == cl->buf->file->fd + && fprev == cl->buf->file_pos); + } + + if (file && header.nelts == 0) { + + /* create the trailer iovec and coalesce the neighbouring bufs */ + + prev = NULL; + iov = NULL; + + while (cl && send < limit) { + + if (ngx_buf_special(cl->buf)) { + cl = cl->next; + continue; + } + + if (!ngx_buf_in_memory_only(cl->buf)) { + break; + } + + size = cl->buf->last - cl->buf->pos; + + if (send + size > limit) { + size = limit - send; + } + + if (prev == cl->buf->pos) { + iov->iov_len += (size_t) size; + + } else { + if (trailer.nelts >= IOV_MAX) { + break; + } + + iov = ngx_array_push(&trailer); + if (iov == NULL) { + return NGX_CHAIN_ERROR; + } + + iov->iov_base = (void *) cl->buf->pos; + iov->iov_len = (size_t) size; + } + + prev = cl->buf->pos + (size_t) size; + send += size; + cl = cl->next; + } + } + + if (file) { + + /* + * sendfile() returns EINVAL if sf_hdtr's count is 0, + * but corresponding pointer is not NULL + */ + + hdtr.headers = header.nelts ? (struct iovec *) header.elts: NULL; + hdtr.hdr_cnt = header.nelts; + hdtr.trailers = trailer.nelts ? (struct iovec *) trailer.elts: NULL; + hdtr.trl_cnt = trailer.nelts; + + sent = header_size + file_size; + + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, + "sendfile: @%O %O h:%O", + file->file_pos, sent, header_size); + + rc = sendfile(file->file->fd, c->fd, file->file_pos, + &sent, &hdtr, 0); + + if (rc == -1) { + err = ngx_errno; + + switch (err) { + case NGX_EAGAIN: + break; + + case NGX_EINTR: + eintr = 1; + break; + + default: + wev->error = 1; + (void) ngx_connection_error(c, err, "sendfile() failed"); + return NGX_CHAIN_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, + "sendfile() sent only %O bytes", sent); + } + + if (rc == 0 && sent == 0) { + + /* + * if rc and sent equal to zero, then someone + * has truncated the file, so the offset became beyond + * the end of the file + */ + + ngx_log_error(NGX_LOG_ALERT, c->log, 0, + "sendfile() reported that \"%s\" was truncated", + file->file->name.data); + + return NGX_CHAIN_ERROR; + } + + ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, + "sendfile: %d, @%O %O:%O", + rc, file->file_pos, sent, file_size + header_size); + + } else { + rc = writev(c->fd, header.elts, header.nelts); + + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, + "writev: %d of %uz", rc, send); + + if (rc == -1) { + err = ngx_errno; + + switch (err) { + case NGX_EAGAIN: + break; + + case NGX_EINTR: + eintr = 1; + break; + + default: + wev->error = 1; + ngx_connection_error(c, err, "writev() failed"); + return NGX_CHAIN_ERROR; + } + + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "writev() not ready"); + } + + sent = rc > 0 ? rc : 0; + } + + if (send - prev_send == sent) { + complete = 1; + } + + c->sent += sent; + + for (cl = in; cl; cl = cl->next) { + + if (ngx_buf_special(cl->buf)) { + continue; + } + + if (sent == 0) { + break; + } + + size = ngx_buf_size(cl->buf); + + if (sent >= size) { + sent -= size; + + if (ngx_buf_in_memory(cl->buf)) { + cl->buf->pos = cl->buf->last; + } + + if (cl->buf->in_file) { + cl->buf->file_pos = cl->buf->file_last; + } + + continue; + } + + if (ngx_buf_in_memory(cl->buf)) { + cl->buf->pos += (size_t) sent; + } + + if (cl->buf->in_file) { + cl->buf->file_pos += sent; + } + + break; + } + + if (eintr) { + continue; + } + + if (!complete) { + wev->ready = 0; + return cl; + } + + if (send >= limit || cl == NULL) { + return cl; + } + + in = cl; + } +} diff --git a/release/src/router/nginx/src/os/unix/ngx_errno.c b/release/src/router/nginx/src/os/unix/ngx_errno.c new file mode 100644 index 0000000000..8d555c5155 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_errno.c @@ -0,0 +1,90 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + +#ifndef NGX_SYS_NERR +#define NGX_SYS_NERR 128 +#endif + +/* + * The strerror() messages are copied because: + * + * 1) strerror() and strerror_r() functions are not Async-Signal-Safe, + * therefore, they cannot be used in signal handlers; + * + * 2) a direct sys_errlist[] array may be used instead of these functions, + * but Linux linker warns about its usage: + * + * warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead + * warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead + * + * causing false bug reports. + */ + + +static ngx_str_t *ngx_sys_errlist; +static ngx_str_t ngx_unknown_error = ngx_string("Unknown error"); + + +u_char * +ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) +{ + ngx_str_t *msg; + + msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]: + &ngx_unknown_error; + size = ngx_min(size, msg->len); + + return ngx_cpymem(errstr, msg->data, size); +} + + +ngx_int_t +ngx_strerror_init(void) +{ + char *msg; + u_char *p; + size_t len; + ngx_err_t err; + + /* + * ngx_strerror() is not ready to work at this stage, therefore, + * malloc() is used and possible errors are logged using strerror(). + */ + + len = NGX_SYS_NERR * sizeof(ngx_str_t); + + ngx_sys_errlist = malloc(len); + if (ngx_sys_errlist == NULL) { + goto failed; + } + + for (err = 0; err < NGX_SYS_NERR; err++) { + msg = strerror(err); + len = ngx_strlen(msg); + + p = malloc(len); + if (p == NULL) { + goto failed; + } + + ngx_memcpy(p, msg, len); + ngx_sys_errlist[err].len = len; + ngx_sys_errlist[err].data = p; + } + + return NGX_OK; + +failed: + + err = errno; + ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err)); + + return NGX_ERROR; +} diff --git a/release/src/router/nginx/src/os/unix/ngx_errno.h b/release/src/router/nginx/src/os/unix/ngx_errno.h new file mode 100644 index 0000000000..125087e781 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_errno.h @@ -0,0 +1,75 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_ERRNO_H_INCLUDED_ +#define _NGX_ERRNO_H_INCLUDED_ + + +#include +#include + + +typedef int ngx_err_t; + +#define NGX_EPERM EPERM +#define NGX_ENOENT ENOENT +#define NGX_ENOPATH ENOENT +#define NGX_ESRCH ESRCH +#define NGX_EINTR EINTR +#define NGX_ECHILD ECHILD +#define NGX_ENOMEM ENOMEM +#define NGX_EACCES EACCES +#define NGX_EBUSY EBUSY +#define NGX_EEXIST EEXIST +#define NGX_EXDEV EXDEV +#define NGX_ENOTDIR ENOTDIR +#define NGX_EISDIR EISDIR +#define NGX_EINVAL EINVAL +#define NGX_ENFILE ENFILE +#define NGX_EMFILE EMFILE +#define NGX_ENOSPC ENOSPC +#define NGX_EPIPE EPIPE +#define NGX_EINPROGRESS EINPROGRESS +#define NGX_EADDRINUSE EADDRINUSE +#define NGX_ECONNABORTED ECONNABORTED +#define NGX_ECONNRESET ECONNRESET +#define NGX_ENOTCONN ENOTCONN +#define NGX_ETIMEDOUT ETIMEDOUT +#define NGX_ECONNREFUSED ECONNREFUSED +#define NGX_ENAMETOOLONG ENAMETOOLONG +#define NGX_ENETDOWN ENETDOWN +#define NGX_ENETUNREACH ENETUNREACH +#define NGX_EHOSTDOWN EHOSTDOWN +#define NGX_EHOSTUNREACH EHOSTUNREACH +#define NGX_ENOSYS ENOSYS +#define NGX_ECANCELED ECANCELED +#define NGX_EILSEQ EILSEQ +#define NGX_ENOMOREFILES 0 + +#if (NGX_HAVE_OPENAT) +#define NGX_EMLINK EMLINK +#define NGX_ELOOP ELOOP +#endif + +#if (__hpux__) +#define NGX_EAGAIN EWOULDBLOCK +#else +#define NGX_EAGAIN EAGAIN +#endif + + +#define ngx_errno errno +#define ngx_socket_errno errno +#define ngx_set_errno(err) errno = err +#define ngx_set_socket_errno(err) errno = err + + +u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size); +ngx_int_t ngx_strerror_init(void); + + +#endif /* _NGX_ERRNO_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_file_aio_read.c b/release/src/router/nginx/src/os/unix/ngx_file_aio_read.c new file mode 100644 index 0000000000..0bb383de55 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_file_aio_read.c @@ -0,0 +1,208 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +/* + * FreeBSD file AIO features and quirks: + * + * if an asked data are already in VM cache, then aio_error() returns 0, + * and the data are already copied in buffer; + * + * aio_read() preread in VM cache as minimum 16K (probably BKVASIZE); + * the first AIO preload may be up to 128K; + * + * aio_read/aio_error() may return EINPROGRESS for just written data; + * + * kqueue EVFILT_AIO filter is level triggered only: an event repeats + * until aio_return() will be called; + * + * aio_cancel() cannot cancel file AIO: it returns AIO_NOTCANCELED always. + */ + + +extern int ngx_kqueue; + + +static ssize_t ngx_file_aio_result(ngx_file_t *file, ngx_event_aio_t *aio, + ngx_event_t *ev); +static void ngx_file_aio_event_handler(ngx_event_t *ev); + + +ssize_t +ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset, + ngx_pool_t *pool) +{ + int n; + ngx_event_t *ev; + ngx_event_aio_t *aio; + + if (!ngx_file_aio) { + return ngx_read_file(file, buf, size, offset); + } + + aio = file->aio; + + if (aio == NULL) { + aio = ngx_pcalloc(pool, sizeof(ngx_event_aio_t)); + if (aio == NULL) { + return NGX_ERROR; + } + + aio->file = file; + aio->fd = file->fd; + aio->event.data = aio; + aio->event.ready = 1; + aio->event.log = file->log; +#if (NGX_HAVE_AIO_SENDFILE) + aio->last_offset = -1; +#endif + file->aio = aio; + } + + ev = &aio->event; + + if (!ev->ready) { + ngx_log_error(NGX_LOG_ALERT, file->log, 0, + "second aio post for \"%V\"", &file->name); + return NGX_AGAIN; + } + + ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, + "aio complete:%d @%O:%z %V", + ev->complete, offset, size, &file->name); + + if (ev->complete) { + ev->complete = 0; + ngx_set_errno(aio->err); + + if (aio->err == 0) { + return aio->nbytes; + } + + ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, + "aio read \"%s\" failed", file->name.data); + + return NGX_ERROR; + } + + ngx_memzero(&aio->aiocb, sizeof(struct aiocb)); + + aio->aiocb.aio_fildes = file->fd; + aio->aiocb.aio_offset = offset; + aio->aiocb.aio_buf = buf; + aio->aiocb.aio_nbytes = size; +#if (NGX_HAVE_KQUEUE) + aio->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue; + aio->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT; + aio->aiocb.aio_sigevent.sigev_value.sigval_ptr = ev; +#endif + ev->handler = ngx_file_aio_event_handler; + + n = aio_read(&aio->aiocb); + + if (n == -1) { + n = ngx_errno; + + if (n == NGX_EAGAIN) { + return ngx_read_file(file, buf, size, offset); + } + + ngx_log_error(NGX_LOG_CRIT, file->log, n, + "aio_read(\"%V\") failed", &file->name); + + if (n == NGX_ENOSYS) { + ngx_file_aio = 0; + return ngx_read_file(file, buf, size, offset); + } + + return NGX_ERROR; + } + + ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0, + "aio_read: fd:%d %d", file->fd, n); + + ev->active = 1; + ev->ready = 0; + ev->complete = 0; + + return ngx_file_aio_result(aio->file, aio, ev); +} + + +static ssize_t +ngx_file_aio_result(ngx_file_t *file, ngx_event_aio_t *aio, ngx_event_t *ev) +{ + int n; + ngx_err_t err; + + n = aio_error(&aio->aiocb); + + ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0, + "aio_error: fd:%d %d", file->fd, n); + + if (n == -1) { + err = ngx_errno; + aio->err = err; + + ngx_log_error(NGX_LOG_ALERT, file->log, err, + "aio_error(\"%V\") failed", &file->name); + return NGX_ERROR; + } + + if (n == NGX_EINPROGRESS) { + if (ev->ready) { + ev->ready = 0; + ngx_log_error(NGX_LOG_ALERT, file->log, n, + "aio_read(\"%V\") still in progress", + &file->name); + } + + return NGX_AGAIN; + } + + n = aio_return(&aio->aiocb); + + if (n == -1) { + err = ngx_errno; + aio->err = err; + ev->ready = 1; + + ngx_log_error(NGX_LOG_CRIT, file->log, err, + "aio_return(\"%V\") failed", &file->name); + return NGX_ERROR; + } + + aio->err = 0; + aio->nbytes = n; + ev->ready = 1; + ev->active = 0; + + ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0, + "aio_return: fd:%d %d", file->fd, n); + + return n; +} + + +static void +ngx_file_aio_event_handler(ngx_event_t *ev) +{ + ngx_event_aio_t *aio; + + aio = ev->data; + + ngx_log_debug2(NGX_LOG_DEBUG_CORE, ev->log, 0, + "aio event handler fd:%d %V", aio->fd, &aio->file->name); + + if (ngx_file_aio_result(aio->file, aio, ev) != NGX_AGAIN) { + aio->handler(ev); + } +} diff --git a/release/src/router/nginx/src/os/unix/ngx_files.c b/release/src/router/nginx/src/os/unix/ngx_files.c new file mode 100644 index 0000000000..c3ae47fdbf --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_files.c @@ -0,0 +1,564 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +#if (NGX_HAVE_FILE_AIO) + +ngx_uint_t ngx_file_aio = 1; + +#endif + + +ssize_t +ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) +{ + ssize_t n; + + ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, + "read: %d, %p, %uz, %O", file->fd, buf, size, offset); + +#if (NGX_HAVE_PREAD) + + n = pread(file->fd, buf, size, offset); + + if (n == -1) { + ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, + "pread() \"%s\" failed", file->name.data); + return NGX_ERROR; + } + +#else + + if (file->sys_offset != offset) { + if (lseek(file->fd, offset, SEEK_SET) == -1) { + ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, + "lseek() \"%s\" failed", file->name.data); + return NGX_ERROR; + } + + file->sys_offset = offset; + } + + n = read(file->fd, buf, size); + + if (n == -1) { + ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, + "read() \"%s\" failed", file->name.data); + return NGX_ERROR; + } + + file->sys_offset += n; + +#endif + + file->offset += n; + + return n; +} + + +ssize_t +ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) +{ + ssize_t n, written; + + ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, + "write: %d, %p, %uz, %O", file->fd, buf, size, offset); + + written = 0; + +#if (NGX_HAVE_PWRITE) + + for ( ;; ) { + n = pwrite(file->fd, buf + written, size, offset); + + if (n == -1) { + ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, + "pwrite() \"%s\" failed", file->name.data); + return NGX_ERROR; + } + + file->offset += n; + written += n; + + if ((size_t) n == size) { + return written; + } + + offset += n; + size -= n; + } + +#else + + if (file->sys_offset != offset) { + if (lseek(file->fd, offset, SEEK_SET) == -1) { + ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, + "lseek() \"%s\" failed", file->name.data); + return NGX_ERROR; + } + + file->sys_offset = offset; + } + + for ( ;; ) { + n = write(file->fd, buf + written, size); + + if (n == -1) { + ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, + "write() \"%s\" failed", file->name.data); + return NGX_ERROR; + } + + file->offset += n; + written += n; + + if ((size_t) n == size) { + return written; + } + + size -= n; + } +#endif +} + + +ngx_fd_t +ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access) +{ + ngx_fd_t fd; + + fd = open((const char *) name, O_CREAT|O_EXCL|O_RDWR, + access ? access : 0600); + + if (fd != -1 && !persistent) { + (void) unlink((const char *) name); + } + + return fd; +} + + +#define NGX_IOVS 8 + +ssize_t +ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset, + ngx_pool_t *pool) +{ + u_char *prev; + size_t size; + ssize_t total, n; + ngx_array_t vec; + struct iovec *iov, iovs[NGX_IOVS]; + + /* use pwrite() if there is the only buf in a chain */ + + if (cl->next == NULL) { + return ngx_write_file(file, cl->buf->pos, + (size_t) (cl->buf->last - cl->buf->pos), + offset); + } + + total = 0; + + vec.elts = iovs; + vec.size = sizeof(struct iovec); + vec.nalloc = NGX_IOVS; + vec.pool = pool; + + do { + prev = NULL; + iov = NULL; + size = 0; + + vec.nelts = 0; + + /* create the iovec and coalesce the neighbouring bufs */ + + while (cl && vec.nelts < IOV_MAX) { + if (prev == cl->buf->pos) { + iov->iov_len += cl->buf->last - cl->buf->pos; + + } else { + iov = ngx_array_push(&vec); + if (iov == NULL) { + return NGX_ERROR; + } + + iov->iov_base = (void *) cl->buf->pos; + iov->iov_len = cl->buf->last - cl->buf->pos; + } + + size += cl->buf->last - cl->buf->pos; + prev = cl->buf->last; + cl = cl->next; + } + + /* use pwrite() if there is the only iovec buffer */ + + if (vec.nelts == 1) { + iov = vec.elts; + + n = ngx_write_file(file, (u_char *) iov[0].iov_base, + iov[0].iov_len, offset); + + if (n == NGX_ERROR) { + return n; + } + + return total + n; + } + + if (file->sys_offset != offset) { + if (lseek(file->fd, offset, SEEK_SET) == -1) { + ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, + "lseek() \"%s\" failed", file->name.data); + return NGX_ERROR; + } + + file->sys_offset = offset; + } + + n = writev(file->fd, vec.elts, vec.nelts); + + if (n == -1) { + ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, + "writev() \"%s\" failed", file->name.data); + return NGX_ERROR; + } + + if ((size_t) n != size) { + ngx_log_error(NGX_LOG_CRIT, file->log, 0, + "writev() \"%s\" has written only %z of %uz", + file->name.data, n, size); + return NGX_ERROR; + } + + ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0, + "writev: %d, %z", file->fd, n); + + file->sys_offset += n; + file->offset += n; + offset += n; + total += n; + + } while (cl); + + return total; +} + + +ngx_int_t +ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s) +{ + struct timeval tv[2]; + + tv[0].tv_sec = ngx_time(); + tv[0].tv_usec = 0; + tv[1].tv_sec = s; + tv[1].tv_usec = 0; + + if (utimes((char *) name, tv) != -1) { + return NGX_OK; + } + + return NGX_ERROR; +} + + +ngx_int_t +ngx_create_file_mapping(ngx_file_mapping_t *fm) +{ + fm->fd = ngx_open_file(fm->name, NGX_FILE_RDWR, NGX_FILE_TRUNCATE, + NGX_FILE_DEFAULT_ACCESS); + if (fm->fd == NGX_INVALID_FILE) { + ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, + ngx_open_file_n " \"%s\" failed", fm->name); + return NGX_ERROR; + } + + if (ftruncate(fm->fd, fm->size) == -1) { + ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, + "ftruncate() \"%s\" failed", fm->name); + goto failed; + } + + fm->addr = mmap(NULL, fm->size, PROT_READ|PROT_WRITE, MAP_SHARED, + fm->fd, 0); + if (fm->addr != MAP_FAILED) { + return NGX_OK; + } + + ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, + "mmap(%uz) \"%s\" failed", fm->size, fm->name); + +failed: + + if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno, + ngx_close_file_n " \"%s\" failed", fm->name); + } + + return NGX_ERROR; +} + + +void +ngx_close_file_mapping(ngx_file_mapping_t *fm) +{ + if (munmap(fm->addr, fm->size) == -1) { + ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, + "munmap(%uz) \"%s\" failed", fm->size, fm->name); + } + + if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno, + ngx_close_file_n " \"%s\" failed", fm->name); + } +} + + +ngx_int_t +ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir) +{ + dir->dir = opendir((const char *) name->data); + + if (dir->dir == NULL) { + return NGX_ERROR; + } + + dir->valid_info = 0; + + return NGX_OK; +} + + +ngx_int_t +ngx_read_dir(ngx_dir_t *dir) +{ + dir->de = readdir(dir->dir); + + if (dir->de) { +#if (NGX_HAVE_D_TYPE) + dir->type = dir->de->d_type; +#else + dir->type = 0; +#endif + return NGX_OK; + } + + return NGX_ERROR; +} + + +ngx_int_t +ngx_open_glob(ngx_glob_t *gl) +{ + int n; + + n = glob((char *) gl->pattern, 0, NULL, &gl->pglob); + + if (n == 0) { + return NGX_OK; + } + +#ifdef GLOB_NOMATCH + + if (n == GLOB_NOMATCH && gl->test) { + return NGX_OK; + } + +#endif + + return NGX_ERROR; +} + + +ngx_int_t +ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name) +{ + size_t count; + +#ifdef GLOB_NOMATCH + count = (size_t) gl->pglob.gl_pathc; +#else + count = (size_t) gl->pglob.gl_matchc; +#endif + + if (gl->n < count) { + + name->len = (size_t) ngx_strlen(gl->pglob.gl_pathv[gl->n]); + name->data = (u_char *) gl->pglob.gl_pathv[gl->n]; + gl->n++; + + return NGX_OK; + } + + return NGX_DONE; +} + + +void +ngx_close_glob(ngx_glob_t *gl) +{ + globfree(&gl->pglob); +} + + +ngx_err_t +ngx_trylock_fd(ngx_fd_t fd) +{ + struct flock fl; + + ngx_memzero(&fl, sizeof(struct flock)); + fl.l_type = F_WRLCK; + fl.l_whence = SEEK_SET; + + if (fcntl(fd, F_SETLK, &fl) == -1) { + return ngx_errno; + } + + return 0; +} + + +ngx_err_t +ngx_lock_fd(ngx_fd_t fd) +{ + struct flock fl; + + ngx_memzero(&fl, sizeof(struct flock)); + fl.l_type = F_WRLCK; + fl.l_whence = SEEK_SET; + + if (fcntl(fd, F_SETLKW, &fl) == -1) { + return ngx_errno; + } + + return 0; +} + + +ngx_err_t +ngx_unlock_fd(ngx_fd_t fd) +{ + struct flock fl; + + ngx_memzero(&fl, sizeof(struct flock)); + fl.l_type = F_UNLCK; + fl.l_whence = SEEK_SET; + + if (fcntl(fd, F_SETLK, &fl) == -1) { + return ngx_errno; + } + + return 0; +} + + +#if (NGX_HAVE_POSIX_FADVISE) && !(NGX_HAVE_F_READAHEAD) + +ngx_int_t +ngx_read_ahead(ngx_fd_t fd, size_t n) +{ + int err; + + err = posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); + + if (err == 0) { + return 0; + } + + ngx_set_errno(err); + return NGX_FILE_ERROR; +} + +#endif + + +#if (NGX_HAVE_O_DIRECT) + +ngx_int_t +ngx_directio_on(ngx_fd_t fd) +{ + int flags; + + flags = fcntl(fd, F_GETFL); + + if (flags == -1) { + return NGX_FILE_ERROR; + } + + return fcntl(fd, F_SETFL, flags | O_DIRECT); +} + + +ngx_int_t +ngx_directio_off(ngx_fd_t fd) +{ + int flags; + + flags = fcntl(fd, F_GETFL); + + if (flags == -1) { + return NGX_FILE_ERROR; + } + + return fcntl(fd, F_SETFL, flags & ~O_DIRECT); +} + +#endif + + +#if (NGX_HAVE_STATFS) + +size_t +ngx_fs_bsize(u_char *name) +{ + struct statfs fs; + + if (statfs((char *) name, &fs) == -1) { + return 512; + } + + if ((fs.f_bsize % 512) != 0) { + return 512; + } + + return (size_t) fs.f_bsize; +} + +#elif (NGX_HAVE_STATVFS) + +size_t +ngx_fs_bsize(u_char *name) +{ + struct statvfs fs; + + if (statvfs((char *) name, &fs) == -1) { + return 512; + } + + if ((fs.f_frsize % 512) != 0) { + return 512; + } + + return (size_t) fs.f_frsize; +} + +#else + +size_t +ngx_fs_bsize(u_char *name) +{ + return 512; +} + +#endif diff --git a/release/src/router/nginx/src/os/unix/ngx_files.h b/release/src/router/nginx/src/os/unix/ngx_files.h new file mode 100644 index 0000000000..9c97e2bb78 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_files.h @@ -0,0 +1,392 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_FILES_H_INCLUDED_ +#define _NGX_FILES_H_INCLUDED_ + + +#include +#include + + +typedef int ngx_fd_t; +typedef struct stat ngx_file_info_t; +typedef ino_t ngx_file_uniq_t; + + +typedef struct { + u_char *name; + size_t size; + void *addr; + ngx_fd_t fd; + ngx_log_t *log; +} ngx_file_mapping_t; + + +typedef struct { + DIR *dir; + struct dirent *de; + struct stat info; + + unsigned type:8; + unsigned valid_info:1; +} ngx_dir_t; + + +typedef struct { + size_t n; + glob_t pglob; + u_char *pattern; + ngx_log_t *log; + ngx_uint_t test; +} ngx_glob_t; + + +#define NGX_INVALID_FILE -1 +#define NGX_FILE_ERROR -1 + + + +#ifdef __CYGWIN__ + +#define NGX_HAVE_CASELESS_FILESYSTEM 1 + +#define ngx_open_file(name, mode, create, access) \ + open((const char *) name, mode|create|O_BINARY, access) + +#else + +#define ngx_open_file(name, mode, create, access) \ + open((const char *) name, mode|create, access) + +#endif + +#define ngx_open_file_n "open()" + +#define NGX_FILE_RDONLY O_RDONLY +#define NGX_FILE_WRONLY O_WRONLY +#define NGX_FILE_RDWR O_RDWR +#define NGX_FILE_CREATE_OR_OPEN O_CREAT +#define NGX_FILE_OPEN 0 +#define NGX_FILE_TRUNCATE O_CREAT|O_TRUNC +#define NGX_FILE_APPEND O_WRONLY|O_APPEND +#define NGX_FILE_NONBLOCK O_NONBLOCK + +#if (NGX_HAVE_OPENAT) +#define NGX_FILE_NOFOLLOW O_NOFOLLOW + +#if defined(O_DIRECTORY) +#define NGX_FILE_DIRECTORY O_DIRECTORY +#else +#define NGX_FILE_DIRECTORY 0 +#endif + +#if defined(O_SEARCH) +#define NGX_FILE_SEARCH O_SEARCH|NGX_FILE_DIRECTORY + +#elif defined(O_EXEC) +#define NGX_FILE_SEARCH O_EXEC|NGX_FILE_DIRECTORY + +#else +#define NGX_FILE_SEARCH O_RDONLY|NGX_FILE_DIRECTORY +#endif + +#endif /* NGX_HAVE_OPENAT */ + +#define NGX_FILE_DEFAULT_ACCESS 0644 +#define NGX_FILE_OWNER_ACCESS 0600 + + +#define ngx_close_file close +#define ngx_close_file_n "close()" + + +#define ngx_delete_file(name) unlink((const char *) name) +#define ngx_delete_file_n "unlink()" + + +ngx_fd_t ngx_open_tempfile(u_char *name, ngx_uint_t persistent, + ngx_uint_t access); +#define ngx_open_tempfile_n "open()" + + +ssize_t ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset); +#if (NGX_HAVE_PREAD) +#define ngx_read_file_n "pread()" +#else +#define ngx_read_file_n "read()" +#endif + +ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, + off_t offset); + +ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *ce, + off_t offset, ngx_pool_t *pool); + + +#define ngx_read_fd read +#define ngx_read_fd_n "read()" + +/* + * we use inlined function instead of simple #define + * because glibc 2.3 sets warn_unused_result attribute for write() + * and in this case gcc 4.3 ignores (void) cast + */ +static ngx_inline ssize_t +ngx_write_fd(ngx_fd_t fd, void *buf, size_t n) +{ + return write(fd, buf, n); +} + +#define ngx_write_fd_n "write()" + + +#define ngx_write_console ngx_write_fd + + +#define ngx_linefeed(p) *p++ = LF; +#define NGX_LINEFEED_SIZE 1 +#define NGX_LINEFEED "\x0a" + + +#define ngx_rename_file(o, n) rename((const char *) o, (const char *) n) +#define ngx_rename_file_n "rename()" + + +#define ngx_change_file_access(n, a) chmod((const char *) n, a) +#define ngx_change_file_access_n "chmod()" + + +ngx_int_t ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s); +#define ngx_set_file_time_n "utimes()" + + +#define ngx_file_info(file, sb) stat((const char *) file, sb) +#define ngx_file_info_n "stat()" + +#define ngx_fd_info(fd, sb) fstat(fd, sb) +#define ngx_fd_info_n "fstat()" + +#define ngx_link_info(file, sb) lstat((const char *) file, sb) +#define ngx_link_info_n "lstat()" + +#define ngx_is_dir(sb) (S_ISDIR((sb)->st_mode)) +#define ngx_is_file(sb) (S_ISREG((sb)->st_mode)) +#define ngx_is_link(sb) (S_ISLNK((sb)->st_mode)) +#define ngx_is_exec(sb) (((sb)->st_mode & S_IXUSR) == S_IXUSR) +#define ngx_file_access(sb) ((sb)->st_mode & 0777) +#define ngx_file_size(sb) (sb)->st_size +#define ngx_file_fs_size(sb) ngx_max((sb)->st_size, (sb)->st_blocks * 512) +#define ngx_file_mtime(sb) (sb)->st_mtime +#define ngx_file_uniq(sb) (sb)->st_ino + + +ngx_int_t ngx_create_file_mapping(ngx_file_mapping_t *fm); +void ngx_close_file_mapping(ngx_file_mapping_t *fm); + + +#if (NGX_HAVE_CASELESS_FILESYSTEM) + +#define ngx_filename_cmp(s1, s2, n) strncasecmp((char *) s1, (char *) s2, n) + +#else + +#define ngx_filename_cmp ngx_memcmp + +#endif + + +#define ngx_realpath(p, r) (u_char *) realpath((char *) p, (char *) r) +#define ngx_realpath_n "realpath()" +#define ngx_getcwd(buf, size) (getcwd((char *) buf, size) != NULL) +#define ngx_getcwd_n "getcwd()" +#define ngx_path_separator(c) ((c) == '/') + + +#if defined(PATH_MAX) + +#define NGX_HAVE_MAX_PATH 1 +#define NGX_MAX_PATH PATH_MAX + +#else + +#define NGX_MAX_PATH 4096 + +#endif + + +#define NGX_DIR_MASK_LEN 0 + + +ngx_int_t ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir); +#define ngx_open_dir_n "opendir()" + + +#define ngx_close_dir(d) closedir((d)->dir) +#define ngx_close_dir_n "closedir()" + + +ngx_int_t ngx_read_dir(ngx_dir_t *dir); +#define ngx_read_dir_n "readdir()" + + +#define ngx_create_dir(name, access) mkdir((const char *) name, access) +#define ngx_create_dir_n "mkdir()" + + +#define ngx_delete_dir(name) rmdir((const char *) name) +#define ngx_delete_dir_n "rmdir()" + + +#define ngx_dir_access(a) (a | (a & 0444) >> 2) + + +#define ngx_de_name(dir) ((u_char *) (dir)->de->d_name) +#if (NGX_HAVE_D_NAMLEN) +#define ngx_de_namelen(dir) (dir)->de->d_namlen +#else +#define ngx_de_namelen(dir) ngx_strlen((dir)->de->d_name) +#endif + +static ngx_inline ngx_int_t +ngx_de_info(u_char *name, ngx_dir_t *dir) +{ + dir->type = 0; + return stat((const char *) name, &dir->info); +} + +#define ngx_de_info_n "stat()" +#define ngx_de_link_info(name, dir) lstat((const char *) name, &(dir)->info) +#define ngx_de_link_info_n "lstat()" + +#if (NGX_HAVE_D_TYPE) + +/* + * some file systems (e.g. XFS on Linux and CD9660 on FreeBSD) + * do not set dirent.d_type + */ + +#define ngx_de_is_dir(dir) \ + (((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode))) +#define ngx_de_is_file(dir) \ + (((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode))) +#define ngx_de_is_link(dir) \ + (((dir)->type) ? ((dir)->type == DT_LNK) : (S_ISLNK((dir)->info.st_mode))) + +#else + +#define ngx_de_is_dir(dir) (S_ISDIR((dir)->info.st_mode)) +#define ngx_de_is_file(dir) (S_ISREG((dir)->info.st_mode)) +#define ngx_de_is_link(dir) (S_ISLNK((dir)->info.st_mode)) + +#endif + +#define ngx_de_access(dir) (((dir)->info.st_mode) & 0777) +#define ngx_de_size(dir) (dir)->info.st_size +#define ngx_de_fs_size(dir) \ + ngx_max((dir)->info.st_size, (dir)->info.st_blocks * 512) +#define ngx_de_mtime(dir) (dir)->info.st_mtime + + +ngx_int_t ngx_open_glob(ngx_glob_t *gl); +#define ngx_open_glob_n "glob()" +ngx_int_t ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name); +void ngx_close_glob(ngx_glob_t *gl); + + +ngx_err_t ngx_trylock_fd(ngx_fd_t fd); +ngx_err_t ngx_lock_fd(ngx_fd_t fd); +ngx_err_t ngx_unlock_fd(ngx_fd_t fd); + +#define ngx_trylock_fd_n "fcntl(F_SETLK, F_WRLCK)" +#define ngx_lock_fd_n "fcntl(F_SETLKW, F_WRLCK)" +#define ngx_unlock_fd_n "fcntl(F_SETLK, F_UNLCK)" + + +#if (NGX_HAVE_F_READAHEAD) + +#define NGX_HAVE_READ_AHEAD 1 + +#define ngx_read_ahead(fd, n) fcntl(fd, F_READAHEAD, (int) n) +#define ngx_read_ahead_n "fcntl(fd, F_READAHEAD)" + +#elif (NGX_HAVE_POSIX_FADVISE) + +#define NGX_HAVE_READ_AHEAD 1 + +ngx_int_t ngx_read_ahead(ngx_fd_t fd, size_t n); +#define ngx_read_ahead_n "posix_fadvise(POSIX_FADV_SEQUENTIAL)" + +#else + +#define ngx_read_ahead(fd, n) 0 +#define ngx_read_ahead_n "ngx_read_ahead_n" + +#endif + + +#if (NGX_HAVE_O_DIRECT) + +ngx_int_t ngx_directio_on(ngx_fd_t fd); +#define ngx_directio_on_n "fcntl(O_DIRECT)" + +ngx_int_t ngx_directio_off(ngx_fd_t fd); +#define ngx_directio_off_n "fcntl(!O_DIRECT)" + +#elif (NGX_HAVE_F_NOCACHE) + +#define ngx_directio_on(fd) fcntl(fd, F_NOCACHE, 1) +#define ngx_directio_on_n "fcntl(F_NOCACHE, 1)" + +#elif (NGX_HAVE_DIRECTIO) + +#define ngx_directio_on(fd) directio(fd, DIRECTIO_ON) +#define ngx_directio_on_n "directio(DIRECTIO_ON)" + +#else + +#define ngx_directio_on(fd) 0 +#define ngx_directio_on_n "ngx_directio_on_n" + +#endif + +size_t ngx_fs_bsize(u_char *name); + + +#if (NGX_HAVE_OPENAT) + +#define ngx_openat_file(fd, name, mode, create, access) \ + openat(fd, (const char *) name, mode|create, access) + +#define ngx_openat_file_n "openat()" + +#define ngx_file_at_info(fd, name, sb, flag) \ + fstatat(fd, (const char *) name, sb, flag) + +#define ngx_file_at_info_n "fstatat()" + +#define NGX_AT_FDCWD (ngx_fd_t) AT_FDCWD + +#endif + + +#define ngx_stderr STDERR_FILENO +#define ngx_set_stderr(fd) dup2(fd, STDERR_FILENO) +#define ngx_set_stderr_n "dup2(STDERR_FILENO)" + + +#if (NGX_HAVE_FILE_AIO) + +ssize_t ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, + off_t offset, ngx_pool_t *pool); + +extern ngx_uint_t ngx_file_aio; + +#endif + + +#endif /* _NGX_FILES_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_freebsd.h b/release/src/router/nginx/src/os/unix/ngx_freebsd.h new file mode 100644 index 0000000000..4f93da55cd --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_freebsd.h @@ -0,0 +1,25 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_FREEBSD_H_INCLUDED_ +#define _NGX_FREEBSD_H_INCLUDED_ + + +void ngx_debug_init(void); +ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, + off_t limit); + +extern int ngx_freebsd_kern_osreldate; +extern int ngx_freebsd_hw_ncpu; +extern u_long ngx_freebsd_net_inet_tcp_sendspace; + +extern ngx_uint_t ngx_freebsd_sendfile_nbytes_bug; +extern ngx_uint_t ngx_freebsd_use_tcp_nopush; +extern ngx_uint_t ngx_debug_malloc; + + +#endif /* _NGX_FREEBSD_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_freebsd_config.h b/release/src/router/nginx/src/os/unix/ngx_freebsd_config.h new file mode 100644 index 0000000000..5b3ff278c0 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_freebsd_config.h @@ -0,0 +1,121 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_FREEBSD_CONFIG_H_INCLUDED_ +#define _NGX_FREEBSD_CONFIG_H_INCLUDED_ + + +#include +#include +#include +#include +#include /* offsetof() */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* ALIGN() */ +#include /* statfs() */ + +#include /* FIONBIO */ +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include /* TCP_NODELAY, TCP_NOPUSH */ +#include +#include +#include + +#include /* setproctitle() before 4.1 */ +#include +#include + + +#if __FreeBSD_version < 400017 + +/* + * FreeBSD 3.x has no CMSG_SPACE() and CMSG_LEN() and has the broken CMSG_DATA() + */ + +#undef CMSG_SPACE +#define CMSG_SPACE(l) (ALIGN(sizeof(struct cmsghdr)) + ALIGN(l)) + +#undef CMSG_LEN +#define CMSG_LEN(l) (ALIGN(sizeof(struct cmsghdr)) + (l)) + +#undef CMSG_DATA +#define CMSG_DATA(cmsg) ((u_char *)(cmsg) + ALIGN(sizeof(struct cmsghdr))) + +#endif + + +#include + + +#if (NGX_HAVE_POSIX_SEM) +#include +#endif + + +#if (NGX_HAVE_POLL) +#include +#endif + + +#if (NGX_HAVE_KQUEUE) +#include +#endif + + +#if (NGX_HAVE_FILE_AIO || NGX_HAVE_AIO) +#include +typedef struct aiocb ngx_aiocb_t; +#endif + + +#define NGX_LISTEN_BACKLOG -1 + + +#if (__FreeBSD_version < 430000 || __FreeBSD_version < 500012) + +pid_t rfork_thread(int flags, void *stack, int (*func)(void *arg), void *arg); + +#endif + +#ifndef IOV_MAX +#define IOV_MAX 1024 +#endif + + +#ifndef NGX_HAVE_INHERITED_NONBLOCK +#define NGX_HAVE_INHERITED_NONBLOCK 1 +#endif + + +#define NGX_HAVE_OS_SPECIFIC_INIT 1 +#define NGX_HAVE_DEBUG_MALLOC 1 + + +extern char **environ; +extern char *malloc_options; + + +#endif /* _NGX_FREEBSD_CONFIG_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_freebsd_init.c b/release/src/router/nginx/src/os/unix/ngx_freebsd_init.c new file mode 100644 index 0000000000..aeeceaf256 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_freebsd_init.c @@ -0,0 +1,260 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +/* FreeBSD 3.0 at least */ +char ngx_freebsd_kern_ostype[16]; +char ngx_freebsd_kern_osrelease[128]; +int ngx_freebsd_kern_osreldate; +int ngx_freebsd_hw_ncpu; +int ngx_freebsd_kern_ipc_somaxconn; +u_long ngx_freebsd_net_inet_tcp_sendspace; + +/* FreeBSD 4.9 */ +int ngx_freebsd_machdep_hlt_logical_cpus; + + +ngx_uint_t ngx_freebsd_sendfile_nbytes_bug; +ngx_uint_t ngx_freebsd_use_tcp_nopush; + +ngx_uint_t ngx_debug_malloc; + + +static ngx_os_io_t ngx_freebsd_io = { + ngx_unix_recv, + ngx_readv_chain, + ngx_udp_unix_recv, + ngx_unix_send, +#if (NGX_HAVE_SENDFILE) + ngx_freebsd_sendfile_chain, + NGX_IO_SENDFILE +#else + ngx_writev_chain, + 0 +#endif +}; + + +typedef struct { + char *name; + void *value; + size_t size; + ngx_uint_t exists; +} sysctl_t; + + +sysctl_t sysctls[] = { + { "hw.ncpu", + &ngx_freebsd_hw_ncpu, + sizeof(ngx_freebsd_hw_ncpu), 0 }, + + { "machdep.hlt_logical_cpus", + &ngx_freebsd_machdep_hlt_logical_cpus, + sizeof(ngx_freebsd_machdep_hlt_logical_cpus), 0 }, + + { "net.inet.tcp.sendspace", + &ngx_freebsd_net_inet_tcp_sendspace, + sizeof(ngx_freebsd_net_inet_tcp_sendspace), 0 }, + + { "kern.ipc.somaxconn", + &ngx_freebsd_kern_ipc_somaxconn, + sizeof(ngx_freebsd_kern_ipc_somaxconn), 0 }, + + { NULL, NULL, 0, 0 } +}; + + +void +ngx_debug_init() +{ +#if (NGX_DEBUG_MALLOC) + +#if __FreeBSD_version >= 500014 && __FreeBSD_version < 1000011 + _malloc_options = "J"; +#elif __FreeBSD_version < 500014 + malloc_options = "J"; +#endif + + ngx_debug_malloc = 1; + +#else + char *mo; + + mo = getenv("MALLOC_OPTIONS"); + + if (mo && ngx_strchr(mo, 'J')) { + ngx_debug_malloc = 1; + } +#endif +} + + +ngx_int_t +ngx_os_specific_init(ngx_log_t *log) +{ + int version; + size_t size; + ngx_err_t err; + ngx_uint_t i; + + size = sizeof(ngx_freebsd_kern_ostype); + if (sysctlbyname("kern.ostype", + ngx_freebsd_kern_ostype, &size, NULL, 0) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + "sysctlbyname(kern.ostype) failed"); + + if (ngx_errno != NGX_ENOMEM) { + return NGX_ERROR; + } + + ngx_freebsd_kern_ostype[size - 1] = '\0'; + } + + size = sizeof(ngx_freebsd_kern_osrelease); + if (sysctlbyname("kern.osrelease", + ngx_freebsd_kern_osrelease, &size, NULL, 0) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + "sysctlbyname(kern.osrelease) failed"); + + if (ngx_errno != NGX_ENOMEM) { + return NGX_ERROR; + } + + ngx_freebsd_kern_osrelease[size - 1] = '\0'; + } + + + size = sizeof(int); + if (sysctlbyname("kern.osreldate", + &ngx_freebsd_kern_osreldate, &size, NULL, 0) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + "sysctlbyname(kern.osreldate) failed"); + return NGX_ERROR; + } + + version = ngx_freebsd_kern_osreldate; + + +#if (NGX_HAVE_SENDFILE) + + /* + * The determination of the sendfile() "nbytes bug" is complex enough. + * There are two sendfile() syscalls: a new #393 has no bug while + * an old #336 has the bug in some versions and has not in others. + * Besides libc_r wrapper also emulates the bug in some versions. + * There is no way to say exactly if syscall #336 in FreeBSD circa 4.6 + * has the bug. We use the algorithm that is correct at least for + * RELEASEs and for syscalls only (not libc_r wrapper). + * + * 4.6.1-RELEASE and below have the bug + * 4.6.2-RELEASE and above have the new syscall + * + * We detect the new sendfile() syscall available at the compile time + * to allow an old binary to run correctly on an updated FreeBSD system. + */ + +#if (__FreeBSD__ == 4 && __FreeBSD_version >= 460102) \ + || __FreeBSD_version == 460002 || __FreeBSD_version >= 500039 + + /* a new syscall without the bug */ + + ngx_freebsd_sendfile_nbytes_bug = 0; + +#else + + /* an old syscall that may have the bug */ + + ngx_freebsd_sendfile_nbytes_bug = 1; + +#endif + +#endif /* NGX_HAVE_SENDFILE */ + + + if ((version < 500000 && version >= 440003) || version >= 500017) { + ngx_freebsd_use_tcp_nopush = 1; + } + + + for (i = 0; sysctls[i].name; i++) { + size = sysctls[i].size; + + if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0) + == 0) + { + sysctls[i].exists = 1; + continue; + } + + err = ngx_errno; + + if (err == NGX_ENOENT) { + continue; + } + + ngx_log_error(NGX_LOG_ALERT, log, err, + "sysctlbyname(%s) failed", sysctls[i].name); + return NGX_ERROR; + } + + if (ngx_freebsd_machdep_hlt_logical_cpus) { + ngx_ncpu = ngx_freebsd_hw_ncpu / 2; + + } else { + ngx_ncpu = ngx_freebsd_hw_ncpu; + } + + if (version < 600008 && ngx_freebsd_kern_ipc_somaxconn > 32767) { + ngx_log_error(NGX_LOG_ALERT, log, 0, + "sysctl kern.ipc.somaxconn must be less than 32768"); + return NGX_ERROR; + } + + ngx_tcp_nodelay_and_tcp_nopush = 1; + + ngx_os_io = ngx_freebsd_io; + + return NGX_OK; +} + + +void +ngx_os_specific_status(ngx_log_t *log) +{ + u_long value; + ngx_uint_t i; + + ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s", + ngx_freebsd_kern_ostype, ngx_freebsd_kern_osrelease); + +#ifdef __DragonFly_version + ngx_log_error(NGX_LOG_NOTICE, log, 0, + "kern.osreldate: %d, built on %d", + ngx_freebsd_kern_osreldate, __DragonFly_version); +#else + ngx_log_error(NGX_LOG_NOTICE, log, 0, + "kern.osreldate: %d, built on %d", + ngx_freebsd_kern_osreldate, __FreeBSD_version); +#endif + + for (i = 0; sysctls[i].name; i++) { + if (sysctls[i].exists) { + if (sysctls[i].size == sizeof(long)) { + value = *(long *) sysctls[i].value; + + } else { + value = *(int *) sysctls[i].value; + } + + ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l", + sysctls[i].name, value); + } + } +} diff --git a/release/src/router/nginx/src/os/unix/ngx_freebsd_rfork_thread.c b/release/src/router/nginx/src/os/unix/ngx_freebsd_rfork_thread.c new file mode 100644 index 0000000000..530ec4a53b --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_freebsd_rfork_thread.c @@ -0,0 +1,756 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + +/* + * The threads implementation uses the rfork(RFPROC|RFTHREAD|RFMEM) syscall + * to create threads. All threads use the stacks of the same size mmap()ed + * below the main stack. Thus the current thread id is determined via + * the stack pointer value. + * + * The mutex implementation uses the ngx_atomic_cmp_set() operation + * to acquire a mutex and the SysV semaphore to wait on a mutex and to wake up + * the waiting threads. The light mutex does not use semaphore, so after + * spinning in the lock the thread calls sched_yield(). However the light + * mutexes are intended to be used with the "trylock" operation only. + * The SysV semop() is a cheap syscall, particularly if it has little sembuf's + * and does not use SEM_UNDO. + * + * The condition variable implementation uses the signal #64. + * The signal handler is SIG_IGN so the kill() is a cheap syscall. + * The thread waits a signal in kevent(). The use of the EVFILT_SIGNAL + * is safe since FreeBSD 4.10-STABLE. + * + * This threads implementation currently works on i386 (486+) and amd64 + * platforms only. + */ + + +char *ngx_freebsd_kern_usrstack; +size_t ngx_thread_stack_size; + + +static size_t rz_size; +static size_t usable_stack_size; +static char *last_stack; + +static ngx_uint_t nthreads; +static ngx_uint_t max_threads; + +static ngx_uint_t nkeys; +static ngx_tid_t *tids; /* the threads tids array */ +void **ngx_tls; /* the threads tls's array */ + +/* the thread-safe libc errno */ + +static int errno0; /* the main thread's errno */ +static int *errnos; /* the threads errno's array */ + +int * +__error() +{ + int tid; + + tid = ngx_gettid(); + + return tid ? &errnos[tid - 1] : &errno0; +} + + +/* + * __isthreaded enables the spinlocks in some libc functions, i.e. in malloc() + * and some other places. Nevertheless we protect our malloc()/free() calls + * by own mutex that is more efficient than the spinlock. + * + * _spinlock() is a weak referenced stub in src/lib/libc/gen/_spinlock_stub.c + * that does nothing. + */ + +extern int __isthreaded; + +void +_spinlock(ngx_atomic_t *lock) +{ + ngx_int_t tries; + + tries = 0; + + for ( ;; ) { + + if (*lock) { + if (ngx_ncpu > 1 && tries++ < 1000) { + continue; + } + + sched_yield(); + tries = 0; + + } else { + if (ngx_atomic_cmp_set(lock, 0, 1)) { + return; + } + } + } +} + + +/* + * Before FreeBSD 5.1 _spinunlock() is a simple #define in + * src/lib/libc/include/spinlock.h that zeroes lock. + * + * Since FreeBSD 5.1 _spinunlock() is a weak referenced stub in + * src/lib/libc/gen/_spinlock_stub.c that does nothing. + */ + +#ifndef _spinunlock + +void +_spinunlock(ngx_atomic_t *lock) +{ + *lock = 0; +} + +#endif + + +ngx_err_t +ngx_create_thread(ngx_tid_t *tid, ngx_thread_value_t (*func)(void *arg), + void *arg, ngx_log_t *log) +{ + ngx_pid_t id; + ngx_err_t err; + char *stack, *stack_top; + + if (nthreads >= max_threads) { + ngx_log_error(NGX_LOG_CRIT, log, 0, + "no more than %ui threads can be created", max_threads); + return NGX_ERROR; + } + + last_stack -= ngx_thread_stack_size; + + stack = mmap(last_stack, usable_stack_size, PROT_READ|PROT_WRITE, + MAP_STACK, -1, 0); + + if (stack == MAP_FAILED) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + "mmap(%p:%uz, MAP_STACK) thread stack failed", + last_stack, usable_stack_size); + return NGX_ERROR; + } + + if (stack != last_stack) { + ngx_log_error(NGX_LOG_ALERT, log, 0, + "stack %p address was changed to %p", last_stack, stack); + return NGX_ERROR; + } + + stack_top = stack + usable_stack_size; + + ngx_log_debug2(NGX_LOG_DEBUG_CORE, log, 0, + "thread stack: %p-%p", stack, stack_top); + + ngx_set_errno(0); + + id = rfork_thread(RFPROC|RFTHREAD|RFMEM, stack_top, + (ngx_rfork_thread_func_pt) func, arg); + + err = ngx_errno; + + if (id == -1) { + ngx_log_error(NGX_LOG_ALERT, log, err, "rfork() failed"); + + } else { + *tid = id; + nthreads = (ngx_freebsd_kern_usrstack - stack_top) + / ngx_thread_stack_size; + tids[nthreads] = id; + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "rfork()ed thread: %P", id); + } + + return err; +} + + +ngx_int_t +ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle) +{ + char *red_zone, *zone; + size_t len; + ngx_int_t i; + struct sigaction sa; + + max_threads = n + 1; + + for (i = 0; i < n; i++) { + ngx_memzero(&sa, sizeof(struct sigaction)); + sa.sa_handler = SIG_IGN; + sigemptyset(&sa.sa_mask); + if (sigaction(NGX_CV_SIGNAL, &sa, NULL) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "sigaction(%d, SIG_IGN) failed", NGX_CV_SIGNAL); + return NGX_ERROR; + } + } + + len = sizeof(ngx_freebsd_kern_usrstack); + if (sysctlbyname("kern.usrstack", &ngx_freebsd_kern_usrstack, &len, + NULL, 0) == -1) + { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "sysctlbyname(kern.usrstack) failed"); + return NGX_ERROR; + } + + /* the main thread stack red zone */ + rz_size = ngx_pagesize; + red_zone = ngx_freebsd_kern_usrstack - (size + rz_size); + + ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "usrstack: %p red zone: %p", + ngx_freebsd_kern_usrstack, red_zone); + + zone = mmap(red_zone, rz_size, PROT_NONE, MAP_ANON, -1, 0); + if (zone == MAP_FAILED) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "mmap(%p:%uz, PROT_NONE, MAP_ANON) red zone failed", + red_zone, rz_size); + return NGX_ERROR; + } + + if (zone != red_zone) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, + "red zone %p address was changed to %p", red_zone, zone); + return NGX_ERROR; + } + + /* create the thread errno' array */ + + errnos = ngx_calloc(n * sizeof(int), cycle->log); + if (errnos == NULL) { + return NGX_ERROR; + } + + /* create the thread tids array */ + + tids = ngx_calloc((n + 1) * sizeof(ngx_tid_t), cycle->log); + if (tids == NULL) { + return NGX_ERROR; + } + + tids[0] = ngx_pid; + + /* create the thread tls' array */ + + ngx_tls = ngx_calloc(NGX_THREAD_KEYS_MAX * (n + 1) * sizeof(void *), + cycle->log); + if (ngx_tls == NULL) { + return NGX_ERROR; + } + + nthreads = 1; + + last_stack = zone + rz_size; + usable_stack_size = size; + ngx_thread_stack_size = size + rz_size; + + /* allow the spinlock in libc malloc() */ + __isthreaded = 1; + + ngx_threaded = 1; + + return NGX_OK; +} + + +ngx_tid_t +ngx_thread_self() +{ + ngx_int_t tid; + + tid = ngx_gettid(); + + if (tids == NULL) { + return ngx_pid; + } + + return tids[tid]; +} + + +ngx_err_t +ngx_thread_key_create(ngx_tls_key_t *key) +{ + if (nkeys >= NGX_THREAD_KEYS_MAX) { + return NGX_ENOMEM; + } + + *key = nkeys++; + + return 0; +} + + +ngx_err_t +ngx_thread_set_tls(ngx_tls_key_t key, void *value) +{ + if (key >= NGX_THREAD_KEYS_MAX) { + return NGX_EINVAL; + } + + ngx_tls[key * NGX_THREAD_KEYS_MAX + ngx_gettid()] = value; + return 0; +} + + +ngx_mutex_t * +ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags) +{ + ngx_mutex_t *m; + union semun op; + + m = ngx_alloc(sizeof(ngx_mutex_t), log); + if (m == NULL) { + return NULL; + } + + m->lock = 0; + m->log = log; + + if (flags & NGX_MUTEX_LIGHT) { + m->semid = -1; + return m; + } + + m->semid = semget(IPC_PRIVATE, 1, SEM_R|SEM_A); + if (m->semid == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semget() failed"); + return NULL; + } + + op.val = 0; + + if (semctl(m->semid, 0, SETVAL, op) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semctl(SETVAL) failed"); + + if (semctl(m->semid, 0, IPC_RMID) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + "semctl(IPC_RMID) failed"); + } + + return NULL; + } + + return m; +} + + +void +ngx_mutex_destroy(ngx_mutex_t *m) +{ + if (semctl(m->semid, 0, IPC_RMID) == -1) { + ngx_log_error(NGX_LOG_ALERT, m->log, ngx_errno, + "semctl(IPC_RMID) failed"); + } + + ngx_free((void *) m); +} + + +ngx_int_t +ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try) +{ + uint32_t lock, old; + ngx_uint_t tries; + struct sembuf op; + + if (!ngx_threaded) { + return NGX_OK; + } + +#if (NGX_DEBUG) + if (try) { + ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, + "try lock mutex %p lock:%XD", m, m->lock); + } else { + ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, + "lock mutex %p lock:%XD", m, m->lock); + } +#endif + + old = m->lock; + tries = 0; + + for ( ;; ) { + if (old & NGX_MUTEX_LOCK_BUSY) { + + if (try) { + return NGX_AGAIN; + } + + if (ngx_ncpu > 1 && tries++ < 1000) { + + /* the spinlock is used only on the SMP system */ + + old = m->lock; + continue; + } + + if (m->semid == -1) { + sched_yield(); + + tries = 0; + old = m->lock; + continue; + } + + ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, + "mutex %p lock:%XD", m, m->lock); + + /* + * The mutex is locked so we increase a number + * of the threads that are waiting on the mutex + */ + + lock = old + 1; + + if ((lock & ~NGX_MUTEX_LOCK_BUSY) > nthreads) { + ngx_log_error(NGX_LOG_ALERT, m->log, ngx_errno, + "%D threads wait for mutex %p, " + "while only %ui threads are available", + lock & ~NGX_MUTEX_LOCK_BUSY, m, nthreads); + ngx_abort(); + } + + if (ngx_atomic_cmp_set(&m->lock, old, lock)) { + + ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, + "wait mutex %p lock:%XD", m, m->lock); + + /* + * The number of the waiting threads has been increased + * and we would wait on the SysV semaphore. + * A semaphore should wake up us more efficiently than + * a simple sched_yield() or usleep(). + */ + + op.sem_num = 0; + op.sem_op = -1; + op.sem_flg = 0; + + if (semop(m->semid, &op, 1) == -1) { + ngx_log_error(NGX_LOG_ALERT, m->log, ngx_errno, + "semop() failed while waiting on mutex %p", m); + ngx_abort(); + } + + ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, + "mutex waked up %p lock:%XD", m, m->lock); + + tries = 0; + old = m->lock; + continue; + } + + old = m->lock; + + } else { + lock = old | NGX_MUTEX_LOCK_BUSY; + + if (ngx_atomic_cmp_set(&m->lock, old, lock)) { + + /* we locked the mutex */ + + break; + } + + old = m->lock; + } + + if (tries++ > 1000) { + + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, + "mutex %p is contested", m); + + /* the mutex is probably contested so we are giving up now */ + + sched_yield(); + + tries = 0; + old = m->lock; + } + } + + ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, + "mutex %p is locked, lock:%XD", m, m->lock); + + return NGX_OK; +} + + +void +ngx_mutex_unlock(ngx_mutex_t *m) +{ + uint32_t lock, old; + struct sembuf op; + + if (!ngx_threaded) { + return; + } + + old = m->lock; + + if (!(old & NGX_MUTEX_LOCK_BUSY)) { + ngx_log_error(NGX_LOG_ALERT, m->log, 0, + "trying to unlock the free mutex %p", m); + ngx_abort(); + } + + /* free the mutex */ + +#if 0 + ngx_log_debug2(NGX_LOG_DEBUG_MUTEX, m->log, 0, + "unlock mutex %p lock:%XD", m, old); +#endif + + for ( ;; ) { + lock = old & ~NGX_MUTEX_LOCK_BUSY; + + if (ngx_atomic_cmp_set(&m->lock, old, lock)) { + break; + } + + old = m->lock; + } + + if (m->semid == -1) { + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, + "mutex %p is unlocked", m); + + return; + } + + /* check whether we need to wake up a waiting thread */ + + old = m->lock; + + for ( ;; ) { + if (old & NGX_MUTEX_LOCK_BUSY) { + + /* the mutex is just locked by another thread */ + + break; + } + + if (old == 0) { + break; + } + + /* there are the waiting threads */ + + lock = old - 1; + + if (ngx_atomic_cmp_set(&m->lock, old, lock)) { + + /* wake up the thread that waits on semaphore */ + + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, + "wake up mutex %p", m); + + op.sem_num = 0; + op.sem_op = 1; + op.sem_flg = 0; + + if (semop(m->semid, &op, 1) == -1) { + ngx_log_error(NGX_LOG_ALERT, m->log, ngx_errno, + "semop() failed while waking up on mutex %p", m); + ngx_abort(); + } + + break; + } + + old = m->lock; + } + + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, + "mutex %p is unlocked", m); + + return; +} + + +ngx_cond_t * +ngx_cond_init(ngx_log_t *log) +{ + ngx_cond_t *cv; + + cv = ngx_alloc(sizeof(ngx_cond_t), log); + if (cv == NULL) { + return NULL; + } + + cv->signo = NGX_CV_SIGNAL; + cv->tid = -1; + cv->log = log; + cv->kq = -1; + + return cv; +} + + +void +ngx_cond_destroy(ngx_cond_t *cv) +{ + if (close(cv->kq) == -1) { + ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno, + "kqueue close() failed"); + } + + ngx_free(cv); +} + + +ngx_int_t +ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m) +{ + int n; + ngx_err_t err; + struct kevent kev; + struct timespec ts; + + if (cv->kq == -1) { + + /* + * We have to add the EVFILT_SIGNAL filter in the rfork()ed thread. + * Otherwise the thread would not get a signal event. + * + * However, we have not to open the kqueue in the thread, + * it is simply handy do it together. + */ + + cv->kq = kqueue(); + if (cv->kq == -1) { + ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno, "kqueue() failed"); + return NGX_ERROR; + } + + ngx_log_debug2(NGX_LOG_DEBUG_CORE, cv->log, 0, + "cv kq:%d signo:%d", cv->kq, cv->signo); + + kev.ident = cv->signo; + kev.filter = EVFILT_SIGNAL; + kev.flags = EV_ADD; + kev.fflags = 0; + kev.data = 0; + kev.udata = NULL; + + ts.tv_sec = 0; + ts.tv_nsec = 0; + + if (kevent(cv->kq, &kev, 1, NULL, 0, &ts) == -1) { + ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno, "kevent() failed"); + return NGX_ERROR; + } + + cv->tid = ngx_thread_self(); + } + + ngx_mutex_unlock(m); + + ngx_log_debug3(NGX_LOG_DEBUG_CORE, cv->log, 0, + "cv %p wait, kq:%d, signo:%d", cv, cv->kq, cv->signo); + + for ( ;; ) { + n = kevent(cv->kq, NULL, 0, &kev, 1, NULL); + + ngx_log_debug2(NGX_LOG_DEBUG_CORE, cv->log, 0, + "cv %p kevent: %d", cv, n); + + if (n == -1) { + err = ngx_errno; + ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, + cv->log, ngx_errno, + "kevent() failed while waiting condition variable %p", + cv); + + if (err == NGX_EINTR) { + break; + } + + return NGX_ERROR; + } + + if (n == 0) { + ngx_log_error(NGX_LOG_ALERT, cv->log, 0, + "kevent() returned no events " + "while waiting condition variable %p", + cv); + continue; + } + + if (kev.filter != EVFILT_SIGNAL) { + ngx_log_error(NGX_LOG_ALERT, cv->log, 0, + "kevent() returned unexpected events: %d " + "while waiting condition variable %p", + kev.filter, cv); + continue; + } + + if (kev.ident != (uintptr_t) cv->signo) { + ngx_log_error(NGX_LOG_ALERT, cv->log, 0, + "kevent() returned unexpected signal: %d ", + "while waiting condition variable %p", + kev.ident, cv); + continue; + } + + break; + } + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p is waked up", cv); + + ngx_mutex_lock(m); + + return NGX_OK; +} + + +ngx_int_t +ngx_cond_signal(ngx_cond_t *cv) +{ + ngx_err_t err; + + ngx_log_debug3(NGX_LOG_DEBUG_CORE, cv->log, 0, + "cv %p to signal %P %d", + cv, cv->tid, cv->signo); + + if (cv->tid == -1) { + return NGX_OK; + } + + if (kill(cv->tid, cv->signo) == -1) { + + err = ngx_errno; + + ngx_log_error(NGX_LOG_ALERT, cv->log, err, + "kill() failed while signaling condition variable %p", cv); + + if (err == NGX_ESRCH) { + cv->tid = -1; + } + + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p is signaled", cv); + + return NGX_OK; +} diff --git a/release/src/router/nginx/src/os/unix/ngx_freebsd_rfork_thread.h b/release/src/router/nginx/src/os/unix/ngx_freebsd_rfork_thread.h new file mode 100644 index 0000000000..2c238f79ca --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_freebsd_rfork_thread.h @@ -0,0 +1,122 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_FREEBSD_RFORK_THREAD_H_INCLUDED_ +#define _NGX_FREEBSD_RFORK_THREAD_H_INCLUDED_ + + +#include +#include +#include + +typedef pid_t ngx_tid_t; + +#define ngx_log_pid ngx_thread_self() +#define ngx_log_tid 0 + +#define NGX_TID_T_FMT "%P" + + +#define NGX_MUTEX_LIGHT 1 + +#define NGX_MUTEX_LOCK_BUSY 0x80000000 + +typedef volatile struct { + ngx_atomic_t lock; + ngx_log_t *log; + int semid; +} ngx_mutex_t; + + +#define NGX_CV_SIGNAL 64 + +typedef struct { + int signo; + int kq; + ngx_tid_t tid; + ngx_log_t *log; +} ngx_cond_t; + + +#define ngx_thread_sigmask(how, set, oset) \ + (sigprocmask(how, set, oset) == -1) ? ngx_errno : 0 + +#define ngx_thread_sigmask_n "sigprocmask()" + +#define ngx_thread_join(t, p) + +#define ngx_setthrtitle(n) setproctitle(n) + + +extern char *ngx_freebsd_kern_usrstack; +extern size_t ngx_thread_stack_size; + + +static ngx_inline ngx_int_t +ngx_gettid() +{ + char *sp; + + if (ngx_thread_stack_size == 0) { + return 0; + } + +#if ( __i386__ ) + + __asm__ volatile ("mov %%esp, %0" : "=q" (sp)); + +#elif ( __amd64__ ) + + __asm__ volatile ("mov %%rsp, %0" : "=q" (sp)); + +#else + +#error "rfork()ed threads are not supported on this platform" + +#endif + + return (ngx_freebsd_kern_usrstack - sp) / ngx_thread_stack_size; +} + + +ngx_tid_t ngx_thread_self(); + + +typedef ngx_uint_t ngx_tls_key_t; + +#define NGX_THREAD_KEYS_MAX 16 + +extern void **ngx_tls; + +ngx_err_t ngx_thread_key_create(ngx_tls_key_t *key); +#define ngx_thread_key_create_n "the tls key creation" + +ngx_err_t ngx_thread_set_tls(ngx_tls_key_t key, void *value); +#define ngx_thread_set_tls_n "the tls key setting" + + +static void * +ngx_thread_get_tls(ngx_tls_key_t key) +{ + if (key >= NGX_THREAD_KEYS_MAX) { + return NULL; + } + + return ngx_tls[key * NGX_THREAD_KEYS_MAX + ngx_gettid()]; +} + + +#define ngx_mutex_trylock(m) ngx_mutex_dolock(m, 1) +#define ngx_mutex_lock(m) (void) ngx_mutex_dolock(m, 0) +ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try); +void ngx_mutex_unlock(ngx_mutex_t *m); + + +typedef int (*ngx_rfork_thread_func_pt)(void *arg); + + +#endif /* _NGX_FREEBSD_RFORK_THREAD_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_freebsd_sendfile_chain.c b/release/src/router/nginx/src/os/unix/ngx_freebsd_sendfile_chain.c new file mode 100644 index 0000000000..f58b5c20fe --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_freebsd_sendfile_chain.c @@ -0,0 +1,442 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +/* + * Although FreeBSD sendfile() allows to pass a header and a trailer, + * it cannot send a header with a part of the file in one packet until + * FreeBSD 5.3. Besides, over the fast ethernet connection sendfile() + * may send the partially filled packets, i.e. the 8 file pages may be sent + * as the 11 full 1460-bytes packets, then one incomplete 324-bytes packet, + * and then again the 11 full 1460-bytes packets. + * + * Therefore we use the TCP_NOPUSH option (similar to Linux's TCP_CORK) + * to postpone the sending - it not only sends a header and the first part of + * the file in one packet, but also sends the file pages in the full packets. + * + * But until FreeBSD 4.5 turning TCP_NOPUSH off does not flush a pending + * data that less than MSS, so that data may be sent with 5 second delay. + * So we do not use TCP_NOPUSH on FreeBSD prior to 4.5, although it can be used + * for non-keepalive HTTP connections. + */ + + +#if (IOV_MAX > 64) +#define NGX_HEADERS 64 +#define NGX_TRAILERS 64 +#else +#define NGX_HEADERS IOV_MAX +#define NGX_TRAILERS IOV_MAX +#endif + + +ngx_chain_t * +ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) +{ + int rc, flags; + u_char *prev; + off_t size, send, prev_send, aligned, sent, fprev; + size_t header_size, file_size; + ngx_uint_t eintr, eagain, complete; + ngx_err_t err; + ngx_buf_t *file; + ngx_array_t header, trailer; + ngx_event_t *wev; + ngx_chain_t *cl; + struct sf_hdtr hdtr; + struct iovec *iov, headers[NGX_HEADERS], trailers[NGX_TRAILERS]; + + wev = c->write; + + if (!wev->ready) { + return in; + } + +#if (NGX_HAVE_KQUEUE) + + if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) { + (void) ngx_connection_error(c, wev->kq_errno, + "kevent() reported about an closed connection"); + wev->error = 1; + return NGX_CHAIN_ERROR; + } + +#endif + + /* the maximum limit size is the maximum size_t value - the page size */ + + if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { + limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; + } + + send = 0; + eagain = 0; + flags = 0; + + header.elts = headers; + header.size = sizeof(struct iovec); + header.nalloc = NGX_HEADERS; + header.pool = c->pool; + + trailer.elts = trailers; + trailer.size = sizeof(struct iovec); + trailer.nalloc = NGX_TRAILERS; + trailer.pool = c->pool; + + for ( ;; ) { + file = NULL; + file_size = 0; + header_size = 0; + eintr = 0; + complete = 0; + prev_send = send; + + header.nelts = 0; + trailer.nelts = 0; + + /* create the header iovec and coalesce the neighbouring bufs */ + + prev = NULL; + iov = NULL; + + for (cl = in; cl && send < limit; cl = cl->next) { + + if (ngx_buf_special(cl->buf)) { + continue; + } + + if (!ngx_buf_in_memory_only(cl->buf)) { + break; + } + + size = cl->buf->last - cl->buf->pos; + + if (send + size > limit) { + size = limit - send; + } + + if (prev == cl->buf->pos) { + iov->iov_len += (size_t) size; + + } else { + if (header.nelts >= IOV_MAX){ + break; + } + + iov = ngx_array_push(&header); + if (iov == NULL) { + return NGX_CHAIN_ERROR; + } + + iov->iov_base = (void *) cl->buf->pos; + iov->iov_len = (size_t) size; + } + + prev = cl->buf->pos + (size_t) size; + header_size += (size_t) size; + send += size; + } + + + if (cl && cl->buf->in_file && send < limit) { + file = cl->buf; + + /* coalesce the neighbouring file bufs */ + + do { + size = cl->buf->file_last - cl->buf->file_pos; + + if (send + size > limit) { + size = limit - send; + + aligned = (cl->buf->file_pos + size + ngx_pagesize - 1) + & ~((off_t) ngx_pagesize - 1); + + if (aligned <= cl->buf->file_last) { + size = aligned - cl->buf->file_pos; + } + } + + file_size += (size_t) size; + send += size; + fprev = cl->buf->file_pos + size; + cl = cl->next; + + } while (cl + && cl->buf->in_file + && send < limit + && file->file->fd == cl->buf->file->fd + && fprev == cl->buf->file_pos); + } + + + if (file) { + + /* create the trailer iovec and coalesce the neighbouring bufs */ + + prev = NULL; + iov = NULL; + + while (cl && send < limit) { + + if (ngx_buf_special(cl->buf)) { + cl = cl->next; + continue; + } + + if (!ngx_buf_in_memory_only(cl->buf)) { + break; + } + + size = cl->buf->last - cl->buf->pos; + + if (send + size > limit) { + size = limit - send; + } + + if (prev == cl->buf->pos) { + iov->iov_len += (size_t) size; + + } else { + if (trailer.nelts >= IOV_MAX){ + break; + } + + iov = ngx_array_push(&trailer); + if (iov == NULL) { + return NGX_CHAIN_ERROR; + } + + iov->iov_base = (void *) cl->buf->pos; + iov->iov_len = (size_t) size; + } + + prev = cl->buf->pos + (size_t) size; + send += size; + cl = cl->next; + } + } + + if (file) { + + if (ngx_freebsd_use_tcp_nopush + && c->tcp_nopush == NGX_TCP_NOPUSH_UNSET) + { + if (ngx_tcp_nopush(c->fd) == NGX_ERROR) { + err = ngx_errno; + + /* + * there is a tiny chance to be interrupted, however, + * we continue a processing without the TCP_NOPUSH + */ + + if (err != NGX_EINTR) { + wev->error = 1; + (void) ngx_connection_error(c, err, + ngx_tcp_nopush_n " failed"); + return NGX_CHAIN_ERROR; + } + + } else { + c->tcp_nopush = NGX_TCP_NOPUSH_SET; + + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, + "tcp_nopush"); + } + } + + /* + * sendfile() does unneeded work if sf_hdtr's count is 0, + * but corresponding pointer is not NULL + */ + + hdtr.headers = header.nelts ? (struct iovec *) header.elts: NULL; + hdtr.hdr_cnt = header.nelts; + hdtr.trailers = trailer.nelts ? (struct iovec *) trailer.elts: NULL; + hdtr.trl_cnt = trailer.nelts; + + /* + * the "nbytes bug" of the old sendfile() syscall: + * http://www.freebsd.org/cgi/query-pr.cgi?pr=33771 + */ + + if (!ngx_freebsd_sendfile_nbytes_bug) { + header_size = 0; + } + + sent = 0; + +#if (NGX_HAVE_AIO_SENDFILE) + flags = c->aio_sendfile ? SF_NODISKIO : 0; +#endif + + rc = sendfile(file->file->fd, c->fd, file->file_pos, + file_size + header_size, &hdtr, &sent, flags); + + if (rc == -1) { + err = ngx_errno; + + switch (err) { + case NGX_EAGAIN: + eagain = 1; + break; + + case NGX_EINTR: + eintr = 1; + break; + +#if (NGX_HAVE_AIO_SENDFILE) + case NGX_EBUSY: + c->busy_sendfile = file; + break; +#endif + + default: + wev->error = 1; + (void) ngx_connection_error(c, err, "sendfile() failed"); + return NGX_CHAIN_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, + "sendfile() sent only %O bytes", sent); + + /* + * sendfile() in FreeBSD 3.x-4.x may return value >= 0 + * on success, although only 0 is documented + */ + + } else if (rc >= 0 && sent == 0) { + + /* + * if rc is OK and sent equal to zero, then someone + * has truncated the file, so the offset became beyond + * the end of the file + */ + + ngx_log_error(NGX_LOG_ALERT, c->log, 0, + "sendfile() reported that \"%s\" was truncated at %O", + file->file->name.data, file->file_pos); + + return NGX_CHAIN_ERROR; + } + + ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, + "sendfile: %d, @%O %O:%uz", + rc, file->file_pos, sent, file_size + header_size); + + } else { + rc = writev(c->fd, header.elts, header.nelts); + + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, + "writev: %d of %uz", rc, header_size); + + if (rc == -1) { + err = ngx_errno; + + switch (err) { + case NGX_EAGAIN: + break; + + case NGX_EINTR: + eintr = 1; + break; + + default: + wev->error = 1; + ngx_connection_error(c, err, "writev() failed"); + return NGX_CHAIN_ERROR; + } + + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "writev() not ready"); + } + + sent = rc > 0 ? rc : 0; + } + + if (send - prev_send == sent) { + complete = 1; + } + + c->sent += sent; + + for (cl = in; cl; cl = cl->next) { + + if (ngx_buf_special(cl->buf)) { + continue; + } + + if (sent == 0) { + break; + } + + size = ngx_buf_size(cl->buf); + + if (sent >= size) { + sent -= size; + + if (ngx_buf_in_memory(cl->buf)) { + cl->buf->pos = cl->buf->last; + } + + if (cl->buf->in_file) { + cl->buf->file_pos = cl->buf->file_last; + } + + continue; + } + + if (ngx_buf_in_memory(cl->buf)) { + cl->buf->pos += (size_t) sent; + } + + if (cl->buf->in_file) { + cl->buf->file_pos += sent; + } + + break; + } + +#if (NGX_HAVE_AIO_SENDFILE) + if (c->busy_sendfile) { + return cl; + } +#endif + + if (eagain) { + + /* + * sendfile() may return EAGAIN, even if it has sent a whole file + * part, it indicates that the successive sendfile() call would + * return EAGAIN right away and would not send anything. + * We use it as a hint. + */ + + wev->ready = 0; + return cl; + } + + if (eintr) { + continue; + } + + if (!complete) { + wev->ready = 0; + return cl; + } + + if (send >= limit || cl == NULL) { + return cl; + } + + in = cl; + } +} diff --git a/release/src/router/nginx/src/os/unix/ngx_gcc_atomic_amd64.h b/release/src/router/nginx/src/os/unix/ngx_gcc_atomic_amd64.h new file mode 100644 index 0000000000..159a297427 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_gcc_atomic_amd64.h @@ -0,0 +1,82 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#if (NGX_SMP) +#define NGX_SMP_LOCK "lock;" +#else +#define NGX_SMP_LOCK +#endif + + +/* + * "cmpxchgq r, [m]": + * + * if (rax == [m]) { + * zf = 1; + * [m] = r; + * } else { + * zf = 0; + * rax = [m]; + * } + * + * + * The "r" is any register, %rax (%r0) - %r16. + * The "=a" and "a" are the %rax register. + * Although we can return result in any register, we use "a" because it is + * used in cmpxchgq anyway. The result is actually in %al but not in $rax, + * however as the code is inlined gcc can test %al as well as %rax. + * + * The "cc" means that flags were changed. + */ + +static ngx_inline ngx_atomic_uint_t +ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, + ngx_atomic_uint_t set) +{ + u_char res; + + __asm__ volatile ( + + NGX_SMP_LOCK + " cmpxchgq %3, %1; " + " sete %0; " + + : "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory"); + + return res; +} + + +/* + * "xaddq r, [m]": + * + * temp = [m]; + * [m] += r; + * r = temp; + * + * + * The "+r" is any register, %rax (%r0) - %r16. + * The "cc" means that flags were changed. + */ + +static ngx_inline ngx_atomic_int_t +ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) +{ + __asm__ volatile ( + + NGX_SMP_LOCK + " xaddq %0, %1; " + + : "+r" (add) : "m" (*value) : "cc", "memory"); + + return add; +} + + +#define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") + +#define ngx_cpu_pause() __asm__ ("pause") diff --git a/release/src/router/nginx/src/os/unix/ngx_gcc_atomic_ppc.h b/release/src/router/nginx/src/os/unix/ngx_gcc_atomic_ppc.h new file mode 100644 index 0000000000..45afc4b9ea --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_gcc_atomic_ppc.h @@ -0,0 +1,155 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +/* + * The ppc assembler treats ";" as comment, so we have to use "\n". + * The minus in "bne-" is a hint for the branch prediction unit that + * this branch is unlikely to be taken. + * The "1b" means the nearest backward label "1" and the "1f" means + * the nearest forward label "1". + * + * The "b" means that the base registers can be used only, i.e. + * any register except r0. The r0 register always has a zero value and + * could not be used in "addi r0, r0, 1". + * The "=&b" means that no input registers can be used. + * + * "sync" read and write barriers + * "isync" read barrier, is faster than "sync" + * "eieio" write barrier, is faster than "sync" + * "lwsync" write barrier, is faster than "eieio" on ppc64 + */ + +#if (NGX_PTR_SIZE == 8) + +static ngx_inline ngx_atomic_uint_t +ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, + ngx_atomic_uint_t set) +{ + ngx_atomic_uint_t res, temp; + + __asm__ volatile ( + + " li %0, 0 \n" /* preset "0" to "res" */ + " lwsync \n" /* write barrier */ + "1: \n" + " ldarx %1, 0, %2 \n" /* load from [lock] into "temp" */ + /* and store reservation */ + " cmpd %1, %3 \n" /* compare "temp" and "old" */ + " bne- 2f \n" /* not equal */ + " stdcx. %4, 0, %2 \n" /* store "set" into [lock] if reservation */ + /* is not cleared */ + " bne- 1b \n" /* the reservation was cleared */ + " isync \n" /* read barrier */ + " li %0, 1 \n" /* set "1" to "res" */ + "2: \n" + + : "=&b" (res), "=&b" (temp) + : "b" (lock), "b" (old), "b" (set) + : "cc", "memory"); + + return res; +} + + +static ngx_inline ngx_atomic_int_t +ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) +{ + ngx_atomic_uint_t res, temp; + + __asm__ volatile ( + + " lwsync \n" /* write barrier */ + "1: ldarx %0, 0, %2 \n" /* load from [value] into "res" */ + /* and store reservation */ + " add %1, %0, %3 \n" /* "res" + "add" store in "temp" */ + " stdcx. %1, 0, %2 \n" /* store "temp" into [value] if reservation */ + /* is not cleared */ + " bne- 1b \n" /* try again if reservation was cleared */ + " isync \n" /* read barrier */ + + : "=&b" (res), "=&b" (temp) + : "b" (value), "b" (add) + : "cc", "memory"); + + return res; +} + + +#if (NGX_SMP) +#define ngx_memory_barrier() \ + __asm__ volatile ("isync \n lwsync \n" ::: "memory") +#else +#define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") +#endif + +#else + +static ngx_inline ngx_atomic_uint_t +ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, + ngx_atomic_uint_t set) +{ + ngx_atomic_uint_t res, temp; + + __asm__ volatile ( + + " li %0, 0 \n" /* preset "0" to "res" */ + " eieio \n" /* write barrier */ + "1: \n" + " lwarx %1, 0, %2 \n" /* load from [lock] into "temp" */ + /* and store reservation */ + " cmpw %1, %3 \n" /* compare "temp" and "old" */ + " bne- 2f \n" /* not equal */ + " stwcx. %4, 0, %2 \n" /* store "set" into [lock] if reservation */ + /* is not cleared */ + " bne- 1b \n" /* the reservation was cleared */ + " isync \n" /* read barrier */ + " li %0, 1 \n" /* set "1" to "res" */ + "2: \n" + + : "=&b" (res), "=&b" (temp) + : "b" (lock), "b" (old), "b" (set) + : "cc", "memory"); + + return res; +} + + +static ngx_inline ngx_atomic_int_t +ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) +{ + ngx_atomic_uint_t res, temp; + + __asm__ volatile ( + + " eieio \n" /* write barrier */ + "1: lwarx %0, 0, %2 \n" /* load from [value] into "res" */ + /* and store reservation */ + " add %1, %0, %3 \n" /* "res" + "add" store in "temp" */ + " stwcx. %1, 0, %2 \n" /* store "temp" into [value] if reservation */ + /* is not cleared */ + " bne- 1b \n" /* try again if reservation was cleared */ + " isync \n" /* read barrier */ + + : "=&b" (res), "=&b" (temp) + : "b" (value), "b" (add) + : "cc", "memory"); + + return res; +} + + +#if (NGX_SMP) +#define ngx_memory_barrier() \ + __asm__ volatile ("isync \n eieio \n" ::: "memory") +#else +#define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") +#endif + +#endif + + +#define ngx_cpu_pause() diff --git a/release/src/router/nginx/src/os/unix/ngx_gcc_atomic_sparc64.h b/release/src/router/nginx/src/os/unix/ngx_gcc_atomic_sparc64.h new file mode 100644 index 0000000000..a84db35448 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_gcc_atomic_sparc64.h @@ -0,0 +1,82 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +/* + * "casa [r1] 0x80, r2, r0" and + * "casxa [r1] 0x80, r2, r0" do the following: + * + * if ([r1] == r2) { + * swap(r0, [r1]); + * } else { + * r0 = [r1]; + * } + * + * so "r0 == r2" means that the operation was successful. + * + * + * The "r" means the general register. + * The "+r" means the general register used for both input and output. + */ + + +#if (NGX_PTR_SIZE == 4) +#define NGX_CASA "casa" +#else +#define NGX_CASA "casxa" +#endif + + +static ngx_inline ngx_atomic_uint_t +ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, + ngx_atomic_uint_t set) +{ + __asm__ volatile ( + + NGX_CASA " [%1] 0x80, %2, %0" + + : "+r" (set) : "r" (lock), "r" (old) : "memory"); + + return (set == old); +} + + +static ngx_inline ngx_atomic_int_t +ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) +{ + ngx_atomic_uint_t old, res; + + old = *value; + + for ( ;; ) { + + res = old + add; + + __asm__ volatile ( + + NGX_CASA " [%1] 0x80, %2, %0" + + : "+r" (res) : "r" (value), "r" (old) : "memory"); + + if (res == old) { + return res; + } + + old = res; + } +} + + +#if (NGX_SMP) +#define ngx_memory_barrier() \ + __asm__ volatile ( \ + "membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" \ + ::: "memory") +#else +#define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") +#endif + +#define ngx_cpu_pause() diff --git a/release/src/router/nginx/src/os/unix/ngx_gcc_atomic_x86.h b/release/src/router/nginx/src/os/unix/ngx_gcc_atomic_x86.h new file mode 100644 index 0000000000..54e01aebf0 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_gcc_atomic_x86.h @@ -0,0 +1,127 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#if (NGX_SMP) +#define NGX_SMP_LOCK "lock;" +#else +#define NGX_SMP_LOCK +#endif + + +/* + * "cmpxchgl r, [m]": + * + * if (eax == [m]) { + * zf = 1; + * [m] = r; + * } else { + * zf = 0; + * eax = [m]; + * } + * + * + * The "r" means the general register. + * The "=a" and "a" are the %eax register. + * Although we can return result in any register, we use "a" because it is + * used in cmpxchgl anyway. The result is actually in %al but not in %eax, + * however, as the code is inlined gcc can test %al as well as %eax, + * and icc adds "movzbl %al, %eax" by itself. + * + * The "cc" means that flags were changed. + */ + +static ngx_inline ngx_atomic_uint_t +ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, + ngx_atomic_uint_t set) +{ + u_char res; + + __asm__ volatile ( + + NGX_SMP_LOCK + " cmpxchgl %3, %1; " + " sete %0; " + + : "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory"); + + return res; +} + + +/* + * "xaddl r, [m]": + * + * temp = [m]; + * [m] += r; + * r = temp; + * + * + * The "+r" means the general register. + * The "cc" means that flags were changed. + */ + + +#if !(( __GNUC__ == 2 && __GNUC_MINOR__ <= 7 ) || ( __INTEL_COMPILER >= 800 )) + +/* + * icc 8.1 and 9.0 compile broken code with -march=pentium4 option: + * ngx_atomic_fetch_add() always return the input "add" value, + * so we use the gcc 2.7 version. + * + * icc 8.1 and 9.0 with -march=pentiumpro option or icc 7.1 compile + * correct code. + */ + +static ngx_inline ngx_atomic_int_t +ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) +{ + __asm__ volatile ( + + NGX_SMP_LOCK + " xaddl %0, %1; " + + : "+r" (add) : "m" (*value) : "cc", "memory"); + + return add; +} + + +#else + +/* + * gcc 2.7 does not support "+r", so we have to use the fixed + * %eax ("=a" and "a") and this adds two superfluous instructions in the end + * of code, something like this: "mov %eax, %edx / mov %edx, %eax". + */ + +static ngx_inline ngx_atomic_int_t +ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) +{ + ngx_atomic_uint_t old; + + __asm__ volatile ( + + NGX_SMP_LOCK + " xaddl %2, %1; " + + : "=a" (old) : "m" (*value), "a" (add) : "cc", "memory"); + + return old; +} + +#endif + + +/* + * on x86 the write operations go in a program order, so we need only + * to disable the gcc reorder optimizations + */ + +#define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") + +/* old "as" does not support "pause" opcode */ +#define ngx_cpu_pause() __asm__ (".byte 0xf3, 0x90") diff --git a/release/src/router/nginx/src/os/unix/ngx_linux.h b/release/src/router/nginx/src/os/unix/ngx_linux.h new file mode 100644 index 0000000000..1b8bdac51a --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_linux.h @@ -0,0 +1,18 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_LINUX_H_INCLUDED_ +#define _NGX_LINUX_H_INCLUDED_ + + +ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, + off_t limit); + +extern int ngx_linux_rtsig_max; + + +#endif /* _NGX_LINUX_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_linux_aio_read.c b/release/src/router/nginx/src/os/unix/ngx_linux_aio_read.c new file mode 100644 index 0000000000..8273c13f96 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_linux_aio_read.c @@ -0,0 +1,137 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +extern int ngx_eventfd; +extern aio_context_t ngx_aio_ctx; + + +static void ngx_file_aio_event_handler(ngx_event_t *ev); + + +static int +io_submit(aio_context_t ctx, long n, struct iocb **paiocb) +{ + return syscall(SYS_io_submit, ctx, n, paiocb); +} + + +ssize_t +ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset, + ngx_pool_t *pool) +{ + ngx_err_t err; + struct iocb *piocb[1]; + ngx_event_t *ev; + ngx_event_aio_t *aio; + + if (!ngx_file_aio) { + return ngx_read_file(file, buf, size, offset); + } + + aio = file->aio; + + if (aio == NULL) { + aio = ngx_pcalloc(pool, sizeof(ngx_event_aio_t)); + if (aio == NULL) { + return NGX_ERROR; + } + + aio->file = file; + aio->fd = file->fd; + aio->event.data = aio; + aio->event.ready = 1; + aio->event.log = file->log; + file->aio = aio; + } + + ev = &aio->event; + + if (!ev->ready) { + ngx_log_error(NGX_LOG_ALERT, file->log, 0, + "second aio post for \"%V\"", &file->name); + return NGX_AGAIN; + } + + ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, + "aio complete:%d @%O:%z %V", + ev->complete, offset, size, &file->name); + + if (ev->complete) { + ev->active = 0; + ev->complete = 0; + + if (aio->res >= 0) { + ngx_set_errno(0); + return aio->res; + } + + ngx_set_errno(-aio->res); + + ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, + "aio read \"%s\" failed", file->name.data); + + return NGX_ERROR; + } + + ngx_memzero(&aio->aiocb, sizeof(struct iocb)); + + aio->aiocb.aio_data = (uint64_t) (uintptr_t) ev; + aio->aiocb.aio_lio_opcode = IOCB_CMD_PREAD; + aio->aiocb.aio_fildes = file->fd; + aio->aiocb.aio_buf = (uint64_t) (uintptr_t) buf; + aio->aiocb.aio_nbytes = size; + aio->aiocb.aio_offset = offset; + aio->aiocb.aio_flags = IOCB_FLAG_RESFD; + aio->aiocb.aio_resfd = ngx_eventfd; + + ev->handler = ngx_file_aio_event_handler; + + piocb[0] = &aio->aiocb; + + if (io_submit(ngx_aio_ctx, 1, piocb) == 1) { + ev->active = 1; + ev->ready = 0; + ev->complete = 0; + + return NGX_AGAIN; + } + + err = ngx_errno; + + if (err == NGX_EAGAIN) { + return ngx_read_file(file, buf, size, offset); + } + + ngx_log_error(NGX_LOG_CRIT, file->log, err, + "io_submit(\"%V\") failed", &file->name); + + if (err == NGX_ENOSYS) { + ngx_file_aio = 0; + return ngx_read_file(file, buf, size, offset); + } + + return NGX_ERROR; +} + + +static void +ngx_file_aio_event_handler(ngx_event_t *ev) +{ + ngx_event_aio_t *aio; + + aio = ev->data; + + ngx_log_debug2(NGX_LOG_DEBUG_CORE, ev->log, 0, + "aio event handler fd:%d %V", aio->fd, &aio->file->name); + + aio->handler(ev); +} diff --git a/release/src/router/nginx/src/os/unix/ngx_linux_config.h b/release/src/router/nginx/src/os/unix/ngx_linux_config.h new file mode 100644 index 0000000000..2834032dea --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_linux_config.h @@ -0,0 +1,118 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_LINUX_CONFIG_H_INCLUDED_ +#define _NGX_LINUX_CONFIG_H_INCLUDED_ + + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE /* pread(), pwrite(), gethostname() */ +#endif + +#define _FILE_OFFSET_BITS 64 + +#include +#include +#include +#include +#include /* offsetof() */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* statfs() */ + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include /* TCP_NODELAY, TCP_CORK */ +#include +#include +#include + +#include /* tzset() */ +#include /* memalign() */ +#include /* IOV_MAX */ +#include +#include +#include +#include /* uname() */ + + +#include + + +#if (NGX_HAVE_POSIX_SEM) +#include +#endif + + +#if (NGX_HAVE_SYS_PRCTL_H) +#include +#endif + + +#if (NGX_HAVE_SENDFILE64) +#include +#else +extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size); +#define NGX_SENDFILE_LIMIT 0x80000000 +#endif + + +#if (NGX_HAVE_POLL || NGX_HAVE_RTSIG) +#include +#endif + + +#if (NGX_HAVE_EPOLL) +#include +#endif + + +#if (NGX_HAVE_FILE_AIO) +#include +#include +typedef struct iocb ngx_aiocb_t; +#endif + + +#define NGX_LISTEN_BACKLOG 511 + + +#ifndef NGX_HAVE_SO_SNDLOWAT +/* setsockopt(SO_SNDLOWAT) returns ENOPROTOOPT */ +#define NGX_HAVE_SO_SNDLOWAT 0 +#endif + + +#ifndef NGX_HAVE_INHERITED_NONBLOCK +#define NGX_HAVE_INHERITED_NONBLOCK 0 +#endif + + +#define NGX_HAVE_OS_SPECIFIC_INIT 1 +#define ngx_debug_init() + + +extern char **environ; + + +#endif /* _NGX_LINUX_CONFIG_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_linux_init.c b/release/src/router/nginx/src/os/unix/ngx_linux_init.c new file mode 100644 index 0000000000..b910380d7c --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_linux_init.c @@ -0,0 +1,91 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +u_char ngx_linux_kern_ostype[50]; +u_char ngx_linux_kern_osrelease[50]; + +int ngx_linux_rtsig_max; + + +static ngx_os_io_t ngx_linux_io = { + ngx_unix_recv, + ngx_readv_chain, + ngx_udp_unix_recv, + ngx_unix_send, +#if (NGX_HAVE_SENDFILE) + ngx_linux_sendfile_chain, + NGX_IO_SENDFILE +#else + ngx_writev_chain, + 0 +#endif +}; + + +ngx_int_t +ngx_os_specific_init(ngx_log_t *log) +{ + struct utsname u; + + if (uname(&u) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "uname() failed"); + return NGX_ERROR; + } + + (void) ngx_cpystrn(ngx_linux_kern_ostype, (u_char *) u.sysname, + sizeof(ngx_linux_kern_ostype)); + + (void) ngx_cpystrn(ngx_linux_kern_osrelease, (u_char *) u.release, + sizeof(ngx_linux_kern_osrelease)); + +#if (NGX_HAVE_RTSIG) + { + int name[2]; + size_t len; + ngx_err_t err; + + name[0] = CTL_KERN; + name[1] = KERN_RTSIGMAX; + len = sizeof(ngx_linux_rtsig_max); + + if (sysctl(name, 2, &ngx_linux_rtsig_max, &len, NULL, 0) == -1) { + err = ngx_errno; + + if (err != NGX_ENOTDIR && err != NGX_ENOSYS) { + ngx_log_error(NGX_LOG_ALERT, log, err, + "sysctl(KERN_RTSIGMAX) failed"); + + return NGX_ERROR; + } + + ngx_linux_rtsig_max = 0; + } + + } +#endif + + ngx_os_io = ngx_linux_io; + + return NGX_OK; +} + + +void +ngx_os_specific_status(ngx_log_t *log) +{ + ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s", + ngx_linux_kern_ostype, ngx_linux_kern_osrelease); + +#if (NGX_HAVE_RTSIG) + ngx_log_error(NGX_LOG_NOTICE, log, 0, "sysctl(KERN_RTSIGMAX): %d", + ngx_linux_rtsig_max); +#endif +} diff --git a/release/src/router/nginx/src/os/unix/ngx_linux_sendfile_chain.c b/release/src/router/nginx/src/os/unix/ngx_linux_sendfile_chain.c new file mode 100644 index 0000000000..e8f3d5a894 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_linux_sendfile_chain.c @@ -0,0 +1,380 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +/* + * On Linux up to 2.4.21 sendfile() (syscall #187) works with 32-bit + * offsets only, and the including breaks the compiling, + * if off_t is 64 bit wide. So we use own sendfile() definition, where offset + * parameter is int32_t, and use sendfile() for the file parts below 2G only, + * see src/os/unix/ngx_linux_config.h + * + * Linux 2.4.21 has the new sendfile64() syscall #239. + * + * On Linux up to 2.6.16 sendfile() does not allow to pass the count parameter + * more than 2G-1 bytes even on 64-bit platforms: it returns EINVAL, + * so we limit it to 2G-1 bytes. + */ + +#define NGX_SENDFILE_LIMIT 2147483647L + + +#if (IOV_MAX > 64) +#define NGX_HEADERS 64 +#else +#define NGX_HEADERS IOV_MAX +#endif + + +ngx_chain_t * +ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) +{ + int rc, tcp_nodelay; + off_t size, send, prev_send, aligned, sent, fprev; + u_char *prev; + size_t file_size; + ngx_err_t err; + ngx_buf_t *file; + ngx_uint_t eintr, complete; + ngx_array_t header; + ngx_event_t *wev; + ngx_chain_t *cl; + struct iovec *iov, headers[NGX_HEADERS]; +#if (NGX_HAVE_SENDFILE64) + off_t offset; +#else + int32_t offset; +#endif + + wev = c->write; + + if (!wev->ready) { + return in; + } + + + /* the maximum limit size is 2G-1 - the page size */ + + if (limit == 0 || limit > (off_t) (NGX_SENDFILE_LIMIT - ngx_pagesize)) { + limit = NGX_SENDFILE_LIMIT - ngx_pagesize; + } + + + send = 0; + + header.elts = headers; + header.size = sizeof(struct iovec); + header.nalloc = NGX_HEADERS; + header.pool = c->pool; + + for ( ;; ) { + file = NULL; + file_size = 0; + eintr = 0; + complete = 0; + prev_send = send; + + header.nelts = 0; + + prev = NULL; + iov = NULL; + + /* create the iovec and coalesce the neighbouring bufs */ + + for (cl = in; cl && send < limit; cl = cl->next) { + + if (ngx_buf_special(cl->buf)) { + continue; + } + +#if 1 + if (!ngx_buf_in_memory(cl->buf) && !cl->buf->in_file) { + ngx_log_error(NGX_LOG_ALERT, c->log, 0, + "zero size buf in sendfile " + "t:%d r:%d f:%d %p %p-%p %p %O-%O", + cl->buf->temporary, + cl->buf->recycled, + cl->buf->in_file, + cl->buf->start, + cl->buf->pos, + cl->buf->last, + cl->buf->file, + cl->buf->file_pos, + cl->buf->file_last); + + ngx_debug_point(); + + return NGX_CHAIN_ERROR; + } +#endif + + if (!ngx_buf_in_memory_only(cl->buf)) { + break; + } + + size = cl->buf->last - cl->buf->pos; + + if (send + size > limit) { + size = limit - send; + } + + if (prev == cl->buf->pos) { + iov->iov_len += (size_t) size; + + } else { + if (header.nelts >= IOV_MAX) { + break; + } + + iov = ngx_array_push(&header); + if (iov == NULL) { + return NGX_CHAIN_ERROR; + } + + iov->iov_base = (void *) cl->buf->pos; + iov->iov_len = (size_t) size; + } + + prev = cl->buf->pos + (size_t) size; + send += size; + } + + /* set TCP_CORK if there is a header before a file */ + + if (c->tcp_nopush == NGX_TCP_NOPUSH_UNSET + && header.nelts != 0 + && cl + && cl->buf->in_file) + { + /* the TCP_CORK and TCP_NODELAY are mutually exclusive */ + + if (c->tcp_nodelay == NGX_TCP_NODELAY_SET) { + + tcp_nodelay = 0; + + if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, + (const void *) &tcp_nodelay, sizeof(int)) == -1) + { + err = ngx_errno; + + /* + * there is a tiny chance to be interrupted, however, + * we continue a processing with the TCP_NODELAY + * and without the TCP_CORK + */ + + if (err != NGX_EINTR) { + wev->error = 1; + ngx_connection_error(c, err, + "setsockopt(TCP_NODELAY) failed"); + return NGX_CHAIN_ERROR; + } + + } else { + c->tcp_nodelay = NGX_TCP_NODELAY_UNSET; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, + "no tcp_nodelay"); + } + } + + if (c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) { + + if (ngx_tcp_nopush(c->fd) == NGX_ERROR) { + err = ngx_errno; + + /* + * there is a tiny chance to be interrupted, however, + * we continue a processing without the TCP_CORK + */ + + if (err != NGX_EINTR) { + wev->error = 1; + ngx_connection_error(c, err, + ngx_tcp_nopush_n " failed"); + return NGX_CHAIN_ERROR; + } + + } else { + c->tcp_nopush = NGX_TCP_NOPUSH_SET; + + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, + "tcp_nopush"); + } + } + } + + /* get the file buf */ + + if (header.nelts == 0 && cl && cl->buf->in_file && send < limit) { + file = cl->buf; + + /* coalesce the neighbouring file bufs */ + + do { + size = cl->buf->file_last - cl->buf->file_pos; + + if (send + size > limit) { + size = limit - send; + + aligned = (cl->buf->file_pos + size + ngx_pagesize - 1) + & ~((off_t) ngx_pagesize - 1); + + if (aligned <= cl->buf->file_last) { + size = aligned - cl->buf->file_pos; + } + } + + file_size += (size_t) size; + send += size; + fprev = cl->buf->file_pos + size; + cl = cl->next; + + } while (cl + && cl->buf->in_file + && send < limit + && file->file->fd == cl->buf->file->fd + && fprev == cl->buf->file_pos); + } + + if (file) { +#if 1 + if (file_size == 0) { + ngx_debug_point(); + return NGX_CHAIN_ERROR; + } +#endif +#if (NGX_HAVE_SENDFILE64) + offset = file->file_pos; +#else + offset = (int32_t) file->file_pos; +#endif + + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, + "sendfile: @%O %uz", file->file_pos, file_size); + + rc = sendfile(c->fd, file->file->fd, &offset, file_size); + + if (rc == -1) { + err = ngx_errno; + + switch (err) { + case NGX_EAGAIN: + break; + + case NGX_EINTR: + eintr = 1; + break; + + default: + wev->error = 1; + ngx_connection_error(c, err, "sendfile() failed"); + return NGX_CHAIN_ERROR; + } + + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "sendfile() is not ready"); + } + + sent = rc > 0 ? rc : 0; + + ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, + "sendfile: %d, @%O %O:%uz", + rc, file->file_pos, sent, file_size); + + } else { + rc = writev(c->fd, header.elts, header.nelts); + + if (rc == -1) { + err = ngx_errno; + + switch (err) { + case NGX_EAGAIN: + break; + + case NGX_EINTR: + eintr = 1; + break; + + default: + wev->error = 1; + ngx_connection_error(c, err, "writev() failed"); + return NGX_CHAIN_ERROR; + } + + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "writev() not ready"); + } + + sent = rc > 0 ? rc : 0; + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "writev: %O", sent); + } + + if (send - prev_send == sent) { + complete = 1; + } + + c->sent += sent; + + for (cl = in; cl; cl = cl->next) { + + if (ngx_buf_special(cl->buf)) { + continue; + } + + if (sent == 0) { + break; + } + + size = ngx_buf_size(cl->buf); + + if (sent >= size) { + sent -= size; + + if (ngx_buf_in_memory(cl->buf)) { + cl->buf->pos = cl->buf->last; + } + + if (cl->buf->in_file) { + cl->buf->file_pos = cl->buf->file_last; + } + + continue; + } + + if (ngx_buf_in_memory(cl->buf)) { + cl->buf->pos += (size_t) sent; + } + + if (cl->buf->in_file) { + cl->buf->file_pos += sent; + } + + break; + } + + if (eintr) { + continue; + } + + if (!complete) { + wev->ready = 0; + return cl; + } + + if (send >= limit || cl == NULL) { + return cl; + } + + in = cl; + } +} diff --git a/release/src/router/nginx/src/os/unix/ngx_os.h b/release/src/router/nginx/src/os/unix/ngx_os.h new file mode 100644 index 0000000000..c646e2aa5a --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_os.h @@ -0,0 +1,83 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_OS_H_INCLUDED_ +#define _NGX_OS_H_INCLUDED_ + + +#include +#include + + +#define NGX_IO_SENDFILE 1 + + +typedef ssize_t (*ngx_recv_pt)(ngx_connection_t *c, u_char *buf, size_t size); +typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in); +typedef ssize_t (*ngx_send_pt)(ngx_connection_t *c, u_char *buf, size_t size); +typedef ngx_chain_t *(*ngx_send_chain_pt)(ngx_connection_t *c, ngx_chain_t *in, + off_t limit); + +typedef struct { + ngx_recv_pt recv; + ngx_recv_chain_pt recv_chain; + ngx_recv_pt udp_recv; + ngx_send_pt send; + ngx_send_chain_pt send_chain; + ngx_uint_t flags; +} ngx_os_io_t; + + +ngx_int_t ngx_os_init(ngx_log_t *log); +void ngx_os_status(ngx_log_t *log); +ngx_int_t ngx_os_specific_init(ngx_log_t *log); +void ngx_os_specific_status(ngx_log_t *log); +ngx_int_t ngx_daemon(ngx_log_t *log); +ngx_int_t ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_int_t pid); + + +ssize_t ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size); +ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *entry); +ssize_t ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size); +ssize_t ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size); +ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, + off_t limit); + +#if (NGX_HAVE_AIO) +ssize_t ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size); +ssize_t ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl); +ssize_t ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size); +ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in, + off_t limit); +#endif + + +extern ngx_os_io_t ngx_os_io; +extern ngx_int_t ngx_ncpu; +extern ngx_int_t ngx_max_sockets; +extern ngx_uint_t ngx_inherited_nonblocking; +extern ngx_uint_t ngx_tcp_nodelay_and_tcp_nopush; + + +#if (NGX_FREEBSD) +#include + + +#elif (NGX_LINUX) +#include + + +#elif (NGX_SOLARIS) +#include + + +#elif (NGX_DARWIN) +#include +#endif + + +#endif /* _NGX_OS_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_posix_config.h b/release/src/router/nginx/src/os/unix/ngx_posix_config.h new file mode 100644 index 0000000000..4cf90cc989 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_posix_config.h @@ -0,0 +1,157 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_POSIX_CONFIG_H_INCLUDED_ +#define _NGX_POSIX_CONFIG_H_INCLUDED_ + + +#if (NGX_HPUX) +#define _XOPEN_SOURCE +#define _XOPEN_SOURCE_EXTENDED 1 +#define _HPUX_ALT_XOPEN_SOCKET_API +#endif + + +#if (NGX_TRU64) +#define _REENTRANT +#endif + + +#ifdef __CYGWIN__ +#define timezonevar /* timezone is variable */ +#define NGX_BROKEN_SCM_RIGHTS 1 +#endif + + +#include +#include +#if (NGX_HAVE_UNISTD_H) +#include +#endif +#if (NGX_HAVE_INTTYPES_H) +#include +#endif +#include +#include /* offsetof() */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if (NGX_HAVE_SYS_PARAM_H) +#include /* statfs() */ +#endif +#if (NGX_HAVE_SYS_MOUNT_H) +#include /* statfs() */ +#endif +#if (NGX_HAVE_SYS_STATVFS_H) +#include /* statvfs() */ +#endif + +#if (NGX_HAVE_SYS_FILIO_H) +#include /* FIONBIO */ +#endif +#include /* FIONBIO */ + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include /* TCP_NODELAY */ +#include +#include +#include + +#if (NGX_HAVE_LIMITS_H) +#include /* IOV_MAX */ +#endif + +#ifdef __CYGWIN__ +#include /* memalign() */ +#endif + +#if (NGX_HAVE_CRYPT_H) +#include +#endif + + +#ifndef IOV_MAX +#define IOV_MAX 16 +#endif + + +#include + + +#if (NGX_HAVE_POSIX_SEM) +#include +#endif + + +#if (NGX_HAVE_POLL) +#include +#endif + + +#if (NGX_HAVE_KQUEUE) +#include +#endif + + +#if (NGX_HAVE_DEVPOLL) +#include +#include +#endif + + +#if (NGX_HAVE_FILE_AIO) +#include +typedef struct aiocb ngx_aiocb_t; +#endif + + +#define NGX_LISTEN_BACKLOG 511 + +#define ngx_debug_init() + + +#if (__FreeBSD__) && (__FreeBSD_version < 400017) + +#include /* ALIGN() */ + +/* + * FreeBSD 3.x has no CMSG_SPACE() and CMSG_LEN() and has the broken CMSG_DATA() + */ + +#undef CMSG_SPACE +#define CMSG_SPACE(l) (ALIGN(sizeof(struct cmsghdr)) + ALIGN(l)) + +#undef CMSG_LEN +#define CMSG_LEN(l) (ALIGN(sizeof(struct cmsghdr)) + (l)) + +#undef CMSG_DATA +#define CMSG_DATA(cmsg) ((u_char *)(cmsg) + ALIGN(sizeof(struct cmsghdr))) + +#endif + + +extern char **environ; + + +#endif /* _NGX_POSIX_CONFIG_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_posix_init.c b/release/src/router/nginx/src/os/unix/ngx_posix_init.c new file mode 100644 index 0000000000..58e6f76143 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_posix_init.c @@ -0,0 +1,128 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +ngx_int_t ngx_ncpu; +ngx_int_t ngx_max_sockets; +ngx_uint_t ngx_inherited_nonblocking; +ngx_uint_t ngx_tcp_nodelay_and_tcp_nopush; + + +struct rlimit rlmt; + + +ngx_os_io_t ngx_os_io = { + ngx_unix_recv, + ngx_readv_chain, + ngx_udp_unix_recv, + ngx_unix_send, + ngx_writev_chain, + 0 +}; + + +ngx_int_t +ngx_os_init(ngx_log_t *log) +{ + ngx_uint_t n; + +#if (NGX_HAVE_OS_SPECIFIC_INIT) + if (ngx_os_specific_init(log) != NGX_OK) { + return NGX_ERROR; + } +#endif + + ngx_init_setproctitle(log); + + ngx_pagesize = getpagesize(); + ngx_cacheline_size = NGX_CPU_CACHE_LINE; + + for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ } + +#if (NGX_HAVE_SC_NPROCESSORS_ONLN) + if (ngx_ncpu == 0) { + ngx_ncpu = sysconf(_SC_NPROCESSORS_ONLN); + } +#endif + + if (ngx_ncpu < 1) { + ngx_ncpu = 1; + } + + ngx_cpuinfo(); + + if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, errno, + "getrlimit(RLIMIT_NOFILE) failed)"); + return NGX_ERROR; + } + + ngx_max_sockets = (ngx_int_t) rlmt.rlim_cur; + +#if (NGX_HAVE_INHERITED_NONBLOCK || NGX_HAVE_ACCEPT4) + ngx_inherited_nonblocking = 1; +#else + ngx_inherited_nonblocking = 0; +#endif + + srandom(ngx_time()); + + return NGX_OK; +} + + +void +ngx_os_status(ngx_log_t *log) +{ + ngx_log_error(NGX_LOG_NOTICE, log, 0, NGINX_VER); + +#ifdef NGX_COMPILER + ngx_log_error(NGX_LOG_NOTICE, log, 0, "built by " NGX_COMPILER); +#endif + +#if (NGX_HAVE_OS_SPECIFIC_INIT) + ngx_os_specific_status(log); +#endif + + ngx_log_error(NGX_LOG_NOTICE, log, 0, + "getrlimit(RLIMIT_NOFILE): %r:%r", + rlmt.rlim_cur, rlmt.rlim_max); +} + + +#if 0 + +ngx_int_t +ngx_posix_post_conf_init(ngx_log_t *log) +{ + ngx_fd_t pp[2]; + + if (pipe(pp) == -1) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "pipe() failed"); + return NGX_ERROR; + } + + if (dup2(pp[1], STDERR_FILENO) == -1) { + ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDERR) failed"); + return NGX_ERROR; + } + + if (pp[1] > STDERR_FILENO) { + if (close(pp[1]) == -1) { + ngx_log_error(NGX_LOG_EMERG, log, errno, "close() failed"); + return NGX_ERROR; + } + } + + return NGX_OK; +} + +#endif diff --git a/release/src/router/nginx/src/os/unix/ngx_process.c b/release/src/router/nginx/src/os/unix/ngx_process.c new file mode 100644 index 0000000000..4ef3582e8a --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_process.c @@ -0,0 +1,625 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include + + +typedef struct { + int signo; + char *signame; + char *name; + void (*handler)(int signo); +} ngx_signal_t; + + + +static void ngx_execute_proc(ngx_cycle_t *cycle, void *data); +static void ngx_signal_handler(int signo); +static void ngx_process_get_status(void); +static void ngx_unlock_mutexes(ngx_pid_t pid); + + +int ngx_argc; +char **ngx_argv; +char **ngx_os_argv; + +ngx_int_t ngx_process_slot; +ngx_socket_t ngx_channel; +ngx_int_t ngx_last_process; +ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; + + +ngx_signal_t signals[] = { + { ngx_signal_value(NGX_RECONFIGURE_SIGNAL), + "SIG" ngx_value(NGX_RECONFIGURE_SIGNAL), + "reload", + ngx_signal_handler }, + + { ngx_signal_value(NGX_REOPEN_SIGNAL), + "SIG" ngx_value(NGX_REOPEN_SIGNAL), + "reopen", + ngx_signal_handler }, + + { ngx_signal_value(NGX_NOACCEPT_SIGNAL), + "SIG" ngx_value(NGX_NOACCEPT_SIGNAL), + "", + ngx_signal_handler }, + + { ngx_signal_value(NGX_TERMINATE_SIGNAL), + "SIG" ngx_value(NGX_TERMINATE_SIGNAL), + "stop", + ngx_signal_handler }, + + { ngx_signal_value(NGX_SHUTDOWN_SIGNAL), + "SIG" ngx_value(NGX_SHUTDOWN_SIGNAL), + "quit", + ngx_signal_handler }, + + { ngx_signal_value(NGX_CHANGEBIN_SIGNAL), + "SIG" ngx_value(NGX_CHANGEBIN_SIGNAL), + "", + ngx_signal_handler }, + + { SIGALRM, "SIGALRM", "", ngx_signal_handler }, + + { SIGINT, "SIGINT", "", ngx_signal_handler }, + + { SIGIO, "SIGIO", "", ngx_signal_handler }, + + { SIGCHLD, "SIGCHLD", "", ngx_signal_handler }, + + { SIGSYS, "SIGSYS, SIG_IGN", "", SIG_IGN }, + + { SIGPIPE, "SIGPIPE, SIG_IGN", "", SIG_IGN }, + + { 0, NULL, "", NULL } +}; + + +ngx_pid_t +ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data, + char *name, ngx_int_t respawn) +{ + u_long on; + ngx_pid_t pid; + ngx_int_t s; + + if (respawn >= 0) { + s = respawn; + + } else { + for (s = 0; s < ngx_last_process; s++) { + if (ngx_processes[s].pid == -1) { + break; + } + } + + if (s == NGX_MAX_PROCESSES) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, + "no more than %d processes can be spawned", + NGX_MAX_PROCESSES); + return NGX_INVALID_PID; + } + } + + + if (respawn != NGX_PROCESS_DETACHED) { + + /* Solaris 9 still has no AF_LOCAL */ + + if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1) + { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "socketpair() failed while spawning \"%s\"", name); + return NGX_INVALID_PID; + } + + ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "channel %d:%d", + ngx_processes[s].channel[0], + ngx_processes[s].channel[1]); + + if (ngx_nonblocking(ngx_processes[s].channel[0]) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + ngx_nonblocking_n " failed while spawning \"%s\"", + name); + ngx_close_channel(ngx_processes[s].channel, cycle->log); + return NGX_INVALID_PID; + } + + if (ngx_nonblocking(ngx_processes[s].channel[1]) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + ngx_nonblocking_n " failed while spawning \"%s\"", + name); + ngx_close_channel(ngx_processes[s].channel, cycle->log); + return NGX_INVALID_PID; + } + + on = 1; + if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "ioctl(FIOASYNC) failed while spawning \"%s\"", name); + ngx_close_channel(ngx_processes[s].channel, cycle->log); + return NGX_INVALID_PID; + } + + if (fcntl(ngx_processes[s].channel[0], F_SETOWN, ngx_pid) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "fcntl(F_SETOWN) failed while spawning \"%s\"", name); + ngx_close_channel(ngx_processes[s].channel, cycle->log); + return NGX_INVALID_PID; + } + + if (fcntl(ngx_processes[s].channel[0], F_SETFD, FD_CLOEXEC) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "fcntl(FD_CLOEXEC) failed while spawning \"%s\"", + name); + ngx_close_channel(ngx_processes[s].channel, cycle->log); + return NGX_INVALID_PID; + } + + if (fcntl(ngx_processes[s].channel[1], F_SETFD, FD_CLOEXEC) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "fcntl(FD_CLOEXEC) failed while spawning \"%s\"", + name); + ngx_close_channel(ngx_processes[s].channel, cycle->log); + return NGX_INVALID_PID; + } + + ngx_channel = ngx_processes[s].channel[1]; + + } else { + ngx_processes[s].channel[0] = -1; + ngx_processes[s].channel[1] = -1; + } + + ngx_process_slot = s; + + + pid = fork(); + + switch (pid) { + + case -1: + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "fork() failed while spawning \"%s\"", name); + ngx_close_channel(ngx_processes[s].channel, cycle->log); + return NGX_INVALID_PID; + + case 0: + ngx_pid = ngx_getpid(); + proc(cycle, data); + break; + + default: + break; + } + + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start %s %P", name, pid); + + ngx_processes[s].pid = pid; + ngx_processes[s].exited = 0; + + if (respawn >= 0) { + return pid; + } + + ngx_processes[s].proc = proc; + ngx_processes[s].data = data; + ngx_processes[s].name = name; + ngx_processes[s].exiting = 0; + + switch (respawn) { + + case NGX_PROCESS_NORESPAWN: + ngx_processes[s].respawn = 0; + ngx_processes[s].just_spawn = 0; + ngx_processes[s].detached = 0; + break; + + case NGX_PROCESS_JUST_SPAWN: + ngx_processes[s].respawn = 0; + ngx_processes[s].just_spawn = 1; + ngx_processes[s].detached = 0; + break; + + case NGX_PROCESS_RESPAWN: + ngx_processes[s].respawn = 1; + ngx_processes[s].just_spawn = 0; + ngx_processes[s].detached = 0; + break; + + case NGX_PROCESS_JUST_RESPAWN: + ngx_processes[s].respawn = 1; + ngx_processes[s].just_spawn = 1; + ngx_processes[s].detached = 0; + break; + + case NGX_PROCESS_DETACHED: + ngx_processes[s].respawn = 0; + ngx_processes[s].just_spawn = 0; + ngx_processes[s].detached = 1; + break; + } + + if (s == ngx_last_process) { + ngx_last_process++; + } + + return pid; +} + + +ngx_pid_t +ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx) +{ + return ngx_spawn_process(cycle, ngx_execute_proc, ctx, ctx->name, + NGX_PROCESS_DETACHED); +} + + +static void +ngx_execute_proc(ngx_cycle_t *cycle, void *data) +{ + ngx_exec_ctx_t *ctx = data; + + if (execve(ctx->path, ctx->argv, ctx->envp) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "execve() failed while executing %s \"%s\"", + ctx->name, ctx->path); + } + + exit(1); +} + + +ngx_int_t +ngx_init_signals(ngx_log_t *log) +{ + ngx_signal_t *sig; + struct sigaction sa; + + for (sig = signals; sig->signo != 0; sig++) { + ngx_memzero(&sa, sizeof(struct sigaction)); + sa.sa_handler = sig->handler; + sigemptyset(&sa.sa_mask); + if (sigaction(sig->signo, &sa, NULL) == -1) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, + "sigaction(%s) failed", sig->signame); + return NGX_ERROR; + } + } + + return NGX_OK; +} + + +void +ngx_signal_handler(int signo) +{ + char *action; + ngx_int_t ignore; + ngx_err_t err; + ngx_signal_t *sig; + + ignore = 0; + + err = ngx_errno; + + for (sig = signals; sig->signo != 0; sig++) { + if (sig->signo == signo) { + break; + } + } + + ngx_time_sigsafe_update(); + + action = ""; + + switch (ngx_process) { + + case NGX_PROCESS_MASTER: + case NGX_PROCESS_SINGLE: + switch (signo) { + + case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): + ngx_quit = 1; + action = ", shutting down"; + break; + + case ngx_signal_value(NGX_TERMINATE_SIGNAL): + case SIGINT: + ngx_terminate = 1; + action = ", exiting"; + break; + + case ngx_signal_value(NGX_NOACCEPT_SIGNAL): + if (ngx_daemonized) { + ngx_noaccept = 1; + action = ", stop accepting connections"; + } + break; + + case ngx_signal_value(NGX_RECONFIGURE_SIGNAL): + ngx_reconfigure = 1; + action = ", reconfiguring"; + break; + + case ngx_signal_value(NGX_REOPEN_SIGNAL): + ngx_reopen = 1; + action = ", reopening logs"; + break; + + case ngx_signal_value(NGX_CHANGEBIN_SIGNAL): + if (getppid() > 1 || ngx_new_binary > 0) { + + /* + * Ignore the signal in the new binary if its parent is + * not the init process, i.e. the old binary's process + * is still running. Or ignore the signal in the old binary's + * process if the new binary's process is already running. + */ + + action = ", ignoring"; + ignore = 1; + break; + } + + ngx_change_binary = 1; + action = ", changing binary"; + break; + + case SIGALRM: + ngx_sigalrm = 1; + break; + + case SIGIO: + ngx_sigio = 1; + break; + + case SIGCHLD: + ngx_reap = 1; + break; + } + + break; + + case NGX_PROCESS_WORKER: + case NGX_PROCESS_HELPER: + switch (signo) { + + case ngx_signal_value(NGX_NOACCEPT_SIGNAL): + if (!ngx_daemonized) { + break; + } + ngx_debug_quit = 1; + case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): + ngx_quit = 1; + action = ", shutting down"; + break; + + case ngx_signal_value(NGX_TERMINATE_SIGNAL): + case SIGINT: + ngx_terminate = 1; + action = ", exiting"; + break; + + case ngx_signal_value(NGX_REOPEN_SIGNAL): + ngx_reopen = 1; + action = ", reopening logs"; + break; + + case ngx_signal_value(NGX_RECONFIGURE_SIGNAL): + case ngx_signal_value(NGX_CHANGEBIN_SIGNAL): + case SIGIO: + action = ", ignoring"; + break; + } + + break; + } + + ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, + "signal %d (%s) received%s", signo, sig->signame, action); + + if (ignore) { + ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, 0, + "the changing binary signal is ignored: " + "you should shutdown or terminate " + "before either old or new binary's process"); + } + + if (signo == SIGCHLD) { + ngx_process_get_status(); + } + + ngx_set_errno(err); +} + + +static void +ngx_process_get_status(void) +{ + int status; + char *process; + ngx_pid_t pid; + ngx_err_t err; + ngx_int_t i; + ngx_uint_t one; + + one = 0; + + for ( ;; ) { + pid = waitpid(-1, &status, WNOHANG); + + if (pid == 0) { + return; + } + + if (pid == -1) { + err = ngx_errno; + + if (err == NGX_EINTR) { + continue; + } + + if (err == NGX_ECHILD && one) { + return; + } + + /* + * Solaris always calls the signal handler for each exited process + * despite waitpid() may be already called for this process. + * + * When several processes exit at the same time FreeBSD may + * erroneously call the signal handler for exited process + * despite waitpid() may be already called for this process. + */ + + if (err == NGX_ECHILD) { + ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, err, + "waitpid() failed"); + return; + } + + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err, + "waitpid() failed"); + return; + } + + + one = 1; + process = "unknown process"; + + for (i = 0; i < ngx_last_process; i++) { + if (ngx_processes[i].pid == pid) { + ngx_processes[i].status = status; + ngx_processes[i].exited = 1; + process = ngx_processes[i].name; + break; + } + } + + if (WTERMSIG(status)) { +#ifdef WCOREDUMP + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, + "%s %P exited on signal %d%s", + process, pid, WTERMSIG(status), + WCOREDUMP(status) ? " (core dumped)" : ""); +#else + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, + "%s %P exited on signal %d", + process, pid, WTERMSIG(status)); +#endif + + } else { + ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, + "%s %P exited with code %d", + process, pid, WEXITSTATUS(status)); + } + + if (WEXITSTATUS(status) == 2 && ngx_processes[i].respawn) { + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, + "%s %P exited with fatal code %d " + "and cannot be respawned", + process, pid, WEXITSTATUS(status)); + ngx_processes[i].respawn = 0; + } + + ngx_unlock_mutexes(pid); + } +} + + +static void +ngx_unlock_mutexes(ngx_pid_t pid) +{ + ngx_uint_t i; + ngx_shm_zone_t *shm_zone; + ngx_list_part_t *part; + ngx_slab_pool_t *sp; + + /* + * unlock the accept mutex if the abnormally exited process + * held it + */ + + if (ngx_accept_mutex_ptr) { + (void) ngx_shmtx_force_unlock(&ngx_accept_mutex, pid); + } + + /* + * unlock shared memory mutexes if held by the abnormally exited + * process + */ + + part = (ngx_list_part_t *) &ngx_cycle->shared_memory.part; + shm_zone = part->elts; + + for (i = 0; /* void */ ; i++) { + + if (i >= part->nelts) { + if (part->next == NULL) { + break; + } + part = part->next; + shm_zone = part->elts; + i = 0; + } + + sp = (ngx_slab_pool_t *) shm_zone[i].shm.addr; + + if (ngx_shmtx_force_unlock(&sp->mutex, pid)) { + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, + "shared memory zone \"%V\" was locked by %P", + &shm_zone[i].shm.name, pid); + } + } +} + + +void +ngx_debug_point(void) +{ + ngx_core_conf_t *ccf; + + ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx, + ngx_core_module); + + switch (ccf->debug_points) { + + case NGX_DEBUG_POINTS_STOP: + raise(SIGSTOP); + break; + + case NGX_DEBUG_POINTS_ABORT: + ngx_abort(); + } +} + + +ngx_int_t +ngx_os_signal_process(ngx_cycle_t *cycle, char *name, ngx_int_t pid) +{ + ngx_signal_t *sig; + + for (sig = signals; sig->signo != 0; sig++) { + if (ngx_strcmp(name, sig->name) == 0) { + if (kill(pid, sig->signo) != -1) { + return 0; + } + + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "kill(%P, %d) failed", pid, sig->signo); + } + } + + return 1; +} diff --git a/release/src/router/nginx/src/os/unix/ngx_process.h b/release/src/router/nginx/src/os/unix/ngx_process.h new file mode 100644 index 0000000000..7b5e8c0c25 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_process.h @@ -0,0 +1,88 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_PROCESS_H_INCLUDED_ +#define _NGX_PROCESS_H_INCLUDED_ + + +#include +#include + + +typedef pid_t ngx_pid_t; + +#define NGX_INVALID_PID -1 + +typedef void (*ngx_spawn_proc_pt) (ngx_cycle_t *cycle, void *data); + +typedef struct { + ngx_pid_t pid; + int status; + ngx_socket_t channel[2]; + + ngx_spawn_proc_pt proc; + void *data; + char *name; + + unsigned respawn:1; + unsigned just_spawn:1; + unsigned detached:1; + unsigned exiting:1; + unsigned exited:1; +} ngx_process_t; + + +typedef struct { + char *path; + char *name; + char *const *argv; + char *const *envp; +} ngx_exec_ctx_t; + + +#define NGX_MAX_PROCESSES 1024 + +#define NGX_PROCESS_NORESPAWN -1 +#define NGX_PROCESS_JUST_SPAWN -2 +#define NGX_PROCESS_RESPAWN -3 +#define NGX_PROCESS_JUST_RESPAWN -4 +#define NGX_PROCESS_DETACHED -5 + + +#define ngx_getpid getpid + +#ifndef ngx_log_pid +#define ngx_log_pid ngx_pid +#endif + + +ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, + ngx_spawn_proc_pt proc, void *data, char *name, ngx_int_t respawn); +ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx); +ngx_int_t ngx_init_signals(ngx_log_t *log); +void ngx_debug_point(void); + + +#if (NGX_HAVE_SCHED_YIELD) +#define ngx_sched_yield() sched_yield() +#else +#define ngx_sched_yield() usleep(1) +#endif + + +extern int ngx_argc; +extern char **ngx_argv; +extern char **ngx_os_argv; + +extern ngx_pid_t ngx_pid; +extern ngx_socket_t ngx_channel; +extern ngx_int_t ngx_process_slot; +extern ngx_int_t ngx_last_process; +extern ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; + + +#endif /* _NGX_PROCESS_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_process_cycle.c b/release/src/router/nginx/src/os/unix/ngx_process_cycle.c new file mode 100644 index 0000000000..dfdfae081c --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_process_cycle.c @@ -0,0 +1,1394 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include +#include + + +static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, + ngx_int_t type); +static void ngx_start_cache_manager_processes(ngx_cycle_t *cycle, + ngx_uint_t respawn); +static void ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch); +static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo); +static ngx_uint_t ngx_reap_children(ngx_cycle_t *cycle); +static void ngx_master_process_exit(ngx_cycle_t *cycle); +static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data); +static void ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker); +static void ngx_worker_process_exit(ngx_cycle_t *cycle); +static void ngx_channel_handler(ngx_event_t *ev); +#if (NGX_THREADS) +static void ngx_wakeup_worker_threads(ngx_cycle_t *cycle); +static ngx_thread_value_t ngx_worker_thread_cycle(void *data); +#endif +static void ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data); +static void ngx_cache_manager_process_handler(ngx_event_t *ev); +static void ngx_cache_loader_process_handler(ngx_event_t *ev); + + +ngx_uint_t ngx_process; +ngx_pid_t ngx_pid; +ngx_uint_t ngx_threaded; + +sig_atomic_t ngx_reap; +sig_atomic_t ngx_sigio; +sig_atomic_t ngx_sigalrm; +sig_atomic_t ngx_terminate; +sig_atomic_t ngx_quit; +sig_atomic_t ngx_debug_quit; +ngx_uint_t ngx_exiting; +sig_atomic_t ngx_reconfigure; +sig_atomic_t ngx_reopen; + +sig_atomic_t ngx_change_binary; +ngx_pid_t ngx_new_binary; +ngx_uint_t ngx_inherited; +ngx_uint_t ngx_daemonized; + +sig_atomic_t ngx_noaccept; +ngx_uint_t ngx_noaccepting; +ngx_uint_t ngx_restart; + + +#if (NGX_THREADS) +volatile ngx_thread_t ngx_threads[NGX_MAX_THREADS]; +ngx_int_t ngx_threads_n; +#endif + + +static u_char master_process[] = "master process"; + + +static ngx_cache_manager_ctx_t ngx_cache_manager_ctx = { + ngx_cache_manager_process_handler, "cache manager process", 0 +}; + +static ngx_cache_manager_ctx_t ngx_cache_loader_ctx = { + ngx_cache_loader_process_handler, "cache loader process", 60000 +}; + + +static ngx_cycle_t ngx_exit_cycle; +static ngx_log_t ngx_exit_log; +static ngx_open_file_t ngx_exit_log_file; + + +void +ngx_master_process_cycle(ngx_cycle_t *cycle) +{ + char *title; + u_char *p; + size_t size; + ngx_int_t i; + ngx_uint_t n, sigio; + sigset_t set; + struct itimerval itv; + ngx_uint_t live; + ngx_msec_t delay; + ngx_listening_t *ls; + ngx_core_conf_t *ccf; + + sigemptyset(&set); + sigaddset(&set, SIGCHLD); + sigaddset(&set, SIGALRM); + sigaddset(&set, SIGIO); + sigaddset(&set, SIGINT); + sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL)); + sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL)); + sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL)); + sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL)); + sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); + sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL)); + + if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "sigprocmask() failed"); + } + + sigemptyset(&set); + + + size = sizeof(master_process); + + for (i = 0; i < ngx_argc; i++) { + size += ngx_strlen(ngx_argv[i]) + 1; + } + + title = ngx_pnalloc(cycle->pool, size); + + p = ngx_cpymem(title, master_process, sizeof(master_process) - 1); + for (i = 0; i < ngx_argc; i++) { + *p++ = ' '; + p = ngx_cpystrn(p, (u_char *) ngx_argv[i], size); + } + + ngx_setproctitle(title); + + + ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); + + ngx_start_worker_processes(cycle, ccf->worker_processes, + NGX_PROCESS_RESPAWN); + ngx_start_cache_manager_processes(cycle, 0); + + ngx_new_binary = 0; + delay = 0; + sigio = 0; + live = 1; + + for ( ;; ) { + if (delay) { + if (ngx_sigalrm) { + sigio = 0; + delay *= 2; + ngx_sigalrm = 0; + } + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "termination cycle: %d", delay); + + itv.it_interval.tv_sec = 0; + itv.it_interval.tv_usec = 0; + itv.it_value.tv_sec = delay / 1000; + itv.it_value.tv_usec = (delay % 1000 ) * 1000; + + if (setitimer(ITIMER_REAL, &itv, NULL) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "setitimer() failed"); + } + } + + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "sigsuspend"); + + sigsuspend(&set); + + ngx_time_update(); + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "wake up, sigio %i", sigio); + + if (ngx_reap) { + ngx_reap = 0; + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap children"); + + live = ngx_reap_children(cycle); + } + + if (!live && (ngx_terminate || ngx_quit)) { + ngx_master_process_exit(cycle); + } + + if (ngx_terminate) { + if (delay == 0) { + delay = 50; + } + + if (sigio) { + sigio--; + continue; + } + + sigio = ccf->worker_processes + 2 /* cache processes */; + + if (delay > 1000) { + ngx_signal_worker_processes(cycle, SIGKILL); + } else { + ngx_signal_worker_processes(cycle, + ngx_signal_value(NGX_TERMINATE_SIGNAL)); + } + + continue; + } + + if (ngx_quit) { + ngx_signal_worker_processes(cycle, + ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); + + ls = cycle->listening.elts; + for (n = 0; n < cycle->listening.nelts; n++) { + if (ngx_close_socket(ls[n].fd) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, + ngx_close_socket_n " %V failed", + &ls[n].addr_text); + } + } + cycle->listening.nelts = 0; + + continue; + } + + if (ngx_reconfigure) { + ngx_reconfigure = 0; + + if (ngx_new_binary) { + ngx_start_worker_processes(cycle, ccf->worker_processes, + NGX_PROCESS_RESPAWN); + ngx_start_cache_manager_processes(cycle, 0); + ngx_noaccepting = 0; + + continue; + } + + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring"); + + cycle = ngx_init_cycle(cycle); + if (cycle == NULL) { + cycle = (ngx_cycle_t *) ngx_cycle; + continue; + } + + ngx_cycle = cycle; + ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, + ngx_core_module); + ngx_start_worker_processes(cycle, ccf->worker_processes, + NGX_PROCESS_JUST_RESPAWN); + ngx_start_cache_manager_processes(cycle, 1); + + /* allow new processes to start */ + ngx_msleep(100); + + live = 1; + ngx_signal_worker_processes(cycle, + ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); + } + + if (ngx_restart) { + ngx_restart = 0; + ngx_start_worker_processes(cycle, ccf->worker_processes, + NGX_PROCESS_RESPAWN); + ngx_start_cache_manager_processes(cycle, 0); + live = 1; + } + + if (ngx_reopen) { + ngx_reopen = 0; + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); + ngx_reopen_files(cycle, ccf->user); + ngx_signal_worker_processes(cycle, + ngx_signal_value(NGX_REOPEN_SIGNAL)); + } + + if (ngx_change_binary) { + ngx_change_binary = 0; + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "changing binary"); + ngx_new_binary = ngx_exec_new_binary(cycle, ngx_argv); + } + + if (ngx_noaccept) { + ngx_noaccept = 0; + ngx_noaccepting = 1; + ngx_signal_worker_processes(cycle, + ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); + } + } +} + + +void +ngx_single_process_cycle(ngx_cycle_t *cycle) +{ + ngx_uint_t i; + + if (ngx_set_environment(cycle, NULL) == NULL) { + /* fatal */ + exit(2); + } + + for (i = 0; ngx_modules[i]; i++) { + if (ngx_modules[i]->init_process) { + if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) { + /* fatal */ + exit(2); + } + } + } + + for ( ;; ) { + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle"); + + ngx_process_events_and_timers(cycle); + + if (ngx_terminate || ngx_quit) { + + for (i = 0; ngx_modules[i]; i++) { + if (ngx_modules[i]->exit_process) { + ngx_modules[i]->exit_process(cycle); + } + } + + ngx_master_process_exit(cycle); + } + + if (ngx_reconfigure) { + ngx_reconfigure = 0; + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring"); + + cycle = ngx_init_cycle(cycle); + if (cycle == NULL) { + cycle = (ngx_cycle_t *) ngx_cycle; + continue; + } + + ngx_cycle = cycle; + } + + if (ngx_reopen) { + ngx_reopen = 0; + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); + ngx_reopen_files(cycle, (ngx_uid_t) -1); + } + } +} + + +static void +ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type) +{ + ngx_int_t i; + ngx_channel_t ch; + + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start worker processes"); + + ch.command = NGX_CMD_OPEN_CHANNEL; + + for (i = 0; i < n; i++) { + + ngx_spawn_process(cycle, ngx_worker_process_cycle, + (void *) (intptr_t) i, "worker process", type); + + ch.pid = ngx_processes[ngx_process_slot].pid; + ch.slot = ngx_process_slot; + ch.fd = ngx_processes[ngx_process_slot].channel[0]; + + ngx_pass_open_channel(cycle, &ch); + } +} + + +static void +ngx_start_cache_manager_processes(ngx_cycle_t *cycle, ngx_uint_t respawn) +{ + ngx_uint_t i, manager, loader; + ngx_path_t **path; + ngx_channel_t ch; + + manager = 0; + loader = 0; + + path = ngx_cycle->paths.elts; + for (i = 0; i < ngx_cycle->paths.nelts; i++) { + + if (path[i]->manager) { + manager = 1; + } + + if (path[i]->loader) { + loader = 1; + } + } + + if (manager == 0) { + return; + } + + ngx_spawn_process(cycle, ngx_cache_manager_process_cycle, + &ngx_cache_manager_ctx, "cache manager process", + respawn ? NGX_PROCESS_JUST_RESPAWN : NGX_PROCESS_RESPAWN); + + ch.command = NGX_CMD_OPEN_CHANNEL; + ch.pid = ngx_processes[ngx_process_slot].pid; + ch.slot = ngx_process_slot; + ch.fd = ngx_processes[ngx_process_slot].channel[0]; + + ngx_pass_open_channel(cycle, &ch); + + if (loader == 0) { + return; + } + + ngx_spawn_process(cycle, ngx_cache_manager_process_cycle, + &ngx_cache_loader_ctx, "cache loader process", + respawn ? NGX_PROCESS_JUST_SPAWN : NGX_PROCESS_NORESPAWN); + + ch.command = NGX_CMD_OPEN_CHANNEL; + ch.pid = ngx_processes[ngx_process_slot].pid; + ch.slot = ngx_process_slot; + ch.fd = ngx_processes[ngx_process_slot].channel[0]; + + ngx_pass_open_channel(cycle, &ch); +} + + +static void +ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch) +{ + ngx_int_t i; + + for (i = 0; i < ngx_last_process; i++) { + + if (i == ngx_process_slot + || ngx_processes[i].pid == -1 + || ngx_processes[i].channel[0] == -1) + { + continue; + } + + ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "pass channel s:%d pid:%P fd:%d to s:%i pid:%P fd:%d", + ch->slot, ch->pid, ch->fd, + i, ngx_processes[i].pid, + ngx_processes[i].channel[0]); + + /* TODO: NGX_AGAIN */ + + ngx_write_channel(ngx_processes[i].channel[0], + ch, sizeof(ngx_channel_t), cycle->log); + } +} + + +static void +ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo) +{ + ngx_int_t i; + ngx_err_t err; + ngx_channel_t ch; + +#if (NGX_BROKEN_SCM_RIGHTS) + + ch.command = 0; + +#else + + switch (signo) { + + case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): + ch.command = NGX_CMD_QUIT; + break; + + case ngx_signal_value(NGX_TERMINATE_SIGNAL): + ch.command = NGX_CMD_TERMINATE; + break; + + case ngx_signal_value(NGX_REOPEN_SIGNAL): + ch.command = NGX_CMD_REOPEN; + break; + + default: + ch.command = 0; + } + +#endif + + ch.fd = -1; + + + for (i = 0; i < ngx_last_process; i++) { + + ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "child: %d %P e:%d t:%d d:%d r:%d j:%d", + i, + ngx_processes[i].pid, + ngx_processes[i].exiting, + ngx_processes[i].exited, + ngx_processes[i].detached, + ngx_processes[i].respawn, + ngx_processes[i].just_spawn); + + if (ngx_processes[i].detached || ngx_processes[i].pid == -1) { + continue; + } + + if (ngx_processes[i].just_spawn) { + ngx_processes[i].just_spawn = 0; + continue; + } + + if (ngx_processes[i].exiting + && signo == ngx_signal_value(NGX_SHUTDOWN_SIGNAL)) + { + continue; + } + + if (ch.command) { + if (ngx_write_channel(ngx_processes[i].channel[0], + &ch, sizeof(ngx_channel_t), cycle->log) + == NGX_OK) + { + if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) { + ngx_processes[i].exiting = 1; + } + + continue; + } + } + + ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "kill (%P, %d)" , ngx_processes[i].pid, signo); + + if (kill(ngx_processes[i].pid, signo) == -1) { + err = ngx_errno; + ngx_log_error(NGX_LOG_ALERT, cycle->log, err, + "kill(%P, %d) failed", ngx_processes[i].pid, signo); + + if (err == NGX_ESRCH) { + ngx_processes[i].exited = 1; + ngx_processes[i].exiting = 0; + ngx_reap = 1; + } + + continue; + } + + if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) { + ngx_processes[i].exiting = 1; + } + } +} + + +static ngx_uint_t +ngx_reap_children(ngx_cycle_t *cycle) +{ + ngx_int_t i, n; + ngx_uint_t live; + ngx_channel_t ch; + ngx_core_conf_t *ccf; + + ch.command = NGX_CMD_CLOSE_CHANNEL; + ch.fd = -1; + + live = 0; + for (i = 0; i < ngx_last_process; i++) { + + ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "child: %d %P e:%d t:%d d:%d r:%d j:%d", + i, + ngx_processes[i].pid, + ngx_processes[i].exiting, + ngx_processes[i].exited, + ngx_processes[i].detached, + ngx_processes[i].respawn, + ngx_processes[i].just_spawn); + + if (ngx_processes[i].pid == -1) { + continue; + } + + if (ngx_processes[i].exited) { + + if (!ngx_processes[i].detached) { + ngx_close_channel(ngx_processes[i].channel, cycle->log); + + ngx_processes[i].channel[0] = -1; + ngx_processes[i].channel[1] = -1; + + ch.pid = ngx_processes[i].pid; + ch.slot = i; + + for (n = 0; n < ngx_last_process; n++) { + if (ngx_processes[n].exited + || ngx_processes[n].pid == -1 + || ngx_processes[n].channel[0] == -1) + { + continue; + } + + ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "pass close channel s:%i pid:%P to:%P", + ch.slot, ch.pid, ngx_processes[n].pid); + + /* TODO: NGX_AGAIN */ + + ngx_write_channel(ngx_processes[n].channel[0], + &ch, sizeof(ngx_channel_t), cycle->log); + } + } + + if (ngx_processes[i].respawn + && !ngx_processes[i].exiting + && !ngx_terminate + && !ngx_quit) + { + if (ngx_spawn_process(cycle, ngx_processes[i].proc, + ngx_processes[i].data, + ngx_processes[i].name, i) + == NGX_INVALID_PID) + { + ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, + "could not respawn %s", + ngx_processes[i].name); + continue; + } + + + ch.command = NGX_CMD_OPEN_CHANNEL; + ch.pid = ngx_processes[ngx_process_slot].pid; + ch.slot = ngx_process_slot; + ch.fd = ngx_processes[ngx_process_slot].channel[0]; + + ngx_pass_open_channel(cycle, &ch); + + live = 1; + + continue; + } + + if (ngx_processes[i].pid == ngx_new_binary) { + + ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, + ngx_core_module); + + if (ngx_rename_file((char *) ccf->oldpid.data, + (char *) ccf->pid.data) + == NGX_FILE_ERROR) + { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + ngx_rename_file_n " %s back to %s failed " + "after the new binary process \"%s\" exited", + ccf->oldpid.data, ccf->pid.data, ngx_argv[0]); + } + + ngx_new_binary = 0; + if (ngx_noaccepting) { + ngx_restart = 1; + ngx_noaccepting = 0; + } + } + + if (i == ngx_last_process - 1) { + ngx_last_process--; + + } else { + ngx_processes[i].pid = -1; + } + + } else if (ngx_processes[i].exiting || !ngx_processes[i].detached) { + live = 1; + } + } + + return live; +} + + +static void +ngx_master_process_exit(ngx_cycle_t *cycle) +{ + ngx_uint_t i; + + ngx_delete_pidfile(cycle); + + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit"); + + for (i = 0; ngx_modules[i]; i++) { + if (ngx_modules[i]->exit_master) { + ngx_modules[i]->exit_master(cycle); + } + } + + ngx_close_listening_sockets(cycle); + + /* + * Copy ngx_cycle->log related data to the special static exit cycle, + * log, and log file structures enough to allow a signal handler to log. + * The handler may be called when standard ngx_cycle->log allocated from + * ngx_cycle->pool is already destroyed. + */ + + ngx_exit_log_file.fd = ngx_cycle->log->file->fd; + + ngx_exit_log = *ngx_cycle->log; + ngx_exit_log.file = &ngx_exit_log_file; + + ngx_exit_cycle.log = &ngx_exit_log; + ngx_exit_cycle.files = ngx_cycle->files; + ngx_exit_cycle.files_n = ngx_cycle->files_n; + ngx_cycle = &ngx_exit_cycle; + + ngx_destroy_pool(cycle->pool); + + exit(0); +} + + +static void +ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) +{ + ngx_int_t worker = (intptr_t) data; + + ngx_uint_t i; + ngx_connection_t *c; + + ngx_process = NGX_PROCESS_WORKER; + + ngx_worker_process_init(cycle, worker); + + ngx_setproctitle("worker process"); + +#if (NGX_THREADS) + { + ngx_int_t n; + ngx_err_t err; + ngx_core_conf_t *ccf; + + ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); + + if (ngx_threads_n) { + if (ngx_init_threads(ngx_threads_n, ccf->thread_stack_size, cycle) + == NGX_ERROR) + { + /* fatal */ + exit(2); + } + + err = ngx_thread_key_create(&ngx_core_tls_key); + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, err, + ngx_thread_key_create_n " failed"); + /* fatal */ + exit(2); + } + + for (n = 0; n < ngx_threads_n; n++) { + + ngx_threads[n].cv = ngx_cond_init(cycle->log); + + if (ngx_threads[n].cv == NULL) { + /* fatal */ + exit(2); + } + + if (ngx_create_thread((ngx_tid_t *) &ngx_threads[n].tid, + ngx_worker_thread_cycle, + (void *) &ngx_threads[n], cycle->log) + != 0) + { + /* fatal */ + exit(2); + } + } + } + } +#endif + + for ( ;; ) { + + if (ngx_exiting) { + + c = cycle->connections; + + for (i = 0; i < cycle->connection_n; i++) { + + /* THREAD: lock */ + + if (c[i].fd != -1 && c[i].idle) { + c[i].close = 1; + c[i].read->handler(c[i].read); + } + } + + if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel) + { + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); + + ngx_worker_process_exit(cycle); + } + } + + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle"); + + ngx_process_events_and_timers(cycle); + + if (ngx_terminate) { + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); + + ngx_worker_process_exit(cycle); + } + + if (ngx_quit) { + ngx_quit = 0; + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, + "gracefully shutting down"); + ngx_setproctitle("worker process is shutting down"); + + if (!ngx_exiting) { + ngx_close_listening_sockets(cycle); + ngx_exiting = 1; + } + } + + if (ngx_reopen) { + ngx_reopen = 0; + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); + ngx_reopen_files(cycle, -1); + } + } +} + + +static void +ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker) +{ + sigset_t set; + uint64_t cpu_affinity; + ngx_int_t n; + ngx_uint_t i; + struct rlimit rlmt; + ngx_core_conf_t *ccf; + ngx_listening_t *ls; + + if (ngx_set_environment(cycle, NULL) == NULL) { + /* fatal */ + exit(2); + } + + ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); + + if (worker >= 0 && ccf->priority != 0) { + if (setpriority(PRIO_PROCESS, 0, ccf->priority) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "setpriority(%d) failed", ccf->priority); + } + } + + if (ccf->rlimit_nofile != NGX_CONF_UNSET) { + rlmt.rlim_cur = (rlim_t) ccf->rlimit_nofile; + rlmt.rlim_max = (rlim_t) ccf->rlimit_nofile; + + if (setrlimit(RLIMIT_NOFILE, &rlmt) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "setrlimit(RLIMIT_NOFILE, %i) failed", + ccf->rlimit_nofile); + } + } + + if (ccf->rlimit_core != NGX_CONF_UNSET) { + rlmt.rlim_cur = (rlim_t) ccf->rlimit_core; + rlmt.rlim_max = (rlim_t) ccf->rlimit_core; + + if (setrlimit(RLIMIT_CORE, &rlmt) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "setrlimit(RLIMIT_CORE, %O) failed", + ccf->rlimit_core); + } + } + +#ifdef RLIMIT_SIGPENDING + if (ccf->rlimit_sigpending != NGX_CONF_UNSET) { + rlmt.rlim_cur = (rlim_t) ccf->rlimit_sigpending; + rlmt.rlim_max = (rlim_t) ccf->rlimit_sigpending; + + if (setrlimit(RLIMIT_SIGPENDING, &rlmt) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "setrlimit(RLIMIT_SIGPENDING, %i) failed", + ccf->rlimit_sigpending); + } + } +#endif + + if (geteuid() == 0) { + if (setgid(ccf->group) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "setgid(%d) failed", ccf->group); + /* fatal */ + exit(2); + } + + if (initgroups(ccf->username, ccf->group) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "initgroups(%s, %d) failed", + ccf->username, ccf->group); + } + + if (setuid(ccf->user) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "setuid(%d) failed", ccf->user); + /* fatal */ + exit(2); + } + } + + if (worker >= 0) { + cpu_affinity = ngx_get_cpu_affinity(worker); + + if (cpu_affinity) { + ngx_setaffinity(cpu_affinity, cycle->log); + } + } + +#if (NGX_HAVE_PR_SET_DUMPABLE) + + /* allow coredump after setuid() in Linux 2.4.x */ + + if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "prctl(PR_SET_DUMPABLE) failed"); + } + +#endif + + if (ccf->working_directory.len) { + if (chdir((char *) ccf->working_directory.data) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "chdir(\"%s\") failed", ccf->working_directory.data); + /* fatal */ + exit(2); + } + } + + sigemptyset(&set); + + if (sigprocmask(SIG_SETMASK, &set, NULL) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "sigprocmask() failed"); + } + + /* + * disable deleting previous events for the listening sockets because + * in the worker processes there are no events at all at this point + */ + ls = cycle->listening.elts; + for (i = 0; i < cycle->listening.nelts; i++) { + ls[i].previous = NULL; + } + + for (i = 0; ngx_modules[i]; i++) { + if (ngx_modules[i]->init_process) { + if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) { + /* fatal */ + exit(2); + } + } + } + + for (n = 0; n < ngx_last_process; n++) { + + if (ngx_processes[n].pid == -1) { + continue; + } + + if (n == ngx_process_slot) { + continue; + } + + if (ngx_processes[n].channel[1] == -1) { + continue; + } + + if (close(ngx_processes[n].channel[1]) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "close() channel failed"); + } + } + + if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "close() channel failed"); + } + +#if 0 + ngx_last_process = 0; +#endif + + if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT, + ngx_channel_handler) + == NGX_ERROR) + { + /* fatal */ + exit(2); + } +} + + +static void +ngx_worker_process_exit(ngx_cycle_t *cycle) +{ + ngx_uint_t i; + ngx_connection_t *c; + +#if (NGX_THREADS) + ngx_terminate = 1; + + ngx_wakeup_worker_threads(cycle); +#endif + + for (i = 0; ngx_modules[i]; i++) { + if (ngx_modules[i]->exit_process) { + ngx_modules[i]->exit_process(cycle); + } + } + + if (ngx_exiting) { + c = cycle->connections; + for (i = 0; i < cycle->connection_n; i++) { + if (c[i].fd != -1 + && c[i].read + && !c[i].read->accept + && !c[i].read->channel + && !c[i].read->resolver) + { + ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, + "open socket #%d left in connection %ui", + c[i].fd, i); + ngx_debug_quit = 1; + } + } + + if (ngx_debug_quit) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "aborting"); + ngx_debug_point(); + } + } + + /* + * Copy ngx_cycle->log related data to the special static exit cycle, + * log, and log file structures enough to allow a signal handler to log. + * The handler may be called when standard ngx_cycle->log allocated from + * ngx_cycle->pool is already destroyed. + */ + + ngx_exit_log_file.fd = ngx_cycle->log->file->fd; + + ngx_exit_log = *ngx_cycle->log; + ngx_exit_log.file = &ngx_exit_log_file; + + ngx_exit_cycle.log = &ngx_exit_log; + ngx_exit_cycle.files = ngx_cycle->files; + ngx_exit_cycle.files_n = ngx_cycle->files_n; + ngx_cycle = &ngx_exit_cycle; + + ngx_destroy_pool(cycle->pool); + + ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, "exit"); + + exit(0); +} + + +static void +ngx_channel_handler(ngx_event_t *ev) +{ + ngx_int_t n; + ngx_channel_t ch; + ngx_connection_t *c; + + if (ev->timedout) { + ev->timedout = 0; + return; + } + + c = ev->data; + + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler"); + + for ( ;; ) { + + n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log); + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n); + + if (n == NGX_ERROR) { + + if (ngx_event_flags & NGX_USE_EPOLL_EVENT) { + ngx_del_conn(c, 0); + } + + ngx_close_connection(c); + return; + } + + if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) { + if (ngx_add_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) { + return; + } + } + + if (n == NGX_AGAIN) { + return; + } + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, + "channel command: %d", ch.command); + + switch (ch.command) { + + case NGX_CMD_QUIT: + ngx_quit = 1; + break; + + case NGX_CMD_TERMINATE: + ngx_terminate = 1; + break; + + case NGX_CMD_REOPEN: + ngx_reopen = 1; + break; + + case NGX_CMD_OPEN_CHANNEL: + + ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0, + "get channel s:%i pid:%P fd:%d", + ch.slot, ch.pid, ch.fd); + + ngx_processes[ch.slot].pid = ch.pid; + ngx_processes[ch.slot].channel[0] = ch.fd; + break; + + case NGX_CMD_CLOSE_CHANNEL: + + ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0, + "close channel s:%i pid:%P our:%P fd:%d", + ch.slot, ch.pid, ngx_processes[ch.slot].pid, + ngx_processes[ch.slot].channel[0]); + + if (close(ngx_processes[ch.slot].channel[0]) == -1) { + ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, + "close() channel failed"); + } + + ngx_processes[ch.slot].channel[0] = -1; + break; + } + } +} + + +#if (NGX_THREADS) + +static void +ngx_wakeup_worker_threads(ngx_cycle_t *cycle) +{ + ngx_int_t i; + ngx_uint_t live; + + for ( ;; ) { + + live = 0; + + for (i = 0; i < ngx_threads_n; i++) { + if (ngx_threads[i].state < NGX_THREAD_EXIT) { + if (ngx_cond_signal(ngx_threads[i].cv) == NGX_ERROR) { + ngx_threads[i].state = NGX_THREAD_DONE; + + } else { + live = 1; + } + } + + if (ngx_threads[i].state == NGX_THREAD_EXIT) { + ngx_thread_join(ngx_threads[i].tid, NULL); + ngx_threads[i].state = NGX_THREAD_DONE; + } + } + + if (live == 0) { + ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "all worker threads are joined"); + + /* STUB */ + ngx_done_events(cycle); + ngx_mutex_destroy(ngx_event_timer_mutex); + ngx_mutex_destroy(ngx_posted_events_mutex); + + return; + } + + ngx_sched_yield(); + } +} + + +static ngx_thread_value_t +ngx_worker_thread_cycle(void *data) +{ + ngx_thread_t *thr = data; + + sigset_t set; + ngx_err_t err; + ngx_core_tls_t *tls; + ngx_cycle_t *cycle; + + cycle = (ngx_cycle_t *) ngx_cycle; + + sigemptyset(&set); + sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL)); + sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL)); + sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL)); + + err = ngx_thread_sigmask(SIG_BLOCK, &set, NULL); + if (err) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, err, + ngx_thread_sigmask_n " failed"); + return (ngx_thread_value_t) 1; + } + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "thread " NGX_TID_T_FMT " started", ngx_thread_self()); + + ngx_setthrtitle("worker thread"); + + tls = ngx_calloc(sizeof(ngx_core_tls_t), cycle->log); + if (tls == NULL) { + return (ngx_thread_value_t) 1; + } + + err = ngx_thread_set_tls(ngx_core_tls_key, tls); + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, err, + ngx_thread_set_tls_n " failed"); + return (ngx_thread_value_t) 1; + } + + ngx_mutex_lock(ngx_posted_events_mutex); + + for ( ;; ) { + thr->state = NGX_THREAD_FREE; + + if (ngx_cond_wait(thr->cv, ngx_posted_events_mutex) == NGX_ERROR) { + return (ngx_thread_value_t) 1; + } + + if (ngx_terminate) { + thr->state = NGX_THREAD_EXIT; + + ngx_mutex_unlock(ngx_posted_events_mutex); + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "thread " NGX_TID_T_FMT " is done", + ngx_thread_self()); + + return (ngx_thread_value_t) 0; + } + + thr->state = NGX_THREAD_BUSY; + + if (ngx_event_thread_process_posted(cycle) == NGX_ERROR) { + return (ngx_thread_value_t) 1; + } + + if (ngx_event_thread_process_posted(cycle) == NGX_ERROR) { + return (ngx_thread_value_t) 1; + } + + if (ngx_process_changes) { + if (ngx_process_changes(cycle, 1) == NGX_ERROR) { + return (ngx_thread_value_t) 1; + } + } + } +} + +#endif + + +static void +ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data) +{ + ngx_cache_manager_ctx_t *ctx = data; + + void *ident[4]; + ngx_event_t ev; + + /* + * Set correct process type since closing listening Unix domain socket + * in a master process also removes the Unix domain socket file. + */ + ngx_process = NGX_PROCESS_HELPER; + + ngx_close_listening_sockets(cycle); + + /* Set a moderate number of connections for a helper process. */ + cycle->connection_n = 512; + + ngx_worker_process_init(cycle, -1); + + ngx_memzero(&ev, sizeof(ngx_event_t)); + ev.handler = ctx->handler; + ev.data = ident; + ev.log = cycle->log; + ident[3] = (void *) -1; + + ngx_use_accept_mutex = 0; + + ngx_setproctitle(ctx->name); + + ngx_add_timer(&ev, ctx->delay); + + for ( ;; ) { + + if (ngx_terminate || ngx_quit) { + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); + exit(0); + } + + if (ngx_reopen) { + ngx_reopen = 0; + ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); + ngx_reopen_files(cycle, -1); + } + + ngx_process_events_and_timers(cycle); + } +} + + +static void +ngx_cache_manager_process_handler(ngx_event_t *ev) +{ + time_t next, n; + ngx_uint_t i; + ngx_path_t **path; + + next = 60 * 60; + + path = ngx_cycle->paths.elts; + for (i = 0; i < ngx_cycle->paths.nelts; i++) { + + if (path[i]->manager) { + n = path[i]->manager(path[i]->data); + + next = (n <= next) ? n : next; + + ngx_time_update(); + } + } + + if (next == 0) { + next = 1; + } + + ngx_add_timer(ev, next * 1000); +} + + +static void +ngx_cache_loader_process_handler(ngx_event_t *ev) +{ + ngx_uint_t i; + ngx_path_t **path; + ngx_cycle_t *cycle; + + cycle = (ngx_cycle_t *) ngx_cycle; + + path = cycle->paths.elts; + for (i = 0; i < cycle->paths.nelts; i++) { + + if (ngx_terminate || ngx_quit) { + break; + } + + if (path[i]->loader) { + path[i]->loader(path[i]->data); + ngx_time_update(); + } + } + + exit(0); +} diff --git a/release/src/router/nginx/src/os/unix/ngx_process_cycle.h b/release/src/router/nginx/src/os/unix/ngx_process_cycle.h new file mode 100644 index 0000000000..94747b85d5 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_process_cycle.h @@ -0,0 +1,61 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_PROCESS_CYCLE_H_INCLUDED_ +#define _NGX_PROCESS_CYCLE_H_INCLUDED_ + + +#include +#include + + +#define NGX_CMD_OPEN_CHANNEL 1 +#define NGX_CMD_CLOSE_CHANNEL 2 +#define NGX_CMD_QUIT 3 +#define NGX_CMD_TERMINATE 4 +#define NGX_CMD_REOPEN 5 + + +#define NGX_PROCESS_SINGLE 0 +#define NGX_PROCESS_MASTER 1 +#define NGX_PROCESS_SIGNALLER 2 +#define NGX_PROCESS_WORKER 3 +#define NGX_PROCESS_HELPER 4 + + +typedef struct { + ngx_event_handler_pt handler; + char *name; + ngx_msec_t delay; +} ngx_cache_manager_ctx_t; + + +void ngx_master_process_cycle(ngx_cycle_t *cycle); +void ngx_single_process_cycle(ngx_cycle_t *cycle); + + +extern ngx_uint_t ngx_process; +extern ngx_pid_t ngx_pid; +extern ngx_pid_t ngx_new_binary; +extern ngx_uint_t ngx_inherited; +extern ngx_uint_t ngx_daemonized; +extern ngx_uint_t ngx_threaded; +extern ngx_uint_t ngx_exiting; + +extern sig_atomic_t ngx_reap; +extern sig_atomic_t ngx_sigio; +extern sig_atomic_t ngx_sigalrm; +extern sig_atomic_t ngx_quit; +extern sig_atomic_t ngx_debug_quit; +extern sig_atomic_t ngx_terminate; +extern sig_atomic_t ngx_noaccept; +extern sig_atomic_t ngx_reconfigure; +extern sig_atomic_t ngx_reopen; +extern sig_atomic_t ngx_change_binary; + + +#endif /* _NGX_PROCESS_CYCLE_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_pthread_thread.c b/release/src/router/nginx/src/os/unix/ngx_pthread_thread.c new file mode 100644 index 0000000000..1cf31c3bc2 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_pthread_thread.c @@ -0,0 +1,278 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +static ngx_uint_t nthreads; +static ngx_uint_t max_threads; + + +static pthread_attr_t thr_attr; + + +ngx_err_t +ngx_create_thread(ngx_tid_t *tid, ngx_thread_value_t (*func)(void *arg), + void *arg, ngx_log_t *log) +{ + int err; + + if (nthreads >= max_threads) { + ngx_log_error(NGX_LOG_CRIT, log, 0, + "no more than %ui threads can be created", max_threads); + return NGX_ERROR; + } + + err = pthread_create(tid, &thr_attr, func, arg); + + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, log, err, "pthread_create() failed"); + return err; + } + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, + "thread is created: " NGX_TID_T_FMT, *tid); + + nthreads++; + + return err; +} + + +ngx_int_t +ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle) +{ + int err; + + max_threads = n; + + err = pthread_attr_init(&thr_attr); + + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, err, + "pthread_attr_init() failed"); + return NGX_ERROR; + } + + err = pthread_attr_setstacksize(&thr_attr, size); + + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, err, + "pthread_attr_setstacksize() failed"); + return NGX_ERROR; + } + + ngx_threaded = 1; + + return NGX_OK; +} + + +ngx_mutex_t * +ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags) +{ + int err; + ngx_mutex_t *m; + + m = ngx_alloc(sizeof(ngx_mutex_t), log); + if (m == NULL) { + return NULL; + } + + m->log = log; + + err = pthread_mutex_init(&m->mutex, NULL); + + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, m->log, err, + "pthread_mutex_init() failed"); + return NULL; + } + + return m; +} + + +void +ngx_mutex_destroy(ngx_mutex_t *m) +{ + int err; + + err = pthread_mutex_destroy(&m->mutex); + + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, m->log, err, + "pthread_mutex_destroy(%p) failed", m); + } + + ngx_free(m); +} + + +void +ngx_mutex_lock(ngx_mutex_t *m) +{ + int err; + + if (!ngx_threaded) { + return; + } + + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "lock mutex %p", m); + + err = pthread_mutex_lock(&m->mutex); + + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, m->log, err, + "pthread_mutex_lock(%p) failed", m); + ngx_abort(); + } + + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "mutex %p is locked", m); + + return; +} + + +ngx_int_t +ngx_mutex_trylock(ngx_mutex_t *m) +{ + int err; + + if (!ngx_threaded) { + return NGX_OK; + } + + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "try lock mutex %p", m); + + err = pthread_mutex_trylock(&m->mutex); + + if (err == NGX_EBUSY) { + return NGX_AGAIN; + } + + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, m->log, err, + "pthread_mutex_trylock(%p) failed", m); + ngx_abort(); + } + + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "mutex %p is locked", m); + + return NGX_OK; +} + + +void +ngx_mutex_unlock(ngx_mutex_t *m) +{ + int err; + + if (!ngx_threaded) { + return; + } + + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "unlock mutex %p", m); + + err = pthread_mutex_unlock(&m->mutex); + + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, m->log, err, + "pthread_mutex_unlock(%p) failed", m); + ngx_abort(); + } + + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "mutex %p is unlocked", m); + + return; +} + + +ngx_cond_t * +ngx_cond_init(ngx_log_t *log) +{ + int err; + ngx_cond_t *cv; + + cv = ngx_alloc(sizeof(ngx_cond_t), log); + if (cv == NULL) { + return NULL; + } + + cv->log = log; + + err = pthread_cond_init(&cv->cond, NULL); + + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, cv->log, err, + "pthread_cond_init() failed"); + return NULL; + } + + return cv; +} + + +void +ngx_cond_destroy(ngx_cond_t *cv) +{ + int err; + + err = pthread_cond_destroy(&cv->cond); + + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, cv->log, err, + "pthread_cond_destroy(%p) failed", cv); + } + + ngx_free(cv); +} + + +ngx_int_t +ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m) +{ + int err; + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p wait", cv); + + err = pthread_cond_wait(&cv->cond, &m->mutex); + + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, cv->log, err, + "pthread_cond_wait(%p) failed", cv); + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p is waked up", cv); + + ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "mutex %p is locked", m); + + return NGX_OK; +} + + +ngx_int_t +ngx_cond_signal(ngx_cond_t *cv) +{ + int err; + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p to signal", cv); + + err = pthread_cond_signal(&cv->cond); + + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, cv->log, err, + "pthread_cond_signal(%p) failed", cv); + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p is signaled", cv); + + return NGX_OK; +} diff --git a/release/src/router/nginx/src/os/unix/ngx_readv_chain.c b/release/src/router/nginx/src/os/unix/ngx_readv_chain.c new file mode 100644 index 0000000000..7b6badfa82 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_readv_chain.c @@ -0,0 +1,266 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +#define NGX_IOVS 16 + + +#if (NGX_HAVE_KQUEUE) + +ssize_t +ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain) +{ + u_char *prev; + ssize_t n, size; + ngx_err_t err; + ngx_array_t vec; + ngx_event_t *rev; + struct iovec *iov, iovs[NGX_IOVS]; + + rev = c->read; + + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, + "readv: eof:%d, avail:%d, err:%d", + rev->pending_eof, rev->available, rev->kq_errno); + + if (rev->available == 0) { + if (rev->pending_eof) { + rev->ready = 0; + rev->eof = 1; + + ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno, + "kevent() reported about an closed connection"); + + if (rev->kq_errno) { + rev->error = 1; + ngx_set_socket_errno(rev->kq_errno); + return NGX_ERROR; + } + + return 0; + + } else { + return NGX_AGAIN; + } + } + } + + prev = NULL; + iov = NULL; + size = 0; + + vec.elts = iovs; + vec.nelts = 0; + vec.size = sizeof(struct iovec); + vec.nalloc = NGX_IOVS; + vec.pool = c->pool; + + /* coalesce the neighbouring bufs */ + + while (chain) { + if (prev == chain->buf->last) { + iov->iov_len += chain->buf->end - chain->buf->last; + + } else { + if (vec.nelts >= IOV_MAX) { + break; + } + + iov = ngx_array_push(&vec); + if (iov == NULL) { + return NGX_ERROR; + } + + iov->iov_base = (void *) chain->buf->last; + iov->iov_len = chain->buf->end - chain->buf->last; + } + + size += chain->buf->end - chain->buf->last; + prev = chain->buf->end; + chain = chain->next; + } + + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, + "readv: %d, last:%d", vec.nelts, iov->iov_len); + + rev = c->read; + + do { + n = readv(c->fd, (struct iovec *) vec.elts, vec.nelts); + + if (n >= 0) { + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { + rev->available -= n; + + /* + * rev->available may be negative here because some additional + * bytes may be received between kevent() and recv() + */ + + if (rev->available <= 0) { + if (!rev->pending_eof) { + rev->ready = 0; + } + + if (rev->available < 0) { + rev->available = 0; + } + } + + if (n == 0) { + + /* + * on FreeBSD recv() may return 0 on closed socket + * even if kqueue reported about available data + */ + +#if 0 + ngx_log_error(NGX_LOG_ALERT, c->log, 0, + "readv() returned 0 while kevent() reported " + "%d available bytes", rev->available); +#endif + + rev->eof = 1; + rev->available = 0; + } + + return n; + } + + if (n < size) { + rev->ready = 0; + } + + if (n == 0) { + rev->eof = 1; + } + + return n; + } + + err = ngx_socket_errno; + + if (err == NGX_EAGAIN || err == NGX_EINTR) { + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "readv() not ready"); + n = NGX_AGAIN; + + } else { + n = ngx_connection_error(c, err, "readv() failed"); + break; + } + + } while (err == NGX_EINTR); + + rev->ready = 0; + + if (n == NGX_ERROR) { + c->read->error = 1; + } + + return n; +} + +#else /* ! NGX_HAVE_KQUEUE */ + +ssize_t +ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain) +{ + u_char *prev; + ssize_t n, size; + ngx_err_t err; + ngx_array_t vec; + ngx_event_t *rev; + struct iovec *iov, iovs[NGX_IOVS]; + + prev = NULL; + iov = NULL; + size = 0; + + vec.elts = iovs; + vec.nelts = 0; + vec.size = sizeof(struct iovec); + vec.nalloc = NGX_IOVS; + vec.pool = c->pool; + + /* coalesce the neighbouring bufs */ + + while (chain) { + if (prev == chain->buf->last) { + iov->iov_len += chain->buf->end - chain->buf->last; + + } else { + if (vec.nelts >= IOV_MAX) { + break; + } + + iov = ngx_array_push(&vec); + if (iov == NULL) { + return NGX_ERROR; + } + + iov->iov_base = (void *) chain->buf->last; + iov->iov_len = chain->buf->end - chain->buf->last; + } + + size += chain->buf->end - chain->buf->last; + prev = chain->buf->end; + chain = chain->next; + } + + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, + "readv: %d:%d", vec.nelts, iov->iov_len); + + rev = c->read; + + do { + n = readv(c->fd, (struct iovec *) vec.elts, vec.nelts); + + if (n == 0) { + rev->ready = 0; + rev->eof = 1; + + return n; + + } else if (n > 0) { + + if (n < size && !(ngx_event_flags & NGX_USE_GREEDY_EVENT)) { + rev->ready = 0; + } + + return n; + } + + err = ngx_socket_errno; + + if (err == NGX_EAGAIN || err == NGX_EINTR) { + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "readv() not ready"); + n = NGX_AGAIN; + + } else { + n = ngx_connection_error(c, err, "readv() failed"); + break; + } + + } while (err == NGX_EINTR); + + rev->ready = 0; + + if (n == NGX_ERROR) { + c->read->error = 1; + } + + return n; +} + +#endif /* NGX_HAVE_KQUEUE */ diff --git a/release/src/router/nginx/src/os/unix/ngx_recv.c b/release/src/router/nginx/src/os/unix/ngx_recv.c new file mode 100644 index 0000000000..6a4a099662 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_recv.c @@ -0,0 +1,180 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +#if (NGX_HAVE_KQUEUE) + +ssize_t +ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) +{ + ssize_t n; + ngx_err_t err; + ngx_event_t *rev; + + rev = c->read; + + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, + "recv: eof:%d, avail:%d, err:%d", + rev->pending_eof, rev->available, rev->kq_errno); + + if (rev->available == 0) { + if (rev->pending_eof) { + rev->ready = 0; + rev->eof = 1; + + if (rev->kq_errno) { + rev->error = 1; + ngx_set_socket_errno(rev->kq_errno); + + return ngx_connection_error(c, rev->kq_errno, + "kevent() reported about an closed connection"); + } + + return 0; + + } else { + rev->ready = 0; + return NGX_AGAIN; + } + } + } + + do { + n = recv(c->fd, buf, size, 0); + + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, + "recv: fd:%d %d of %d", c->fd, n, size); + + if (n >= 0) { + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { + rev->available -= n; + + /* + * rev->available may be negative here because some additional + * bytes may be received between kevent() and recv() + */ + + if (rev->available <= 0) { + if (!rev->pending_eof) { + rev->ready = 0; + } + + if (rev->available < 0) { + rev->available = 0; + } + } + + if (n == 0) { + + /* + * on FreeBSD recv() may return 0 on closed socket + * even if kqueue reported about available data + */ + + rev->eof = 1; + rev->available = 0; + } + + return n; + } + + if ((size_t) n < size) { + rev->ready = 0; + } + + if (n == 0) { + rev->eof = 1; + } + + return n; + } + + err = ngx_socket_errno; + + if (err == NGX_EAGAIN || err == NGX_EINTR) { + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "recv() not ready"); + n = NGX_AGAIN; + + } else { + n = ngx_connection_error(c, err, "recv() failed"); + break; + } + + } while (err == NGX_EINTR); + + rev->ready = 0; + + if (n == NGX_ERROR) { + rev->error = 1; + } + + return n; +} + +#else /* ! NGX_HAVE_KQUEUE */ + +ssize_t +ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) +{ + ssize_t n; + ngx_err_t err; + ngx_event_t *rev; + + rev = c->read; + + do { + n = recv(c->fd, buf, size, 0); + + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, + "recv: fd:%d %d of %d", c->fd, n, size); + + if (n == 0) { + rev->ready = 0; + rev->eof = 1; + return n; + + } else if (n > 0) { + + if ((size_t) n < size + && !(ngx_event_flags & NGX_USE_GREEDY_EVENT)) + { + rev->ready = 0; + } + + return n; + } + + err = ngx_socket_errno; + + if (err == NGX_EAGAIN || err == NGX_EINTR) { + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "recv() not ready"); + n = NGX_AGAIN; + + } else { + n = ngx_connection_error(c, err, "recv() failed"); + break; + } + + } while (err == NGX_EINTR); + + rev->ready = 0; + + if (n == NGX_ERROR) { + rev->error = 1; + } + + return n; +} + +#endif /* NGX_HAVE_KQUEUE */ diff --git a/release/src/router/nginx/src/os/unix/ngx_send.c b/release/src/router/nginx/src/os/unix/ngx_send.c new file mode 100644 index 0000000000..80995ab3a5 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_send.c @@ -0,0 +1,73 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +ssize_t +ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size) +{ + ssize_t n; + ngx_err_t err; + ngx_event_t *wev; + + wev = c->write; + +#if (NGX_HAVE_KQUEUE) + + if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) { + (void) ngx_connection_error(c, wev->kq_errno, + "kevent() reported about an closed connection"); + wev->error = 1; + return NGX_ERROR; + } + +#endif + + for ( ;; ) { + n = send(c->fd, buf, size, 0); + + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, + "send: fd:%d %d of %d", c->fd, n, size); + + if (n > 0) { + if (n < (ssize_t) size) { + wev->ready = 0; + } + + c->sent += n; + + return n; + } + + err = ngx_socket_errno; + + if (n == 0) { + ngx_log_error(NGX_LOG_ALERT, c->log, err, "send() returned zero"); + wev->ready = 0; + return n; + } + + if (err == NGX_EAGAIN || err == NGX_EINTR) { + wev->ready = 0; + + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "send() not ready"); + + if (err == NGX_EAGAIN) { + return NGX_AGAIN; + } + + } else { + wev->error = 1; + (void) ngx_connection_error(c, err, "send() failed"); + return NGX_ERROR; + } + } +} diff --git a/release/src/router/nginx/src/os/unix/ngx_setaffinity.c b/release/src/router/nginx/src/os/unix/ngx_setaffinity.c new file mode 100644 index 0000000000..8f6cf35948 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_setaffinity.c @@ -0,0 +1,69 @@ + +/* + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +#if (NGX_HAVE_CPUSET_SETAFFINITY) + +#include + +void +ngx_setaffinity(uint64_t cpu_affinity, ngx_log_t *log) +{ + cpuset_t mask; + ngx_uint_t i; + + ngx_log_error(NGX_LOG_NOTICE, log, 0, + "cpuset_setaffinity(0x%08Xl)", cpu_affinity); + + CPU_ZERO(&mask); + i = 0; + do { + if (cpu_affinity & 1) { + CPU_SET(i, &mask); + } + i++; + cpu_affinity >>= 1; + } while (cpu_affinity); + + if (cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, + sizeof(cpuset_t), &mask) == -1) + { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + "cpuset_setaffinity() failed"); + } +} + +#elif (NGX_HAVE_SCHED_SETAFFINITY) + +void +ngx_setaffinity(uint64_t cpu_affinity, ngx_log_t *log) +{ + cpu_set_t mask; + ngx_uint_t i; + + ngx_log_error(NGX_LOG_NOTICE, log, 0, + "sched_setaffinity(0x%08Xl)", cpu_affinity); + + CPU_ZERO(&mask); + i = 0; + do { + if (cpu_affinity & 1) { + CPU_SET(i, &mask); + } + i++; + cpu_affinity >>= 1; + } while (cpu_affinity); + + if (sched_setaffinity(0, sizeof(cpu_set_t), &mask) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + "sched_setaffinity() failed"); + } +} + +#endif diff --git a/release/src/router/nginx/src/os/unix/ngx_setaffinity.h b/release/src/router/nginx/src/os/unix/ngx_setaffinity.h new file mode 100644 index 0000000000..33f5835dee --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_setaffinity.h @@ -0,0 +1,23 @@ + +/* + * Copyright (C) Nginx, Inc. + */ + +#ifndef _NGX_SETAFFINITY_H_INCLUDED_ +#define _NGX_SETAFFINITY_H_INCLUDED_ + + +#if (NGX_HAVE_SCHED_SETAFFINITY || NGX_HAVE_CPUSET_SETAFFINITY) + +#define NGX_HAVE_CPU_AFFINITY 1 + +void ngx_setaffinity(uint64_t cpu_affinity, ngx_log_t *log); + +#else + +#define ngx_setaffinity(cpu_affinity, log) + +#endif + + +#endif /* _NGX_SETAFFINITY_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_setproctitle.c b/release/src/router/nginx/src/os/unix/ngx_setproctitle.c new file mode 100644 index 0000000000..91afa51914 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_setproctitle.c @@ -0,0 +1,135 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +#if (NGX_SETPROCTITLE_USES_ENV) + +/* + * To change the process title in Linux and Solaris we have to set argv[1] + * to NULL and to copy the title to the same place where the argv[0] points to. + * However, argv[0] may be too small to hold a new title. Fortunately, Linux + * and Solaris store argv[] and environ[] one after another. So we should + * ensure that is the continuous memory and then we allocate the new memory + * for environ[] and copy it. After this we could use the memory starting + * from argv[0] for our process title. + * + * The Solaris's standard /bin/ps does not show the changed process title. + * You have to use "/usr/ucb/ps -w" instead. Besides, the UCB ps does not + * show a new title if its length less than the origin command line length. + * To avoid it we append to a new title the origin command line in the + * parenthesis. + */ + +extern char **environ; + +static char *ngx_os_argv_last; + +ngx_int_t +ngx_init_setproctitle(ngx_log_t *log) +{ + u_char *p; + size_t size; + ngx_uint_t i; + + size = 0; + + for (i = 0; environ[i]; i++) { + size += ngx_strlen(environ[i]) + 1; + } + + p = ngx_alloc(size, log); + if (p == NULL) { + return NGX_ERROR; + } + + ngx_os_argv_last = ngx_os_argv[0]; + + for (i = 0; ngx_os_argv[i]; i++) { + if (ngx_os_argv_last == ngx_os_argv[i]) { + ngx_os_argv_last = ngx_os_argv[i] + ngx_strlen(ngx_os_argv[i]) + 1; + } + } + + for (i = 0; environ[i]; i++) { + if (ngx_os_argv_last == environ[i]) { + + size = ngx_strlen(environ[i]) + 1; + ngx_os_argv_last = environ[i] + size; + + ngx_cpystrn(p, (u_char *) environ[i], size); + environ[i] = (char *) p; + p += size; + } + } + + ngx_os_argv_last--; + + return NGX_OK; +} + + +void +ngx_setproctitle(char *title) +{ + u_char *p; + +#if (NGX_SOLARIS) + + ngx_int_t i; + size_t size; + +#endif + + ngx_os_argv[1] = NULL; + + p = ngx_cpystrn((u_char *) ngx_os_argv[0], (u_char *) "nginx: ", + ngx_os_argv_last - ngx_os_argv[0]); + + p = ngx_cpystrn(p, (u_char *) title, ngx_os_argv_last - (char *) p); + +#if (NGX_SOLARIS) + + size = 0; + + for (i = 0; i < ngx_argc; i++) { + size += ngx_strlen(ngx_argv[i]) + 1; + } + + if (size > (size_t) ((char *) p - ngx_os_argv[0])) { + + /* + * ngx_setproctitle() is too rare operation so we use + * the non-optimized copies + */ + + p = ngx_cpystrn(p, (u_char *) " (", ngx_os_argv_last - (char *) p); + + for (i = 0; i < ngx_argc; i++) { + p = ngx_cpystrn(p, (u_char *) ngx_argv[i], + ngx_os_argv_last - (char *) p); + p = ngx_cpystrn(p, (u_char *) " ", ngx_os_argv_last - (char *) p); + } + + if (*(p - 1) == ' ') { + *(p - 1) = ')'; + } + } + +#endif + + if (ngx_os_argv_last - (char *) p) { + ngx_memset(p, NGX_SETPROCTITLE_PAD, ngx_os_argv_last - (char *) p); + } + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, + "setproctitle: \"%s\"", ngx_os_argv[0]); +} + +#endif /* NGX_SETPROCTITLE_USES_ENV */ diff --git a/release/src/router/nginx/src/os/unix/ngx_setproctitle.h b/release/src/router/nginx/src/os/unix/ngx_setproctitle.h new file mode 100644 index 0000000000..2323408c46 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_setproctitle.h @@ -0,0 +1,52 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_SETPROCTITLE_H_INCLUDED_ +#define _NGX_SETPROCTITLE_H_INCLUDED_ + + +#if (NGX_HAVE_SETPROCTITLE) + +/* FreeBSD, NetBSD, OpenBSD */ + +#define ngx_init_setproctitle(log) +#define ngx_setproctitle(title) setproctitle("%s", title) + + +#else /* !NGX_HAVE_SETPROCTITLE */ + +#if !defined NGX_SETPROCTITLE_USES_ENV + +#if (NGX_SOLARIS) + +#define NGX_SETPROCTITLE_USES_ENV 1 +#define NGX_SETPROCTITLE_PAD ' ' + +ngx_int_t ngx_init_setproctitle(ngx_log_t *log); +void ngx_setproctitle(char *title); + +#elif (NGX_LINUX) || (NGX_DARWIN) + +#define NGX_SETPROCTITLE_USES_ENV 1 +#define NGX_SETPROCTITLE_PAD '\0' + +ngx_int_t ngx_init_setproctitle(ngx_log_t *log); +void ngx_setproctitle(char *title); + +#else + +#define ngx_init_setproctitle(log) +#define ngx_setproctitle(title) + +#endif /* OSes */ + +#endif /* NGX_SETPROCTITLE_USES_ENV */ + +#endif /* NGX_HAVE_SETPROCTITLE */ + + +#endif /* _NGX_SETPROCTITLE_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_shmem.c b/release/src/router/nginx/src/os/unix/ngx_shmem.c new file mode 100644 index 0000000000..3ec7cbf1fd --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_shmem.c @@ -0,0 +1,126 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +#if (NGX_HAVE_MAP_ANON) + +ngx_int_t +ngx_shm_alloc(ngx_shm_t *shm) +{ + shm->addr = (u_char *) mmap(NULL, shm->size, + PROT_READ|PROT_WRITE, + MAP_ANON|MAP_SHARED, -1, 0); + + if (shm->addr == MAP_FAILED) { + ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, + "mmap(MAP_ANON|MAP_SHARED, %uz) failed", shm->size); + return NGX_ERROR; + } + + return NGX_OK; +} + + +void +ngx_shm_free(ngx_shm_t *shm) +{ + if (munmap((void *) shm->addr, shm->size) == -1) { + ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, + "munmap(%p, %uz) failed", shm->addr, shm->size); + } +} + +#elif (NGX_HAVE_MAP_DEVZERO) + +ngx_int_t +ngx_shm_alloc(ngx_shm_t *shm) +{ + ngx_fd_t fd; + + fd = open("/dev/zero", O_RDWR); + + if (fd == -1) { + ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, + "open(\"/dev/zero\") failed"); + return NGX_ERROR; + } + + shm->addr = (u_char *) mmap(NULL, shm->size, PROT_READ|PROT_WRITE, + MAP_SHARED, fd, 0); + + if (shm->addr == MAP_FAILED) { + ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, + "mmap(/dev/zero, MAP_SHARED, %uz) failed", shm->size); + } + + if (close(fd) == -1) { + ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, + "close(\"/dev/zero\") failed"); + } + + return (shm->addr == MAP_FAILED) ? NGX_ERROR : NGX_OK; +} + + +void +ngx_shm_free(ngx_shm_t *shm) +{ + if (munmap((void *) shm->addr, shm->size) == -1) { + ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, + "munmap(%p, %uz) failed", shm->addr, shm->size); + } +} + +#elif (NGX_HAVE_SYSVSHM) + +#include +#include + + +ngx_int_t +ngx_shm_alloc(ngx_shm_t *shm) +{ + int id; + + id = shmget(IPC_PRIVATE, shm->size, (SHM_R|SHM_W|IPC_CREAT)); + + if (id == -1) { + ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, + "shmget(%uz) failed", shm->size); + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, shm->log, 0, "shmget id: %d", id); + + shm->addr = shmat(id, NULL, 0); + + if (shm->addr == (void *) -1) { + ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, "shmat() failed"); + } + + if (shmctl(id, IPC_RMID, NULL) == -1) { + ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, + "shmctl(IPC_RMID) failed"); + } + + return (shm->addr == (void *) -1) ? NGX_ERROR : NGX_OK; +} + + +void +ngx_shm_free(ngx_shm_t *shm) +{ + if (shmdt(shm->addr) == -1) { + ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, + "shmdt(%p) failed", shm->addr); + } +} + +#endif diff --git a/release/src/router/nginx/src/os/unix/ngx_shmem.h b/release/src/router/nginx/src/os/unix/ngx_shmem.h new file mode 100644 index 0000000000..566a7d3300 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_shmem.h @@ -0,0 +1,29 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_SHMEM_H_INCLUDED_ +#define _NGX_SHMEM_H_INCLUDED_ + + +#include +#include + + +typedef struct { + u_char *addr; + size_t size; + ngx_str_t name; + ngx_log_t *log; + ngx_uint_t exists; /* unsigned exists:1; */ +} ngx_shm_t; + + +ngx_int_t ngx_shm_alloc(ngx_shm_t *shm); +void ngx_shm_free(ngx_shm_t *shm); + + +#endif /* _NGX_SHMEM_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_socket.c b/release/src/router/nginx/src/os/unix/ngx_socket.c new file mode 100644 index 0000000000..3978f655c0 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_socket.c @@ -0,0 +1,116 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +/* + * ioctl(FIONBIO) sets a non-blocking mode with the single syscall + * while fcntl(F_SETFL, O_NONBLOCK) needs to learn the current state + * using fcntl(F_GETFL). + * + * ioctl() and fcntl() are syscalls at least in FreeBSD 2.x, Linux 2.2 + * and Solaris 7. + * + * ioctl() in Linux 2.4 and 2.6 uses BKL, however, fcntl(F_SETFL) uses it too. + */ + + +#if (NGX_HAVE_FIONBIO) + +int +ngx_nonblocking(ngx_socket_t s) +{ + int nb; + + nb = 1; + + return ioctl(s, FIONBIO, &nb); +} + + +int +ngx_blocking(ngx_socket_t s) +{ + int nb; + + nb = 0; + + return ioctl(s, FIONBIO, &nb); +} + +#endif + + +#if (NGX_FREEBSD) + +int +ngx_tcp_nopush(ngx_socket_t s) +{ + int tcp_nopush; + + tcp_nopush = 1; + + return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH, + (const void *) &tcp_nopush, sizeof(int)); +} + + +int +ngx_tcp_push(ngx_socket_t s) +{ + int tcp_nopush; + + tcp_nopush = 0; + + return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH, + (const void *) &tcp_nopush, sizeof(int)); +} + +#elif (NGX_LINUX) + + +int +ngx_tcp_nopush(ngx_socket_t s) +{ + int cork; + + cork = 1; + + return setsockopt(s, IPPROTO_TCP, TCP_CORK, + (const void *) &cork, sizeof(int)); +} + + +int +ngx_tcp_push(ngx_socket_t s) +{ + int cork; + + cork = 0; + + return setsockopt(s, IPPROTO_TCP, TCP_CORK, + (const void *) &cork, sizeof(int)); +} + +#else + +int +ngx_tcp_nopush(ngx_socket_t s) +{ + return 0; +} + + +int +ngx_tcp_push(ngx_socket_t s) +{ + return 0; +} + +#endif diff --git a/release/src/router/nginx/src/os/unix/ngx_socket.h b/release/src/router/nginx/src/os/unix/ngx_socket.h new file mode 100644 index 0000000000..fcc5153356 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_socket.h @@ -0,0 +1,64 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_SOCKET_H_INCLUDED_ +#define _NGX_SOCKET_H_INCLUDED_ + + +#include + + +#define NGX_WRITE_SHUTDOWN SHUT_WR + +typedef int ngx_socket_t; + +#define ngx_socket socket +#define ngx_socket_n "socket()" + + +#if (NGX_HAVE_FIONBIO) + +int ngx_nonblocking(ngx_socket_t s); +int ngx_blocking(ngx_socket_t s); + +#define ngx_nonblocking_n "ioctl(FIONBIO)" +#define ngx_blocking_n "ioctl(!FIONBIO)" + +#else + +#define ngx_nonblocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK) +#define ngx_nonblocking_n "fcntl(O_NONBLOCK)" + +#define ngx_blocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) & ~O_NONBLOCK) +#define ngx_blocking_n "fcntl(!O_NONBLOCK)" + +#endif + +int ngx_tcp_nopush(ngx_socket_t s); +int ngx_tcp_push(ngx_socket_t s); + +#if (NGX_LINUX) + +#define ngx_tcp_nopush_n "setsockopt(TCP_CORK)" +#define ngx_tcp_push_n "setsockopt(!TCP_CORK)" + +#else + +#define ngx_tcp_nopush_n "setsockopt(TCP_NOPUSH)" +#define ngx_tcp_push_n "setsockopt(!TCP_NOPUSH)" + +#endif + + +#define ngx_shutdown_socket shutdown +#define ngx_shutdown_socket_n "shutdown()" + +#define ngx_close_socket close +#define ngx_close_socket_n "close() socket" + + +#endif /* _NGX_SOCKET_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_solaris.h b/release/src/router/nginx/src/os/unix/ngx_solaris.h new file mode 100644 index 0000000000..7b167d830a --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_solaris.h @@ -0,0 +1,16 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_SOLARIS_H_INCLUDED_ +#define _NGX_SOLARIS_H_INCLUDED_ + + +ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, + off_t limit); + + +#endif /* _NGX_SOLARIS_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_solaris_config.h b/release/src/router/nginx/src/os/unix/ngx_solaris_config.h new file mode 100644 index 0000000000..e664ba826c --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_solaris_config.h @@ -0,0 +1,109 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_SOLARIS_CONFIG_H_INCLUDED_ +#define _NGX_SOLARIS_CONFIG_H_INCLUDED_ + + +#ifndef _REENTRANT +#define _REENTRANT +#endif + +#define _FILE_OFFSET_BITS 64 /* must be before */ + +#include +#include +#include +#include +#include /* offsetof() */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* statvfs() */ + +#include /* FIONBIO */ +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include /* TCP_NODELAY */ +#include +#include +#include + +#include +#include /* IOV_MAX */ +#include +#include + +#define NGX_ALIGNMENT _MAX_ALIGNMENT + +#include + + +#if (NGX_HAVE_POSIX_SEM) +#include +#endif + + +#if (NGX_HAVE_POLL) +#include +#endif + + +#if (NGX_HAVE_DEVPOLL) +#include +#include +#endif + + +#if (NGX_HAVE_EVENTPORT) +#include +#endif + + +#if (NGX_HAVE_SENDFILE) +#include +#endif + + +#define NGX_LISTEN_BACKLOG 511 + + +#ifndef NGX_HAVE_INHERITED_NONBLOCK +#define NGX_HAVE_INHERITED_NONBLOCK 1 +#endif + + +#ifndef NGX_HAVE_SO_SNDLOWAT +/* setsockopt(SO_SNDLOWAT) returns ENOPROTOOPT */ +#define NGX_HAVE_SO_SNDLOWAT 0 +#endif + + +#define NGX_HAVE_OS_SPECIFIC_INIT 1 +#define ngx_debug_init() + + +extern char **environ; + + +#endif /* _NGX_SOLARIS_CONFIG_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_solaris_init.c b/release/src/router/nginx/src/os/unix/ngx_solaris_init.c new file mode 100644 index 0000000000..f2f3600dab --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_solaris_init.c @@ -0,0 +1,75 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +char ngx_solaris_sysname[20]; +char ngx_solaris_release[10]; +char ngx_solaris_version[50]; + + +static ngx_os_io_t ngx_solaris_io = { + ngx_unix_recv, + ngx_readv_chain, + ngx_udp_unix_recv, + ngx_unix_send, +#if (NGX_HAVE_SENDFILE) + ngx_solaris_sendfilev_chain, + NGX_IO_SENDFILE +#else + ngx_writev_chain, + 0 +#endif +}; + + +ngx_int_t +ngx_os_specific_init(ngx_log_t *log) +{ + if (sysinfo(SI_SYSNAME, ngx_solaris_sysname, sizeof(ngx_solaris_sysname)) + == -1) + { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + "sysinfo(SI_SYSNAME) failed"); + return NGX_ERROR; + } + + if (sysinfo(SI_RELEASE, ngx_solaris_release, sizeof(ngx_solaris_release)) + == -1) + { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + "sysinfo(SI_RELEASE) failed"); + return NGX_ERROR; + } + + if (sysinfo(SI_VERSION, ngx_solaris_version, sizeof(ngx_solaris_version)) + == -1) + { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + "sysinfo(SI_SYSNAME) failed"); + return NGX_ERROR; + } + + + ngx_os_io = ngx_solaris_io; + + return NGX_OK; +} + + +void +ngx_os_specific_status(ngx_log_t *log) +{ + + ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s", + ngx_solaris_sysname, ngx_solaris_release); + + ngx_log_error(NGX_LOG_NOTICE, log, 0, "version: %s", + ngx_solaris_version); +} diff --git a/release/src/router/nginx/src/os/unix/ngx_solaris_sendfilev_chain.c b/release/src/router/nginx/src/os/unix/ngx_solaris_sendfilev_chain.c new file mode 100644 index 0000000000..520eaaab4c --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_solaris_sendfilev_chain.c @@ -0,0 +1,262 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +#if (NGX_TEST_BUILD_SOLARIS_SENDFILEV) + +/* Solaris declarations */ + +typedef struct sendfilevec { + int sfv_fd; + u_int sfv_flag; + off_t sfv_off; + size_t sfv_len; +} sendfilevec_t; + +#define SFV_FD_SELF -2 + +static ssize_t sendfilev(int fd, const struct sendfilevec *vec, + int sfvcnt, size_t *xferred) +{ + return -1; +} + +ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, + off_t limit); + +#endif + + +#if (IOV_MAX > 64) +#define NGX_SENDFILEVECS 64 +#else +#define NGX_SENDFILEVECS IOV_MAX +#endif + + + +ngx_chain_t * +ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) +{ + int fd; + u_char *prev; + off_t size, send, prev_send, aligned, fprev; + size_t sent; + ssize_t n; + ngx_int_t eintr, complete; + ngx_err_t err; + sendfilevec_t *sfv, sfvs[NGX_SENDFILEVECS]; + ngx_array_t vec; + ngx_event_t *wev; + ngx_chain_t *cl; + + wev = c->write; + + if (!wev->ready) { + return in; + } + + if (!c->sendfile) { + return ngx_writev_chain(c, in, limit); + } + + + /* the maximum limit size is the maximum size_t value - the page size */ + + if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { + limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; + } + + + send = 0; + + vec.elts = sfvs; + vec.size = sizeof(sendfilevec_t); + vec.nalloc = NGX_SENDFILEVECS; + vec.pool = c->pool; + + for ( ;; ) { + fd = SFV_FD_SELF; + prev = NULL; + fprev = 0; + sfv = NULL; + eintr = 0; + complete = 0; + sent = 0; + prev_send = send; + + vec.nelts = 0; + + /* create the sendfilevec and coalesce the neighbouring bufs */ + + for (cl = in; cl && send < limit; cl = cl->next) { + + if (ngx_buf_special(cl->buf)) { + continue; + } + + if (ngx_buf_in_memory_only(cl->buf)) { + fd = SFV_FD_SELF; + + size = cl->buf->last - cl->buf->pos; + + if (send + size > limit) { + size = limit - send; + } + + if (prev == cl->buf->pos) { + sfv->sfv_len += (size_t) size; + + } else { + if (vec.nelts >= IOV_MAX) { + break; + } + + sfv = ngx_array_push(&vec); + if (sfv == NULL) { + return NGX_CHAIN_ERROR; + } + + sfv->sfv_fd = SFV_FD_SELF; + sfv->sfv_flag = 0; + sfv->sfv_off = (off_t) (uintptr_t) cl->buf->pos; + sfv->sfv_len = (size_t) size; + } + + prev = cl->buf->pos + (size_t) size; + send += size; + + } else { + prev = NULL; + + size = cl->buf->file_last - cl->buf->file_pos; + + if (send + size > limit) { + size = limit - send; + + aligned = (cl->buf->file_pos + size + ngx_pagesize - 1) + & ~((off_t) ngx_pagesize - 1); + + if (aligned <= cl->buf->file_last) { + size = aligned - cl->buf->file_pos; + } + } + + if (fd == cl->buf->file->fd && fprev == cl->buf->file_pos) { + sfv->sfv_len += (size_t) size; + + } else { + if (vec.nelts >= IOV_MAX) { + break; + } + + sfv = ngx_array_push(&vec); + if (sfv == NULL) { + return NGX_CHAIN_ERROR; + } + + fd = cl->buf->file->fd; + sfv->sfv_fd = fd; + sfv->sfv_flag = 0; + sfv->sfv_off = cl->buf->file_pos; + sfv->sfv_len = (size_t) size; + } + + fprev = cl->buf->file_pos + size; + send += size; + } + } + + n = sendfilev(c->fd, vec.elts, vec.nelts, &sent); + + if (n == -1) { + err = ngx_errno; + + switch (err) { + case NGX_EAGAIN: + break; + + case NGX_EINTR: + eintr = 1; + break; + + default: + wev->error = 1; + ngx_connection_error(c, err, "sendfilev() failed"); + return NGX_CHAIN_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, + "sendfilev() sent only %uz bytes", sent); + } + + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, + "sendfilev: %z %z", n, sent); + + if (send - prev_send == (off_t) sent) { + complete = 1; + } + + c->sent += sent; + + for (cl = in; cl; cl = cl->next) { + + if (ngx_buf_special(cl->buf)) { + continue; + } + + if (sent == 0) { + break; + } + + size = ngx_buf_size(cl->buf); + + if ((off_t) sent >= size) { + sent = (size_t) ((off_t) sent - size); + + if (ngx_buf_in_memory(cl->buf)) { + cl->buf->pos = cl->buf->last; + } + + if (cl->buf->in_file) { + cl->buf->file_pos = cl->buf->file_last; + } + + continue; + } + + if (ngx_buf_in_memory(cl->buf)) { + cl->buf->pos += sent; + } + + if (cl->buf->in_file) { + cl->buf->file_pos += sent; + } + + break; + } + + if (eintr) { + continue; + } + + if (!complete) { + wev->ready = 0; + return cl; + } + + if (send >= limit || cl == NULL) { + return cl; + } + + in = cl; + } +} diff --git a/release/src/router/nginx/src/os/unix/ngx_sunpro_amd64.il b/release/src/router/nginx/src/os/unix/ngx_sunpro_amd64.il new file mode 100644 index 0000000000..dc454b20b2 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_sunpro_amd64.il @@ -0,0 +1,43 @@ +/ +/ Copyright (C) Igor Sysoev +/ Copyright (C) Nginx, Inc. +/ + +/ ngx_atomic_uint_t ngx_atomic_cmp_set(ngx_atomic_t *lock, +/ ngx_atomic_uint_t old, ngx_atomic_uint_t set); +/ +/ the arguments are passed in %rdi, %rsi, %rdx +/ the result is returned in the %rax + + .inline ngx_atomic_cmp_set,0 + movq %rsi, %rax + lock + cmpxchgq %rdx, (%rdi) + setz %al + movzbq %al, %rax + .end + + +/ ngx_atomic_int_t ngx_atomic_fetch_add(ngx_atomic_t *value, +/ ngx_atomic_int_t add); +/ +/ the arguments are passed in %rdi, %rsi +/ the result is returned in the %rax + + .inline ngx_atomic_fetch_add,0 + movq %rsi, %rax + lock + xaddq %rax, (%rdi) + .end + + +/ ngx_cpu_pause() +/ +/ the "rep; nop" is used instead of "pause" to avoid the "[ PAUSE ]" hardware +/ capability added by linker because Solaris/amd64 does not know about it: +/ +/ ld.so.1: nginx: fatal: hardware capability unsupported: 0x2000 [ PAUSE ] + + .inline ngx_cpu_pause,0 + rep; nop + .end diff --git a/release/src/router/nginx/src/os/unix/ngx_sunpro_atomic_sparc64.h b/release/src/router/nginx/src/os/unix/ngx_sunpro_atomic_sparc64.h new file mode 100644 index 0000000000..5f280553c9 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_sunpro_atomic_sparc64.h @@ -0,0 +1,61 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#if (NGX_PTR_SIZE == 4) +#define NGX_CASA ngx_casa +#else +#define NGX_CASA ngx_casxa +#endif + + +ngx_atomic_uint_t +ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock); + +ngx_atomic_uint_t +ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock); + +/* the code in src/os/unix/ngx_sunpro_sparc64.il */ + + +static ngx_inline ngx_atomic_uint_t +ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, + ngx_atomic_uint_t set) +{ + set = NGX_CASA(set, old, lock); + + return (set == old); +} + + +static ngx_inline ngx_atomic_int_t +ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) +{ + ngx_atomic_uint_t old, res; + + old = *value; + + for ( ;; ) { + + res = old + add; + + res = NGX_CASA(res, old, value); + + if (res == old) { + return res; + } + + old = res; + } +} + + +#define ngx_memory_barrier() \ + __asm (".volatile"); \ + __asm ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad"); \ + __asm (".nonvolatile") + +#define ngx_cpu_pause() diff --git a/release/src/router/nginx/src/os/unix/ngx_sunpro_sparc64.il b/release/src/router/nginx/src/os/unix/ngx_sunpro_sparc64.il new file mode 100644 index 0000000000..bdeef61250 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_sunpro_sparc64.il @@ -0,0 +1,36 @@ +/ +/ Copyright (C) Igor Sysoev +/ Copyright (C) Nginx, Inc. +/ + + +/ "casa [%o2] 0x80, %o1, %o0" and +/ "casxa [%o2] 0x80, %o1, %o0" do the following: +/ +/ if ([%o2] == %o1) { +/ swap(%o0, [%o2]); +/ } else { +/ %o0 = [%o2]; +/ } + + +/ ngx_atomic_uint_t ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, +/ ngx_atomic_t *lock); +/ +/ the arguments are passed in the %o0, %o1, %o2 +/ the result is returned in the %o0 + + .inline ngx_casa,0 + casa [%o2] 0x80, %o1, %o0 + .end + + +/ ngx_atomic_uint_t ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, +/ ngx_atomic_t *lock); +/ +/ the arguments are passed in the %o0, %o1, %o2 +/ the result is returned in the %o0 + + .inline ngx_casxa,0 + casxa [%o2] 0x80, %o1, %o0 + .end diff --git a/release/src/router/nginx/src/os/unix/ngx_sunpro_x86.il b/release/src/router/nginx/src/os/unix/ngx_sunpro_x86.il new file mode 100644 index 0000000000..fd1cc00492 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_sunpro_x86.il @@ -0,0 +1,44 @@ +/ +/ Copyright (C) Igor Sysoev +/ Copyright (C) Nginx, Inc. +/ + +/ ngx_atomic_uint_t ngx_atomic_cmp_set(ngx_atomic_t *lock, +/ ngx_atomic_uint_t old, ngx_atomic_uint_t set); +/ +/ the arguments are passed on stack (%esp), 4(%esp), 8(%esp) + + .inline ngx_atomic_cmp_set,0 + movl (%esp), %ecx + movl 4(%esp), %eax + movl 8(%esp), %edx + lock + cmpxchgl %edx, (%ecx) + setz %al + movzbl %al, %eax + .end + + +/ ngx_atomic_int_t ngx_atomic_fetch_add(ngx_atomic_t *value, +/ ngx_atomic_int_t add); +/ +/ the arguments are passed on stack (%esp), 4(%esp) + + .inline ngx_atomic_fetch_add,0 + movl (%esp), %ecx + movl 4(%esp), %eax + lock + xaddl %eax, (%ecx) + .end + + +/ ngx_cpu_pause() +/ +/ the "rep; nop" is used instead of "pause" to avoid the "[ PAUSE ]" hardware +/ capability added by linker because Solaris/i386 does not know about it: +/ +/ ld.so.1: nginx: fatal: hardware capability unsupported: 0x2000 [ PAUSE ] + + .inline ngx_cpu_pause,0 + rep; nop + .end diff --git a/release/src/router/nginx/src/os/unix/ngx_thread.h b/release/src/router/nginx/src/os/unix/ngx_thread.h new file mode 100644 index 0000000000..49c5d5656a --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_thread.h @@ -0,0 +1,128 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_THREAD_H_INCLUDED_ +#define _NGX_THREAD_H_INCLUDED_ + + +#include +#include + +#if (NGX_THREADS) + +#define NGX_MAX_THREADS 128 + +#if (NGX_USE_RFORK) +#include + + +#else /* use pthreads */ + +#include + +typedef pthread_t ngx_tid_t; + +#define ngx_thread_self() pthread_self() +#define ngx_log_tid (int) ngx_thread_self() + +#if (NGX_FREEBSD) && !(NGX_LINUXTHREADS) +#define NGX_TID_T_FMT "%p" +#else +#define NGX_TID_T_FMT "%d" +#endif + + +typedef pthread_key_t ngx_tls_key_t; + +#define ngx_thread_key_create(key) pthread_key_create(key, NULL) +#define ngx_thread_key_create_n "pthread_key_create()" +#define ngx_thread_set_tls pthread_setspecific +#define ngx_thread_set_tls_n "pthread_setspecific()" +#define ngx_thread_get_tls pthread_getspecific + + +#define NGX_MUTEX_LIGHT 0 + +typedef struct { + pthread_mutex_t mutex; + ngx_log_t *log; +} ngx_mutex_t; + +typedef struct { + pthread_cond_t cond; + ngx_log_t *log; +} ngx_cond_t; + +#define ngx_thread_sigmask pthread_sigmask +#define ngx_thread_sigmask_n "pthread_sigmask()" + +#define ngx_thread_join(t, p) pthread_join(t, p) + +#define ngx_setthrtitle(n) + + + +ngx_int_t ngx_mutex_trylock(ngx_mutex_t *m); +void ngx_mutex_lock(ngx_mutex_t *m); +void ngx_mutex_unlock(ngx_mutex_t *m); + +#endif + + +#define ngx_thread_volatile volatile + + +typedef struct { + ngx_tid_t tid; + ngx_cond_t *cv; + ngx_uint_t state; +} ngx_thread_t; + +#define NGX_THREAD_FREE 1 +#define NGX_THREAD_BUSY 2 +#define NGX_THREAD_EXIT 3 +#define NGX_THREAD_DONE 4 + +extern ngx_int_t ngx_threads_n; +extern volatile ngx_thread_t ngx_threads[NGX_MAX_THREADS]; + + +typedef void * ngx_thread_value_t; + +ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle); +ngx_err_t ngx_create_thread(ngx_tid_t *tid, + ngx_thread_value_t (*func)(void *arg), void *arg, ngx_log_t *log); + +ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags); +void ngx_mutex_destroy(ngx_mutex_t *m); + + +ngx_cond_t *ngx_cond_init(ngx_log_t *log); +void ngx_cond_destroy(ngx_cond_t *cv); +ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m); +ngx_int_t ngx_cond_signal(ngx_cond_t *cv); + + +#else /* !NGX_THREADS */ + +#define ngx_thread_volatile + +#define ngx_log_tid 0 +#define NGX_TID_T_FMT "%d" + +#define ngx_mutex_trylock(m) NGX_OK +#define ngx_mutex_lock(m) +#define ngx_mutex_unlock(m) + +#define ngx_cond_signal(cv) + +#define ngx_thread_main() 1 + +#endif + + +#endif /* _NGX_THREAD_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_time.c b/release/src/router/nginx/src/os/unix/ngx_time.c new file mode 100644 index 0000000000..cc760b2eb0 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_time.c @@ -0,0 +1,104 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +/* + * FreeBSD does not test /etc/localtime change, however, we can workaround it + * by calling tzset() with TZ and then without TZ to update timezone. + * The trick should work since FreeBSD 2.1.0. + * + * Linux does not test /etc/localtime change in localtime(), + * but may stat("/etc/localtime") several times in every strftime(), + * therefore we use it to update timezone. + * + * Solaris does not test /etc/TIMEZONE change too and no workaround available. + */ + +void +ngx_timezone_update(void) +{ +#if (NGX_FREEBSD) + + if (getenv("TZ")) { + return; + } + + putenv("TZ=UTC"); + + tzset(); + + unsetenv("TZ"); + + tzset(); + +#elif (NGX_LINUX) + time_t s; + struct tm *t; + char buf[4]; + + s = time(0); + + t = localtime(&s); + + strftime(buf, 4, "%H", t); + +#endif +} + + +void +ngx_localtime(time_t s, ngx_tm_t *tm) +{ +#if (NGX_HAVE_LOCALTIME_R) + (void) localtime_r(&s, tm); + +#else + ngx_tm_t *t; + + t = localtime(&s); + *tm = *t; + +#endif + + tm->ngx_tm_mon++; + tm->ngx_tm_year += 1900; +} + + +void +ngx_libc_localtime(time_t s, struct tm *tm) +{ +#if (NGX_HAVE_LOCALTIME_R) + (void) localtime_r(&s, tm); + +#else + struct tm *t; + + t = localtime(&s); + *tm = *t; + +#endif +} + + +void +ngx_libc_gmtime(time_t s, struct tm *tm) +{ +#if (NGX_HAVE_LOCALTIME_R) + (void) gmtime_r(&s, tm); + +#else + struct tm *t; + + t = gmtime(&s); + *tm = *t; + +#endif +} diff --git a/release/src/router/nginx/src/os/unix/ngx_time.h b/release/src/router/nginx/src/os/unix/ngx_time.h new file mode 100644 index 0000000000..c128c9aa04 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_time.h @@ -0,0 +1,66 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_TIME_H_INCLUDED_ +#define _NGX_TIME_H_INCLUDED_ + + +#include +#include + + +typedef ngx_rbtree_key_t ngx_msec_t; +typedef ngx_rbtree_key_int_t ngx_msec_int_t; + +typedef struct tm ngx_tm_t; + +#define ngx_tm_sec tm_sec +#define ngx_tm_min tm_min +#define ngx_tm_hour tm_hour +#define ngx_tm_mday tm_mday +#define ngx_tm_mon tm_mon +#define ngx_tm_year tm_year +#define ngx_tm_wday tm_wday +#define ngx_tm_isdst tm_isdst + +#define ngx_tm_sec_t int +#define ngx_tm_min_t int +#define ngx_tm_hour_t int +#define ngx_tm_mday_t int +#define ngx_tm_mon_t int +#define ngx_tm_year_t int +#define ngx_tm_wday_t int + + +#if (NGX_HAVE_GMTOFF) +#define ngx_tm_gmtoff tm_gmtoff +#define ngx_tm_zone tm_zone +#endif + + +#if (NGX_SOLARIS) + +#define ngx_timezone(isdst) (- (isdst ? altzone : timezone) / 60) + +#else + +#define ngx_timezone(isdst) (- (isdst ? timezone + 3600 : timezone) / 60) + +#endif + + +void ngx_timezone_update(void); +void ngx_localtime(time_t s, ngx_tm_t *tm); +void ngx_libc_localtime(time_t s, struct tm *tm); +void ngx_libc_gmtime(time_t s, struct tm *tm); + +#define ngx_gettimeofday(tp) (void) gettimeofday(tp, NULL); +#define ngx_msleep(ms) (void) usleep(ms * 1000) +#define ngx_sleep(s) (void) sleep(s) + + +#endif /* _NGX_TIME_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_udp_recv.c b/release/src/router/nginx/src/os/unix/ngx_udp_recv.c new file mode 100644 index 0000000000..1c807a08bb --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_udp_recv.c @@ -0,0 +1,115 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +#if (NGX_HAVE_KQUEUE) + +ssize_t +ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) +{ + ssize_t n; + ngx_err_t err; + ngx_event_t *rev; + + rev = c->read; + + do { + n = recv(c->fd, buf, size, 0); + + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, + "recv: fd:%d %d of %d", c->fd, n, size); + + if (n >= 0) { + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { + rev->available -= n; + + /* + * rev->available may be negative here because some additional + * bytes may be received between kevent() and recv() + */ + + if (rev->available <= 0) { + rev->ready = 0; + rev->available = 0; + } + } + + return n; + } + + err = ngx_socket_errno; + + if (err == NGX_EAGAIN || err == NGX_EINTR) { + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "recv() not ready"); + n = NGX_AGAIN; + + } else { + n = ngx_connection_error(c, err, "recv() failed"); + break; + } + + } while (err == NGX_EINTR); + + rev->ready = 0; + + if (n == NGX_ERROR) { + rev->error = 1; + } + + return n; +} + +#else /* ! NGX_HAVE_KQUEUE */ + +ssize_t +ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) +{ + ssize_t n; + ngx_err_t err; + ngx_event_t *rev; + + rev = c->read; + + do { + n = recv(c->fd, buf, size, 0); + + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, + "recv: fd:%d %d of %d", c->fd, n, size); + + if (n >= 0) { + return n; + } + + err = ngx_socket_errno; + + if (err == NGX_EAGAIN || err == NGX_EINTR) { + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "recv() not ready"); + n = NGX_AGAIN; + + } else { + n = ngx_connection_error(c, err, "recv() failed"); + break; + } + + } while (err == NGX_EINTR); + + rev->ready = 0; + + if (n == NGX_ERROR) { + rev->error = 1; + } + + return n; +} + +#endif /* NGX_HAVE_KQUEUE */ diff --git a/release/src/router/nginx/src/os/unix/ngx_user.c b/release/src/router/nginx/src/os/unix/ngx_user.c new file mode 100644 index 0000000000..7a71203cb8 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_user.c @@ -0,0 +1,108 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + + +/* + * Solaris has thread-safe crypt() + * Linux has crypt_r(); "struct crypt_data" is more than 128K + * FreeBSD needs the mutex to protect crypt() + * + * TODO: + * ngx_crypt_init() to init mutex + */ + + +#if (NGX_CRYPT) + +#if (NGX_HAVE_GNU_CRYPT_R) + +ngx_int_t +ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) +{ + char *value; + size_t len; + struct crypt_data cd; + + cd.initialized = 0; + /* work around the glibc bug */ + cd.current_salt[0] = ~salt[0]; + + value = crypt_r((char *) key, (char *) salt, &cd); + + if (value) { + len = ngx_strlen(value) + 1; + + *encrypted = ngx_pnalloc(pool, len); + if (*encrypted == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(*encrypted, value, len); + return NGX_OK; + } + + ngx_log_error(NGX_LOG_CRIT, pool->log, ngx_errno, "crypt_r() failed"); + + return NGX_ERROR; +} + +#else + +ngx_int_t +ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) +{ + char *value; + size_t len; + ngx_err_t err; + +#if (NGX_THREADS && NGX_NONREENTRANT_CRYPT) + + /* crypt() is a time consuming function, so we only try to lock */ + + if (ngx_mutex_trylock(ngx_crypt_mutex) != NGX_OK) { + return NGX_AGAIN; + } + +#endif + + value = crypt((char *) key, (char *) salt); + + if (value) { + len = ngx_strlen(value) + 1; + + *encrypted = ngx_pnalloc(pool, len); + if (*encrypted == NULL) { +#if (NGX_THREADS && NGX_NONREENTRANT_CRYPT) + ngx_mutex_unlock(ngx_crypt_mutex); +#endif + return NGX_ERROR; + } + + ngx_memcpy(*encrypted, value, len); +#if (NGX_THREADS && NGX_NONREENTRANT_CRYPT) + ngx_mutex_unlock(ngx_crypt_mutex); +#endif + return NGX_OK; + } + + err = ngx_errno; + +#if (NGX_THREADS && NGX_NONREENTRANT_CRYPT) + ngx_mutex_unlock(ngx_crypt_mutex); +#endif + + ngx_log_error(NGX_LOG_CRIT, pool->log, err, "crypt() failed"); + + return NGX_ERROR; +} + +#endif + +#endif /* NGX_CRYPT */ diff --git a/release/src/router/nginx/src/os/unix/ngx_user.h b/release/src/router/nginx/src/os/unix/ngx_user.h new file mode 100644 index 0000000000..6e82204f4d --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_user.h @@ -0,0 +1,24 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#ifndef _NGX_USER_H_INCLUDED_ +#define _NGX_USER_H_INCLUDED_ + + +#include +#include + + +typedef uid_t ngx_uid_t; +typedef gid_t ngx_gid_t; + + +ngx_int_t ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, + u_char **encrypted); + + +#endif /* _NGX_USER_H_INCLUDED_ */ diff --git a/release/src/router/nginx/src/os/unix/ngx_writev_chain.c b/release/src/router/nginx/src/os/unix/ngx_writev_chain.c new file mode 100644 index 0000000000..805982d655 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/ngx_writev_chain.c @@ -0,0 +1,185 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include +#include + + +#if (IOV_MAX > 64) +#define NGX_IOVS 64 +#else +#define NGX_IOVS IOV_MAX +#endif + + +ngx_chain_t * +ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) +{ + u_char *prev; + ssize_t n, size, sent; + off_t send, prev_send; + ngx_uint_t eintr, complete; + ngx_err_t err; + ngx_array_t vec; + ngx_chain_t *cl; + ngx_event_t *wev; + struct iovec *iov, iovs[NGX_IOVS]; + + wev = c->write; + + if (!wev->ready) { + return in; + } + +#if (NGX_HAVE_KQUEUE) + + if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) { + (void) ngx_connection_error(c, wev->kq_errno, + "kevent() reported about an closed connection"); + wev->error = 1; + return NGX_CHAIN_ERROR; + } + +#endif + + /* the maximum limit size is the maximum size_t value - the page size */ + + if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { + limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; + } + + send = 0; + + vec.elts = iovs; + vec.size = sizeof(struct iovec); + vec.nalloc = NGX_IOVS; + vec.pool = c->pool; + + for ( ;; ) { + prev = NULL; + iov = NULL; + eintr = 0; + complete = 0; + prev_send = send; + + vec.nelts = 0; + + /* create the iovec and coalesce the neighbouring bufs */ + + for (cl = in; cl && send < limit; cl = cl->next) { + + if (ngx_buf_special(cl->buf)) { + continue; + } + +#if 1 + if (!ngx_buf_in_memory(cl->buf)) { + ngx_debug_point(); + } +#endif + + size = cl->buf->last - cl->buf->pos; + + if (send + size > limit) { + size = (ssize_t) (limit - send); + } + + if (prev == cl->buf->pos) { + iov->iov_len += size; + + } else { + if (vec.nelts >= IOV_MAX) { + break; + } + + iov = ngx_array_push(&vec); + if (iov == NULL) { + return NGX_CHAIN_ERROR; + } + + iov->iov_base = (void *) cl->buf->pos; + iov->iov_len = size; + } + + prev = cl->buf->pos + size; + send += size; + } + + n = writev(c->fd, vec.elts, vec.nelts); + + if (n == -1) { + err = ngx_errno; + + switch (err) { + case NGX_EAGAIN: + break; + + case NGX_EINTR: + eintr = 1; + break; + + default: + wev->error = 1; + (void) ngx_connection_error(c, err, "writev() failed"); + return NGX_CHAIN_ERROR; + } + + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, + "writev() not ready"); + } + + sent = n > 0 ? n : 0; + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "writev: %z", sent); + + if (send - prev_send == sent) { + complete = 1; + } + + c->sent += sent; + + for (cl = in; cl; cl = cl->next) { + + if (ngx_buf_special(cl->buf)) { + continue; + } + + if (sent == 0) { + break; + } + + size = cl->buf->last - cl->buf->pos; + + if (sent >= size) { + sent -= size; + cl->buf->pos = cl->buf->last; + + continue; + } + + cl->buf->pos += sent; + + break; + } + + if (eintr) { + continue; + } + + if (!complete) { + wev->ready = 0; + return cl; + } + + if (send >= limit || cl == NULL) { + return cl; + } + + in = cl; + } +} diff --git a/release/src/router/nginx/src/os/unix/rfork_thread.S b/release/src/router/nginx/src/os/unix/rfork_thread.S new file mode 100644 index 0000000000..e570349f93 --- /dev/null +++ b/release/src/router/nginx/src/os/unix/rfork_thread.S @@ -0,0 +1,73 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + */ + + +#include +#include + +/* + * rfork_thread(3) - rfork_thread(flags, stack, func, arg); + */ + +#define KERNCALL int $0x80 + +ENTRY(rfork_thread) + push %ebp + mov %esp, %ebp + push %esi + + mov 12(%ebp), %esi # the thread stack address + + sub $4, %esi + mov 20(%ebp), %eax # the thread argument + mov %eax, (%esi) + + sub $4, %esi + mov 16(%ebp), %eax # the thread start address + mov %eax, (%esi) + + push 8(%ebp) # rfork(2) flags + push $0 + mov $SYS_rfork, %eax + KERNCALL + jc error + + cmp $0, %edx + jne child + +parent: + add $8, %esp + pop %esi + leave + ret + +child: + mov %esi, %esp + pop %eax + call *%eax # call a thread start address ... + add $4, %esp + + push %eax + push $0 + mov $SYS_exit, %eax # ... and exit(2) after a thread would return + KERNCALL + +error: + add $8, %esp + pop %esi + leave + PIC_PROLOGUE + + /* libc's cerror: jmp PIC_PLT(HIDENAME(cerror)) */ + + push %eax + call PIC_PLT(CNAME(__error)) + pop %ecx + PIC_EPILOGUE + mov %ecx, (%eax) + mov $-1, %eax + mov $-1, %edx + ret diff --git a/release/src/router/openssl/VMS/install.com b/release/src/router/openssl/VMS/install.com deleted file mode 100644 index 9c9c0e1e27..0000000000 --- a/release/src/router/openssl/VMS/install.com +++ /dev/null @@ -1,79 +0,0 @@ -$! INSTALL.COM -- Installs the files in a given directory tree -$! -$! Author: Richard Levitte -$! Time of creation: 23-MAY-1998 19:22 -$! -$! P1 root of the directory tree -$! -$ IF P1 .EQS. "" -$ THEN -$ WRITE SYS$OUTPUT "First argument missing." -$ WRITE SYS$OUTPUT "Should be the directory where you want things installed." -$ EXIT -$ ENDIF -$ -$ IF (F$GETSYI("CPU").LT.128) -$ THEN -$ ARCH := VAX -$ ELSE -$ ARCH = F$EDIT( F$GETSYI( "ARCH_NAME"), "UPCASE") -$ IF (ARCH .EQS. "") THEN ARCH = "UNK" -$ ENDIF -$ -$ ROOT = F$PARSE(P1,"[]A.;0",,,"SYNTAX_ONLY,NO_CONCEAL") - "A.;0" -$ ROOT_DEV = F$PARSE(ROOT,,,"DEVICE","SYNTAX_ONLY") -$ ROOT_DIR = F$PARSE(ROOT,,,"DIRECTORY","SYNTAX_ONLY") - - - "[000000." - "][" - "[" - "]" -$ ROOT = ROOT_DEV + "[" + ROOT_DIR -$ -$ DEFINE/NOLOG WRK_SSLROOT 'ROOT'.] /TRANS=CONC -$ DEFINE/NOLOG WRK_SSLINCLUDE WRK_SSLROOT:[INCLUDE] -$ -$ IF F$PARSE("WRK_SSLROOT:[000000]") .EQS. "" THEN - - CREATE/DIR/LOG WRK_SSLROOT:[000000] -$ IF F$PARSE("WRK_SSLINCLUDE:") .EQS. "" THEN - - CREATE/DIR/LOG WRK_SSLINCLUDE: -$ IF F$PARSE("WRK_SSLROOT:[VMS]") .EQS. "" THEN - - CREATE/DIR/LOG WRK_SSLROOT:[VMS] -$ -$ IF F$SEARCH("WRK_SSLINCLUDE:vms_idhacks.h") .NES. "" THEN - - DELETE WRK_SSLINCLUDE:vms_idhacks.h;* -$ -$ OPEN/WRITE SF WRK_SSLROOT:[VMS]OPENSSL_STARTUP.COM -$ WRITE SYS$OUTPUT "%OPEN-I-CREATED, ",F$SEARCH("WRK_SSLROOT:[VMS]OPENSSL_STARTUP.COM")," created." -$ WRITE SF "$! Startup file for Openssl" -$ WRITE SF "$!" -$ WRITE SF "$! Do not edit this file, as it will be regenerated during next installation." -$ WRITE SF "$! Instead, add or change SSLROOT:[VMS]OPENSSL_SYSTARTUP.COM" -$ WRITE SF "$!" -$ WRITE SF "$! P1 a qualifier to DEFINE. For example ""/SYSTEM"" to get the logical names" -$ WRITE SF "$! defined in the system logical name table." -$ WRITE SF "$!" -$ WRITE SF "$ IF (F$GETSYI(""CPU"").LT.128)" -$ WRITE SF "$ THEN" -$ WRITE SF "$ ARCH := VAX" -$ WRITE SF "$ ELSE" -$ WRITE SF "$ ARCH = F$EDIT( F$GETSYI( ""ARCH_NAME""), ""UPCASE"")" -$ WRITE SF "$ IF (ARCH .EQS. """") THEN ARCH = ""UNK""" -$ WRITE SF "$ ENDIF" -$ WRITE SF "$ DEFINE/NOLOG'P1 SSLROOT ",ROOT,".] /TRANS=CONC" -$ WRITE SF "$ DEFINE/NOLOG'P1 SSLLIB SSLROOT:['ARCH'_LIB]" -$ WRITE SF "$ DEFINE/NOLOG'P1 SSLINCLUDE SSLROOT:[INCLUDE]" -$ WRITE SF "$ DEFINE/NOLOG'P1 SSLEXE SSLROOT:['ARCH'_EXE]" -$ WRITE SF "$ DEFINE/NOLOG'P1 SSLCERTS SSLROOT:[CERTS]" -$ WRITE SF "$ DEFINE/NOLOG'P1 SSLPRIVATE SSLROOT:[PRIVATE]" -$ WRITE SF "$" -$ WRITE SF "$! This is program can include " -$ WRITE SF "$ DEFINE/NOLOG'P1 OPENSSL SSLINCLUDE:" -$ WRITE SF "$" -$ WRITE SF "$ IF F$SEARCH(""SSLROOT:[VMS]OPENSSL_SYSTARTUP.COM"") .NES."""" THEN -" -$ WRITE SF " @SSLROOT:[VMS]OPENSSL_SYSTARTUP.COM" -$ WRITE SF "$" -$ WRITE SF "$ EXIT" -$ CLOSE SF -$ SET FILE/PROT=WORLD:RE WRK_SSLROOT:[VMS]OPENSSL_STARTUP.COM -$ -$ COPY OPENSSL_UTILS.COM WRK_SSLROOT:[VMS]/LOG -$ SET FILE/PROT=WORLD:RE WRK_SSLROOT:[VMS]OPENSSL_UTILS.COM -$ -$ EXIT diff --git a/release/src/router/openssl/apps/install.com b/release/src/router/openssl/apps/install.com deleted file mode 100644 index c5821b40e3..0000000000 --- a/release/src/router/openssl/apps/install.com +++ /dev/null @@ -1,65 +0,0 @@ -$! INSTALL.COM -- Installs the files in a given directory tree -$! -$! Author: Richard Levitte -$! Time of creation: 22-MAY-1998 10:13 -$! -$! P1 root of the directory tree -$! -$ -$ IF P1 .EQS. "" -$ THEN -$ WRITE SYS$OUTPUT "First argument missing." -$ WRITE SYS$OUTPUT - - "Should be the directory where you want things installed." -$ EXIT -$ ENDIF -$ -$ IF (F$GETSYI("CPU").LT.128) -$ THEN -$ ARCH := VAX -$ ELSE -$ ARCH = F$EDIT( F$GETSYI( "ARCH_NAME"), "UPCASE") -$ IF (ARCH .EQS. "") THEN ARCH = "UNK" -$ ENDIF -$ -$ ROOT = F$PARSE(P1,"[]A.;0",,,"SYNTAX_ONLY,NO_CONCEAL") - "A.;0" -$ ROOT_DEV = F$PARSE(ROOT,,,"DEVICE","SYNTAX_ONLY") -$ ROOT_DIR = F$PARSE(ROOT,,,"DIRECTORY","SYNTAX_ONLY") - - - "[000000." - "][" - "[" - "]" -$ ROOT = ROOT_DEV + "[" + ROOT_DIR -$ -$ DEFINE/NOLOG WRK_SSLROOT 'ROOT'.] /TRANS=CONC -$ DEFINE/NOLOG WRK_SSLEXE WRK_SSLROOT:['ARCH'_EXE] -$ -$ IF F$PARSE("WRK_SSLROOT:[000000]") .EQS. "" THEN - - CREATE/DIR/LOG WRK_SSLROOT:[000000] -$ IF F$PARSE("WRK_SSLEXE:") .EQS. "" THEN - - CREATE/DIR/LOG WRK_SSLEXE: -$ -$ EXE := openssl -$ -$ EXE_DIR := [-.'ARCH'.EXE.APPS] -$ -$ I = 0 -$ LOOP_EXE: -$ E = F$EDIT(F$ELEMENT(I, ",", EXE),"TRIM") -$ I = I + 1 -$ IF E .EQS. "," THEN GOTO LOOP_EXE_END -$ SET NOON -$ IF F$SEARCH(EXE_DIR+E+".EXE") .NES. "" -$ THEN -$ COPY 'EXE_DIR''E'.EXE WRK_SSLEXE:'E'.EXE/log -$ SET FILE/PROT=W:RE WRK_SSLEXE:'E'.EXE -$ ENDIF -$ SET ON -$ GOTO LOOP_EXE -$ LOOP_EXE_END: -$ -$ SET NOON -$ COPY CA.COM WRK_SSLEXE:CA.COM/LOG -$ SET FILE/PROT=W:RE WRK_SSLEXE:CA.COM -$ COPY OPENSSL-VMS.CNF WRK_SSLROOT:[000000]OPENSSL.CNF/LOG -$ SET FILE/PROT=W:R WRK_SSLROOT:[000000]OPENSSL.CNF -$ SET ON -$ -$ EXIT diff --git a/release/src/router/openssl/apps/openssl b/release/src/router/openssl/apps/openssl deleted file mode 100755 index f5d985fe6160f8efbf2b604de5e51fffc57869d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 153792 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 BWt0E_ diff --git a/release/src/router/openssl/crypto/aes/lib b/release/src/router/openssl/crypto/aes/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/asn1/lib b/release/src/router/openssl/crypto/asn1/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/bf/lib b/release/src/router/openssl/crypto/bf/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/bio/lib b/release/src/router/openssl/crypto/bio/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/bn/bn-mips.s b/release/src/router/openssl/crypto/bn/bn-mips.s deleted file mode 100644 index 02097fa388..0000000000 --- a/release/src/router/openssl/crypto/bn/bn-mips.s +++ /dev/null @@ -1,2177 +0,0 @@ -.set mips2 -.rdata -.asciiz "mips3.s, Version 1.2" -.asciiz "MIPS II/III/IV ISA artwork by Andy Polyakov " - -.text -.set noat - -.align 5 -.globl bn_mul_add_words -.ent bn_mul_add_words -bn_mul_add_words: - .set noreorder - bgtz $6,bn_mul_add_words_internal - move $2,$0 - jr $31 - move $4,$2 -.end bn_mul_add_words - -.align 5 -.ent bn_mul_add_words_internal -bn_mul_add_words_internal: - .set reorder - li $3,-4 - and $8,$6,$3 - lw $12,0($5) - beqz $8,.L_bn_mul_add_words_tail - -.L_bn_mul_add_words_loop: - multu $12,$7 - lw $13,0($4) - lw $14,4($5) - lw $15,4($4) - lw $8,2*4($5) - lw $9,2*4($4) - addu $13,$2 - sltu $2,$13,$2 # All manuals say it "compares 32-bit - # values", but it seems to work fine - # even on 64-bit registers. - mflo $1 - mfhi $12 - addu $13,$1 - addu $2,$12 - multu $14,$7 - sltu $1,$13,$1 - sw $13,0($4) - addu $2,$1 - - lw $10,3*4($5) - lw $11,3*4($4) - addu $15,$2 - sltu $2,$15,$2 - mflo $1 - mfhi $14 - addu $15,$1 - addu $2,$14 - multu $8,$7 - sltu $1,$15,$1 - sw $15,4($4) - addu $2,$1 - - subu $6,4 - addu $4,4*4 - addu $5,4*4 - addu $9,$2 - sltu $2,$9,$2 - mflo $1 - mfhi $8 - addu $9,$1 - addu $2,$8 - multu $10,$7 - sltu $1,$9,$1 - sw $9,-2*4($4) - addu $2,$1 - - - and $8,$6,$3 - addu $11,$2 - sltu $2,$11,$2 - mflo $1 - mfhi $10 - addu $11,$1 - addu $2,$10 - sltu $1,$11,$1 - sw $11,-4($4) - addu $2,$1 - .set noreorder - bgtzl $8,.L_bn_mul_add_words_loop - lw $12,0($5) - - beqz $6,.L_bn_mul_add_words_return - nop - -.L_bn_mul_add_words_tail: - .set reorder - lw $12,0($5) - multu $12,$7 - lw $13,0($4) - subu $6,1 - addu $13,$2 - sltu $2,$13,$2 - mflo $1 - mfhi $12 - addu $13,$1 - addu $2,$12 - sltu $1,$13,$1 - sw $13,0($4) - addu $2,$1 - beqz $6,.L_bn_mul_add_words_return - - lw $12,4($5) - multu $12,$7 - lw $13,4($4) - subu $6,1 - addu $13,$2 - sltu $2,$13,$2 - mflo $1 - mfhi $12 - addu $13,$1 - addu $2,$12 - sltu $1,$13,$1 - sw $13,4($4) - addu $2,$1 - beqz $6,.L_bn_mul_add_words_return - - lw $12,2*4($5) - multu $12,$7 - lw $13,2*4($4) - addu $13,$2 - sltu $2,$13,$2 - mflo $1 - mfhi $12 - addu $13,$1 - addu $2,$12 - sltu $1,$13,$1 - sw $13,2*4($4) - addu $2,$1 - -.L_bn_mul_add_words_return: - .set noreorder - jr $31 - move $4,$2 -.end bn_mul_add_words_internal - -.align 5 -.globl bn_mul_words -.ent bn_mul_words -bn_mul_words: - .set noreorder - bgtz $6,bn_mul_words_internal - move $2,$0 - jr $31 - move $4,$2 -.end bn_mul_words - -.align 5 -.ent bn_mul_words_internal -bn_mul_words_internal: - .set reorder - li $3,-4 - and $8,$6,$3 - lw $12,0($5) - beqz $8,.L_bn_mul_words_tail - -.L_bn_mul_words_loop: - multu $12,$7 - lw $14,4($5) - lw $8,2*4($5) - lw $10,3*4($5) - mflo $1 - mfhi $12 - addu $2,$1 - sltu $13,$2,$1 - multu $14,$7 - sw $2,0($4) - addu $2,$13,$12 - - subu $6,4 - addu $4,4*4 - addu $5,4*4 - mflo $1 - mfhi $14 - addu $2,$1 - sltu $15,$2,$1 - multu $8,$7 - sw $2,-3*4($4) - addu $2,$15,$14 - - mflo $1 - mfhi $8 - addu $2,$1 - sltu $9,$2,$1 - multu $10,$7 - sw $2,-2*4($4) - addu $2,$9,$8 - - and $8,$6,$3 - mflo $1 - mfhi $10 - addu $2,$1 - sltu $11,$2,$1 - sw $2,-4($4) - addu $2,$11,$10 - .set noreorder - bgtzl $8,.L_bn_mul_words_loop - lw $12,0($5) - - beqz $6,.L_bn_mul_words_return - nop - -.L_bn_mul_words_tail: - .set reorder - lw $12,0($5) - multu $12,$7 - subu $6,1 - mflo $1 - mfhi $12 - addu $2,$1 - sltu $13,$2,$1 - sw $2,0($4) - addu $2,$13,$12 - beqz $6,.L_bn_mul_words_return - - lw $12,4($5) - multu $12,$7 - subu $6,1 - mflo $1 - mfhi $12 - addu $2,$1 - sltu $13,$2,$1 - sw $2,4($4) - addu $2,$13,$12 - beqz $6,.L_bn_mul_words_return - - lw $12,2*4($5) - multu $12,$7 - mflo $1 - mfhi $12 - addu $2,$1 - sltu $13,$2,$1 - sw $2,2*4($4) - addu $2,$13,$12 - -.L_bn_mul_words_return: - .set noreorder - jr $31 - move $4,$2 -.end bn_mul_words_internal - -.align 5 -.globl bn_sqr_words -.ent bn_sqr_words -bn_sqr_words: - .set noreorder - bgtz $6,bn_sqr_words_internal - move $2,$0 - jr $31 - move $4,$2 -.end bn_sqr_words - -.align 5 -.ent bn_sqr_words_internal -bn_sqr_words_internal: - .set reorder - li $3,-4 - and $8,$6,$3 - lw $12,0($5) - beqz $8,.L_bn_sqr_words_tail - -.L_bn_sqr_words_loop: - multu $12,$12 - lw $14,4($5) - lw $8,2*4($5) - lw $10,3*4($5) - mflo $13 - mfhi $12 - sw $13,0($4) - sw $12,4($4) - - multu $14,$14 - subu $6,4 - addu $4,8*4 - addu $5,4*4 - mflo $15 - mfhi $14 - sw $15,-6*4($4) - sw $14,-5*4($4) - - multu $8,$8 - mflo $9 - mfhi $8 - sw $9,-4*4($4) - sw $8,-3*4($4) - - - multu $10,$10 - and $8,$6,$3 - mflo $11 - mfhi $10 - sw $11,-2*4($4) - sw $10,-4($4) - - .set noreorder - bgtzl $8,.L_bn_sqr_words_loop - lw $12,0($5) - - beqz $6,.L_bn_sqr_words_return - nop - -.L_bn_sqr_words_tail: - .set reorder - lw $12,0($5) - multu $12,$12 - subu $6,1 - mflo $13 - mfhi $12 - sw $13,0($4) - sw $12,4($4) - beqz $6,.L_bn_sqr_words_return - - lw $12,4($5) - multu $12,$12 - subu $6,1 - mflo $13 - mfhi $12 - sw $13,2*4($4) - sw $12,3*4($4) - beqz $6,.L_bn_sqr_words_return - - lw $12,2*4($5) - multu $12,$12 - mflo $13 - mfhi $12 - sw $13,4*4($4) - sw $12,5*4($4) - -.L_bn_sqr_words_return: - .set noreorder - jr $31 - move $4,$2 - -.end bn_sqr_words_internal - -.align 5 -.globl bn_add_words -.ent bn_add_words -bn_add_words: - .set noreorder - bgtz $7,bn_add_words_internal - move $2,$0 - jr $31 - move $4,$2 -.end bn_add_words - -.align 5 -.ent bn_add_words_internal -bn_add_words_internal: - .set reorder - li $3,-4 - and $1,$7,$3 - lw $12,0($5) - beqz $1,.L_bn_add_words_tail - -.L_bn_add_words_loop: - lw $8,0($6) - subu $7,4 - lw $13,4($5) - and $1,$7,$3 - lw $14,2*4($5) - addu $6,4*4 - lw $15,3*4($5) - addu $4,4*4 - lw $9,-3*4($6) - addu $5,4*4 - lw $10,-2*4($6) - lw $11,-4($6) - addu $8,$12 - sltu $24,$8,$12 - addu $12,$8,$2 - sltu $2,$12,$8 - sw $12,-4*4($4) - addu $2,$24 - - addu $9,$13 - sltu $25,$9,$13 - addu $13,$9,$2 - sltu $2,$13,$9 - sw $13,-3*4($4) - addu $2,$25 - - addu $10,$14 - sltu $24,$10,$14 - addu $14,$10,$2 - sltu $2,$14,$10 - sw $14,-2*4($4) - addu $2,$24 - - addu $11,$15 - sltu $25,$11,$15 - addu $15,$11,$2 - sltu $2,$15,$11 - sw $15,-4($4) - addu $2,$25 - - .set noreorder - bgtzl $1,.L_bn_add_words_loop - lw $12,0($5) - - beqz $7,.L_bn_add_words_return - nop - -.L_bn_add_words_tail: - .set reorder - lw $12,0($5) - lw $8,0($6) - addu $8,$12 - subu $7,1 - sltu $24,$8,$12 - addu $12,$8,$2 - sltu $2,$12,$8 - sw $12,0($4) - addu $2,$24 - beqz $7,.L_bn_add_words_return - - lw $13,4($5) - lw $9,4($6) - addu $9,$13 - subu $7,1 - sltu $25,$9,$13 - addu $13,$9,$2 - sltu $2,$13,$9 - sw $13,4($4) - addu $2,$25 - beqz $7,.L_bn_add_words_return - - lw $14,2*4($5) - lw $10,2*4($6) - addu $10,$14 - sltu $24,$10,$14 - addu $14,$10,$2 - sltu $2,$14,$10 - sw $14,2*4($4) - addu $2,$24 - -.L_bn_add_words_return: - .set noreorder - jr $31 - move $4,$2 - -.end bn_add_words_internal - -.align 5 -.globl bn_sub_words -.ent bn_sub_words -bn_sub_words: - .set noreorder - bgtz $7,bn_sub_words_internal - move $2,$0 - jr $31 - move $4,$0 -.end bn_sub_words - -.align 5 -.ent bn_sub_words_internal -bn_sub_words_internal: - .set reorder - li $3,-4 - and $1,$7,$3 - lw $12,0($5) - beqz $1,.L_bn_sub_words_tail - -.L_bn_sub_words_loop: - lw $8,0($6) - subu $7,4 - lw $13,4($5) - and $1,$7,$3 - lw $14,2*4($5) - addu $6,4*4 - lw $15,3*4($5) - addu $4,4*4 - lw $9,-3*4($6) - addu $5,4*4 - lw $10,-2*4($6) - lw $11,-4($6) - sltu $24,$12,$8 - subu $8,$12,$8 - subu $12,$8,$2 - sgtu $2,$12,$8 - sw $12,-4*4($4) - addu $2,$24 - - sltu $25,$13,$9 - subu $9,$13,$9 - subu $13,$9,$2 - sgtu $2,$13,$9 - sw $13,-3*4($4) - addu $2,$25 - - - sltu $24,$14,$10 - subu $10,$14,$10 - subu $14,$10,$2 - sgtu $2,$14,$10 - sw $14,-2*4($4) - addu $2,$24 - - sltu $25,$15,$11 - subu $11,$15,$11 - subu $15,$11,$2 - sgtu $2,$15,$11 - sw $15,-4($4) - addu $2,$25 - - .set noreorder - bgtzl $1,.L_bn_sub_words_loop - lw $12,0($5) - - beqz $7,.L_bn_sub_words_return - nop - -.L_bn_sub_words_tail: - .set reorder - lw $12,0($5) - lw $8,0($6) - subu $7,1 - sltu $24,$12,$8 - subu $8,$12,$8 - subu $12,$8,$2 - sgtu $2,$12,$8 - sw $12,0($4) - addu $2,$24 - beqz $7,.L_bn_sub_words_return - - lw $13,4($5) - subu $7,1 - lw $9,4($6) - sltu $25,$13,$9 - subu $9,$13,$9 - subu $13,$9,$2 - sgtu $2,$13,$9 - sw $13,4($4) - addu $2,$25 - beqz $7,.L_bn_sub_words_return - - lw $14,2*4($5) - lw $10,2*4($6) - sltu $24,$14,$10 - subu $10,$14,$10 - subu $14,$10,$2 - sgtu $2,$14,$10 - sw $14,2*4($4) - addu $2,$24 - -.L_bn_sub_words_return: - .set noreorder - jr $31 - move $4,$2 -.end bn_sub_words_internal - -.align 5 -.globl bn_div_3_words -.ent bn_div_3_words -bn_div_3_words: - .set noreorder - move $7,$4 # we know that bn_div_words does not - # touch $7, $10, $11 and preserves $6 - # so that we can save two arguments - # and return address in registers - # instead of stack:-) - - lw $4,($7) - move $10,$5 - bne $4,$6,bn_div_3_words_internal - lw $5,-4($7) - li $2,-1 - jr $31 - move $4,$2 -.end bn_div_3_words - -.align 5 -.ent bn_div_3_words_internal -bn_div_3_words_internal: - .set reorder - move $11,$31 - bal bn_div_words - move $31,$11 - multu $10,$2 - lw $14,-2*4($7) - move $8,$0 - mfhi $13 - mflo $12 - sltu $24,$13,$5 -.L_bn_div_3_words_inner_loop: - bnez $24,.L_bn_div_3_words_inner_loop_done - sgeu $1,$14,$12 - seq $25,$13,$5 - and $1,$25 - sltu $15,$12,$10 - addu $5,$6 - subu $13,$15 - subu $12,$10 - sltu $24,$13,$5 - sltu $8,$5,$6 - or $24,$8 - .set noreorder - beqzl $1,.L_bn_div_3_words_inner_loop - subu $2,1 - .set reorder -.L_bn_div_3_words_inner_loop_done: - .set noreorder - jr $31 - move $4,$2 -.end bn_div_3_words_internal - -.align 5 -.globl bn_div_words -.ent bn_div_words -bn_div_words: - .set noreorder - bnez $6,bn_div_words_internal - li $2,-1 # I would rather signal div-by-zero - # which can be done with 'break 7' - jr $31 - move $4,$2 -.end bn_div_words - -.align 5 -.ent bn_div_words_internal -bn_div_words_internal: - move $3,$0 - bltz $6,.L_bn_div_words_body - move $25,$3 - sll $6,1 - bgtz $6,.-4 - addu $25,1 - - .set reorder - negu $13,$25 - li $14,-1 - sll $14,$13 - and $14,$4 - srl $1,$5,$13 - .set noreorder - bnezl $14,.+8 - break 6 # signal overflow - .set reorder - sll $4,$25 - sll $5,$25 - or $4,$1 -.L_bn_div_words_body: - srl $3,$6,4*4 # bits - sgeu $1,$4,$6 - .set noreorder - bnezl $1,.+8 - subu $4,$6 - .set reorder - - li $8,-1 - srl $9,$4,4*4 # bits - srl $8,4*4 # q=0xffffffff - beq $3,$9,.L_bn_div_words_skip_div1 - divu $0,$4,$3 - mflo $8 -.L_bn_div_words_skip_div1: - multu $6,$8 - sll $15,$4,4*4 # bits - srl $1,$5,4*4 # bits - or $15,$1 - mflo $12 - mfhi $13 -.L_bn_div_words_inner_loop1: - sltu $14,$15,$12 - seq $24,$9,$13 - sltu $1,$9,$13 - and $14,$24 - sltu $2,$12,$6 - or $1,$14 - .set noreorder - beqz $1,.L_bn_div_words_inner_loop1_done - subu $13,$2 - subu $12,$6 - b .L_bn_div_words_inner_loop1 - subu $8,1 - .set reorder -.L_bn_div_words_inner_loop1_done: - - sll $5,4*4 # bits - subu $4,$15,$12 - sll $2,$8,4*4 # bits - - li $8,-1 - srl $9,$4,4*4 # bits - srl $8,4*4 # q=0xffffffff - beq $3,$9,.L_bn_div_words_skip_div2 - divu $0,$4,$3 - mflo $8 -.L_bn_div_words_skip_div2: - multu $6,$8 - sll $15,$4,4*4 # bits - srl $1,$5,4*4 # bits - or $15,$1 - mflo $12 - mfhi $13 -.L_bn_div_words_inner_loop2: - sltu $14,$15,$12 - seq $24,$9,$13 - sltu $1,$9,$13 - and $14,$24 - sltu $3,$12,$6 - or $1,$14 - .set noreorder - beqz $1,.L_bn_div_words_inner_loop2_done - subu $13,$3 - subu $12,$6 - b .L_bn_div_words_inner_loop2 - subu $8,1 - .set reorder -.L_bn_div_words_inner_loop2_done: - - subu $4,$15,$12 - or $2,$8 - srl $3,$4,$25 # $3 contains remainder if anybody wants it - srl $6,$25 # restore $6 - - .set noreorder - move $5,$3 - jr $31 - move $4,$2 -.end bn_div_words_internal - -.align 5 -.globl bn_mul_comba8 -.ent bn_mul_comba8 -bn_mul_comba8: - .set noreorder - .frame $29,6*4,$31 - .mask 0x003f0000,-4 - subu $29,6*4 - sw $21,5*4($29) - sw $20,4*4($29) - sw $19,3*4($29) - sw $18,2*4($29) - sw $17,1*4($29) - sw $16,0*4($29) - - .set reorder - lw $12,0($5) # If compiled with -mips3 option on - # R5000 box assembler barks on this - # 1ine with "should not have mult/div - # as last instruction in bb (R10K - # bug)" warning. If anybody out there - # has a clue about how to circumvent - # this do send me a note. - # - - lw $8,0($6) - lw $13,4($5) - lw $14,2*4($5) - multu $12,$8 # mul_add_c(a[0],b[0],c1,c2,c3); - lw $15,3*4($5) - lw $9,4($6) - lw $10,2*4($6) - lw $11,3*4($6) - mflo $2 - mfhi $3 - - lw $16,4*4($5) - lw $18,5*4($5) - multu $12,$9 # mul_add_c(a[0],b[1],c2,c3,c1); - lw $20,6*4($5) - lw $5,7*4($5) - lw $17,4*4($6) - lw $19,5*4($6) - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $13,$8 # mul_add_c(a[1],b[0],c2,c3,c1); - addu $7,$25,$1 - lw $21,6*4($6) - lw $6,7*4($6) - sw $2,0($4) # r[0]=c1; - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $14,$8 # mul_add_c(a[2],b[0],c3,c1,c2); - addu $25,$1 - addu $7,$25 - sltu $2,$7,$25 - sw $3,4($4) # r[1]=c2; - - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $13,$9 # mul_add_c(a[1],b[1],c3,c1,c2); - addu $25,$1 - addu $2,$25 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $12,$10 # mul_add_c(a[0],b[2],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $3,$2,$25 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $12,$11 # mul_add_c(a[0],b[3],c1,c2,c3); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - sw $7,2*4($4) # r[2]=c3; - - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $13,$10 # mul_add_c(a[1],b[2],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $7,$3,$25 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $14,$9 # mul_add_c(a[2],b[1],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $15,$8 # mul_add_c(a[3],b[0],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $16,$8 # mul_add_c(a[4],b[0],c2,c3,c1); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - sw $2,3*4($4) # r[3]=c1; - - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $15,$9 # mul_add_c(a[3],b[1],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $2,$7,$25 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $14,$10 # mul_add_c(a[2],b[2],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $13,$11 # mul_add_c(a[1],b[3],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $12,$17 # mul_add_c(a[0],b[4],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $12,$19 # mul_add_c(a[0],b[5],c3,c1,c2); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - sw $3,4*4($4) # r[4]=c2; - - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $13,$17 # mul_add_c(a[1],b[4],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $3,$2,$25 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $14,$11 # mul_add_c(a[2],b[3],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $15,$10 # mul_add_c(a[3],b[2],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $16,$9 # mul_add_c(a[4],b[1],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $18,$8 # mul_add_c(a[5],b[0],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $20,$8 # mul_add_c(a[6],b[0],c1,c2,c3); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - sw $7,5*4($4) # r[5]=c3; - - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $18,$9 # mul_add_c(a[5],b[1],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $7,$3,$25 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $16,$10 # mul_add_c(a[4],b[2],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $15,$11 # mul_add_c(a[3],b[3],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $14,$17 # mul_add_c(a[2],b[4],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $13,$19 # mul_add_c(a[1],b[5],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $12,$21 # mul_add_c(a[0],b[6],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $12,$6 # mul_add_c(a[0],b[7],c2,c3,c1); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - sw $2,6*4($4) # r[6]=c1; - - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $13,$21 # mul_add_c(a[1],b[6],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $2,$7,$25 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $14,$19 # mul_add_c(a[2],b[5],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $15,$17 # mul_add_c(a[3],b[4],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $16,$11 # mul_add_c(a[4],b[3],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $18,$10 # mul_add_c(a[5],b[2],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $20,$9 # mul_add_c(a[6],b[1],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $5,$8 # mul_add_c(a[7],b[0],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $5,$9 # mul_add_c(a[7],b[1],c3,c1,c2); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - sw $3,7*4($4) # r[7]=c2; - - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $20,$10 # mul_add_c(a[6],b[2],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $3,$2,$25 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $18,$11 # mul_add_c(a[5],b[3],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $16,$17 # mul_add_c(a[4],b[4],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $15,$19 # mul_add_c(a[3],b[5],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $14,$21 # mul_add_c(a[2],b[6],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $13,$6 # mul_add_c(a[1],b[7],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $14,$6 # mul_add_c(a[2],b[7],c1,c2,c3); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - sw $7,8*4($4) # r[8]=c3; - - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $15,$21 # mul_add_c(a[3],b[6],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $7,$3,$25 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $16,$19 # mul_add_c(a[4],b[5],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $18,$17 # mul_add_c(a[5],b[4],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $20,$11 # mul_add_c(a[6],b[3],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $5,$10 # mul_add_c(a[7],b[2],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $5,$11 # mul_add_c(a[7],b[3],c2,c3,c1); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - sw $2,9*4($4) # r[9]=c1; - - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $20,$17 # mul_add_c(a[6],b[4],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $2,$7,$25 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $18,$19 # mul_add_c(a[5],b[5],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $16,$21 # mul_add_c(a[4],b[6],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $15,$6 # mul_add_c(a[3],b[7],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $16,$6 # mul_add_c(a[4],b[7],c3,c1,c2); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - sw $3,10*4($4) # r[10]=c2; - - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $18,$21 # mul_add_c(a[5],b[6],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $3,$2,$25 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $20,$19 # mul_add_c(a[6],b[5],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $5,$17 # mul_add_c(a[7],b[4],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $5,$19 # mul_add_c(a[7],b[5],c1,c2,c3); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - sw $7,11*4($4) # r[11]=c3; - - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $20,$21 # mul_add_c(a[6],b[6],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $7,$3,$25 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $18,$6 # mul_add_c(a[5],b[7],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $20,$6 # mul_add_c(a[6],b[7],c2,c3,c1); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - sw $2,12*4($4) # r[12]=c1; - - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $5,$21 # mul_add_c(a[7],b[6],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $2,$7,$25 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $5,$6 # mul_add_c(a[7],b[7],c3,c1,c2); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - sw $3,13*4($4) # r[13]=c2; - - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sw $7,14*4($4) # r[14]=c3; - sw $2,15*4($4) # r[15]=c1; - - .set noreorder - lw $21,5*4($29) - lw $20,4*4($29) - lw $19,3*4($29) - lw $18,2*4($29) - lw $17,1*4($29) - lw $16,0*4($29) - jr $31 - addu $29,6*4 -.end bn_mul_comba8 - -.align 5 -.globl bn_mul_comba4 -.ent bn_mul_comba4 -bn_mul_comba4: - .set reorder - lw $12,0($5) - lw $8,0($6) - lw $13,4($5) - lw $14,2*4($5) - multu $12,$8 # mul_add_c(a[0],b[0],c1,c2,c3); - lw $15,3*4($5) - lw $9,4($6) - lw $10,2*4($6) - lw $11,3*4($6) - mflo $2 - mfhi $3 - sw $2,0($4) - - multu $12,$9 # mul_add_c(a[0],b[1],c2,c3,c1); - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $13,$8 # mul_add_c(a[1],b[0],c2,c3,c1); - addu $7,$25,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $14,$8 # mul_add_c(a[2],b[0],c3,c1,c2); - addu $25,$1 - addu $7,$25 - sltu $2,$7,$25 - sw $3,4($4) - - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $13,$9 # mul_add_c(a[1],b[1],c3,c1,c2); - addu $25,$1 - addu $2,$25 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $12,$10 # mul_add_c(a[0],b[2],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $3,$2,$25 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $12,$11 # mul_add_c(a[0],b[3],c1,c2,c3); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - sw $7,2*4($4) - - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $13,$10 # mul_add_c(a[1],b[2],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $7,$3,$25 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $14,$9 # mul_add_c(a[2],b[1],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $15,$8 # mul_add_c(a[3],b[0],c1,c2,c3); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $15,$9 # mul_add_c(a[3],b[1],c2,c3,c1); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - sw $2,3*4($4) - - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $14,$10 # mul_add_c(a[2],b[2],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $2,$7,$25 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $13,$11 # mul_add_c(a[1],b[3],c2,c3,c1); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $14,$11 # mul_add_c(a[2],b[3],c3,c1,c2); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - sw $3,4*4($4) - - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $15,$10 # mul_add_c(a[3],b[2],c3,c1,c2); - addu $25,$1 - addu $2,$25 - sltu $3,$2,$25 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $15,$11 # mul_add_c(a[3],b[3],c1,c2,c3); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - sw $7,5*4($4) - - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sw $2,6*4($4) - sw $3,7*4($4) - - .set noreorder - jr $31 - nop -.end bn_mul_comba4 - -.align 5 -.globl bn_sqr_comba8 -.ent bn_sqr_comba8 -bn_sqr_comba8: - .set reorder - lw $12,0($5) - lw $13,4($5) - lw $14,2*4($5) - lw $15,3*4($5) - - multu $12,$12 # mul_add_c(a[0],b[0],c1,c2,c3); - lw $8,4*4($5) - lw $9,5*4($5) - lw $10,6*4($5) - lw $11,7*4($5) - mflo $2 - mfhi $3 - sw $2,0($4) - - multu $12,$13 # mul_add_c2(a[0],b[1],c2,c3,c1); - mflo $24 - mfhi $25 - slt $2,$25,$0 - sll $25,1 - multu $14,$12 # mul_add_c2(a[2],b[0],c3,c1,c2); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $3,$24 - sltu $1,$3,$24 - addu $7,$25,$1 - sw $3,4($4) - - mflo $24 - mfhi $25 - slt $3,$25,$0 - sll $25,1 - multu $13,$13 # mul_add_c(a[1],b[1],c3,c1,c2); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $12,$15 # mul_add_c2(a[0],b[3],c1,c2,c3); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - sw $7,2*4($4) - - mflo $24 - mfhi $25 - slt $7,$25,$0 - sll $25,1 - multu $13,$14 # mul_add_c2(a[1],b[2],c1,c2,c3); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $7,$1 - multu $8,$12 # mul_add_c2(a[4],b[0],c2,c3,c1); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - sw $2,3*4($4) - - mflo $24 - mfhi $25 - slt $2,$25,$0 - sll $25,1 - multu $15,$13 # mul_add_c2(a[3],b[1],c2,c3,c1); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $3,$24 - sltu $1,$3,$24 - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $2,$1 - multu $14,$14 # mul_add_c(a[2],b[2],c2,c3,c1); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $3,$24 - sltu $1,$3,$24 - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $12,$9 # mul_add_c2(a[0],b[5],c3,c1,c2); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - sw $3,4*4($4) - - mflo $24 - mfhi $25 - slt $3,$25,$0 - sll $25,1 - multu $13,$8 # mul_add_c2(a[1],b[4],c3,c1,c2); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $3,$1 - multu $14,$15 # mul_add_c2(a[2],b[3],c3,c1,c2); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - multu $10,$12 # mul_add_c2(a[6],b[0],c1,c2,c3); - addu $3,$1 - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - sw $7,5*4($4) - - mflo $24 - mfhi $25 - slt $7,$25,$0 - sll $25,1 - multu $9,$13 # mul_add_c2(a[5],b[1],c1,c2,c3); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $7,$1 - multu $8,$14 # mul_add_c2(a[4],b[2],c1,c2,c3); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $7,$1 - multu $15,$15 # mul_add_c(a[3],b[3],c1,c2,c3); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $12,$11 # mul_add_c2(a[0],b[7],c2,c3,c1); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - sw $2,6*4($4) - - mflo $24 - mfhi $25 - slt $2,$25,$0 - sll $25,1 - multu $13,$10 # mul_add_c2(a[1],b[6],c2,c3,c1); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $3,$24 - sltu $1,$3,$24 - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $2,$1 - multu $14,$9 # mul_add_c2(a[2],b[5],c2,c3,c1); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $3,$24 - sltu $1,$3,$24 - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $2,$1 - multu $15,$8 # mul_add_c2(a[3],b[4],c2,c3,c1); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $3,$24 - sltu $1,$3,$24 - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $2,$1 - multu $11,$13 # mul_add_c2(a[7],b[1],c3,c1,c2); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $3,$24 - sltu $1,$3,$24 - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - sw $3,7*4($4) - - mflo $24 - mfhi $25 - slt $3,$25,$0 - sll $25,1 - multu $10,$14 # mul_add_c2(a[6],b[2],c3,c1,c2); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $3,$1 - multu $9,$15 # mul_add_c2(a[5],b[3],c3,c1,c2); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $3,$1 - multu $8,$8 # mul_add_c(a[4],b[4],c3,c1,c2); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $14,$11 # mul_add_c2(a[2],b[7],c1,c2,c3); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - sw $7,8*4($4) - - mflo $24 - mfhi $25 - slt $7,$25,$0 - sll $25,1 - multu $15,$10 # mul_add_c2(a[3],b[6],c1,c2,c3); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $7,$1 - multu $8,$9 # mul_add_c2(a[4],b[5],c1,c2,c3); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $7,$1 - multu $11,$15 # mul_add_c2(a[7],b[3],c2,c3,c1); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - sw $2,9*4($4) - - mflo $24 - mfhi $25 - slt $2,$25,$0 - sll $25,1 - multu $10,$8 # mul_add_c2(a[6],b[4],c2,c3,c1); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $3,$24 - sltu $1,$3,$24 - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $2,$1 - multu $9,$9 # mul_add_c(a[5],b[5],c2,c3,c1); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $3,$24 - sltu $1,$3,$24 - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $8,$11 # mul_add_c2(a[4],b[7],c3,c1,c2); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - sw $3,10*4($4) - - mflo $24 - mfhi $25 - slt $3,$25,$0 - sll $25,1 - multu $9,$10 # mul_add_c2(a[5],b[6],c3,c1,c2); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $3,$1 - multu $11,$9 # mul_add_c2(a[7],b[5],c1,c2,c3); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - sw $7,11*4($4) - - mflo $24 - mfhi $25 - slt $7,$25,$0 - sll $25,1 - multu $10,$10 # mul_add_c(a[6],b[6],c1,c2,c3); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - multu $10,$11 # mul_add_c2(a[6],b[7],c2,c3,c1); - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - sw $2,12*4($4) - - mflo $24 - mfhi $25 - slt $2,$25,$0 - sll $25,1 - multu $11,$11 # mul_add_c(a[7],b[7],c3,c1,c2); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $3,$24 - sltu $1,$3,$24 - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - sw $3,13*4($4) - - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sw $7,14*4($4) - sw $2,15*4($4) - - .set noreorder - jr $31 - nop -.end bn_sqr_comba8 - -.align 5 -.globl bn_sqr_comba4 -.ent bn_sqr_comba4 -bn_sqr_comba4: - .set reorder - lw $12,0($5) - lw $13,4($5) - multu $12,$12 # mul_add_c(a[0],b[0],c1,c2,c3); - lw $14,2*4($5) - lw $15,3*4($5) - mflo $2 - mfhi $3 - sw $2,0($4) - - multu $12,$13 # mul_add_c2(a[0],b[1],c2,c3,c1); - mflo $24 - mfhi $25 - slt $2,$25,$0 - sll $25,1 - multu $14,$12 # mul_add_c2(a[2],b[0],c3,c1,c2); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $3,$24 - sltu $1,$3,$24 - addu $7,$25,$1 - sw $3,4($4) - - mflo $24 - mfhi $25 - slt $3,$25,$0 - sll $25,1 - multu $13,$13 # mul_add_c(a[1],b[1],c3,c1,c2); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - mflo $24 - mfhi $25 - addu $7,$24 - sltu $1,$7,$24 - multu $12,$15 # mul_add_c2(a[0],b[3],c1,c2,c3); - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - sw $7,2*4($4) - - mflo $24 - mfhi $25 - slt $7,$25,$0 - sll $25,1 - multu $13,$14 # mul_add_c(a2[1],b[2],c1,c2,c3); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - mflo $24 - mfhi $25 - slt $1,$25,$0 - addu $7,$1 - multu $15,$13 # mul_add_c2(a[3],b[1],c2,c3,c1); - sll $25,1 - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sltu $1,$3,$25 - addu $7,$1 - sw $2,3*4($4) - - mflo $24 - mfhi $25 - slt $2,$25,$0 - sll $25,1 - multu $14,$14 # mul_add_c(a[2],b[2],c2,c3,c1); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $3,$24 - sltu $1,$3,$24 - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - mflo $24 - mfhi $25 - addu $3,$24 - sltu $1,$3,$24 - multu $14,$15 # mul_add_c2(a[2],b[3],c3,c1,c2); - addu $25,$1 - addu $7,$25 - sltu $1,$7,$25 - addu $2,$1 - sw $3,4*4($4) - - mflo $24 - mfhi $25 - slt $3,$25,$0 - sll $25,1 - multu $15,$15 # mul_add_c(a[3],b[3],c1,c2,c3); - slt $6,$24,$0 - addu $25,$6 - sll $24,1 - addu $7,$24 - sltu $1,$7,$24 - addu $25,$1 - addu $2,$25 - sltu $1,$2,$25 - addu $3,$1 - sw $7,5*4($4) - - mflo $24 - mfhi $25 - addu $2,$24 - sltu $1,$2,$24 - addu $25,$1 - addu $3,$25 - sw $2,6*4($4) - sw $3,7*4($4) - - .set noreorder - jr $31 - nop -.end bn_sqr_comba4 diff --git a/release/src/router/openssl/crypto/bn/lib b/release/src/router/openssl/crypto/bn/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/buffer/lib b/release/src/router/openssl/crypto/buffer/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/buildinf.h b/release/src/router/openssl/crypto/buildinf.h deleted file mode 100644 index 549bf5790c..0000000000 --- a/release/src/router/openssl/crypto/buildinf.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef MK1MF_BUILD - /* auto-generated by crypto/Makefile for crypto/cversion.c */ - #define CFLAGS "mipsel-uclibc-gcc -fPIC -DOPENSSL_PIC -DDSO_DLFCN -DHAVE_DLFCN_H -ffunction-sections -fdata-sections -DOPENSSL_NO_ERR -DL_ENDIAN -DTERMIO -Os -DLINUX26 -DCONFIG_BCMWL5 -pipe -DBCMWPA2 -funit-at-a-time -Wno-pointer-sign -mtune=mips32 -mips32 -DOPENSSL_SMALL_FOOTPRINT -fomit-frame-pointer -Wall -DSHA1_ASM -DSHA256_ASM -DAES_ASM" - #define PLATFORM "linux-mipsel" - #define DATE "Sun Jun 9 14:49:43 CEST 2013" -#endif diff --git a/release/src/router/openssl/crypto/cast/lib b/release/src/router/openssl/crypto/cast/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/cmac/lib b/release/src/router/openssl/crypto/cmac/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/comp/lib b/release/src/router/openssl/crypto/comp/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/conf/lib b/release/src/router/openssl/crypto/conf/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/des/lib b/release/src/router/openssl/crypto/des/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/dh/lib b/release/src/router/openssl/crypto/dh/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/dsa/lib b/release/src/router/openssl/crypto/dsa/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/dso/lib b/release/src/router/openssl/crypto/dso/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/engine/lib b/release/src/router/openssl/crypto/engine/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/err/lib b/release/src/router/openssl/crypto/err/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/evp/lib b/release/src/router/openssl/crypto/evp/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/hmac/lib b/release/src/router/openssl/crypto/hmac/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/idea/lib b/release/src/router/openssl/crypto/idea/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/install.com b/release/src/router/openssl/crypto/install.com deleted file mode 100644 index 8bc1e180e6..0000000000 --- a/release/src/router/openssl/crypto/install.com +++ /dev/null @@ -1,150 +0,0 @@ -$! INSTALL.COM -- Installs the files in a given directory tree -$! -$! Author: Richard Levitte -$! Time of creation: 22-MAY-1998 10:13 -$! -$! Changes by Zoltan Arpadffy -$! -$! P1 root of the directory tree -$! -$ IF P1 .EQS. "" -$ THEN -$ WRITE SYS$OUTPUT "First argument missing." -$ WRITE SYS$OUTPUT - - "It should be the directory where you want things installed." -$ EXIT -$ ENDIF -$ -$ IF (F$GETSYI("CPU").LT.128) -$ THEN -$ ARCH := VAX -$ ELSE -$ ARCH = F$EDIT( F$GETSYI( "ARCH_NAME"), "UPCASE") -$ IF (ARCH .EQS. "") THEN ARCH = "UNK" -$ ENDIF -$ -$ ROOT = F$PARSE(P1,"[]A.;0",,,"SYNTAX_ONLY,NO_CONCEAL") - "A.;0" -$ ROOT_DEV = F$PARSE(ROOT,,,"DEVICE","SYNTAX_ONLY") -$ ROOT_DIR = F$PARSE(ROOT,,,"DIRECTORY","SYNTAX_ONLY") - - - "[000000." - "][" - "[" - "]" -$ ROOT = ROOT_DEV + "[" + ROOT_DIR -$ -$ DEFINE/NOLOG WRK_SSLROOT 'ROOT'.] /TRANS=CONC -$ DEFINE/NOLOG WRK_SSLLIB WRK_SSLROOT:['ARCH'_LIB] -$ DEFINE/NOLOG WRK_SSLINCLUDE WRK_SSLROOT:[INCLUDE] -$ -$ IF F$PARSE("WRK_SSLROOT:[000000]") .EQS. "" THEN - - CREATE/DIR/LOG WRK_SSLROOT:[000000] -$ IF F$PARSE("WRK_SSLLIB:") .EQS. "" THEN - - CREATE/DIR/LOG WRK_SSLLIB: -$ IF F$PARSE("WRK_SSLINCLUDE:") .EQS. "" THEN - - CREATE/DIR/LOG WRK_SSLINCLUDE: -$ -$ SDIRS := ,- - _'ARCH',- - OBJECTS,- - MD2,MD4,MD5,SHA,MDC2,HMAC,RIPEMD,WHRLPOOL,- - DES,AES,RC2,RC4,RC5,IDEA,BF,CAST,CAMELLIA,SEED,- - BN,EC,RSA,DSA,ECDSA,DH,ECDH,DSO,ENGINE,- - BUFFER,BIO,STACK,LHASH,RAND,ERR,- - EVP,ASN1,PEM,X509,X509V3,CONF,TXT_DB,PKCS7,PKCS12,COMP,OCSP,- - UI,KRB5,- - STORE,CMS,PQUEUE,TS,JPAKE -$ EXHEADER_ := crypto.h,opensslv.h,ebcdic.h,symhacks.h,ossl_typ.h -$ EXHEADER__'ARCH' := opensslconf.h -$ EXHEADER_OBJECTS := objects.h,obj_mac.h -$ EXHEADER_MD2 := md2.h -$ EXHEADER_MD4 := md4.h -$ EXHEADER_MD5 := md5.h -$ EXHEADER_SHA := sha.h -$ EXHEADER_MDC2 := mdc2.h -$ EXHEADER_HMAC := hmac.h -$ EXHEADER_RIPEMD := ripemd.h -$ EXHEADER_WHRLPOOL := whrlpool.h -$ EXHEADER_DES := des.h,des_old.h -$ EXHEADER_AES := aes.h -$ EXHEADER_RC2 := rc2.h -$ EXHEADER_RC4 := rc4.h -$ EXHEADER_RC5 := rc5.h -$ EXHEADER_IDEA := idea.h -$ EXHEADER_BF := blowfish.h -$ EXHEADER_CAST := cast.h -$ EXHEADER_CAMELLIA := camellia.h -$ EXHEADER_SEED := seed.h -$ EXHEADER_MODES := modes.h -$ EXHEADER_BN := bn.h -$ EXHEADER_EC := ec.h -$ EXHEADER_RSA := rsa.h -$ EXHEADER_DSA := dsa.h -$ EXHEADER_ECDSA := ecdsa.h -$ EXHEADER_DH := dh.h -$ EXHEADER_ECDH := ecdh.h -$ EXHEADER_DSO := dso.h -$ EXHEADER_ENGINE := engine.h -$ EXHEADER_BUFFER := buffer.h -$ EXHEADER_BIO := bio.h -$ EXHEADER_STACK := stack.h,safestack.h -$ EXHEADER_LHASH := lhash.h -$ EXHEADER_RAND := rand.h -$ EXHEADER_ERR := err.h -$ EXHEADER_EVP := evp.h -$ EXHEADER_ASN1 := asn1.h,asn1_mac.h,asn1t.h -$ EXHEADER_PEM := pem.h,pem2.h -$ EXHEADER_X509 := x509.h,x509_vfy.h -$ EXHEADER_X509V3 := x509v3.h -$ EXHEADER_CONF := conf.h,conf_api.h -$ EXHEADER_TXT_DB := txt_db.h -$ EXHEADER_PKCS7 := pkcs7.h -$ EXHEADER_PKCS12 := pkcs12.h -$ EXHEADER_COMP := comp.h -$ EXHEADER_OCSP := ocsp.h -$ EXHEADER_UI := ui.h,ui_compat.h -$ EXHEADER_KRB5 := krb5_asn.h -$! EXHEADER_STORE := store.h,str_compat.h -$ EXHEADER_STORE := store.h -$ EXHEADER_CMS := cms.h -$ EXHEADER_PQUEUE := pqueue.h -$ EXHEADER_TS := ts.h -$ EXHEADER_JPAKE := jpake.h -$ LIBS := LIBCRYPTO,LIBCRYPTO32 -$ -$ EXE_DIR := [-.'ARCH'.EXE.CRYPTO] -$ -$ I = 0 -$ LOOP_SDIRS: -$ D = F$EDIT(F$ELEMENT(I, ",", SDIRS),"TRIM") -$ I = I + 1 -$ IF D .EQS. "," THEN GOTO LOOP_SDIRS_END -$ tmp = EXHEADER_'D' -$ IF D .EQS. "" -$ THEN -$ COPY 'tmp' WRK_SSLINCLUDE: /LOG -$ ELSE -$ COPY [.'D']'tmp' WRK_SSLINCLUDE: /LOG -$ ENDIF -$ SET FILE/PROT=WORLD:RE WRK_SSLINCLUDE:'tmp' -$ GOTO LOOP_SDIRS -$ LOOP_SDIRS_END: -$ -$ I = 0 -$ LOOP_LIB: -$ E = F$EDIT(F$ELEMENT(I, ",", LIBS),"TRIM") -$ I = I + 1 -$ IF E .EQS. "," THEN GOTO LOOP_LIB_END -$ SET NOON -$ IF F$SEARCH(EXE_DIR+E+".OLB") .NES. "" -$ THEN -$ COPY 'EXE_DIR''E'.OLB WRK_SSLLIB:'E'.OLB/log -$ SET FILE/PROT=W:RE WRK_SSLLIB:'E'.OLB -$ ENDIF -$ ! Preparing for the time when we have shareable images -$ IF F$SEARCH(EXE_DIR+E+".EXE") .NES. "" -$ THEN -$ COPY 'EXE_DIR''E'.EXE WRK_SSLLIB:'E'.EXE/log -$ SET FILE/PROT=W:RE WRK_SSLLIB:'E'.EXE -$ ENDIF -$ SET ON -$ GOTO LOOP_LIB -$ LOOP_LIB_END: -$ -$ EXIT diff --git a/release/src/router/openssl/crypto/lhash/lib b/release/src/router/openssl/crypto/lhash/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/lib b/release/src/router/openssl/crypto/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/md4/lib b/release/src/router/openssl/crypto/md4/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/md5/lib b/release/src/router/openssl/crypto/md5/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/modes/lib b/release/src/router/openssl/crypto/modes/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/objects/lib b/release/src/router/openssl/crypto/objects/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/ocsp/lib b/release/src/router/openssl/crypto/ocsp/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/pem/lib b/release/src/router/openssl/crypto/pem/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/pkcs12/lib b/release/src/router/openssl/crypto/pkcs12/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/pkcs7/lib b/release/src/router/openssl/crypto/pkcs7/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/pqueue/lib b/release/src/router/openssl/crypto/pqueue/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/rand/lib b/release/src/router/openssl/crypto/rand/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/rc2/lib b/release/src/router/openssl/crypto/rc2/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/rc4/lib b/release/src/router/openssl/crypto/rc4/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/rc5/lib b/release/src/router/openssl/crypto/rc5/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/rsa/lib b/release/src/router/openssl/crypto/rsa/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/sha/lib b/release/src/router/openssl/crypto/sha/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/srp/lib b/release/src/router/openssl/crypto/srp/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/stack/lib b/release/src/router/openssl/crypto/stack/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/txt_db/lib b/release/src/router/openssl/crypto/txt_db/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/ui/lib b/release/src/router/openssl/crypto/ui/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/whrlpool/lib b/release/src/router/openssl/crypto/whrlpool/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/x509/lib b/release/src/router/openssl/crypto/x509/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/crypto/x509v3/lib b/release/src/router/openssl/crypto/x509v3/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/libcrypto.pc b/release/src/router/openssl/libcrypto.pc deleted file mode 100644 index e74472683d..0000000000 --- a/release/src/router/openssl/libcrypto.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix=/etc -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: OpenSSL-libcrypto -Description: OpenSSL cryptography library -Version: 1.0.1c -Requires: -Libs: -L${libdir} -lcrypto -Libs.private: -Wl,--gc-sections -ldl -Cflags: -I${includedir} diff --git a/release/src/router/openssl/libcrypto.so.1.0.0 b/release/src/router/openssl/libcrypto.so.1.0.0 deleted file mode 100755 index 57ffec925bf5a2f31aa6d117a8fa969e2e96a362..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 1336264 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 `$o(Aayja?qD=IB!bvYAShhy%i||D|A1R?1 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%0A5qezPs@cr}Hn^ zaUsw6=X_@fue5eH_%=U9#`SjW6( zw+Dl2u-zPh!S5(+2XRK*X>3d7JETQ_cv~c_jrG1Z-lA>DJ+3CUG-lzxS@~PKykBHm z3R%BRWjfv9o6Y>qtMnUfGwv_P9%N(CKvxm7&s;9@>)j?lIrdzu|Jc43RDp>lKG*1TK=r%SY={uZ0-zu z<oXzpN=)}8zbv%b)^Uw2gs~#F zX)VhsVRNgdFCLzlS$@a3o|-{^pQtnIhqdeS$?sRykl#B3ef!UDJKUZ5*lx2#h?#EZ3M!g+e1wts!LgsjgMiZ>lBuUC$Lm5jf{W7$ZZIgH!Tmp5+IM?L@8 z8|xZnEq4d}gl3Y9`hNfX=X2Ku%;!a(&!+R3&l$R~`D_{Ybfj8m-!iX4<-BeSnb!f# zYY*nNBX7p}Y-+A=oEsJH35`oR{m^@|o9M0_{JE~7!In17pHH*_cisz6StIws_jbOX z`F!-NJ{@7wi&t5${gTwZh4tI@xn^zyx%pe^!>ng+WZm^6xisCD>!6S3x@c3bn{Lnb z&>gu9eJs~Un{)m2@!SC2nPYi;B0}}7zeiZ!pTl(1z%8gz35=P?QxAT>hTB`qzs>p$75%XBui-Gm<~^*pVLoY= zH;j*)fydT2%xSlCeM=d4M)KXNOJ{Bxsfgb}+|R&G*QZ8QpWXU~NIUpzTKxmk%*Us2 z-&-Gi^5C28I(8jjLte~Gn#YQI>zUuLzWrIxe~;^3=BtM~n{P5_c>X%gfjS#+GCqLT z7u@J8)^AMK(An+tDYJWu#kVaq{S3Sw`<>R;&+?)-5eT=C*19M^l8R-?KpnF_z+_L2I7zl@IC(? zFR!bfYa)iJ8ZLL&nY{t^!uINOk5rTGWek$D()y=hyx3z-KUANKGfn(^X)xZF91NA~ z4?c4K{P`mxd~Acl(0{HFG4{_m<{bQf+BsGg{@1Fwfb$D8*LNHLMK{A}Ve|_4A)?ME ziZRc)wu52O0$%WP$*di8H}v1YYiVg?tJ(mrP#~W1f-t(q8WO z`tfJpWBhD3QnF}mR4+2@Bib(G2kzL28TgyIZVkb=AS{CAHc!+>T2kCZA0J<0>hgZ8tTvWA1m8@lUooa_i2@ z{oU5Ju-dNmtt{PE!+&Dy!P>O4PW^|Wr@(G^6~l_(jrYiTW=7(o8%6Kgq2s7rvk&oD zdgz*R&K^AzYVp&@wg7#sS2>1pei3+&_0L3K`0bB-3EBq%+wW7z`I1XClN_|^K=n0j z^sOQK_$XES<@ncZC*V&J)fbHa=sDLLcb&dNeeBo%wL|$=Se)@NzTP{n>BvTvx=l@ZVcxKWL^u zj+`xRX!oxH`noT$2FOqLdrF6mw7=ta9cKs232tl-?Y`+2-s`U=1;Cg*r)|bUu-^{rJlj6VYeK(K|p2hYvk2#YA z?G>1RTqkE{TONBhWxs)6I`ik)`Sb_7H|nP2ec9R6_xdv9;|-{#pLKBmIQ?VX@>qL2 z!+jRH620-H;{#dS-b*F*Ytw#_bEcX5_Tv)v=X>>B74JcJTlw8^$)26lBGk2bVaqK} zY|}mlnSU?{hsNt|F**Z zw%Nkom3+>cgJG~G4DRa{?zVlv{N39A`kY_3sPsp$^>=XnRa)Py31Z2T4q({U>FK=4 zd$Uwyw_vxpRQD;|@e`cmD7X0rUz;K)rHy|4Mt$GFvb_JBd-XzQK;j@X?R{VQ{0@6O@qUNjOJYN0;>U;XfV1@p1WKV5+v*R$n=J4Sx z5bhtxnftmOm1kyFEJ%eF6{5Q+zOp)Bdz3`!Wbi%;O#I3(k z%Wb|1tHYpAtA91C{F89Mk_T=_X+aKgAMja^NIocI3t&0QjDuxo=x@0H3GJ<8nF2Y! zUV2FEY@PpK3Gzk8vHiSMvSV;^&2)XtuSZ48<1_vy=d6Em+Q5XzBECb8?4`UGqn>^9 zNI>W5S2#uTm2jO+OyG<62W?Q5c|EMH80&Zhc4F@LBy8}bCYA+bsJ2FSjuxk}RwK7+ zya?|pC^Pd})gH{%VdwYP+?Vx}#CW^!ucVu>a|Vo6V8d-3(X)mhb35oCvX>px^Lk#D zy49Sio-Lo{!uKAyMMX2d_ICeSgB{yH1;)1TtKswr-y@6(ZJU@B<9~!crmcI8^VpuR zR-ZfC7yFg2OGM|;jQo9hgU_ZP19#x|zn0z>IWuB%pEc4>@gbg$hg3Dc)%b2R9`BCC zrzTd@cPIK;Myr-TTJ~Yq_be_W&y}Tnx$l8xqN`-T!P&}pWGtKLDcKVsuL8%Q&ssbq zI+FW<+H%*h4B6p6ke|HUqqE;7l}%YsBRZI~_y6J^Y-bB@6;7Exv-g%MURiT)BNDDH$F+zW4)}cC(3OH`HeTX#lcPc zrceD~`t`Y5{bAy}3|@M_Oie}X(8$YA|HD`sTC%;ztyE~A(b>EjNe{bDe`P<3{mLFRAptZ{Q z*6sD=!ubMw@MQR7_jY2>O0#^j#|@16!OGvifNbk#s9N8JY;8Fbdppid6XG{ENyqiv zR{9uoeYsX0$>X+zV1w!HvfoU;`%qa=#CO5^pCOZ*HLdkeW@^{JgX<#?t8M?pO||O} z3EaH;r)H>s10m;k=2pP!-qx01&FWj=vqYtZBy5y{E6dQ-LGLiS>Nvl`ZX}QDC^q5z^LdzX3XL)etG2fk@Hh*+P z%UL&E+5ezd{;INGXv)cPR-W+1o-WjKyqEHbvohwp2gl~-z|NPa5&pqh(P?J(NT{l+PfS&Mk@8> zt#?=c9{Y0T?{uJi^lPv;e7~%lp}(labQzu)W%(3+XYaN4qLKVr)_>1DG?McBJ8rsn zx}7v?Y&Y??PFHv}+Dxd;20n!%r|-3Q!tS3yo2gG2x@mpiPeXm0BNxyQ`lwT%Qsl3i zO+Wi~c=LVUHNKtr4rT6+nfIos?oAc259~wYPsID_zhOU0Wvw^jmyk|NLo6mEt(B{cc8W<+4z;Nva^b=gG+4OT}Wcpg2)wMb` za`Dy*vQDkF+Bg!vR%dms627%c=vsA+RIb%4fwhW{Oow6OJl6_sZrf^Ln5qK9@$Ki| zPjIbf(@)>_>1*|hu2p*b#apX^2Wqd?vElHwdPUbN=3A?nuGQ#pU^? z&%2dtMc=4gt7GnT7{-Tr0Hce$K$KvkD9k zfByXY39i*_`pJBL`dUSFtx})AcxwgSyVhDg`ML15is)J;eQTA}wHo={bQmSi6Gl;P zKlTL!qpm72YW>{BgTqLTeH(op**1MWqPiZtw}rzfsxV6VV3blA4eB>xx<>Tgz4?m! zXO5frFTem}Mh?ZK%^Ti1Juf@-jqfpC>rFY~@@)YnV&3&h@aC zd;T6~%qiNNjU(0><4vQFhs*aNTtX%`9__8>^~PFbos;y4tU2fp?WgXx`Y_?Xk@6XY z@xAbTE-;Q{jd3ijGLHEng!&YkZV_I+kLPFOg(pSgIr342>D+>C!F9RHdX|I$AE zODq0OeY!gS4UYZ#`1c2le_y!({OkX8IR3>HuIW#QuY3B}#6PruaQp1nzOc3WI4%_b z&UXy0Tc_ing%fSPc=!kVZY})V{i$&Liz)tf`0%g8^1n|7@vqWukFj3;~U>?7h$66dW5mQ_Gp!o6p zi}=IE+H2)tz}OFdvO4XY+w<$w&Lmadk3C!3Y5rt5?Zg!)Uiw5h&UXBow1f7icFZ1c z*Vh=wh0@OXj$vxcblS0SdS=VTqaB=O)S{iWTf%84uC&wXqn%Eroz#|a{1ckd^DD+N zrlp4`aMslQzJ~UH5+4@sgW!8=eCJ!ibI8O@0j8}?BZ+VHW%qp1z!82}2|AF6e>3W> zrJ=0G*NrC_577_qfI$2HbFH)77ibaRRKwN5yUZMLW}Tt$&v;&qxpmT57V(j7PZo$t zrv-kcIHzx*r{nMq@aIA@zDurS&ifx;)^^%;kGbuCrEpVp&4yYHtPaXl43G z-DVod`Td@o=z6j3ud#PErl-nwf14BB_~vDt<*`pNpIJ!eESY3Xr-jel)oy%GzdwsJ zWphR?``?}C54Q-tkcIze+mkNtLW#E>X806{UM)28#4?M+ope*SJkIVZ2RLi^ScYL} zVR3!VpC_uBZpqD~Ys>J!U5|Kg;NivoMCi^U;=hSD7rmUR1;_B>VYyq}_-F5K|9gfH zeA3PrHq9TOc~9xQfIX$N%AOM2d-3*^fz8$Tl#RQ7{XON6FK|zJ@?+t9NAzJH~Yus&eVj> zKQu__XWQ-JbFPRl=lQHvdP1AW_wCJh#IGyITD;X)Hu$Bz`A%QiTeR$4AScb?VaXj; z&Yku;t#{%pmG$DgD(l&^N_#i5tykDyS?>z1Hx|s3|CP#mHlGV{>o|}7d5cS27WI`K z=6&>Z-YaWVp1FG@+&6MC;9ud7<;HLLG*%$edt$b{Z$#$2FYCoG z3{t1~o64OE;)~<0d$qcVP3vNK4pMv0k0&S#p6`45x*30`j=w{B)oOP~ev*0dGd#A| zuN)Fv=&_y83Vlaz3t!g=_!rBE6}WBh$ohuypT(NJ%)ABnRofhbwygCVH0|yZ(f>XY z-XHS)zg}fR@ZUPRHZ{*3BAd@7tgZf!c1gK-A)Q*l`l z?~%XC^D*`OEx_9V>*sww1&WWMegdNZZ8T%t!(&{}V;rQXCf2bWwwC3vH7th>upG9U zWsiQwu|6JuhR2UP3cL51J~pvzj(hYrvE0yUWg*6gwj&w%1;xxAfBToUJxO$q$JfpK zk@X|^Lx$&W-p7-&R}>~B-@KJSlar3Q&#x~VrQYmn7x#kgpMZ?qvCH@mr)8h@`tGuR z1!uVbg4ciBVUl}x4{<-8WMbH?EOCs-@Kv8If%?y@EMdk|(DAtC@n9@=47g7_skjC? z9eFempNX;)?=yEZLXM8o=G+L{J%hXt+cj5*p{eKIw*fI6an!A&E5skFlfE}$+p_ge zb9-%CFU@UuxjNRTAnSd>&Npesf&3ZZb!YiIJHJnA9gHDu>m)PIIUd96+gFwAZSvK# zbvE9#A@#dt<3%%aU$7kmub14^OEBbx|t9~DB zx*pje<7sjoeNyNquKgy%HSP#kNu)vgs{54Hcr ztOwT7;%Bye(2j<1Rhxd}F7-zoAy7?1%<~@1lJ$dFmdFDNN<~^)K8Q!&# zy!(;t6TIxXTV^Mt^#x?KeLgvCc|b-h_{ywIg*|J8dBbxLcydmwudKlMKIJRB%vaWr zv)QkCWtV7Kdb>vp5nj7!c^oWL?cAF`82>*nQ;iN8c>3=e6ZwBA9L`C^skx9f4rURj zuqNQE)f|$a7w_X$-lsLzM)Vo=^XuMgWVULtHevIa{E!)MlE?czkM}v=+fMP`c9QqD z6TG(_=e_M2-rFWs&q}&G^RUev8C;x`n1aKTw2a;sL43<<#*0lX_YCaqO=*nnG`SEs z2AXXor<|7oH2FBM>loAIGTrYw+^{umz9l>R8zM;}ic{VF#EUFWZ3J@|~$-^Wyz{-A)5nt23aE z*eXVur@LMZP2c+~V`%;xx8JC_*!*L56sBmKXmQTw4z}Y*p5Z^&xcctW58IJH;hlAv z7|Lz_gw79y=TE5Dcwv4&+%)D;v&IVr^I>zJEiab+Voh8)#)TLn#3&`q-?B(%j~XBx~!m|MmZ~ycb4Ni)GE;RP6k^*Jd*)u{8HznAdDA$5I(w#Q0NO*W6(`6l)!WzL&~1ldNBvK06fmQ#_7eYTtIBN^^b4 zbU#;n3gkw}f$4IbmzfXRJvWA&7)o=v?~-ZawBnELTV!Eh-zbAz>c@$w#R=vA$o=t` z^d7;Te_&jY{_ipEp**Sip5}{Oxwr^EYs;dtejd+xg3SF)EOivGQM}@{%w1*t7aV`P zt$@>U154~bxE~zv9g6hSQGHLTbW7KY*br=9CeNPsi#|~=64Lih?fXjY8-1>(N0x1- z(RQMzd7t5{X68Q^rg`c+$=hB|`9(07!cpA^ zzNmFUi^$t+?GCuN5%m}9SWy2{T>o=g-#?#`5WjU#PD$kqZ6}L>7t0EHmKE|WE96;L z$g`}FXIUZ7vO=C^g>qi6De~@v3O<`56UBD0JaDbt|B7~rhM24DFEBl&>gZ7Ff0lN{ zafhM(26wF?x<~T7b>qzeu0Jf_5N+r04y90kMeHBx6|u?xwEQjPos(-T?G6d@^6;+y zz@b#L;#EIQ&%@hD=1#WYz8kUfJY^WaGK^=L@t_aW+OH~J=qnpBVzkU8S1nppP?n44Q3D4xL4R-hz5#?r-2Q-bhFd* zze>H#qa2B?t*82S|GYjDGOsfwGp}!b%jx;{w|cv-pdlF(BR9d9t2a^4<8kBeXgwMD z{Ul{|z=LG&Izc-R^PbankFou){=iSw&Tew9*?G(~7Mu5uXchC0r@7zjnSOeU!FglO zwepi;El%7p(^_oTwb&r%T38F%ArZ?&bX^fK1}kFMNzOF821_~*P+M|61=rwG`DUQ# z!GAyUcryGCr2KPUA2Mga{`I49$4aQb^KDy4SHR1ivDbH=V0GfwMe^ zp6;-G8TZe^UW)ul5m{5WfV;eKMvA{H&ZL>fs@XjUs*Ist$AI?He*?FTdwFgUDx)W-38xp&y5SCPqGQb$M1chj!@fOoh2JFD=)jbZwSwq@>C%2?Zu zp^4Fq;&j-3b{=kYz9$?$&59e%K6{0%|7hj+<+w4RKmyTIt@aP zu(@3)zf;UVeqLhyRv83kVfRSFUl(&eHV}?;c8+KdbG(#HPMFD^o_vM*W4 z*3*OZ7}j^E_(@NH-=$+p>zM4FA>CxobYuG7-Wg)wzw)l>a?Nb-4B2o-q)B-wXeG(CvYp}h=>YFQu99Dsa2`Fz^{J)ouSv++ zH7C_w;oFmOT2u#xoq)^oxJ#?-kHWmCN$m@^4e{0B?{;uoww-SAd#ZlVJYZ1xT?2zz zObA2z=J>mF+h}V_eZj5&(XHbfEX49HS z+wzSR4UMOKxwV;f=FsW2~U-2DMk2Go9*Z*W0vTd^ca`2-?J2qI{jNyeXu-XLThUF=o^iAHG*$2YiHi zNTwBIa1^KD#}=g5v+u0d&Lib^Vj*;X?42HtSG(Iy{A$Kje5!##e=fq2@ zd;pwAejea?gx9)B?tb^^dXB(?<%HwOGLBxQc#Irol5d*V!S1uR-K_yyS)jB+{7qc& zUU9w?IG+sg0TP-(U$)&~YI!Bvi74E=uy@C#hNn-`ZwcHzo{n{khOF<$b$u7< z`UcmwJ_Pse+NNe$+mDB=?d86;jRt7oeAd@b7u%IC@O>C<*fqBFvE}Wvhi4ccX%2zo z$7Vq%&aVN>kIewf<{GfhbL^urEguG2lq!eEikZ$xsf%Nd@^OAYOS$$YirC(V7v75A6oeefI# zdlvfi=&_Oxd#9H(%=xvzUi>2z_mV~ivHSl_yzRwntLwN{uf@F9vu>MFo9C(!T^}^EDMZ&t zY$xm$CwA#Lt)9>NUe&u#T@s(Lusr)1bJw&ne`nfy82!`a^MzlB*%wmk(*{3vl`(l7 z@DqejC}f}r%f(Sz!t|Wxy02w9VR^2VR^%kFA=MX~DO!xt++v)X>R$0{wDU6ZO{FhyTXIlx^um8(D!&&#PLj)B?8IY+mTcV=y#aR{Ie%74 zE}D|_ZjyL{M$wrwj@MVl_^XWph8cz7cc!hsh2@KHGq8N}SAVoDQ}_Lep1Q{;y6cWk zbk%)lqO1mrm+cw73O#&cBYI4A)dIKjCA%ik}Vqd?!DL`T1UcZs+HX{2bxu z2l#o9{@%gQL0Y^BV?thCjEnb(9DYaW?OFU@$M3g&0Ow)bbEbSK`(_zmujFrTrF(PG zZ_GDC*-@@5@k<1o%p(*2vV&X(UW)Rt_U8H8Lw$TFe(T)Mll(2<@N>qw-z4O%8ms8{ z6qhe5w_Q1h75x51nS*`bEAL<7ca4Hm{%=f~+=KnWXH(E)->m0$=(|<>w(EEa=E?Q! zZ`h(be7|8Y$@qSQr>x=M8~LBuLV4e^W!t2`WJQ1I3v1rYJUC5{F7wBU;QgNajQ(Wr z6UX_loY%w(4*YN7cWZraMF-{g_>S>3&v=?=Jk2wn<{3}(jHh|VQ^D>2I?pBs9FP3A z!Et+k?$Nbx&_hYa}J=Xp+d1^AoTMH8?${a(axbF}-J@E6_-cJHe!n<}3l zW+Zp{-11)8%W~qtc!aL!y<>p)ilJ;P4UUu3+Z7l6)^7u>l$~4OTFqu`WP!Nu2{Eyo zNp7zca_d~8eJ3^7-nPmtztTM~PkmdO1a4Mi4|kRz?QS49_ztv-d#R9Tu9e!0 z37U%GZgJe(aGBJ5VH|#q2mi?C1@_uW(n^Nu8{sz;1OCkAZ}GlSzB@BMNBGG0EZ#Zt zcY6_ShwU9foICuRGp|Q8WC+}IGdfAIjp953W5k*?P_hBzWLV@@#Qs9;D;PWKUQUDJ zD{~nouY`S^_1qlxOv5XZ4yiqLN$2$f%Q$izGrWzy6=9isCoNF;zGD4c(mN%V%k(Mt z!o(pPw$k;vM#$#;x7cmf*K{sve(&zPU>#P*wTFcsmOG%M zE{|;{_{FmvaFyvBvNqN#vp*s}5!l-ga{X)FI@*x}-qzDl40pW$d+B5xWvfLdA9NCv zHXpgs-&w{;m^OPEewhN+bEbJcbImMmo3Lw2PSrvjbF{kICzNkCk8$yZ=T8h-s-6bQzGo$|i>7jNwvz0Vm_ma)gGSDr z#XW^G|L*E~2Y9~ds!5HT^&~VJ`!4B`Y=I^)5ILzOW;pXVyA1w_t z@9FKRHfGWP-s0^mHueW+pbm|6G%?RboX^yQmFIqlReJGDmH7&T=X|H%TwAwWjXdqj zv+Vj-?B8ytyq_JHcmZ>UV0E31WgbFR&$Gn-`{vsF_k7>}-Q?T9!SD8Iyh)zR|duF$9&wP{anH#wr`|n5i zxrCoCA*Nt|408Nj-8+}--U*$hmHD>2+nfuFjM?db2mEeGh4U+OMhco+|HH~XkmT;e zdWO})B4mt9gb%e8o8=5G!+Zj^!YLU`tDJkjAbVn~oG+NYF~<7~+L+CrxVx)1K8c?Q z%O|e}%`tqZ<7{TU6+V|{&Q>-Sy-xO0$dtxs%VeynNEP9(}oN z-oGBnzpKsh3WB+;Pc;)_c`VE!5z2ie>|FJy1)yLOS|L7ZP^Qi?s zK4oa^=Yrgx4O0O$x`)uuIi}8$p0)`;e7Q~^cc(k+eQ9= zjmrP8Q66@`^051bhdHSS_}R?Q2l;uMjA4K5qx>A@=O!NyYvkvX_wLPuk1@ZC^^EMz z=P_@d1l}{=lZPur*1rn!^(znT&G(e!Ne0c?2=5gxA-3=Pd8}LWfAM%2${8Lj;g{Jg zvi#!W*%IQT-dGIQMZGB1uf#X=nMLw(50&v0GX-yPq3*awb(5Z`5D$R&{0_lW&P8Tzy`Anuoct;&BG zYlIp!hue{5XTEA=RV%}#)Gp}fi$>;KB{C)QA&V_K;Dc&nuuT3q#9lr3!QRw~4N=f*J+*i5o!zJTyi+^Ev6_XCS!@5g4Tr27=nV2H<`H(5aHb<1j+hVbPY3U4!achW zVlMY)#a~b1iM`Cm3p+Y~^b^LfMmsJp?>_mXO5UCB2(C-zp0;Pl%(APE(bv7H?3;>r z;^R=3XAM8QZI=61c12K*sMHsQ?tNp!SYCG?v~PKdKaMI$|K|Ma(Fwx`G7jh--+&*O zcIze91#zyHSKZF-Ppv!1LPX3w=HGa1Y?4XlTtkm zXXnt-5C^|e*4F4}m#RM2s&b6T7Jn7grIzF{E+dP;hY|K#PoJvSbNP9~e?Oo$A!x7e}XZ+yBq%9@WQve!9o;r5AVq%KUZZ{E!hU$d%y!mHP28rzR*ewiq-l~rowsBLSL*z zSbVs>e{TfFf%uDxJ*c)6oJQQ~^8Xd73 z91=Q~BRrPXJeGcXYNC(6JCUI$CVJ@ciEcU?sxzkPXjXWL*fCmopM5-)q^Fj}>ASoZ zPl%5X;?JTq)NyNFCg!phDfvHc4v!=LKpp1Rl8Tr+H_NicU1Z{`|3PJoMjDD;ZEzs= z8(fBcl4!g8%hF){H~2l?MQ8)#%Yg~hdlln~bU*RMG?G&A>Es=C0G#sy^ zTT+OPgD(NmV1Z~ox9P^O7CM@~=8!91^xgB55Zr*zgOj_eE)$20>zk zdBw!K6(pA<>cnI$^}7~OWY2#M1MDw{POryUFgkrmbdet5M+t+`2~k94gkDw{sEZZRd+rsi=Y1j1`$C@gg*@*IdEOU7?};9; z_K#MxuOQEAAK^~b$9O+^l=lBL3SgW`1tq=K_A-%Fmq2CilpU*_-5u@3%a)d4Q$KALI!cqC;1!I=E}4}PN!oZWvx=X?qMAnsJz zzp8zY*ktTuNgk^ib81%|E#BqOl3o4o4yLo8j=_J4b!paB4^EhTG#T;F-E`3SZN+2{ zHhFZ=ZuNdM(l5qbPmAwE{|uL}{jTsur?{HOfOq}sGlf36|17>6f6(-WxRB_1^o6$S2kT$?j_bhc-g%5%qflo}atreY?xCFxkX7`6v9 zxA1bv%_zrv?mLIFTWwjlDNFPF=odZR=@Kr-`+LO(inBH2ALEG3vRKaBuw>KhD~?#Cn#a;Hw~h!>-YFJsO!3J>e=nqiUs0OKp8JQ}!#k znEK>QeiY}@UT&asbzbIUXvVPFb zHy=tN2Nc@Bu1;*gq9-m?90Cj=o7U;R714Z6X)kBf{ssK6h5zw4`}9oW9w{1?vjf;V7)}e|tJh4%9<{;jd2!e#U@HQSB^1sU$1t}P^Gd&s z8f6=_todt3hc&RskU4`fJgUOhl%zU~2Q%42o{U${ef5Lka~})TJNK3FdK=@_ak>Sz ztWguEd?~lF?w(4TG;&(fxzzGmo}-<&-3J|=^GvpjsfE?Y5!Z1nq{#%@Nr~OgjqSPb zKW;n&3oG&R#D|Q}Zui33;a;r9eCpM=cM*~1JBO@xetGrm@1({Q82fsX<&31{|Ee~x ztu3`_qQl*3VlG&gTyyi%_N4Ng4?*8>&AA!+YuB-(E=z1F)J45pl!xF<2eJXmQHDB( zHcUCSS-npA8SP zmbe=TIr))S1wMhuz1EgINafg>^q}M(Fg*C()K=K#{5C;9Tg-Da@)OI)S5|&YA>R&A z+n&w%U0gCY;ItLS9OSaXctA5LI>_T{R~yKF**6xJWetp($IERjNo>X(if2lLtm7;x zUM4bIvWV}|pV@;mj-|6DW4%rjWm?*wcZ`1$v;wGu5eawNku z$+&9h(!g&d`!l9#>;tFB_+0#>taE2B%IhMz?p&kyK&L{kx3<{Rq;@_RwzVee?QU|1 z8J{*te(XBl$NwKgE1I9MliTUc{RPn?v#0dsex!YVSNmKZTSYC5yTGS%tW|Q7>E77R z-d1O5{yVCdN2}xtj8bP2ZA66^VV-X+27O(>O(sWdBjYh>3c1hhSq=8r2zBMer?xQY z)Wv$2M`irr5pT)?hI6U6#f}lFPN#x4~^*nW(}uej;|IB{EMl$I7{Ym%y(A=b(iA z^T{dtgil{<)3rf)M9N*qme*IorgVun0c} zdS#x#KMuIyS;#wCFL|aJ&jtT*cP#Yt9jWE9VeH?r<%zElcslR`vVXJe8%uIaVtv$> zSdZU~&r4W;D8$z)5v8kE>T6YG)L4_OfVfT0CmA6IOSt(EdtLH2N_uNHjM zsQf>o{2%@NiP!>@#q;6wN9WES#&!>1rF%GF+vnT6-&SSsZss{%Mw7ASvA-n5W5$Fh zPg0ZH>zG_g8_4n??7>)@W*-emJG=+S#4fd@xQqr`un%KDCZ)IKyvO4#5U{lH4BJ;3 zt_kd^i4;*)7-?4iM_K%G>-@~*u82^dWz-ph-u?_wk*%dY;u4^!`8)MjQV%Tk@rzY0ZcP9qviHUU# z$F&T{H4MiAhU036W53E$W3)fNo1Wk?T${!{4H-JVvgz=(w3!Z0Y@tIFTj}A6ZS=^5 z%l$I{xNL;S&_o|jRIk!PP)zd3ikh%LO zLkA|n$C7dufZqovGIHMZ^h(eZ@MV;~mxukEWq`{^=|Da$dK|^hWo}Hx`@7Px@M8Q%*^<$tPSfFGr!97r_l`_~;giquxIv36V)Z=kDQAg$ne?~B zbsYS|`3B?3a>lpiO=F9hPd&2|b2KuF8*3V^cb3Plcjj@K$-DRTO8CRCRyZyhUBJB5 zDd%>Ik;$VASe8m}XiuLVNb&mTdHwUe{`s?|oRy#!Mb8w*Y-=LcenprDRY(d$=|((22%JI ze$wf)?}iO(xb1kRVs53e&ivIuQ3t>u~4@=R-arnNlN zTApbw&$O0jTFW!7<@=RZH!H0kaSW|?Gp+7sS{-9r%`&ZyGOdmgKhl zp6B(N;=YOcS?_pHik@@(I%)s1hVLd3 znI}o&YSuF>HZtA*xkC$1GJc+5I3OQrBQ1XYNrnfv$$cEig6BQ!WMZg;vOng(abAfy zZ#TApj@(xIUae$#C}Y?J(~N;MW_64?C!P zS9?Z+=x4-UNARkzz6rQS}^*>XaDf&KZ(1R_#Rd0VWX z(ALRPZwm4?mroqhF_~E0Sod^jK6OS`F?}IzNO;bU`dj%o&PDm(f)Dd^3;)LX=mP$I2S5Lj ze}9ahj3)~=^YhR6H{!HE!%x@-7?uk@#m_qKmvzikJO73p#{b96JizOFCEgfkjLrOa zL}1mss8P;4DfUXq#!NdqQnFV4*$DloEcS*dtr58(Lh<&tOoo2&E{6tr4-C=(bOhjk zoW41MyJ1@Cdn^|{K7sSN6!VWH<7S<#Rd378<7m3yjN=_Vj(27w<#9CS+SWq)G3>i*PMNVBSl(0kja4{?@bu*OTVZbZ^Kk_6@0QCTc6&#>Q|Dpw>L$xu|AQL7qYy2pktN& z)~WAUgnTUY$ro9nWH!k$idW8$##@h%-D|er}u?Kbqw{rH*F0y zCHK2&uU=w`Z^;D*Oi3>Z^VVWpy%^ zxyLb1<#DXyaeRxAPpLEfG(`N|_xYR(`8Ub=~dj$OE*Si-{Shsj38%kT$Jvo4zd5viw8`JKB}A`VkUYX@TEeqrRJNVSec@WNfI%@MsrZd1_ehRUyAzyuX{< zFR%=x{$ zl;DN$QP-xVJ-dyCjRW)w?YxJ4_1-q#U6QH%0`F&+`APZCSPu9UWT7CPo5d$q(75Ie zlLf;U%$V=^8DxNv#8<3mIwrQ1+&*MYlt-k`;e&V=sCsvmdN+l$eVqHNlREzPXfDY! z-94q^dZecCTgijFr{>2KC3CL(nbN;VzHRV-o-@;0`CTnDcfSr94>r1%bHnScOCb{@ z=2KklcjvlrKRwUmt&-pAo*zXAGCm7<{gLg3s2EyL`rQ`HaD5phx*EbBxb4N8MZX z8RZn8QR-fYtkvxJ`B?|~>vhO(&2oo&;m4Ia8rZL4tX+Jr=;8B3FP|que4bD-u*M5q z)&V_bFOT2;cQyVPJ>1cy_ZVz=>PY!}s9bviNA^o(n4tSGz8t0ak3X)|UqKht&3$j% zhy0Tdi(I76<_Xc;RL7z1*56P5&E%#`Olt0)m z_vHS4E(I;8mmckay}?%A`;#BrvPGn9lr2wSl!lEN~T@Ynn`) ze8d44`v+aGOMEA$T<|?w zIPW`Fc-eQfaL%XnR}t%oYg-2kau=AMp=ji9C}bUyd<)O}a)sx8ched-S6G0II~EYJZ+ zti8yL729o~hCPNR z&es-bBKSoEZG0!-{U!=JixT~0#&({^6t(}<>I|=Cx%kr-#`b)ey2zq;~%4qUHE2EkJ8J{HAakO)9sbxxSkpuFYNwBc={i- zn=$SGoz0GcH`u3@?LX!uerR}T;6Lg?=|Zzp#1-ya2h?a9^f)g0h+I(fLV@%_Z}g4)~Da z-EvwRislkzY%G<(rQ*lDq3oX(Lyp&uGeVVq1wpxQEBo-^z3~;mJvZ_wBDN;#e1?)O z$gLeYU}Ysg@qw$d;H!iBt}B$>A%aUZrFgLIU6=pi>u z$}d}V@>&<~3p6;Lq;lJO_ksCsY(~K+)m%1ZqbbW`s@#q|K;ZSbuZbiNJMfQ+YJW-B zFL@*dF1SaEB+GegM*YgJ8M$Y1Pt+wg;lp|C(?O=^a;D;Tx{}I1o6qzeJ-V$fn)o7Q z+PA`%*iKov1B$Z@27j9C>F5`Y-2?gyYdfx-U*&}{ur~ML)%n8SsQbWJtmUw{XA!fw zF-}G6M)))-U#0dN;nQSwGBtfSzrV4bR`zV6mGQ3;U}G`oTfzJvb1Kqz;?@d3f72Jo z+`=s5K~Bfobo1P-cQ**$g|$sK=EFGbG7h_p!!F~n%Q);Z4$EFk2h?7h{9d&^o8swf zs`3S2ei8p3zyUZ}=dnRhcLQYAir*0bUL{?C%rp6UHLo!55w!8Ax2XGM&k*YY)&+BqyQ;oUcY_iqG{qQ(+V1g6yVQR4JwY>oHE~xpby9UI@9Cu@yE*bmf z9sgRkkLu;Nd*~R;W=C08Q!rC;bXoq2rATZr64;ZEu-u7!eL3zMFaloW3PjIN!R8=k zH_++gCMOzyFE!Fgmx{G?$U$Dn3f*;>k9NM{u2+N?1|=3O!ai-JVcWasQ14S!wkOL-*$lx?H5!gv>YihWN8C3G`Gogl4*1YSmgtKA zP3{v$M5kbUu#7#S@qN5f&kr#0&aKfiw?jO)?-xmY1uxS$|yG*lvB4l<$T&5A!n6kfh4P z{Ip&(z~|t|K6fB#a&Sk)zM_GQ4Osu)A`Qnu*R17!xsPR-A6BqZIh&VhSp8>i)30;X z{8p*|-I7~=(9?cE;|1Qond=P+ZmD`hbJSbO^_F?+t)HVFVkY$j%Jq_-dOUb0Zey#bjXF=gDQ>G&!13oN>uspdE=(s4*nRA zSUZx+Z_lss7<#gW@o_)n zyzBL&!&E?eXErn_>8iL8Uv(KIrvdW$7U?ZIx&`Y#5Y##6w0zrie(+OPZKuR z$$Q^r^t&*hHE>Vh92lO0ZwBh2o!Ei?41V|USRn^)(z+GJN9x7*0^cuXc?);8Q#+O2 zB;Lapyk6s$kA_DY$8Z;->@>C#;(%`)>D2T*EIxR{BXxTGpnqFMzGQrWJrB1TJAj-O z@ZmaK(&@BlTw+<2WuhyY2K8q`v?}uk8t#Hk&7#R+GP!`G@tmdRI^sG9RGt{{f_G_p z(R6oNW{c3Fj-npBl7GwdULn3^<6p$PBK60K_rIn6wK4848h<#*@VK5P9ya*Dzl8tE z68_sfUhp;Cfy2+-z^#@0p3!}`(!mGXXySpDbm#$Md5GEr#60~0_;wo~aPj}ft=sjC z8O5C}bM?iMH;)Wm;%`>k0~8k-_DY9g)sYq*(s)OPpF{i{ZCSF_gJfGQeMEEX4&|PR97UROlc^;_aod?lJGHAb_MufM0 zmJn1DF-i|Wq18eWih z@eTgLcboZ%%lyP;e&RAeahadE%uihACoc07m-&f1re&dN&5r{AL-8ZyOLRf|621J- zbK6ncCU)l~#E|);vOe+Wjv=$&Gp1VpLGV?=83Fz}&;vBm{q|gOV@f_f)SO>IYv=XL znfa%=VPX8G94*H}-i?T!VKf6B`PMg-@7I@Ud)Hb%-nP)_+T|;B`N92_<+J^fl#dmB zt<*WIHXQALnjenlY!19qG12yjza!>3$@p#juJ%^>U6~lnDh5e{s(H79cZ>K%MZ`D3 z%EJbEKG<)1p)9My5&+O6-@h2h+^?gm+V4cBz~tmq@&jsMeRjo_(>VwdK94^ygk0fWAIi zb+-DH?Byj6+Ejl0L-~&pe2qrog8^R&naAI#`{%s!l}J_jN~H2Zp4SWa86DuN_UKrG zkk^mTcS3WOf3f<`#N0r;==*&_i$?NmDOtZJTjn7WQ;_NV`?Q=8D&d{d53d8gj+N;< z%F=r)>!hpdARmFP+fy(s_f?%6*ud-)9+)lHbQAHvF6X^5d2gjorA4=m+(9LN6hm$! zEgSPqjQ8{Nk4VKH z-@#9oE$p5AWLd)AMaU(jV%`0YK08#>G30m>n|aB54O*jY=V_L2@P;>*ZRg*oeFSZq z4q<;bQMzWV3$*Qx<6z5r1jN7cU9xwdVfuMOVqKv8t)${PyhY+i1f02OCEj()erl1J zdL1%$#DPdp!T;a1w}RS)E+L=QQfWJuN34jeDNzx#FDQ2IFHS*!0bYVSExJxK*HPm{ z%m%~)1a7=IrE)x|n71lFQF~s^4Y*t{xD)2K783Js&9@isOCYpjQv32S9tmu7)B3LS z#;ma|-tfi`Inh&UADVq+Yu`(UR8HKV6caY|?HhI*8lTfLZc6c>hbnc^f-B6^7i#B! z`#=82&TH(R|13 z`>s~Mku&qt*Z)7pT3GWBmFqfJtOcj4-dwR3Ui)TQw_hEP7%)=#>ZfUCDel5Zrj=&< zr^V%-LFqtLeCzQC8fbMq$aLSP+VNbj5T0o}o%U%`zGhCgF>YzTtbEOa^qzo$rQyZ+ z?Wam#$oXRbhQB$#-q$v^F^mUq#yrQ6BXl|pSYf`MdcG0bQ_5u@V0qI|$*{rC044IZ zV1V}x)F1D(Z-XzK*ueyGZ;(!sHx8PK`Et32iGzDQPi#{;N6&(ViZv79b4)cnE|!lu z@Qq5kF`((j%coWO$$KjAfXunTkD`(d~?iE-EK? z$k4sw-L0qR->=ZYm>9k+?+ATD|JD6^>1X$KI+l-)Ydf32QU!l~`R`}X6Ld=1uOeT{ z&Z&rw7yUBREYp5i$B+oiy_&iUFVVlhuRhB>eo-GlLmPc`(uqz^)2mvy_gvN4E2d%p zRAyggF44I1bB%_tw8U3&l&Ik;M(SP$;TT8Jx+gw0K)*O z_!;1ZA^L-M_%)%;K_1&^8Zx?*z5SThImScEueR!Jiu{C17Jhs|{Bqmh{c`zbtgDh= zHvL^C-fv^PkI?SS<-G4n{+q}&>iqT*8qN?UrkW_p{}NL{{zsIPctTD549dTm(jGbT zx7GNo&Zs)4j^L{~cjA2WS(=?c88q={EK4dKikjyh$T^B1N-kpP>afm|k2;bhlat!q z30KRE;lHhfsTmXQnM^-`+x?{SzZ!UX&tZR3W32cFXH0KjQ_o!*3_i0!7>v#VgSZC< z@p)hndTwDbaOZ)+js?PC^1sfeA?V`)s>~H_=tXt>sjd2Zd~=^?JopCh2R-jIHQvX} z`vu6-uOar_q|%{4hL*97&B)lQ^?Qcq;OqsPV0`PPyVddiS89DAVyY+^33t*s&^@{xcJr!__NG>J3hZ+vF*L!Xk`T(Ao*0D>tl2`u-f5%cC z+4V>AMEBZ)(sjaGypvvWb5Qqi2oV+x>ld3PL*ZG>Kw66x=+w%^aoi9adtbjjwM3% zJl_+Nt1V2^Q`IzPhi8A`+#DACc{XFy*D^uc9BS*C&~g)%~U%fAEW?9S{C&TQwa6MAH6jnwP$FqyxK4PO*QYXt%q#V@u^^| zR*LnNo+juFd-dGk#W)UFzmvz%Ep%!q8<+ZRke5u()kbSRlVAd^-9=ZQ)_6j$bc& zDh-S4SmuN;Kx3}e;;~sl{;o;BuV>j3ejA4wPKT*61{fV<7@Z(k$MD{@+R|Sm;HJtG ziI`6M3>-^Z7(?6WS}SU=C8Za;%{o_1EDcKhUf@$oa=$D@2e#wuzg&KQ_AQnCe#O_T z&o}eMJ*mBZzozL+1The(FT?AW>4EJZui4urKPqTTeYS^_GHN646j>~7~P4#E7 zE&;v&uuko=w#}07w@v=`=Ru3jx;61PxFcX5XCb~qd5w1R8r5ZI$Nq>|3QwML+jxz@ z4!QFzV#jYY*k-6D}k0ZvHWJ!UA&(sN;nKU+7|vA z)$#gZZzI2I6!+D<-{;F0{qnQ(pB2NT<8+NFy#aIv|4ijv%0D5MLv2RuXlHcXuK!2J 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 z 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 bhq6_1WfXcV+%wndu3qeqxxk#eU1G9Z_;ZCv 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%0Ad@Xmvz96WA)o19xYZLLooGvep9YUX8Rfu{^$? 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 N+Du)OY3FUr{{vFM8LI#Q diff --git a/release/src/router/openssl/openssl.pc b/release/src/router/openssl/openssl.pc deleted file mode 100644 index 340c8632fc..0000000000 --- a/release/src/router/openssl/openssl.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix=/etc -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: OpenSSL -Description: Secure Sockets Layer and cryptography libraries and tools -Version: 1.0.1c -Requires: -Libs: -L${libdir} -lssl -lcrypto -Libs.private: -Wl,--gc-sections -ldl -Cflags: -I${includedir} diff --git a/release/src/router/openssl/ssl/install.com b/release/src/router/openssl/ssl/install.com deleted file mode 100644 index fe1d7268e2..0000000000 --- a/release/src/router/openssl/ssl/install.com +++ /dev/null @@ -1,90 +0,0 @@ -$! INSTALL.COM -- Installs the files in a given directory tree -$! -$! Author: Richard Levitte -$! Time of creation: 22-MAY-1998 10:13 -$! -$! P1 root of the directory tree -$! -$ IF P1 .EQS. "" -$ THEN -$ WRITE SYS$OUTPUT "First argument missing." -$ WRITE SYS$OUTPUT - - "It should be the directory where you want things installed." -$ EXIT -$ ENDIF -$ -$ IF (F$GETSYI("CPU").LT.128) -$ THEN -$ ARCH := VAX -$ ELSE -$ ARCH = F$EDIT( F$GETSYI( "ARCH_NAME"), "UPCASE") -$ IF (ARCH .EQS. "") THEN ARCH = "UNK" -$ ENDIF -$ -$ ROOT = F$PARSE(P1,"[]A.;0",,,"SYNTAX_ONLY,NO_CONCEAL") - "A.;0" -$ ROOT_DEV = F$PARSE(ROOT,,,"DEVICE","SYNTAX_ONLY") -$ ROOT_DIR = F$PARSE(ROOT,,,"DIRECTORY","SYNTAX_ONLY") - - - "[000000." - "][" - "[" - "]" -$ ROOT = ROOT_DEV + "[" + ROOT_DIR -$ -$ DEFINE/NOLOG WRK_SSLROOT 'ROOT'.] /TRANS=CONC -$ DEFINE/NOLOG WRK_SSLXLIB WRK_SSLROOT:['ARCH'_LIB] -$ DEFINE/NOLOG WRK_SSLINCLUDE WRK_SSLROOT:[INCLUDE] -$ DEFINE/NOLOG WRK_SSLXEXE WRK_SSLROOT:['ARCH'_EXE] -$ -$ IF F$PARSE("WRK_SSLROOT:[000000]") .EQS. "" THEN - - CREATE/DIR/LOG WRK_SSLROOT:[000000] -$ IF F$PARSE("WRK_SSLXLIB:") .EQS. "" THEN - - CREATE/DIR/LOG WRK_SSLXLIB: -$ IF F$PARSE("WRK_SSLINCLUDE:") .EQS. "" THEN - - CREATE/DIR/LOG WRK_SSLINCLUDE: -$ IF F$PARSE("WRK_SSLXEXE:") .EQS. "" THEN - - CREATE/DIR/LOG WRK_SSLXEXE: -$ -$ EXHEADER := ssl.h,ssl2.h,ssl3.h,ssl23.h,tls1.h,dtls1.h,kssl.h -$ E_EXE := ssl_task -$ LIBS := LIBSSL,LIBSSL32 -$ -$ XEXE_DIR := [-.'ARCH'.EXE.SSL] -$ -$ COPY 'EXHEADER' WRK_SSLINCLUDE:/LOG -$ SET FILE/PROT=WORLD:RE WRK_SSLINCLUDE:'EXHEADER' -$ -$ I = 0 -$ LOOP_EXE: -$ E = F$EDIT(F$ELEMENT(I, ",", E_EXE),"TRIM") -$ I = I + 1 -$ IF E .EQS. "," THEN GOTO LOOP_EXE_END -$ SET NOON -$ IF F$SEARCH(XEXE_DIR+E+".EXE") .NES. "" -$ THEN -$ COPY 'XEXE_DIR''E'.EXE WRK_SSLXEXE:'E'.EXE/log -$ SET FILE/PROT=W:RE WRK_SSLXEXE:'E'.EXE -$ ENDIF -$ SET ON -$ GOTO LOOP_EXE -$ LOOP_EXE_END: -$ -$ I = 0 -$ LOOP_LIB: -$ E = F$EDIT(F$ELEMENT(I, ",", LIBS),"TRIM") -$ I = I + 1 -$ IF E .EQS. "," THEN GOTO LOOP_LIB_END -$ SET NOON -$! Object library. -$ IF F$SEARCH(XEXE_DIR+E+".OLB") .NES. "" -$ THEN -$ COPY 'XEXE_DIR''E'.OLB WRK_SSLXLIB:'E'.OLB/log -$ SET FILE/PROT=W:RE WRK_SSLXLIB:'E'.OLB -$ ENDIF -$! Shareable image. -$ IF F$SEARCH(XEXE_DIR+E+".EXE") .NES. "" -$ THEN -$ COPY 'XEXE_DIR''E'.EXE WRK_SSLXLIB:'E'.EXE/log -$ SET FILE/PROT=W:RE WRK_SSLXLIB:'E'.EXE -$ ENDIF -$ SET ON -$ GOTO LOOP_LIB -$ LOOP_LIB_END: -$ -$ EXIT diff --git a/release/src/router/openssl/ssl/lib b/release/src/router/openssl/ssl/lib deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/openssl/stamp-h1 b/release/src/router/openssl/stamp-h1 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/release/src/router/pptpd/.gitignore b/release/src/router/pptpd/.gitignore new file mode 100644 index 0000000000..28cd3206f0 --- /dev/null +++ b/release/src/router/pptpd/.gitignore @@ -0,0 +1,9 @@ +*.o +*.so +stamp-h1 +bcrelay +config.log +config.status +pptpctrl +pptpd +config.h diff --git a/release/src/router/pptpd/AUTHORS b/release/src/router/pptpd/AUTHORS new file mode 100644 index 0000000000..28942213dd --- /dev/null +++ b/release/src/router/pptpd/AUTHORS @@ -0,0 +1,52 @@ +Poptop -- The PPTP Server +------------------------- + +Current Maintainer: +James Cameron + +Previous Maintainer: +Richard de Vroede + +Original Authors: +Matthew Ramsay +Kevin Thayer +David Luyer +Peter Galbavy + +Other Contributors: +Ron O'Hara +Allan Clark +Harald Vogt +Bruno Lopes F. Cabral [!3runo] +Peter Stamfest +Sergio M. Ammirata +Norbert van Bolhuis +Visarion Mandzgaladze +Hernan Otero +Jan Dubiec +Pawel Guraj +Chris Wilson +Anton Gorlov +Charlie Brady + +The Linux PPTP Server takes advantage of some Linux PPTP client code +written by C. Scott Ananian + +Other Credits: +Moreton Bay +Lineo +Snapgear +Linvision + +SourceForge - Current host for the mailing +list and CVS repository. + +Christopher Schulte - Previous host for the +PPTP Mailing List (sadly missed, in James' opinion). + +Peter Galbavy - Previous host for the +PPTP CVS server. + +Luc Richards - The author of bcrelay. + +Wing Kwok - The author of ADS howto. diff --git a/release/src/router/pptpd/COPYING b/release/src/router/pptpd/COPYING new file mode 100644 index 0000000000..a43ea2126f --- /dev/null +++ b/release/src/router/pptpd/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/release/src/router/pptpd/ChangeLog b/release/src/router/pptpd/ChangeLog new file mode 100644 index 0000000000..877e3f70ec --- /dev/null +++ b/release/src/router/pptpd/ChangeLog @@ -0,0 +1,635 @@ +Mon Apr 16 10:32:40 2007 James Cameron + + * pptpd-1.3.4.tar.gz: released. + +Mon Apr 16 09:38:13 2007 Phil Oester + + * pptpgre.c: fixes two packet reordering bugs, (1) the check for + out-of-order sequence numbers only validates that the sequence + received is greater than the previous sequence received. But this + is invalid if for instance packet 20 is received after packet 10. + It should instead verify packet received is equal previous packet + plus one. (2) the packet dequeue function was using the wrong + pointer, which led to corruption of all packets placed on the + queue when they were dequeued. Thanks to James Cameron for the + testing tools which made discovery of these bugs possible. + +Thu Feb 8 09:59:00 2007 James Cameron + + * plugins/pptpd-logwtmp.c (ip_up): accept either two forward or + two reverse slashes as the delimiter. + +Fri Dec 8 10:49:27 2006 Charlie Brady + + * pptpctrl.c (startCall): turn off echo on the slave pty, so that + any packets that arrive before pppd is ready will not be echoed + back to the client. Deprecate PPP_WAIT. + +Tue Sep 5 09:42:46 2006 James Cameron + + * pptpd-1.3.3.tar.gz: released. + +Tue Sep 5 09:25:25 2006 James Cameron + + * defaults.h: remove MAX_CONNECTIONS reference. + + * samples/pptpd.conf: add connections clause, remove reference to + MAX_CONNECTIONS. + +Tue Sep 5 09:10:55 2006 James Cameron + + * pptpd.c (processIPStr): add new informational message to + indicate when the number of connections is constrained by the + configured IP address ranges. + +Tue Sep 5 08:52:20 2006 James Cameron + + * pptpd.c: fix segfault on -C option, cause was option string + didn't include argument flag for number of connections. Closes + Gentoo Bug #132898 + thanks to Alin Nastac (mrness at gentoo.org) and Peter Volkov. + +Thu Aug 3 12:02:02 2006 James Cameron + + * plugins/Makefile (LIBDIR), Makefile.am (LIBDIR): support build + of x86_64 mixed architecture. From: Anton Gorlov. + +Thu Aug 3 11:14:59 2006 James Cameron + + * configure.in: rewrite use of AC_ARG_WITH and AC_ARG_ENABLE to + more properly support the negative case. Reported by: Phil + Oester. + +Thu Aug 3 09:55:25 2006 James Cameron + + * plugins/Makefile: include libutil. From: Anton Gorlov. + +Thu Apr 20 16:18:26 2006 James Cameron + + * pptpd.init: ensures the service is not enabled by default when + installed, and adds a "condrestart" target that will restart the + daemon if and only if it's already running. Reported by: Paul + Howarth. + +Tue Apr 18 14:47:29 2006 James Cameron + + * pptpd-1.3.2.tar.gz: released. + + * configure.in: fix --with flags to work --without, change + --with-bcrelay to --enable-bcrelay. + +Mon Mar 27 11:42:36 2006 James Cameron + + * pptpgre.c (decaps_gre, dequeue_gre): only report to LOG_DEBUG if + the debug option is set. Reported by: Thomas Stein + + +Tue Feb 14 10:52:13 2006 James Cameron + + * pptpd-1.3.1.tar.gz: released. + +Thu Dec 29 17:39:15 2005 James Cameron + + * pptpd.c, pptpmanager.c, pptpmanager.h, defaults.h: make + connections limit a run-time option. + +Thu Dec 29 15:45:51 2005 James Cameron + + * pptpd.c (launch_bcrelay): insufficient space was allocated in + the argv array for the number of elements used. + +Thu Dec 29 12:11:23 2005 James Cameron + + * pptpd: remove PPPD_IP_ALLOC in favour of a configuration option. + + * pptpd.8: add --delegate + + * pptpd.conf.5, samples/pptpd.conf: add delegate option + + * config.h.in, configure.in: remove --with-pppd-ip-alloc option + + * pptpmanager.c, defaults.h, pptpd.c: convert from conditional + compilation to run-time checking. + + * samples/options.pptpd: describe how to force local IP for tunnel + even in delegate mode. + + * INSTALL: remove build.sh reference. + +Thu Dec 29 11:04:13 2005 James Cameron + + * pptpgre.c (pptp_gre_init): prevent initial unwanted GRE ACK. + From: Jonathan Barker + +Mon Nov 21 10:53:09 2005 James Cameron + + * bcrelay.c (mainloop): ignore ENOBUFS rather than fail. + From: Rajkumar S + +Mon Oct 31 09:21:11 2005 James Cameron + + * pptpctrl.c: change GETARG to GETARG_VALUE and add a GETARG_INT + and GETARG_STRING macro, to improve readability. + +Mon Aug 22 10:45:14 2005 James Cameron + + * compat.c (sigpipe_assign): remove superfluous sigset variable + and calls; they served no purpose. Reported by: Pavol Gono. + +Wed Aug 3 19:04:07 2005 James Cameron + + * plugins/pptpd-logwtmp.c: fix compilation warning by including + string.h + + * ctrlpacket.c (read_pptp_packet): initialise return control + message type, to fix compilation warnings. + + * pqueue.c: compilation fixes, use of log() and warn() replaced + with syslog(). + +Wed Aug 3 17:33:40 2005 James Cameron + + * pptpd-1.3.0.tar.gz: released. + +Tue Aug 2 21:31:25 2005 James Cameron + + * samples/options.pptpd: disable Van Jacobson compression. + Reported by Pawel Pokrywka. + +Tue Aug 2 21:27:11 2005 James Cameron + + * pptpgre.c: packet reordering implementation, contributed by Vijay + Bharadwaj. + +Tue Aug 2 19:32:47 2005 James Cameron + + * pptpdefs.h (MAX_ECHO_WAIT, IDLE_WAIT): comply with RFC2637, + reported by Tobias Brox, updates 20040811-0. + +Tue Aug 2 19:30:30 2005 James Cameron + + * plugins/pptpd-logwtmp.c (ip_up): implement + pptpd-logwtmp-strip-domain option, closes 20050401-1. + +Tue Aug 2 19:01:42 2005 James Cameron + + * Makefile.am (EXTRA_DIST): add html directory, missing from + distribution, closes 20050729-1. + +Fri Jul 29 22:56:08 2005 James Cameron + + * pptpdefs.h (PPP_WAIT): default ten seconds wait for PPP packets + to begin to be sent. + + * pptpctrl.c (pptp_handle_ctrl_connection): wait for first packet + from pppd before continuing, an experimental fix for bug + 20040521-1. + +Tue Jul 12 16:33:23 2005 James Cameron + + * pptpmanager.c (pptpmanager): process initial packet header + length field properly. Reported by: Alex Beregszaszi + +Thu Mar 3 16:19:17 2005 James Cameron + + * bcrelay.c (mainloop): ignore ENETDOWN and ENXIO from sendto(2). + Closes 20040428-0. + +Thu Feb 24 11:48:08 2005 James Cameron + + * pptpd.8: add section on debugging, contributed by Peter Mueller. + +Thu Feb 17 13:05:31 2005 James Cameron + + * pptpd-1.2.3.tar.gz: released. + +Thu Feb 17 13:01:22 2005 James Cameron + + * pptpd.c (showusage, showversion): change from poptop to pptpd. + +Tue Jan 25 09:01:49 2005 James Cameron + + * pptpctrl.c: perform error checking on dup2 calls, as on Linux + they can fail under certain circumstances. + +Fri Jan 14 13:38:58 2005 James Cameron + + * pptpd.c, pptpctrl.c, bcrelay.c, configure.in, acconfig.h: add + configure option --enable-facility to set syslog facility to use + in logging. e.g. LOG_LOCAL0 + +Mon Jan 10 09:51:05 2005 James Cameron + + * config.h.in, configure.in, pptpgre.c (encaps_gre): uses writev() + if available, to avoid a memcpy() of the GRE payload when sending + off the packet. From: Marcus Sundberg. + +Thu Jan 6 10:07:39 2005 James Cameron + + * pptpmanager.c (pptp_manager): compilation fix for gcc < 3, a + regression introduced in pptpd-1.2.2. Reported by: Peter Mueller. + +Wed Jan 5 22:12:38 2005 James Cameron + + * pptpd-1.2.2.tar.gz: released. + +Wed Jan 5 21:16:15 2005 James Cameron + + * compat.h, compat.c (sigpipe_*): build a generalised signal pipe + delivery ... thing, for use by pptpd and pptpctrl. + + * pptpctrl.c (main): use signal pipe delivery instead of calling + syslog(3) in the SIGTERM handler, call the old handler bail() when + SIGTERM is delivered via the pipe. + + * pptpd.c: kill bcrelay outside a signal handler in order to avoid + deadlock. + + * pptpmanager.c (pptp_manager): use generalised signal pipe + delivery, return to caller on SIGTERM. + +Wed Jan 5 17:30:50 2005 James Cameron + + * pptpmanager.c: fix bug 2004-01-05-0, hang due to syslog(3) + called by signal(2) handler. Derived from contributions to PPTP + Client by Jean Wolter. + + * pptpmanager.c: add pipe for queueing SIGCHLD events. + + * pptpmanager.c (sigchld_handler): add safe handler for SIGCHLD. + + * pptpmanager.c (sigchld_responder): move old handler into + non-signal context function called from main event loop. + + * pptpmanager.c (sigchld_setup): move SIGCHLD signal handling + setup into own function. + + * pptpmanager.c (pptp_manager): call the new signal handling setup + function, FD_ZERO each time around (it wasn't being reset), watch + the signal handling pipe in the main event loop, handle EINTR + return from select by ignoring it and restarting the select(). + Added code to handle signal pipe data. Removed code for blocking + SIGCHLD on new connection, now that the signal handling is linear. + +Thu Dec 23 09:17:29 2004 James Cameron + + * samples/options.pptpd: turn off logging to stderr by default, to + prevent loopback detected. From: Andrew Hall + + +Thu Nov 11 14:20:18 2004 James Cameron + + * pptpd.spec: allows the RPM to be built on Red Hat Enterprise + Linux systems that use an older version of autotools. From: + Charlie Brady + +Thu Jun 24 09:35:58 2004 Peter Mueller + + * pptpd.init: avoid spitting garbage if no processes exist. + +Wed Jun 23 19:42:33 2004 James Cameron + + * pptpd-1.2.1.tar.gz: released. + + * plugins/patchlevel.h: update pppd version requirement, so that + pptpd works with Paul Howarth's pppd 2.4.3 CVS packages. + +Fri Jun 4 13:56:20 2004 James Cameron + + * pptpd.init: warn that restart may cause problems, provide + restart-kill. From: Peter Mueller. + +Tue May 25 11:35:49 2004 James Cameron + + * pptpd-1.2.0-b4.tar.gz: released. + +Mon May 24 20:27:53 2004 James Cameron + + * debian/copyright: fix spelling to fix lintian warning. + * debian/changelog: remove emacs stuff to fix lintian warning. + * pptpd.8: refer to pptpd.conf(5) early on, and remove EXAMPLES + section, as it contributes nothing. + * pptpd.conf.5: add documentation for firewall rules. + +Fri May 21 20:43:55 2004 James Cameron + + * pptpd.spec: rework to build under rpm 4.0.4, depend on ppp >= + 2.4.2, change description to match Debian package, add vendor, + propogate changes since 1.1.4-b3 involving obsolete scripts and + new plugin. + + * Makefile.am, plugins/Makefile: add missing pptpd.init, add + debian packaging from downstream, propogate DESTDIR and prefix to + plugins install target. + + * debian/changelog: change the version to -0 to avoid clobbering + the later Debian package. + +Mon May 17 16:28:49 2004 James Cameron + + * pptpd.c: bug fix, only check PPP options file readability if an + options file has been given in the configuration file or command + line. Reported by: Andrew Alexandrov + +Mon May 17 12:31:34 2004 James Cameron + + * Makefile.am (EXTRA_DIST): remove html, as the documentation is + out of date, explicitly name samples, tools and plugins files to + prevent CVS in tarball. + +Mon May 17 12:31:09 2004 James Cameron + + * debian: merge upstream Debian patches. From Rene Mayrhofer. + +Fri May 14 15:50:35 2004 James Cameron + + * pptpd.c (killbcrelay): bug fix, pptpd catches SIGTERM to kill + bcrelay, but doesn't kill itself. "This patch solves partially + the problem. When there is a connection established klling the + main pptpd process will not kill the control connection process." + From: Pawel Guraj. + +Thu Apr 29 20:18:19 2004 James Cameron + + * pptpd.8, pptpd.conf.5: adopt man page review suggestions. + From: Chris Wilson. + +Thu Apr 29 19:49:59 2004 James Cameron + + * plugins/pptpd-logwtmp.c (ip_up): use the username that was + authenticated from the peer_authname variable rather than the + local host name hiding in the user variable. + Reported by: Pawel Guraj. + +Thu Apr 29 16:56:05 2004 James Cameron + + * ctrlpacket.c (deal_out_call): print connection speed properly. + From: Jan Dubiec. + +Thu Apr 29 16:49:03 2004 James Cameron + + * pptpd.c: fix segfault if built --with-bcrelay but neither + bcrelay config option nor --bcrelay command line flag used. From: + Jan Dubiec, Pawel Guraj. + +Wed Apr 28 21:24:25 2004 James Cameron + + * README.logwtmp: write up new feature to track user connections + and disconnections using the standard wtmp(5) mechanism. + * defaults.h, pptpd.8, pptpctrl.8, pptpctrl.c, pptpd.c, + pptpmanager.c, samples/pptpd.conf: add --logwtmp option. + * plugins/Makefile: derive from PPP CVS plugins example. + * plugins/patchlevel.h, plugins/pppd.h: copy headers from PPP CVS. + * plugins/pptpd-logwtmp.c: add plugin to update wtmp. + * Makefile.am: add targets for plugins build and any future + subdirectories. + * tools/vpnwho.pl: mark as obsolete. + +Wed Apr 28 19:54:04 2004 James Cameron + + * pptpctrl.c (main): waitpid() rather than kill() the pppd, so + that ip-down scripts get executed. + +Tue Apr 27 09:11:32 2004 James Cameron + + * NEWS: change attribution on request from author. + + * Makefile.am (EXTRA_DIST): include README.portslave, re-order list. + +Sun Apr 25 20:31:52 2004 James Cameron + + * pptpd-1.2.0-b3.tar.gz: released. + +Sat Apr 24 20:51:54 2004 James Cameron + + * pptpgre.c (decaps_hdlc): add hint for EIO on read() of PTY, + suggesting a look at option syntax and pppd logs. To address a + FAQ seen on mailing lists. + + * pptpd.conf.5: add routing checklists for three different methods + of allocating subnets and configuring pptpd. + + * pptpd.8, pptpd.conf.5: add noipparam option documentation. Move + speed option to end of list. Rework text for simplicity. Cross + check against pptpd.c. + + * pptpctrl.8: rework argument list, cross check against + pptpctrl.c, remove examples because running from inetd(8) is + unusual and not encouraged. + + * pptpd.c, pptpd.8, pptpmanager.c, pptpctrl.c, defaults.h: add + --ppp option to specify PPP program to use in place of default + PPP_BINARY, and pass the new parameter to pptpctrl. Also reworked + option handling and validation to simplify code. Use access() + instead of fopen() to verify that files can be read or executed. + + * pptpd.c: bug fix, --stimeout option was not working due to use + of strdup() and a blind cast instead of atoi(). + + * pptpd.c: bug fix, --noipparam option on command line was causing + premature exit during option processing. + +Fri Apr 23 21:01:31 2004 James Cameron + + * tools/pptp-portslave: add contribution from Russell Coker, on + Debian Bug#126486. + +Fri Apr 23 20:34:28 2004 James Cameron + + * pptpctrl.c (main): fail if arguments insufficient, closes Debian + Bug#107933. + + * .cvsignore: include config.h and stamp-h, to assist with CVS + updates. + +Fri Apr 23 20:13:43 2004 James Cameron + + * AUTHORS: hide author e-mails, add contributors since last release. + +Fri Apr 23 20:00:02 2004 James Cameron + + * stamp-h, config.h: remove from CVS. + + * import: remove huge superfluous screen snapshot that was slowing + CVS access. + + * .cvsignore: update for new build environment, include everything + that might normally be in a user directory checked out from CVS. + + * samples/options: not relevant, removed. + + * tools/confmod.sh: mark as obsolete, relevant only for ppp-2.4.1 + forks. + + * reconf, version: adjust comments. + + * pptpd.spec: include vpnwho.pl (old version at this stage until + Bruno finds me the latest version) in the RPM packaging. + + * pptpd.conf.5, pptpd.8: expand acronymn DOS. + + * pptpctrl.8: add note that speed is ineffective on Linux. + + * makepackage: use complete version, including beta release, as + part of the packaging; don't hide the beta release version. + + * configure.in: remove warning about /usr/local/bin/pptpd, since + /usr/local/bin is locally administered; we have no right to warn, + we may have been responsible even in this version for placing the + file there. + + * Anon-CVS-Root: obsolete, removed. + + * build.sh: obsolete build.sh + + * README.bcrelay: wrap to 80 columns. + + * README: rework for new release. + +Fri Apr 23 17:05:23 2004 James Cameron + + * makerpm: remove from CVS in favour of makepackage per Richard's + e-mail on 1st August 2003. + + * Makefile.am (EXTRA_DIST): add README.bcrelay, older ChangeLogs, + tools, spec file, and makepackage script. + +Fri Apr 23 16:15:59 2004 James Cameron + + * reconf: remove setting of pptpd.conf version. + + * samples/pptpd.conf: remove package version from file, use CVS + revision header instead. + + * samples/options.pptpd: clarify comments, default to work with + PPP 2.4.2. + +Thu Apr 22 16:38:01 2004 James Cameron + + * pptpctrl.c: remove report of connection speed for Linux pppd. + +Thu Apr 22 13:41:11 2004 James Cameron + + * pptpd-1.2.0-b1.tar.gz: released to test team. + + * AUTHORS: adjust to reflect new maintainer. + + * bcrelay.c: when compiling without --with-bcrelay, fail + immediately with an error message suggesting a rebuild. + + * bcrelay.c: adopt VERSION from main package, cause my_daemon() to + be conditional on not HAVE_DAEMON. + + * pptpd.c (killbcrelay): avoid code when BCRELAY is not defined. + Fixes compiler error when pptpd is configured using defaults. + + * Makefile.am (dist-hook, EXTRA_DIST): remove CVS from final + source distribution. + + * samples/pptpd.conf: remove some whitespace and wrap. + + * Makefile.am: remove CVS from dist target. + + * RELEASING: new file of release instructions, for 1.2.0 release + candidate. + + * configure.in: change version. + + * pptpd.spec: change version. + + * ChangeLog: adopt GNU format. + +Fri Feb 27 09:53:19 2004 James Cameron + + * pptpctrl.c (pptp_handle_ctrl_connection): on any CALL_CLR_RQST, + terminate the call. From: "Bruno Lopes F. Cabral" + 2004-01-08 + http://marc.theaimsgroup.com/?l=poptop-server&m=107359240120864&w=2 + +Fri Feb 27 09:50:41 2004 James Cameron + + * pptpctrl.c (launch_pppd): make sure SIGCHLD is unblocked. The + procmask gets inherited from the manager and usually has the + SIGCHLD blocked. Actually pppd does not expect that somebody + tampered with its signal mask, thus we just unblock all signals + and leave them to be handled by pppd. This fixes the "ip-up + zombie" bug. From: Peter Stamfest 2003-09-06 + http://marc.theaimsgroup.com/?l=poptop-server&m=106284825408104&w=2 + +Thu Feb 26 15:17:37 2004 James Cameron + + * pptpd.8, pptpd.conf.5 (speed): note that speed is ineffective on + Linux, despite being accepted by pppd. + +Wed Dec 10 09:28:01 2003 James Cameron + + * pptpctrl.c (launch_pppd): report program binary path. + +Tue Dec 9 10:22:01 2003 James Cameron + + * pptpctrl.c (launch_pppd): report cause of failed execvp(). + * pptpctrl.c (startCall): better explain launch failure. + +poptop (1.1.4-b5) unstable; urgency=low + + * Added code to pass ipparam to pppd - By Sergio M. Ammirata + * Added Debian packaging information (not included in .tar.gz) + * Added bcrelay_v1 - By Norbert van Bolhuis + + -- R. de Vroede Fri, 18 Jul 2003 11:34:05 +0200 + +poptop (1.1.4-b4) unstable; urgency=low + + * Bugfix: First GRE packet always discarded - By: fghdgh (gcc111) + * Bugfix: Console fds left open, ssh hangs - By: fghdgh (gcc111) + * Bugfix: Pidfile option doesn't work - By: Visarion Mandzgaladze + + -- R. de Vroede Fri, Jun 20 2003 11:34:05 +0200 + +poptop (1.1.4-b3) unstable; urgency=low + + * Bugfix: Two buffer overflows in pptpctrl.c - By: Hernan Otero + + -- R. de Vroede Tue, May 13 2003 11:34:05 +0200 + +poptop (1.1.4-b2) unstable; urgency=low + + * Bugfix: Potential buffer-overflow in ctrlpacket.c + * Callid enhancements. From: Ilguiz Latypov, Debian Bug#171831 + + -- R. de Vroede Wed, Apr 9 2003 11:34:05 +0200 + +poptop (1.1.4-b1) unstable; urgency=low + + * Added BCrelay (Broadcast relay) + + -- R. de Vroede Fri, Oct 11 2002 11:34:05 +0200 + +Poptop ChangeLog +--------------------------------------------------------------------------- +v1.1.3 +* Wed Apr 9 2003 Richard de Vroede +- fixed a potential buffer-overflow in ctrlpacket.c + +* Thu Aug 22 2002 Richard de Vroede +- added stimeout option to pptpd.conf manpage +- updated the Changelog file ;-) + +* Tue Aug 20 2002 Richard de Vroede +- removed debug commandline option from pptpd.init + +* Thu Aug 1 2002 Richard de Vroede +- added config(noreplace) so old configs don't get replaced +- fixed postscriptlet +- adapted spec to cvs tree + +* Wed Jun 26 2002 Richard de Vroede +- specfile now supports --with[out] options + +--------------------------------------------------------------------------- +v0.9.13 -> v1.1.3 +* June 18 2002 Richard de Vroede +- migrated to version higher than last poptop release +- bugfixed + +--------------------------------------------------------------------------- diff --git a/release/src/router/pptpd/ChangeLog-0.8 b/release/src/router/pptpd/ChangeLog-0.8 new file mode 100644 index 0000000000..9bb5e588c9 --- /dev/null +++ b/release/src/router/pptpd/ChangeLog-0.8 @@ -0,0 +1,196 @@ +PoPToP ChangeLog + +--------------------------------------------------------------------------- +v0.8.13 -> v0.9.0 +11th June, 1999 + +- possibly fixed the 'error 629 on startup' bug. this fix is incompatible + with the 'silent' option of pppd, so don't use the 'silent' option. +- support a single localip with a range of remoteip's +- new, small, fast, simple get_call_id() function +- removed a few hardcoded values in ctrlpacket and replaced with defines +- new pptp_read_header() - slightly more 'expensive' but should be much more + robust +- use openpty() if possible, internalize tty opening, startCall much more + simple + +--------------------------------------------------------------------------- +v0.8.12 -> v0.8.13 +10th June, 1999 + +- removed ctrl-manager pipe completely +- moved awareness of pppd-ip-alloc option to manager only +- if using pppd-ip-alloc, manager runs more efficiently +- made pptpctrl able to have a none, one or both of local/remote addresses + rather than only both or none +- great code simplicication +- re-did IP parser; less potential segfaults from bad config +- correctly calculate max connections based on number of IP addresses given + and statically configured maximum +- no max connections for the pppd-ip-alloc case +- properly permit hostnames in IP parser +- always use fd 0 for network connection +- fixed -c option +- note - this version changes the 'run from inetd' options. re-read + README.inetd if you use it + +--------------------------------------------------------------------------- +v0.8.11 -> v0.8.12 +8th June, 1999 + +- made autoconf actually check the relevant headers +- made config.embed.h and removed most #if EMBED in favour of using this +- fixed some includes and re-arranged things to be a bit cleaner +- minor cosmetic fixes +- fixed compilation on StarOS 4 (and hence SunOS 4) +- documentation on running from ientd +- removed ctrl-manager pipe by default + +--------------------------------------------------------------------------- +v0.8.10 -> v0.8.11 +8th June, 1999 + +- now only two executables, pptpd and pptpctrl +- re-did dependency generation +- minor include cleanups + +--------------------------------------------------------------------------- +v0.8.9 -> v0.8.10 +8th June, 1999 + +- added getopt_long() from GNU libc for use on non-Linux platforms +- fixed compilation on FreeBSD, Digital Unix and Solaris +- replaced PPTPD_DEBUG define with configuration option (debug) and + command line option (-d/--debug) + +--------------------------------------------------------------------------- +v0.8.8 -> v0.8.9 +7th June, 1999 + +- unified CTRL and GRE processes (removed pptpgre), without the vfork + problem since this is not forking +- changed process name for child processes to pptpd [ip.address.here] +- moved INTERNAL_IP_ALLOCATION to a configure option (see configure --help) +- added support for libwrap tcp wrappers +- made sure pppd doesn't get copies of file descriptors it shouldn't, so + it closes down properly +- lots of other misc fixes + +--------------------------------------------------------------------------- +v0.8.7 -> v0.8.8 +4th June, 1999 + +- increased MAX number of clients to 100 +- layout and comments have been tidied up extensively throughout code +- new function in ctrlpacket.c for making Control Message headers +- openBSD fixes +- many other minor bug fixes +- some portability issues addressed +- accept() moved into pptpmanager. +- pptpmanager closes one side of socketpair server fd and passes client fd + other side of socketpair to pptpctrl. +- pptpmanager main loop changed to select without timeout and made to + watch ALL appropriate file descriptors. +- also made resiliant against some potential error modes, eg, if we are + full don't select on new connections descriptor, if accept() fails + ignore it cleanly, etc. +- should be more 'resource friendly' now. +- Make error state filename instead of just CONFIG FILE: file not found. +- Limit packet size to PACKET_MAX instead of permitting 4 more if no ACK + is bundled (for consistency of packet size limit). + +--------------------------------------------------------------------------- +v0.8.6 -> v0.8.7 +1st June, 1999 + +- GRE seperated from pptpctrl to support vforking +- adds link status detection (ie if a link goes down, we can figure it out + and deal with it) (Kevin) +- Solaris/Slirp port (Harald Vogt) +- cleaned up comments a lot (move towards C style to permit compiling in + older compilers/increase portablity) +- standardized #ifndef #define #endif defines in header files +- stop inststr from nuking environment (hopefully) +- use longer argv[0] in exec()s to make inststr much nicer +- make inststr wipe args other than argv[0] +- #define to remove some debugging (PPTPD_DEBUG) and to remove the + IP address allocation code so PPPD can be used to allocate IP addresses + (INTERNAL_IP_ALLOCATION) +- in pptpctrl.c, main()'s addrlen was uninitialized - yuck, was causing + random variable overwriting +- clean up some wasteful memory copying and so on, as well as remove some + copies into small static buffers +- clean up some blank lines - increasing the amount of code visible one + screen is good if it can be done without making the formatting ugly. +- use exit() not _exit() in pptpd - the fear of this closing fork()d + filedescriptors is wrong. both have the same file descriptor closing + properties. +- remove a potential leak of 2 filedescriptors in option parsing (checks + of optional file names). +- miscellaneous EMBED support for syslog etc. +- many other misc changes. + +--------------------------------------------------------------------------- +v0.8.5 -> v0.8.6 +21st May 1999 + +- added new ip address reading from config file (for multiple connections) + there is a new pptpd configuration file example in samples/ +- pptpdebug.* is no longer... syslog now handles ALL debugging + +--------------------------------------------------------------------------- +v0.8.4 -> v0.8.5 +18th May 1999 + +- command line args/config file options are broken (everything hardcoded) +- many, many, many structural changes for a multiple connection hack +- multiple connection support +- reconnect support +- OpenBSD port (may be broken for this release... Peter?) +- logging now to syslog DAEMON|DEBUG + +--------------------------------------------------------------------------- +v0.8.3 -> v0.8.4 +13th May 1999 + +- call_id/peer_id issues addressed in OUT_CALL packets +- bug in debug log time fixed +- local added by default to the pppd launcher +- call_disconnect_notify bug fixed +- -p command line arg broken + +--------------------------------------------------------------------------- +v0.8.2 -> v0.8.3 +11th May 1999 + +- a few minor multiple connection hacks.. still nowhere near ready to + handle more than one client +- pptpd -p logfile bug fix + +--------------------------------------------------------------------------- +v0.8.1 -> v0.8.2 +11th May 1999 + +- Server will no longer die if client disconnects +- pppd is closed down cleanly now +- autoconf/automake is back.. but still needs some work +- a number of minor CTRL establishment bugs fixed +- callid assignment modified slightly in manager + +--------------------------------------------------------------------------- +v0.8.0 -> v0.8.1 +4th May 1999 + +- PPTPD no longer relies on a signal (which had the potential to cause + a race condition) to know when to launch PPPD/GRE. The CTRL session + no longer relies on a signal to return from a fork. Signalling has + now been replaced with IPC between PPTPD and CTRL sessions. +- The GRE/PPPD sessions are now launched *after* an OUT_CALL_RPLY is sent + not before it. +- CTRL and PPTP managers are now seperate from PPTPD + +--------------------------------------------------------------------------- +v0.8.0 +30th April 1999 + +PoPToP now works with windows 95/98/NT and Linux clients. diff --git a/release/src/router/pptpd/ChangeLog-0.9 b/release/src/router/pptpd/ChangeLog-0.9 new file mode 100644 index 0000000000..003156b75d --- /dev/null +++ b/release/src/router/pptpd/ChangeLog-0.9 @@ -0,0 +1,130 @@ +PoPToP ChangeLog + +--------------------------------------------------------------------------- +v0.9.12 -> v0.9.13 +17 August, 1999 + +- added pptpd.8 +- added pptpd.conf.5 + +--------------------------------------------------------------------------- +v0.9.11 -> v0.9.12 +16 August, 1999 + +- hand fixed bug in Makefile.in to work around automake bug (distdir + target) +- made 'make dist' work +- added pptpctrl.8 +- added HOWTO/FAQ to html/ and removed old docs + +--------------------------------------------------------------------------- +v0.9.10 -> v0.9.11 +8 August, 1999 + +- increased "receive window size" to match the other side +- improved behaviour if a network write ever fails +- minor changes to macro names and operation of functions +- check call id on incoming GRE packets + +--------------------------------------------------------------------------- +v0.9.9 -> v0.9.10 +2 August, 1999 + +- keep a pid file - /var/run/pptpd.pid by default, overriden by config + option pidfile or commandline option -p/--pidfile +- added another TODO item + +--------------------------------------------------------------------------- +v0.9.8 -> v0.9.9 +29 July, 1999 + +- move libutil.h to after sys/types.h (FreeBSD 3.1) +- add option file passing to SLIRP +- reduce the number of variables used for option parsing/storage +- add option to set local address to bind to ("listen") +- configure script forces pppd ip allocation when needed, rather than + exiting on an error + +--------------------------------------------------------------------------- +v0.9.7 -> v0.9.8 +26 July, 1999 + +- zero sockaddr_in (to blank out sin_len on BSD) +- include libutil.h if there is one for openpty() proto (FreeBSD) +- attempt to continue after failed bind() (OpenBSD?) + +--------------------------------------------------------------------------- +v0.9.6 -> v0.9.7 +22 July, 1999 + +- added doc for setting up MPPE +- use error names rather than numbers where easily possible + +--------------------------------------------------------------------------- +v0.9.5 -> v0.9.6 +15 July, 1999 + +- moved binaries to /usr/local/sbin (ie, configure's --sbindir) +- some documentation fixes +- big warning about having to delete old /usr/local/sbin/pptp{d,ctrl,...} + +--------------------------------------------------------------------------- +v0.9.4 -> v0.9.5 +7 July, 1999 + +- bad sequence number message made to detect duplicates and out of order + and report appropriately +- show if libwrap is selected in configure script output +- completely re-did connection termination to match draft spec (unfortunately + generates a warning when talking to Win98) +- changed capabilities to be more realistic +- fixed echo reply processing (should prevent death when idle) +- made call id handling more sane +- made us always use the right call id in the right place +- print errno on GRE write failures +- bind GRE to address connection was received on + +--------------------------------------------------------------------------- +v0.9.3 -> v0.9.4 +5 July, 1999 + +- fixed to detect Slackware 4.0 needing -lintl for gettext() +- better fix for using different binary locations (cover --bindir too) +- removed select() in ctrlpacket.c in favour of setting control sockets + to be nonblocking (for performance - plain read() is cheaper than + select() especially when you're pretty sure of success) + +--------------------------------------------------------------------------- +v0.9.2 -> v0.9.3 +2 July, 1999 + +- changes to configure to fix SLIRP option and print out options chosen +- configure --prefix fix + +--------------------------------------------------------------------------- +v0.9.1 -> v0.9.2 +17th June, 1999 + +- made usage info not show details which aren't relevant to current config +- made configure force pppd-ip-alloc on systems where we don't yet support + passing IP addresses to pppd (SLIRP, BSDUSER_PPP) +- minor slirp fix for pppd startup detection + +--------------------------------------------------------------------------- +v0.9.0 -> v0.9.1 +17th June, 1999 + +- made a few minor changes for slirp +- added macros for PPTP packet creation and removed memcpy() where simple + assignment is sufficient; CPU usage should be lower +- cleaned up call_id to always be passed around as a network byte order + u_int16_t +- added some missing ntoh32() in pptpgre.c (currently no effect as ack_recv + is ignored) +- speedups in GRE routines +- no longer close stderr (fd 2) in pptpctrl.c to overcome problems where + syslog() is absent +- increased debugging in openpty() + +--------------------------------------------------------------------------- + diff --git a/release/src/router/pptpd/INSTALL b/release/src/router/pptpd/INSTALL new file mode 100644 index 0000000000..c2b65d2323 --- /dev/null +++ b/release/src/router/pptpd/INSTALL @@ -0,0 +1,188 @@ +Note: logwtmp plugin source file patchlevel.h must match pppd version +on system if it is used. Edit the file plugins/patchlevel.h +accordingly. + +-- + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. diff --git a/release/src/router/pptpd/Makefile.am b/release/src/router/pptpd/Makefile.am new file mode 100644 index 0000000000..94a0cfd399 --- /dev/null +++ b/release/src/router/pptpd/Makefile.am @@ -0,0 +1,109 @@ +# We have our own, simpler dependencies stuff in 'reconf' +AUTOMAKE_OPTIONS = no-dependencies foreign + +@SET_MAKE@ + +export LIBDIR=$(libdir)/pptpd +INCLUDES = -I. +## Change this if you don't have gcc +## -pedantic removed for now (OpenBSD header files). +## -Werror removed for now (getopt stuff on OSF/1 throws a +## warning with -Wmissing-prototypes). +## -Wmissing-prototypes removed (eg, Linux 2.2.6 headers +## aren't up to it). +CFLAGS = -O2 -fno-builtin -Wall -DSBINDIR='"$(sbindir)"' +#CFLAGS = -O2 -fno-builtin -Wall -ansi -DSBINDIR='"$(sbindir)"' +#CFLAGS = -O2 -fno-builtin -Wall -ansi -pedantic -Wmissing-prototypes -Werror -DSBINDIR='"$(sbindir)"' + +man_MANS = pptpctrl.8 pptpd.8 pptpd.conf.5 + +EXTRA_DIST = \ +html README* ChangeLog NEWS TODO $(man_MANS) \ +samples/chap-secrets samples/options.pptpd samples/pptpd.conf \ +Makefile.uClinux config.embed.h version reconf \ +tools/pptp-portslave tools/vpnstats tools/vpnstats.pl tools/vpnuser \ +pptpd.init pptpd.spec makepackage \ +plugins/Makefile plugins/*.h plugins/*.c \ +debian/README.debian debian/changelog debian/conffiles debian/config \ +debian/control debian/copyright debian/dirs debian/docs \ +debian/examples debian/pptpd-options debian/pptpd.conf \ +debian/pptpd.init debian/pptpdconfig.pl debian/rules debian/templates \ +debian/po/POTFILES.in debian/po/fr.po debian/po/pt_BR.po \ +debian/po/templates.pot + +EXTRA_PROGRAMS = +sbin_PROGRAMS = pptpd pptpctrl bcrelay + +# Header files are only used to determine what to put in a distribution, not +# for dependencies, so just attribute them all to pptpd. + +pptpd_SOURCES = \ + pqueue.c pptpd.c configfile.c pptpmanager.c compat.c inststr.c getopt.c getopt1.c \ + pqueue.h compat.h configfile.h ctrlpacket.h defaults.h inststr.h our_getopt.h \ + our_syslog.h ppphdlc.h pptpctrl.h pptpdefs.h pptpgre.h pptpmanager.h + +pptpctrl_SOURCES = \ + pqueue.c pptpctrl.c ctrlpacket.c inststr.c compat.c pptpgre.c ppphdlc.c + +pptpd_LDADD = $(XTRALIBS_MGR) + +pptpctrl_LDADD = $(XTRALIBS_CTRL) + +bcrelay_SOURCES = bcrelay.c defaults.h our_syslog.h our_getopt.h + +subdirs = plugins + +all-local: + for d in $(subdirs); do $(MAKE) $(MFLAGS) -C $$d all; done + +install-exec-local: + for d in $(subdirs); do $(MAKE) $(MFLAGS) -C $$d prefix=$(prefix) DESTDIR=$(DESTDIR) install; done + +clean-local: + for d in $(subdirs); do $(MAKE) $(MFLAGS) -C $$d clean; done + +uninstall-local: + for d in $(subdirs); do $(MAKE) $(MFLAGS) -C $$d prefix=$(prefix) DESTDIR=$(DESTDIR) uninstall; done + +package: deb rpm + +deb: + fakeroot dpkg-buildpackage -us -uc + +rpm: + fakeroot rpmbuild -ta pptpd-$(VERSION).tar.gz + +##CLEANFILES = + +## DO NOT ADD BELOW THIS POINT, DEPS ARE AUTOMATICALLY ADDED +bcrelay.o: bcrelay.c config.h defaults.h our_syslog.h our_getopt.h + +compat.o: compat.c config.h compat.h our_syslog.h inststr.h + +configfile.o: configfile.c config.h defaults.h configfile.h our_syslog.h + +ctrlpacket.o: ctrlpacket.c config.h our_syslog.h pptpdefs.h pptpctrl.h \ + ctrlpacket.h compat.h + +getopt.o: getopt.c config.h our_getopt.h + +getopt1.o: getopt1.c config.h our_getopt.h + +inststr.o: inststr.c config.h inststr.h compat.h + +ppphdlc.o: ppphdlc.c config.h ppphdlc.h + +pptpctrl.o: pptpctrl.c config.h our_syslog.h compat.h pptpctrl.h \ + pptpgre.h pptpdefs.h ctrlpacket.h defaults.h + +pptpd.o: pptpd.c config.h our_syslog.h our_getopt.h configfile.h \ + defaults.h compat.h pptpmanager.h + +pptpgre.o: pptpgre.c config.h our_syslog.h ppphdlc.h pptpgre.h pptpdefs.h \ + pptpctrl.h defaults.h pqueue.h compat.h + +pptpmanager.o: pptpmanager.c config.h our_syslog.h configfile.h \ + defaults.h pptpctrl.h pptpdefs.h pptpmanager.h compat.h + +pqueue.o: pqueue.c pqueue.h + diff --git a/release/src/router/pptpd/NEWS b/release/src/router/pptpd/NEWS new file mode 100644 index 0000000000..3aa7a1ee2a --- /dev/null +++ b/release/src/router/pptpd/NEWS @@ -0,0 +1,121 @@ +1.3.4: released 2007-04-16 + +- fix two release critical packet reordering bugs [Oester] +- accept both types of domain delimiter [Cameron] +- deprecate PPP_WAIT workaround in favour of turning off pty echo [Brady] + +1.3.3: released 2006-09-05 + +- add missing connections option in sample pptpd.conf [Cameron] +- add message to indicate when constrained by IP range [Cameron] +- fix segfault on -C option, Closes Gentoo Bug #132898 [Nastac] +- support mixed architecture build on x86_64 [Gorlov] +- fix configure --with and --without option processing again [Cameron] +- include libutil in logwtmp build [Gorlov] +- fix spec file [Howarth] + +1.3.2: released 2006-04-18 + +- fix configure --with and --without option processing [Cameron] +- avoid reporting packet loss if debug option not set [Cameron] + +1.3.1: released 2006-02-14 + +- make connections limit configurable at run-time [Cameron] +- migrate --with-pppd-ip-alloc to delegate option [Cameron] +- prevent initial unwanted GRE ACK [Barker] +- bcrelay, ignore ENOBUFS [Rajkumar] +- remove superfluous sigset [Cameron/Gono] +- compilation fixes for gcc 4.0.1 [Cameron] +- factorise argument processing in pptpctrl [Cameron/Visi] + +1.3.0: released 2005-08-03 + +- disable Van Jacobson compression by default [Pokrywka] +- prototype packet buffering and reordering [Bharadwaj] +- comply with RFC2637 on echo wait and idle wait parameters [Brox] +- new pptpd-logwtmp-strip-domain option [Cameron] +- include html directory in make dist [Cameron] +- defer writes to pty until pppd has set it up properly [Cameron] +- process initial packet length header properly [Beregszaszi] +- ignore ENETDOWN and ENXIO on sendto in bcrelay [Cameron] +- add section on debugging to pptpd.8 [Mueller] + +1.2.3: released 2005-02-17 + +- error check critical dup2 calls [Cameron] +- add --enable-facility configure feature for syslog customisation [Cameron] +- performance, use writev() if available, avoiding memcpy() [Sundberg] +- compilation fix for gcc old versions [Cameron] + +1.2.2: released 2005-01-05 + +- fix deadlock hang due to syslog(3) called by signal handler [Cameron] +- turn off logging to stderr, to prevent loopback [Hall] +- allow RPM to be build on RHEL [Brady] +- init.d script, avoid spitting garbage [Mueller] + +1.2.1: released 2004-06-23 + +- depend on ppp 2.4.3 CVS packages for plugin [Cameron] +- init.d script, warn that restart may cause problems [Mueller] + +1.2.0-b4: released 2004-05-25 + +- fix rpmbuild [Cameron] +- include Debian downstream packaging patches [Mayrhofer] +- fix for options file check when no options file wanted [Cameron] +- fix for SIGTERM handling [Guraj] +- minor manual page edits [Wilson] +- fix printing of connection speed [Dubiec] +- fix segfault if built --with-bcrelay but no option used [Cameron] +- add --logwtmp option to track users online [Cameron/Guraj] +- remove vpnwho.pl from package (due to --logwtmp) [Cameron] +- include README.portslave in distribution [Cameron] + +1.2.0-b3: released 2004-04-25 (ANZAC day) + +- add hint for EIO to suggest pppd option syntax [Cameron] +- add routing checklists to pptpd.conf man page [Cameron] +- fix broken --stimeout option [Cameron] +- rework all manual pages, cross check against programs [Cameron] +- add --ppp option for portslave support [Cameron] +- fix unanticipated exit() when --noipparam option used [Cameron] +- fix segfault on pptpctrl called with no arguments [Cameron] + {closes: Bug#140709} +- include vpnwho.pl in package [!3runo] +- note that speed is ineffective on Linux [Cameron] +- rework comments in sample configuration files [Cameron] +- update references to web sites [Cameron] +- minor edits to manual pages [Cameron] +- improve script comments [Cameron] +- remove superfluous files and tidy CVS repository [Cameron] +- disable obsolete scripts [Cameron] + +1.2.0-b2: released 2004-04-22 to test team (Peter & Bruno) + +- fix build without bcrelay [Cameron] +- adopt bcrelay version from main package [Cameron] +- when built without bcrelay, the bcrelay will exit [Cameron] +- GNU standards compliance, no CVS in dist +- new maintainer [Cameron] + +1.1.4-b4: + +- terminate call on any CALL_CLR_RQST [!3runo] +- unblock SIGCHLD [Stamfest] + {closes: Bug#248123} +- report pppd path in debug mode [Cameron] +- report cause of failed execvp() [Cameron] +- explain pppd launch failure [Cameron] +- pass ipparam to pppd [Ammirata] +- add bcrelay [Bolhuis] +- fix loss of first GRE packet [fghdgh] +- fix inheritance of console file descriptors [fghdgh] +- fix pidfile option [Mandzgaladze] +- fix two buffer overflows [Otero] +- fix potential buffer overflow [Vroede] +- enhance callid [Latypov] {does not close Bug#171831} + +1.1.3: + diff --git a/release/src/router/pptpd/README.portslave b/release/src/router/pptpd/README.portslave new file mode 100644 index 0000000000..088df7d793 --- /dev/null +++ b/release/src/router/pptpd/README.portslave @@ -0,0 +1,12 @@ +Contributed by Russell Coker on Debian Bug#126486. + +/etc/pptp.conf: +option /etc/ppp/pptp.options +localip 192.168.236.133 +# refer pptpd to use the pptp-portslave script instead of regular pppd +pppd /usr/sbin/pptp-portslave + +/etc/portslave/pslave.conf: +# configure it as usual, but with lines defined for pseudo-tty devices +s{1000-1063}.tty pts/{0-63} + diff --git a/release/src/router/pptpd/README.slirp b/release/src/router/pptpd/README.slirp new file mode 100644 index 0000000000..f76a03a7ac --- /dev/null +++ b/release/src/router/pptpd/README.slirp @@ -0,0 +1,29 @@ +How 2 use slirp with pptpd-0.9.0 + +o Grab the slirp-1.0c package and install it + ftp://blitzen.canberra.edu.au/pub/slirp/slirp-1.0c.tar.gz + (other versions might work also, but were not tested) + +Then install pptpd + +o ./configure --with-slirp + +o Set path to slirp in config.h right + +o Be sure to have a HOME variable set when you start + pptpd, because slirp reads the HOME/.chap-secrets file + for authentication + This file must be filled in the same way as the + chap-secrets for pppd + +o For the rest follow the pptpd instructions + +o I have tested this with a Solaris 2.4 server, gcc and + pptpd running on this configuration. As client I used + Win95 DUN 1.3. I only tested this on a local network because + our routers still block port 47. + With this test I get a clean authentication. + +Harald Vogt, vogt@serc.nl +Mon Jun 14 09:49:40 MET DST 1999 + diff --git a/release/src/router/pptpd/autom4te.cache/output.0 b/release/src/router/pptpd/autom4te.cache/output.0 new file mode 100644 index 0000000000..16a14bffc5 --- /dev/null +++ b/release/src/router/pptpd/autom4te.cache/output.0 @@ -0,0 +1,6620 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.68. +@%:@ +@%:@ +@%:@ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +@%:@ 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +@%:@ Foundation, Inc. +@%:@ +@%:@ +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in @%:@( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in @%:@( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIB@&t@OBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="pptpmanager.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIB@&t@OBJS +XTRA_PROG +HAVE_OPENPTY +XTRALIBS_MGR +XTRALIBS_CTRL +EGREP +GREP +CPP +LN_S +RANLIB +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +with_bsdppp +with_slirp +enable_facility +enable_bcrelay +enable_dependency_tracking +with_libwrap +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + @<:@@S|@ac_default_prefix@:>@ + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + @<:@PREFIX@:>@ + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root @<:@DATAROOTDIR/doc/PACKAGE@:>@ + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-facility=name Use another syslog facility, default LOG_DAEMON + --enable-bcrelay Enable broadcast relay function + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-bsdppp Use BSD user-space ppp + --with-slirp Use SLIRP instead of pppd + --with-libwrap Use libwrap (tcp wrappers) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.68 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +@%:@ ac_fn_c_try_compile LINENO +@%:@ -------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_compile + +@%:@ ac_fn_c_try_link LINENO +@%:@ ----------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_link + +@%:@ ac_fn_c_check_func LINENO FUNC VAR +@%:@ ---------------------------------- +@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_func + +@%:@ ac_fn_c_try_cpp LINENO +@%:@ ---------------------- +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_cpp + +@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using +@%:@ the include files in INCLUDES and setting the cache variable VAR +@%:@ accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_mongrel + +@%:@ ac_fn_c_try_run LINENO +@%:@ ---------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes +@%:@ that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_run + +@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists and can be compiled using the include files in +@%:@ INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_compile + +@%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES +@%:@ ------------------------------------------- +@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache +@%:@ variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in @%:@(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_config_headers="$ac_config_headers config.h" + +am__api_version="1.9" +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in @%:@(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE=pptpd + VERSION=1.3.4 + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + +# check common command line options early + +$as_echo "@%:@define PPP_BINARY \"/usr/sbin/pppd\"" >>confdefs.h + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command line for use of BSD PPP" >&5 +$as_echo_n "checking command line for use of BSD PPP... " >&6; } + +@%:@ Check whether --with-bsdppp was given. +if test "${with_bsdppp+set}" = set; then : + withval=$with_bsdppp; + case "$withval" in + yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: BSD user-space ppp" >&5 +$as_echo "BSD user-space ppp" >&6; } + $as_echo "@%:@define BSDUSER_PPP 1" >>confdefs.h + + BSDUSER_PPP=$with_bsdppp + $as_echo "@%:@define PPP_BINARY \"/usr/sbin/ppp\"" >>confdefs.h + + break; + ;; + no) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: explicit standard pppd" >&5 +$as_echo "explicit standard pppd" >&6; } + ;; + *) + # only yes or no are expected for this option + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unrecognised... terminating" >&5 +$as_echo "unrecognised... terminating" >&6; } + exit 1 + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: default standard pppd" >&5 +$as_echo "default standard pppd" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command line for use of SLIRP" >&5 +$as_echo_n "checking command line for use of SLIRP... " >&6; } + +@%:@ Check whether --with-slirp was given. +if test "${with_slirp+set}" = set; then : + withval=$with_slirp; + case "$withval" in + yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "@%:@define SLIRP 1" >>confdefs.h + + SLIRP=$with_slirp + $as_echo "@%:@define PPP_BINARY \"/bin/slirp\"" >>confdefs.h + + break; + ;; + no) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: explicit no" >&5 +$as_echo "explicit no" >&6; } + ;; + *) + # only yes or no are expected for this option + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unrecognised... terminating" >&5 +$as_echo "unrecognised... terminating" >&6; } + exit 1 + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: default no" >&5 +$as_echo "default no" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command line for syslog facility name" >&5 +$as_echo_n "checking command line for syslog facility name... " >&6; } +@%:@ Check whether --enable-facility was given. +if test "${enable_facility+set}" = set; then : + enableval=$enable_facility; + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enableval" >&5 +$as_echo "$enableval" >&6; } + cat >>confdefs.h <<_ACEOF +@%:@define PPTP_FACILITY $enableval +_ACEOF + + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: default LOG_DAEMON" >&5 +$as_echo "default LOG_DAEMON" >&6; } + cat >>confdefs.h <<_ACEOF +@%:@define PPTP_FACILITY LOG_DAEMON +_ACEOF + + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command line for bcrelay build" >&5 +$as_echo_n "checking command line for bcrelay build... " >&6; } +@%:@ Check whether --enable-bcrelay was given. +if test "${enable_bcrelay+set}" = set; then : + enableval=$enable_bcrelay; + case "$enableval" in + yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "@%:@define BCRELAY 1" >>confdefs.h + + BCRELAY=$enableval + break; + ;; + no) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: explicit no" >&5 +$as_echo "explicit no" >&6; } + ;; + *) + # only yes or no are expected for this option + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unrecognised... terminating" >&5 +$as_echo "unrecognised... terminating" >&6; } + exit 1 + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: default no" >&5 +$as_echo "default no" >&6; } +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $@%:@ != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +@%:@ Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "@%:@define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether @%:@! works in shell scripts" >&5 +$as_echo_n "checking whether @%:@! works in shell scripts... " >&6; } +if ${ac_cv_sys_interpreter+:} false; then : + $as_echo_n "(cached) " >&6 +else + echo '#! /bin/cat +exit 69 +' >conftest +chmod u+x conftest +(SHELL=/bin/sh; export SHELL; ./conftest >/dev/null 2>&1) +if test $? -ne 69; then + ac_cv_sys_interpreter=yes +else + ac_cv_sys_interpreter=no +fi +rm -f conftest +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_interpreter" >&5 +$as_echo "$ac_cv_sys_interpreter" >&6; } +interpval=$ac_cv_sys_interpreter + + +for ac_func in setsid daemon setproctitle getservbyname strlcpy fork memmove strerror writev +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in pty.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" +if test "x$ac_cv_header_pty_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_PTY_H 1 +_ACEOF + +fi + +done + +for ac_header in string.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_STRING_H 1 +_ACEOF + +fi + +done + +for ac_header in syslog.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "syslog.h" "ac_cv_header_syslog_h" "$ac_includes_default" +if test "x$ac_cv_header_syslog_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_SYSLOG_H 1 +_ACEOF + +fi + +done + +for ac_header in libintl.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" +if test "x$ac_cv_header_libintl_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBINTL_H 1 +_ACEOF + +fi + +done + +for ac_header in libutil.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" +if test "x$ac_cv_header_libutil_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBUTIL_H 1 +_ACEOF + +fi + +done + +for ac_header in sys/uio.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_uio_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_SYS_UIO_H 1 +_ACEOF + +fi + +done + + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +@%:@define size_t unsigned int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" +if test "x$ac_cv_type_ssize_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +@%:@define ssize_t int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "u_int8_t" "ac_cv_type_u_int8_t" "$ac_includes_default" +if test "x$ac_cv_type_u_int8_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +@%:@define u_int8_t unsigned char +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "u_int16_t" "ac_cv_type_u_int16_t" "$ac_includes_default" +if test "x$ac_cv_type_u_int16_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +@%:@define u_int16_t unsigned short +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "$ac_includes_default" +if test "x$ac_cv_type_u_int32_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +@%:@define u_int32_t unsigned int +_ACEOF + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t" >&5 +$as_echo_n "checking for socklen_t... " >&6; } +if ${ac_cv_type_socklen_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if STDC_HEADERS +#include +#include +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "socklen_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then : + ac_cv_type_socklen_t=yes +else + ac_cv_type_socklen_t=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_socklen_t" >&5 +$as_echo "$ac_cv_type_socklen_t" >&6; } +if test $ac_cv_type_socklen_t = no; then + $as_echo "@%:@define socklen_t int" >>confdefs.h + +fi + + +@%:@ Check whether --with-libwrap was given. +if test "${with_libwrap+set}" = set; then : + withval=$with_libwrap; + if test "$with_libwrap" = "yes"; then + XYZZY_LIBS="$LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libwrap alone" >&5 +$as_echo_n "checking for libwrap alone... " >&6; } + LIBS="$XYZZY_LIBS -lwrap" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + int allow_severity, deny_severity; +int +main () +{ + hosts_access(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "@%:@define HAVE_LIBWRAP 1" >>confdefs.h + + LIBWRAP="yes" + XTRALIBS_MGR="-lwrap" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + LIBS="$XYZZY_LIBS -lwrap -lnsl" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libwrap with libnsl" >&5 +$as_echo_n "checking for libwrap with libnsl... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + int allow_severity, deny_severity; +int +main () +{ + hosts_access(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "@%:@define HAVE_LIBWRAP 1" >>confdefs.h + + LIBWRAP="yes" + XTRALIBS_MGR="-lwrap -lnsl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$XYZZY_LIBS" + fi + +fi + + +XYZZY_LIBS="$LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for accept in -lc" >&5 +$as_echo_n "checking for accept in -lc... " >&6; } +if ${ac_cv_lib_c_accept+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char accept (); +int +main () +{ +return accept (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_accept=yes +else + ac_cv_lib_c_accept=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_accept" >&5 +$as_echo "$ac_cv_lib_c_accept" >&6; } +if test "x$ac_cv_lib_c_accept" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBC 1 +_ACEOF + + LIBS="-lc $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lc" >&5 +$as_echo_n "checking for gethostbyname in -lc... " >&6; } +if ${ac_cv_lib_c_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_gethostbyname=yes +else + ac_cv_lib_c_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gethostbyname" >&5 +$as_echo "$ac_cv_lib_c_gethostbyname" >&6; } +if test "x$ac_cv_lib_c_gethostbyname" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBC 1 +_ACEOF + + LIBS="-lc $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lc" >&5 +$as_echo_n "checking for openpty in -lc... " >&6; } +if ${ac_cv_lib_c_openpty+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char openpty (); +int +main () +{ +return openpty (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_openpty=yes +else + ac_cv_lib_c_openpty=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_openpty" >&5 +$as_echo "$ac_cv_lib_c_openpty" >&6; } +if test "x$ac_cv_lib_c_openpty" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBC 1 +_ACEOF + + LIBS="-lc $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettext in -lc" >&5 +$as_echo_n "checking for gettext in -lc... " >&6; } +if ${ac_cv_lib_c_gettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gettext (); +int +main () +{ +return gettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_gettext=yes +else + ac_cv_lib_c_gettext=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gettext" >&5 +$as_echo "$ac_cv_lib_c_gettext" >&6; } +if test "x$ac_cv_lib_c_gettext" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBC 1 +_ACEOF + + LIBS="-lc $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for accept in -lsocket" >&5 +$as_echo_n "checking for accept in -lsocket... " >&6; } +if ${ac_cv_lib_socket_accept+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char accept (); +int +main () +{ +return accept (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_accept=yes +else + ac_cv_lib_socket_accept=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_accept" >&5 +$as_echo "$ac_cv_lib_socket_accept" >&6; } +if test "x$ac_cv_lib_socket_accept" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBSOCKET 1 +_ACEOF + + LIBS="-lsocket $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBNSL 1 +_ACEOF + + LIBS="-lnsl $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil" >&5 +$as_echo_n "checking for openpty in -lutil... " >&6; } +if ${ac_cv_lib_util_openpty+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lutil $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char openpty (); +int +main () +{ +return openpty (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_util_openpty=yes +else + ac_cv_lib_util_openpty=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty" >&5 +$as_echo "$ac_cv_lib_util_openpty" >&6; } +if test "x$ac_cv_lib_util_openpty" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBUTIL 1 +_ACEOF + + LIBS="-lutil $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettext in -lintl" >&5 +$as_echo_n "checking for gettext in -lintl... " >&6; } +if ${ac_cv_lib_intl_gettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gettext (); +int +main () +{ +return gettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_gettext=yes +else + ac_cv_lib_intl_gettext=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_gettext" >&5 +$as_echo "$ac_cv_lib_intl_gettext" >&6; } +if test "x$ac_cv_lib_intl_gettext" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBINTL 1 +_ACEOF + + LIBS="-lintl $LIBS" + +fi + +LIBS="$XYZZY_LIBS" +if test "$ac_cv_lib_c_accept" = no; then + if test "$ac_cv_lib_socket_accept" = yes; then + LIBS="$LIBS -lsocket" + else + echo "Couldn't find a usable accept!" 1>&2 + exit 1 + fi +fi +if test "$ac_cv_lib_c_gethostbyname" = no; then + if test "$ac_cv_lib_nsl_gethostbyname" = yes; then + LIBS="$LIBS -lnsl" + if test "$XTRALIBS_MGR" = "-lwrap -lnsl"; then + XTRALIBS_MGR="-lwrap" + fi + else + echo "Couldn't find a usable gethostbyname!" 1>&2 + exit 1 + fi +fi +if test "$ac_cv_lib_c_openpty" = yes; then + $as_echo "@%:@define HAVE_OPENPTY 1" >>confdefs.h + +else + if test "$ac_cv_lib_util_openpty" = yes; then + $as_echo "@%:@define HAVE_OPENPTY 1" >>confdefs.h + + XTRALIBS_CTRL="-lutil" + fi +fi +if test "$ac_cv_header_libintl_h" = yes; then + if test "$ac_cv_lib_c_gettext" = no; then + if test "$ac_cv_lib_intl_gettext" = yes; then + XTRALIBS_MGR = "$XTRALIBS_MGR -lintl" + else + echo "Have libintl.h but no usable gettext!" 1>&2 + exit 1 + fi + fi +fi + + + + + +if test "$BCRELAY" = "yes"; then + if test "$BCRELAY" = "yes"; then + XTRA_PROG="bcrelay" + true + else + echo "No BCrelay selected." 1>&2 + fi +fi + + + +echo '===============================================================================' + +echo 'Configuration chosen:' + +echo -n ' PPPd: ' +if test "$BSDUSER_PPP" = "yes"; then + echo 'BSD user-space PPPd.' +else + if test "$SLIRP" = "yes"; then + echo 'SLIRP.' + else + echo 'Standard.' + fi +fi + +echo -n ' LIBWRAP security: ' +if test "$LIBWRAP" = "yes"; then + echo 'Yes.' +else + echo 'No.' +fi + +echo -n ' Broadcast Relay: ' +if test "$BCRELAY" = "yes"; then + echo 'Yes.' +else + echo 'No.' +fi + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in @%:@( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.68, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + "$ac_file" | "$ac_file":* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for "$ac_file"" >`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/release/src/router/pptpd/autom4te.cache/output.1 b/release/src/router/pptpd/autom4te.cache/output.1 new file mode 100644 index 0000000000..f60f27260d --- /dev/null +++ b/release/src/router/pptpd/autom4te.cache/output.1 @@ -0,0 +1,6586 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.67. +@%:@ +@%:@ +@%:@ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +@%:@ 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +@%:@ Foundation, Inc. +@%:@ +@%:@ +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in @%:@( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in @%:@( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIB@&t@OBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="pptpmanager.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIB@&t@OBJS +XTRA_PROG +HAVE_OPENPTY +XTRALIBS_MGR +XTRALIBS_CTRL +EGREP +GREP +CPP +LN_S +RANLIB +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +with_bsdppp +with_slirp +enable_facility +enable_bcrelay +enable_dependency_tracking +with_libwrap +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + @<:@@S|@ac_default_prefix@:>@ + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + @<:@PREFIX@:>@ + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root @<:@DATAROOTDIR/doc/PACKAGE@:>@ + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-facility=name Use another syslog facility, default LOG_DAEMON + --enable-bcrelay Enable broadcast relay function + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-bsdppp Use BSD user-space ppp + --with-slirp Use SLIRP instead of pppd + --with-libwrap Use libwrap (tcp wrappers) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.67 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +@%:@ ac_fn_c_try_compile LINENO +@%:@ -------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_compile + +@%:@ ac_fn_c_try_link LINENO +@%:@ ----------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_link + +@%:@ ac_fn_c_check_func LINENO FUNC VAR +@%:@ ---------------------------------- +@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} @%:@ ac_fn_c_check_func + +@%:@ ac_fn_c_try_cpp LINENO +@%:@ ---------------------- +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_cpp + +@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using +@%:@ the include files in INCLUDES and setting the cache variable VAR +@%:@ accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval "test \"\${$3+set}\"" = set; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} @%:@ ac_fn_c_check_header_mongrel + +@%:@ ac_fn_c_try_run LINENO +@%:@ ---------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes +@%:@ that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_run + +@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists and can be compiled using the include files in +@%:@ INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} @%:@ ac_fn_c_check_header_compile + +@%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES +@%:@ ------------------------------------------- +@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache +@%:@ variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} @%:@ ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.67. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in @%:@(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5 ; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_config_headers="$ac_config_headers config.h" + +am__api_version="1.9" +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in @%:@(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE=pptpd + VERSION=1.3.4 + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + +# check common command line options early + +$as_echo "@%:@define PPP_BINARY \"/usr/sbin/pppd\"" >>confdefs.h + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command line for use of BSD PPP" >&5 +$as_echo_n "checking command line for use of BSD PPP... " >&6; } + +@%:@ Check whether --with-bsdppp was given. +if test "${with_bsdppp+set}" = set; then : + withval=$with_bsdppp; + case "$withval" in + yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: BSD user-space ppp" >&5 +$as_echo "BSD user-space ppp" >&6; } + $as_echo "@%:@define BSDUSER_PPP 1" >>confdefs.h + + BSDUSER_PPP=$with_bsdppp + $as_echo "@%:@define PPP_BINARY \"/usr/sbin/ppp\"" >>confdefs.h + + break; + ;; + no) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: explicit standard pppd" >&5 +$as_echo "explicit standard pppd" >&6; } + ;; + *) + # only yes or no are expected for this option + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unrecognised... terminating" >&5 +$as_echo "unrecognised... terminating" >&6; } + exit 1 + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: default standard pppd" >&5 +$as_echo "default standard pppd" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command line for use of SLIRP" >&5 +$as_echo_n "checking command line for use of SLIRP... " >&6; } + +@%:@ Check whether --with-slirp was given. +if test "${with_slirp+set}" = set; then : + withval=$with_slirp; + case "$withval" in + yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "@%:@define SLIRP 1" >>confdefs.h + + SLIRP=$with_slirp + $as_echo "@%:@define PPP_BINARY \"/bin/slirp\"" >>confdefs.h + + break; + ;; + no) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: explicit no" >&5 +$as_echo "explicit no" >&6; } + ;; + *) + # only yes or no are expected for this option + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unrecognised... terminating" >&5 +$as_echo "unrecognised... terminating" >&6; } + exit 1 + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: default no" >&5 +$as_echo "default no" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command line for syslog facility name" >&5 +$as_echo_n "checking command line for syslog facility name... " >&6; } +@%:@ Check whether --enable-facility was given. +if test "${enable_facility+set}" = set; then : + enableval=$enable_facility; + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enableval" >&5 +$as_echo "$enableval" >&6; } + cat >>confdefs.h <<_ACEOF +@%:@define PPTP_FACILITY $enableval +_ACEOF + + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: default LOG_DAEMON" >&5 +$as_echo "default LOG_DAEMON" >&6; } + cat >>confdefs.h <<_ACEOF +@%:@define PPTP_FACILITY LOG_DAEMON +_ACEOF + + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command line for bcrelay build" >&5 +$as_echo_n "checking command line for bcrelay build... " >&6; } +@%:@ Check whether --enable-bcrelay was given. +if test "${enable_bcrelay+set}" = set; then : + enableval=$enable_bcrelay; + case "$enableval" in + yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "@%:@define BCRELAY 1" >>confdefs.h + + BCRELAY=$enableval + break; + ;; + no) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: explicit no" >&5 +$as_echo "explicit no" >&6; } + ;; + *) + # only yes or no are expected for this option + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unrecognised... terminating" >&5 +$as_echo "unrecognised... terminating" >&6; } + exit 1 + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: default no" >&5 +$as_echo "default no" >&6; } +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $@%:@ != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5 ; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5 ; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5 ; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5 ; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5 ; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +@%:@ Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "@%:@define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if test "${ac_cv_c_inline+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether @%:@! works in shell scripts" >&5 +$as_echo_n "checking whether @%:@! works in shell scripts... " >&6; } +if test "${ac_cv_sys_interpreter+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + echo '#! /bin/cat +exit 69 +' >conftest +chmod u+x conftest +(SHELL=/bin/sh; export SHELL; ./conftest >/dev/null 2>&1) +if test $? -ne 69; then + ac_cv_sys_interpreter=yes +else + ac_cv_sys_interpreter=no +fi +rm -f conftest +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_interpreter" >&5 +$as_echo "$ac_cv_sys_interpreter" >&6; } +interpval=$ac_cv_sys_interpreter + + +for ac_func in setsid daemon setproctitle getservbyname strlcpy fork memmove strerror writev +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5 ; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in pty.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" +if test "x$ac_cv_header_pty_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_PTY_H 1 +_ACEOF + +fi + +done + +for ac_header in string.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_STRING_H 1 +_ACEOF + +fi + +done + +for ac_header in syslog.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "syslog.h" "ac_cv_header_syslog_h" "$ac_includes_default" +if test "x$ac_cv_header_syslog_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_SYSLOG_H 1 +_ACEOF + +fi + +done + +for ac_header in libintl.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" +if test "x$ac_cv_header_libintl_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBINTL_H 1 +_ACEOF + +fi + +done + +for ac_header in libutil.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" +if test "x$ac_cv_header_libutil_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBUTIL_H 1 +_ACEOF + +fi + +done + +for ac_header in sys/uio.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_uio_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_SYS_UIO_H 1 +_ACEOF + +fi + +done + + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = x""yes; then : + +else + +cat >>confdefs.h <<_ACEOF +@%:@define size_t unsigned int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" +if test "x$ac_cv_type_ssize_t" = x""yes; then : + +else + +cat >>confdefs.h <<_ACEOF +@%:@define ssize_t int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "u_int8_t" "ac_cv_type_u_int8_t" "$ac_includes_default" +if test "x$ac_cv_type_u_int8_t" = x""yes; then : + +else + +cat >>confdefs.h <<_ACEOF +@%:@define u_int8_t unsigned char +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "u_int16_t" "ac_cv_type_u_int16_t" "$ac_includes_default" +if test "x$ac_cv_type_u_int16_t" = x""yes; then : + +else + +cat >>confdefs.h <<_ACEOF +@%:@define u_int16_t unsigned short +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "$ac_includes_default" +if test "x$ac_cv_type_u_int32_t" = x""yes; then : + +else + +cat >>confdefs.h <<_ACEOF +@%:@define u_int32_t unsigned int +_ACEOF + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t" >&5 +$as_echo_n "checking for socklen_t... " >&6; } +if test "${ac_cv_type_socklen_t+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if STDC_HEADERS +#include +#include +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "socklen_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then : + ac_cv_type_socklen_t=yes +else + ac_cv_type_socklen_t=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_socklen_t" >&5 +$as_echo "$ac_cv_type_socklen_t" >&6; } +if test $ac_cv_type_socklen_t = no; then + $as_echo "@%:@define socklen_t int" >>confdefs.h + +fi + + +@%:@ Check whether --with-libwrap was given. +if test "${with_libwrap+set}" = set; then : + withval=$with_libwrap; + if test "$with_libwrap" = "yes"; then + XYZZY_LIBS="$LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libwrap alone" >&5 +$as_echo_n "checking for libwrap alone... " >&6; } + LIBS="$XYZZY_LIBS -lwrap" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + int allow_severity, deny_severity; +int +main () +{ + hosts_access(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "@%:@define HAVE_LIBWRAP 1" >>confdefs.h + + LIBWRAP="yes" + XTRALIBS_MGR="-lwrap" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + LIBS="$XYZZY_LIBS -lwrap -lnsl" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libwrap with libnsl" >&5 +$as_echo_n "checking for libwrap with libnsl... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + int allow_severity, deny_severity; +int +main () +{ + hosts_access(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "@%:@define HAVE_LIBWRAP 1" >>confdefs.h + + LIBWRAP="yes" + XTRALIBS_MGR="-lwrap -lnsl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$XYZZY_LIBS" + fi + +fi + + +XYZZY_LIBS="$LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for accept in -lc" >&5 +$as_echo_n "checking for accept in -lc... " >&6; } +if test "${ac_cv_lib_c_accept+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char accept (); +int +main () +{ +return accept (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_accept=yes +else + ac_cv_lib_c_accept=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_accept" >&5 +$as_echo "$ac_cv_lib_c_accept" >&6; } +if test "x$ac_cv_lib_c_accept" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBC 1 +_ACEOF + + LIBS="-lc $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lc" >&5 +$as_echo_n "checking for gethostbyname in -lc... " >&6; } +if test "${ac_cv_lib_c_gethostbyname+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_gethostbyname=yes +else + ac_cv_lib_c_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gethostbyname" >&5 +$as_echo "$ac_cv_lib_c_gethostbyname" >&6; } +if test "x$ac_cv_lib_c_gethostbyname" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBC 1 +_ACEOF + + LIBS="-lc $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lc" >&5 +$as_echo_n "checking for openpty in -lc... " >&6; } +if test "${ac_cv_lib_c_openpty+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char openpty (); +int +main () +{ +return openpty (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_openpty=yes +else + ac_cv_lib_c_openpty=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_openpty" >&5 +$as_echo "$ac_cv_lib_c_openpty" >&6; } +if test "x$ac_cv_lib_c_openpty" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBC 1 +_ACEOF + + LIBS="-lc $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettext in -lc" >&5 +$as_echo_n "checking for gettext in -lc... " >&6; } +if test "${ac_cv_lib_c_gettext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gettext (); +int +main () +{ +return gettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_gettext=yes +else + ac_cv_lib_c_gettext=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gettext" >&5 +$as_echo "$ac_cv_lib_c_gettext" >&6; } +if test "x$ac_cv_lib_c_gettext" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBC 1 +_ACEOF + + LIBS="-lc $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for accept in -lsocket" >&5 +$as_echo_n "checking for accept in -lsocket... " >&6; } +if test "${ac_cv_lib_socket_accept+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char accept (); +int +main () +{ +return accept (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_accept=yes +else + ac_cv_lib_socket_accept=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_accept" >&5 +$as_echo "$ac_cv_lib_socket_accept" >&6; } +if test "x$ac_cv_lib_socket_accept" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBSOCKET 1 +_ACEOF + + LIBS="-lsocket $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBNSL 1 +_ACEOF + + LIBS="-lnsl $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil" >&5 +$as_echo_n "checking for openpty in -lutil... " >&6; } +if test "${ac_cv_lib_util_openpty+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lutil $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char openpty (); +int +main () +{ +return openpty (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_util_openpty=yes +else + ac_cv_lib_util_openpty=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty" >&5 +$as_echo "$ac_cv_lib_util_openpty" >&6; } +if test "x$ac_cv_lib_util_openpty" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBUTIL 1 +_ACEOF + + LIBS="-lutil $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettext in -lintl" >&5 +$as_echo_n "checking for gettext in -lintl... " >&6; } +if test "${ac_cv_lib_intl_gettext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gettext (); +int +main () +{ +return gettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_gettext=yes +else + ac_cv_lib_intl_gettext=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_gettext" >&5 +$as_echo "$ac_cv_lib_intl_gettext" >&6; } +if test "x$ac_cv_lib_intl_gettext" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LIBINTL 1 +_ACEOF + + LIBS="-lintl $LIBS" + +fi + +LIBS="$XYZZY_LIBS" +if test "$ac_cv_lib_c_accept" = no; then + if test "$ac_cv_lib_socket_accept" = yes; then + LIBS="$LIBS -lsocket" + else + echo "Couldn't find a usable accept!" 1>&2 + exit 1 + fi +fi +if test "$ac_cv_lib_c_gethostbyname" = no; then + if test "$ac_cv_lib_nsl_gethostbyname" = yes; then + LIBS="$LIBS -lnsl" + if test "$XTRALIBS_MGR" = "-lwrap -lnsl"; then + XTRALIBS_MGR="-lwrap" + fi + else + echo "Couldn't find a usable gethostbyname!" 1>&2 + exit 1 + fi +fi +if test "$ac_cv_lib_c_openpty" = yes; then + $as_echo "@%:@define HAVE_OPENPTY 1" >>confdefs.h + +else + if test "$ac_cv_lib_util_openpty" = yes; then + $as_echo "@%:@define HAVE_OPENPTY 1" >>confdefs.h + + XTRALIBS_CTRL="-lutil" + fi +fi +if test "$ac_cv_header_libintl_h" = yes; then + if test "$ac_cv_lib_c_gettext" = no; then + if test "$ac_cv_lib_intl_gettext" = yes; then + XTRALIBS_MGR = "$XTRALIBS_MGR -lintl" + else + echo "Have libintl.h but no usable gettext!" 1>&2 + exit 1 + fi + fi +fi + + + + + +if test "$BCRELAY" = "yes"; then + if test "$BCRELAY" = "yes"; then + XTRA_PROG="bcrelay" + true + else + echo "No BCrelay selected." 1>&2 + fi +fi + + + +echo '===============================================================================' + +echo 'Configuration chosen:' + +echo -n ' PPPd: ' +if test "$BSDUSER_PPP" = "yes"; then + echo 'BSD user-space PPPd.' +else + if test "$SLIRP" = "yes"; then + echo 'SLIRP.' + else + echo 'Standard.' + fi +fi + +echo -n ' LIBWRAP security: ' +if test "$LIBWRAP" = "yes"; then + echo 'Yes.' +else + echo 'No.' +fi + +echo -n ' Broadcast Relay: ' +if test "$BCRELAY" = "yes"; then + echo 'Yes.' +else + echo 'No.' +fi + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in @%:@( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.67. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.67, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + "$ac_file" | "$ac_file":* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for "$ac_file"" >`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/release/src/router/pptpd/autom4te.cache/requests b/release/src/router/pptpd/autom4te.cache/requests new file mode 100644 index 0000000000..c04c2be06e --- /dev/null +++ b/release/src/router/pptpd/autom4te.cache/requests @@ -0,0 +1,76 @@ +# This file was generated by Autom4te Sun May 1 09:53:53 UTC 2011. +# It contains the lists of macros which have been traced. +# It can be safely removed. + +@request = ( + bless( [ + '0', + 1, + [ + '/usr/share/autoconf' + ], + [ + '/usr/share/autoconf/autoconf/autoconf.m4f', + 'aclocal.m4', + 'configure.in' + ], + { + 'AM_PROG_F77_C_O' => 1, + '_LT_AC_TAGCONFIG' => 1, + 'm4_pattern_forbid' => 1, + 'AC_INIT' => 1, + 'AC_CANONICAL_TARGET' => 1, + '_AM_COND_IF' => 1, + 'AC_CONFIG_LIBOBJ_DIR' => 1, + 'AC_SUBST' => 1, + 'AC_CANONICAL_HOST' => 1, + 'AC_FC_SRCEXT' => 1, + 'AC_PROG_LIBTOOL' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'AC_CONFIG_SUBDIRS' => 1, + 'AM_PATH_GUILE' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'LT_CONFIG_LTDL_DIR' => 1, + 'AC_CONFIG_LINKS' => 1, + 'AC_REQUIRE_AUX_FILE' => 1, + 'LT_SUPPORTED_TAG' => 1, + 'm4_sinclude' => 1, + 'AM_MAINTAINER_MODE' => 1, + 'AM_NLS' => 1, + 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, + '_m4_warn' => 1, + 'AM_MAKEFILE_INCLUDE' => 1, + 'AM_PROG_CXX_C_O' => 1, + '_AM_MAKEFILE_INCLUDE' => 1, + '_AM_COND_ENDIF' => 1, + 'AM_ENABLE_MULTILIB' => 1, + 'AM_SILENT_RULES' => 1, + 'AM_PROG_MOC' => 1, + 'AC_CONFIG_FILES' => 1, + 'LT_INIT' => 1, + 'include' => 1, + 'AM_GNU_GETTEXT' => 1, + 'AM_PROG_AR' => 1, + 'AC_LIBSOURCE' => 1, + 'AC_CANONICAL_BUILD' => 1, + 'AM_PROG_FC_C_O' => 1, + 'AC_FC_FREEFORM' => 1, + 'AH_OUTPUT' => 1, + 'AC_CONFIG_AUX_DIR' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'm4_pattern_allow' => 1, + 'AM_PROG_CC_C_O' => 1, + 'sinclude' => 1, + 'AM_CONDITIONAL' => 1, + 'AC_CANONICAL_SYSTEM' => 1, + 'AM_XGETTEXT_OPTION' => 1, + 'AC_CONFIG_HEADERS' => 1, + 'AC_DEFINE_TRACE_LITERAL' => 1, + 'AM_POT_TOOLS' => 1, + 'm4_include' => 1, + '_AM_COND_ELSE' => 1, + 'AC_SUBST_TRACE' => 1 + } + ], 'Autom4te::Request' ) + ); + diff --git a/release/src/router/pptpd/autom4te.cache/traces.0 b/release/src/router/pptpd/autom4te.cache/traces.0 new file mode 100644 index 0000000000..67331c7995 --- /dev/null +++ b/release/src/router/pptpd/autom4te.cache/traces.0 @@ -0,0 +1,514 @@ +m4trace:configure.in:1: -1- AC_INIT([pptpmanager.c]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.in:1: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.in:1: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.in:1: -1- AC_SUBST([SHELL]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([SHELL]) +m4trace:configure.in:1: -1- m4_pattern_allow([^SHELL$]) +m4trace:configure.in:1: -1- AC_SUBST([PATH_SEPARATOR]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PACKAGE_NAME]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PACKAGE_STRING]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PACKAGE_URL]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.in:1: -1- AC_SUBST([exec_prefix], [NONE]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([exec_prefix]) +m4trace:configure.in:1: -1- m4_pattern_allow([^exec_prefix$]) +m4trace:configure.in:1: -1- AC_SUBST([prefix], [NONE]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([prefix]) +m4trace:configure.in:1: -1- m4_pattern_allow([^prefix$]) +m4trace:configure.in:1: -1- AC_SUBST([program_transform_name], [s,x,x,]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([program_transform_name]) +m4trace:configure.in:1: -1- m4_pattern_allow([^program_transform_name$]) +m4trace:configure.in:1: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([bindir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^bindir$]) +m4trace:configure.in:1: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([sbindir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^sbindir$]) +m4trace:configure.in:1: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([libexecdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^libexecdir$]) +m4trace:configure.in:1: -1- AC_SUBST([datarootdir], ['${prefix}/share']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([datarootdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^datarootdir$]) +m4trace:configure.in:1: -1- AC_SUBST([datadir], ['${datarootdir}']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([datadir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^datadir$]) +m4trace:configure.in:1: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([sysconfdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^sysconfdir$]) +m4trace:configure.in:1: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([sharedstatedir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^sharedstatedir$]) +m4trace:configure.in:1: -1- AC_SUBST([localstatedir], ['${prefix}/var']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([localstatedir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^localstatedir$]) +m4trace:configure.in:1: -1- AC_SUBST([includedir], ['${prefix}/include']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([includedir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^includedir$]) +m4trace:configure.in:1: -1- AC_SUBST([oldincludedir], ['/usr/include']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([oldincludedir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^oldincludedir$]) +m4trace:configure.in:1: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], + ['${datarootdir}/doc/${PACKAGE_TARNAME}'], + ['${datarootdir}/doc/${PACKAGE}'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([docdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^docdir$]) +m4trace:configure.in:1: -1- AC_SUBST([infodir], ['${datarootdir}/info']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([infodir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^infodir$]) +m4trace:configure.in:1: -1- AC_SUBST([htmldir], ['${docdir}']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([htmldir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^htmldir$]) +m4trace:configure.in:1: -1- AC_SUBST([dvidir], ['${docdir}']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([dvidir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^dvidir$]) +m4trace:configure.in:1: -1- AC_SUBST([pdfdir], ['${docdir}']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([pdfdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^pdfdir$]) +m4trace:configure.in:1: -1- AC_SUBST([psdir], ['${docdir}']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([psdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^psdir$]) +m4trace:configure.in:1: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([libdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^libdir$]) +m4trace:configure.in:1: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([localedir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^localedir$]) +m4trace:configure.in:1: -1- AC_SUBST([mandir], ['${datarootdir}/man']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([mandir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^mandir$]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ +@%:@undef PACKAGE_NAME]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ +@%:@undef PACKAGE_TARNAME]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ +@%:@undef PACKAGE_VERSION]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ +@%:@undef PACKAGE_STRING]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ +@%:@undef PACKAGE_BUGREPORT]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ +@%:@undef PACKAGE_URL]) +m4trace:configure.in:1: -1- AC_SUBST([DEFS]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([DEFS]) +m4trace:configure.in:1: -1- m4_pattern_allow([^DEFS$]) +m4trace:configure.in:1: -1- AC_SUBST([ECHO_C]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([ECHO_C]) +m4trace:configure.in:1: -1- m4_pattern_allow([^ECHO_C$]) +m4trace:configure.in:1: -1- AC_SUBST([ECHO_N]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([ECHO_N]) +m4trace:configure.in:1: -1- m4_pattern_allow([^ECHO_N$]) +m4trace:configure.in:1: -1- AC_SUBST([ECHO_T]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([ECHO_T]) +m4trace:configure.in:1: -1- m4_pattern_allow([^ECHO_T$]) +m4trace:configure.in:1: -1- AC_SUBST([LIBS]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.in:1: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.in:1: -1- AC_SUBST([build_alias]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([build_alias]) +m4trace:configure.in:1: -1- m4_pattern_allow([^build_alias$]) +m4trace:configure.in:1: -1- AC_SUBST([host_alias]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([host_alias]) +m4trace:configure.in:1: -1- m4_pattern_allow([^host_alias$]) +m4trace:configure.in:1: -1- AC_SUBST([target_alias]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([target_alias]) +m4trace:configure.in:1: -1- m4_pattern_allow([^target_alias$]) +m4trace:configure.in:3: -1- _m4_warn([obsolete], [The macro `AM_CONFIG_HEADER' is obsolete. +You should run autoupdate.], [aclocal.m4:353: AM_CONFIG_HEADER is expanded from... +configure.in:3: the top level]) +m4trace:configure.in:3: -1- AC_CONFIG_HEADERS([config.h]) +m4trace:configure.in:4: -1- AM_INIT_AUTOMAKE([pptpd], [1.3.4]) +m4trace:configure.in:4: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) +m4trace:configure.in:4: -1- AM_AUTOMAKE_VERSION([1.9.6]) +m4trace:configure.in:4: -1- AC_REQUIRE_AUX_FILE([install-sh]) +m4trace:configure.in:4: -1- AC_SUBST([INSTALL_PROGRAM]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) +m4trace:configure.in:4: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +m4trace:configure.in:4: -1- AC_SUBST([INSTALL_SCRIPT]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) +m4trace:configure.in:4: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +m4trace:configure.in:4: -1- AC_SUBST([INSTALL_DATA]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([INSTALL_DATA]) +m4trace:configure.in:4: -1- m4_pattern_allow([^INSTALL_DATA$]) +m4trace:configure.in:4: -1- AC_SUBST([CYGPATH_W]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([CYGPATH_W]) +m4trace:configure.in:4: -1- m4_pattern_allow([^CYGPATH_W$]) +m4trace:configure.in:4: -1- AC_SUBST([PACKAGE], [pptpd]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([PACKAGE]) +m4trace:configure.in:4: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.in:4: -1- AC_SUBST([VERSION], [1.3.4]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([VERSION]) +m4trace:configure.in:4: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.in:4: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) +m4trace:configure.in:4: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.in:4: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ +@%:@undef PACKAGE]) +m4trace:configure.in:4: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) +m4trace:configure.in:4: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.in:4: -1- AH_OUTPUT([VERSION], [/* Version number of package */ +@%:@undef VERSION]) +m4trace:configure.in:4: -1- AC_SUBST([ACLOCAL]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([ACLOCAL]) +m4trace:configure.in:4: -1- m4_pattern_allow([^ACLOCAL$]) +m4trace:configure.in:4: -1- AC_SUBST([AUTOCONF]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([AUTOCONF]) +m4trace:configure.in:4: -1- m4_pattern_allow([^AUTOCONF$]) +m4trace:configure.in:4: -1- AC_SUBST([AUTOMAKE]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([AUTOMAKE]) +m4trace:configure.in:4: -1- m4_pattern_allow([^AUTOMAKE$]) +m4trace:configure.in:4: -1- AC_SUBST([AUTOHEADER]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([AUTOHEADER]) +m4trace:configure.in:4: -1- m4_pattern_allow([^AUTOHEADER$]) +m4trace:configure.in:4: -1- AC_SUBST([MAKEINFO]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([MAKEINFO]) +m4trace:configure.in:4: -1- m4_pattern_allow([^MAKEINFO$]) +m4trace:configure.in:4: -1- AC_SUBST([install_sh]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([install_sh]) +m4trace:configure.in:4: -1- m4_pattern_allow([^install_sh$]) +m4trace:configure.in:4: -1- AC_SUBST([STRIP]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([STRIP]) +m4trace:configure.in:4: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.in:4: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) +m4trace:configure.in:4: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) +m4trace:configure.in:4: -1- AC_SUBST([mkdir_p]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([mkdir_p]) +m4trace:configure.in:4: -1- m4_pattern_allow([^mkdir_p$]) +m4trace:configure.in:4: -1- AC_SUBST([AWK]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([AWK]) +m4trace:configure.in:4: -1- m4_pattern_allow([^AWK$]) +m4trace:configure.in:4: -1- AC_SUBST([SET_MAKE]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([SET_MAKE]) +m4trace:configure.in:4: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.in:4: -1- AC_SUBST([am__leading_dot]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([am__leading_dot]) +m4trace:configure.in:4: -1- m4_pattern_allow([^am__leading_dot$]) +m4trace:configure.in:4: -1- AC_SUBST([AMTAR]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([AMTAR]) +m4trace:configure.in:4: -1- m4_pattern_allow([^AMTAR$]) +m4trace:configure.in:4: -1- AC_SUBST([am__tar]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([am__tar]) +m4trace:configure.in:4: -1- m4_pattern_allow([^am__tar$]) +m4trace:configure.in:4: -1- AC_SUBST([am__untar]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([am__untar]) +m4trace:configure.in:4: -1- m4_pattern_allow([^am__untar$]) +m4trace:configure.in:8: -1- AC_DEFINE_TRACE_LITERAL([PPP_BINARY]) +m4trace:configure.in:8: -1- m4_pattern_allow([^PPP_BINARY$]) +m4trace:configure.in:10: -1- AC_DEFINE_TRACE_LITERAL([BSDUSER_PPP]) +m4trace:configure.in:10: -1- m4_pattern_allow([^BSDUSER_PPP$]) +m4trace:configure.in:10: -1- AC_DEFINE_TRACE_LITERAL([PPP_BINARY]) +m4trace:configure.in:10: -1- m4_pattern_allow([^PPP_BINARY$]) +m4trace:configure.in:33: -1- AC_DEFINE_TRACE_LITERAL([SLIRP]) +m4trace:configure.in:33: -1- m4_pattern_allow([^SLIRP$]) +m4trace:configure.in:33: -1- AC_DEFINE_TRACE_LITERAL([PPP_BINARY]) +m4trace:configure.in:33: -1- m4_pattern_allow([^PPP_BINARY$]) +m4trace:configure.in:56: -1- AC_DEFINE_TRACE_LITERAL([PPTP_FACILITY]) +m4trace:configure.in:56: -1- m4_pattern_allow([^PPTP_FACILITY$]) +m4trace:configure.in:56: -1- AC_DEFINE_TRACE_LITERAL([PPTP_FACILITY]) +m4trace:configure.in:56: -1- m4_pattern_allow([^PPTP_FACILITY$]) +m4trace:configure.in:68: -1- AC_DEFINE_TRACE_LITERAL([BCRELAY]) +m4trace:configure.in:68: -1- m4_pattern_allow([^BCRELAY$]) +m4trace:configure.in:89: -1- AC_SUBST([CC]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:89: -1- AC_SUBST([CFLAGS]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CFLAGS]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CFLAGS$]) +m4trace:configure.in:89: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.in:89: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.in:89: -1- AC_SUBST([LIBS]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.in:89: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.in:89: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.in:89: -1- AC_SUBST([CC]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:89: -1- AC_SUBST([CC]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:89: -1- AC_SUBST([CC]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:89: -1- AC_SUBST([CC]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:89: -1- AC_SUBST([ac_ct_CC]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([ac_ct_CC]) +m4trace:configure.in:89: -1- m4_pattern_allow([^ac_ct_CC$]) +m4trace:configure.in:89: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([EXEEXT]) +m4trace:configure.in:89: -1- m4_pattern_allow([^EXEEXT$]) +m4trace:configure.in:89: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([OBJEXT]) +m4trace:configure.in:89: -1- m4_pattern_allow([^OBJEXT$]) +m4trace:configure.in:89: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([DEPDIR]) +m4trace:configure.in:89: -1- m4_pattern_allow([^DEPDIR$]) +m4trace:configure.in:89: -1- AC_SUBST([am__include]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([am__include]) +m4trace:configure.in:89: -1- m4_pattern_allow([^am__include$]) +m4trace:configure.in:89: -1- AC_SUBST([am__quote]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([am__quote]) +m4trace:configure.in:89: -1- m4_pattern_allow([^am__quote$]) +m4trace:configure.in:89: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +m4trace:configure.in:89: -1- AC_SUBST([AMDEP_TRUE]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([AMDEP_TRUE]) +m4trace:configure.in:89: -1- m4_pattern_allow([^AMDEP_TRUE$]) +m4trace:configure.in:89: -1- AC_SUBST([AMDEP_FALSE]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([AMDEP_FALSE]) +m4trace:configure.in:89: -1- m4_pattern_allow([^AMDEP_FALSE$]) +m4trace:configure.in:89: -1- AC_SUBST([AMDEPBACKSLASH]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) +m4trace:configure.in:89: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) +m4trace:configure.in:89: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CCDEPMODE]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CCDEPMODE$]) +m4trace:configure.in:89: -1- AM_CONDITIONAL([am__fastdepCC], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) +m4trace:configure.in:89: -1- AC_SUBST([am__fastdepCC_TRUE]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) +m4trace:configure.in:89: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) +m4trace:configure.in:89: -1- AC_SUBST([am__fastdepCC_FALSE]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) +m4trace:configure.in:89: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) +m4trace:configure.in:90: -1- AC_SUBST([RANLIB]) +m4trace:configure.in:90: -1- AC_SUBST_TRACE([RANLIB]) +m4trace:configure.in:90: -1- m4_pattern_allow([^RANLIB$]) +m4trace:configure.in:92: -1- AC_SUBST([LN_S], [$as_ln_s]) +m4trace:configure.in:92: -1- AC_SUBST_TRACE([LN_S]) +m4trace:configure.in:92: -1- m4_pattern_allow([^LN_S$]) +m4trace:configure.in:93: -1- AC_SUBST([SET_MAKE]) +m4trace:configure.in:93: -1- AC_SUBST_TRACE([SET_MAKE]) +m4trace:configure.in:93: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.in:95: -1- AC_DEFINE_TRACE_LITERAL([const]) +m4trace:configure.in:95: -1- m4_pattern_allow([^const$]) +m4trace:configure.in:95: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */ +@%:@undef const]) +m4trace:configure.in:96: -1- AH_OUTPUT([inline], [/* Define to `__inline__\' or `__inline\' if that\'s what the C compiler + calls it, or to nothing if \'inline\' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_SETSID], [/* Define to 1 if you have the `setsid\' function. */ +@%:@undef HAVE_SETSID]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_DAEMON], [/* Define to 1 if you have the `daemon\' function. */ +@%:@undef HAVE_DAEMON]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_SETPROCTITLE], [/* Define to 1 if you have the `setproctitle\' function. */ +@%:@undef HAVE_SETPROCTITLE]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_GETSERVBYNAME], [/* Define to 1 if you have the `getservbyname\' function. */ +@%:@undef HAVE_GETSERVBYNAME]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_STRLCPY], [/* Define to 1 if you have the `strlcpy\' function. */ +@%:@undef HAVE_STRLCPY]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_FORK], [/* Define to 1 if you have the `fork\' function. */ +@%:@undef HAVE_FORK]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_MEMMOVE], [/* Define to 1 if you have the `memmove\' function. */ +@%:@undef HAVE_MEMMOVE]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */ +@%:@undef HAVE_STRERROR]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_WRITEV], [/* Define to 1 if you have the `writev\' function. */ +@%:@undef HAVE_WRITEV]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_PTY_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_PTY_H]) +m4trace:configure.in:104: -1- AC_SUBST([CPP]) +m4trace:configure.in:104: -1- AC_SUBST_TRACE([CPP]) +m4trace:configure.in:104: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.in:104: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.in:104: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.in:104: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.in:104: -1- AC_SUBST([CPP]) +m4trace:configure.in:104: -1- AC_SUBST_TRACE([CPP]) +m4trace:configure.in:104: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.in:104: -1- AC_SUBST([GREP]) +m4trace:configure.in:104: -1- AC_SUBST_TRACE([GREP]) +m4trace:configure.in:104: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.in:104: -1- AC_SUBST([EGREP]) +m4trace:configure.in:104: -1- AC_SUBST_TRACE([EGREP]) +m4trace:configure.in:104: -1- m4_pattern_allow([^EGREP$]) +m4trace:configure.in:104: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) +m4trace:configure.in:104: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.in:104: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ +@%:@undef STDC_HEADERS]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_TYPES_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_STAT_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDLIB_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRING_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_MEMORY_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRINGS_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_INTTYPES_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDINT_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_UNISTD_H]) +m4trace:configure.in:104: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTY_H]) +m4trace:configure.in:104: -1- m4_pattern_allow([^HAVE_PTY_H$]) +m4trace:configure.in:105: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRING_H]) +m4trace:configure.in:105: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRING_H]) +m4trace:configure.in:105: -1- m4_pattern_allow([^HAVE_STRING_H$]) +m4trace:configure.in:106: -1- AH_OUTPUT([HAVE_SYSLOG_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYSLOG_H]) +m4trace:configure.in:106: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SYSLOG_H]) +m4trace:configure.in:106: -1- m4_pattern_allow([^HAVE_SYSLOG_H$]) +m4trace:configure.in:107: -1- AH_OUTPUT([HAVE_LIBINTL_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_LIBINTL_H]) +m4trace:configure.in:107: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBINTL_H]) +m4trace:configure.in:107: -1- m4_pattern_allow([^HAVE_LIBINTL_H$]) +m4trace:configure.in:108: -1- AH_OUTPUT([HAVE_LIBUTIL_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_LIBUTIL_H]) +m4trace:configure.in:108: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBUTIL_H]) +m4trace:configure.in:108: -1- m4_pattern_allow([^HAVE_LIBUTIL_H$]) +m4trace:configure.in:109: -1- AH_OUTPUT([HAVE_SYS_UIO_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_UIO_H]) +m4trace:configure.in:109: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SYS_UIO_H]) +m4trace:configure.in:109: -1- m4_pattern_allow([^HAVE_SYS_UIO_H$]) +m4trace:configure.in:111: -1- AC_DEFINE_TRACE_LITERAL([size_t]) +m4trace:configure.in:111: -1- m4_pattern_allow([^size_t$]) +m4trace:configure.in:111: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if does not define. */ +@%:@undef size_t]) +m4trace:configure.in:112: -1- AC_DEFINE_TRACE_LITERAL([ssize_t]) +m4trace:configure.in:112: -1- m4_pattern_allow([^ssize_t$]) +m4trace:configure.in:112: -1- AH_OUTPUT([ssize_t], [/* Define to `int\' if does not define. */ +@%:@undef ssize_t]) +m4trace:configure.in:113: -1- AC_DEFINE_TRACE_LITERAL([u_int8_t]) +m4trace:configure.in:113: -1- m4_pattern_allow([^u_int8_t$]) +m4trace:configure.in:113: -1- AH_OUTPUT([u_int8_t], [/* Define to `unsigned char\' if does not define. */ +@%:@undef u_int8_t]) +m4trace:configure.in:114: -1- AC_DEFINE_TRACE_LITERAL([u_int16_t]) +m4trace:configure.in:114: -1- m4_pattern_allow([^u_int16_t$]) +m4trace:configure.in:114: -1- AH_OUTPUT([u_int16_t], [/* Define to `unsigned short\' if does not define. */ +@%:@undef u_int16_t]) +m4trace:configure.in:115: -1- AC_DEFINE_TRACE_LITERAL([u_int32_t]) +m4trace:configure.in:115: -1- m4_pattern_allow([^u_int32_t$]) +m4trace:configure.in:115: -1- AH_OUTPUT([u_int32_t], [/* Define to `unsigned int\' if does not define. */ +@%:@undef u_int32_t]) +m4trace:configure.in:129: -1- AC_DEFINE_TRACE_LITERAL([socklen_t]) +m4trace:configure.in:129: -1- m4_pattern_allow([^socklen_t$]) +m4trace:configure.in:133: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... +../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from... +../../lib/autoconf/general.m4:1482: AC_ARG_WITH is expanded from... +configure.in:133: the top level]) +m4trace:configure.in:133: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBWRAP]) +m4trace:configure.in:133: -1- m4_pattern_allow([^HAVE_LIBWRAP$]) +m4trace:configure.in:133: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... +../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from... +../../lib/autoconf/general.m4:2662: _AC_LINK_IFELSE is expanded from... +../../lib/autoconf/general.m4:2679: AC_LINK_IFELSE is expanded from... +../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from... +../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from... +../../lib/autoconf/general.m4:1482: AC_ARG_WITH is expanded from... +configure.in:133: the top level]) +m4trace:configure.in:133: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBWRAP]) +m4trace:configure.in:133: -1- m4_pattern_allow([^HAVE_LIBWRAP$]) +m4trace:configure.in:163: -1- AH_OUTPUT([HAVE_LIBC], [/* Define to 1 if you have the `c\' library (-lc). */ +@%:@undef HAVE_LIBC]) +m4trace:configure.in:163: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBC]) +m4trace:configure.in:163: -1- m4_pattern_allow([^HAVE_LIBC$]) +m4trace:configure.in:164: -1- AH_OUTPUT([HAVE_LIBC], [/* Define to 1 if you have the `c\' library (-lc). */ +@%:@undef HAVE_LIBC]) +m4trace:configure.in:164: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBC]) +m4trace:configure.in:164: -1- m4_pattern_allow([^HAVE_LIBC$]) +m4trace:configure.in:165: -1- AH_OUTPUT([HAVE_LIBC], [/* Define to 1 if you have the `c\' library (-lc). */ +@%:@undef HAVE_LIBC]) +m4trace:configure.in:165: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBC]) +m4trace:configure.in:165: -1- m4_pattern_allow([^HAVE_LIBC$]) +m4trace:configure.in:166: -1- AH_OUTPUT([HAVE_LIBC], [/* Define to 1 if you have the `c\' library (-lc). */ +@%:@undef HAVE_LIBC]) +m4trace:configure.in:166: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBC]) +m4trace:configure.in:166: -1- m4_pattern_allow([^HAVE_LIBC$]) +m4trace:configure.in:167: -1- AH_OUTPUT([HAVE_LIBSOCKET], [/* Define to 1 if you have the `socket\' library (-lsocket). */ +@%:@undef HAVE_LIBSOCKET]) +m4trace:configure.in:167: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBSOCKET]) +m4trace:configure.in:167: -1- m4_pattern_allow([^HAVE_LIBSOCKET$]) +m4trace:configure.in:168: -1- AH_OUTPUT([HAVE_LIBNSL], [/* Define to 1 if you have the `nsl\' library (-lnsl). */ +@%:@undef HAVE_LIBNSL]) +m4trace:configure.in:168: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBNSL]) +m4trace:configure.in:168: -1- m4_pattern_allow([^HAVE_LIBNSL$]) +m4trace:configure.in:169: -1- AH_OUTPUT([HAVE_LIBUTIL], [/* Define to 1 if you have the `util\' library (-lutil). */ +@%:@undef HAVE_LIBUTIL]) +m4trace:configure.in:169: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBUTIL]) +m4trace:configure.in:169: -1- m4_pattern_allow([^HAVE_LIBUTIL$]) +m4trace:configure.in:170: -1- AH_OUTPUT([HAVE_LIBINTL], [/* Define to 1 if you have the `intl\' library (-lintl). */ +@%:@undef HAVE_LIBINTL]) +m4trace:configure.in:170: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBINTL]) +m4trace:configure.in:170: -1- m4_pattern_allow([^HAVE_LIBINTL$]) +m4trace:configure.in:192: -1- AC_DEFINE_TRACE_LITERAL([HAVE_OPENPTY]) +m4trace:configure.in:192: -1- m4_pattern_allow([^HAVE_OPENPTY$]) +m4trace:configure.in:195: -1- AC_DEFINE_TRACE_LITERAL([HAVE_OPENPTY]) +m4trace:configure.in:195: -1- m4_pattern_allow([^HAVE_OPENPTY$]) +m4trace:configure.in:210: -1- AC_SUBST([XTRALIBS_CTRL]) +m4trace:configure.in:210: -1- AC_SUBST_TRACE([XTRALIBS_CTRL]) +m4trace:configure.in:210: -1- m4_pattern_allow([^XTRALIBS_CTRL$]) +m4trace:configure.in:211: -1- AC_SUBST([XTRALIBS_MGR]) +m4trace:configure.in:211: -1- AC_SUBST_TRACE([XTRALIBS_MGR]) +m4trace:configure.in:211: -1- m4_pattern_allow([^XTRALIBS_MGR$]) +m4trace:configure.in:212: -1- AC_SUBST([HAVE_OPENPTY]) +m4trace:configure.in:212: -1- AC_SUBST_TRACE([HAVE_OPENPTY]) +m4trace:configure.in:212: -1- m4_pattern_allow([^HAVE_OPENPTY$]) +m4trace:configure.in:223: -1- AC_SUBST([XTRA_PROG]) +m4trace:configure.in:223: -1- AC_SUBST_TRACE([XTRA_PROG]) +m4trace:configure.in:223: -1- m4_pattern_allow([^XTRA_PROG$]) +m4trace:configure.in:255: -1- AC_CONFIG_FILES([Makefile]) +m4trace:configure.in:255: -1- _m4_warn([obsolete], [AC_OUTPUT should be used without arguments. +You should run autoupdate.], []) +m4trace:configure.in:255: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) +m4trace:configure.in:255: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +m4trace:configure.in:255: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([LTLIBOBJS]) +m4trace:configure.in:255: -1- m4_pattern_allow([^LTLIBOBJS$]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([top_builddir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([top_build_prefix]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([srcdir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([abs_srcdir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([top_srcdir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([abs_top_srcdir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([builddir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([abs_builddir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([abs_top_builddir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([INSTALL]) diff --git a/release/src/router/pptpd/autom4te.cache/traces.1 b/release/src/router/pptpd/autom4te.cache/traces.1 new file mode 100644 index 0000000000..7039459c1c --- /dev/null +++ b/release/src/router/pptpd/autom4te.cache/traces.1 @@ -0,0 +1,514 @@ +m4trace:configure.in:1: -1- AC_INIT([pptpmanager.c]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.in:1: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.in:1: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.in:1: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.in:1: -1- AC_SUBST([SHELL]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([SHELL]) +m4trace:configure.in:1: -1- m4_pattern_allow([^SHELL$]) +m4trace:configure.in:1: -1- AC_SUBST([PATH_SEPARATOR]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PACKAGE_NAME]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PACKAGE_STRING]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.in:1: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([PACKAGE_URL]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.in:1: -1- AC_SUBST([exec_prefix], [NONE]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([exec_prefix]) +m4trace:configure.in:1: -1- m4_pattern_allow([^exec_prefix$]) +m4trace:configure.in:1: -1- AC_SUBST([prefix], [NONE]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([prefix]) +m4trace:configure.in:1: -1- m4_pattern_allow([^prefix$]) +m4trace:configure.in:1: -1- AC_SUBST([program_transform_name], [s,x,x,]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([program_transform_name]) +m4trace:configure.in:1: -1- m4_pattern_allow([^program_transform_name$]) +m4trace:configure.in:1: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([bindir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^bindir$]) +m4trace:configure.in:1: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([sbindir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^sbindir$]) +m4trace:configure.in:1: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([libexecdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^libexecdir$]) +m4trace:configure.in:1: -1- AC_SUBST([datarootdir], ['${prefix}/share']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([datarootdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^datarootdir$]) +m4trace:configure.in:1: -1- AC_SUBST([datadir], ['${datarootdir}']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([datadir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^datadir$]) +m4trace:configure.in:1: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([sysconfdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^sysconfdir$]) +m4trace:configure.in:1: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([sharedstatedir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^sharedstatedir$]) +m4trace:configure.in:1: -1- AC_SUBST([localstatedir], ['${prefix}/var']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([localstatedir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^localstatedir$]) +m4trace:configure.in:1: -1- AC_SUBST([includedir], ['${prefix}/include']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([includedir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^includedir$]) +m4trace:configure.in:1: -1- AC_SUBST([oldincludedir], ['/usr/include']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([oldincludedir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^oldincludedir$]) +m4trace:configure.in:1: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], + ['${datarootdir}/doc/${PACKAGE_TARNAME}'], + ['${datarootdir}/doc/${PACKAGE}'])]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([docdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^docdir$]) +m4trace:configure.in:1: -1- AC_SUBST([infodir], ['${datarootdir}/info']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([infodir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^infodir$]) +m4trace:configure.in:1: -1- AC_SUBST([htmldir], ['${docdir}']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([htmldir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^htmldir$]) +m4trace:configure.in:1: -1- AC_SUBST([dvidir], ['${docdir}']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([dvidir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^dvidir$]) +m4trace:configure.in:1: -1- AC_SUBST([pdfdir], ['${docdir}']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([pdfdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^pdfdir$]) +m4trace:configure.in:1: -1- AC_SUBST([psdir], ['${docdir}']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([psdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^psdir$]) +m4trace:configure.in:1: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([libdir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^libdir$]) +m4trace:configure.in:1: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([localedir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^localedir$]) +m4trace:configure.in:1: -1- AC_SUBST([mandir], ['${datarootdir}/man']) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([mandir]) +m4trace:configure.in:1: -1- m4_pattern_allow([^mandir$]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ +@%:@undef PACKAGE_NAME]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ +@%:@undef PACKAGE_TARNAME]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ +@%:@undef PACKAGE_VERSION]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ +@%:@undef PACKAGE_STRING]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ +@%:@undef PACKAGE_BUGREPORT]) +m4trace:configure.in:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) +m4trace:configure.in:1: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.in:1: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ +@%:@undef PACKAGE_URL]) +m4trace:configure.in:1: -1- AC_SUBST([DEFS]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([DEFS]) +m4trace:configure.in:1: -1- m4_pattern_allow([^DEFS$]) +m4trace:configure.in:1: -1- AC_SUBST([ECHO_C]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([ECHO_C]) +m4trace:configure.in:1: -1- m4_pattern_allow([^ECHO_C$]) +m4trace:configure.in:1: -1- AC_SUBST([ECHO_N]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([ECHO_N]) +m4trace:configure.in:1: -1- m4_pattern_allow([^ECHO_N$]) +m4trace:configure.in:1: -1- AC_SUBST([ECHO_T]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([ECHO_T]) +m4trace:configure.in:1: -1- m4_pattern_allow([^ECHO_T$]) +m4trace:configure.in:1: -1- AC_SUBST([LIBS]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.in:1: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.in:1: -1- AC_SUBST([build_alias]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([build_alias]) +m4trace:configure.in:1: -1- m4_pattern_allow([^build_alias$]) +m4trace:configure.in:1: -1- AC_SUBST([host_alias]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([host_alias]) +m4trace:configure.in:1: -1- m4_pattern_allow([^host_alias$]) +m4trace:configure.in:1: -1- AC_SUBST([target_alias]) +m4trace:configure.in:1: -1- AC_SUBST_TRACE([target_alias]) +m4trace:configure.in:1: -1- m4_pattern_allow([^target_alias$]) +m4trace:configure.in:3: -1- _m4_warn([obsolete], [The macro `AM_CONFIG_HEADER' is obsolete. +You should run autoupdate.], [aclocal.m4:353: AM_CONFIG_HEADER is expanded from... +configure.in:3: the top level]) +m4trace:configure.in:3: -1- AC_CONFIG_HEADERS([config.h]) +m4trace:configure.in:4: -1- AM_INIT_AUTOMAKE([pptpd], [1.3.4]) +m4trace:configure.in:4: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) +m4trace:configure.in:4: -1- AM_AUTOMAKE_VERSION([1.9.6]) +m4trace:configure.in:4: -1- AC_REQUIRE_AUX_FILE([install-sh]) +m4trace:configure.in:4: -1- AC_SUBST([INSTALL_PROGRAM]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) +m4trace:configure.in:4: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +m4trace:configure.in:4: -1- AC_SUBST([INSTALL_SCRIPT]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) +m4trace:configure.in:4: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +m4trace:configure.in:4: -1- AC_SUBST([INSTALL_DATA]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([INSTALL_DATA]) +m4trace:configure.in:4: -1- m4_pattern_allow([^INSTALL_DATA$]) +m4trace:configure.in:4: -1- AC_SUBST([CYGPATH_W]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([CYGPATH_W]) +m4trace:configure.in:4: -1- m4_pattern_allow([^CYGPATH_W$]) +m4trace:configure.in:4: -1- AC_SUBST([PACKAGE], [pptpd]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([PACKAGE]) +m4trace:configure.in:4: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.in:4: -1- AC_SUBST([VERSION], [1.3.4]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([VERSION]) +m4trace:configure.in:4: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.in:4: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) +m4trace:configure.in:4: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.in:4: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ +@%:@undef PACKAGE]) +m4trace:configure.in:4: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) +m4trace:configure.in:4: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.in:4: -1- AH_OUTPUT([VERSION], [/* Version number of package */ +@%:@undef VERSION]) +m4trace:configure.in:4: -1- AC_SUBST([ACLOCAL]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([ACLOCAL]) +m4trace:configure.in:4: -1- m4_pattern_allow([^ACLOCAL$]) +m4trace:configure.in:4: -1- AC_SUBST([AUTOCONF]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([AUTOCONF]) +m4trace:configure.in:4: -1- m4_pattern_allow([^AUTOCONF$]) +m4trace:configure.in:4: -1- AC_SUBST([AUTOMAKE]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([AUTOMAKE]) +m4trace:configure.in:4: -1- m4_pattern_allow([^AUTOMAKE$]) +m4trace:configure.in:4: -1- AC_SUBST([AUTOHEADER]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([AUTOHEADER]) +m4trace:configure.in:4: -1- m4_pattern_allow([^AUTOHEADER$]) +m4trace:configure.in:4: -1- AC_SUBST([MAKEINFO]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([MAKEINFO]) +m4trace:configure.in:4: -1- m4_pattern_allow([^MAKEINFO$]) +m4trace:configure.in:4: -1- AC_SUBST([install_sh]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([install_sh]) +m4trace:configure.in:4: -1- m4_pattern_allow([^install_sh$]) +m4trace:configure.in:4: -1- AC_SUBST([STRIP]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([STRIP]) +m4trace:configure.in:4: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.in:4: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) +m4trace:configure.in:4: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) +m4trace:configure.in:4: -1- AC_SUBST([mkdir_p]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([mkdir_p]) +m4trace:configure.in:4: -1- m4_pattern_allow([^mkdir_p$]) +m4trace:configure.in:4: -1- AC_SUBST([AWK]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([AWK]) +m4trace:configure.in:4: -1- m4_pattern_allow([^AWK$]) +m4trace:configure.in:4: -1- AC_SUBST([SET_MAKE]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([SET_MAKE]) +m4trace:configure.in:4: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.in:4: -1- AC_SUBST([am__leading_dot]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([am__leading_dot]) +m4trace:configure.in:4: -1- m4_pattern_allow([^am__leading_dot$]) +m4trace:configure.in:4: -1- AC_SUBST([AMTAR]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([AMTAR]) +m4trace:configure.in:4: -1- m4_pattern_allow([^AMTAR$]) +m4trace:configure.in:4: -1- AC_SUBST([am__tar]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([am__tar]) +m4trace:configure.in:4: -1- m4_pattern_allow([^am__tar$]) +m4trace:configure.in:4: -1- AC_SUBST([am__untar]) +m4trace:configure.in:4: -1- AC_SUBST_TRACE([am__untar]) +m4trace:configure.in:4: -1- m4_pattern_allow([^am__untar$]) +m4trace:configure.in:8: -1- AC_DEFINE_TRACE_LITERAL([PPP_BINARY]) +m4trace:configure.in:8: -1- m4_pattern_allow([^PPP_BINARY$]) +m4trace:configure.in:10: -1- AC_DEFINE_TRACE_LITERAL([BSDUSER_PPP]) +m4trace:configure.in:10: -1- m4_pattern_allow([^BSDUSER_PPP$]) +m4trace:configure.in:10: -1- AC_DEFINE_TRACE_LITERAL([PPP_BINARY]) +m4trace:configure.in:10: -1- m4_pattern_allow([^PPP_BINARY$]) +m4trace:configure.in:33: -1- AC_DEFINE_TRACE_LITERAL([SLIRP]) +m4trace:configure.in:33: -1- m4_pattern_allow([^SLIRP$]) +m4trace:configure.in:33: -1- AC_DEFINE_TRACE_LITERAL([PPP_BINARY]) +m4trace:configure.in:33: -1- m4_pattern_allow([^PPP_BINARY$]) +m4trace:configure.in:56: -1- AC_DEFINE_TRACE_LITERAL([PPTP_FACILITY]) +m4trace:configure.in:56: -1- m4_pattern_allow([^PPTP_FACILITY$]) +m4trace:configure.in:56: -1- AC_DEFINE_TRACE_LITERAL([PPTP_FACILITY]) +m4trace:configure.in:56: -1- m4_pattern_allow([^PPTP_FACILITY$]) +m4trace:configure.in:68: -1- AC_DEFINE_TRACE_LITERAL([BCRELAY]) +m4trace:configure.in:68: -1- m4_pattern_allow([^BCRELAY$]) +m4trace:configure.in:89: -1- AC_SUBST([CC]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:89: -1- AC_SUBST([CFLAGS]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CFLAGS]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CFLAGS$]) +m4trace:configure.in:89: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.in:89: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.in:89: -1- AC_SUBST([LIBS]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.in:89: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.in:89: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.in:89: -1- AC_SUBST([CC]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:89: -1- AC_SUBST([CC]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:89: -1- AC_SUBST([CC]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:89: -1- AC_SUBST([CC]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:89: -1- AC_SUBST([ac_ct_CC]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([ac_ct_CC]) +m4trace:configure.in:89: -1- m4_pattern_allow([^ac_ct_CC$]) +m4trace:configure.in:89: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([EXEEXT]) +m4trace:configure.in:89: -1- m4_pattern_allow([^EXEEXT$]) +m4trace:configure.in:89: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([OBJEXT]) +m4trace:configure.in:89: -1- m4_pattern_allow([^OBJEXT$]) +m4trace:configure.in:89: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([DEPDIR]) +m4trace:configure.in:89: -1- m4_pattern_allow([^DEPDIR$]) +m4trace:configure.in:89: -1- AC_SUBST([am__include]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([am__include]) +m4trace:configure.in:89: -1- m4_pattern_allow([^am__include$]) +m4trace:configure.in:89: -1- AC_SUBST([am__quote]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([am__quote]) +m4trace:configure.in:89: -1- m4_pattern_allow([^am__quote$]) +m4trace:configure.in:89: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +m4trace:configure.in:89: -1- AC_SUBST([AMDEP_TRUE]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([AMDEP_TRUE]) +m4trace:configure.in:89: -1- m4_pattern_allow([^AMDEP_TRUE$]) +m4trace:configure.in:89: -1- AC_SUBST([AMDEP_FALSE]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([AMDEP_FALSE]) +m4trace:configure.in:89: -1- m4_pattern_allow([^AMDEP_FALSE$]) +m4trace:configure.in:89: -1- AC_SUBST([AMDEPBACKSLASH]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) +m4trace:configure.in:89: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) +m4trace:configure.in:89: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([CCDEPMODE]) +m4trace:configure.in:89: -1- m4_pattern_allow([^CCDEPMODE$]) +m4trace:configure.in:89: -1- AM_CONDITIONAL([am__fastdepCC], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) +m4trace:configure.in:89: -1- AC_SUBST([am__fastdepCC_TRUE]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) +m4trace:configure.in:89: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) +m4trace:configure.in:89: -1- AC_SUBST([am__fastdepCC_FALSE]) +m4trace:configure.in:89: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) +m4trace:configure.in:89: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) +m4trace:configure.in:90: -1- AC_SUBST([RANLIB]) +m4trace:configure.in:90: -1- AC_SUBST_TRACE([RANLIB]) +m4trace:configure.in:90: -1- m4_pattern_allow([^RANLIB$]) +m4trace:configure.in:92: -1- AC_SUBST([LN_S], [$as_ln_s]) +m4trace:configure.in:92: -1- AC_SUBST_TRACE([LN_S]) +m4trace:configure.in:92: -1- m4_pattern_allow([^LN_S$]) +m4trace:configure.in:93: -1- AC_SUBST([SET_MAKE]) +m4trace:configure.in:93: -1- AC_SUBST_TRACE([SET_MAKE]) +m4trace:configure.in:93: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.in:95: -1- AC_DEFINE_TRACE_LITERAL([const]) +m4trace:configure.in:95: -1- m4_pattern_allow([^const$]) +m4trace:configure.in:95: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */ +@%:@undef const]) +m4trace:configure.in:96: -1- AH_OUTPUT([inline], [/* Define to `__inline__\' or `__inline\' if that\'s what the C compiler + calls it, or to nothing if \'inline\' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_SETSID], [/* Define to 1 if you have the `setsid\' function. */ +@%:@undef HAVE_SETSID]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_DAEMON], [/* Define to 1 if you have the `daemon\' function. */ +@%:@undef HAVE_DAEMON]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_SETPROCTITLE], [/* Define to 1 if you have the `setproctitle\' function. */ +@%:@undef HAVE_SETPROCTITLE]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_GETSERVBYNAME], [/* Define to 1 if you have the `getservbyname\' function. */ +@%:@undef HAVE_GETSERVBYNAME]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_STRLCPY], [/* Define to 1 if you have the `strlcpy\' function. */ +@%:@undef HAVE_STRLCPY]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_FORK], [/* Define to 1 if you have the `fork\' function. */ +@%:@undef HAVE_FORK]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_MEMMOVE], [/* Define to 1 if you have the `memmove\' function. */ +@%:@undef HAVE_MEMMOVE]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */ +@%:@undef HAVE_STRERROR]) +m4trace:configure.in:102: -1- AH_OUTPUT([HAVE_WRITEV], [/* Define to 1 if you have the `writev\' function. */ +@%:@undef HAVE_WRITEV]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_PTY_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_PTY_H]) +m4trace:configure.in:104: -1- AC_SUBST([CPP]) +m4trace:configure.in:104: -1- AC_SUBST_TRACE([CPP]) +m4trace:configure.in:104: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.in:104: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.in:104: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.in:104: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.in:104: -1- AC_SUBST([CPP]) +m4trace:configure.in:104: -1- AC_SUBST_TRACE([CPP]) +m4trace:configure.in:104: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.in:104: -1- AC_SUBST([GREP]) +m4trace:configure.in:104: -1- AC_SUBST_TRACE([GREP]) +m4trace:configure.in:104: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.in:104: -1- AC_SUBST([EGREP]) +m4trace:configure.in:104: -1- AC_SUBST_TRACE([EGREP]) +m4trace:configure.in:104: -1- m4_pattern_allow([^EGREP$]) +m4trace:configure.in:104: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) +m4trace:configure.in:104: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.in:104: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ +@%:@undef STDC_HEADERS]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_TYPES_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_STAT_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDLIB_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRING_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_MEMORY_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRINGS_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_INTTYPES_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDINT_H]) +m4trace:configure.in:104: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_UNISTD_H]) +m4trace:configure.in:104: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTY_H]) +m4trace:configure.in:104: -1- m4_pattern_allow([^HAVE_PTY_H$]) +m4trace:configure.in:105: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRING_H]) +m4trace:configure.in:105: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRING_H]) +m4trace:configure.in:105: -1- m4_pattern_allow([^HAVE_STRING_H$]) +m4trace:configure.in:106: -1- AH_OUTPUT([HAVE_SYSLOG_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYSLOG_H]) +m4trace:configure.in:106: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SYSLOG_H]) +m4trace:configure.in:106: -1- m4_pattern_allow([^HAVE_SYSLOG_H$]) +m4trace:configure.in:107: -1- AH_OUTPUT([HAVE_LIBINTL_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_LIBINTL_H]) +m4trace:configure.in:107: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBINTL_H]) +m4trace:configure.in:107: -1- m4_pattern_allow([^HAVE_LIBINTL_H$]) +m4trace:configure.in:108: -1- AH_OUTPUT([HAVE_LIBUTIL_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_LIBUTIL_H]) +m4trace:configure.in:108: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBUTIL_H]) +m4trace:configure.in:108: -1- m4_pattern_allow([^HAVE_LIBUTIL_H$]) +m4trace:configure.in:109: -1- AH_OUTPUT([HAVE_SYS_UIO_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_UIO_H]) +m4trace:configure.in:109: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SYS_UIO_H]) +m4trace:configure.in:109: -1- m4_pattern_allow([^HAVE_SYS_UIO_H$]) +m4trace:configure.in:111: -1- AC_DEFINE_TRACE_LITERAL([size_t]) +m4trace:configure.in:111: -1- m4_pattern_allow([^size_t$]) +m4trace:configure.in:111: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if does not define. */ +@%:@undef size_t]) +m4trace:configure.in:112: -1- AC_DEFINE_TRACE_LITERAL([ssize_t]) +m4trace:configure.in:112: -1- m4_pattern_allow([^ssize_t$]) +m4trace:configure.in:112: -1- AH_OUTPUT([ssize_t], [/* Define to `int\' if does not define. */ +@%:@undef ssize_t]) +m4trace:configure.in:113: -1- AC_DEFINE_TRACE_LITERAL([u_int8_t]) +m4trace:configure.in:113: -1- m4_pattern_allow([^u_int8_t$]) +m4trace:configure.in:113: -1- AH_OUTPUT([u_int8_t], [/* Define to `unsigned char\' if does not define. */ +@%:@undef u_int8_t]) +m4trace:configure.in:114: -1- AC_DEFINE_TRACE_LITERAL([u_int16_t]) +m4trace:configure.in:114: -1- m4_pattern_allow([^u_int16_t$]) +m4trace:configure.in:114: -1- AH_OUTPUT([u_int16_t], [/* Define to `unsigned short\' if does not define. */ +@%:@undef u_int16_t]) +m4trace:configure.in:115: -1- AC_DEFINE_TRACE_LITERAL([u_int32_t]) +m4trace:configure.in:115: -1- m4_pattern_allow([^u_int32_t$]) +m4trace:configure.in:115: -1- AH_OUTPUT([u_int32_t], [/* Define to `unsigned int\' if does not define. */ +@%:@undef u_int32_t]) +m4trace:configure.in:129: -1- AC_DEFINE_TRACE_LITERAL([socklen_t]) +m4trace:configure.in:129: -1- m4_pattern_allow([^socklen_t$]) +m4trace:configure.in:133: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:2675: AC_TRY_LINK is expanded from... +../../lib/m4sugar/m4sh.m4:598: AS_IF is expanded from... +../../lib/autoconf/general.m4:1482: AC_ARG_WITH is expanded from... +configure.in:133: the top level]) +m4trace:configure.in:133: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBWRAP]) +m4trace:configure.in:133: -1- m4_pattern_allow([^HAVE_LIBWRAP$]) +m4trace:configure.in:133: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:2675: AC_TRY_LINK is expanded from... +../../lib/m4sugar/m4sh.m4:598: AS_IF is expanded from... +../../lib/autoconf/general.m4:2649: _AC_LINK_IFELSE is expanded from... +../../lib/autoconf/general.m4:2666: AC_LINK_IFELSE is expanded from... +../../lib/autoconf/general.m4:2675: AC_TRY_LINK is expanded from... +../../lib/m4sugar/m4sh.m4:598: AS_IF is expanded from... +../../lib/autoconf/general.m4:1482: AC_ARG_WITH is expanded from... +configure.in:133: the top level]) +m4trace:configure.in:133: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBWRAP]) +m4trace:configure.in:133: -1- m4_pattern_allow([^HAVE_LIBWRAP$]) +m4trace:configure.in:163: -1- AH_OUTPUT([HAVE_LIBC], [/* Define to 1 if you have the `c\' library (-lc). */ +@%:@undef HAVE_LIBC]) +m4trace:configure.in:163: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBC]) +m4trace:configure.in:163: -1- m4_pattern_allow([^HAVE_LIBC$]) +m4trace:configure.in:164: -1- AH_OUTPUT([HAVE_LIBC], [/* Define to 1 if you have the `c\' library (-lc). */ +@%:@undef HAVE_LIBC]) +m4trace:configure.in:164: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBC]) +m4trace:configure.in:164: -1- m4_pattern_allow([^HAVE_LIBC$]) +m4trace:configure.in:165: -1- AH_OUTPUT([HAVE_LIBC], [/* Define to 1 if you have the `c\' library (-lc). */ +@%:@undef HAVE_LIBC]) +m4trace:configure.in:165: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBC]) +m4trace:configure.in:165: -1- m4_pattern_allow([^HAVE_LIBC$]) +m4trace:configure.in:166: -1- AH_OUTPUT([HAVE_LIBC], [/* Define to 1 if you have the `c\' library (-lc). */ +@%:@undef HAVE_LIBC]) +m4trace:configure.in:166: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBC]) +m4trace:configure.in:166: -1- m4_pattern_allow([^HAVE_LIBC$]) +m4trace:configure.in:167: -1- AH_OUTPUT([HAVE_LIBSOCKET], [/* Define to 1 if you have the `socket\' library (-lsocket). */ +@%:@undef HAVE_LIBSOCKET]) +m4trace:configure.in:167: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBSOCKET]) +m4trace:configure.in:167: -1- m4_pattern_allow([^HAVE_LIBSOCKET$]) +m4trace:configure.in:168: -1- AH_OUTPUT([HAVE_LIBNSL], [/* Define to 1 if you have the `nsl\' library (-lnsl). */ +@%:@undef HAVE_LIBNSL]) +m4trace:configure.in:168: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBNSL]) +m4trace:configure.in:168: -1- m4_pattern_allow([^HAVE_LIBNSL$]) +m4trace:configure.in:169: -1- AH_OUTPUT([HAVE_LIBUTIL], [/* Define to 1 if you have the `util\' library (-lutil). */ +@%:@undef HAVE_LIBUTIL]) +m4trace:configure.in:169: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBUTIL]) +m4trace:configure.in:169: -1- m4_pattern_allow([^HAVE_LIBUTIL$]) +m4trace:configure.in:170: -1- AH_OUTPUT([HAVE_LIBINTL], [/* Define to 1 if you have the `intl\' library (-lintl). */ +@%:@undef HAVE_LIBINTL]) +m4trace:configure.in:170: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBINTL]) +m4trace:configure.in:170: -1- m4_pattern_allow([^HAVE_LIBINTL$]) +m4trace:configure.in:192: -1- AC_DEFINE_TRACE_LITERAL([HAVE_OPENPTY]) +m4trace:configure.in:192: -1- m4_pattern_allow([^HAVE_OPENPTY$]) +m4trace:configure.in:195: -1- AC_DEFINE_TRACE_LITERAL([HAVE_OPENPTY]) +m4trace:configure.in:195: -1- m4_pattern_allow([^HAVE_OPENPTY$]) +m4trace:configure.in:210: -1- AC_SUBST([XTRALIBS_CTRL]) +m4trace:configure.in:210: -1- AC_SUBST_TRACE([XTRALIBS_CTRL]) +m4trace:configure.in:210: -1- m4_pattern_allow([^XTRALIBS_CTRL$]) +m4trace:configure.in:211: -1- AC_SUBST([XTRALIBS_MGR]) +m4trace:configure.in:211: -1- AC_SUBST_TRACE([XTRALIBS_MGR]) +m4trace:configure.in:211: -1- m4_pattern_allow([^XTRALIBS_MGR$]) +m4trace:configure.in:212: -1- AC_SUBST([HAVE_OPENPTY]) +m4trace:configure.in:212: -1- AC_SUBST_TRACE([HAVE_OPENPTY]) +m4trace:configure.in:212: -1- m4_pattern_allow([^HAVE_OPENPTY$]) +m4trace:configure.in:223: -1- AC_SUBST([XTRA_PROG]) +m4trace:configure.in:223: -1- AC_SUBST_TRACE([XTRA_PROG]) +m4trace:configure.in:223: -1- m4_pattern_allow([^XTRA_PROG$]) +m4trace:configure.in:255: -1- AC_CONFIG_FILES([Makefile]) +m4trace:configure.in:255: -1- _m4_warn([obsolete], [AC_OUTPUT should be used without arguments. +You should run autoupdate.], []) +m4trace:configure.in:255: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) +m4trace:configure.in:255: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +m4trace:configure.in:255: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([LTLIBOBJS]) +m4trace:configure.in:255: -1- m4_pattern_allow([^LTLIBOBJS$]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([top_builddir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([top_build_prefix]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([srcdir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([abs_srcdir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([top_srcdir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([abs_top_srcdir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([builddir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([abs_builddir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([abs_top_builddir]) +m4trace:configure.in:255: -1- AC_SUBST_TRACE([INSTALL]) diff --git a/release/src/router/pptpd/compat.c b/release/src/router/pptpd/compat.c new file mode 100644 index 0000000000..9836d295e8 --- /dev/null +++ b/release/src/router/pptpd/compat.c @@ -0,0 +1,201 @@ +/* + * compat.c + * + * Compatibility functions for different OSes + * + * $Id: compat.c,v 1.6 2005/08/22 00:48:34 quozl Exp $ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include "compat.h" + +#ifndef HAVE_STRLCPY +#include +#include + +void strlcpy(char *dst, const char *src, size_t size) +{ + strncpy(dst, src, size - 1); + dst[size - 1] = '\0'; +} +#endif + +#ifndef HAVE_MEMMOVE +void *memmove(void *dst, const void *src, size_t size) +{ + bcopy(src, dst, size); + return dst; +} +#endif + +#ifndef HAVE_OPENPTY +/* + * Finds a free PTY/TTY pair. + * + * This is derived from C.S. Ananian's pty.c that was with his pptp client. + * + ************************************************************************* + * pty.c - find a free pty/tty pair. + * inspired by the xterm source. + * NOTE: This is very likely to be highly non-portable. + * C. Scott Ananian + * + * Heavily modified to chage from getpseudopty() to openpty(). + */ + +#include +#include +#include +#if HAVE_SYSLOG_H +#include +#else +#include "our_syslog.h" +#endif + +int openpty(int *master, int *slave, char *name, void *unused1, void *unused2) +{ + int devindex = 0, letter = 0; + int fd1, fd2; + char ttydev[PTYMAX], ptydev[TTYMAX]; + + syslog(LOG_DEBUG, "CTRL: Allocating pty/tty pair"); + strcpy(ttydev, TTYDEV); + strcpy(ptydev, PTYDEV); + while (PTYCHAR1[letter]) { + ttydev[TTYMAX - 3] = ptydev[PTYMAX - 3] = PTYCHAR1[letter]; + while (PTYCHAR2[devindex]) { + ttydev[TTYMAX - 2] = ptydev[PTYMAX - 2] = PTYCHAR2[devindex]; + if ((fd1 = open(ptydev, O_RDWR)) >= 0) { + if ((fd2 = open(ttydev, O_RDWR)) >= 0) { + goto out; + } else { + close(fd1); + } + } + devindex++; + } + devindex = 0; + letter++; + } + syslog(LOG_ERR, "CTRL: Failed to allocate pty"); + return -1; /* Unable to allocate pty */ + + out: + syslog(LOG_INFO, "CTRL: Allocated pty/tty pair (%s,%s)", ptydev, ttydev); + if (master) + *master = fd1; + if (slave) + *slave = fd2; + if (name) + strcpy(name, ttydev); /* no way to bounds check */ + return 0; +} +#endif + +#ifndef HAVE_STRERROR +char *strerror(int errnum) { + static char buf[16]; + sprintf(buf, "Error %d", errnum); + return buf; +} +#endif + +#ifndef HAVE_SETPROCTITLE +#include "inststr.h" +#endif + +#define __USE_BSD 1 +#include +#include + +void my_setproctitle(int argc, char **argv, const char *format, ...) { + char proctitle[64]; + va_list parms; + va_start(parms, format); + vsnprintf(proctitle, sizeof(proctitle), format, parms); + +#ifndef HAVE_SETPROCTITLE + inststr(argc, argv, proctitle); +#else + setproctitle(proctitle); +#endif + va_end(parms); +} + +/* signal to pipe delivery implementation */ +#include +#include +#include + +/* pipe private to process */ +static int sigpipe[2]; + +/* create a signal pipe, returns 0 for success, -1 with errno for failure */ +int sigpipe_create() +{ + int rc; + + rc = pipe(sigpipe); + if (rc < 0) return rc; + + fcntl(sigpipe[0], F_SETFD, FD_CLOEXEC); + fcntl(sigpipe[1], F_SETFD, FD_CLOEXEC); + +#ifdef O_NONBLOCK +#define FLAG_TO_SET O_NONBLOCK +#else +#ifdef SYSV +#define FLAG_TO_SET O_NDELAY +#else /* BSD */ +#define FLAG_TO_SET FNDELAY +#endif +#endif + + rc = fcntl(sigpipe[1], F_GETFL); + if (rc != -1) + rc = fcntl(sigpipe[1], F_SETFL, rc | FLAG_TO_SET); + if (rc < 0) return rc; + return 0; +#undef FLAG_TO_SET +} + +/* generic handler for signals, writes signal number to pipe */ +void sigpipe_handler(int signum) +{ + write(sigpipe[1], &signum, sizeof(signum)); + signal(signum, sigpipe_handler); +} + +/* assign a signal number to the pipe */ +void sigpipe_assign(int signum) +{ + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = sigpipe_handler; + sigaction(signum, &sa, NULL); +} + +/* return the signal pipe read file descriptor for select(2) */ +int sigpipe_fd() +{ + return sigpipe[0]; +} + +/* read and return the pending signal from the pipe */ +int sigpipe_read() +{ + int signum; + read(sigpipe[0], &signum, sizeof(signum)); + return signum; +} + +void sigpipe_close() +{ + close(sigpipe[0]); + close(sigpipe[1]); +} + diff --git a/release/src/router/pptpd/conf b/release/src/router/pptpd/conf new file mode 100644 index 0000000000..cb5890adc6 --- /dev/null +++ b/release/src/router/pptpd/conf @@ -0,0 +1 @@ +./configure --prefix=/usr --includedir=/opt/openwrt/mipsel-linux-uclibc/include --host=mips --libdir=/opt/openwrt/mipsel-linux-uclibc/lib/ --with-bcrelay CC=mipsel-linux-uclibc-gcc CFLAGS="-Os -mtune=mips32 -mips32 -pipe" host_alias=mips --no-recursion diff --git a/release/src/router/pptpd/config.embed.h b/release/src/router/pptpd/config.embed.h new file mode 100644 index 0000000000..ad09bf6db1 --- /dev/null +++ b/release/src/router/pptpd/config.embed.h @@ -0,0 +1,15 @@ +/* + * config.embed.h + * + * Dummy autoconf results for uClinux target. + * + * $Id: config.embed.h,v 1.4 2004/04/22 10:48:16 quozl Exp $ + */ + +#define STDC_HEADERS 1 +#define HAVE_SETSID 1 +#define HAVE_MEMMOVE 1 +#define HAVE_STRING_H 1 +#define PPP_BINARY "/bin/pppd" +#define BCRELAY_BIN "/bin/bcrelay" +#define SBINDIR "/bin" diff --git a/release/src/router/pptpd/config.h.in b/release/src/router/pptpd/config.h.in new file mode 100644 index 0000000000..31ec94d7b4 --- /dev/null +++ b/release/src/router/pptpd/config.h.in @@ -0,0 +1,188 @@ +/* config.h.in. Generated from configure.in by autoheader. */ +/* + * acconfig.h + * + * Additional autoconf defines for this program. + * + * $Id: acconfig.h,v 1.6 2005/12/29 01:21:09 quozl Exp $ + */ + +/* Use BSD User land PPP? */ +#undef BSDUSER_PPP + +/* Use SLIRP? */ +#undef SLIRP + +/* Enable Broadcast Relay? */ +#undef BCRELAY + +/* Work as a PNS rather than a PAC? */ +#undef PNS_MODE + +/* Communicate between control and manager processes with a pipe */ +#undef CTRL_MGR_PIPE + +/* Where is my pppd? */ +#undef PPP_BINARY + +/* Syslog Facility to use? See openlog(3). */ +#undef PPTP_FACILITY + +/* Have libwrap? */ +#undef HAVE_LIBWRAP + +/* Package name */ +#undef PACKAGE + +/* Version */ +#undef VERSION + +/* Just #define to int if it's not defined */ +#undef socklen_t + +/* These would be better as typedefs, but... */ +#undef u_int8_t +#undef u_int16_t +#undef u_int32_t + +/* And the signed size_t */ +/* (normal size_t is done by standard autoconf) */ +#undef ssize_t + +/* Define if you have an openpty() (non-standard check) */ +#undef HAVE_OPENPTY + +/* Define to 1 if you have the `daemon' function. */ +#undef HAVE_DAEMON + +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + +/* Define to 1 if you have the `getservbyname' function. */ +#undef HAVE_GETSERVBYNAME + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `c' library (-lc). */ +#undef HAVE_LIBC + +/* Define to 1 if you have the `intl' library (-lintl). */ +#undef HAVE_LIBINTL + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBINTL_H + +/* Define to 1 if you have the `nsl' library (-lnsl). */ +#undef HAVE_LIBNSL + +/* Define to 1 if you have the `socket' library (-lsocket). */ +#undef HAVE_LIBSOCKET + +/* Define to 1 if you have the `util' library (-lutil). */ +#undef HAVE_LIBUTIL + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBUTIL_H + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_PTY_H + +/* Define to 1 if you have the `setproctitle' function. */ +#undef HAVE_SETPROCTITLE + +/* Define to 1 if you have the `setsid' function. */ +#undef HAVE_SETSID + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strlcpy' function. */ +#undef HAVE_STRLCPY + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYSLOG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `writev' function. */ +#undef HAVE_WRITEV + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `unsigned int' if does not define. */ +#undef size_t + +/* Define to `int' if does not define. */ +#undef ssize_t + +/* Define to `unsigned short' if does not define. */ +#undef u_int16_t + +/* Define to `unsigned int' if does not define. */ +#undef u_int32_t + +/* Define to `unsigned char' if does not define. */ +#undef u_int8_t diff --git a/release/src/router/pptpd/configfile.h b/release/src/router/pptpd/configfile.h new file mode 100644 index 0000000000..9a646e2d36 --- /dev/null +++ b/release/src/router/pptpd/configfile.h @@ -0,0 +1,14 @@ +/* + * configfile.h + * + * Function to read pptpd config file. + * + * $Id: configfile.h,v 1.1.1.1 2002/06/21 08:51:55 fenix_nl Exp $ + */ + +#ifndef _PPTPD_CONFIGFILE_H +#define _PPTPD_CONFIGFILE_H + +int read_config_file(char *filename, char *keyword, char *value); + +#endif /* !_PPTPD_CONFIGFILE_H */ diff --git a/release/src/router/pptpd/configure b/release/src/router/pptpd/configure new file mode 100755 index 0000000000..94008be8e9 --- /dev/null +++ b/release/src/router/pptpd/configure @@ -0,0 +1,6620 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.68. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="pptpmanager.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +XTRA_PROG +HAVE_OPENPTY +XTRALIBS_MGR +XTRALIBS_CTRL +EGREP +GREP +CPP +LN_S +RANLIB +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +with_bsdppp +with_slirp +enable_facility +enable_bcrelay +enable_dependency_tracking +with_libwrap +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-facility=name Use another syslog facility, default LOG_DAEMON + --enable-bcrelay Enable broadcast relay function + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-bsdppp Use BSD user-space ppp + --with-slirp Use SLIRP instead of pppd + --with-libwrap Use libwrap (tcp wrappers) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.68 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_config_headers="$ac_config_headers config.h" + +am__api_version="1.9" +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE=pptpd + VERSION=1.3.4 + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + +# check common command line options early + +$as_echo "#define PPP_BINARY \"/usr/sbin/pppd\"" >>confdefs.h + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command line for use of BSD PPP" >&5 +$as_echo_n "checking command line for use of BSD PPP... " >&6; } + +# Check whether --with-bsdppp was given. +if test "${with_bsdppp+set}" = set; then : + withval=$with_bsdppp; + case "$withval" in + yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: BSD user-space ppp" >&5 +$as_echo "BSD user-space ppp" >&6; } + $as_echo "#define BSDUSER_PPP 1" >>confdefs.h + + BSDUSER_PPP=$with_bsdppp + $as_echo "#define PPP_BINARY \"/usr/sbin/ppp\"" >>confdefs.h + + break; + ;; + no) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: explicit standard pppd" >&5 +$as_echo "explicit standard pppd" >&6; } + ;; + *) + # only yes or no are expected for this option + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unrecognised... terminating" >&5 +$as_echo "unrecognised... terminating" >&6; } + exit 1 + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: default standard pppd" >&5 +$as_echo "default standard pppd" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command line for use of SLIRP" >&5 +$as_echo_n "checking command line for use of SLIRP... " >&6; } + +# Check whether --with-slirp was given. +if test "${with_slirp+set}" = set; then : + withval=$with_slirp; + case "$withval" in + yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define SLIRP 1" >>confdefs.h + + SLIRP=$with_slirp + $as_echo "#define PPP_BINARY \"/bin/slirp\"" >>confdefs.h + + break; + ;; + no) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: explicit no" >&5 +$as_echo "explicit no" >&6; } + ;; + *) + # only yes or no are expected for this option + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unrecognised... terminating" >&5 +$as_echo "unrecognised... terminating" >&6; } + exit 1 + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: default no" >&5 +$as_echo "default no" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command line for syslog facility name" >&5 +$as_echo_n "checking command line for syslog facility name... " >&6; } +# Check whether --enable-facility was given. +if test "${enable_facility+set}" = set; then : + enableval=$enable_facility; + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enableval" >&5 +$as_echo "$enableval" >&6; } + cat >>confdefs.h <<_ACEOF +#define PPTP_FACILITY $enableval +_ACEOF + + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: default LOG_DAEMON" >&5 +$as_echo "default LOG_DAEMON" >&6; } + cat >>confdefs.h <<_ACEOF +#define PPTP_FACILITY LOG_DAEMON +_ACEOF + + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command line for bcrelay build" >&5 +$as_echo_n "checking command line for bcrelay build... " >&6; } +# Check whether --enable-bcrelay was given. +if test "${enable_bcrelay+set}" = set; then : + enableval=$enable_bcrelay; + case "$enableval" in + yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define BCRELAY 1" >>confdefs.h + + BCRELAY=$enableval + break; + ;; + no) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: explicit no" >&5 +$as_echo "explicit no" >&6; } + ;; + *) + # only yes or no are expected for this option + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unrecognised... terminating" >&5 +$as_echo "unrecognised... terminating" >&6; } + exit 1 + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: default no" >&5 +$as_echo "default no" >&6; } +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether #! works in shell scripts" >&5 +$as_echo_n "checking whether #! works in shell scripts... " >&6; } +if ${ac_cv_sys_interpreter+:} false; then : + $as_echo_n "(cached) " >&6 +else + echo '#! /bin/cat +exit 69 +' >conftest +chmod u+x conftest +(SHELL=/bin/sh; export SHELL; ./conftest >/dev/null 2>&1) +if test $? -ne 69; then + ac_cv_sys_interpreter=yes +else + ac_cv_sys_interpreter=no +fi +rm -f conftest +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_interpreter" >&5 +$as_echo "$ac_cv_sys_interpreter" >&6; } +interpval=$ac_cv_sys_interpreter + + +for ac_func in setsid daemon setproctitle getservbyname strlcpy fork memmove strerror writev +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in pty.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" +if test "x$ac_cv_header_pty_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_PTY_H 1 +_ACEOF + +fi + +done + +for ac_header in string.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRING_H 1 +_ACEOF + +fi + +done + +for ac_header in syslog.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "syslog.h" "ac_cv_header_syslog_h" "$ac_includes_default" +if test "x$ac_cv_header_syslog_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYSLOG_H 1 +_ACEOF + +fi + +done + +for ac_header in libintl.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" +if test "x$ac_cv_header_libintl_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBINTL_H 1 +_ACEOF + +fi + +done + +for ac_header in libutil.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" +if test "x$ac_cv_header_libutil_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBUTIL_H 1 +_ACEOF + +fi + +done + +for ac_header in sys/uio.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_uio_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_UIO_H 1 +_ACEOF + +fi + +done + + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" +if test "x$ac_cv_type_ssize_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define ssize_t int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "u_int8_t" "ac_cv_type_u_int8_t" "$ac_includes_default" +if test "x$ac_cv_type_u_int8_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define u_int8_t unsigned char +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "u_int16_t" "ac_cv_type_u_int16_t" "$ac_includes_default" +if test "x$ac_cv_type_u_int16_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define u_int16_t unsigned short +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "$ac_includes_default" +if test "x$ac_cv_type_u_int32_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define u_int32_t unsigned int +_ACEOF + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t" >&5 +$as_echo_n "checking for socklen_t... " >&6; } +if ${ac_cv_type_socklen_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if STDC_HEADERS +#include +#include +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "socklen_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then : + ac_cv_type_socklen_t=yes +else + ac_cv_type_socklen_t=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_socklen_t" >&5 +$as_echo "$ac_cv_type_socklen_t" >&6; } +if test $ac_cv_type_socklen_t = no; then + $as_echo "#define socklen_t int" >>confdefs.h + +fi + + +# Check whether --with-libwrap was given. +if test "${with_libwrap+set}" = set; then : + withval=$with_libwrap; + if test "$with_libwrap" = "yes"; then + XYZZY_LIBS="$LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libwrap alone" >&5 +$as_echo_n "checking for libwrap alone... " >&6; } + LIBS="$XYZZY_LIBS -lwrap" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + int allow_severity, deny_severity; +int +main () +{ + hosts_access(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_LIBWRAP 1" >>confdefs.h + + LIBWRAP="yes" + XTRALIBS_MGR="-lwrap" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + LIBS="$XYZZY_LIBS -lwrap -lnsl" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libwrap with libnsl" >&5 +$as_echo_n "checking for libwrap with libnsl... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + int allow_severity, deny_severity; +int +main () +{ + hosts_access(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_LIBWRAP 1" >>confdefs.h + + LIBWRAP="yes" + XTRALIBS_MGR="-lwrap -lnsl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$XYZZY_LIBS" + fi + +fi + + +XYZZY_LIBS="$LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for accept in -lc" >&5 +$as_echo_n "checking for accept in -lc... " >&6; } +if ${ac_cv_lib_c_accept+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char accept (); +int +main () +{ +return accept (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_accept=yes +else + ac_cv_lib_c_accept=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_accept" >&5 +$as_echo "$ac_cv_lib_c_accept" >&6; } +if test "x$ac_cv_lib_c_accept" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBC 1 +_ACEOF + + LIBS="-lc $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lc" >&5 +$as_echo_n "checking for gethostbyname in -lc... " >&6; } +if ${ac_cv_lib_c_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_gethostbyname=yes +else + ac_cv_lib_c_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gethostbyname" >&5 +$as_echo "$ac_cv_lib_c_gethostbyname" >&6; } +if test "x$ac_cv_lib_c_gethostbyname" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBC 1 +_ACEOF + + LIBS="-lc $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lc" >&5 +$as_echo_n "checking for openpty in -lc... " >&6; } +if ${ac_cv_lib_c_openpty+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char openpty (); +int +main () +{ +return openpty (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_openpty=yes +else + ac_cv_lib_c_openpty=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_openpty" >&5 +$as_echo "$ac_cv_lib_c_openpty" >&6; } +if test "x$ac_cv_lib_c_openpty" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBC 1 +_ACEOF + + LIBS="-lc $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettext in -lc" >&5 +$as_echo_n "checking for gettext in -lc... " >&6; } +if ${ac_cv_lib_c_gettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gettext (); +int +main () +{ +return gettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_gettext=yes +else + ac_cv_lib_c_gettext=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gettext" >&5 +$as_echo "$ac_cv_lib_c_gettext" >&6; } +if test "x$ac_cv_lib_c_gettext" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBC 1 +_ACEOF + + LIBS="-lc $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for accept in -lsocket" >&5 +$as_echo_n "checking for accept in -lsocket... " >&6; } +if ${ac_cv_lib_socket_accept+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char accept (); +int +main () +{ +return accept (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_accept=yes +else + ac_cv_lib_socket_accept=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_accept" >&5 +$as_echo "$ac_cv_lib_socket_accept" >&6; } +if test "x$ac_cv_lib_socket_accept" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSOCKET 1 +_ACEOF + + LIBS="-lsocket $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBNSL 1 +_ACEOF + + LIBS="-lnsl $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil" >&5 +$as_echo_n "checking for openpty in -lutil... " >&6; } +if ${ac_cv_lib_util_openpty+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lutil $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char openpty (); +int +main () +{ +return openpty (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_util_openpty=yes +else + ac_cv_lib_util_openpty=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty" >&5 +$as_echo "$ac_cv_lib_util_openpty" >&6; } +if test "x$ac_cv_lib_util_openpty" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBUTIL 1 +_ACEOF + + LIBS="-lutil $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettext in -lintl" >&5 +$as_echo_n "checking for gettext in -lintl... " >&6; } +if ${ac_cv_lib_intl_gettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gettext (); +int +main () +{ +return gettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_gettext=yes +else + ac_cv_lib_intl_gettext=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_gettext" >&5 +$as_echo "$ac_cv_lib_intl_gettext" >&6; } +if test "x$ac_cv_lib_intl_gettext" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBINTL 1 +_ACEOF + + LIBS="-lintl $LIBS" + +fi + +LIBS="$XYZZY_LIBS" +if test "$ac_cv_lib_c_accept" = no; then + if test "$ac_cv_lib_socket_accept" = yes; then + LIBS="$LIBS -lsocket" + else + echo "Couldn't find a usable accept!" 1>&2 + exit 1 + fi +fi +if test "$ac_cv_lib_c_gethostbyname" = no; then + if test "$ac_cv_lib_nsl_gethostbyname" = yes; then + LIBS="$LIBS -lnsl" + if test "$XTRALIBS_MGR" = "-lwrap -lnsl"; then + XTRALIBS_MGR="-lwrap" + fi + else + echo "Couldn't find a usable gethostbyname!" 1>&2 + exit 1 + fi +fi +if test "$ac_cv_lib_c_openpty" = yes; then + $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h + +else + if test "$ac_cv_lib_util_openpty" = yes; then + $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h + + XTRALIBS_CTRL="-lutil" + fi +fi +if test "$ac_cv_header_libintl_h" = yes; then + if test "$ac_cv_lib_c_gettext" = no; then + if test "$ac_cv_lib_intl_gettext" = yes; then + XTRALIBS_MGR = "$XTRALIBS_MGR -lintl" + else + echo "Have libintl.h but no usable gettext!" 1>&2 + exit 1 + fi + fi +fi + + + + + +if test "$BCRELAY" = "yes"; then + if test "$BCRELAY" = "yes"; then + XTRA_PROG="bcrelay" + true + else + echo "No BCrelay selected." 1>&2 + fi +fi + + + +echo '===============================================================================' + +echo 'Configuration chosen:' + +echo -n ' PPPd: ' +if test "$BSDUSER_PPP" = "yes"; then + echo 'BSD user-space PPPd.' +else + if test "$SLIRP" = "yes"; then + echo 'SLIRP.' + else + echo 'Standard.' + fi +fi + +echo -n ' LIBWRAP security: ' +if test "$LIBWRAP" = "yes"; then + echo 'Yes.' +else + echo 'No.' +fi + +echo -n ' Broadcast Relay: ' +if test "$BCRELAY" = "yes"; then + echo 'Yes.' +else + echo 'No.' +fi + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.68, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + "$ac_file" | "$ac_file":* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for "$ac_file"" >`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/release/src/router/pptpd/defaults.h b/release/src/router/pptpd/defaults.h new file mode 100644 index 0000000000..2bf018b790 --- /dev/null +++ b/release/src/router/pptpd/defaults.h @@ -0,0 +1,81 @@ +/* + * defaults.h + * + * This file contains some tuneable parameters, most of which can be overriden + * at run-time. + * + * $Id: defaults.h,v 1.9 2006/09/04 23:17:25 quozl Exp $ + */ + +#ifndef _PPTPD_DEFAULTS_H +#define _PPTPD_DEFAULTS_H + +/* Definitions for true and false */ + +#ifndef FALSE +#define FALSE 0 +#define TRUE !FALSE +#endif + +/* String sizes for the config file */ + +#define MAX_CONFIG_FILENAME_SIZE 256 +#define MAX_CONFIG_STRING_SIZE 512 + +/* For IP parser */ + +#define LOCAL 0 +#define REMOTE 1 + +/* Default configuration values, mostly configurable */ + +#define CONNECTIONS_DEFAULT 6 +#define DEFAULT_LOCAL_IP_LIST "192.168.0.1-100" +#define DEFAULT_REMOTE_IP_LIST "192.168.1.1-100" + +#define MAX_CALLS_PER_TCP_LINK 128 + +#ifdef PNS_MODE +#define MAX_CALLS 60 +#endif + +#define PPP_SPEED_DEFAULT "115200" +#if EMBED +#define PPTPD_CONFIG_FILE_DEFAULT "/etc/config/pptpd.conf" +#else +#define PPTPD_CONFIG_FILE_DEFAULT "/etc/pptpd.conf" +#endif +#define PIDFILE_DEFAULT "/var/run/pptpd.pid" + +#define STIMEOUT_DEFAULT 10 /* seconds */ + +/* Location of binaries */ +/* +#define PPTP_CTRL_BIN SBINDIR "/pptpctrl" +#define PPTPD_BIN SBINDIR "/pptpd" +#define BCRELAY_BIN SBINDIR "/bcrelay" +*/ +#define PPTP_CTRL_BIN "/usr/sbin/pptpctrl" +#define PPTPD_BIN "/usr/sbin/pptpd" +#define BCRELAY_BIN "/usr/sbin/bcrelay" + +/* Parameters permitted in the config file */ + +#define CONNECTIONS_KEYWORD "connections" +#define SPEED_KEYWORD "speed" +#define PPPD_OPTION_KEYWORD "option" +#define DEBUG_KEYWORD "debug" +#ifdef BCRELAY +#define BCRELAY_KEYWORD "bcrelay" +#endif +#define LOCALIP_KEYWORD "localip" +#define REMOTEIP_KEYWORD "remoteip" +#define LISTEN_KEYWORD "listen" +#define PIDFILE_KEYWORD "pidfile" +#define STIMEOUT_KEYWORD "stimeout" +#define NOIPPARAM_KEYWORD "noipparam" +#define PPP_BINARY_KEYWORD "ppp" +#define LOGWTMP_KEYWORD "logwtmp" +#define DELEGATE_KEYWORD "delegate" + +#endif /* !_PPTPD_DEFAULTS_H */ diff --git a/release/src/router/pptpd/getopt.c b/release/src/router/pptpd/getopt.c new file mode 100644 index 0000000000..0f0b1e3ab0 --- /dev/null +++ b/release/src/router/pptpd/getopt.c @@ -0,0 +1,1064 @@ +/* + * getopt.c + * + * Ripped from GLIBC - original copyright follows + * + * NOTE: Changed to make dependencies work better: + * * changed to "config.h" + * * #include "our_getopt.h" near #define ELIDE_CODE + * + * $Id: getopt.c,v 1.1.1.1 2002/06/21 08:52:00 fenix_nl Exp $ + */ + +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + + Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 + Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# include "our_getopt.h" /* for dependency consistency */ +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include +# include +#endif /* GNU C library. */ + +#ifdef VMS +# include +# if HAVE_STRING_H - 0 +# include +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. + When compiling libc, the _ macro is predefined. */ +# ifdef HAVE_LIBINTL_H +# include +# define _(msgid) gettext (msgid) +# else +# define _(msgid) (msgid) +# endif +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "our_getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_initialized; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +# include +# define my_index strchr +#else + +# if HAVE_STRING_H +# include +# else +# include +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +extern char *getenv (); +#endif + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +# if (!defined __STDC__ || !__STDC__) && !defined strlen +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +# endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +#ifdef _LIBC +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; + +static int original_argc; +static char *const *original_argv; + +/* Make sure the environment variable bash 2.0 puts in the environment + is valid for the getopt call we must make sure that the ARGV passed + to getopt is that one passed to the process. */ +static void +__attribute__ ((unused)) +store_args_and_env (int argc, char *const *argv) +{ + /* XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ + original_argc = argc; + original_argv = argv; +} +# ifdef text_set_element +text_set_element (__libc_subinit, store_args_and_env); +# endif /* text_set_element */ + +# define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +#if defined __STDC__ && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#ifdef _LIBC + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined __STDC__ && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + +#ifdef _LIBC + if (posixly_correct == NULL + && argc == original_argc && argv == original_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#ifdef _LIBC +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + } + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (opterr) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (opterr) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/release/src/router/pptpd/inststr.h b/release/src/router/pptpd/inststr.h new file mode 100644 index 0000000000..fd61ec4ae9 --- /dev/null +++ b/release/src/router/pptpd/inststr.h @@ -0,0 +1,17 @@ +/* + * inststr.h + * + * Change process title + * From code by C. S. Ananian + * + * $Id: inststr.h,v 1.1.1.1 2002/06/21 08:52:00 fenix_nl Exp $ + */ + +#ifndef _PPTPD_INSTSTR_H +#define _PPTPD_INSTSTR_H + +#ifndef HAVE_SETPROCTITLE +void inststr(int argc, char **argv, char *src); +#endif + +#endif /* !_PPTPD_INSTSTR_H */ diff --git a/release/src/router/pptpd/mkinstalldirs b/release/src/router/pptpd/mkinstalldirs new file mode 100644 index 0000000000..d248aeb535 --- /dev/null +++ b/release/src/router/pptpd/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1.1.1 2002/06/21 08:52:00 fenix_nl Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/release/src/router/pptpd/our_getopt.h b/release/src/router/pptpd/our_getopt.h new file mode 100644 index 0000000000..d351893717 --- /dev/null +++ b/release/src/router/pptpd/our_getopt.h @@ -0,0 +1,177 @@ +/* + * our_getopt.h + * + * Header file for the getopt_long deprived. + * + * $Id: our_getopt.h,v 1.1.1.1 2002/06/21 08:52:00 fenix_nl Exp $ + */ + +/* Declarations for getopt. + Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +# if defined __STDC__ && __STDC__ + const char *name; +# else + char *name; +# endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `getopt'. */ + +#if defined __STDC__ && __STDC__ +# ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int __argc, char *const *__argv, const char *__shortopts); +# else /* not __GNU_LIBRARY__ */ +extern int getopt (); +# endif /* __GNU_LIBRARY__ */ + +# ifndef __need_getopt +extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, + const struct option *__longopts, int *__longind); +extern int getopt_long_only (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only); +# endif +#else /* not __STDC__ */ +extern int getopt (); +# ifndef __need_getopt +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +# endif +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff --git a/release/src/router/pptpd/our_syslog.h b/release/src/router/pptpd/our_syslog.h new file mode 100644 index 0000000000..dd44273a2b --- /dev/null +++ b/release/src/router/pptpd/our_syslog.h @@ -0,0 +1,44 @@ +/* + * our_syslog.h + * + * Syslog replacement functions + * + * $Id: our_syslog.h,v 1.1.1.1 2002/06/21 08:52:00 fenix_nl Exp $ + */ + +#ifndef _PPTPD_SYSLOG_H +#define _PPTPD_SYSLOG_H + +/* + * only enable this if you are debugging and running by hand + * If init runs us you may not have an fd-2, and thus your write all over + * someones FD and the die :-( + */ +#undef USE_STDERR + +#ifdef USE_STDERR + +/* + * Send all errors to stderr + */ + +#define openlog(a,b,c) ({}) +#define syslog(a,b,c...) ({fprintf(stderr, "pptpd syslog: " b "\n" , ## c);}) +#define closelog() ({}) + +#define syslog_perror perror + +#else + +/* + * Send all errors to syslog + */ + +#include +#include + +#define syslog_perror(s) syslog(LOG_ERR, "%s: %s", s, strerror(errno)) + +#endif + +#endif /* !_PPTPD_SYSLOG_H */ diff --git a/release/src/router/pptpd/plugins/Makefile b/release/src/router/pptpd/plugins/Makefile new file mode 100644 index 0000000000..059cba11b9 --- /dev/null +++ b/release/src/router/pptpd/plugins/Makefile @@ -0,0 +1,34 @@ +CC = gcc +COPTS = -O2 -g +CFLAGS = $(COPTS) -I.. -I../../include -fPIC +LDFLAGS = -shared +LDADD = -lutil +INSTALL = install -o root +prefix = /usr/local + +PLUGINS = pptpd-logwtmp.so + +# include dependencies if present +ifeq (.depend,$(wildcard .depend)) +include .depend +endif + +all: $(PLUGINS) + +%.so: %.c + $(CC) -o $@ $(LDFLAGS) $(CFLAGS) $^ $(LDADD) + +LIBDIR ?= $(DESTDIR)$(prefix)/lib/pptpd + +install: $(PLUGINS) + $(INSTALL) -d $(LIBDIR) + $(INSTALL) $? $(LIBDIR) + +uninstall: + rm -f $(LIBDIR)$(PLUGINS) + +clean: + rm -f *.o *.so *.a + +depend: + $(CPP) -M $(CFLAGS) *.c >.depend diff --git a/release/src/router/pptpd/plugins/patchlevel.h b/release/src/router/pptpd/plugins/patchlevel.h new file mode 120000 index 0000000000..38f61813ac --- /dev/null +++ b/release/src/router/pptpd/plugins/patchlevel.h @@ -0,0 +1 @@ +../../pppd/pppd/patchlevel.h \ No newline at end of file diff --git a/release/src/router/pptpd/plugins/pppd.h b/release/src/router/pptpd/plugins/pppd.h new file mode 120000 index 0000000000..779917feff --- /dev/null +++ b/release/src/router/pptpd/plugins/pppd.h @@ -0,0 +1 @@ +../../pppd/pppd/pppd.h \ No newline at end of file diff --git a/release/src/router/pptpd/plugins/pptpd-logwtmp.c b/release/src/router/pptpd/plugins/pptpd-logwtmp.c new file mode 100644 index 0000000000..802c86d2b5 --- /dev/null +++ b/release/src/router/pptpd/plugins/pptpd-logwtmp.c @@ -0,0 +1,66 @@ +/* + * $Id: pptpd-logwtmp.c,v 1.5 2007/04/16 00:21:02 quozl Exp $ + * pptpd-logwtmp.c - pppd plugin to update wtmp for a pptpd user + * + * Copyright 2004 James Cameron. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ +#include +#include +#include +#include "pppd.h" + +char pppd_version[] = VERSION; + +static char pptpd_original_ip[PATH_MAX+1]; +static bool pptpd_logwtmp_strip_domain = 0; + +static option_t options[] = { + { "pptpd-original-ip", o_string, pptpd_original_ip, + "Original IP address of the PPTP connection", + OPT_STATIC, NULL, PATH_MAX }, + { "pptpd-logwtmp-strip-domain", o_bool, &pptpd_logwtmp_strip_domain, + "Strip domain from username before logging", OPT_PRIO | 1 }, + { NULL } +}; + +static char *reduce(char *user) +{ + char *sep; + if (!pptpd_logwtmp_strip_domain) return user; + + sep = strstr(user, "//"); /* two slash */ + if (sep != NULL) user = sep + 2; + sep = strstr(user, "\\"); /* or one backslash */ + if (sep != NULL) user = sep + 1; + return user; +} + +static void ip_up(void *opaque, int arg) +{ + char *user = reduce(peer_authname); + if (debug) + notice("pptpd-logwtmp.so ip-up %s %s %s", ifname, user, + pptpd_original_ip); + logwtmp(ifname, user, pptpd_original_ip); +} + +static void ip_down(void *opaque, int arg) +{ + if (debug) + notice("pptpd-logwtmp.so ip-down %s", ifname); + logwtmp(ifname, "", ""); +} + +void plugin_init(void) +{ + add_options(options); + add_notifier(&ip_up_notifier, ip_up, NULL); + add_notifier(&ip_down_notifier, ip_down, NULL); + if (debug) + notice("pptpd-logwtmp: $Version$"); +} diff --git a/release/src/router/pptpd/ppphdlc.c b/release/src/router/pptpd/ppphdlc.c new file mode 100644 index 0000000000..2112a3a593 --- /dev/null +++ b/release/src/router/pptpd/ppphdlc.c @@ -0,0 +1,96 @@ +/* + * ppphdlc.c + * + * Copied from C. S. Ananian's linux client ppp_fcs.c + * This code can also be found in RFC1662 + * + * $Id: ppphdlc.c,v 1.1.1.1 2002/06/21 08:52:00 fenix_nl Exp $ + */ + +/* Fast Frame Check Sequence (FCS) Implementation, for HDLC-like framing of + * PPP. Adapted by C. Scott Ananian + * from RFC1662: + * + * C.2. 16-bit FCS Computation Method + * + * The following code provides a table lookup computation for + * calculating the Frame Check Sequence as data arrives at the + * interface. This implementation is based on [7], [8], and [9]. + * + * [7] Perez, "Byte-wise CRC Calculations", IEEE Micro, June 1983. + * + * [8] Morse, G., "Calculating CRC's by Bits and Bytes", Byte, + * September 1986. + * + * [9] LeVan, J., "A Fast CRC", Byte, November 1987. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "ppphdlc.h" + +/* + * FCS lookup table as calculated by the table generator. + */ +u_int16_t fcstab[256] = +{ + 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, + 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, + 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, + 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, + 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, + 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, + 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, + 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, + 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, + 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, + 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, + 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, + 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, + 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, + 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, + 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, + 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, + 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, + 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, + 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, + 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, + 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, + 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, + 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, + 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, + 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, + 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, + 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, + 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, + 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, + 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, + 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 +}; + +#ifndef PPPINITFCS16 +#define PPPINITFCS16 0xffff /* Initial FCS value */ +#endif +#ifndef PPPGOODFCS16 +#define PPPGOODFCS16 0xf0b8 /* Good final FCS value */ +#endif + +#if 0 +/* + * Calculate a new fcs given the current fcs and the new data. + * + * "#if 0" since the checksumming is now done 'on the fly' + */ +u_int16_t pppfcs16(u_int16_t fcs, void *_cp, int len) +{ + register unsigned char *cp = (unsigned char *) _cp; + + while (len--) + fcs = (fcs >> 8) ^ fcstab[(fcs ^ *cp++) & 0xff]; + + return (fcs); +} +#endif diff --git a/release/src/router/pptpd/ppphdlc.h b/release/src/router/pptpd/ppphdlc.h new file mode 100644 index 0000000000..a125d25a31 --- /dev/null +++ b/release/src/router/pptpd/ppphdlc.h @@ -0,0 +1,17 @@ +/* + * ppphdlc.h + * + * Copied from C. S. Ananians ppp_fcs.h + * + * $Id: ppphdlc.h,v 1.1.1.1 2002/06/21 08:52:00 fenix_nl Exp $ + */ + +#ifndef _PPTPD_PPPHDLC_H +#define _PPTPD_PPPHDLC_H + +#define PPPINITFCS16 0xffff /* Initial FCS value */ +#define PPPGOODFCS16 0xf0b8 /* Good final FCS value */ + +extern u_int16_t fcstab[256]; + +#endif /* !_PPTPD_PPPHDLC_H */ diff --git a/release/src/router/pptpd/pptpctrl.8 b/release/src/router/pptpd/pptpctrl.8 new file mode 100644 index 0000000000..709b4906bd --- /dev/null +++ b/release/src/router/pptpd/pptpctrl.8 @@ -0,0 +1,134 @@ +.TH PPTPCTRL 8 "28 April 2004" +.SH NAME +pptpctrl - PPTP control connection manager +.SH SYNOPSIS +.B pptpctrl +.IR pptp-debug-flag +.IR no-ipparam-flag +.IR ppp-options-value +.IR ppp-speed-value +.IR ppp-local-ip-value +.IR ppp-remote-ip-value +.RB [ +.IR pptp-call-id +] +.RB [ +.IR ppp-binary +] +.RB [ +.IR pptp-logwtmp +] +.SH DESCRIPTION +.B pptpctrl +is usually run by +.BR pptpd (8), +but can also be run from +.BR inetd (8) +if some of the features of +.BR pptpd (8), +such as IP pool management, and inbuilt TCP wrappers, are not required. +.SH OPTIONS +.B pptpctrl +options are unconventional, as they are designed for use by +.BR pptpd (8) +rather than users. The option order is critical. Flag options +consist of a 0 or 1, and must be present. Value options consist of a +0, or a 1 followed by the value. Either the 0 or both the 1 and the +value must be present. The remaining options are optional, but must +be present in the defined order. The options are as follows: +.TP +pptp-debug-flag +if set (1), enables debug messages to syslog from pptpctrl. This has no +effect on the setting of the PPP debug option. +.TP +no-ipparam-flag +if set, +.B pptpctrl +will not pass the client's IP address to +.BR pppd (8) +using the +.IR ipparam +option. See the +.IR noipparam +option in +.BR pptpd.conf (5). +.TP +ppp-options-value +file to use for PPP options. See the +.IR file +option in +.BR pppd (8). +.TP +ppp-speed-value +value for the +.IR speed +option given to +.BR pppd (8). +Note that on Linux, this parameter is ineffective. +.TP +ppp-local-ip-value +if set, specifies the IP address that +.BR pppd (8) +is to use for the network interface on the server. If not set, +.BR pppd (8) +will determine it based on options; usually it will be the ethernet address of the server. +.TP +ppp-remote-ip-value +if set, specifies the IP address that +.BR pppd (8) +is to use for the network interface on the client. If not set, +.BR pppd (8) +will determine it based on options; usually it will be the ethernet address of the client, or an address given in +.IR chap-secrets. +Must be set if +.IR ppp-local-ip-value +is set. +.TP +pptp-call-id +if present, specifies the call identification for the PPTP session. If omitted, the call identification is zero. Normally the ID is allocated by +.BR pptpd (8) +and passed to pptpctrl. +.TP +ppp-binary +if present, path to the PPP binary to use. If omitted, the default +value is used. +.TP +pptp-logwtmp +if present, specifies whether +.BR wtmp (5) +should be updated as users connect and disconnect. +.SH FILES +none. +.SH AUTHORS +Poptop is written by Matthew Ramsay , David Luyer +, Kevin Thayer , Peter Galbavy + and others. Development has been moved to +SourceForge and worked on by Richard de Vroede +since June 26, 2002. +.SH COPYRIGHT +Copyright \(co 1999 Matthew Ramsay and others. +.LP +Poptop is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. +.LP +Poptop is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. +.LP +You should have received a copy of the GNU General Public License along +with Poptop; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.SH AVAILABILITY +The most recent version of Poptop is available for download from +SourceForge at +.IR http://sourceforge.net/projects/poptop . +.SH "SEE ALSO" +.BR inetd (8), +.BR inetd.conf (5), +.BR pppd (8), +.BR pptpd (8), +.BR pptpd.conf (5), +.BR tcpd (8). diff --git a/release/src/router/pptpd/pptpctrl.c b/release/src/router/pptpd/pptpctrl.c new file mode 100644 index 0000000000..b4e52dc100 --- /dev/null +++ b/release/src/router/pptpd/pptpctrl.c @@ -0,0 +1,793 @@ +/* + * pptpctrl.c + * + * PPTP control connection between PAC-PNS pair + * + * $Id: pptpctrl.c,v 1.20 2006/12/08 00:01:40 quozl Exp $ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef __linux__ +#define _GNU_SOURCE 1 /* kill() prototype, broken arpa/inet.h */ +#endif + +#include "our_syslog.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_OPENPTY +#ifdef HAVE_PTY_H +#include +#include +#endif +#ifdef HAVE_LIBUTIL_H +#include +#endif +#endif + +#ifdef __UCLIBC__ +#define socklen_t int +#endif + +#include "compat.h" +#include "pptpctrl.h" +#include "pptpgre.h" +#include "pptpdefs.h" +#include "ctrlpacket.h" +#include "defaults.h" +// placing net/if.h here fixes build on Solaris +#include + +static char *ppp_binary = PPP_BINARY; +static int pptp_logwtmp; +static int noipparam; /* if true, don't send ipparam to ppp */ +static char speed[32]; +static char pppdxfig[256]; +static pid_t pppfork; /* so we can kill it after disconnect */ + +/* + * Global to handle dying + * + * I'd be nice if someone could figure out a way to do it + * without the global, but i don't think you can.. -tmk + */ +#define clientSocket 0 /* in case it changes back to a variable */ +static u_int32_t call_id_pair; /* call id (to terminate call) */ + +/* Needed by this and ctrlpacket.c */ +int pptpctrl_debug = 0; /* specifies if debugging is on or off */ +uint16_t unique_call_id = 0xFFFF; /* Start value for our call IDs on this TCP link */ + +int gargc; /* Command line argument count */ +char **gargv; /* Command line argument vector */ + +/* Local function prototypes */ +static void bail(int sigraised); +static void pptp_handle_ctrl_connection(char **pppaddrs, struct in_addr *inetaddrs); + +static int startCall(char **pppaddrs, struct in_addr *inetaddrs); +static void launch_pppd(char **pppaddrs, struct in_addr *inetaddrs); + +/* Oh the horror.. lets hope this covers all the ones we have to handle */ +#if defined(O_NONBLOCK) && !defined(__sun__) && !defined(__sun) +#define OUR_NB_MODE O_NONBLOCK +#else +#define OUR_NB_MODE O_NDELAY +#endif + +/* read a command line argument, a flag alone */ +#define GETARG_INT(X) \ + X = atoi(argv[arg++]) + +/* read a command line argument, a string alone */ +#define GETARG_STRING(X) \ + X = strdup(argv[arg++]) + +/* read a command line argument, a presence flag followed by string */ +#define GETARG_VALUE(X) \ + if(atoi(argv[arg++]) != 0) \ + strlcpy(X, argv[arg++], sizeof(X)); \ + else \ + *X = '\0' + +int main(int argc, char **argv) +{ + char pppLocal[16]; /* local IP to pass to pppd */ + char pppRemote[16]; /* remote IP address to pass to pppd */ + struct sockaddr_in addr; /* client address */ + socklen_t addrlen; + int arg = 1; + int flags; + struct in_addr inetaddrs[2]; + char *pppaddrs[2] = { pppLocal, pppRemote }; + + gargc = argc; + gargv = argv; + + /* fail if argument count invalid */ + if (argc < 7) { + fprintf(stderr, "pptpctrl: insufficient arguments, see man pptpctrl\n"); + exit(2); + } + + /* open a connection to the syslog daemon */ + openlog("pptpd", LOG_PID, PPTP_FACILITY); + + /* autoreap if supported */ + signal(SIGCHLD, SIG_IGN); + + /* note: update pptpctrl.8 if the argument list format is changed */ + GETARG_INT(pptpctrl_debug); + GETARG_INT(noipparam); + GETARG_VALUE(pppdxfig); + GETARG_VALUE(speed); + GETARG_VALUE(pppLocal); + GETARG_VALUE(pppRemote); + if (arg < argc) GETARG_INT(unique_call_id); + if (arg < argc) GETARG_STRING(ppp_binary); + if (arg < argc) GETARG_INT(pptp_logwtmp); + + if (pptpctrl_debug) { + if (*pppLocal) + syslog(LOG_DEBUG, "CTRL: local address = %s", pppLocal); + if (*pppRemote) + syslog(LOG_DEBUG, "CTRL: remote address = %s", pppRemote); + if (*speed) + syslog(LOG_DEBUG, "CTRL: pppd speed = %s", speed); + if (*pppdxfig) + syslog(LOG_DEBUG, "CTRL: pppd options file = %s", pppdxfig); + } + + addrlen = sizeof(addr); + if (getsockname(clientSocket, (struct sockaddr *) &addr, &addrlen) != 0) { + syslog(LOG_ERR, "CTRL: getsockname() failed"); + syslog_perror("getsockname"); + close(clientSocket); + bail(0); /* NORETURN */ + } + inetaddrs[0] = addr.sin_addr; + + addrlen = sizeof(addr); + if (getpeername(clientSocket, (struct sockaddr *) &addr, &addrlen) != 0) { + syslog(LOG_ERR, "CTRL: getpeername() failed"); + syslog_perror("getpeername"); + close(clientSocket); + bail(0); /* NORETURN */ + } + inetaddrs[1] = addr.sin_addr; + + /* Set non-blocking */ + if ((flags = fcntl(clientSocket, F_GETFL, arg /* ignored */)) == -1 || + fcntl(clientSocket, F_SETFL, flags|OUR_NB_MODE) == -1) { + syslog(LOG_ERR, "CTRL: Failed to set client socket non-blocking"); + syslog_perror("fcntl"); + close(clientSocket); + bail(0); /* NORETURN */ + } + + + /* Fiddle with argv */ + my_setproctitle(gargc, gargv, "pptpd [%s]%20c", + inet_ntoa(addr.sin_addr), ' '); + + /* be ready for a grisly death */ + sigpipe_create(); + sigpipe_assign(SIGTERM); + NOTE_VALUE(PAC, call_id_pair, htons(-1)); + NOTE_VALUE(PNS, call_id_pair, htons(-1)); + + syslog(LOG_INFO, "CTRL: Client %s control connection started", inet_ntoa(addr.sin_addr)); + pptp_handle_ctrl_connection(pppaddrs, inetaddrs); + syslog(LOG_DEBUG, "CTRL: Reaping child PPP[%i]", pppfork); + if (pppfork > 0) + waitpid(pppfork, NULL, 0); + syslog(LOG_INFO, "CTRL: Client %s control connection finished", inet_ntoa(addr.sin_addr)); + + bail(0); /* NORETURN */ + return 1; /* make gcc happy */ +} + + +/* + * Local functions only below + */ + +/* + * pptp_handle_ctrl_connection + * + * 1. read a packet (should be start_ctrl_conn_rqst) + * 2. reply to packet (send a start_ctrl_conn_rply) + * 3. proceed with GRE and CTRL connections + * + * args: pppaddrs - ppp local and remote addresses (strings) + * inetaddrs - local and client socket address + * retn: 0 success, -1 failure + */ +static void pptp_handle_ctrl_connection(char **pppaddrs, struct in_addr *inetaddrs) +{ + + /* For echo requests used to check link is alive */ + int echo_wait = FALSE; /* Waiting for echo? */ + u_int32_t echo_count = 0; /* Sequence # of echo */ + time_t echo_time = 0; /* Time last echo req sent */ + struct timeval idleTime; /* How long to select() */ + + /* General local variables */ + ssize_t rply_size; /* Reply packet size */ + fd_set fds; /* For select() */ + int maxfd = clientSocket; /* For select() */ + int send_packet; /* Send a packet this time? */ +#if BSDUSER_PPP || SLIRP +/* not needed by stuff which uses socketpair() in startCall() */ +#define init 1 +#else + int init = 0; /* Has pppd initialized the pty? */ +#endif + int pty_fd = -1; /* File descriptor of pty */ + int gre_fd = -1; /* Network file descriptor */ + int sig_fd = sigpipe_fd(); /* Signal pipe descriptor */ + + unsigned char packet[PPTP_MAX_CTRL_PCKT_SIZE]; + unsigned char rply_packet[PPTP_MAX_CTRL_PCKT_SIZE]; + + for (;;) { + + FD_ZERO(&fds); + FD_SET(sig_fd, &fds); + FD_SET(clientSocket, &fds); + if (pty_fd != -1) + FD_SET(pty_fd, &fds); + if (gre_fd != -1 && init) + FD_SET(gre_fd, &fds); + + /* set timeout */ + if (encaps_gre(-1, NULL, 0) || decaps_hdlc(-1, NULL, 0)) { + idleTime.tv_sec = 0; + idleTime.tv_usec = 50000; /* don't ack immediately */ + } else { + idleTime.tv_sec = IDLE_WAIT; + idleTime.tv_usec = 0; + } + + /* default: do nothing */ + send_packet = FALSE; + + switch (select(maxfd + 1, &fds, NULL, NULL, &idleTime)) { + case -1: /* Error with select() */ + if (errno != EINTR) + syslog(LOG_ERR, "CTRL: Error with select(), quitting"); + goto leave_clear_call; + + case 0: + if (decaps_hdlc(-1, NULL, 0)) { + if(decaps_hdlc(-1, encaps_gre, gre_fd)) + syslog(LOG_ERR, "CTRL: GRE re-xmit failed"); + } else if (encaps_gre(-1, NULL, 0)) + /* Pending ack and nothing else to do */ + encaps_gre(gre_fd, NULL, 0); /* send ack with no payload */ + else if (echo_wait != TRUE) { + /* Timeout. Start idle link detection. */ + echo_count++; + if (pptpctrl_debug) + syslog(LOG_DEBUG, "CTRL: Sending ECHO REQ id %d", echo_count); + time(&echo_time); + make_echo_req_packet(rply_packet, &rply_size, echo_count); + echo_wait = TRUE; + send_packet = TRUE; + } + break; + + default: + break; + } + + /* check for pending SIGTERM delivery */ + if (FD_ISSET(sig_fd, &fds)) { + if (sigpipe_read() == SIGTERM) + bail(SIGTERM); + } + + /* detect startup of pppd */ +#ifndef init + if (!init && pty_fd != -1 && FD_ISSET(pty_fd, &fds)) + init = 1; +#endif + + /* handle actual packets */ + + /* send from pty off via GRE */ + if (pty_fd != -1 && FD_ISSET(pty_fd, &fds) && decaps_hdlc(pty_fd, encaps_gre, gre_fd) < 0) { + syslog(LOG_ERR, "CTRL: PTY read or GRE write failed (pty,gre)=(%d,%d)", pty_fd, gre_fd); + break; + } + /* send from GRE off to pty */ + if (gre_fd != -1 && FD_ISSET(gre_fd, &fds) && decaps_gre(gre_fd, encaps_hdlc, pty_fd) < 0) { + if (gre_fd == 6 && pty_fd == 5) { + syslog(LOG_ERR, "CTRL: GRE-tunnel has collapsed (GRE read or PTY write failed (gre,pty)=(%d,%d))", gre_fd, pty_fd); + } else { + syslog(LOG_ERR, "CTRL: GRE read or PTY write failed (gre,pty)=(%d,%d)", gre_fd, pty_fd); + } + break; + } + /* handle control messages */ + + if (FD_ISSET(clientSocket, &fds)) { + send_packet = TRUE; + switch (read_pptp_packet(clientSocket, packet, rply_packet, &rply_size)) { + case 0: + syslog(LOG_ERR, "CTRL: CTRL read failed"); + goto leave_drop_call; + + case -1: + send_packet = FALSE; + break; + + case STOP_CTRL_CONN_RQST: + if (pptpctrl_debug) + syslog(LOG_DEBUG, "CTRL: Received STOP CTRL CONN request (disconnecting)"); + if (gre_fd != -1 || pty_fd != -1) + syslog(LOG_WARNING, "CTRL: Request to close control connection when call is open, closing"); + send_pptp_packet(clientSocket, rply_packet, rply_size); + goto leave_drop_call; + + case CALL_CLR_RQST: + if(pptpctrl_debug) + syslog(LOG_DEBUG, "CTRL: Received CALL CLR request (closing call)"); + if (gre_fd == -1 || pty_fd == -1) + syslog(LOG_WARNING, "CTRL: Request to close call but call not open"); + if (gre_fd != -1) { + FD_CLR(gre_fd, &fds); + close(gre_fd); + gre_fd = -1; + } + if (pty_fd != -1) { + FD_CLR(pty_fd, &fds); + close(pty_fd); + pty_fd = -1; + } + /* violating RFC */ + goto leave_drop_call; + + case OUT_CALL_RQST: + /* for killing off the link later (ugly) */ + NOTE_VALUE(PAC, call_id_pair, ((struct pptp_out_call_rply *) (rply_packet))->call_id); + NOTE_VALUE(PNS, call_id_pair, ((struct pptp_out_call_rply *) (rply_packet))->call_id_peer); + if (gre_fd != -1 || pty_fd != -1) { + syslog(LOG_WARNING, "CTRL: Request to open call when call is already open, closing"); + if (gre_fd != -1) { + FD_CLR(gre_fd, &fds); + close(gre_fd); + gre_fd = -1; + } + if (pty_fd != -1) { + FD_CLR(pty_fd, &fds); + close(pty_fd); + pty_fd = -1; + } + } + /* change process title for accounting and status scripts */ + my_setproctitle(gargc, gargv, + "pptpd [%s:%04X - %04X]", + inet_ntoa(inetaddrs[1]), + ntohs(((struct pptp_out_call_rply *) (rply_packet))->call_id_peer), + ntohs(((struct pptp_out_call_rply *) (rply_packet))->call_id)); + /* start the call, by launching pppd */ + syslog(LOG_INFO, "CTRL: Starting call (launching pppd, opening GRE)"); + pty_fd = startCall(pppaddrs, inetaddrs); + if (pty_fd > maxfd) maxfd = pty_fd; + if ((gre_fd = pptp_gre_init(call_id_pair, pty_fd, inetaddrs)) > maxfd) + maxfd = gre_fd; + break; + + case ECHO_RPLY: + if (echo_wait == TRUE && ((struct pptp_echo_rply *) (packet))->identifier == echo_count) + echo_wait = FALSE; + else + syslog(LOG_WARNING, "CTRL: Unexpected ECHO REPLY packet"); + /* FALLTHRU */ + case SET_LINK_INFO: + send_packet = FALSE; + break; + +#ifdef PNS_MODE + case IN_CALL_RQST: + case IN_CALL_RPLY: + case IN_CALL_CONN: +#endif + + case CALL_DISCONN_NTFY: + case STOP_CTRL_CONN_RPLY: + /* These don't generate replies. Also they come from things we don't send in this section. */ + syslog(LOG_WARNING, "CTRL: Got a reply to a packet we didn't send"); + send_packet = FALSE; + break; + + /* Otherwise, the already-formed reply will do fine, so send it */ + } + } + + /* send reply packet - this may block, but it should be very rare */ + if (send_packet == TRUE && send_pptp_packet(clientSocket, rply_packet, rply_size) < 0) { + syslog(LOG_ERR, "CTRL: Error sending GRE, aborting call"); + goto leave_clear_call; + } + + /* waiting for echo reply and curtime - echo_time > max wait */ + if (echo_wait == TRUE && (time(NULL) - echo_time) > MAX_ECHO_WAIT) { + syslog(LOG_INFO, "CTRL: Session timed out, ending call"); + goto leave_clear_call; + } + } + /* Finished! :-) */ +leave_drop_call: + NOTE_VALUE(PAC, call_id_pair, htons(-1)); + NOTE_VALUE(PNS, call_id_pair, htons(-1)); + close(clientSocket); +leave_clear_call: + /* leave clientSocket and call_id_pair alone for bail() */ + if (gre_fd != -1) + close(gre_fd); + gre_fd = -1; + if (pty_fd != -1) + close(pty_fd); + pty_fd = -1; + return; +#ifdef init +#undef init +#endif +} + + +/* + * This is the custom exit() for this program. + * + * Updated to also be the default SIGTERM handler, and if + * the link is going down for unnatural reasons, we will close it + * right now, it's only been tested for win98, other tests would be nice + * -tmk + */ +static void bail(int sigraised) +{ + if (sigraised) + syslog(LOG_INFO, "CTRL: Exiting on signal %d", sigraised); + + /* send a disconnect to the other end */ + /* ignore any errors */ + if (GET_VALUE(PAC, call_id_pair) != htons(-1)) { + fd_set connSet; /* fd_set for select() */ + struct timeval tv; /* time to wait for reply */ + unsigned char packet[PPTP_MAX_CTRL_PCKT_SIZE]; + unsigned char rply_packet[PPTP_MAX_CTRL_PCKT_SIZE]; + ssize_t rply_size; /* reply packet size */ + int pkt; + int retry = 0; + + if (pptpctrl_debug) + syslog(LOG_DEBUG, "CTRL: Exiting with active call"); + + make_call_admin_shutdown(rply_packet, &rply_size); + if(send_pptp_packet(clientSocket, rply_packet, rply_size) < 0) + goto skip; + + make_stop_ctrl_req(rply_packet, &rply_size); + if(send_pptp_packet(clientSocket, rply_packet, rply_size) < 0) + goto skip; + + FD_ZERO(&connSet); + FD_SET(clientSocket, &connSet); + tv.tv_sec = 5; /* wait 5 secs for a reply then quit */ + tv.tv_usec = 0; + + /* Wait for STOP CTRL CONN RQST or RPLY */ + while (select(clientSocket + 1, &connSet, NULL, NULL, &tv) == 1) { + switch((pkt = read_pptp_packet(clientSocket, packet, rply_packet, &rply_size))) { + case STOP_CTRL_CONN_RQST: + send_pptp_packet(clientSocket, rply_packet, rply_size); + goto skip; + case CALL_CLR_RQST: + syslog(LOG_WARNING, "CTRL: Got call clear request after call manually shutdown - buggy client"); + break; + case STOP_CTRL_CONN_RPLY: + goto skip; + case -1: + syslog(LOG_WARNING, "CTRL: Retryable error in disconnect sequence"); + retry++; + break; + case 0: + syslog(LOG_WARNING, "CTRL: Fatal error reading control message in disconnect sequence"); + goto skip; + default: + syslog(LOG_WARNING, "CTRL: Unexpected control message %d in disconnect sequence", pkt); + retry++; + break; + } + tv.tv_sec = 5; /* wait 5 secs for another reply then quit */ + tv.tv_usec = 0; + if (retry > 100) { + syslog(LOG_WARNING, "CTRL: Too many retries (%d) - giving up", retry); + break; + } + } + + skip: + close(clientSocket); + } + + if (pptpctrl_debug) + syslog(LOG_DEBUG, "CTRL: Exiting now"); +} + +/* + * startCall + * + * Launches PPPD for the call. + * + * args: pppaddrs - local/remote IPs or "" for either/both if none + * retn: pty file descriptor + * + */ +static int startCall(char **pppaddrs, struct in_addr *inetaddrs) +{ + /* PTY/TTY pair for talking to PPPd */ + int pty_fd, tty_fd; + /* register pids of children */ +#if BSDUSER_PPP || SLIRP + int sockfd[2]; + +#ifndef AF_LOCAL +#ifdef AF_UNIX +#define AF_LOCAL AF_UNIX /* Old BSD */ +#else +#define AF_LOCAL AF_FILE /* POSIX */ +#endif +#endif + + /* userspace ppp doesn't need to waste a real pty/tty pair */ + if (socketpair(AF_LOCAL, SOCK_STREAM, 0, sockfd)) { + syslog(LOG_ERR, "CTRL: socketpair() error"); + syslog_perror("socketpair"); + exit(1); + } + tty_fd = sockfd[0]; + pty_fd = sockfd[1]; +#else + /* Finds an open pty/tty pair */ + if (openpty(&pty_fd, &tty_fd, NULL, NULL, NULL) != 0) { + syslog(LOG_ERR, "CTRL: openpty() error"); + syslog_perror("openpty"); + exit(1); + } else { + struct termios tios; + + /* Turn off echo in the slave - to prevent loopback. + pppd will do this, but might not do it before we + try to send data. */ + if (tcgetattr(tty_fd, &tios) < 0) { + syslog(LOG_ERR, "CTRL: tcgetattr() error"); + syslog_perror("tcgetattr"); + exit(1); + } + tios.c_lflag &= ~(ECHO | ECHONL); + if (tcsetattr(tty_fd, TCSAFLUSH, &tios) < 0) { + syslog(LOG_ERR, "CTRL: tcsetattr() error"); + syslog_perror("tcsetattr"); + exit(1); + } + } +#endif + if (pptpctrl_debug) { + syslog(LOG_DEBUG, "CTRL: pty_fd = %d", pty_fd); + syslog(LOG_DEBUG, "CTRL: tty_fd = %d", tty_fd); + } + /* Launch the PPPD */ +#ifndef HAVE_FORK + switch(pppfork=vfork()){ +#else + switch(pppfork=fork()){ +#endif + case -1: /* fork() error */ + syslog(LOG_ERR, "CTRL: Error forking to exec pppd"); + _exit(1); + + case 0: /* child */ + if (dup2(tty_fd, 0) == -1) { + syslog(LOG_ERR, "CTRL: child tty_fd dup2 to stdin, %s", + strerror(errno)); + exit(1); + } + if (dup2(tty_fd, 1) == -1) { + syslog(LOG_ERR, "CTRL: child tty_fd dup2 to stdout, %s", + strerror(errno)); + exit(1); + } +#if 0 + /* This must never be used if !HAVE_SYSLOG since that logs to stderr. + * Trying just never using it to see if it causes anyone else problems. + * It may let people see the pppd errors, which would be good. + */ + dup2(tty_fd, 2); +#endif + if (tty_fd > 1) + close(tty_fd); + if (pty_fd > 1) + close(pty_fd); +/* In case we move clientSocket back off stdin */ +#ifndef clientSocket + if (clientSocket > 1) + close(clientSocket); +#elif clientSocket > 1 + close(clientSocket); +#endif + launch_pppd(pppaddrs, inetaddrs); + syslog(LOG_ERR, "CTRL: PPPD launch failed! (launch_pppd did not fork)"); + _exit(1); + } + + close(tty_fd); + return pty_fd; +} + +/* + * launch_pppd + * + * Launches the PPP daemon. The PPP daemon is responsible for assigning the + * PPTP client its IP address.. These values are assigned via the command + * line. + * + * Add return of connected ppp interface + * + * retn: 0 on success, -1 on failure. + * + */ +static void launch_pppd(char **pppaddrs, struct in_addr *inetaddrs) +{ + char *pppd_argv[14]; + int an = 0; + sigset_t sigs; + + pppd_argv[an++] = ppp_binary; + + if (pptpctrl_debug) { + syslog(LOG_DEBUG, + "CTRL (PPPD Launcher): program binary = %s", + pppd_argv[an - 1]); + } + +#if BSDUSER_PPP + + /* The way that Brian Somers' user-land ppp works is to use the + * system name as a reference for most of the useful options. Hence + * most things can't be defined on the command line. On OpenBSD at + * least the file used for the systems is /etc/ppp/ppp.conf, where + * the pptp stanza should look something like: + + pptp: + set speed sync + enable pap + enable chap + set dns a.a.a.a b.b.b.b + set ndbs x.x.x.x y.y.y.y + accept dns + add 10.0.0/24 + + * To be honest, at the time of writing, I haven't had the thing + * working enough to understand :) I will update this comment and + * make a sample config available when I get there. + */ + + /* options for BSDUSER_PPP + * + * ignores IP addresses, config file option, speed + * fix usage info in pptpd.c and configure script if this changes + * + * IP addresses can be specified in /etc/ppp/ppp.secret per user + */ + pppd_argv[an++] = "-direct"; + pppd_argv[an++] = "pptp"; /* XXX this is the system name */ + /* should be dynamic - PMG */ + +#elif SLIRP + + /* options for SLIRP + * + * ignores IP addresses from config - SLIRP handles this + */ + pppd_argv[an++] = "-P"; + pppd_argv[an++] = "+chap"; + pppd_argv[an++] = "-b"; + + /* If a speed has been specified, use it + * if not, use "smart" default (defaults.h) + */ + if (*speed) { + pppd_argv[an++] = speed; + } else { + pppd_argv[an++] = PPP_SPEED_DEFAULT; + } + + if (*pppdxfig) { + pppd_argv[an++] = "-f"; + pppd_argv[an++] = pppdxfig; + } + + if (pptpctrl_debug) { + syslog(LOG_DEBUG, "CTRL (PPPD Launcher): Connection speed = %s", pppd_argv[an - 1]); + } +#else + + /* options for 'normal' pppd */ + + pppd_argv[an++] = "local"; + + /* If a pppd option file is specified, use it + * if not, pppd will default to /etc/ppp/options + */ + if (*pppdxfig) { + pppd_argv[an++] = "file"; + pppd_argv[an++] = pppdxfig; + } + + /* If a speed has been specified, use it + * if not, use "smart" default (defaults.h) + */ + if (*speed) { + pppd_argv[an++] = speed; + } else { + pppd_argv[an++] = PPP_SPEED_DEFAULT; + } + + if (pptpctrl_debug) { + if (*pppaddrs[0]) + syslog(LOG_DEBUG, "CTRL (PPPD Launcher): local address = %s", pppaddrs[0]); + if (*pppaddrs[1]) + syslog(LOG_DEBUG, "CTRL (PPPD Launcher): remote address = %s", pppaddrs[1]); + } + + if (*pppaddrs[0] || *pppaddrs[1]) { + char pppInterfaceIPs[33]; + sprintf(pppInterfaceIPs, "%s:%s", pppaddrs[0], pppaddrs[1]); + pppd_argv[an++] = pppInterfaceIPs; + } +#endif + + if (!noipparam) { + pppd_argv[an++] = "ipparam"; + pppd_argv[an++] = inet_ntoa(inetaddrs[1]); + } + + if (pptp_logwtmp) { + pppd_argv[an++] = "plugin"; + pppd_argv[an++] = "/usr/lib/pptpd/pptpd-logwtmp.so"; + pppd_argv[an++] = "pptpd-original-ip"; + pppd_argv[an++] = inet_ntoa(inetaddrs[1]); + } + + /* argv arrays must always be NULL terminated */ + pppd_argv[an++] = NULL; + /* make sure SIGCHLD is unblocked, pppd does not expect it */ + sigfillset(&sigs); + sigprocmask(SIG_UNBLOCK, &sigs, NULL); + /* run pppd now */ + execvp(pppd_argv[0], pppd_argv); + /* execvp() failed */ + syslog(LOG_ERR, + "CTRL (PPPD Launcher): Failed to launch PPP daemon. %s", + strerror(errno)); +} + diff --git a/release/src/router/pptpd/pptpd.8 b/release/src/router/pptpd/pptpd.8 new file mode 100644 index 0000000000..d10b1af3d2 --- /dev/null +++ b/release/src/router/pptpd/pptpd.8 @@ -0,0 +1,194 @@ +.TH PPTPD 8 "29 December 2005" +.SH NAME +pptpd - PPTP VPN daemon +.SH SYNOPSIS +.PP +.B pptpd +[ +.IR options +] +.SH DESCRIPTION +.B pptpd +is the Poptop PPTP daemon, which manages tunnelled PPP connections +encapsulated in GRE using the PPTP VPN protocol. It may contain +features like IP address management and TCP wrappers if compiled in. +.SH OPTIONS + +Here we document the command line options. See +.BR pptpd.conf (5) +for configuration directives, IP address allocation, routing, and +firewall rules. + +.TP +\fB-b\fR|\fB--bcrelay \fIinternal-interface +specifies that broadcasts received on the server's internal +network interface should be relayed to the clients. + +.TP +\fB-c\fR|\fB--conf \fIconf-file +specifies the configuration file for +.B pptpd +(default +.IR /etc/pptpd.conf ) + +.TP +.BR -d | --debug +turns on debugging mode, causing more debugging messages to be sent +to syslog. + +.TP +\fB-e\fR|\fB--ppp \fIpppd-program +use +.I pppd-program +in place of the default +.BR pppd (8). + +.TP +.BR -f | --fg +run in the foreground instead of detaching from terminal + +.TP +.BR -h | --help +display program usage. + +.TP +.BR -i | --noipparam +do not send the client's IP address to ip-up scripts (required if you are using the +.BR pppd (8) +.I ipparam +option for some other purpose). + +.TP +\fB-l\fR|\fB--listen \fIx.x.x.x +specifies the local interface IP address to listen on. + +.TP +\fB-o\fR|\fB--option \fIppp-conf-file +specifies that pptpd should specify an alternate configuration file +for the ppp daemon (the default is normally +.I /etc/ppp/options +but may vary depending on your ppp daemon). + +.TP +\fB-p\fR|\fB--pidfile \fIpid-file +specifies an alternate location to store the process ID file (default +.IR /var/run/pptpd.pid ). + +.TP +\fB-s\fR|\fB--speed \fIbaud +specifies that the speed +.I baud +should be passed to the ppp daemon as the tty speed to use (in some +cases this is ignored by the ppp daemon). + +.TP +\fB-t\fR|\fB--stimeout \fIseconds +specifies the number of seconds to wait for the first packet before +dropping the connection. This is a denial of service protection +feature. + +.TP +.BR -w | --logwtmp +update +.BR wtmp (5) +as users connect and disconnect. See +.BR wtmp (1). + +.TP +\fB-C\fR|\fB--connections \fIn +limits the number of client connections that may be accepted. Corresponds to the +.BR connections +option in +.IR pptpd.conf . +If pptpd is allocating IP addresses (e.g. +.BR --delegate +is not used) then the number of connections is also limited by the +.BR remoteip +option in +.IR pptpd.conf . + +.TP +.BR -D | --delegate +delegates the allocation of client IP addresses to +.BR pppd (8). +Without this option, which is the default, pptpd manages the list of +IP addresses for clients and passes the next free address to pppd. +With this option, pptpd does not pass an address, and so pppd may use +radius or chap-secrets to allocate an address. + +.TP +.BR -v | --version +displays the current version of the pptp daemon. + +.SH FILES +/etc/pptpd.conf +.br +/var/run/pptpd.pid + +.SH DEBUGGING +To turn on debugging, add 'debug' to /etc/pptpd.conf and your +PPP options file, and restart pptpd. +.br +.LP +Typically the PPP options file is options.pptpd in /etc/ppp, though on +some distributions it may be pptpd-options. Use your package manager +to find it, e.g. 'rpm -ql pptpd | grep options' or 'dpkg --listfiles +pptpd | grep options'. +.br +.LP +You may need to configure syslogd to catch debug messages. e.g. edit +/etc/syslog.conf and add something similar to the example below, then +restart syslogd. +.br +.LP +# debug logging +.br +*.debug;mail.none /var/log/debug +.br +.LP +This will log all debug information, except mail, to the file +/var/log/debug. Note that this is a lot of information and might +flood your disks. If performance is an issue, you can try turning off +sync during your debugging, by prefixing the destination with '-'. +.br +.LP +# debug logging +.br +*.debug;mail.none -/var/log/debug +.br +.LP +Disable this line and restart syslog after you are done debugging. +See the syslog man pages for more details. +.br +.LP + +.SH AUTHORS +Poptop is written by Matthew Ramsay , David Luyer +, Kevin Thayer , Peter Galbavy + and others. Development has been moved to +SourceForge and worked on by Richard de Vroede +since June 26, 2002. +.SH COPYRIGHT +Copyright \(co 1999 Matthew Ramsay and others. +.LP +Poptop is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. +.LP +Poptop is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. +.LP +You should have received a copy of the GNU General Public License along +with Poptop; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.SH AVAILABILITY +The most recent version of Poptop is available for download from +SourceForge at +.IR http://sourceforge.net/projects/poptop . +.SH "SEE ALSO" +.BR pppd (8), +.BR pptpd (8), +.BR pptpd.conf (5). diff --git a/release/src/router/pptpd/pptpd.c b/release/src/router/pptpd/pptpd.c new file mode 100644 index 0000000000..3913f26667 --- /dev/null +++ b/release/src/router/pptpd/pptpd.c @@ -0,0 +1,867 @@ +/* + * pptpd.c + * + * Grabs any command line argument and processes any further options in + * the pptpd config file, before throwing over to pptpmanager.c. + * + * $Id: pptpd.c,v 1.18 2006/09/04 23:17:25 quozl Exp $ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef __linux__ +#define _GNU_SOURCE 1 /* strdup() prototype, broken arpa/inet.h */ +#endif + +#ifdef __svr4__ +#define __EXTENSIONS__ 1 /* strdup() prototype */ +#endif + +#ifdef __sgi__ +#define _XOPEN_SOURCE 500 /* strdup() prototype */ +#endif + +#include "our_syslog.h" +#include "our_getopt.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "configfile.h" +#include "defaults.h" +#include "compat.h" +#include "pptpmanager.h" + +#ifdef CONFIG_NETtel +#include +#endif + +/* command line arg variables */ +char *ppp_binary = NULL; +char *pppdoptstr = NULL; +char *speedstr = NULL; +char *bindaddr = NULL; +#ifdef BCRELAY +char *bcrelay = NULL; +#endif +int pptp_debug = 0; +int pptp_noipparam = 0; +int pptp_logwtmp = 0; +int pptp_delegate = 0; + +int pptp_stimeout = STIMEOUT_DEFAULT; + +int pptp_connections = CONNECTIONS_DEFAULT; + +/* Local prototypes */ +static void processIPStr(int type, char *ipstr); + +#ifndef HAVE_DAEMON +static void my_daemon(int argc, char **argv); +#endif + +static void log_pid(char *pid_file); +static char *lookup(char *); + +#ifdef BCRELAY +static void launch_bcrelay(); +static void launch_bcrelay_br0(); +static void launch_bcrelay_ppp(); +static pid_t bcrelayfork; +#endif + +static void showusage(char *prog) +{ + printf("\npptpd v%s\n", VERSION); + printf("Usage: pptpd [options], where options are:\n\n"); +#ifdef BCRELAY + printf(" [-b] [--bcrelay if] Use broadcast relay for broadcasts comming from.\n"); + printf(" the specified interface (default is eth1).\n"); +#endif + printf(" [-c] [--conf file] Specifies the config file to read default\n"); + printf(" settings from (default is %s).\n", PPTPD_CONFIG_FILE_DEFAULT); + printf(" [-d] [--debug] Turns on debugging (to syslog).\n"); + printf(" [-e] [--ppp file] Use alternate pppd binary, default %s.\n", PPP_BINARY); + printf(" [-f] [--fg] Run in foreground.\n"); + printf(" [-h] [--help] Displays this help message.\n"); + printf(" [-i] [--noipparam] Suppress the passing of the client's IP address\n"); + printf(" to PPP, which is done by default otherwise.\n"); + printf(" [-l] [--listen x.x.x.x] Specifies IP of local interface to listen to.\n"); +#if !defined(BSDUSER_PPP) + printf(" [-o] [--option file] Specifies the PPP options file to use\n"); + printf(" (default is /etc/ppp/options).\n"); +#endif + printf(" [-p] [--pidfile file] Specifies the file to write the process ID to\n"); + printf(" (default is /var/run/pptpd.pid).\n"); +#if !defined(BSDUSER_PPP) + printf(" [-s] [--speed baud] Specifies the baud speed for the PPP daemon\n"); + printf(" (default is 115200).\n"); +#endif + printf(" [-t] [--stimeout seconds] Specifies the timeout for the first packet. This is a DOS protection\n"); + printf(" (default is 10).\n"); + printf(" [-v] [--version] Displays the pptpd version number.\n"); + printf(" [-w] [--logwtmp] Update wtmp as users login.\n"); + printf(" [-C] [--connections n] Limit on number of connections.\n"); + printf(" [-D] [--delegate] Delegate IP allocation to pppd.\n"); + + printf("\n\nLogs and debugging go to syslog as DAEMON."); + + printf("\n\nCommand line options will override any default settings and any settings\n"); + printf("specified in the config file (default config file: %s).\n\n", PPTPD_CONFIG_FILE_DEFAULT); +} + + +static void showversion() +{ + printf("pptpd v%s\n", VERSION); +} + +int main(int argc, char **argv) +{ + /* command line options */ + int c; + + /* function-local options */ + int foreground = FALSE; + char *pid_file = NULL; + + /* config file */ + char *configFile = NULL; + + /* config file parsing temp strings */ + char tmp[MAX_CONFIG_STRING_SIZE], *tmpstr; + + /* open a connection to the syslog daemon */ + openlog("pptpd", LOG_PID, PPTP_FACILITY); + + /* process command line options */ + while (1) { + int option_index = 0; +#ifdef BCRELAY + char *optstring = "b:c:de:fhil:o:p:s:t:vwC:D"; +#else + char *optstring = "c:de:fhil:o:p:s:t:vwC:D"; +#endif + + static struct option long_options[] = + { +#ifdef BCRELAY + {"bcrelay", 1, 0, 0}, +#endif + {"conf", 1, 0, 0}, + {"debug", 0, 0, 0}, + {"ppp", 1, 0, 0}, + {"fg", 0, 0, 0}, + {"help", 0, 0, 0}, + {"noipparam", 0, 0, 0}, + {"listen", 1, 0, 0}, + {"option", 1, 0, 0}, + {"pidfile", 1, 0, 0}, + {"speed", 1, 0, 0}, + {"stimeout", 1, 0, 0}, + {"version", 0, 0, 0}, + {"logwtmp", 0, 0, 0}, + {"connections", 1, 0, 0}, + {"delegate", 0, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long(argc, argv, optstring, long_options, &option_index); + if (c == -1) + break; + /* convert long options to short form */ + if (c == 0) +#ifdef BCRELAY + c = "bcdefhilopstvwCD"[option_index]; +#else + c = "cdefhilopstvwCD"[option_index]; +#endif + switch (c) { +#ifdef BCRELAY + case 'b': /* --bcrelay */ + if (bcrelay) free(bcrelay); + bcrelay = strdup(optarg); + break; +#endif + + case 'l': /* --listen */ + tmpstr = lookup(optarg); + if (!tmpstr) { + syslog(LOG_ERR, "MGR: Invalid listening address: %s!", optarg); + return 1; + } + if (bindaddr) free(bindaddr); + bindaddr = strdup(tmpstr); + break; + + case 'h': /* --help */ + showusage(argv[0]); + return 0; + + case 'i': /* --noipparam */ + pptp_noipparam = TRUE; + break; + + case 'e': /* --ppp */ + if (ppp_binary) free(ppp_binary); + ppp_binary = strdup(optarg); + break; + + case 'd': /* --debug */ + pptp_debug = TRUE; + break; + + case 'f': /* --fg */ + foreground = TRUE; + break; + + case 'v': /* --version */ + showversion(); + return 0; + + case 'w': /* --logwtmp */ + pptp_logwtmp = TRUE; + break; + + case 'C': /* --connections */ + pptp_connections = atoi(optarg); + break; + + case 'D': /* --delegate */ + pptp_delegate = TRUE; + break; + + case 'o': /* --option */ + if (pppdoptstr) free(pppdoptstr); + pppdoptstr = strdup(optarg); + break; + + case 'p': /* --pidfile */ + if (pid_file) free(pid_file); + pid_file = strdup(optarg); + break; + + case 's': /* --speed */ + if (speedstr) free(speedstr); + speedstr = strdup(optarg); + break; + + case 't': /* --stimeout */ + pptp_stimeout = atoi(optarg); + break; + + case 'c': /* --conf */ + { + FILE *f; + if (!(f = fopen(optarg, "r"))) { + syslog(LOG_ERR, "MGR: Config file not found!"); + return 1; + } + fclose(f); + if(configFile) free(configFile); + configFile = strdup(optarg); + break; + } + + default: + showusage(argv[0]); + return 1; + } + } + + /* Now that we have all the command line args.. lets open the + * conf file and add anything else (remembering not to override + * anything since the command line has more privilages :-) + */ + + if (!configFile) + configFile = strdup(PPTPD_CONFIG_FILE_DEFAULT); + + if (read_config_file(configFile, CONNECTIONS_KEYWORD, tmp) > 0) { + pptp_connections = atoi(tmp); + if (pptp_connections <= 0) + pptp_connections = CONNECTIONS_DEFAULT; + } + + slot_init(pptp_connections); + + if (!pptp_debug && read_config_file(configFile, DEBUG_KEYWORD, tmp) > 0) + pptp_debug = TRUE; + +#ifdef BCRELAY + if (!bcrelay && read_config_file(configFile, BCRELAY_KEYWORD, tmp) > 0) + bcrelay = strdup(tmp); +#endif + + if (!pptp_stimeout && read_config_file(configFile, STIMEOUT_KEYWORD, tmp) > 0) { + pptp_stimeout = atoi(tmp); + if (pptp_stimeout <= 0) + pptp_stimeout = STIMEOUT_DEFAULT; + } + + if (!pptp_noipparam && read_config_file(configFile, NOIPPARAM_KEYWORD, tmp) > 0) { + pptp_noipparam = TRUE; + } + + if (!bindaddr && read_config_file(configFile, LISTEN_KEYWORD, tmp) > 0) { + tmpstr = lookup(tmp); + if(!tmpstr) { + syslog(LOG_ERR, "MGR: Invalid listening address: %s!", tmp); + return 1; + } + bindaddr = strdup(tmpstr); + } + + if (!speedstr && read_config_file(configFile, SPEED_KEYWORD, tmp) > 0) + speedstr = strdup(tmp); + + if (!pppdoptstr && read_config_file(configFile, PPPD_OPTION_KEYWORD, tmp) > 0) { + pppdoptstr = strdup(tmp); + } + + if (!ppp_binary && read_config_file(configFile, PPP_BINARY_KEYWORD, tmp) > 0) { + ppp_binary = strdup(tmp); + } + + if (!pptp_logwtmp && read_config_file(configFile, LOGWTMP_KEYWORD, tmp) > 0) { + pptp_logwtmp = TRUE; + } + + if (!pptp_delegate && read_config_file(configFile, DELEGATE_KEYWORD, tmp) > 0) { + pptp_delegate = TRUE; + } + + if (!pid_file) + pid_file = strdup((read_config_file(configFile, PIDFILE_KEYWORD, + tmp) > 0) ? tmp : PIDFILE_DEFAULT); + + if (!pptp_delegate) { + /* NOTE: remote then local, reason can be seen at the end of processIPStr */ + + /* grab the remoteip string from the config file */ + if (read_config_file(configFile, REMOTEIP_KEYWORD, tmp) <= 0) { + /* use "smart" defaults */ + strlcpy(tmp, DEFAULT_REMOTE_IP_LIST, sizeof(tmp)); + } + processIPStr(REMOTE, tmp); + + /* grab the localip string from the config file */ + if (read_config_file(configFile, LOCALIP_KEYWORD, tmp) <= 0) { + /* use "smart" defaults */ + strlcpy(tmp, DEFAULT_LOCAL_IP_LIST, sizeof(tmp)); + } + processIPStr(LOCAL, tmp); + } + + free(configFile); + + /* if not yet set, adopt default PPP binary path */ + if (!ppp_binary) ppp_binary = strdup(PPP_BINARY); + /* check that the PPP binary is executable */ + if (access(ppp_binary, X_OK) < 0) { + syslog(LOG_ERR, "MGR: PPP binary %s not executable", + ppp_binary); + return 1; + } + /* check that the PPP options file is readable */ + if (pppdoptstr && access(pppdoptstr, R_OK) < 0) { + syslog(LOG_ERR, "MGR: PPP options file %s not readable", + pppdoptstr); + return 1; + } +#ifdef BCRELAY + /* check that the bcrelay binary is executable */ + if (bcrelay && access(BCRELAY_BIN, X_OK) < 0) { + syslog(LOG_ERR, "MGR: bcrelay binary %s not executable", + BCRELAY_BIN); + return 1; + } +#endif + + if (!foreground) { +#if HAVE_DAEMON + closelog(); + freopen("/dev/null", "r", stdin); + daemon(0, 0); + /* returns to child only */ + /* pid will have changed */ + openlog("pptpd", LOG_PID, PPTP_FACILITY); +#else /* !HAVE_DAEMON */ + my_daemon(argc, argv); + /* returns to child if !HAVE_FORK + * never returns if HAVE_FORK (re-execs with -f) + */ +#endif + } + +#ifdef BCRELAY + //Yau modified for dual way broadcast + if (strstr(bcrelay, "br0")) { + syslog(LOG_DEBUG, "CTRL: BCrelay incoming interface is %s", bcrelay); + /* Launch BCrelay */ +#ifndef HAVE_FORK + switch(bcrelayfork = vfork()){ +#else + switch(bcrelayfork = fork()){ +#endif + case -1: /* fork() error */ + syslog(LOG_ERR, "CTRL: Error forking to exec bcrelay"); + _exit(1); + + case 0: /* child */ + syslog(LOG_DEBUG, "CTRL (BCrelay Launcher): Launching BCrelay with pid %i", bcrelayfork); + launch_bcrelay_br0(); + syslog(LOG_ERR, "CTRL (BCrelay Launcher): Failed to launch BCrelay."); + _exit(1); + } + } + if (strstr(bcrelay, "ppp")) { + syslog(LOG_DEBUG, "CTRL: BCrelay incoming interface is %s", bcrelay); + /* Launch BCrelay */ +#ifndef HAVE_FORK + switch(bcrelayfork = vfork()){ +#else + switch(bcrelayfork = fork()){ +#endif + case -1: /* fork() error */ + syslog(LOG_ERR, "CTRL: Error forking to exec bcrelay"); + _exit(1); + + case 0: /* child */ + syslog(LOG_DEBUG, "CTRL (BCrelay Launcher): Launching BCrelay with pid %i", bcrelayfork); + launch_bcrelay_ppp(); + syslog(LOG_ERR, "CTRL (BCrelay Launcher): Failed to launch BCrelay."); + _exit(1); + } + } /* End bcrelay */ +#endif + +#ifdef CONFIG_NETtel + /* turn the NETtel VPN LED on */ + ledman_cmd(LEDMAN_CMD_ON, LEDMAN_VPN); +#endif + /* after we have our final pid... */ + log_pid(pid_file); + + /* manage connections until SIGTERM */ + pptp_manager(argc, argv); + +#ifdef BCRELAY + if (bcrelayfork > 0) { + syslog(LOG_DEBUG, "CTRL: Closing child BCrelay with pid %i", bcrelayfork); + kill(bcrelayfork, SIGTERM); + } +#endif + + slot_free(); + return 0; +} + +static void log_pid(char *pid_file) { + FILE *f; + pid_t pid; + + pid = getpid(); + if ((f = fopen(pid_file, "w")) == NULL) { + syslog(LOG_ERR, "PPTPD: failed to open(%s), errno=%d\n", + pid_file, errno); + return; + } + fprintf(f, "%d\n", pid); + fclose(f); +} + +#ifndef HAVE_DAEMON +static void my_daemon(int argc, char **argv) +{ +#ifndef HAVE_FORK + /* need to use vfork - eg, uClinux */ + char **new_argv; + int pid; + extern char **environ; + int fdr; + + new_argv = malloc((argc + 2) * sizeof(char **)); + fdr = open("/dev/null", O_RDONLY); + syslog(LOG_INFO, "MGR: Option parse OK, re-execing as daemon"); + fflush(stderr); + if ((pid = vfork()) == 0) { + if (fdr != 0) { dup2(fdr, 0); close(fdr); } + SETSIDPGRP(); + chdir("/"); + umask(0); + memcpy(new_argv + 1, argv, (argc + 1) * sizeof(char **)); + new_argv[0] = PPTPD_BIN; + new_argv[1] = "-f"; + execve(PPTPD_BIN, new_argv, environ); + _exit(1); + } else if (pid > 0) { + exit(0); + } else { + syslog_perror("vfork"); + exit(1); + } +#else + int pid; + + closelog(); + if ((pid = fork()) < 0) { + syslog_perror("fork"); + exit(1); + } else if (pid) + exit(0); + freopen("/dev/null", "r", stdin); + SETSIDPGRP(); + chdir("/"); + umask(0); + /* pid will have changed */ + openlog("pptpd", LOG_PID, PPTP_FACILITY); +#endif +} +#endif + +/* added for hostname/address lookup -tmk + * returns NULL if not a valid hostname + */ +static char *lookup(char *hostname) +{ + struct hostent *ent; + struct in_addr hst_addr; + + /* Try to parse IP directly */ + if (inet_addr(hostname) != -1) + return hostname; + + /* Else lookup hostname, return NULL if it fails */ + if ((ent = gethostbyname(hostname)) == NULL) + return NULL; + + /* That worked, print it back as a dotted quad. */ + memcpy(&hst_addr.s_addr, ent->h_addr, ent->h_length); + return inet_ntoa(hst_addr); +} + +#define DEBUG_IP_PARSER 1 + +/* Return the address or NULL if not valid */ +static char *validip(char *hostname) +{ + /* Try to parse IP directly */ + if (inet_addr(hostname) != -1) + return hostname; + else + return NULL; +} + +/* Check if it's a valid IP range */ +static int isIpRange(char *str) +{ + int dashes = 0; + int dots = 0; + +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Checking if %s is a valid IP range", str); +#endif + do { + if (*str == '-') + dashes++; + else if (*str == '.') + dots++; + else if (!strchr("0123456789", *str)) { +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Not an IP range: character %c is not valid", *str); +#endif + return 0; + } + } while (*++str); +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Dashes = %d (wanted: 1), Dots = %d (wanted: 4)", dashes, dots); +#endif + return (dashes == 1 && dots == 3); +} + +/* process a type 0 (LOCAL) or type 1 (REMOTE) IP string */ +static void processIPStr(int type, char *ipstr) +{ + int pos; + + char *tmpstr; + /* char tmpstr2[20]; xxx.xxx.xxx.xxx-xxx (largest we can get) */ + char tmpstr2[128]; /* allow hostnames */ + char *tmpstr3; + char tmpstr5[16]; + char *tmpstr6; + char *tmpstr7; + int num; + + char ipa[8]; /* xxx-xxx (largest we can get) */ + char ipb[8]; + char ipc[8]; + char ipd[8]; + + char ip_pre[13]; /* xxx.xxx.xxx. (largest we can get) */ + char ip_post[13]; + + char ipl[4]; + char ipu[4]; + + int bail = FALSE; /* so we know when to stop formatting the ip line */ + + int lower, upper, n; + + num = 0; + + while (!bail) { + if ((tmpstr = strchr(ipstr, ',')) == NULL) { + /* last (or only) entry reached */ + strlcpy(tmpstr2, ipstr, sizeof(tmpstr2)); + bail = TRUE; + } else { + pos = tmpstr - ipstr; + ipstr[pos] = '\0'; + strlcpy(tmpstr2, ipstr, sizeof(tmpstr2)); + ipstr = tmpstr + 1; + } + +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Parsing segment: %s", tmpstr2); +#endif + + if (!isIpRange(tmpstr2)) { + /* We got a normal IP + * Check if the IP address is valid, use it if so + */ + if ((tmpstr7 = lookup(tmpstr2)) == NULL) { + syslog(LOG_ERR, "MGR: Bad IP address (%s) in config file!", tmpstr2); + exit(1); + } + if (num == pptp_connections) { + syslog(LOG_WARNING, "MGR: connections limit (%d) reached, extra IP addresses ignored", pptp_connections); + return; + } +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Setting IP %d = %s", num, tmpstr7); +#endif + if (type == LOCAL) + slot_set_local(num, tmpstr7); + else + slot_set_remote(num, tmpstr7); + num++; + } else { + /* Got a range; + * eg. 192.168.0.234-238 + * or (thanx Kev! :-).. i thought i was finished :-) + * 192.168-178.1.231 + */ + + /* lose the "."'s */ + while ((tmpstr3 = strchr(tmpstr2, '.')) != NULL) { + pos = tmpstr3 - tmpstr2; + tmpstr2[pos] = ' '; + } + + if ((tmpstr3 = strchr(tmpstr2, '-')) == NULL || + strchr(tmpstr3 + 1, '-') != NULL) { + syslog(LOG_ERR, "MGR: Confused in IP parse routines (multiple hyphens)"); + continue; + } + /* should be left with "192 168 0 234-238" + * or 192 168-178 1 231 + */ + + sscanf(tmpstr2, "%7s %7s %7s %7s", ipa, ipb, ipc, ipd); + + if ((tmpstr6 = strchr(ipd, '-')) != NULL) { + pos = tmpstr6 - ipd; + ipd[pos] = ' '; + sscanf(ipd, "%3s %3s", ipl, ipu); +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: (lower upper) = (%s %s)", ipl, ipu); +#endif + lower = atoi(ipl); + upper = atoi(ipu); +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Range = %d to %d on 4th segment", lower, upper); +#endif + sprintf(ip_pre, "%.3s.%.3s.%.3s.", ipa, ipb, ipc); + ip_post[0] = '\0'; +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Pre = %s Post = %s", ip_pre, ip_post); +#endif + } else if ((tmpstr6 = strchr(ipc, '-')) != NULL) { + pos = tmpstr6 - ipc; + ipc[pos] = ' '; + sscanf(ipc, "%3s %3s", ipl, ipu); +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: (lower upper) = (%s %s)", ipl, ipu); +#endif + lower = atoi(ipl); + upper = atoi(ipu); +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Range = %d to %d on 3rd segment", lower, upper); +#endif + sprintf(ip_pre, "%.3s.%.3s.", ipa, ipb); + sprintf(ip_post, ".%.3s", ipd); +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Pre = %s Post = %s", ip_pre, ip_post); +#endif + } else if ((tmpstr6 = strchr(ipb, '-')) != NULL) { + pos = tmpstr6 - ipb; + ipb[pos] = ' '; + sscanf(ipb, "%3s %3s", ipl, ipu); +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: (lower upper) = (%s %s)", ipl, ipu); +#endif + lower = atoi(ipl); + upper = atoi(ipu); +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Range = %d to %d on 2nd segment", lower, upper); +#endif + sprintf(ip_pre, "%.3s.", ipa); + sprintf(ip_post, ".%.3s.%.3s", ipc, ipd); +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Pre = %s Post = %s", ip_pre, ip_post); +#endif + } else if ((tmpstr6 = strchr(ipa, '-')) != NULL) { + pos = tmpstr6 - ipa; + ipa[pos] = ' '; + sscanf(ipa, "%3s %3s", ipl, ipu); +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: (lower upper) = (%s %s)", ipl, ipu); +#endif + lower = atoi(ipl); + upper = atoi(ipu); +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Range = %d to %d on 1st segment", lower, upper); +#endif + ip_pre[0] = '\0'; + sprintf(ip_post, ".%.3s.%.3s.%.3s", ipb, ipc, ipd); +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Pre = %s Post = %s", ip_pre, ip_post); +#endif + } else { + syslog(LOG_ERR, "MGR: Confused in IP parse routines (lost hyphen)"); + continue; + } + + for (n = lower; n <= upper; n++) { + sprintf(tmpstr5, "%s%d%s", ip_pre, n, ip_post); + /* Check if the ip address is valid */ + if ((tmpstr7 = validip(tmpstr5)) == NULL) { + syslog(LOG_ERR, "MGR: Bad IP address (%s) in config file!", tmpstr5); + exit(1); + } + if (num == pptp_connections) { + syslog(LOG_WARNING, "MGR: connections limit (%d) reached, extra IP addresses ignored", pptp_connections); + return; + } +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Setting IP %d = %s", num, tmpstr7); +#endif + if (type == LOCAL) + slot_set_local(num, tmpstr7); + else + slot_set_remote(num, tmpstr7); + num++; + } + } + } + if (num == 1 && type == LOCAL && pptp_connections > 1) { +#if DEBUG_IP_PARSER + syslog(LOG_DEBUG, "MGR: Setting all %d local IPs to %s", pptp_connections, slot_get_local(0)); +#endif + for (n = 1; n < pptp_connections; n++) + slot_set_local(n, slot_get_local(0)); + } else if (pptp_connections > num) { + syslog(LOG_INFO, "MGR: Maximum of %d connections reduced to %d, not enough IP addresses given", + pptp_connections, num); + pptp_connections = num; + } +} + +#ifdef BCRELAY +/* launch_bcrelay + * Launches broadcast relay. Broadcast relay is responsible for relaying broadcasts to the clients + * retn: 0 on success, -1 on failure. + */ +static void launch_bcrelay() { + char *bcrelay_argv[8]; + int an = 0; + + if (strstr(bcrelay, "br0")) { + syslog(LOG_DEBUG, "MGR: BCrelay incoming interface is %s", bcrelay); + syslog(LOG_DEBUG, "MGR: BCrelay outgoing interface is regexp ppp[4-9].*"); + + bcrelay_argv[an++] = BCRELAY_BIN; + bcrelay_argv[an++] = "-i"; + bcrelay_argv[an++] = bcrelay; + bcrelay_argv[an++] = "-o"; + bcrelay_argv[an++] = "ppp[4-9].*"; + if (!pptp_debug) { + bcrelay_argv[an++] = "-n"; + } + bcrelay_argv[an++] = NULL; + + execvp(bcrelay_argv[0], bcrelay_argv); + } +} + +//Yau add +static void launch_bcrelay_br0() { + char *bcrelay_argv[8]; + int an = 0; + + if (strstr(bcrelay, "br0")) { + syslog(LOG_DEBUG, "MGR: BCrelay incoming interface is br0"); + syslog(LOG_DEBUG, "MGR: BCrelay outgoing interface is regexp ppp[4-9].*"); + + bcrelay_argv[an++] = BCRELAY_BIN; + bcrelay_argv[an++] = "-i"; + bcrelay_argv[an++] = "br0"; + bcrelay_argv[an++] = "-o"; + bcrelay_argv[an++] = "ppp[4-9].*"; + if (!pptp_debug) { + bcrelay_argv[an++] = "-n"; + } + bcrelay_argv[an++] = NULL; + + execvp(bcrelay_argv[0], bcrelay_argv); + } +} + +static void launch_bcrelay_ppp() { + char *bcrelay_argv[8]; + int an = 0; + + if (strstr(bcrelay, "ppp")) { + syslog(LOG_DEBUG, "MGR: BCrelay incoming interface is regexp ppp[4-9].*"); + syslog(LOG_DEBUG, "MGR: BCrelay outgoing interface is br0"); + + bcrelay_argv[an++] = BCRELAY_BIN; + bcrelay_argv[an++] = "-i"; + bcrelay_argv[an++] = "ppp[4-9].*"; + bcrelay_argv[an++] = "-o"; + bcrelay_argv[an++] = "br0"; + if (!pptp_debug) { + bcrelay_argv[an++] = "-n"; + } + bcrelay_argv[an++] = NULL; + + execvp(bcrelay_argv[0], bcrelay_argv); + } + +} +#endif diff --git a/release/src/router/pptpd/pptpd.conf.5 b/release/src/router/pptpd/pptpd.conf.5 new file mode 100644 index 0000000000..06181a6be0 --- /dev/null +++ b/release/src/router/pptpd/pptpd.conf.5 @@ -0,0 +1,238 @@ +.TH PPTPD.CONF 5 "29 December 2005" +.SH NAME +.B pptpd.conf +- PPTP VPN daemon configuration +.SH DESCRIPTION +.BR pptpd (8) +reads options from this file, usually +.IR /etc/pptpd.conf . +Most options can be overridden by the command line. The local and +remote IP addresses for clients must come from the configuration file +or from +.BR pppd (8) +configuration files. +.SH OPTIONS +.TP +.BI "option " option-file +the name of an option file to be passed to +.BR pppd (8) +in place of the default +.IR /etc/ppp/options +so that PPTP specific options can be given. +Equivalent to the command line +.B --option +option. + +.TP +.BI "stimeout " seconds +number of seconds to wait for a PPTP packet before forking the +.BR pptpctrl (8) +program to handle the client. The default is 10 seconds. This is a +denial of service protection feature. +Equivalent to the command line +.B --stimeout +option. +.TP +.B debug +turns on debugging mode, sending debugging information to +.BR syslog (3). +Has no effect on +.BR pppd (8) +debugging. Equivalent to the command line +.B --debug +option. +.TP +.BI "bcrelay " internal-interface +turns on broadcast relay mode, sending all broadcasts received on the server's +internal interface to the clients. +Equivalent to the command line +.B --bcrelay +option. + +.TP +.BI "connections " n +limits the number of client connections that may be accepted. +If pptpd is allocating IP addresses (e.g. +.BR delegate +is not used) then the number of connections is also limited by the +.BR remoteip +option. The default is 100. + +.TP +.BI "delegate" +delegates the allocation of client IP addresses to +.BR pppd (8). +Without this option, which is the default, pptpd manages the list of +IP addresses for clients and passes the next free address to pppd. +With this option, pptpd does not pass an address, and so pppd may use +radius or chap-secrets to allocate an address. + +.TP +.BI "localip " ip-specification +one or many IP addresses to be used at the local end of the +tunnelled PPP links between the server and the client. If one address only +is given, this address is used for all clients. Otherwise, one address +per client must be given, and if there are no free addresses then any new +clients will be refused. +.B localip +will be ignored if the +.B delegate +option is used. +.TP +.BI "remoteip " ip-specification +a list of IP addresses to assign to remote PPTP clients. Each +connected client must have a different address, so there must be +at least as many addresses as you have simultaneous clients, +and preferably some spare, since you cannot change this list +without restarting pptpd. A warning will be sent to +.BR syslog (3) +when the IP address pool is exhausted. +.B remoteip +will be ignored if the +.B delegate +option is used. +.TP +.B noipparam +by default, the original client IP address is given to +ip-up scripts using the +.BR pppd (8) +option +.B ipparam. +The +.B noipparam +option prevents this. +Equivalent to the command line +.B --noipparam +option. +.TP +.BI "listen " ip-address +the local interface IP address to listen on for incoming PPTP +connections (TCP port 1723). Equivalent to the command line +.B --listen +option. +.TP +.BI "pidfile " pid-file +specifies an alternate location to store the process ID file +(default /var/run/pptpd.pid). Equivalent to the command line +.B --pidfile +option. +.TP +.BI "speed " speed +specifies a speed (in bits per second) to pass to the PPP daemon as +the interface speed for the tty/pty pair. This is ignored by some PPP +daemons, such as Linux's +.BR pppd (8). +The default is 115200 bytes per second, which some implementations +interpret as meaning "no limit". Equivalent to the command line +.B --speed +option. +.SH NOTES +An +.I ip-specification +above (for the +.B localip +and +.B remoteip +tags) may be a list of IP addresses (for example 192.168.0.2,192.168.0.3), +a range (for example 192.168.0.1-254 or 192.168.0-255.2) or some combination +(for example 192.168.0.2,192.168.0.5-8). For some valid pairs might be +(depending on use of the VPN): +.P +.BI "localip " 192.168.0.1 +.br +.BI "remoteip " 192.168.0.2-254 +.P +or +.P +.BI "localip " 192.168.1.2-254 +.br +.BI "remoteip " 192.168.0.2-254 + +.SH ROUTING CHECKLIST - PROXYARP +Allocate a section of your LAN addresses for use by clients. +.P +In +.IR /etc/ppp/options.pptpd. +set the +.B proxyarp +option. +In +.IR pptpd.conf +do not set +.B localip +option, but set +.B remoteip +to the allocated address range. +Enable kernel forwarding of packets, (e.g. using +.IR /proc/sys/net/ipv4/ip_forward +). +.P +The server will advertise the clients to the LAN using ARP, providing +it's own ethernet address. +.BR bcrelay (8) +should not be required. + +.SH ROUTING CHECKLIST - FORWARDING +Allocate a subnet for the clients that is routable from your LAN, but +is not part of your LAN. +.P +In +.IR pptpd.conf +set +.B localip +to a single address or range in the allocated subnet, set +.B remoteip +to a range in the allocated subnet. +Enable kernel forwarding of packets, (e.g. using +.IR /proc/sys/net/ipv4/ip_forward +). +The LAN must have a route to the clients using the server as gateway. +.P +The server will forward the packets unchanged between the clients and the LAN. +.BR bcrelay (8) +will be required to support broadcast protocols such as NETBIOS. + +.SH ROUTING CHECKLIST - MASQUERADE +Allocate a subnet for the clients that is not routable from your LAN, +and not otherwise routable from the server (e.g. 10.0.0.0/24). +.P +Set +.B localip +to a single address in the subnet (e.g. 10.0.0.1), set +.B remoteip +to a range for the rest of the subnet, (e.g. 10.0.0.2-200). +Enable kernel forwarding of packets, (e.g. using +.IR /proc/sys/net/ipv4/ip_forward +). +Enable masquerading on eth0 (e.g. +.I +iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE +). +.P +The server will translate the packets between the clients and the LAN. +The clients will appear to the LAN as having the address +corresponding to the server. The LAN need not have an explicit route +to the clients. +.BR bcrelay (8) +will be required to support broadcast protocols such as NETBIOS. + +.SH FIREWALL RULES +.BR pptpd (8) +accepts control connections on TCP port 1723, and then uses GRE +(protocol 47) to exchange data packets. Add these rules to your +.BR iptables (8) +configuration, or use them as the basis for your own rules: +.P +iptables --append INPUT --protocol 47 --jump ACCEPT +.br +.nf +iptables --append INPUT --protocol tcp --match tcp \\ +.br + --destination-port 1723 --jump ACCEPT +.fi +.P + +.SH "SEE ALSO" +.BR pppd (8), +.BR pptpd (8), +.BR pptpd.conf (5). diff --git a/release/src/router/pptpd/pptpd.init b/release/src/router/pptpd/pptpd.init new file mode 100644 index 0000000000..c048dc8202 --- /dev/null +++ b/release/src/router/pptpd/pptpd.init @@ -0,0 +1,58 @@ +#!/bin/sh +# +# Startup script for pptpd +# +# chkconfig: - 85 15 +# description: PPTP server +# processname: pptpd +# config: /etc/pptpd.conf + + +# Source function library. +. /etc/rc.d/init.d/functions +# See how we were called. +case "$1" in + start) + echo -n "Starting pptpd: " + if [ -f /var/lock/subsys/pptpd ] ; then + echo + exit 1 + fi + daemon /usr/sbin/pptpd + echo + touch /var/lock/subsys/pptpd + ;; + stop) + echo -n "Shutting down pptpd: " + killproc pptpd + echo + rm -f /var/lock/subsys/pptpd + ;; + status) + status pptpd + ;; + condrestart) + if [ -f /var/lock/subsys/pptpd ]; then + $0 stop + $0 start + fi + ;; + reload|restart) + $0 stop + $0 start + echo "Warning: a pptpd restart does not terminate existing " + echo "connections, so new connections may be assigned the same IP " + echo "address and cause unexpected results. Use restart-kill to " + echo "destroy existing connections during a restart." + ;; + restart-kill) + $0 stop + ps -ef | grep pptpd | grep -v grep | grep -v rc.d | awk '{print $2}' | uniq | xargs kill 1> /dev/null 2>&1 + $0 start + ;; + *) + echo "Usage: $0 {start|stop|restart|restart-kill|status}" + exit 1 +esac + +exit 0 diff --git a/release/src/router/pptpd/pptpdefs.h b/release/src/router/pptpd/pptpdefs.h new file mode 100644 index 0000000000..00bcec90ee --- /dev/null +++ b/release/src/router/pptpd/pptpdefs.h @@ -0,0 +1,324 @@ +/* + * pptpdefs.h + * + * PPTP structs and defines + * + * $Id: pptpdefs.h,v 1.4 2006/12/08 00:01:40 quozl Exp $ + */ + +#ifndef _PPTPD_PPTPDEFS_H +#define _PPTPD_PPTPDEFS_H + +/* define "portable" htons, etc, copied to make Ananian's gre stuff work. */ +#define hton8(x) (x) +#define ntoh8(x) (x) +#define hton16(x) htons(x) +#define ntoh16(x) ntohs(x) +#define hton32(x) htonl(x) +#define ntoh32(x) ntohl(x) + +#include + +/* PPTP ctrl message port */ +#define PPTP_PORT 1723 + +/* PPTP gre prototype */ +#define PPTP_PROTO 47 + +/* PPTP version */ +#define PPTP_VERSION 0x0100 +#define PPTP_FIRMWARE_VERSION 0x0001 + +/* Hostname and Vendor */ +#define PPTP_HOSTNAME "local" +#define PPTP_VENDOR "linux" + +#define MAX_HOSTNAME_SIZE 64 +#define MAX_VENDOR_SIZE 64 + +/* Magic Cookie */ +#define PPTP_MAGIC_COOKIE 0x1a2b3c4d + +/* Message types */ +#define PPTP_CTRL_MESSAGE 1 + +/* Maximum size of any PPTP control packet we will get */ +#define PPTP_MAX_CTRL_PCKT_SIZE 220 + +/* Control Connection Management */ +#define START_CTRL_CONN_RQST 1 +#define START_CTRL_CONN_RPLY 2 +#define STOP_CTRL_CONN_RQST 3 +#define STOP_CTRL_CONN_RPLY 4 +#define ECHO_RQST 5 +#define ECHO_RPLY 6 + +/* Call Management */ +#define OUT_CALL_RQST 7 +#define OUT_CALL_RPLY 8 +#define IN_CALL_RQST 9 +#define IN_CALL_RPLY 10 +#define IN_CALL_CONN 11 +#define CALL_CLR_RQST 12 +#define CALL_DISCONN_NTFY 13 + +/* Error Reporting */ +#define WAN_ERR_NTFY 14 + +/* PPP Session Control */ +#define SET_LINK_INFO 15 + +/* how long before a link is idle? (seconds) */ +#define IDLE_WAIT 60 + +/* how long should we wait for an echo reply? (seconds) */ +#define MAX_ECHO_WAIT 60 + +#define RESERVED 0x0000 + +/* Start Control Connection Reply */ +#define ASYNCHRONOUS_FRAMING 0x00000001 +#define SYNCHRONOUS_FRAMING 0x00000002 +#define ANALOG_ACCESS 0x00000001 +#define DIGITAL_ACCESS 0x00000002 + +/* Our properties - we don't actually have any physical serial i/f's and only want + * one call per client! + */ +#define OUR_FRAMING 0x00000000 +#define OUR_BEARER 0x00000000 +#define MAX_CHANNELS 0x0001 + +/* Out Call Reply Defines */ +#define PCKT_RECV_WINDOW_SIZE 0x0001 +#define PCKT_PROCESS_DELAY 0x0000 +#define CHANNEL_ID 0x00000000 + +/* ERROR CODES */ +#define NO_ERROR 0x00 + +/* CALL_CLEAR RESULT CODES */ +#define LOST_CARRIER 0x01 +#define ADMIN_SHUTDOWN 0x03 +#define CALL_CLEAR_REQUEST 0x04 + +/* RESULT CODES */ +#define CONNECTED 0x01 +#define DISCONNECTED 0x01 +#define GENERAL_ERROR 0x02 /* also for ERROR CODES, CALL CLEAR */ +#define NO_CARRIER 0x03 +#define BUSY 0x04 +#define NO_DIAL_TONE 0x05 +#define TIME_OUT 0x06 +#define DO_NOT_ACCEPT 0x07 + +/* CTRL CLOSE CODES */ +#define GENERAL_STOP_CTRL 0x01 +#define STOP_PROTOCOL 0x02 +#define STOP_LOCAL_SHUTDOWN 0x03 + +/* PPTP CTRL structs */ + +struct pptp_header { + u_int16_t length; /* pptp message length incl header */ + u_int16_t pptp_type; /* pptp message type */ + u_int32_t magic; /* magic cookie */ + u_int16_t ctrl_type; /* control message type */ + u_int16_t reserved0; /* reserved */ +}; + +struct pptp_start_ctrl_conn_rqst { + struct pptp_header header; /* pptp header */ + u_int16_t version; /* pptp protocol version */ + u_int16_t reserved1; /* reserved */ + u_int32_t framing_cap; /* framing capabilities */ + u_int32_t bearer_cap; /* bearer capabilities */ + u_int16_t max_channels; /* maximum channels */ + u_int16_t firmware_rev; /* firmware revision */ + u_int8_t hostname[MAX_HOSTNAME_SIZE]; /* hostname */ + u_int8_t vendor[MAX_VENDOR_SIZE]; /* vendor */ +}; + +struct pptp_start_ctrl_conn_rply { + struct pptp_header header; /* pptp header */ + u_int16_t version; /* pptp protocol version */ + u_int8_t result_code; /* result code */ + u_int8_t error_code; /* error code */ + u_int32_t framing_cap; /* framing capabilities */ + u_int32_t bearer_cap; /* bearer capabilities */ + u_int16_t max_channels; /* maximum channels */ + u_int16_t firmware_rev; /* firmware revision */ + u_int8_t hostname[MAX_HOSTNAME_SIZE]; /* hostname */ + u_int8_t vendor[MAX_VENDOR_SIZE]; /* vendor */ +}; + +struct pptp_stop_ctrl_conn_rqst { + struct pptp_header header; /* header */ + u_int8_t reason; /* reason for closing */ + u_int8_t reserved1; /* reserved */ + u_int16_t reserved2; /* reserved */ +}; + +struct pptp_stop_ctrl_conn_rply { + struct pptp_header header; /* header */ + u_int8_t result_code; /* result code */ + u_int8_t error_code; /* error code */ + u_int16_t reserved1; /* reserved */ +}; + +struct pptp_echo_rqst { + struct pptp_header header; /* header */ + u_int32_t identifier; /* value to match rply with rqst */ +}; + +struct pptp_echo_rply { + struct pptp_header header; /* header */ + u_int32_t identifier; /* identifier of echo rqst */ + u_int8_t result_code; /* result code */ + u_int8_t error_code; /* error code */ + u_int16_t reserved1; /* reserved */ +}; + +struct pptp_out_call_rqst { + struct pptp_header header; /* header */ + u_int16_t call_id; /* unique identifier to PAC-PNS pair */ + u_int16_t call_serial; /* session identifier */ + u_int32_t min_bps; /* minimum line speed */ + u_int32_t max_bps; /* maximum line speed */ + u_int32_t bearer_type; /* bearer type */ + u_int32_t framing_type; /* framing type */ + u_int16_t pckt_recv_size; /* packet recv window size */ + u_int16_t pckt_delay; /* packet processing delay */ + u_int16_t phone_len; /* phone number length */ + u_int16_t reserved1; /* reserved */ + u_int8_t phone_num[64]; /* phone number */ + u_int8_t subaddress[64]; /* additional dialing info */ +}; + +struct pptp_out_call_rply { + struct pptp_header header; /* header */ + u_int16_t call_id; /* unique identifier to PAC-PNS pair */ + u_int16_t call_id_peer; /* set to call_id of the call rqst */ + u_int8_t result_code; /* result code */ + u_int8_t error_code; /* error code */ + u_int16_t cause_code; /* additional failure information */ + u_int32_t speed; /* actual connection speed */ + u_int16_t pckt_recv_size; /* packet recv window size */ + u_int16_t pckt_delay; /* packet processing delay */ + u_int32_t channel_id; /* physical channel ID */ +}; + +struct pptp_in_call_rqst { + struct pptp_header header; /* header */ + u_int16_t call_id; /* unique identifier for tunnel */ + u_int16_t call_serial; /* session identifier */ + u_int32_t bearer_type; /* bearer capability */ + u_int32_t channel_id; /* channel ID */ + u_int16_t dialed_len; /* dialed length */ + u_int16_t dialing_len; /* dialing length */ + u_int8_t dialed_num[64]; /* number that was dialed by the caller */ + u_int8_t dialing_num[64]; /* the number from which the call was placed */ + u_int8_t subaddress[64]; /* additional dialing information */ +}; + +struct pptp_in_call_rply { + struct pptp_header header; /* header */ + u_int16_t call_id; /* unique identifier for the tunnel */ + u_int16_t peers_call_id; /* set to rcvd call ID */ + u_int8_t result_code; /* result code */ + u_int8_t error_code; /* error code */ + u_int16_t pckt_recv_size; /* packet recv window size */ + u_int16_t pckt_delay; /* packet transmit delay */ + u_int16_t reserved1; /* reserved */ +}; + +struct pptp_in_call_connect { + struct pptp_header header; /* header */ + u_int16_t peers_call_id; /* set to rcvd call ID */ + u_int16_t reserved1; /* reserved */ + u_int32_t speed; /* connect speed */ + u_int16_t pckt_recv_size; /* packet rcvd window size */ + u_int16_t pckt_delay; /* packet transmit delay */ + u_int32_t framing_type; /* framing type */ +}; + +struct pptp_call_clr_rqst { + struct pptp_header header; /* header */ + u_int16_t call_id; /* call ID assigned by the PNS */ + u_int16_t reserved1; /* reserved */ +}; + +struct pptp_call_disconn_ntfy { + struct pptp_header header; /* header */ + u_int16_t call_id; /* call ID assigned by the PAC */ + u_int8_t result_code; /* result code */ + u_int8_t error_code; /* error code */ + u_int16_t cause_code; /* additional disconnect info */ + u_int16_t reserved1; /* reserved */ + u_int8_t call_stats[128]; /* vendor specific call stats */ +}; + +struct pptp_wan_err_ntfy { + struct pptp_header header; /* header */ + u_int16_t peers_call_id; /* call ID assigned by PNS */ + u_int16_t reserved1; /* reserved */ + u_int32_t crc_errors; /* # of PPP frames rcvd with CRC errors */ + u_int32_t framing_errors; /* # of improperly framed PPP pckts */ + u_int32_t hardware_overruns; /* # of receive buffer overruns */ + u_int32_t buff_overruns; /* # of buffer overruns */ + u_int32_t timeout_errors; /* # of timeouts */ + u_int32_t align_errors; /* # of alignment errors */ +}; + +struct pptp_set_link_info { + struct pptp_header header; + u_int16_t peers_call_id; /* call ID assigned by PAC */ + u_int16_t reserved1; /* reserved */ + u_int32_t send_accm; /* send ACCM value the client should use */ + u_int32_t recv_accm; /* recv ACCM value the client should use */ +}; + +/* GRE and PPP structs */ + +/* Copied from C. S. Ananian */ + +#define HDLC_FLAG 0x7E +#define HDLC_ESCAPE 0x7D + +#define PPTP_GRE_PROTO 0x880B +#define PPTP_GRE_VER 0x1 + +#define PPTP_GRE_FLAG_C 0x80 +#define PPTP_GRE_FLAG_R 0x40 +#define PPTP_GRE_FLAG_K 0x20 +#define PPTP_GRE_FLAG_S 0x10 +#define PPTP_GRE_FLAG_A 0x80 + +#define PPTP_GRE_IS_C(f) ((f)&PPTP_GRE_FLAG_C) +#define PPTP_GRE_IS_R(f) ((f)&PPTP_GRE_FLAG_R) +#define PPTP_GRE_IS_K(f) ((f)&PPTP_GRE_FLAG_K) +#define PPTP_GRE_IS_S(f) ((f)&PPTP_GRE_FLAG_S) +#define PPTP_GRE_IS_A(f) ((f)&PPTP_GRE_FLAG_A) + +struct pptp_gre_header { + u_int8_t flags; /* bitfield */ + u_int8_t ver; /* should be PPTP_GRE_VER (enhanced GRE) */ + u_int16_t protocol; /* should be PPTP_GRE_PROTO (ppp-encaps) */ + u_int16_t payload_len; /* size of ppp payload, not inc. gre header */ + u_int16_t call_id; /* peer's call_id for this session */ + u_int32_t seq; /* sequence number. Present if S==1 */ + u_int32_t ack; /* seq number of highest packet recieved by */ + /* sender in this session */ +}; + +/* For our call ID pairs */ +#define PNS_VALUE 0 +#define PAC_VALUE 1 + +#define GET_VALUE(which, where) ((which ## _VALUE) ? ((where) & 0xffff) : ((where) >> 16)) + +#define NOTE_VALUE(which, where, what) ((which ## _VALUE) \ + ? ((where) = ((where) & 0xffff0000) | (what)) \ + : ((where) = ((where) & 0xffff) | ((what) << 16))) + +#endif /* !_PPTPD_PPTPDEFS_H */ diff --git a/release/src/router/pptpd/pptpgre.h b/release/src/router/pptpd/pptpgre.h new file mode 100644 index 0000000000..42d1467fd6 --- /dev/null +++ b/release/src/router/pptpd/pptpgre.h @@ -0,0 +1,65 @@ +/* + * pptpgre.h + * + * Functions to handle the GRE en/decapsulation + * + * $Id: pptpgre.h,v 1.3 2005/08/02 11:33:31 quozl Exp $ + */ + +#ifndef _PPTPD_PPTPGRE_H +#define _PPTPD_PPTPGRE_H + +extern int decaps_hdlc(int fd, int (*cb) (int cl, void *pack, unsigned len), int cl); +extern int encaps_hdlc(int fd, void *pack, unsigned len); +extern int decaps_gre(int fd, int (*cb) (int cl, void *pack, unsigned len), int cl); +extern int encaps_gre(int fd, void *pack, unsigned len); + +extern int pptp_gre_init(u_int32_t call_id_pair, int pty_fd, struct in_addr *inetaddrs); + +struct gre_state { + u_int32_t ack_sent, ack_recv; + u_int32_t seq_sent, seq_recv; + u_int32_t call_id_pair; +}; + +extern int disable_buffer; + +typedef struct pack_track { + uint32_t seq; // seq no of this tracked packet + uint64_t time; // time when this tracked packet was sent (in usecs) +} pack_track_t; + +typedef struct gre_stats { + /* statistics for GRE receive */ + + uint32_t rx_accepted; // data packet was passed to pppd + uint32_t rx_lost; // data packet did not arrive before timeout + uint32_t rx_underwin; // data packet was under window (arrived too late + // or duplicate packet) + uint32_t rx_overwin; // data packet was over window + // (too many packets lost?) + uint32_t rx_buffered; // data packet arrived earlier than expected, + // packet(s) before it were lost or reordered + uint32_t rx_errors; // OS error on receive + uint32_t rx_truncated; // truncated packet + uint32_t rx_invalid; // wrong protocol or invalid flags + uint32_t rx_acks; // acknowledgement only + + /* statistics for GRE transmit */ + + uint32_t tx_sent; // data packet write() to GRE socket succeeded + uint32_t tx_failed; // data packet write() to GRE socket returned error + uint32_t tx_short; // data packet write() to GRE socket underflowed + uint32_t tx_acks; // sent packet with just ACK + uint32_t tx_oversize; // data packet dropped because it was too large + + /* statistics for packet tracking, for RTT calculation */ + + pack_track_t pt; // last data packet seq/time + int rtt; // estimated round-trip time in us + +} gre_stats_t; + +extern gre_stats_t stats; + +#endif /* !_PPTPD_PPTPGRE_H */ diff --git a/release/src/router/pptpd/pptpmanager.h b/release/src/router/pptpd/pptpmanager.h new file mode 100644 index 0000000000..cd88cba46f --- /dev/null +++ b/release/src/router/pptpd/pptpmanager.h @@ -0,0 +1,24 @@ +/* + * pptpmanager.h + * + * Manager function prototype. + * + * $Id: pptpmanager.h,v 1.2 2005/12/29 09:59:49 quozl Exp $ + */ + +#ifndef _PPTPD_PPTPSERVER_H +#define _PPTPD_PPTPSERVER_H + +void slot_init(int count); +void slot_free(); +void slot_set_local(int i, char *ip); +void slot_set_remote(int i, char *ip); +void slot_set_pid(int i, pid_t pid); +int slot_find_by_pid(pid_t pid); +int slot_find_empty(); +char *slot_get_local(int i); +char *slot_get_remote(int i); + +extern int pptp_manager(int argc, char **argv); + +#endif /* !_PPTPD_PPTPSERVER_H */ diff --git a/release/src/router/pptpd/pqueue.c b/release/src/router/pptpd/pqueue.c new file mode 100644 index 0000000000..38e3d5f12d --- /dev/null +++ b/release/src/router/pptpd/pqueue.c @@ -0,0 +1,233 @@ +#include +#include +#include +#include + +#include "pqueue.h" + +#ifdef DEBUG_PQUEUE +#define DEBUG_ON 1 +#else +#define DEBUG_ON 0 +#endif + +#define DEBUG_CMD(_a) if (DEBUG_ON) { _a } + + +#define MIN_CAPACITY 128 /* min allocated buffer for a packet */ + +static int pqueue_alloc (int seq, unsigned char *packet, int packlen, pqueue_t **new); + +int packet_timeout_usecs = DEFAULT_PACKET_TIMEOUT * 1000000; + + +static pqueue_t *pq_head = NULL, *pq_tail = NULL; + +/* contains a list of free queue elements.*/ +static pqueue_t *pq_freelist_head = NULL; + + + +static int pqueue_alloc(int seq, unsigned char *packet, int packlen, pqueue_t **new) { + + pqueue_t *newent; + + DEBUG_CMD(log("seq=%d, packlen=%d", seq, packlen);); + + /* search the freelist for one that has sufficient space */ + if (pq_freelist_head) { + + for (newent = pq_freelist_head; newent; newent = newent->next) { + + if (newent->capacity >= packlen) { + + /* unlink from freelist */ + if (pq_freelist_head == newent) + pq_freelist_head = newent->next; + + if (newent->prev) + newent->prev->next = newent->next; + + if (newent->next) + newent->next->prev = newent->prev; + + if (pq_freelist_head) + pq_freelist_head->prev = NULL; + + break; + } /* end if capacity >= packlen */ + } /* end for */ + + /* nothing found? Take first and reallocate it */ + if (NULL == newent) { + + newent = pq_freelist_head; + pq_freelist_head = pq_freelist_head->next; + + if (pq_freelist_head) + pq_freelist_head->prev = NULL; + + DEBUG_CMD(log("realloc capacity %d to %d",newent->capacity, packlen);); + + newent->packet = (unsigned char *)realloc(newent->packet, packlen); + + if (!newent->packet) { + warn("error reallocating packet: %s", strerror(errno)); + return -1; + } + newent->capacity = packlen; + } + + DEBUG_CMD(log("Recycle entry from freelist. Capacity: %d", newent->capacity);); + + } else { + + /* allocate a new one */ + newent = (pqueue_t *)malloc( sizeof(pqueue_t) ); + if (!newent) { + warn("error allocating newent: %s", strerror(errno)); + return -1; + } + newent->capacity = 0; + + DEBUG_CMD(log("Alloc new queue entry");); + } + + if ( ! newent->capacity ) { + /* a new queue entry was allocated. Allocate the packet buffer */ + int size = packlen < MIN_CAPACITY ? MIN_CAPACITY : packlen; + /* Allocate at least MIN_CAPACITY */ + DEBUG_CMD(log("allocating for packet size %d", size);); + newent->packet = (unsigned char *)malloc(size); + if (!newent->packet) { + warn("error allocating packet: %s", strerror(errno)); + return -1; + } + newent->capacity = size; + } /* endif ! capacity */ + assert( newent->capacity >= packlen ); + /* store the contents into the buffer */ + memcpy(newent->packet, packet, packlen); + + newent->next = newent->prev = NULL; + newent->seq = seq; + newent->packlen = packlen; + + gettimeofday(&newent->expires, NULL); + newent->expires.tv_usec += packet_timeout_usecs; + newent->expires.tv_sec += (newent->expires.tv_usec / 1000000); + newent->expires.tv_usec %= 1000000; + + *new = newent; + return 0; +} + + + +int pqueue_add (int seq, unsigned char *packet, int packlen) { + pqueue_t *newent, *point; + + /* get a new entry */ + if ( 0 != pqueue_alloc(seq, packet, packlen, &newent) ) { + return -1; + } + + for (point = pq_head; point != NULL; point = point->next) { + if (point->seq == seq) { + // queue already contains this packet + warn("discarding duplicate packet %d", seq); + return -1; + } + if (point->seq > seq) { + // gone too far: point->seq > seq and point->prev->seq < seq + if (point->prev) { + // insert between point->prev and point + DEBUG_CMD(log("adding %d between %d and %d", + seq, point->prev->seq, point->seq);); + + point->prev->next = newent; + } else { + // insert at head of queue, before point + DEBUG_CMD(log("adding %d before %d", seq, point->seq);); + pq_head = newent; + } + newent->prev = point->prev; // will be NULL, at head of queue + newent->next = point; + point->prev = newent; + return 0; + } + } + + /* We didn't find anywhere to insert the packet, + * so there are no packets in the queue with higher sequences than this one, + * so all the packets in the queue have lower sequences, + * so this packet belongs at the end of the queue (which might be empty) + */ + + if (pq_head == NULL) { + DEBUG_CMD(log("adding %d to empty queue", seq);); + pq_head = newent; + } else { + DEBUG_CMD(log("adding %d as tail, after %d", seq, pq_tail->seq);); + pq_tail->next = newent; + } + newent->prev = pq_tail; + pq_tail = newent; + + return 0; +} + + + +int pqueue_del (pqueue_t *point) { + + DEBUG_CMD(log("Move seq %d to freelist", point->seq);); + + /* unlink from pq */ + if (pq_head == point) pq_head = point->next; + if (pq_tail == point) pq_tail = point->prev; + if (point->prev) point->prev->next = point->next; + if (point->next) point->next->prev = point->prev; + + /* add point to the freelist */ + point->next = pq_freelist_head; + point->prev = NULL; + + if (point->next) + point->next->prev = point; + pq_freelist_head = point; + + DEBUG_CMD( + int pq_count = 0; + int pq_freelist_count = 0; + pqueue_t *point; + for ( point = pq_head; point ; point = point->next) { + ++pq_count; + } + + for ( point = pq_freelist_head; point ; point = point->next) { + ++pq_freelist_count; + } + log("queue length is %d, freelist length is %d", pq_count, pq_freelist_count); + ); + + return 0; +} + + + +pqueue_t *pqueue_head () { + return pq_head; +} + + + +int pqueue_expiry_time (pqueue_t *entry) { + struct timeval tv; + int expiry_time; + + gettimeofday(&tv, NULL); + expiry_time = (entry->expires.tv_sec - tv.tv_sec) * 1000000; + expiry_time += (entry->expires.tv_usec - tv.tv_usec); + return expiry_time; +} diff --git a/release/src/router/pptpd/pqueue.h b/release/src/router/pptpd/pqueue.h new file mode 100644 index 0000000000..70bfdb0c41 --- /dev/null +++ b/release/src/router/pptpd/pqueue.h @@ -0,0 +1,30 @@ +#ifndef PQUEUE_H +#define PQUEUE_H + +#include +#include + +/* wait this many seconds for missing packets before forgetting about them */ +#define DEFAULT_PACKET_TIMEOUT 0.3 +extern int packet_timeout_usecs; + +/* assume packet is bad/spoofed if it's more than this many seqs ahead */ +#define MISSING_WINDOW 300 + +/* Packet queue structure: linked list of packets received out-of-order */ +typedef struct pqueue { + struct pqueue *next; + struct pqueue *prev; + int seq; + struct timeval expires; + unsigned char *packet; + int packlen; + int capacity; +} pqueue_t; + +int pqueue_add (int seq, unsigned char *packet, int packlen); +int pqueue_del (pqueue_t *point); +pqueue_t *pqueue_head (); +int pqueue_expiry_time (pqueue_t *entry); + +#endif /* PQUEUE_H */ diff --git a/release/src/router/pptpd/reconf b/release/src/router/pptpd/reconf new file mode 100644 index 0000000000..8516bebcd6 --- /dev/null +++ b/release/src/router/pptpd/reconf @@ -0,0 +1,61 @@ +#! /bin/sh +# +# Reconfigure for a release, by updating the Makefile dependencies and +# running the autotools. +# +# $Id: reconf,v 1.3 2004/04/23 10:06:17 quozl Exp $ + +# make the existing config.h disappear temporarily +if test -f config.h +then + mv -f config.h config.h.TMP +fi +touch config.h + +# rebuild dependencies (makedepend) +for makefile in Makefile.am Makefile.uClinux +do + echo -n "Rebuilding $makefile..." + head -`grep -n 'DO NOT ADD BELOW THIS POINT' $makefile | \ + cut -d: -f1` $makefile > $makefile.new + for file in *.c + do + if test "$makefile" = "Makefile.uClinux" + then + gcc -MM $file -include config.embed.h + else + gcc -MM $file -DHAVE_CONFIG_H + fi + echo '' + done >> $makefile.new + echo 'done.' + if ! cmp -s $makefile.new $makefile + then + echo "Changes: <=old >=new" + diff $makefile $makefile.new | grep '^[<>]' + mv -f $makefile.new $makefile + else + rm -f $makefile.new + echo "No change." + fi +done + +# restore the previous config.h +rm -f config.h +if test -f config.h.TMP +then + mv -f config.h.TMP config.h +fi + +# show us what we do next +set -x + +# reset the configuration +rm -f config.cache +rm -f config.log + +# run the build tools sequence +aclocal +autoconf +automake -a --copy --verbose +autoheader diff --git a/release/src/router/pptpd/samples/chap-secrets b/release/src/router/pptpd/samples/chap-secrets new file mode 100644 index 0000000000..a6dac4eea3 --- /dev/null +++ b/release/src/router/pptpd/samples/chap-secrets @@ -0,0 +1,3 @@ +# Secrets for authentication using CHAP +# client server secret IP addresses +#username pptpd password * diff --git a/release/src/router/pptpd/samples/options.pptpd b/release/src/router/pptpd/samples/options.pptpd new file mode 100644 index 0000000000..c6a27e2638 --- /dev/null +++ b/release/src/router/pptpd/samples/options.pptpd @@ -0,0 +1,108 @@ +############################################################################### +# $Id: options.pptpd,v 1.6 2004/12/22 22:39:30 quozl Exp $ +# +# Sample Poptop PPP options file /etc/ppp/options.pptpd +# Options used by PPP when a connection arrives from a client. +# This file is pointed to by /etc/pptpd.conf option keyword. +# Changes are effective on the next connection. See "man pppd". +# +# You are expected to change this file to suit your system. As +# packaged, it requires PPP 2.4.2 and the kernel MPPE module. +############################################################################### + + +# Authentication + +# Name of the local system for authentication purposes +# (must match the second field in /etc/ppp/chap-secrets entries) +name pptpd + +# Strip the domain prefix from the username before authentication. +# (applies if you use pppd with chapms-strip-domain patch) +#chapms-strip-domain + + +# Encryption +# (There have been multiple versions of PPP with encryption support, +# choose with of the following sections you will use.) + + +# BSD licensed ppp-2.4.2 upstream with MPPE only, kernel module ppp_mppe.o +# {{{ +refuse-pap +refuse-chap +refuse-mschap +# Require the peer to authenticate itself using MS-CHAPv2 [Microsoft +# Challenge Handshake Authentication Protocol, Version 2] authentication. +require-mschap-v2 +# Require MPPE 128-bit encryption +# (note that MPPE requires the use of MSCHAP-V2 during authentication) +require-mppe-128 +# }}} + + +# OpenSSL licensed ppp-2.4.1 fork with MPPE only, kernel module mppe.o +# {{{ +#-chap +#-chapms +# Require the peer to authenticate itself using MS-CHAPv2 [Microsoft +# Challenge Handshake Authentication Protocol, Version 2] authentication. +#+chapms-v2 +# Require MPPE encryption +# (note that MPPE requires the use of MSCHAP-V2 during authentication) +#mppe-40 # enable either 40-bit or 128-bit, not both +#mppe-128 +#mppe-stateless +# }}} + + +# Network and Routing + +# If pppd is acting as a server for Microsoft Windows clients, this +# option allows pppd to supply one or two DNS (Domain Name Server) +# addresses to the clients. The first instance of this option +# specifies the primary DNS address; the second instance (if given) +# specifies the secondary DNS address. +#ms-dns 10.0.0.1 +#ms-dns 10.0.0.2 + +# If pppd is acting as a server for Microsoft Windows or "Samba" +# clients, this option allows pppd to supply one or two WINS (Windows +# Internet Name Services) server addresses to the clients. The first +# instance of this option specifies the primary WINS address; the +# second instance (if given) specifies the secondary WINS address. +#ms-wins 10.0.0.3 +#ms-wins 10.0.0.4 + +# Add an entry to this system's ARP [Address Resolution Protocol] +# table with the IP address of the peer and the Ethernet address of this +# system. This will have the effect of making the peer appear to other +# systems to be on the local ethernet. +# (you do not need this if your PPTP server is responsible for routing +# packets to the clients -- James Cameron) +proxyarp + + +# Logging + +# Enable connection debugging facilities. +# (see your syslog configuration for where pppd sends to) +#debug + +# Print out all the option values which have been set. +# (often requested by mailing list to verify options) +#dump + + +# Miscellaneous + +# Create a UUCP-style lock file for the pseudo-tty to ensure exclusive +# access. +lock + +# Disable BSD-Compress compression +nobsdcomp + +# turn off logging to stderr, since this may be redirected to pptpd +nologfd + diff --git a/release/src/router/pptpd/samples/pptpd.conf b/release/src/router/pptpd/samples/pptpd.conf new file mode 100644 index 0000000000..f12471bf3d --- /dev/null +++ b/release/src/router/pptpd/samples/pptpd.conf @@ -0,0 +1,80 @@ +############################################################################### +# $Id: pptpd.conf,v 1.8 2004/04/28 11:36:07 quozl Exp $ +# +# Sample Poptop configuration file /etc/pptpd.conf +# +# Changes are effective when pptpd is restarted. +############################################################################### + +# TAG: ppp +# Path to the pppd program, default '/usr/sbin/pppd' on Linux +# +#ppp /usr/sbin/pppd + +# TAG: option +# Specifies the location of the PPP options file. +# By default PPP looks in '/etc/ppp/options' +# +option /etc/ppp/options.pptpd + +# TAG: debug +# Turns on (more) debugging to syslog +# +#debug + +# TAG: stimeout +# Specifies timeout (in seconds) on starting ctrl connection +# +# stimeout 10 + +# TAG: noipparam +# Suppress the passing of the client's IP address to PPP, which is +# done by default otherwise. +# +#noipparam + +# TAG: logwtmp +# Use wtmp(5) to record client connections and disconnections. +# +logwtmp + +# TAG: bcrelay +# Turns on broadcast relay to clients from interface +# +#bcrelay eth1 + +# TAG: localip +# TAG: remoteip +# Specifies the local and remote IP address ranges. +# +# Any addresses work as long as the local machine takes care of the +# routing. But if you want to use MS-Windows networking, you should +# use IP addresses out of the LAN address space and use the proxyarp +# option in the pppd options file, or run bcrelay. +# +# You can specify single IP addresses seperated by commas or you can +# specify ranges, or both. For example: +# +# 192.168.0.234,192.168.0.245-249,192.168.0.254 +# +# IMPORTANT RESTRICTIONS: +# +# 1. No spaces are permitted between commas or within addresses. +# +# 2. If you give more IP addresses than MAX_CONNECTIONS, it will +# start at the beginning of the list and go until it gets +# MAX_CONNECTIONS IPs. Others will be ignored. +# +# 3. No shortcuts in ranges! ie. 234-8 does not mean 234 to 238, +# you must type 234-238 if you mean this. +# +# 4. If you give a single localIP, that's ok - all local IPs will +# be set to the given one. You MUST still give at least one remote +# IP for each simultaneous client. +# +# (Recommended) +#localip 192.168.0.1 +#remoteip 192.168.0.234-238,192.168.0.245 +# or +#localip 192.168.0.234-238,192.168.0.245 +#remoteip 192.168.1.234-238,192.168.1.245 -- 2.11.4.GIT