├── README ├── src ├── http │ ├── modules │ │ ├── perl │ │ │ ├── typemap │ │ │ ├── ngx_http_perl_module.h │ │ │ └── Makefile.PL │ │ └── ngx_http_ssl_module.h │ ├── ngx_http_busy_lock.h │ └── ngx_http_upstream_round_robin.h ├── os │ └── unix │ │ ├── ngx_solaris.h │ │ ├── ngx_linux.h │ │ ├── ngx_user.h │ │ ├── ngx_darwin.h │ │ ├── ngx_shmem.h │ │ ├── ngx_freebsd.h │ │ ├── ngx_sunpro_sparc64.il │ │ ├── ngx_channel.h │ │ ├── ngx_setproctitle.h │ │ ├── ngx_alloc.h │ │ ├── ngx_sunpro_amd64.il │ │ ├── ngx_sunpro_x86.il │ │ ├── rfork_thread.S │ │ ├── ngx_sunpro_atomic_sparc64.h │ │ ├── ngx_socket.h │ │ ├── ngx_process_cycle.h │ │ ├── ngx_time.h │ │ ├── ngx_daemon.c │ │ ├── ngx_solaris_init.c │ │ ├── ngx_send.c │ │ ├── ngx_aio_read_chain.c │ │ ├── ngx_gcc_atomic_amd64.h │ │ ├── ngx_gcc_atomic_sparc64.h │ │ ├── ngx_darwin_config.h │ │ ├── ngx_errno.h │ │ ├── ngx_alloc.c │ │ ├── ngx_time.c │ │ ├── ngx_linux_init.c │ │ ├── ngx_socket.c │ │ ├── ngx_errno.c │ │ ├── ngx_solaris_config.h │ │ ├── ngx_os.h │ │ ├── ngx_aio_write_chain.c │ │ ├── ngx_user.c │ │ ├── ngx_linux_config.h │ │ ├── ngx_freebsd_config.h │ │ ├── ngx_udp_recv.c │ │ ├── ngx_freebsd_rfork_thread.h │ │ ├── ngx_process.h │ │ ├── ngx_posix_init.c │ │ ├── ngx_aio_write.c │ │ └── ngx_aio_read.c ├── core │ ├── ngx_murmurhash.h │ ├── ngx_crypt.h │ ├── nginx.h │ ├── ngx_parse.h │ ├── ngx_sha1.h │ ├── ngx_crc.h │ ├── ngx_murmurhash.c │ ├── ngx_md5.h │ ├── ngx_shmtx.h │ ├── ngx_slab.h │ ├── ngx_times.h │ ├── ngx_regex.h │ ├── ngx_radix_tree.h │ ├── ngx_crc32.h │ ├── ngx_queue.c │ ├── ngx_spinlock.c │ ├── ngx_array.h │ ├── ngx_core.h │ ├── ngx_list.h │ ├── ngx_rbtree.h │ ├── ngx_list.c │ └── ngx_cpuinfo.c ├── misc │ └── ngx_cpp_test_module.cpp ├── mail │ ├── ngx_mail_pop3_module.h │ ├── ngx_mail_imap_module.h │ ├── ngx_mail_smtp_module.h │ └── ngx_mail_ssl_module.h └── event │ ├── ngx_event_mutex.c │ ├── ngx_event_busy_lock.h │ ├── ngx_event_timer.h │ ├── ngx_event_connect.h │ └── ngx_event_pipe.h ├── auto ├── stubs ├── have ├── nohave ├── define ├── have_headers ├── types │ ├── value │ ├── uintptr_t │ ├── typedef │ └── sizeof ├── lib │ ├── md5 │ │ ├── makefile.owc │ │ ├── makefile.bcc │ │ ├── makefile.msvc │ │ ├── make │ │ └── conf │ ├── sha1 │ │ ├── makefile.owc │ │ ├── makefile.bcc │ │ ├── makefile.msvc │ │ ├── conf │ │ └── make │ ├── openssl │ │ ├── makefile.msvc │ │ ├── makefile.bcc │ │ ├── make │ │ └── conf │ ├── libatomic │ │ ├── make │ │ └── conf │ ├── zlib │ │ ├── makefile.msvc │ │ ├── makefile.owc │ │ ├── makefile.bcc │ │ ├── patch.zlib.h │ │ ├── conf │ │ └── make │ ├── pcre │ │ ├── makefile.msvc │ │ ├── makefile.owc │ │ ├── makefile.bcc │ │ └── make │ ├── test │ ├── make │ ├── google-perftools │ │ └── conf │ ├── perl │ │ ├── make │ │ └── conf │ ├── geoip │ │ └── conf │ ├── conf │ └── libgd │ │ └── conf ├── cc │ ├── acc │ ├── ccc │ ├── bcc │ ├── owc │ └── name ├── headers ├── os │ ├── win32 │ ├── solaris │ └── conf ├── init ├── endianess └── include ├── html ├── index.html └── 50x.html ├── .gitignore ├── README.md ├── contrib ├── README ├── unicode2nginx │ └── unicode-to-nginx.pl └── geo2nginx.pl ├── conf ├── scgi_params ├── uwsgi_params ├── fastcgi_params ├── fastcgi.conf └── koi-win └── LICENSE /README: -------------------------------------------------------------------------------- 1 | 2 | Documentation is available at http://nginx.org 3 | 4 | -------------------------------------------------------------------------------- /src/http/modules/perl/typemap: -------------------------------------------------------------------------------- 1 | TYPEMAP 2 | 3 | nginx T_PTROBJ 4 | -------------------------------------------------------------------------------- /auto/stubs: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | have=NGX_SUPPRESS_WARN . auto/have 7 | 8 | have=NGX_SMP . auto/have 9 | -------------------------------------------------------------------------------- /html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Welcome to nginx! 4 | 5 | 6 |

Welcome to nginx!

7 | 8 | 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Object files 2 | *.slo 3 | *.lo 4 | *.o 5 | 6 | # Compiled Dynamic libraries 7 | *.so 8 | 9 | # Compiled Static libraries 10 | *.lai 11 | *.la 12 | *.a 13 | 14 | *.bak 15 | -------------------------------------------------------------------------------- /auto/have: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | cat << END >> $NGX_AUTO_CONFIG_H 7 | 8 | #ifndef $have 9 | #define $have 1 10 | #endif 11 | 12 | END 13 | -------------------------------------------------------------------------------- /auto/nohave: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | cat << END >> $NGX_AUTO_CONFIG_H 7 | 8 | #ifndef $have 9 | #define $have 0 10 | #endif 11 | 12 | END 13 | -------------------------------------------------------------------------------- /auto/define: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | cat << END >> $NGX_AUTO_CONFIG_H 7 | 8 | #ifndef $have 9 | #define $have $value 10 | #endif 11 | 12 | END 13 | -------------------------------------------------------------------------------- /auto/have_headers: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | cat << END >> $NGX_AUTO_HEADERS_H 7 | 8 | #ifndef $have 9 | #define $have 1 10 | #endif 11 | 12 | END 13 | -------------------------------------------------------------------------------- /auto/types/value: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | cat << END >> $NGX_AUTO_CONFIG_H 7 | 8 | #ifndef $ngx_param 9 | #define $ngx_param $ngx_value 10 | #endif 11 | 12 | END 13 | -------------------------------------------------------------------------------- /auto/lib/md5/makefile.owc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | CFLAGS = -zq -bt=nt -bm -ot -op -oi -oe -s $(CPU_OPT) 7 | 8 | md5.lib: 9 | cd $(MD5) 10 | wcl386 -c $(CFLAGS) -dL_ENDIAN md5_dgst.c 11 | wlib -n md5.lib md5_dgst.obj 12 | -------------------------------------------------------------------------------- /auto/lib/sha1/makefile.owc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | CFLAGS = -zq -bt=nt -bm -ot -op -oi -oe -s $(CPU_OPT) 7 | 8 | sha1.lib: 9 | cd $(SHA1) 10 | wcl386 -c $(CFLAGS) -dL_ENDIAN sha1dgst.c 11 | wlib -n sha1.lib sha1dgst.obj 12 | -------------------------------------------------------------------------------- /auto/cc/acc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | # aCC: HP ANSI C++ B3910B A.03.55.02 7 | 8 | # C89 mode 9 | 10 | CFLAGS="$CFLAGS -Ae" 11 | CC_TEST_FLAGS="-Ae" 12 | 13 | PCRE_OPT="$PCRE_OPT -Ae" 14 | ZLIB_OPT="$ZLIB_OPT -Ae" 15 | MD5_OPT="$MD5_OPT -Ae" 16 | -------------------------------------------------------------------------------- /auto/lib/openssl/makefile.msvc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | all: 7 | cd $(OPENSSL) 8 | 9 | perl Configure VC-WIN32 no-shared --prefix=openssl $(OPENSSL_OPT) 10 | 11 | ms\do_ms 12 | 13 | $(MAKE) -f ms\nt.mak 14 | $(MAKE) -f ms\nt.mak install 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | nginx-1.0.14_comment 2 | ==================== 3 | 4 | nginx源码中文注释版 5 | 6 | ======== 7 | 8 | 9 | 项目目标人群是是初学nginx源码的人员,欢迎提出更新的修改(请确保提交的文件编码为**UTF8**). 10 | 11 | 很多注释都是从网络上一些文章阅读后摘录出来的 12 | 13 | 做注释的同时也增加了文章地址说明 14 | 15 | ============== 16 | 17 | nginx学习资源汇总: 18 | 19 | 《深入理解Nginx -- 模块开发与架构解析》 (注:超级精彩的一本书,入门必备) 20 | -------------------------------------------------------------------------------- /src/os/unix/ngx_solaris.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_SOLARIS_H_INCLUDED_ 9 | #define _NGX_SOLARIS_H_INCLUDED_ 10 | 11 | 12 | ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, 13 | off_t limit); 14 | 15 | 16 | #endif /* _NGX_SOLARIS_H_INCLUDED_ */ 17 | -------------------------------------------------------------------------------- /auto/lib/libatomic/make: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | cat << END >> $NGX_MAKEFILE 7 | 8 | $NGX_LIBATOMIC/src/libatomic_ops.a: $NGX_LIBATOMIC/Makefile 9 | cd $NGX_LIBATOMIC && make 10 | 11 | $NGX_LIBATOMIC/Makefile: $NGX_MAKEFILE 12 | cd $NGX_LIBATOMIC && ./configure 13 | 14 | END 15 | -------------------------------------------------------------------------------- /auto/lib/zlib/makefile.msvc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) 7 | 8 | zlib.lib: 9 | cd $(ZLIB) 10 | 11 | cl -c $(CFLAGS) adler32.c crc32.c deflate.c trees.c zutil.c compress.c 12 | 13 | link -lib -out:zlib.lib adler32.obj crc32.obj deflate.obj \ 14 | trees.obj zutil.obj compress.obj 15 | -------------------------------------------------------------------------------- /auto/lib/zlib/makefile.owc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | CFLAGS = -zq -bt=nt -ot -op -oi -oe -s -bm $(CPU_OPT) 7 | 8 | zlib.lib: 9 | cd $(ZLIB) 10 | 11 | wcl386 -c $(CFLAGS) adler32.c crc32.c deflate.c trees.c zutil.c & 12 | compress.c 13 | wlib -n zlib.lib adler32.obj crc32.obj deflate.obj trees.obj & 14 | zutil.obj compress.obj 15 | -------------------------------------------------------------------------------- /src/core/ngx_murmurhash.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_MURMURHASH_H_INCLUDED_ 9 | #define _NGX_MURMURHASH_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | uint32_t ngx_murmur_hash2(u_char *data, size_t len); 17 | 18 | 19 | #endif /* _NGX_CRC_H_INCLUDED_ */ 20 | -------------------------------------------------------------------------------- /auto/lib/zlib/makefile.bcc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | CFLAGS = -q -O2 -tWM -w-8004 -w-8012 $(CPU_OPT) 7 | 8 | zlib.lib: 9 | cd $(ZLIB) 10 | 11 | bcc32 -c $(CFLAGS) adler32.c crc32.c deflate.c trees.c zutil.c \ 12 | compress.c 13 | 14 | tlib zlib.lib +adler32.obj +crc32.obj +deflate.obj \ 15 | +trees.obj +zutil.obj +compress.obj 16 | -------------------------------------------------------------------------------- /src/os/unix/ngx_linux.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_LINUX_H_INCLUDED_ 9 | #define _NGX_LINUX_H_INCLUDED_ 10 | 11 | 12 | ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, 13 | off_t limit); 14 | 15 | extern int ngx_linux_rtsig_max; 16 | 17 | 18 | #endif /* _NGX_LINUX_H_INCLUDED_ */ 19 | -------------------------------------------------------------------------------- /src/core/ngx_crypt.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_CRYPT_H_INCLUDED_ 9 | #define _NGX_CRYPT_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | ngx_int_t ngx_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, 17 | u_char **encrypted); 18 | 19 | 20 | #endif /* _NGX_CRYPT_H_INCLUDED_ */ 21 | -------------------------------------------------------------------------------- /auto/lib/zlib/patch.zlib.h: -------------------------------------------------------------------------------- 1 | --- zlib.h Thu Jul 9 20:06:56 1998 2 | +++ zlib-1.1.3/zlib.h Tue Mar 22 13:41:04 2005 3 | @@ -709,7 +709,6 @@ 4 | (0 in case of error). 5 | */ 6 | 7 | -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); 8 | /* 9 | Converts, formats, and writes the args to the compressed file under 10 | control of the format string, as in fprintf. gzprintf returns the number of 11 | -------------------------------------------------------------------------------- /auto/lib/md5/makefile.bcc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | CFLAGS = -q -O2 -tWM $(CPU_OPT) -DL_ENDIAN 7 | 8 | !if "$(MD5_ASM)" == "YES" 9 | 10 | md5.lib: 11 | cd $(MD5) 12 | bcc32 -c $(CFLAGS) -DMD5_ASM md5_dgst.c 13 | tlib md5.lib +md5_dgst.obj +"asm\m-win32.obj" 14 | 15 | !else 16 | 17 | md5.lib: 18 | cd $(MD5) 19 | bcc32 -c $(CFLAGS) md5_dgst.c 20 | tlib md5.lib +md5_dgst.obj 21 | 22 | !endif 23 | -------------------------------------------------------------------------------- /src/core/nginx.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGINX_H_INCLUDED_ 9 | #define _NGINX_H_INCLUDED_ 10 | 11 | 12 | #define nginx_version 1000014 13 | #define NGINX_VERSION "1.0.14" 14 | #define NGINX_VER "nginx/" NGINX_VERSION 15 | 16 | #define NGINX_VAR "NGINX" 17 | #define NGX_OLDPID_EXT ".oldbin" 18 | 19 | 20 | #endif /* _NGINX_H_INCLUDED_ */ 21 | -------------------------------------------------------------------------------- /auto/lib/sha1/makefile.bcc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | CFLAGS = -q -O2 -tWM $(CPU_OPT) -DL_ENDIAN 7 | 8 | !if "$(SHA1_ASM)" == "YES" 9 | 10 | sha1.lib: 11 | cd $(SHA1) 12 | bcc32 -c $(CFLAGS) -DSHA1_ASM sha1dgst.c 13 | tlib sha1.lib +sha1dgst.obj +"asm\s-win32.obj" 14 | 15 | !else 16 | 17 | sha1.lib: 18 | cd $(SHA1) 19 | bcc32 -c $(CFLAGS) sha1dgst.c 20 | tlib sha1.lib +sha1dgst.obj 21 | 22 | !endif 23 | -------------------------------------------------------------------------------- /auto/lib/openssl/makefile.bcc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | all: 7 | cd $(OPENSSL) 8 | 9 | perl Configure BC-32 no-shared --prefix=openssl $(OPENSSL_OPT) 10 | 11 | ms\do_nasm 12 | 13 | $(MAKE) -f ms\bcb.mak 14 | $(MAKE) -f ms\bcb.mak install 15 | 16 | # Borland's make does not expand "[ch]" in 17 | # copy "inc32\openssl\*.[ch]" "openssl\include\openssl" 18 | copy inc32\openssl\*.h openssl\include\openssl 19 | -------------------------------------------------------------------------------- /html/50x.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | The page is temporarily unavailable 4 | 7 | 8 | 9 | 10 | 11 | 15 | 16 |
12 | The page you are looking for is temporarily unavailable.
13 | Please try again later. 14 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /auto/headers: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | ngx_include="unistd.h"; . auto/include 7 | ngx_include="inttypes.h"; . auto/include 8 | ngx_include="limits.h"; . auto/include 9 | ngx_include="sys/filio.h"; . auto/include 10 | ngx_include="sys/param.h"; . auto/include 11 | ngx_include="sys/mount.h"; . auto/include 12 | ngx_include="sys/statvfs.h"; . auto/include 13 | ngx_include="crypt.h"; . auto/include 14 | -------------------------------------------------------------------------------- /auto/lib/md5/makefile.msvc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) -D L_ENDIAN 7 | 8 | !IF "$(MD5_ASM)" == "YES" 9 | 10 | md5.lib: 11 | cd $(MD5) 12 | cl -c $(CFLAGS) -D MD5_ASM md5_dgst.c 13 | link -lib -out:md5.lib md5_dgst.obj asm/m-win32.obj 14 | 15 | !ELSE 16 | 17 | md5.lib: 18 | cd $(MD5) 19 | cl -c $(CFLAGS) md5_dgst.c 20 | link -lib -out:md5.lib md5_dgst.obj 21 | 22 | !ENDIF 23 | -------------------------------------------------------------------------------- /src/os/unix/ngx_user.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_USER_H_INCLUDED_ 9 | #define _NGX_USER_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | typedef uid_t ngx_uid_t; 17 | typedef gid_t ngx_gid_t; 18 | 19 | 20 | ngx_int_t ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, 21 | u_char **encrypted); 22 | 23 | 24 | #endif /* _NGX_USER_H_INCLUDED_ */ 25 | -------------------------------------------------------------------------------- /auto/lib/sha1/makefile.msvc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) -D L_ENDIAN 7 | 8 | !IF "$(SHA1_ASM)" == "YES" 9 | 10 | sha1.lib: 11 | cd $(SHA1) 12 | cl -c $(CFLAGS) -D SHA1_ASM sha1dgst.c 13 | link -lib -out:sha1.lib sha1dgst.obj asm/s-win32.obj 14 | 15 | !ELSE 16 | 17 | sha1.lib: 18 | cd $(SHA1) 19 | cl -c $(CFLAGS) sha1dgst.c 20 | link -lib -out:sha1.lib sha1dgst.obj 21 | 22 | !ENDIF 23 | -------------------------------------------------------------------------------- /contrib/README: -------------------------------------------------------------------------------- 1 | 2 | geo2nginx.pl by Andrei Nigmatulin 3 | 4 | The perl script to convert CSV geoip database ( free download 5 | at http://www.maxmind.com/app/geoip_country ) to format, suitable 6 | for use by the ngx_http_geo_module. 7 | 8 | 9 | unicode2nginx by Maxim Dounin 10 | 11 | The perl script to convert unicode mappings ( available 12 | at http://www.unicode.org/Public/MAPPINGS/ ) to the nginx 13 | configuration file format. 14 | Two generated full maps for windows-1251 and koi8-r. 15 | 16 | -------------------------------------------------------------------------------- /src/os/unix/ngx_darwin.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_DARWIN_H_INCLUDED_ 9 | #define _NGX_DARWIN_H_INCLUDED_ 10 | 11 | 12 | ngx_chain_t *ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, 13 | off_t limit); 14 | 15 | extern int ngx_darwin_kern_osreldate; 16 | extern int ngx_darwin_hw_ncpu; 17 | extern u_long ngx_darwin_net_inet_tcp_sendspace; 18 | 19 | 20 | #endif /* _NGX_DARWIN_H_INCLUDED_ */ 21 | -------------------------------------------------------------------------------- /src/core/ngx_parse.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_PARSE_H_INCLUDED_ 9 | #define _NGX_PARSE_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | #define NGX_PARSE_LARGE_TIME -2 17 | 18 | 19 | ssize_t ngx_parse_size(ngx_str_t *line); 20 | off_t ngx_parse_offset(ngx_str_t *line); 21 | ngx_int_t ngx_parse_time(ngx_str_t *line, ngx_uint_t is_sec); 22 | 23 | 24 | #endif /* _NGX_PARSE_H_INCLUDED_ */ 25 | -------------------------------------------------------------------------------- /auto/lib/pcre/makefile.msvc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | CFLAGS = -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) 7 | PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 8 | 9 | 10 | pcre.lib: 11 | cd $(PCRE) 12 | 13 | cl -nologo -c $(CFLAGS) -I . $(PCREFLAGS) pcre_*.c 14 | 15 | link -lib -out:pcre.lib -verbose:lib pcre_*.obj 16 | 17 | pcre.h: 18 | cd $(PCRE) 19 | 20 | copy /y pcre.h.generic pcre.h 21 | copy /y config.h.generic config.h 22 | copy /y pcre_chartables.c.dist pcre_chartables.c 23 | -------------------------------------------------------------------------------- /auto/lib/pcre/makefile.owc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | CFLAGS = -c -zq -bt=nt -ot -op -oi -oe -s -bm $(CPU_OPT) 7 | PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 8 | 9 | 10 | pcre.lib: 11 | cd $(PCRE) 12 | 13 | wcl386 $(CFLAGS) -i=. $(PCREFLAGS) pcre_*.c 14 | 15 | dir /b *.obj > pcre.lst 16 | 17 | wlib -n pcre.lib @pcre.lst 18 | 19 | pcre.h: 20 | cd $(PCRE) 21 | 22 | copy /y pcre.h.generic pcre.h 23 | copy /y config.h.generic config.h 24 | copy /y pcre_chartables.c.dist pcre_chartables.c 25 | -------------------------------------------------------------------------------- /conf/scgi_params: -------------------------------------------------------------------------------- 1 | 2 | scgi_param REQUEST_METHOD $request_method; 3 | scgi_param REQUEST_URI $request_uri; 4 | scgi_param QUERY_STRING $query_string; 5 | scgi_param CONTENT_TYPE $content_type; 6 | 7 | scgi_param DOCUMENT_URI $document_uri; 8 | scgi_param DOCUMENT_ROOT $document_root; 9 | scgi_param SCGI 1; 10 | scgi_param SERVER_PROTOCOL $server_protocol; 11 | 12 | scgi_param REMOTE_ADDR $remote_addr; 13 | scgi_param REMOTE_PORT $remote_port; 14 | scgi_param SERVER_PORT $server_port; 15 | scgi_param SERVER_NAME $server_name; 16 | -------------------------------------------------------------------------------- /src/core/ngx_sha1.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_SHA1_H_INCLUDED_ 9 | #define _NGX_SHA1_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | #if (NGX_HAVE_OPENSSL_SHA1_H) 17 | #include 18 | #else 19 | #include 20 | #endif 21 | 22 | 23 | typedef SHA_CTX ngx_sha1_t; 24 | 25 | 26 | #define ngx_sha1_init SHA1_Init //初始化 27 | #define ngx_sha1_update SHA1_Update//输入数据 28 | #define ngx_sha1_final SHA1_Final //输出SHA1值 29 | 30 | 31 | #endif /* _NGX_SHA1_H_INCLUDED_ */ 32 | -------------------------------------------------------------------------------- /auto/lib/pcre/makefile.bcc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | CFLAGS = -q -O2 -tWM -w-8004 $(CPU_OPT) 7 | PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 8 | 9 | 10 | pcre.lib: 11 | cd $(PCRE) 12 | 13 | bcc32 -c $(CFLAGS) -I. $(PCREFLAGS) pcre_*.c 14 | 15 | > pcre.lst 16 | for %n in (*.obj) do @echo +%n & >> pcre.lst 17 | echo + >> pcre.lst 18 | 19 | tlib pcre.lib @pcre.lst 20 | 21 | pcre.h: 22 | cd $(PCRE) 23 | 24 | copy /y pcre.h.generic pcre.h 25 | copy /y config.h.generic config.h 26 | copy /y pcre_chartables.c.dist pcre_chartables.c 27 | -------------------------------------------------------------------------------- /src/os/unix/ngx_shmem.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_SHMEM_H_INCLUDED_ 9 | #define _NGX_SHMEM_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | typedef struct { 17 | u_char *addr; 18 | size_t size; 19 | ngx_str_t name; 20 | ngx_log_t *log; 21 | ngx_uint_t exists; /* unsigned exists:1; */ 22 | } ngx_shm_t; 23 | 24 | 25 | ngx_int_t ngx_shm_alloc(ngx_shm_t *shm); 26 | void ngx_shm_free(ngx_shm_t *shm); 27 | 28 | 29 | #endif /* _NGX_SHMEM_H_INCLUDED_ */ 30 | -------------------------------------------------------------------------------- /conf/uwsgi_params: -------------------------------------------------------------------------------- 1 | 2 | uwsgi_param QUERY_STRING $query_string; 3 | uwsgi_param REQUEST_METHOD $request_method; 4 | uwsgi_param CONTENT_TYPE $content_type; 5 | uwsgi_param CONTENT_LENGTH $content_length; 6 | 7 | uwsgi_param REQUEST_URI $request_uri; 8 | uwsgi_param PATH_INFO $document_uri; 9 | uwsgi_param DOCUMENT_ROOT $document_root; 10 | uwsgi_param SERVER_PROTOCOL $server_protocol; 11 | 12 | uwsgi_param REMOTE_ADDR $remote_addr; 13 | uwsgi_param REMOTE_PORT $remote_port; 14 | uwsgi_param SERVER_PORT $server_port; 15 | uwsgi_param SERVER_NAME $server_name; 16 | -------------------------------------------------------------------------------- /src/misc/ngx_cpp_test_module.cpp: -------------------------------------------------------------------------------- 1 | 2 | // stub module to test header files' C++ compatibilty 3 | 4 | extern "C" { 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #include 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | } 18 | 19 | // nginx header files should go before other, because they define 64-bit off_t 20 | // #include 21 | 22 | 23 | void 24 | ngx_cpp_test_handler(void *data) 25 | { 26 | return; 27 | } 28 | -------------------------------------------------------------------------------- /src/os/unix/ngx_freebsd.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_FREEBSD_H_INCLUDED_ 9 | #define _NGX_FREEBSD_H_INCLUDED_ 10 | 11 | 12 | ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, 13 | off_t limit); 14 | 15 | extern int ngx_freebsd_kern_osreldate; 16 | extern int ngx_freebsd_hw_ncpu; 17 | extern u_long ngx_freebsd_net_inet_tcp_sendspace; 18 | 19 | extern ngx_uint_t ngx_freebsd_sendfile_nbytes_bug; 20 | extern ngx_uint_t ngx_freebsd_use_tcp_nopush; 21 | extern ngx_uint_t ngx_freebsd_debug_malloc; 22 | 23 | 24 | #endif /* _NGX_FREEBSD_H_INCLUDED_ */ 25 | -------------------------------------------------------------------------------- /auto/lib/test: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | echo $ngx_n "checking for $ngx_lib ...$ngx_c" 7 | 8 | cat << END >> $NGX_AUTOCONF_ERR 9 | 10 | ---------------------------------------- 11 | checking for $ngx_lib 12 | 13 | END 14 | 15 | ngx_found=no 16 | 17 | cat << END > $NGX_AUTOTEST.c 18 | 19 | $ngx_lib_incs 20 | 21 | int main() { 22 | $ngx_lib_test; 23 | return 0; 24 | } 25 | 26 | 27 | eval "$CC $cc_test_flags $ngx_lib_cflags \ 28 | -o $NGX_AUTOTEST $NGX_AUTOTEST.c $ngx_libs \ 29 | >> $NGX_ERR 2>&1" 30 | 31 | if [ -x $NGX_AUTOTEST ]; then 32 | echo " found" 33 | 34 | ngx_found=yes 35 | 36 | else 37 | echo " not found" 38 | fi 39 | 40 | rm $NGX_AUTOTEST* 41 | -------------------------------------------------------------------------------- /auto/os/win32: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | have=NGX_WIN32 . auto/have_headers 7 | 8 | CORE_INCS="$WIN32_INCS" 9 | CORE_DEPS="$WIN32_DEPS" 10 | CORE_SRCS="$WIN32_SRCS $IOCP_SRCS" 11 | OS_CONFIG="$WIN32_CONFIG" 12 | CORE_LIBS="$CORE_LIBS advapi32.lib ws2_32.lib" 13 | NGX_ICONS="$NGX_WIN32_ICONS" 14 | SELECT_SRCS=$WIN32_SELECT_SRCS 15 | 16 | EVENT_MODULES="$EVENT_MODULES $IOCP_MODULE" 17 | EVENT_FOUND=YES 18 | 19 | if [ $EVENT_SELECT = NO ]; then 20 | CORE_SRCS="$CORE_SRCS $SELECT_SRCS" 21 | EVENT_MODULES="$EVENT_MODULES $SELECT_MODULE" 22 | fi 23 | 24 | if [ $NGX_IPV6 = YES ]; then 25 | have=NGX_HAVE_INET6 . auto/have 26 | fi 27 | 28 | have=NGX_HAVE_AIO . auto/have 29 | have=NGX_HAVE_IOCP . auto/have 30 | -------------------------------------------------------------------------------- /auto/lib/make: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | if [ $PCRE != NONE -a $PCRE != NO -a $PCRE != YES ]; then 7 | . auto/lib/pcre/make 8 | fi 9 | 10 | if [ $MD5 != NONE -a $MD5 != NO -a $MD5 != YES ]; then 11 | . auto/lib/md5/make 12 | fi 13 | 14 | if [ $SHA1 != NONE -a $SHA1 != NO -a $SHA1 != YES ]; then 15 | . auto/lib/sha1/make 16 | fi 17 | 18 | if [ $OPENSSL != NONE -a $OPENSSL != NO -a $OPENSSL != YES ]; then 19 | . auto/lib/openssl/make 20 | fi 21 | 22 | if [ $ZLIB != NONE -a $ZLIB != NO -a $ZLIB != YES ]; then 23 | . auto/lib/zlib/make 24 | fi 25 | 26 | if [ $NGX_LIBATOMIC != NO -a $NGX_LIBATOMIC != YES ]; then 27 | . auto/lib/libatomic/make 28 | fi 29 | 30 | if [ $USE_PERL = YES ]; then 31 | . auto/lib/perl/make 32 | fi 33 | -------------------------------------------------------------------------------- /src/core/ngx_crc.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_CRC_H_INCLUDED_ 9 | #define _NGX_CRC_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | /* 32-bit crc16 */ 17 | 18 | static ngx_inline uint32_t 19 | ngx_crc(u_char *data, size_t len) 20 | { 21 | uint32_t sum; 22 | 23 | for (sum = 0; len; len--) { 24 | 25 | /* 26 | * gcc 2.95.2 x86 and icc 7.1.006 compile 27 | * that operator into the single "rol" opcode, 28 | * msvc 6.0sp2 compiles it into four opcodes. 29 | */ 30 | sum = sum >> 1 | sum << 31; 31 | 32 | sum += *data++; 33 | } 34 | 35 | return sum; 36 | } 37 | 38 | 39 | #endif /* _NGX_CRC_H_INCLUDED_ */ 40 | -------------------------------------------------------------------------------- /auto/types/uintptr_t: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | echo $ngx_n "checking for uintptr_t ...$ngx_c" 7 | echo >> $NGX_ERR 8 | echo "checking for uintptr_t" >> $NGX_ERR 9 | 10 | found=no 11 | 12 | cat << END > $NGX_AUTOTEST.c 13 | 14 | #include 15 | $NGX_INTTYPES_H 16 | 17 | int main() { 18 | uintptr_t i = 0; 19 | return 0; 20 | } 21 | 22 | END 23 | 24 | eval "$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c >> $NGX_ERR 2>&1" 25 | 26 | if [ -x $NGX_AUTOTEST ]; then 27 | echo " uintptr_t found" 28 | found=yes 29 | else 30 | echo $ngx_n " uintptr_t not found" $ngx_c 31 | fi 32 | 33 | rm $NGX_AUTOTEST* 34 | 35 | 36 | if [ $found = no ]; then 37 | found="uint`expr 8 \* $ngx_ptr_size`_t" 38 | echo ", $found used" 39 | 40 | echo "typedef $found uintptr_t;" >> $NGX_AUTO_CONFIG_H 41 | echo "typedef $found intptr_t;" | sed -e 's/u//g' >> $NGX_AUTO_CONFIG_H 42 | fi 43 | -------------------------------------------------------------------------------- /src/core/ngx_murmurhash.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Austin Appleby 4 | */ 5 | 6 | 7 | #include 8 | #include 9 | 10 | //直接使用该函数就可以得到该算法的摘要 11 | uint32_t 12 | ngx_murmur_hash2(u_char *data, size_t len) 13 | { 14 | uint32_t h, k; 15 | 16 | h = 0 ^ len; 17 | 18 | while (len >= 4) { 19 | k = data[0]; 20 | k |= data[1] << 8; 21 | k |= data[2] << 16; 22 | k |= data[3] << 24; 23 | 24 | k *= 0x5bd1e995; 25 | k ^= k >> 24; 26 | k *= 0x5bd1e995; 27 | 28 | h *= 0x5bd1e995; 29 | h ^= k; 30 | 31 | data += 4; 32 | len -= 4; 33 | } 34 | 35 | switch (len) { 36 | case 3: 37 | h ^= data[2] << 16; 38 | case 2: 39 | h ^= data[1] << 8; 40 | case 1: 41 | h ^= data[0]; 42 | h *= 0x5bd1e995; 43 | } 44 | 45 | h ^= h >> 13; 46 | h *= 0x5bd1e995; 47 | h ^= h >> 15; 48 | 49 | return h; 50 | } 51 | -------------------------------------------------------------------------------- /auto/init: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | NGX_MAKEFILE=$NGX_OBJS/Makefile 7 | NGX_MODULES_C=$NGX_OBJS/ngx_modules.c 8 | 9 | NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h 10 | NGX_AUTO_CONFIG_H=$NGX_OBJS/ngx_auto_config.h 11 | 12 | NGX_AUTOTEST=$NGX_OBJS/autotest 13 | NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err 14 | 15 | # STUBs 16 | NGX_ERR=$NGX_OBJS/autoconf.err 17 | MAKEFILE=$NGX_OBJS/Makefile 18 | 19 | 20 | NGX_PCH= 21 | NGX_USE_PCH= 22 | 23 | 24 | # check the echo's "-n" option and "\c" capability 25 | 26 | if echo "test\c" | grep c >/dev/null; then 27 | 28 | if echo -n test | grep n >/dev/null; then 29 | ngx_n= 30 | ngx_c= 31 | 32 | else 33 | ngx_n=-n 34 | ngx_c= 35 | fi 36 | 37 | else 38 | ngx_n= 39 | ngx_c='\c' 40 | fi 41 | 42 | 43 | # create Makefile 44 | 45 | cat << END > Makefile 46 | 47 | default: build 48 | 49 | clean: 50 | rm -rf Makefile $NGX_OBJS 51 | END 52 | -------------------------------------------------------------------------------- /src/os/unix/ngx_sunpro_sparc64.il: -------------------------------------------------------------------------------- 1 | / 2 | / Copyright (C) Igor Sysoev 3 | / Copyright (C) Nginx, Inc. 4 | / 5 | 6 | 7 | / "casa [%o2] 0x80, %o1, %o0" and 8 | / "casxa [%o2] 0x80, %o1, %o0" do the following: 9 | / 10 | / if ([%o2] == %o1) { 11 | / swap(%o0, [%o2]); 12 | / } else { 13 | / %o0 = [%o2]; 14 | / } 15 | 16 | 17 | / ngx_atomic_uint_t ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, 18 | / ngx_atomic_t *lock); 19 | / 20 | / the arguments are passed in the %o0, %o1, %o2 21 | / the result is returned in the %o0 22 | 23 | .inline ngx_casa,0 24 | casa [%o2] 0x80, %o1, %o0 25 | .end 26 | 27 | 28 | / ngx_atomic_uint_t ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, 29 | / ngx_atomic_t *lock); 30 | / 31 | / the arguments are passed in the %o0, %o1, %o2 32 | / the result is returned in the %o0 33 | 34 | .inline ngx_casxa,0 35 | casxa [%o2] 0x80, %o1, %o0 36 | .end 37 | -------------------------------------------------------------------------------- /src/mail/ngx_mail_pop3_module.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_MAIL_POP3_MODULE_H_INCLUDED_ 9 | #define _NGX_MAIL_POP3_MODULE_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | 17 | typedef struct { 18 | ngx_str_t capability; 19 | ngx_str_t starttls_capability; 20 | ngx_str_t starttls_only_capability; 21 | ngx_str_t auth_capability; 22 | 23 | ngx_uint_t auth_methods; 24 | 25 | ngx_array_t capabilities; 26 | } ngx_mail_pop3_srv_conf_t; 27 | 28 | 29 | void ngx_mail_pop3_init_session(ngx_mail_session_t *s, ngx_connection_t *c); 30 | void ngx_mail_pop3_init_protocol(ngx_event_t *rev); 31 | void ngx_mail_pop3_auth_state(ngx_event_t *rev); 32 | ngx_int_t ngx_mail_pop3_parse_command(ngx_mail_session_t *s); 33 | 34 | 35 | extern ngx_module_t ngx_mail_pop3_module; 36 | 37 | 38 | #endif /* _NGX_MAIL_POP3_MODULE_H_INCLUDED_ */ 39 | -------------------------------------------------------------------------------- /conf/fastcgi_params: -------------------------------------------------------------------------------- 1 | 2 | fastcgi_param QUERY_STRING $query_string; 3 | fastcgi_param REQUEST_METHOD $request_method; 4 | fastcgi_param CONTENT_TYPE $content_type; 5 | fastcgi_param CONTENT_LENGTH $content_length; 6 | 7 | fastcgi_param SCRIPT_NAME $fastcgi_script_name; 8 | fastcgi_param REQUEST_URI $request_uri; 9 | fastcgi_param DOCUMENT_URI $document_uri; 10 | fastcgi_param DOCUMENT_ROOT $document_root; 11 | fastcgi_param SERVER_PROTOCOL $server_protocol; 12 | 13 | fastcgi_param GATEWAY_INTERFACE CGI/1.1; 14 | fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; 15 | 16 | fastcgi_param REMOTE_ADDR $remote_addr; 17 | fastcgi_param REMOTE_PORT $remote_port; 18 | fastcgi_param SERVER_ADDR $server_addr; 19 | fastcgi_param SERVER_PORT $server_port; 20 | fastcgi_param SERVER_NAME $server_name; 21 | 22 | # PHP only, required if PHP was built with --enable-force-cgi-redirect 23 | fastcgi_param REDIRECT_STATUS 200; 24 | -------------------------------------------------------------------------------- /src/mail/ngx_mail_imap_module.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_MAIL_IMAP_MODULE_H_INCLUDED_ 9 | #define _NGX_MAIL_IMAP_MODULE_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | 17 | typedef struct { 18 | size_t client_buffer_size; 19 | 20 | ngx_str_t capability; 21 | ngx_str_t starttls_capability; 22 | ngx_str_t starttls_only_capability; 23 | 24 | ngx_uint_t auth_methods; 25 | 26 | ngx_array_t capabilities; 27 | } ngx_mail_imap_srv_conf_t; 28 | 29 | 30 | void ngx_mail_imap_init_session(ngx_mail_session_t *s, ngx_connection_t *c); 31 | void ngx_mail_imap_init_protocol(ngx_event_t *rev); 32 | void ngx_mail_imap_auth_state(ngx_event_t *rev); 33 | ngx_int_t ngx_mail_imap_parse_command(ngx_mail_session_t *s); 34 | 35 | 36 | extern ngx_module_t ngx_mail_imap_module; 37 | 38 | 39 | #endif /* _NGX_MAIL_IMAP_MODULE_H_INCLUDED_ */ 40 | -------------------------------------------------------------------------------- /auto/endianess: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | echo $ngx_n "checking for system endianess ...$ngx_c" 7 | echo >> $NGX_ERR 8 | echo "checking for system endianess" >> $NGX_ERR 9 | 10 | 11 | cat << END > $NGX_AUTOTEST.c 12 | 13 | int main() { 14 | int i = 0x11223344; 15 | char *p; 16 | 17 | p = (char *) &i; 18 | if (*p == 0x44) return 0; 19 | return 1; 20 | } 21 | 22 | END 23 | 24 | ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \ 25 | -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs" 26 | 27 | eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" 28 | 29 | if [ -x $NGX_AUTOTEST ]; then 30 | if $NGX_AUTOTEST >/dev/null 2>&1; then 31 | echo " little endianess" 32 | have=NGX_HAVE_LITTLE_ENDIAN . auto/have 33 | else 34 | echo " big endianess" 35 | fi 36 | 37 | rm $NGX_AUTOTEST* 38 | 39 | else 40 | rm $NGX_AUTOTEST* 41 | 42 | echo 43 | echo "$0: error: can not detect system endianess" 44 | exit 1 45 | fi 46 | -------------------------------------------------------------------------------- /auto/lib/google-perftools/conf: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | ngx_feature="Google perftools" 7 | ngx_feature_name= 8 | ngx_feature_run=no 9 | ngx_feature_incs= 10 | ngx_feature_path= 11 | ngx_feature_libs="-lprofiler" 12 | ngx_feature_test="ProfilerStop()" 13 | . auto/feature 14 | 15 | 16 | if [ $ngx_found = no ]; then 17 | 18 | # FreeBSD port 19 | 20 | ngx_feature="Google perftools in /usr/local/" 21 | 22 | if [ $NGX_RPATH = YES ]; then 23 | ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lprofiler" 24 | else 25 | ngx_feature_libs="-L/usr/local/lib -lprofiler" 26 | fi 27 | 28 | . auto/feature 29 | fi 30 | 31 | 32 | if [ $ngx_found = yes ]; then 33 | CORE_LIBS="$CORE_LIBS $ngx_feature_libs" 34 | 35 | else 36 | 37 | cat << END 38 | 39 | $0: error: the Google perftool module requires the Google perftools 40 | library. You can either do not enable the module or install the library. 41 | 42 | END 43 | 44 | exit 1 45 | fi 46 | -------------------------------------------------------------------------------- /conf/fastcgi.conf: -------------------------------------------------------------------------------- 1 | 2 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 3 | fastcgi_param QUERY_STRING $query_string; 4 | fastcgi_param REQUEST_METHOD $request_method; 5 | fastcgi_param CONTENT_TYPE $content_type; 6 | fastcgi_param CONTENT_LENGTH $content_length; 7 | 8 | fastcgi_param SCRIPT_NAME $fastcgi_script_name; 9 | fastcgi_param REQUEST_URI $request_uri; 10 | fastcgi_param DOCUMENT_URI $document_uri; 11 | fastcgi_param DOCUMENT_ROOT $document_root; 12 | fastcgi_param SERVER_PROTOCOL $server_protocol; 13 | 14 | fastcgi_param GATEWAY_INTERFACE CGI/1.1; 15 | fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; 16 | 17 | fastcgi_param REMOTE_ADDR $remote_addr; 18 | fastcgi_param REMOTE_PORT $remote_port; 19 | fastcgi_param SERVER_ADDR $server_addr; 20 | fastcgi_param SERVER_PORT $server_port; 21 | fastcgi_param SERVER_NAME $server_name; 22 | 23 | # PHP only, required if PHP was built with --enable-force-cgi-redirect 24 | fastcgi_param REDIRECT_STATUS 200; 25 | -------------------------------------------------------------------------------- /src/mail/ngx_mail_smtp_module.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_MAIL_SMTP_MODULE_H_INCLUDED_ 9 | #define _NGX_MAIL_SMTP_MODULE_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | 18 | typedef struct { 19 | ngx_msec_t greeting_delay; 20 | 21 | size_t client_buffer_size; 22 | 23 | ngx_str_t capability; 24 | ngx_str_t starttls_capability; 25 | ngx_str_t starttls_only_capability; 26 | 27 | ngx_str_t server_name; 28 | ngx_str_t greeting; 29 | 30 | ngx_uint_t auth_methods; 31 | 32 | ngx_array_t capabilities; 33 | } ngx_mail_smtp_srv_conf_t; 34 | 35 | 36 | void ngx_mail_smtp_init_session(ngx_mail_session_t *s, ngx_connection_t *c); 37 | void ngx_mail_smtp_init_protocol(ngx_event_t *rev); 38 | void ngx_mail_smtp_auth_state(ngx_event_t *rev); 39 | ngx_int_t ngx_mail_smtp_parse_command(ngx_mail_session_t *s); 40 | 41 | 42 | extern ngx_module_t ngx_mail_smtp_module; 43 | 44 | 45 | #endif /* _NGX_MAIL_SMTP_MODULE_H_INCLUDED_ */ 46 | -------------------------------------------------------------------------------- /src/os/unix/ngx_channel.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_CHANNEL_H_INCLUDED_ 9 | #define _NGX_CHANNEL_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | //nginx对进程间消息的封装结构体 16 | //master和worker之间传递的指令。master和worker是单向的,只能master向worker传递指令 17 | typedef struct { 18 | ngx_uint_t command; //worker要操作的指令,如NGX_CMD_OPEN_CHANNEL,NGX_CMD_CLOSE_CHANNEL,NGX_CMD_QUIT,NGX_CMD_TERMINATE,NGX_CMD_REOPEN 19 | ngx_pid_t pid; //worker进程id 20 | ngx_int_t slot; //worker进程在ngx_process中的索引 21 | ngx_fd_t fd; //有可能用到的文件描述符? 22 | } ngx_channel_t; 23 | 24 | 25 | ngx_int_t ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, 26 | ngx_log_t *log); 27 | ngx_int_t ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, 28 | ngx_log_t *log); 29 | ngx_int_t ngx_add_channel_event(ngx_cycle_t *cycle, ngx_fd_t fd, 30 | ngx_int_t event, ngx_event_handler_pt handler); 31 | void ngx_close_channel(ngx_fd_t *fd, ngx_log_t *log); 32 | 33 | 34 | #endif /* _NGX_CHANNEL_H_INCLUDED_ */ 35 | -------------------------------------------------------------------------------- /src/mail/ngx_mail_ssl_module.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_MAIL_SSL_H_INCLUDED_ 9 | #define _NGX_MAIL_SSL_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | 17 | #define NGX_MAIL_STARTTLS_OFF 0 18 | #define NGX_MAIL_STARTTLS_ON 1 19 | #define NGX_MAIL_STARTTLS_ONLY 2 20 | 21 | 22 | typedef struct { 23 | ngx_flag_t enable; 24 | ngx_flag_t prefer_server_ciphers; 25 | 26 | ngx_ssl_t ssl; 27 | 28 | ngx_uint_t starttls; 29 | ngx_uint_t protocols; 30 | 31 | ssize_t builtin_session_cache; 32 | 33 | time_t session_timeout; 34 | 35 | ngx_str_t certificate; 36 | ngx_str_t certificate_key; 37 | ngx_str_t dhparam; 38 | ngx_str_t ecdh_curve; 39 | 40 | ngx_str_t ciphers; 41 | 42 | ngx_shm_zone_t *shm_zone; 43 | 44 | u_char *file; 45 | ngx_uint_t line; 46 | } ngx_mail_ssl_conf_t; 47 | 48 | 49 | extern ngx_module_t ngx_mail_ssl_module; 50 | 51 | 52 | #endif /* _NGX_MAIL_SSL_H_INCLUDED_ */ 53 | -------------------------------------------------------------------------------- /src/os/unix/ngx_setproctitle.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_SETPROCTITLE_H_INCLUDED_ 9 | #define _NGX_SETPROCTITLE_H_INCLUDED_ 10 | 11 | 12 | #if (NGX_HAVE_SETPROCTITLE) 13 | 14 | /* FreeBSD, NetBSD, OpenBSD */ 15 | 16 | #define ngx_init_setproctitle(log) 17 | #define ngx_setproctitle(title) setproctitle("%s", title) 18 | 19 | 20 | #else /* !NGX_HAVE_SETPROCTITLE */ 21 | 22 | #if !defined NGX_SETPROCTITLE_USES_ENV 23 | 24 | #if (NGX_SOLARIS) 25 | 26 | #define NGX_SETPROCTITLE_USES_ENV 1 27 | #define NGX_SETPROCTITLE_PAD ' ' 28 | 29 | ngx_int_t ngx_init_setproctitle(ngx_log_t *log); 30 | void ngx_setproctitle(char *title); 31 | 32 | #elif (NGX_LINUX) || (NGX_DARWIN) 33 | 34 | #define NGX_SETPROCTITLE_USES_ENV 1 35 | #define NGX_SETPROCTITLE_PAD '\0' 36 | 37 | ngx_int_t ngx_init_setproctitle(ngx_log_t *log); 38 | void ngx_setproctitle(char *title); 39 | 40 | #else 41 | 42 | #define ngx_init_setproctitle(log) 43 | #define ngx_setproctitle(title) 44 | 45 | #endif /* OSes */ 46 | 47 | #endif /* NGX_SETPROCTITLE_USES_ENV */ 48 | 49 | #endif /* NGX_HAVE_SETPROCTITLE */ 50 | 51 | 52 | #endif /* _NGX_SETPROCTITLE_H_INCLUDED_ */ 53 | -------------------------------------------------------------------------------- /src/core/ngx_md5.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_MD5_H_INCLUDED_ 9 | #define _NGX_MD5_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | #if (NGX_HAVE_MD5) 17 | 18 | #if (NGX_HAVE_OPENSSL_MD5_H) 19 | #include 20 | #else 21 | #include 22 | #endif 23 | 24 | 25 | typedef MD5_CTX ngx_md5_t; 26 | 27 | 28 | #if (NGX_OPENSSL_MD5) 29 | 30 | #define ngx_md5_init MD5_Init 31 | #define ngx_md5_update MD5_Update 32 | #define ngx_md5_final MD5_Final 33 | 34 | #else 35 | 36 | #define ngx_md5_init MD5Init 37 | #define ngx_md5_update MD5Update 38 | #define ngx_md5_final MD5Final 39 | 40 | #endif 41 | 42 | 43 | #else /* !NGX_HAVE_MD5 */ 44 | 45 | 46 | typedef struct { 47 | uint64_t bytes; 48 | uint32_t a, b, c, d; 49 | u_char buffer[64]; 50 | } ngx_md5_t; 51 | 52 | 53 | void ngx_md5_init(ngx_md5_t *ctx); //初始化ngx_md5_t变量 54 | void ngx_md5_update(ngx_md5_t *ctx, const void *data, size_t size); //输入数据"data",和长度"size" 55 | void ngx_md5_final(u_char result[16], ngx_md5_t *ctx); //输出MD5值 56 | 57 | 58 | #endif 59 | 60 | #endif /* _NGX_MD5_H_INCLUDED_ */ 61 | -------------------------------------------------------------------------------- /src/os/unix/ngx_alloc.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_ALLOC_H_INCLUDED_ 9 | #define _NGX_ALLOC_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | //使用malloc分配内存空间 16 | void *ngx_alloc(size_t size, ngx_log_t *log); 17 | 18 | //使用malloc分配内存空间,并且将空间内容初始化为0 19 | void *ngx_calloc(size_t size, ngx_log_t *log); 20 | 21 | #define ngx_free free 22 | 23 | 24 | /* 25 | * Linux has memalign() or posix_memalign() 26 | * Solaris has memalign() 27 | * FreeBSD 7.0 has posix_memalign(), besides, early version's malloc() 28 | * aligns allocations bigger than page size at the page boundary 29 | */ 30 | // 对齐,定义了宏 31 | #if (NGX_HAVE_POSIX_MEMALIGN || NGX_HAVE_MEMALIGN) 32 | 33 | void *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log); 34 | 35 | #else 36 | // 非对齐,未定义NGX_HAVE_POSIX_MEMALIGN,NGX_HAVE_MEMALIGN宏 37 | #define ngx_memalign(alignment, size, log) ngx_alloc(size, log) 38 | 39 | #endif 40 | 41 | 42 | extern ngx_uint_t ngx_pagesize; 43 | extern ngx_uint_t ngx_pagesize_shift; 44 | extern ngx_uint_t ngx_cacheline_size; 45 | 46 | 47 | #endif /* _NGX_ALLOC_H_INCLUDED_ */ 48 | -------------------------------------------------------------------------------- /src/os/unix/ngx_sunpro_amd64.il: -------------------------------------------------------------------------------- 1 | / 2 | / Copyright (C) Igor Sysoev 3 | / Copyright (C) Nginx, Inc. 4 | / 5 | 6 | / ngx_atomic_uint_t ngx_atomic_cmp_set(ngx_atomic_t *lock, 7 | / ngx_atomic_uint_t old, ngx_atomic_uint_t set); 8 | / 9 | / the arguments are passed in %rdi, %rsi, %rdx 10 | / the result is returned in the %rax 11 | 12 | .inline ngx_atomic_cmp_set,0 13 | movq %rsi, %rax 14 | lock 15 | cmpxchgq %rdx, (%rdi) 16 | setz %al 17 | movzbq %al, %rax 18 | .end 19 | 20 | 21 | / ngx_atomic_int_t ngx_atomic_fetch_add(ngx_atomic_t *value, 22 | / ngx_atomic_int_t add); 23 | / 24 | / the arguments are passed in %rdi, %rsi 25 | / the result is returned in the %rax 26 | 27 | .inline ngx_atomic_fetch_add,0 28 | movq %rsi, %rax 29 | lock 30 | xaddq %rax, (%rdi) 31 | .end 32 | 33 | 34 | / ngx_cpu_pause() 35 | / 36 | / the "rep; nop" is used instead of "pause" to avoid the "[ PAUSE ]" hardware 37 | / capability added by linker because Solaris/amd64 does not know about it: 38 | / 39 | / ld.so.1: nginx: fatal: hardware capability unsupported: 0x2000 [ PAUSE ] 40 | 41 | .inline ngx_cpu_pause,0 42 | rep; nop 43 | .end 44 | -------------------------------------------------------------------------------- /src/core/ngx_shmtx.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_SHMTX_H_INCLUDED_ 9 | #define _NGX_SHMTX_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | /*互斥锁结构 16 | ngx_shmtx_t结构涉及两个宏:NGX_HAVE_ATOMIC_OPS、NGX_HVE_POIX_SEM,这两个宏对应着互斥锁的3种不同实现。 17 | 第1种实现:当不支持原子操作时,会使用文件锁来实现ngx_hmtx_t互斥锁,这时它仅有fd和name成员。这两个成员使用上面介绍的文件锁来提供阻塞、非阻塞的互斥锁。 18 | 第2种实现,支持原子操作却又不支持信号量。 19 | 第3种实现,在支持原子操作的同时,操作系统也支持信号量。 20 | */ 21 | typedef struct { 22 | #if (NGX_HAVE_ATOMIC_OPS) 23 | //原子变量锁 24 | ngx_atomic_t *lock; 25 | #if (NGX_HAVE_POSIX_SEM) 26 | //semaphore为1 时表示获取锁将可能使用到的信号量 27 | ngx_uint_t semaphore; 28 | sem_t sem; 29 | #endif 30 | #else 31 | //使用文件锁时fd表示使用的文件句柄 32 | ngx_fd_t fd; 33 | u_char *name; // 文件名 34 | #endif 35 | //自旋次数,表示在自旋状态下等待其他处理器结果中释放的时间。由文件锁实现,spin没有任何意义 36 | ngx_uint_t spin; 37 | } ngx_shmtx_t; 38 | 39 | 40 | ngx_int_t ngx_shmtx_create(ngx_shmtx_t *mtx, void *addr, u_char *name); 41 | void ngx_shmtx_destory(ngx_shmtx_t *mtx); 42 | ngx_uint_t ngx_shmtx_trylock(ngx_shmtx_t *mtx); 43 | void ngx_shmtx_lock(ngx_shmtx_t *mtx); 44 | void ngx_shmtx_unlock(ngx_shmtx_t *mtx); 45 | 46 | 47 | #endif /* _NGX_SHMTX_H_INCLUDED_ */ 48 | -------------------------------------------------------------------------------- /auto/lib/libatomic/conf: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | if [ $NGX_LIBATOMIC != YES ]; then 7 | 8 | have=NGX_HAVE_LIBATOMIC . auto/have 9 | CORE_INCS="$CORE_INCS $NGX_LIBATOMIC/src" 10 | LINK_DEPS="$LINK_DEPS $NGX_LIBATOMIC/src/libatomic_ops.a" 11 | CORE_LIBS="$CORE_LIBS $NGX_LIBATOMIC/src/libatomic_ops.a" 12 | 13 | else 14 | 15 | ngx_feature="atomic_ops library" 16 | ngx_feature_name=NGX_HAVE_LIBATOMIC 17 | ngx_feature_run=yes 18 | ngx_feature_incs="#define AO_REQUIRE_CAS 19 | #include " 20 | ngx_feature_path= 21 | ngx_feature_libs="-latomic_ops" 22 | ngx_feature_test="long n = 0; 23 | if (!AO_compare_and_swap(&n, 0, 1)) 24 | return 1; 25 | if (AO_fetch_and_add(&n, 1) != 1) 26 | return 1; 27 | if (n != 2) 28 | return 1; 29 | AO_nop();" 30 | . auto/feature 31 | 32 | if [ $ngx_found = yes ]; then 33 | CORE_LIBS="$CORE_LIBS $ngx_feature_libs" 34 | else 35 | 36 | cat << END 37 | 38 | $0: error: libatomic_ops library was not found. 39 | 40 | END 41 | exit 1 42 | fi 43 | fi 44 | -------------------------------------------------------------------------------- /auto/lib/perl/make: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | cat << END >> $NGX_MAKEFILE 7 | 8 | $NGX_OBJS/src/http/modules/perl/blib/arch/auto/nginx/nginx.so: \ 9 | src/http/modules/perl/nginx.pm \ 10 | src/http/modules/perl/nginx.xs \ 11 | src/http/modules/perl/ngx_http_perl_module.h \ 12 | $NGX_OBJS/src/http/modules/perl/Makefile 13 | cp -p src/http/modules/perl/nginx.* $NGX_OBJS/src/http/modules/perl/ 14 | 15 | cd $NGX_OBJS/src/http/modules/perl && make 16 | 17 | rm -rf $NGX_OBJS/install_perl 18 | 19 | 20 | $NGX_OBJS/src/http/modules/perl/Makefile: \ 21 | src/http/modules/perl/Makefile.PL \ 22 | src/http/modules/perl/nginx.pm 23 | cp -p src/http/modules/perl/nginx.* $NGX_OBJS/src/http/modules/perl/ 24 | cp -p src/http/modules/perl/typemap $NGX_OBJS/src/http/modules/perl/ 25 | cp -p src/http/modules/perl/Makefile.PL $NGX_OBJS/src/http/modules/perl/ 26 | 27 | cd $NGX_OBJS/src/http/modules/perl \ 28 | && NGX_PM_CFLAGS="\$(NGX_PM_CFLAGS) -g $NGX_CC_OPT" \ 29 | NGX_PCRE=$PCRE \ 30 | NGX_OBJS=$NGX_OBJS \ 31 | NGX_OPENSSL=$OPENSSL \ 32 | $NGX_PERL Makefile.PL \ 33 | LIB=$NGX_PERL_MODULES \ 34 | INSTALLSITEMAN3DIR=$NGX_PERL_MODULES_MAN 35 | 36 | END 37 | -------------------------------------------------------------------------------- /src/core/ngx_slab.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_SLAB_H_INCLUDED_ 9 | #define _NGX_SLAB_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | typedef struct ngx_slab_page_s ngx_slab_page_t; 17 | 18 | struct ngx_slab_page_s { 19 | uintptr_t slab; 20 | ngx_slab_page_t *next; 21 | uintptr_t prev; 22 | }; 23 | 24 | 25 | typedef struct { 26 | ngx_atomic_t lock; 27 | 28 | size_t min_size; 29 | size_t min_shift; 30 | 31 | ngx_slab_page_t *pages; 32 | ngx_slab_page_t free; 33 | 34 | u_char *start; 35 | u_char *end; 36 | 37 | ngx_shmtx_t mutex; 38 | 39 | u_char *log_ctx; 40 | u_char zero; 41 | 42 | void *data; 43 | void *addr; 44 | } ngx_slab_pool_t; 45 | 46 | 47 | void ngx_slab_init(ngx_slab_pool_t *pool); 48 | void *ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size); 49 | void *ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size); 50 | void ngx_slab_free(ngx_slab_pool_t *pool, void *p); 51 | void ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p); 52 | 53 | 54 | #endif /* _NGX_SLAB_H_INCLUDED_ */ 55 | -------------------------------------------------------------------------------- /src/os/unix/ngx_sunpro_x86.il: -------------------------------------------------------------------------------- 1 | / 2 | / Copyright (C) Igor Sysoev 3 | / Copyright (C) Nginx, Inc. 4 | / 5 | 6 | / ngx_atomic_uint_t ngx_atomic_cmp_set(ngx_atomic_t *lock, 7 | / ngx_atomic_uint_t old, ngx_atomic_uint_t set); 8 | / 9 | / the arguments are passed on stack (%esp), 4(%esp), 8(%esp) 10 | 11 | .inline ngx_atomic_cmp_set,0 12 | movl (%esp), %ecx 13 | movl 4(%esp), %eax 14 | movl 8(%esp), %edx 15 | lock 16 | cmpxchgl %edx, (%ecx) 17 | setz %al 18 | movzbl %al, %eax 19 | .end 20 | 21 | 22 | / ngx_atomic_int_t ngx_atomic_fetch_add(ngx_atomic_t *value, 23 | / ngx_atomic_int_t add); 24 | / 25 | / the arguments are passed on stack (%esp), 4(%esp) 26 | 27 | .inline ngx_atomic_fetch_add,0 28 | movl (%esp), %ecx 29 | movl 4(%esp), %eax 30 | lock 31 | xaddl %eax, (%ecx) 32 | .end 33 | 34 | 35 | / ngx_cpu_pause() 36 | / 37 | / the "rep; nop" is used instead of "pause" to avoid the "[ PAUSE ]" hardware 38 | / capability added by linker because Solaris/i386 does not know about it: 39 | / 40 | / ld.so.1: nginx: fatal: hardware capability unsupported: 0x2000 [ PAUSE ] 41 | 42 | .inline ngx_cpu_pause,0 43 | rep; nop 44 | .end 45 | -------------------------------------------------------------------------------- /contrib/unicode2nginx/unicode-to-nginx.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl -w 2 | 3 | # Convert unicode mappings to nginx configuration file format. 4 | 5 | # You may find useful mappings in various places, including 6 | # unicode.org official site: 7 | # 8 | # http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT 9 | # http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT 10 | 11 | # Needs perl 5.6 or later. 12 | 13 | # Written by Maxim Dounin, mdounin@rambler-co.ru 14 | 15 | ############################################################################### 16 | 17 | require 5.006; 18 | 19 | while (<>) { 20 | # Skip comments and empty lines 21 | 22 | next if /^#/; 23 | next if /^\s*$/; 24 | chomp; 25 | 26 | # Convert mappings 27 | 28 | if (/^\s*0x(..)\s*0x(....)\s*(#.*)/) { 29 | # Mapping "#" 30 | my $cs_code = $1; 31 | my $un_code = $2; 32 | my $un_name = $3; 33 | 34 | # Produce UTF-8 sequence from character code; 35 | 36 | my $un_utf8 = join('', map { sprintf("%02X", $_) } unpack("C*", pack("U", hex($un_code)))); 37 | 38 | print " $cs_code $un_utf8 ; $un_name\n"; 39 | 40 | } else { 41 | warn "Unrecognized line: '$_'"; 42 | } 43 | } 44 | 45 | ############################################################################### 46 | -------------------------------------------------------------------------------- /auto/include: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | echo $ngx_n "checking for $ngx_include ...$ngx_c" 7 | 8 | cat << END >> $NGX_AUTOCONF_ERR 9 | 10 | ---------------------------------------- 11 | checking for $ngx_include 12 | 13 | END 14 | 15 | 16 | ngx_found=no 17 | 18 | cat << END > $NGX_AUTOTEST.c 19 | 20 | $NGX_INCLUDE_SYS_PARAM_H 21 | #include <$ngx_include> 22 | 23 | int main() { 24 | return 0; 25 | } 26 | 27 | END 28 | 29 | 30 | ngx_test="$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c" 31 | 32 | eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" 33 | 34 | if [ -x $NGX_AUTOTEST ]; then 35 | 36 | ngx_found=yes 37 | 38 | echo " found" 39 | 40 | ngx_name=`echo $ngx_include \ 41 | | tr abcdefghijklmnopqrstuvwxyz/. ABCDEFGHIJKLMNOPQRSTUVWXYZ__` 42 | 43 | 44 | have=NGX_HAVE_$ngx_name . auto/have_headers 45 | 46 | eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'" 47 | 48 | #STUB 49 | eval "NGX_$ngx_name='#include <$ngx_include>'" 50 | 51 | else 52 | echo " not found" 53 | 54 | echo "----------" >> $NGX_AUTOCONF_ERR 55 | cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR 56 | echo "----------" >> $NGX_AUTOCONF_ERR 57 | echo $ngx_test >> $NGX_AUTOCONF_ERR 58 | echo "----------" >> $NGX_AUTOCONF_ERR 59 | fi 60 | 61 | rm $NGX_AUTOTEST* 62 | -------------------------------------------------------------------------------- /src/core/ngx_times.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_TIMES_H_INCLUDED_ 9 | #define _NGX_TIMES_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | typedef struct { 17 | time_t sec; 18 | ngx_uint_t msec; 19 | ngx_int_t gmtoff; 20 | } ngx_time_t; 21 | 22 | 23 | void ngx_time_init(void); 24 | void ngx_time_update(void); 25 | void ngx_time_sigsafe_update(void); 26 | u_char *ngx_http_time(u_char *buf, time_t t); 27 | u_char *ngx_http_cookie_time(u_char *buf, time_t t); 28 | void ngx_gmtime(time_t t, ngx_tm_t *tp); 29 | 30 | time_t ngx_next_time(time_t when); 31 | #define ngx_next_time_n "mktime()" 32 | 33 | 34 | extern volatile ngx_time_t *ngx_cached_time; 35 | 36 | #define ngx_time() ngx_cached_time->sec 37 | #define ngx_timeofday() (ngx_time_t *) ngx_cached_time 38 | 39 | extern volatile ngx_str_t ngx_cached_err_log_time; 40 | extern volatile ngx_str_t ngx_cached_http_time; 41 | extern volatile ngx_str_t ngx_cached_http_log_time; 42 | extern volatile ngx_str_t ngx_cached_http_log_iso8601; 43 | 44 | /* 45 | * milliseconds elapsed since epoch and truncated to ngx_msec_t, 46 | * used in event timers 47 | */ 48 | extern volatile ngx_msec_t ngx_current_msec; 49 | 50 | 51 | #endif /* _NGX_TIMES_H_INCLUDED_ */ 52 | -------------------------------------------------------------------------------- /src/core/ngx_regex.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_REGEX_H_INCLUDED_ 9 | #define _NGX_REGEX_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | #include 16 | 17 | 18 | #define NGX_REGEX_NO_MATCHED PCRE_ERROR_NOMATCH /* -1 */ 19 | 20 | #define NGX_REGEX_CASELESS PCRE_CASELESS 21 | 22 | typedef pcre ngx_regex_t; 23 | 24 | 25 | typedef struct { 26 | ngx_str_t pattern; 27 | ngx_pool_t *pool; 28 | ngx_int_t options; 29 | 30 | ngx_regex_t *regex; 31 | int captures; 32 | int named_captures; 33 | int name_size; 34 | u_char *names; 35 | ngx_str_t err; 36 | } ngx_regex_compile_t; 37 | 38 | 39 | typedef struct { 40 | ngx_regex_t *regex; 41 | u_char *name; 42 | } ngx_regex_elt_t; 43 | 44 | 45 | void ngx_regex_init(void); 46 | ngx_int_t ngx_regex_compile(ngx_regex_compile_t *rc); 47 | 48 | #define ngx_regex_exec(re, s, captures, size) \ 49 | pcre_exec(re, NULL, (const char *) (s)->data, (s)->len, 0, 0, \ 50 | captures, size) 51 | #define ngx_regex_exec_n "pcre_exec()" 52 | 53 | ngx_int_t ngx_regex_exec_array(ngx_array_t *a, ngx_str_t *s, ngx_log_t *log); 54 | 55 | 56 | #endif /* _NGX_REGEX_H_INCLUDED_ */ 57 | -------------------------------------------------------------------------------- /src/os/unix/rfork_thread.S: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | /* 12 | * rfork_thread(3) - rfork_thread(flags, stack, func, arg); 13 | */ 14 | 15 | #define KERNCALL int $0x80 16 | 17 | ENTRY(rfork_thread) 18 | push %ebp 19 | mov %esp, %ebp 20 | push %esi 21 | 22 | mov 12(%ebp), %esi # the thread stack address 23 | 24 | sub $4, %esi 25 | mov 20(%ebp), %eax # the thread argument 26 | mov %eax, (%esi) 27 | 28 | sub $4, %esi 29 | mov 16(%ebp), %eax # the thread start address 30 | mov %eax, (%esi) 31 | 32 | push 8(%ebp) # rfork(2) flags 33 | push $0 34 | mov $SYS_rfork, %eax 35 | KERNCALL 36 | jc error 37 | 38 | cmp $0, %edx 39 | jne child 40 | 41 | parent: 42 | add $8, %esp 43 | pop %esi 44 | leave 45 | ret 46 | 47 | child: 48 | mov %esi, %esp 49 | pop %eax 50 | call *%eax # call a thread start address ... 51 | add $4, %esp 52 | 53 | push %eax 54 | push $0 55 | mov $SYS_exit, %eax # ... and exit(2) after a thread would return 56 | KERNCALL 57 | 58 | error: 59 | add $8, %esp 60 | pop %esi 61 | leave 62 | PIC_PROLOGUE 63 | 64 | /* libc's cerror: jmp PIC_PLT(HIDENAME(cerror)) */ 65 | 66 | push %eax 67 | call PIC_PLT(CNAME(__error)) 68 | pop %ecx 69 | PIC_EPILOGUE 70 | mov %ecx, (%eax) 71 | mov $-1, %eax 72 | mov $-1, %edx 73 | ret 74 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2002-2012 Igor Sysoev 3 | * Copyright (C) 2011,2012 Nginx, Inc. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions 7 | * are met: 8 | * 1. Redistributions of source code must retain the above copyright 9 | * notice, this list of conditions and the following disclaimer. 10 | * 2. Redistributions in binary form must reproduce the above copyright 11 | * notice, this list of conditions and the following disclaimer in the 12 | * documentation and/or other materials provided with the distribution. 13 | * 14 | * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 | * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 18 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 | * SUCH DAMAGE. 25 | */ 26 | -------------------------------------------------------------------------------- /src/http/modules/ngx_http_ssl_module.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_HTTP_SSL_H_INCLUDED_ 9 | #define _NGX_HTTP_SSL_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | 17 | typedef struct { 18 | ngx_flag_t enable; 19 | 20 | ngx_ssl_t ssl; 21 | 22 | ngx_flag_t prefer_server_ciphers; 23 | 24 | ngx_uint_t protocols; 25 | 26 | ngx_uint_t verify; 27 | ngx_uint_t verify_depth; 28 | 29 | ssize_t builtin_session_cache; 30 | 31 | time_t session_timeout; 32 | 33 | ngx_str_t certificate; 34 | ngx_str_t certificate_key; 35 | ngx_str_t dhparam; 36 | ngx_str_t ecdh_curve; 37 | ngx_str_t client_certificate; 38 | ngx_str_t crl; 39 | 40 | ngx_str_t ciphers; 41 | 42 | ngx_shm_zone_t *shm_zone; 43 | 44 | u_char *file; 45 | ngx_uint_t line; 46 | } ngx_http_ssl_srv_conf_t; 47 | 48 | 49 | extern ngx_module_t ngx_http_ssl_module; 50 | 51 | 52 | #endif /* _NGX_HTTP_SSL_H_INCLUDED_ */ 53 | -------------------------------------------------------------------------------- /contrib/geo2nginx.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl -w 2 | 3 | # (c) Andrei Nigmatulin, 2005 4 | # 5 | # this script provided "as is", without any warranties. use it at your own risk. 6 | # 7 | # special thanx to Andrew Sitnikov for perl port 8 | # 9 | # this script converts CSV geoip database (free download at http://www.maxmind.com/app/geoip_country) 10 | # to format, suitable for use with nginx_http_geo module (http://sysoev.ru/nginx) 11 | # 12 | # for example, line with ip range 13 | # 14 | # "62.16.68.0","62.16.127.255","1041253376","1041268735","RU","Russian Federation" 15 | # 16 | # will be converted to four subnetworks: 17 | # 18 | # 62.16.68.0/22 RU; 19 | # 62.16.72.0/21 RU; 20 | # 62.16.80.0/20 RU; 21 | # 62.16.96.0/19 RU; 22 | 23 | 24 | use warnings; 25 | use strict; 26 | 27 | while( ){ 28 | if (/"[^"]+","[^"]+","([^"]+)","([^"]+)","([^"]+)"/){ 29 | print_subnets($1, $2, $3); 30 | } 31 | } 32 | 33 | sub print_subnets { 34 | my ($a1, $a2, $c) = @_; 35 | my $l; 36 | while ($a1 <= $a2) { 37 | for ($l = 0; ($a1 & (1 << $l)) == 0 && ($a1 + ((1 << ($l + 1)) - 1)) <= $a2; $l++){}; 38 | print long2ip($a1) . "/" . (32 - $l) . " " . $c . ";\n"; 39 | $a1 += (1 << $l); 40 | } 41 | } 42 | 43 | sub long2ip { 44 | my $ip = shift; 45 | 46 | my $str = 0; 47 | 48 | $str = ($ip & 255); 49 | 50 | $ip >>= 8; 51 | $str = ($ip & 255).".$str"; 52 | 53 | $ip >>= 8; 54 | $str = ($ip & 255).".$str"; 55 | 56 | $ip >>= 8; 57 | $str = ($ip & 255).".$str"; 58 | } 59 | -------------------------------------------------------------------------------- /auto/cc/ccc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | # Compaq C V6.5-207 7 | 8 | ngx_include_opt="-I" 9 | 10 | # warnings 11 | 12 | CFLAGS="$CFLAGS -msg_enable level6 -msg_fatal level6" 13 | 14 | CFLAGS="$CFLAGS -msg_disable unknownmacro" 15 | CFLAGS="$CFLAGS -msg_disable unusedincl" 16 | CFLAGS="$CFLAGS -msg_disable unnecincl" 17 | CFLAGS="$CFLAGS -msg_disable nestincl" 18 | CFLAGS="$CFLAGS -msg_disable strctpadding" 19 | CFLAGS="$CFLAGS -msg_disable ansialiascast" 20 | CFLAGS="$CFLAGS -msg_disable inlinestoclsmod" 21 | CFLAGS="$CFLAGS -msg_disable cxxkeyword" 22 | CFLAGS="$CFLAGS -msg_disable longlongsufx" 23 | CFLAGS="$CFLAGS -msg_disable valuepres" 24 | 25 | # STUB 26 | CFLAGS="$CFLAGS -msg_disable truncintcast" 27 | CFLAGS="$CFLAGS -msg_disable trunclongcast" 28 | 29 | CFLAGS="$CFLAGS -msg_disable truncintasn" 30 | CFLAGS="$CFLAGS -msg_disable trunclongint" 31 | CFLAGS="$CFLAGS -msg_disable intconcastsgn" 32 | CFLAGS="$CFLAGS -msg_disable intconstsign" 33 | CFLAGS="$CFLAGS -msg_disable switchlong" 34 | CFLAGS="$CFLAGS -msg_disable subscrbounds2" 35 | 36 | CFLAGS="$CFLAGS -msg_disable hexoctunsign" 37 | 38 | CFLAGS="$CFLAGS -msg_disable ignorecallval" 39 | CFLAGS="$CFLAGS -msg_disable nonstandcast" 40 | CFLAGS="$CFLAGS -msg_disable embedcomment" 41 | CFLAGS="$CFLAGS -msg_disable unreachcode" 42 | CFLAGS="$CFLAGS -msg_disable questcompare2" 43 | CFLAGS="$CFLAGS -msg_disable unusedtop" 44 | CFLAGS="$CFLAGS -msg_disable unrefdecl" 45 | 46 | CFLAGS="$CFLAGS -msg_disable bitnotint" 47 | -------------------------------------------------------------------------------- /src/http/ngx_http_busy_lock.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_HTTP_BUSY_LOCK_H_INCLUDED_ 9 | #define _NGX_HTTP_BUSY_LOCK_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | 18 | typedef struct { 19 | u_char *md5_mask; 20 | char *md5; 21 | int cacheable; 22 | 23 | int busy; 24 | int max_busy; 25 | 26 | int waiting; 27 | int max_waiting; 28 | 29 | time_t timeout; 30 | 31 | ngx_event_mutex_t *mutex; 32 | } ngx_http_busy_lock_t; 33 | 34 | 35 | typedef struct { 36 | time_t time; 37 | ngx_event_t *event; 38 | void (*event_handler)(ngx_event_t *ev); 39 | u_char *md5; 40 | int slot; 41 | } ngx_http_busy_lock_ctx_t; 42 | 43 | 44 | int ngx_http_busy_lock(ngx_http_busy_lock_t *bl, ngx_http_busy_lock_ctx_t *bc); 45 | int ngx_http_busy_lock_cacheable(ngx_http_busy_lock_t *bl, 46 | ngx_http_busy_lock_ctx_t *bc, int lock); 47 | void ngx_http_busy_unlock(ngx_http_busy_lock_t *bl, 48 | ngx_http_busy_lock_ctx_t *bc); 49 | 50 | char *ngx_http_set_busy_lock_slot(ngx_conf_t *cf, ngx_command_t *cmd, 51 | void *conf); 52 | 53 | 54 | #endif /* _NGX_HTTP_BUSY_LOCK_H_INCLUDED_ */ 55 | -------------------------------------------------------------------------------- /src/os/unix/ngx_sunpro_atomic_sparc64.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #if (NGX_PTR_SIZE == 4) 9 | #define NGX_CASA ngx_casa 10 | #else 11 | #define NGX_CASA ngx_casxa 12 | #endif 13 | 14 | 15 | ngx_atomic_uint_t 16 | ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock); 17 | 18 | ngx_atomic_uint_t 19 | ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock); 20 | 21 | /* the code in src/os/unix/ngx_sunpro_sparc64.il */ 22 | 23 | 24 | static ngx_inline ngx_atomic_uint_t 25 | ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, 26 | ngx_atomic_uint_t set) 27 | { 28 | set = NGX_CASA(set, old, lock); 29 | 30 | return (set == old); 31 | } 32 | 33 | 34 | static ngx_inline ngx_atomic_int_t 35 | ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) 36 | { 37 | ngx_atomic_uint_t old, res; 38 | 39 | old = *value; 40 | 41 | for ( ;; ) { 42 | 43 | res = old + add; 44 | 45 | res = NGX_CASA(res, old, value); 46 | 47 | if (res == old) { 48 | return res; 49 | } 50 | 51 | old = res; 52 | } 53 | } 54 | 55 | 56 | #define ngx_memory_barrier() \ 57 | __asm (".volatile"); \ 58 | __asm ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad"); \ 59 | __asm (".nonvolatile") 60 | 61 | #define ngx_cpu_pause() 62 | -------------------------------------------------------------------------------- /src/os/unix/ngx_socket.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_SOCKET_H_INCLUDED_ 9 | #define _NGX_SOCKET_H_INCLUDED_ 10 | 11 | 12 | #include 13 | 14 | 15 | #define NGX_WRITE_SHUTDOWN SHUT_WR 16 | 17 | typedef int ngx_socket_t; 18 | 19 | #define ngx_socket socket 20 | #define ngx_socket_n "socket()" 21 | 22 | 23 | #if (NGX_HAVE_FIONBIO) 24 | 25 | int ngx_nonblocking(ngx_socket_t s); 26 | int ngx_blocking(ngx_socket_t s); 27 | 28 | #define ngx_nonblocking_n "ioctl(FIONBIO)" 29 | #define ngx_blocking_n "ioctl(!FIONBIO)" 30 | 31 | #else 32 | 33 | #define ngx_nonblocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK) 34 | #define ngx_nonblocking_n "fcntl(O_NONBLOCK)" 35 | 36 | #define ngx_blocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) & ~O_NONBLOCK) 37 | #define ngx_blocking_n "fcntl(!O_NONBLOCK)" 38 | 39 | #endif 40 | 41 | int ngx_tcp_nopush(ngx_socket_t s); 42 | int ngx_tcp_push(ngx_socket_t s); 43 | 44 | #if (NGX_LINUX) 45 | 46 | #define ngx_tcp_nopush_n "setsockopt(TCP_CORK)" 47 | #define ngx_tcp_push_n "setsockopt(!TCP_CORK)" 48 | 49 | #else 50 | 51 | #define ngx_tcp_nopush_n "setsockopt(TCP_NOPUSH)" 52 | #define ngx_tcp_push_n "setsockopt(!TCP_NOPUSH)" 53 | 54 | #endif 55 | 56 | 57 | #define ngx_shutdown_socket shutdown 58 | #define ngx_shutdown_socket_n "shutdown()" 59 | 60 | #define ngx_close_socket close 61 | #define ngx_close_socket_n "close() socket" 62 | 63 | 64 | #endif /* _NGX_SOCKET_H_INCLUDED_ */ 65 | -------------------------------------------------------------------------------- /src/http/modules/perl/ngx_http_perl_module.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_HTTP_PERL_MODULE_H_INCLUDED_ 9 | #define _NGX_HTTP_PERL_MODULE_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | #include 18 | #include 19 | 20 | 21 | typedef ngx_http_request_t *nginx; 22 | 23 | typedef struct { 24 | ngx_str_t filename; 25 | ngx_str_t redirect_uri; 26 | ngx_str_t redirect_args; 27 | 28 | SV *next; 29 | 30 | ngx_uint_t done; /* unsigned done:1; */ 31 | 32 | ngx_array_t *variables; /* array of ngx_http_perl_var_t */ 33 | 34 | #if (NGX_HTTP_SSI) 35 | ngx_http_ssi_ctx_t *ssi; 36 | #endif 37 | } ngx_http_perl_ctx_t; 38 | 39 | 40 | typedef struct { 41 | ngx_uint_t hash; 42 | ngx_str_t name; 43 | ngx_str_t value; 44 | } ngx_http_perl_var_t; 45 | 46 | 47 | extern ngx_module_t ngx_http_perl_module; 48 | 49 | 50 | /* 51 | * workaround for "unused variable `Perl___notused'" warning 52 | * when building with perl 5.6.1 53 | */ 54 | #ifndef PERL_IMPLICIT_CONTEXT 55 | #undef dTHXa 56 | #define dTHXa(a) 57 | #endif 58 | 59 | 60 | extern void boot_DynaLoader(pTHX_ CV* cv); 61 | 62 | 63 | void ngx_http_perl_handle_request(ngx_http_request_t *r); 64 | void ngx_http_perl_sleep_handler(ngx_http_request_t *r); 65 | 66 | 67 | #endif /* _NGX_HTTP_PERL_MODULE_H_INCLUDED_ */ 68 | -------------------------------------------------------------------------------- /auto/cc/bcc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | # Borland C++ 5.5 7 | 8 | # optimizations 9 | 10 | # maximize speed 11 | CFLAGS="$CFLAGS -O2" 12 | 13 | case $CPU in 14 | pentium) 15 | # optimize for Pentium and Athlon 16 | CPU_OPT="-5" 17 | ;; 18 | 19 | pentiumpro) 20 | # optimize for Pentium Pro, Pentium II and Pentium III 21 | CPU_OPT="-6" 22 | ;; 23 | esac 24 | 25 | # __stdcall 26 | #CPU_OPT="$CPU_OPT -ps" 27 | # __fastcall 28 | #CPU_OPT="$CPU_OPT -pr" 29 | 30 | CFLAGS="$CFLAGS $CPU_OPT" 31 | 32 | # multithreaded 33 | CFLAGS="$CFLAGS -tWM" 34 | 35 | # stop on warning 36 | CFLAGS="$CFLAGS -w!" 37 | 38 | # disable logo 39 | CFLAGS="$CFLAGS -q" 40 | 41 | 42 | # precompiled headers 43 | CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.csm" 44 | NGX_PCH="$NGX_OBJS/ngx_config.csm" 45 | NGX_BUILD_PCH="-H=$NGX_OBJS/ngx_config.csm" 46 | NGX_USE_PCH="-Hu -H=$NGX_OBJS/ngx_config.csm" 47 | 48 | 49 | # Win32 GUI mode application 50 | #LINK="\$(CC) -laa" 51 | 52 | 53 | # the resource file 54 | NGX_RES="$NGX_OBJS/nginx.res" 55 | NGX_RCC="brcc32 -fo$NGX_OBJS/nginx.res \$(CORE_INCS) $NGX_WIN32_RC" 56 | # the pragma allows to link the resource file using bcc32 and 57 | # to avoid the direct ilink32 calling and the c0w32.obj's WinMain/main problem 58 | NGX_PRAGMA="#pragma resource \"$NGX_OBJS/nginx.res\"" 59 | 60 | 61 | ngx_include_opt="-I" 62 | ngx_objout="-o" 63 | ngx_binout="-e" 64 | ngx_objext="obj" 65 | ngx_binext=".exe" 66 | 67 | ngx_long_start='@&&| 68 | ' 69 | ngx_long_end='|' 70 | 71 | ngx_regex_dirsep='\\' 72 | ngx_dirsep="\\" 73 | -------------------------------------------------------------------------------- /auto/lib/pcre/make: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | case "$NGX_CC_NAME" in 7 | 8 | msvc*) 9 | ngx_makefile=makefile.msvc 10 | ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC" 11 | ngx_pcre="PCRE=\"$PCRE\"" 12 | ;; 13 | 14 | owc*) 15 | ngx_makefile=makefile.owc 16 | ngx_opt="CPU_OPT=\"$CPU_OPT\"" 17 | ngx_pcre=`echo PCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"` 18 | ;; 19 | 20 | bcc) 21 | ngx_makefile=makefile.bcc 22 | ngx_opt="-DCPU_OPT=\"$CPU_OPT\"" 23 | ngx_pcre=`echo \-DPCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"` 24 | ;; 25 | 26 | esac 27 | 28 | 29 | case "$NGX_PLATFORM" in 30 | 31 | win32) 32 | 33 | cat << END >> $NGX_MAKEFILE 34 | 35 | `echo "$PCRE/pcre.lib: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"` 36 | \$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre $ngx_opt 37 | 38 | `echo "$PCRE/pcre.h:" | sed -e "s/\//$ngx_regex_dirsep/g"` 39 | \$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre pcre.h 40 | 41 | END 42 | 43 | ;; 44 | 45 | *) 46 | cat << END >> $NGX_MAKEFILE 47 | 48 | $PCRE/pcre.h: $PCRE/Makefile 49 | 50 | $PCRE/Makefile: $NGX_MAKEFILE 51 | cd $PCRE \\ 52 | && if [ -f Makefile ]; then \$(MAKE) distclean; fi \\ 53 | && CC="\$(CC)" CFLAGS="$PCRE_OPT" \\ 54 | ./configure --disable-shared 55 | 56 | $PCRE/.libs/libpcre.a: $PCRE/Makefile 57 | cd $PCRE \\ 58 | && \$(MAKE) libpcre.la 59 | 60 | END 61 | 62 | ;; 63 | 64 | esac 65 | -------------------------------------------------------------------------------- /auto/os/solaris: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | have=NGX_SOLARIS . auto/have_headers 7 | 8 | CORE_INCS="$UNIX_INCS" 9 | CORE_DEPS="$UNIX_DEPS $SOLARIS_DEPS" 10 | CORE_SRCS="$UNIX_SRCS $SOLARIS_SRCS " 11 | CORE_LIBS="$CORE_LIBS -lsocket -lnsl" 12 | 13 | NGX_RPATH=YES 14 | 15 | # Solaris's make does not support a blank line between target and rules 16 | ngx_spacer= 17 | 18 | CC_AUX_FLAGS="$CC_AUX_FLAGS -D_FILE_OFFSET_BITS=64 -lsocket -lnsl" 19 | 20 | 21 | if [ $ZLIB_ASM != NO ]; then 22 | echo "$0: error: the --with-zlib-asm=CPU option is not supported" 23 | echo "on that platform" 24 | echo 25 | 26 | exit 1 27 | fi 28 | 29 | 30 | ngx_feature="sendfilev()" 31 | ngx_feature_name="NGX_HAVE_SENDFILE" 32 | ngx_feature_run=no 33 | ngx_feature_incs="#include " 34 | ngx_feature_path= 35 | ngx_feature_libs="-lsendfile" 36 | ngx_feature_test="int fd = 1; sendfilevec_t vec[1]; 37 | size_t sent; ssize_t n; 38 | n = sendfilev(fd, vec, 1, &sent)" 39 | . auto/feature 40 | 41 | 42 | if [ $ngx_found = yes ]; then 43 | CORE_SRCS="$CORE_SRCS $SOLARIS_SENDFILEV_SRCS" 44 | CORE_LIBS="$CORE_LIBS -lsendfile" 45 | fi 46 | 47 | 48 | ngx_feature="event ports" 49 | ngx_feature_name="NGX_HAVE_EVENTPORT" 50 | ngx_feature_run=no 51 | ngx_feature_incs="#include " 52 | ngx_feature_path= 53 | ngx_feature_libs= 54 | ngx_feature_test="int n = port_create()" 55 | . auto/feature 56 | 57 | if [ $ngx_found = yes ]; then 58 | CORE_SRCS="$CORE_SRCS $EVENTPORT_SRCS" 59 | EVENT_MODULES="$EVENT_MODULES $EVENTPORT_MODULE" 60 | fi 61 | -------------------------------------------------------------------------------- /src/core/ngx_radix_tree.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_RADIX_TREE_H_INCLUDED_ 9 | #define _NGX_RADIX_TREE_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | #define NGX_RADIX_NO_VALUE (uintptr_t) -1 17 | 18 | typedef struct ngx_radix_node_s ngx_radix_node_t; 19 | 20 | // 基数树 21 | struct ngx_radix_node_s { 22 | // 指向右子树,如果没有右子树,则值为null空指针 23 | ngx_radix_node_t *right; 24 | // 指向左子树,如果没有左子树,则值为null空指针 25 | ngx_radix_node_t *left; 26 | // 指向父节点,如果没有父节点,则值为null空指针 27 | ngx_radix_node_t *parent; 28 | // value存储的是指针的值,它指向用户定义的数据结构。如果这个节点还未使用,value的值将是NGX_RADIX_NO_VALUE 29 | uintptr_t value; 30 | }; 31 | 32 | 33 | typedef struct { 34 | // 指向根节点 35 | ngx_radix_node_t *root; 36 | // 内存池,它负责给基数树的节点分配内存 37 | ngx_pool_t *pool; 38 | // 管理已经分配但暂时未使用的节点,free实际上是所有不在树中节点的单链表 39 | ngx_radix_node_t *free; 40 | // 已分配内存中还未使用内存的首地址 41 | char *start; 42 | // 已分配内存中还未使用的内存大小 43 | size_t size; 44 | } ngx_radix_tree_t; 45 | 46 | 47 | ngx_radix_tree_t *ngx_radix_tree_create(ngx_pool_t *pool, 48 | ngx_int_t preallocate); 49 | ngx_int_t ngx_radix32tree_insert(ngx_radix_tree_t *tree, 50 | uint32_t key, uint32_t mask, uintptr_t value); 51 | ngx_int_t ngx_radix32tree_delete(ngx_radix_tree_t *tree, 52 | uint32_t key, uint32_t mask); 53 | uintptr_t ngx_radix32tree_find(ngx_radix_tree_t *tree, uint32_t key); 54 | 55 | 56 | #endif /* _NGX_RADIX_TREE_H_INCLUDED_ */ 57 | -------------------------------------------------------------------------------- /src/event/ngx_event_mutex.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | 13 | ngx_int_t ngx_event_mutex_timedlock(ngx_event_mutex_t *m, ngx_msec_t timer, 14 | ngx_event_t *ev) 15 | { 16 | ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, 17 | "lock event mutex %p lock:%XD", m, m->lock); 18 | 19 | if (m->lock) { 20 | 21 | if (m->events == NULL) { 22 | m->events = ev; 23 | 24 | } else { 25 | m->last->next = ev; 26 | } 27 | 28 | m->last = ev; 29 | ev->next = NULL; 30 | 31 | #if (NGX_THREADS0) 32 | ev->light = 1; 33 | #endif 34 | 35 | ngx_add_timer(ev, timer); 36 | 37 | return NGX_AGAIN; 38 | } 39 | 40 | m->lock = 1; 41 | 42 | return NGX_OK; 43 | } 44 | 45 | 46 | ngx_int_t ngx_event_mutex_unlock(ngx_event_mutex_t *m, ngx_log_t *log) 47 | { 48 | ngx_event_t *ev; 49 | 50 | if (m->lock == 0) { 51 | ngx_log_error(NGX_LOG_ALERT, log, 0, 52 | "tring to unlock the free event mutex %p", m); 53 | return NGX_ERROR; 54 | } 55 | 56 | ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, 57 | "unlock event mutex %p, next event: %p", m, m->events); 58 | 59 | m->lock = 0; 60 | 61 | if (m->events) { 62 | ev = m->events; 63 | m->events = ev->next; 64 | 65 | ev->next = (ngx_event_t *) ngx_posted_events; 66 | ngx_posted_events = ev; 67 | } 68 | 69 | return NGX_OK; 70 | } 71 | -------------------------------------------------------------------------------- /src/core/ngx_crc32.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_CRC32_H_INCLUDED_ 9 | #define _NGX_CRC32_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | extern uint32_t *ngx_crc32_table_short; 17 | extern uint32_t ngx_crc32_table256[]; 18 | 19 | 20 | static ngx_inline uint32_t 21 | ngx_crc32_short(u_char *p, size_t len) 22 | { 23 | u_char c; 24 | uint32_t crc; 25 | 26 | crc = 0xffffffff; 27 | 28 | while (len--) { 29 | c = *p++; 30 | crc = ngx_crc32_table_short[(crc ^ (c & 0xf)) & 0xf] ^ (crc >> 4); 31 | crc = ngx_crc32_table_short[(crc ^ (c >> 4)) & 0xf] ^ (crc >> 4); 32 | } 33 | 34 | return crc ^ 0xffffffff; 35 | } 36 | 37 | 38 | static ngx_inline uint32_t 39 | ngx_crc32_long(u_char *p, size_t len) 40 | { 41 | uint32_t crc; 42 | 43 | crc = 0xffffffff; 44 | 45 | while (len--) { 46 | crc = ngx_crc32_table256[(crc ^ *p++) & 0xff] ^ (crc >> 8); 47 | } 48 | 49 | return crc ^ 0xffffffff; 50 | } 51 | 52 | 53 | #define ngx_crc32_init(crc) \ 54 | crc = 0xffffffff 55 | 56 | 57 | static ngx_inline void 58 | ngx_crc32_update(uint32_t *crc, u_char *p, size_t len) 59 | { 60 | uint32_t c; 61 | 62 | c = *crc; 63 | 64 | while (len--) { 65 | c = ngx_crc32_table256[(c ^ *p++) & 0xff] ^ (c >> 8); 66 | } 67 | 68 | *crc = c; 69 | } 70 | 71 | 72 | #define ngx_crc32_final(crc) \ 73 | crc ^= 0xffffffff 74 | 75 | 76 | ngx_int_t ngx_crc32_table_init(void); 77 | 78 | 79 | #endif /* _NGX_CRC32_H_INCLUDED_ */ 80 | -------------------------------------------------------------------------------- /src/os/unix/ngx_process_cycle.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_PROCESS_CYCLE_H_INCLUDED_ 9 | #define _NGX_PROCESS_CYCLE_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | #define NGX_CMD_OPEN_CHANNEL 1 17 | #define NGX_CMD_CLOSE_CHANNEL 2 18 | #define NGX_CMD_QUIT 3 19 | #define NGX_CMD_TERMINATE 4 20 | #define NGX_CMD_REOPEN 5 21 | 22 | 23 | #define NGX_PROCESS_SINGLE 0 24 | #define NGX_PROCESS_MASTER 1 25 | #define NGX_PROCESS_SIGNALLER 2 26 | #define NGX_PROCESS_WORKER 3 27 | #define NGX_PROCESS_HELPER 4 28 | 29 | 30 | typedef struct { 31 | ngx_event_handler_pt handler; 32 | char *name; 33 | ngx_msec_t delay; 34 | } ngx_cache_manager_ctx_t; 35 | 36 | 37 | void ngx_master_process_cycle(ngx_cycle_t *cycle); 38 | void ngx_single_process_cycle(ngx_cycle_t *cycle); 39 | 40 | 41 | extern ngx_uint_t ngx_process; 42 | extern ngx_pid_t ngx_pid; 43 | extern ngx_pid_t ngx_new_binary; 44 | extern ngx_uint_t ngx_inherited; 45 | extern ngx_uint_t ngx_daemonized; 46 | extern ngx_uint_t ngx_threaded; 47 | extern ngx_uint_t ngx_exiting; 48 | 49 | extern sig_atomic_t ngx_reap; 50 | extern sig_atomic_t ngx_sigio; 51 | extern sig_atomic_t ngx_sigalrm; 52 | extern sig_atomic_t ngx_quit; 53 | extern sig_atomic_t ngx_debug_quit; 54 | extern sig_atomic_t ngx_terminate; 55 | extern sig_atomic_t ngx_noaccept; 56 | extern sig_atomic_t ngx_reconfigure; 57 | extern sig_atomic_t ngx_reopen; 58 | extern sig_atomic_t ngx_change_binary; 59 | 60 | 61 | #endif /* _NGX_PROCESS_CYCLE_H_INCLUDED_ */ 62 | -------------------------------------------------------------------------------- /src/http/modules/perl/Makefile.PL: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | use 5.006001; 6 | use ExtUtils::MakeMaker; 7 | 8 | WriteMakefile( 9 | NAME => 'nginx', 10 | VERSION_FROM => 'nginx.pm', # finds $VERSION 11 | PREREQ_PM => {}, # e.g., Module::Name => 1.1 12 | 13 | ABSTRACT_FROM => 'nginx.pm', # retrieve abstract from module 14 | AUTHOR => 'Igor Sysoev', 15 | 16 | CCFLAGS => "$ENV{NGX_PM_CFLAGS}", 17 | OPTIMIZE => '-O', 18 | 19 | INC => "-I ../../../../../src/core " . 20 | "-I ../../../../../src/event " . 21 | "-I ../../../../../src/os/unix " . 22 | "-I ../../../../../src/http " . 23 | "-I ../../../../../src/http/modules " . 24 | "-I ../../../../../src/http/modules/perl " . 25 | "-I ../../../../../$ENV{NGX_OBJS} " . 26 | ($ENV{NGX_PCRE} =~ /^(YES|NO)/ ? "" : 27 | ($ENV{NGX_PCRE} =~ m#^/# ? "-I $ENV{NGX_PCRE} " : 28 | "-I ../../../../../$ENV{NGX_PCRE} ")) . 29 | ($ENV{NGX_OPENSSL} =~ /^(YES|NO)/ ? "" : 30 | ($ENV{NGX_OPENSSL} =~ m#^/# ? 31 | "-I $ENV{NGX_OPENSSL}/.openssl/include " : 32 | "-I ../../../../../$ENV{NGX_OPENSSL}/.openssl/include ")), 33 | 34 | depend => { 35 | 'nginx.c' => 36 | "../../../../../src/http/modules/perl/ngx_http_perl_module.h" 37 | }, 38 | 39 | PM => { 40 | 'nginx.pm' => '$(INST_LIBDIR)/nginx.pm' 41 | } 42 | ); 43 | -------------------------------------------------------------------------------- /src/os/unix/ngx_time.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_TIME_H_INCLUDED_ 9 | #define _NGX_TIME_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | typedef ngx_rbtree_key_t ngx_msec_t; 17 | typedef ngx_rbtree_key_int_t ngx_msec_int_t; 18 | 19 | typedef struct tm ngx_tm_t; 20 | 21 | #define ngx_tm_sec tm_sec 22 | #define ngx_tm_min tm_min 23 | #define ngx_tm_hour tm_hour 24 | #define ngx_tm_mday tm_mday 25 | #define ngx_tm_mon tm_mon 26 | #define ngx_tm_year tm_year 27 | #define ngx_tm_wday tm_wday 28 | #define ngx_tm_isdst tm_isdst 29 | 30 | #define ngx_tm_sec_t int 31 | #define ngx_tm_min_t int 32 | #define ngx_tm_hour_t int 33 | #define ngx_tm_mday_t int 34 | #define ngx_tm_mon_t int 35 | #define ngx_tm_year_t int 36 | #define ngx_tm_wday_t int 37 | 38 | 39 | #if (NGX_HAVE_GMTOFF) 40 | #define ngx_tm_gmtoff tm_gmtoff 41 | #define ngx_tm_zone tm_zone 42 | #endif 43 | 44 | 45 | #if (NGX_SOLARIS) 46 | 47 | #define ngx_timezone(isdst) (- (isdst ? altzone : timezone) / 60) 48 | 49 | #else 50 | 51 | #define ngx_timezone(isdst) (- (isdst ? timezone + 3600 : timezone) / 60) 52 | 53 | #endif 54 | 55 | 56 | void ngx_timezone_update(void); 57 | void ngx_localtime(time_t s, ngx_tm_t *tm); 58 | void ngx_libc_localtime(time_t s, struct tm *tm); 59 | void ngx_libc_gmtime(time_t s, struct tm *tm); 60 | 61 | #define ngx_gettimeofday(tp) (void) gettimeofday(tp, NULL); 62 | #define ngx_msleep(ms) (void) usleep(ms * 1000) 63 | #define ngx_sleep(s) (void) sleep(s) 64 | 65 | 66 | #endif /* _NGX_TIME_H_INCLUDED_ */ 67 | -------------------------------------------------------------------------------- /auto/lib/geoip/conf: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | ngx_feature="GeoIP library" 7 | ngx_feature_name= 8 | ngx_feature_run=no 9 | ngx_feature_incs= 10 | ngx_feature_path= 11 | ngx_feature_libs="-lGeoIP" 12 | ngx_feature_test="GeoIP_open(NULL, 0)" 13 | . auto/feature 14 | 15 | 16 | if [ $ngx_found = no ]; then 17 | 18 | # FreeBSD port 19 | 20 | ngx_feature="GeoIP library in /usr/local/" 21 | 22 | if [ $NGX_RPATH = YES ]; then 23 | ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lGeoIP" 24 | else 25 | ngx_feature_libs="-L/usr/local/lib -lGeoIP" 26 | fi 27 | 28 | . auto/feature 29 | fi 30 | 31 | 32 | if [ $ngx_found = no ]; then 33 | 34 | # NetBSD port 35 | 36 | ngx_feature="GeoIP library in /usr/pkg/" 37 | ngx_feature_path="/usr/pkg/include/" 38 | 39 | if [ $NGX_RPATH = YES ]; then 40 | ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lGeoIP" 41 | else 42 | ngx_feature_libs="-L/usr/pkg/lib -lGeoIP" 43 | fi 44 | 45 | . auto/feature 46 | fi 47 | 48 | 49 | if [ $ngx_found = no ]; then 50 | 51 | # MacPorts 52 | 53 | ngx_feature="GeoIP library in /opt/local/" 54 | ngx_feature_path="/opt/local/include" 55 | 56 | if [ $NGX_RPATH = YES ]; then 57 | ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lGeoIP" 58 | else 59 | ngx_feature_libs="-L/opt/local/lib -lGeoIP" 60 | fi 61 | 62 | . auto/feature 63 | fi 64 | 65 | 66 | if [ $ngx_found = yes ]; then 67 | CORE_LIBS="$CORE_LIBS $ngx_feature_libs" 68 | 69 | else 70 | 71 | cat << END 72 | 73 | $0: error: the GeoIP module requires the GeoIP library. 74 | You can either do not enable the module or install the library. 75 | 76 | END 77 | 78 | exit 1 79 | fi 80 | -------------------------------------------------------------------------------- /auto/lib/conf: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | if [ $USE_PCRE = YES -o $PCRE != NONE ]; then 7 | . auto/lib/pcre/conf 8 | 9 | else 10 | if [ $USE_PCRE = DISABLED -a $HTTP_REWRITE = YES ]; then 11 | 12 | cat << END 13 | 14 | $0: error: the HTTP rewrite module requires the PCRE library. 15 | You can either disable the module by using --without-http_rewrite_module 16 | option or you have to enable the PCRE support. 17 | 18 | END 19 | exit 1 20 | fi 21 | fi 22 | 23 | 24 | if [ $USE_OPENSSL = YES ]; then 25 | . auto/lib/openssl/conf 26 | fi 27 | 28 | if [ $USE_MD5 = YES ]; then 29 | 30 | if [ $USE_OPENSSL = YES ]; then 31 | have=NGX_HAVE_OPENSSL_MD5_H . auto/have 32 | have=NGX_OPENSSL_MD5 . auto/have 33 | have=NGX_HAVE_MD5 . auto/have 34 | MD5=YES 35 | MD5_LIB=OpenSSL 36 | 37 | else 38 | . auto/lib/md5/conf 39 | fi 40 | 41 | fi 42 | 43 | if [ $USE_SHA1 = YES ]; then 44 | 45 | if [ $USE_OPENSSL = YES ]; then 46 | have=NGX_HAVE_OPENSSL_SHA1_H . auto/have 47 | have=NGX_HAVE_SHA1 . auto/have 48 | SHA1=YES 49 | SHA1_LIB=OpenSSL 50 | 51 | else 52 | . auto/lib/sha1/conf 53 | fi 54 | 55 | fi 56 | 57 | if [ $USE_ZLIB = YES ]; then 58 | . auto/lib/zlib/conf 59 | fi 60 | 61 | if [ $USE_LIBXSLT = YES ]; then 62 | . auto/lib/libxslt/conf 63 | fi 64 | 65 | if [ $USE_LIBGD = YES ]; then 66 | . auto/lib/libgd/conf 67 | fi 68 | 69 | if [ $USE_PERL = YES ]; then 70 | . auto/lib/perl/conf 71 | fi 72 | 73 | if [ $HTTP_GEOIP = YES ]; then 74 | . auto/lib/geoip/conf 75 | fi 76 | 77 | if [ $NGX_GOOGLE_PERFTOOLS = YES ]; then 78 | . auto/lib/google-perftools/conf 79 | fi 80 | 81 | if [ $NGX_LIBATOMIC != NO ]; then 82 | . auto/lib/libatomic/conf 83 | fi 84 | -------------------------------------------------------------------------------- /src/core/ngx_queue.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | 12 | /* 13 | * find the middle queue element if the queue has odd number of elements 14 | * or the first element of the queue's second part otherwise 15 | */ 16 | 17 | ngx_queue_t * 18 | ngx_queue_middle(ngx_queue_t *queue) 19 | { 20 | ngx_queue_t *middle, *next; 21 | 22 | middle = ngx_queue_head(queue); 23 | 24 | if (middle == ngx_queue_last(queue)) { 25 | return middle; 26 | } 27 | 28 | next = ngx_queue_head(queue); 29 | 30 | for ( ;; ) { 31 | middle = ngx_queue_next(middle); 32 | 33 | next = ngx_queue_next(next); 34 | 35 | if (next == ngx_queue_last(queue)) { 36 | return middle; 37 | } 38 | 39 | next = ngx_queue_next(next); 40 | 41 | if (next == ngx_queue_last(queue)) { 42 | return middle; 43 | } 44 | } 45 | } 46 | 47 | 48 | /* the stable insertion sort */ 49 | 50 | void 51 | ngx_queue_sort(ngx_queue_t *queue, 52 | ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)) 53 | { 54 | ngx_queue_t *q, *prev, *next; 55 | 56 | q = ngx_queue_head(queue); 57 | 58 | if (q == ngx_queue_last(queue)) { 59 | return; 60 | } 61 | 62 | for (q = ngx_queue_next(q); q != ngx_queue_sentinel(queue); q = next) { 63 | 64 | prev = ngx_queue_prev(q); 65 | next = ngx_queue_next(q); 66 | 67 | ngx_queue_remove(q); 68 | 69 | do { 70 | if (cmp(prev, q) <= 0) { 71 | break; 72 | } 73 | 74 | prev = ngx_queue_prev(prev); 75 | 76 | } while (prev != ngx_queue_sentinel(queue)); 77 | 78 | ngx_queue_insert_after(prev, q); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /auto/types/typedef: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | echo $ngx_n "checking for $ngx_type ...$ngx_c" 7 | 8 | cat << END >> $NGX_AUTOCONF_ERR 9 | 10 | ---------------------------------------- 11 | checking for $ngx_type 12 | 13 | END 14 | 15 | ngx_found=no 16 | 17 | for ngx_try in $ngx_type $ngx_types 18 | do 19 | 20 | cat << END > $NGX_AUTOTEST.c 21 | 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | $NGX_INCLUDE_INTTYPES_H 29 | 30 | int main() { 31 | $ngx_try i = 0; 32 | return 0; 33 | } 34 | 35 | END 36 | 37 | ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \ 38 | -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs" 39 | 40 | eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" 41 | 42 | if [ -x $NGX_AUTOTEST ]; then 43 | if [ $ngx_try = $ngx_type ]; then 44 | echo " found" 45 | ngx_found=yes 46 | else 47 | echo ", $ngx_try used" 48 | ngx_found=$ngx_try 49 | fi 50 | fi 51 | 52 | rm -f $NGX_AUTOTEST 53 | 54 | if [ $ngx_found = no ]; then 55 | echo $ngx_n " $ngx_try not found$ngx_c" 56 | 57 | echo "----------" >> $NGX_AUTOCONF_ERR 58 | cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR 59 | echo "----------" >> $NGX_AUTOCONF_ERR 60 | echo $ngx_test >> $NGX_AUTOCONF_ERR 61 | echo "----------" >> $NGX_AUTOCONF_ERR 62 | 63 | else 64 | break 65 | fi 66 | done 67 | 68 | if [ $ngx_found = no ]; then 69 | echo 70 | echo "$0: error: can not define $ngx_type" 71 | 72 | exit 1 73 | fi 74 | 75 | if [ $ngx_found != yes ]; then 76 | echo "typedef $ngx_found $ngx_type;" >> $NGX_AUTO_CONFIG_H 77 | fi 78 | -------------------------------------------------------------------------------- /src/core/ngx_spinlock.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | /* 自旋锁 注释来自:http://blog.csdn.net/walkerkalr/article/details/38237147?utm_source=tuicool&utm_medium=referral 12 | lock参数就是原子变量表达的锁,当lock值为0时,表示锁是被释放的,而lock值不为0时则表示锁已经被某个进程持有了; 13 | value参数表示希望当锁没有被任何进程持有时,把lock值设为value表示当前进程持有了锁; 14 | spin参数表示在多处理器系统内,当ngx_spinlock方法没有拿到锁时,当前进程在内核的一次调度中,该方法等待其他处理器释放锁的时间。 15 | */ 16 | void 17 | ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin) 18 | { 19 | 20 | #if (NGX_HAVE_ATOMIC_OPS) //支持原子操作 21 | 22 | ngx_uint_t i, n; 23 | // 一直处于循环中,直到获取到锁 24 | for ( ;; ) { 25 | // lock为0表示没有其他进程持有锁,这时将lock值设置为value参数表示当前进程持有了锁 ,ngx_atomic_cmp_set为原子操作 26 | if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) { 27 | return; 28 | } 29 | //如果是多处理器系统 30 | if (ngx_ncpu > 1) { 31 | /*在多处理器下,当发现锁被其他进程占用时,当前进程并不是立刻让出正在使用的CPU处理器,而是等待一段时间,看看其他处理器上的进程是否会释放锁,这会减少进程间切换的次数。*/ 32 | for (n = 1; n < spin; n <<= 1) { 33 | // 随着等待的次数越来越多,实际去检查锁的间隔时间越来越大 34 | for (i = 0; i < n; i++) { 35 | //ngx_cpu_pause是许多架构体系中专门为了自旋锁而提供的指令,它会告诉CPU现在处于自旋锁等待状态,通常一个CPU会将自己置于节能状态,降低功耗。但是当前进程并没有让出正在使用的处理器。 36 | ngx_cpu_pause(); 37 | } 38 | /*检查锁是否被释放了,如果lock值为0且释放了锁后,就把它的值设为value,当前进程持有锁成功并返回 */ 39 | if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) { 40 | return; 41 | } 42 | } 43 | } 44 | /*当前进程让出处理器,但仍然处于可执行状态,使得处理器优先调度其他可执行状态的进程,这样,在进程被内核再次调度时,在for循环代码中可以期望其他进程释放锁。*/ 45 | ngx_sched_yield(); 46 | } 47 | 48 | #else 49 | 50 | #if (NGX_THREADS) 51 | 52 | #error ngx_spinlock() or ngx_atomic_cmp_set() are not defined ! 53 | 54 | #endif 55 | 56 | #endif 57 | 58 | } 59 | -------------------------------------------------------------------------------- /src/os/unix/ngx_daemon.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | /*创建守护进程,具体创建方法可以参考《unix环境高级编程》*/ 12 | ngx_int_t ngx_daemon(ngx_log_t *log) 13 | { 14 | int fd; 15 | 16 | switch (fork()) { 17 | case -1: 18 | ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed"); 19 | return NGX_ERROR; 20 | 21 | case 0: //子进程作为守护进程 22 | break; 23 | 24 | default: 25 | exit(0); //父进程退出 26 | } 27 | 28 | ngx_pid = ngx_getpid(); 29 | 30 | if (setsid() == -1) { //setsid创建一个新会话 31 | ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed"); 32 | return NGX_ERROR; 33 | } 34 | 35 | umask(0); 36 | 37 | //打开文件/dev/null,使得其拥有守护进程的0,1,2。这样防止守护进程在终端设备上显示输出 38 | fd = open("/dev/null", O_RDWR); 39 | if (fd == -1) { 40 | ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, 41 | "open(\"/dev/null\") failed"); 42 | return NGX_ERROR; 43 | } 44 | 45 | if (dup2(fd, STDIN_FILENO) == -1) { 46 | ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed"); 47 | return NGX_ERROR; 48 | } 49 | 50 | if (dup2(fd, STDOUT_FILENO) == -1) { 51 | ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed"); 52 | return NGX_ERROR; 53 | } 54 | 55 | #if 0 56 | if (dup2(fd, STDERR_FILENO) == -1) { 57 | ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed"); 58 | return NGX_ERROR; 59 | } 60 | #endif 61 | 62 | if (fd > STDERR_FILENO) { 63 | if (close(fd) == -1) { //关闭不需要的文件描述符 64 | ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed"); 65 | return NGX_ERROR; 66 | } 67 | } 68 | 69 | return NGX_OK; 70 | } 71 | -------------------------------------------------------------------------------- /src/os/unix/ngx_solaris_init.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | 12 | char ngx_solaris_sysname[20]; 13 | char ngx_solaris_release[10]; 14 | char ngx_solaris_version[50]; 15 | 16 | 17 | static ngx_os_io_t ngx_solaris_io = { 18 | ngx_unix_recv, 19 | ngx_readv_chain, 20 | ngx_udp_unix_recv, 21 | ngx_unix_send, 22 | #if (NGX_HAVE_SENDFILE) 23 | ngx_solaris_sendfilev_chain, 24 | NGX_IO_SENDFILE 25 | #else 26 | ngx_writev_chain, 27 | 0 28 | #endif 29 | }; 30 | 31 | 32 | ngx_int_t 33 | ngx_os_specific_init(ngx_log_t *log) 34 | { 35 | if (sysinfo(SI_SYSNAME, ngx_solaris_sysname, sizeof(ngx_solaris_sysname)) 36 | == -1) 37 | { 38 | ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, 39 | "sysinfo(SI_SYSNAME) failed"); 40 | return NGX_ERROR; 41 | } 42 | 43 | if (sysinfo(SI_RELEASE, ngx_solaris_release, sizeof(ngx_solaris_release)) 44 | == -1) 45 | { 46 | ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, 47 | "sysinfo(SI_RELEASE) failed"); 48 | return NGX_ERROR; 49 | } 50 | 51 | if (sysinfo(SI_VERSION, ngx_solaris_version, sizeof(ngx_solaris_version)) 52 | == -1) 53 | { 54 | ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, 55 | "sysinfo(SI_SYSNAME) failed"); 56 | return NGX_ERROR; 57 | } 58 | 59 | 60 | ngx_os_io = ngx_solaris_io; 61 | 62 | return NGX_OK; 63 | } 64 | 65 | 66 | void 67 | ngx_os_specific_status(ngx_log_t *log) 68 | { 69 | 70 | ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s", 71 | ngx_solaris_sysname, ngx_solaris_release); 72 | 73 | ngx_log_error(NGX_LOG_NOTICE, log, 0, "version: %s", 74 | ngx_solaris_version); 75 | } 76 | -------------------------------------------------------------------------------- /src/os/unix/ngx_send.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | 13 | ssize_t 14 | ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size) 15 | { 16 | ssize_t n; 17 | ngx_err_t err; 18 | ngx_event_t *wev; 19 | 20 | wev = c->write; 21 | 22 | #if (NGX_HAVE_KQUEUE) 23 | 24 | if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) { 25 | (void) ngx_connection_error(c, wev->kq_errno, 26 | "kevent() reported about an closed connection"); 27 | wev->error = 1; 28 | return NGX_ERROR; 29 | } 30 | 31 | #endif 32 | 33 | for ( ;; ) { 34 | n = send(c->fd, buf, size, 0); 35 | 36 | ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, 37 | "send: fd:%d %d of %d", c->fd, n, size); 38 | 39 | if (n > 0) { 40 | if (n < (ssize_t) size) { 41 | wev->ready = 0; 42 | } 43 | 44 | c->sent += n; 45 | 46 | return n; 47 | } 48 | 49 | err = ngx_socket_errno; 50 | 51 | if (n == 0) { 52 | ngx_log_error(NGX_LOG_ALERT, c->log, err, "send() returned zero"); 53 | wev->ready = 0; 54 | return n; 55 | } 56 | 57 | if (err == NGX_EAGAIN || err == NGX_EINTR) { 58 | wev->ready = 0; 59 | 60 | ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, 61 | "send() not ready"); 62 | 63 | if (err == NGX_EAGAIN) { 64 | return NGX_AGAIN; 65 | } 66 | 67 | } else { 68 | wev->error = 1; 69 | (void) ngx_connection_error(c, err, "send() failed"); 70 | return NGX_ERROR; 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /auto/lib/openssl/make: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | case "$CC" in 7 | 8 | cl) 9 | 10 | cat << END >> $NGX_MAKEFILE 11 | 12 | $OPENSSL/openssl/include/openssl/ssl.h: $NGX_MAKEFILE 13 | \$(MAKE) -f auto/lib/openssl/makefile.msvc \ 14 | OPENSSL="$OPENSSL" OPENSSL_OPT="$OPENSSL_OPT" 15 | 16 | END 17 | 18 | ;; 19 | 20 | bcc32) 21 | 22 | ngx_opt=`echo "-DOPENSSL=\"$OPENSSL\" -DOPENSSL_OPT=\"$OPENSSL_OPT\"" \ 23 | | sed -e "s/\//$ngx_regex_dirsep/g"` 24 | 25 | cat << END >> $NGX_MAKEFILE 26 | 27 | `echo "$OPENSSL\\openssl\\lib\\libeay32.lib: \ 28 | $OPENSSL\\openssl\\include\\openssl\\ssl.h" \ 29 | | sed -e "s/\//$ngx_regex_dirsep/g"` 30 | 31 | `echo "$OPENSSL\\openssl\\lib\\ssleay32.lib: \ 32 | $OPENSSL\\openssl\\include\\openssl\\ssl.h" \ 33 | | sed -e "s/\//$ngx_regex_dirsep/g"` 34 | 35 | `echo "$OPENSSL\\openssl\\include\\openssl\\ssl.h: $NGX_MAKEFILE" \ 36 | | sed -e "s/\//$ngx_regex_dirsep/g"` 37 | \$(MAKE) -f auto/lib/openssl/makefile.bcc $ngx_opt 38 | 39 | END 40 | 41 | ;; 42 | 43 | *) 44 | case $USE_THREADS in 45 | NO) OPENSSL_OPT="$OPENSSL_OPT no-threads" ;; 46 | *) OPENSSL_OPT="$OPENSSL_OPT threads" ;; 47 | esac 48 | 49 | case $OPENSSL in 50 | /*) ngx_prefix="$OPENSSL/.openssl" ;; 51 | *) ngx_prefix="$PWD/$OPENSSL/.openssl" ;; 52 | esac 53 | 54 | cat << END >> $NGX_MAKEFILE 55 | 56 | $OPENSSL/.openssl/include/openssl/ssl.h: $NGX_MAKEFILE 57 | cd $OPENSSL \\ 58 | && \$(MAKE) clean \\ 59 | && ./config --prefix=$ngx_prefix no-shared $OPENSSL_OPT \\ 60 | && \$(MAKE) \\ 61 | && \$(MAKE) install LIBDIR=lib 62 | 63 | END 64 | 65 | ;; 66 | 67 | esac 68 | -------------------------------------------------------------------------------- /src/os/unix/ngx_aio_read_chain.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | 13 | ssize_t 14 | ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl) 15 | { 16 | int n; 17 | u_char *buf, *prev; 18 | size_t size; 19 | ssize_t total; 20 | 21 | if (c->read->pending_eof) { 22 | c->read->ready = 0; 23 | return 0; 24 | } 25 | 26 | total = 0; 27 | 28 | while (cl) { 29 | 30 | /* we can post the single aio operation only */ 31 | 32 | if (!c->read->ready) { 33 | return total ? total : NGX_AGAIN; 34 | } 35 | 36 | buf = cl->buf->last; 37 | prev = cl->buf->last; 38 | size = 0; 39 | 40 | /* coalesce the neighbouring bufs */ 41 | 42 | while (cl && prev == cl->buf->last) { 43 | size += cl->buf->end - cl->buf->last; 44 | prev = cl->buf->end; 45 | cl = cl->next; 46 | } 47 | 48 | n = ngx_aio_read(c, buf, size); 49 | 50 | ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_read: %d", n); 51 | 52 | if (n == NGX_AGAIN) { 53 | return total ? total : NGX_AGAIN; 54 | } 55 | 56 | if (n == NGX_ERROR) { 57 | return NGX_ERROR; 58 | } 59 | 60 | if (n == 0) { 61 | c->read->pending_eof = 1; 62 | if (total) { 63 | c->read->eof = 0; 64 | c->read->ready = 1; 65 | } 66 | return total; 67 | } 68 | 69 | if (n > 0) { 70 | total += n; 71 | } 72 | 73 | ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, 74 | "aio_read total: %d", total); 75 | } 76 | 77 | return total ? total : NGX_AGAIN; 78 | } 79 | -------------------------------------------------------------------------------- /src/event/ngx_event_busy_lock.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_EVENT_BUSY_LOCK_H_INCLUDED_ 9 | #define _NGX_EVENT_BUSY_LOCK_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | typedef struct ngx_event_busy_lock_ctx_s ngx_event_busy_lock_ctx_t; 17 | 18 | struct ngx_event_busy_lock_ctx_s { 19 | ngx_event_t *event; 20 | ngx_event_handler_pt handler; 21 | void *data; 22 | ngx_msec_t timer; 23 | 24 | unsigned locked:1; 25 | unsigned waiting:1; 26 | unsigned cache_updated:1; 27 | 28 | char *md5; 29 | ngx_int_t slot; 30 | 31 | ngx_event_busy_lock_ctx_t *next; 32 | }; 33 | 34 | 35 | typedef struct { 36 | u_char *md5_mask; 37 | char *md5; 38 | ngx_uint_t cacheable; 39 | 40 | ngx_uint_t busy; 41 | ngx_uint_t max_busy; 42 | 43 | ngx_uint_t waiting; 44 | ngx_uint_t max_waiting; 45 | 46 | ngx_event_busy_lock_ctx_t *events; 47 | ngx_event_busy_lock_ctx_t *last; 48 | 49 | #if (NGX_THREADS) 50 | ngx_mutex_t *mutex; 51 | #endif 52 | } ngx_event_busy_lock_t; 53 | 54 | 55 | ngx_int_t ngx_event_busy_lock(ngx_event_busy_lock_t *bl, 56 | ngx_event_busy_lock_ctx_t *ctx); 57 | ngx_int_t ngx_event_busy_lock_cacheable(ngx_event_busy_lock_t *bl, 58 | ngx_event_busy_lock_ctx_t *ctx); 59 | void ngx_event_busy_unlock(ngx_event_busy_lock_t *bl, 60 | ngx_event_busy_lock_ctx_t *ctx); 61 | void ngx_event_busy_lock_cancel(ngx_event_busy_lock_t *bl, 62 | ngx_event_busy_lock_ctx_t *ctx); 63 | 64 | 65 | #endif /* _NGX_EVENT_BUSY_LOCK_H_INCLUDED_ */ 66 | -------------------------------------------------------------------------------- /auto/lib/libgd/conf: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | ngx_feature="GD library" 7 | ngx_feature_name= 8 | ngx_feature_run=no 9 | ngx_feature_incs="#include " 10 | ngx_feature_path= 11 | ngx_feature_libs="-lgd" 12 | ngx_feature_test="gdImagePtr img = gdImageCreateFromGifPtr(1, NULL);" 13 | . auto/feature 14 | 15 | 16 | if [ $ngx_found = no ]; then 17 | 18 | # FreeBSD port 19 | 20 | ngx_feature="GD library in /usr/local/" 21 | ngx_feature_path="/usr/local/include" 22 | 23 | if [ $NGX_RPATH = YES ]; then 24 | ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lgd" 25 | else 26 | ngx_feature_libs="-L/usr/local/lib -lgd" 27 | fi 28 | 29 | . auto/feature 30 | fi 31 | 32 | 33 | if [ $ngx_found = no ]; then 34 | 35 | # NetBSD port 36 | 37 | ngx_feature="GD library in /usr/pkg/" 38 | ngx_feature_path="/usr/pkg/include/" 39 | 40 | if [ $NGX_RPATH = YES ]; then 41 | ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lgd" 42 | else 43 | ngx_feature_libs="-L/usr/pkg/lib -lgd" 44 | fi 45 | 46 | . auto/feature 47 | fi 48 | 49 | 50 | if [ $ngx_found = no ]; then 51 | 52 | # MacPorts 53 | 54 | ngx_feature="GD library in /opt/local/" 55 | ngx_feature_path="/opt/local/include" 56 | 57 | if [ $NGX_RPATH = YES ]; then 58 | ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lgd" 59 | else 60 | ngx_feature_libs="-L/opt/local/lib -lgd" 61 | fi 62 | 63 | . auto/feature 64 | fi 65 | 66 | 67 | if [ $ngx_found = yes ]; then 68 | 69 | CORE_INCS="$CORE_INCS $ngx_feature_path" 70 | CORE_LIBS="$CORE_LIBS $ngx_feature_libs" 71 | 72 | else 73 | 74 | cat << END 75 | 76 | $0: error: the HTTP image filter module requires the GD library. 77 | You can either do not enable the module or install the libraries. 78 | 79 | END 80 | 81 | exit 1 82 | 83 | fi 84 | -------------------------------------------------------------------------------- /src/os/unix/ngx_gcc_atomic_amd64.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #if (NGX_SMP) 9 | #define NGX_SMP_LOCK "lock;" 10 | #else 11 | #define NGX_SMP_LOCK 12 | #endif 13 | 14 | 15 | /* 16 | * "cmpxchgq r, [m]": 17 | * 18 | * if (rax == [m]) { 19 | * zf = 1; 20 | * [m] = r; 21 | * } else { 22 | * zf = 0; 23 | * rax = [m]; 24 | * } 25 | * 26 | * 27 | * The "r" is any register, %rax (%r0) - %r16. 28 | * The "=a" and "a" are the %rax register. 29 | * Although we can return result in any register, we use "a" because it is 30 | * used in cmpxchgq anyway. The result is actually in %al but not in $rax, 31 | * however as the code is inlined gcc can test %al as well as %rax. 32 | * 33 | * The "cc" means that flags were changed. 34 | */ 35 | 36 | static ngx_inline ngx_atomic_uint_t 37 | ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, 38 | ngx_atomic_uint_t set) 39 | { 40 | u_char res; 41 | 42 | __asm__ volatile ( 43 | 44 | NGX_SMP_LOCK 45 | " cmpxchgq %3, %1; " 46 | " sete %0; " 47 | 48 | : "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory"); 49 | 50 | return res; 51 | } 52 | 53 | 54 | /* 55 | * "xaddq r, [m]": 56 | * 57 | * temp = [m]; 58 | * [m] += r; 59 | * r = temp; 60 | * 61 | * 62 | * The "+r" is any register, %rax (%r0) - %r16. 63 | * The "cc" means that flags were changed. 64 | */ 65 | 66 | static ngx_inline ngx_atomic_int_t 67 | ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) 68 | { 69 | __asm__ volatile ( 70 | 71 | NGX_SMP_LOCK 72 | " xaddq %0, %1; " 73 | 74 | : "+r" (add) : "m" (*value) : "cc", "memory"); 75 | 76 | return add; 77 | } 78 | 79 | 80 | #define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") 81 | 82 | #define ngx_cpu_pause() __asm__ ("pause") 83 | -------------------------------------------------------------------------------- /auto/types/sizeof: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | echo $ngx_n "checking for $ngx_type size ...$ngx_c" 7 | 8 | cat << END >> $NGX_AUTOCONF_ERR 9 | 10 | ---------------------------------------- 11 | checking for $ngx_type size 12 | 13 | END 14 | 15 | ngx_size= 16 | 17 | cat << END > $NGX_AUTOTEST.c 18 | 19 | #include 20 | #include 21 | $NGX_INCLUDE_UNISTD_H 22 | #include 23 | #include 24 | $NGX_INCLUDE_INTTYPES_H 25 | $NGX_INCLUDE_AUTO_CONFIG_H 26 | 27 | int main() { 28 | printf("%d", sizeof($ngx_type)); 29 | return 0; 30 | } 31 | 32 | END 33 | 34 | 35 | ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \ 36 | -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs" 37 | 38 | eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" 39 | 40 | 41 | if [ -x $NGX_AUTOTEST ]; then 42 | ngx_size=`$NGX_AUTOTEST` 43 | echo " $ngx_size bytes" 44 | fi 45 | 46 | 47 | rm -f $NGX_AUTOTEST 48 | 49 | 50 | case $ngx_size in 51 | 4) 52 | if [ "$ngx_type"="long" ]; then 53 | ngx_max_value=2147483647L 54 | else 55 | ngx_max_value=2147483647 56 | fi 57 | 58 | ngx_max_len='(sizeof("-2147483648") - 1)' 59 | ;; 60 | 61 | 8) 62 | if [ "$ngx_type"="long long" ]; then 63 | ngx_max_value=9223372036854775807LL 64 | else 65 | ngx_max_value=9223372036854775807L 66 | fi 67 | 68 | ngx_max_len='(sizeof("-9223372036854775808") - 1)' 69 | ;; 70 | 71 | *) 72 | echo 73 | echo "$0: error: can not detect $ngx_type size" 74 | 75 | echo "----------" >> $NGX_AUTOCONF_ERR 76 | cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR 77 | echo "----------" >> $NGX_AUTOCONF_ERR 78 | echo $ngx_test >> $NGX_AUTOCONF_ERR 79 | echo "----------" >> $NGX_AUTOCONF_ERR 80 | 81 | exit 1 82 | esac 83 | 84 | -------------------------------------------------------------------------------- /src/os/unix/ngx_gcc_atomic_sparc64.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | /* 9 | * "casa [r1] 0x80, r2, r0" and 10 | * "casxa [r1] 0x80, r2, r0" do the following: 11 | * 12 | * if ([r1] == r2) { 13 | * swap(r0, [r1]); 14 | * } else { 15 | * r0 = [r1]; 16 | * } 17 | * 18 | * so "r0 == r2" means that the operation was successfull. 19 | * 20 | * 21 | * The "r" means the general register. 22 | * The "+r" means the general register used for both input and output. 23 | */ 24 | 25 | 26 | #if (NGX_PTR_SIZE == 4) 27 | #define NGX_CASA "casa" 28 | #else 29 | #define NGX_CASA "casxa" 30 | #endif 31 | 32 | 33 | static ngx_inline ngx_atomic_uint_t 34 | ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, 35 | ngx_atomic_uint_t set) 36 | { 37 | __asm__ volatile ( 38 | 39 | NGX_CASA " [%1] 0x80, %2, %0" 40 | 41 | : "+r" (set) : "r" (lock), "r" (old) : "memory"); 42 | 43 | return (set == old); 44 | } 45 | 46 | 47 | static ngx_inline ngx_atomic_int_t 48 | ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) 49 | { 50 | ngx_atomic_uint_t old, res; 51 | 52 | old = *value; 53 | 54 | for ( ;; ) { 55 | 56 | res = old + add; 57 | 58 | __asm__ volatile ( 59 | 60 | NGX_CASA " [%1] 0x80, %2, %0" 61 | 62 | : "+r" (res) : "r" (value), "r" (old) : "memory"); 63 | 64 | if (res == old) { 65 | return res; 66 | } 67 | 68 | old = res; 69 | } 70 | } 71 | 72 | 73 | #if (NGX_SMP) 74 | #define ngx_memory_barrier() \ 75 | __asm__ volatile ( \ 76 | "membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" \ 77 | ::: "memory") 78 | #else 79 | #define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") 80 | #endif 81 | 82 | #define ngx_cpu_pause() 83 | -------------------------------------------------------------------------------- /src/os/unix/ngx_darwin_config.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_DARWIN_CONFIG_H_INCLUDED_ 9 | #define _NGX_DARWIN_CONFIG_H_INCLUDED_ 10 | 11 | 12 | #define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_0 13 | 14 | 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include /* offsetof() */ 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include /* statfs() */ 31 | 32 | #include /* FIONBIO */ 33 | #include 34 | #include 35 | #include 36 | #include 37 | 38 | #include 39 | #include 40 | #include 41 | #include 42 | 43 | #include 44 | #include 45 | #include /* TCP_NODELAY */ 46 | #include 47 | #include 48 | #include 49 | 50 | #include 51 | #include 52 | 53 | 54 | #ifndef IOV_MAX 55 | #define IOV_MAX 64 56 | #endif 57 | 58 | 59 | #include 60 | 61 | 62 | #if (NGX_HAVE_POSIX_SEM) 63 | #include 64 | #endif 65 | 66 | 67 | #if (NGX_HAVE_POLL) 68 | #include 69 | #endif 70 | 71 | 72 | #if (NGX_HAVE_KQUEUE) 73 | #include 74 | #endif 75 | 76 | 77 | #define NGX_LISTEN_BACKLOG -1 78 | 79 | 80 | #ifndef NGX_HAVE_INHERITED_NONBLOCK 81 | #define NGX_HAVE_INHERITED_NONBLOCK 1 82 | #endif 83 | 84 | 85 | #ifndef NGX_HAVE_CASELESS_FILESYSTEM 86 | #define NGX_HAVE_CASELESS_FILESYSTEM 1 87 | #endif 88 | 89 | 90 | #define NGX_HAVE_OS_SPECIFIC_INIT 1 91 | 92 | 93 | extern char **environ; 94 | 95 | 96 | #endif /* _NGX_DARWIN_CONFIG_H_INCLUDED_ */ 97 | -------------------------------------------------------------------------------- /src/os/unix/ngx_errno.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_ERRNO_H_INCLUDED_ 9 | #define _NGX_ERRNO_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | typedef int ngx_err_t; 17 | 18 | #define NGX_EPERM EPERM 19 | #define NGX_ENOENT ENOENT 20 | #define NGX_ENOPATH ENOENT 21 | #define NGX_ESRCH ESRCH 22 | #define NGX_EINTR EINTR 23 | #define NGX_ECHILD ECHILD 24 | #define NGX_ENOMEM ENOMEM 25 | #define NGX_EACCES EACCES 26 | #define NGX_EBUSY EBUSY 27 | #define NGX_EEXIST EEXIST 28 | #define NGX_EXDEV EXDEV 29 | #define NGX_ENOTDIR ENOTDIR 30 | #define NGX_EISDIR EISDIR 31 | #define NGX_EINVAL EINVAL 32 | #define NGX_ENOSPC ENOSPC 33 | #define NGX_EPIPE EPIPE 34 | #define NGX_EINPROGRESS EINPROGRESS 35 | #define NGX_EADDRINUSE EADDRINUSE 36 | #define NGX_ECONNABORTED ECONNABORTED 37 | #define NGX_ECONNRESET ECONNRESET 38 | #define NGX_ENOTCONN ENOTCONN 39 | #define NGX_ETIMEDOUT ETIMEDOUT 40 | #define NGX_ECONNREFUSED ECONNREFUSED 41 | #define NGX_ENAMETOOLONG ENAMETOOLONG 42 | #define NGX_ENETDOWN ENETDOWN 43 | #define NGX_ENETUNREACH ENETUNREACH 44 | #define NGX_EHOSTDOWN EHOSTDOWN 45 | #define NGX_EHOSTUNREACH EHOSTUNREACH 46 | #define NGX_ENOSYS ENOSYS 47 | #define NGX_ECANCELED ECANCELED 48 | #define NGX_EILSEQ EILSEQ 49 | #define NGX_ENOMOREFILES 0 50 | 51 | #if (__hpux__) 52 | #define NGX_EAGAIN EWOULDBLOCK 53 | #else 54 | #define NGX_EAGAIN EAGAIN 55 | #endif 56 | 57 | 58 | #define ngx_errno errno 59 | #define ngx_socket_errno errno 60 | #define ngx_set_errno(err) errno = err 61 | #define ngx_set_socket_errno(err) errno = err 62 | 63 | 64 | u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size); 65 | ngx_uint_t ngx_strerror_init(void); 66 | 67 | 68 | #endif /* _NGX_ERRNO_H_INCLUDED_ */ 69 | -------------------------------------------------------------------------------- /src/os/unix/ngx_alloc.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | 12 | ngx_uint_t ngx_pagesize; 13 | ngx_uint_t ngx_pagesize_shift; 14 | ngx_uint_t ngx_cacheline_size; 15 | 16 | 17 | void * 18 | ngx_alloc(size_t size, ngx_log_t *log) 19 | { 20 | void *p; 21 | 22 | p = malloc(size); 23 | if (p == NULL) { 24 | ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, 25 | "malloc(%uz) failed", size); 26 | } 27 | 28 | ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size); 29 | 30 | return p; 31 | } 32 | 33 | /* 该函数从系统内存分配内存,而不是内存池,另外该函数还会对内存进行初始化,这就是两个不同点*/ 34 | void * 35 | ngx_calloc(size_t size, ngx_log_t *log) 36 | { 37 | void *p; 38 | 39 | p = ngx_alloc(size, log); 40 | 41 | if (p) { 42 | ngx_memzero(p, size); 43 | } 44 | 45 | return p; 46 | } 47 | 48 | 49 | #if (NGX_HAVE_POSIX_MEMALIGN) 50 | 51 | void * 52 | ngx_memalign(size_t alignment, size_t size, ngx_log_t *log) 53 | { 54 | void *p; 55 | int err; 56 | 57 | err = posix_memalign(&p, alignment, size); 58 | 59 | if (err) { 60 | ngx_log_error(NGX_LOG_EMERG, log, err, 61 | "posix_memalign(%uz, %uz) failed", alignment, size); 62 | p = NULL; 63 | } 64 | 65 | ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0, 66 | "posix_memalign: %p:%uz @%uz", p, size, alignment); 67 | 68 | return p; 69 | } 70 | 71 | #elif (NGX_HAVE_MEMALIGN) 72 | 73 | void * 74 | ngx_memalign(size_t alignment, size_t size, ngx_log_t *log) 75 | { 76 | void *p; 77 | 78 | p = memalign(alignment, size); 79 | if (p == NULL) { 80 | ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, 81 | "memalign(%uz, %uz) failed", alignment, size); 82 | } 83 | 84 | ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0, 85 | "memalign: %p:%uz @%uz", p, size, alignment); 86 | 87 | return p; 88 | } 89 | 90 | #endif 91 | -------------------------------------------------------------------------------- /auto/lib/perl/conf: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | echo "checking for perl" 7 | 8 | 9 | NGX_PERL_VER=`$NGX_PERL -v 2>&1 | grep '^This is perl' 2>&1 \ 10 | | sed -e 's/^This is perl, \(.*\)/\1/'` 11 | 12 | if test -n "$NGX_PERL_VER"; then 13 | echo " + perl version: $NGX_PERL_VER" 14 | 15 | if [ "`echo 'use 5.006001; print "OK"' | $NGX_PERL 2>&1`" != OK ]; then 16 | echo 17 | echo "$0: error: perl 5.6.1 or higher is required" 18 | echo 19 | 20 | exit 1; 21 | fi 22 | 23 | NGX_PERL_CFLAGS="$CFLAGS `$NGX_PERL -MExtUtils::Embed -e ccopts`" 24 | NGX_PM_CFLAGS=`$NGX_PERL -MExtUtils::Embed -e ccopts` 25 | 26 | # gcc 4.1/4.2 warn about unused values in pTHX_ 27 | NGX_PERL_CFLAGS=`echo $NGX_PERL_CFLAGS \ 28 | | sed -e 's/-Wunused-value/-Wno-unused-value/'` 29 | # icc8 warns 'declaration hides parameter "my_perl"' in ENTER and LEAVE 30 | NGX_PERL_CFLAGS=`echo $NGX_PERL_CFLAGS \ 31 | | sed -e 's/-wd171/-wd171 -wd1599/'` 32 | 33 | ngx_perl_ldopts=`$NGX_PERL -MExtUtils::Embed -e ldopts` 34 | 35 | if $NGX_PERL -V:usemultiplicity | grep define > /dev/null; then 36 | have=NGX_HAVE_PERL_MULTIPLICITY . auto/have 37 | echo " + perl interpreter multiplicity found" 38 | fi 39 | 40 | if $NGX_PERL -V:useithreads | grep undef > /dev/null; then 41 | # FreeBSD port wants to link with -pthread non-threaded perl 42 | ngx_perl_ldopts=`echo $ngx_perl_ldopts | sed 's/ -pthread//'` 43 | fi 44 | 45 | CORE_LINK="$CORE_LINK $ngx_perl_ldopts" 46 | LINK_DEPS="$LINK_DEPS $NGX_OBJS/src/http/modules/perl/blib/arch/auto/nginx/nginx.so" 47 | 48 | if test -n "$NGX_PERL_MODULES"; then 49 | have=NGX_PERL_MODULES value="(u_char *) \"$NGX_PERL_MODULES\"" 50 | . auto/define 51 | NGX_PERL_MODULES_MAN=$NGX_PERL_MODULES/man3 52 | fi 53 | 54 | else 55 | echo 56 | echo "$0: error: perl 5.6.1 or higher is required" 57 | echo 58 | 59 | exit 1; 60 | fi 61 | -------------------------------------------------------------------------------- /src/os/unix/ngx_time.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | 12 | /* 13 | * FreeBSD does not test /etc/localtime change, however, we can workaround it 14 | * by calling tzset() with TZ and then without TZ to update timezone. 15 | * The trick should work since FreeBSD 2.1.0. 16 | * 17 | * Linux does not test /etc/localtime change in localtime(), 18 | * but may stat("/etc/localtime") several times in every strftime(), 19 | * therefore we use it to update timezone. 20 | * 21 | * Solaris does not test /etc/TIMEZONE change too and no workaround available. 22 | */ 23 | 24 | void 25 | ngx_timezone_update(void) 26 | { 27 | #if (NGX_FREEBSD) 28 | 29 | if (getenv("TZ")) { 30 | return; 31 | } 32 | 33 | putenv("TZ=UTC"); 34 | 35 | tzset(); 36 | 37 | unsetenv("TZ"); 38 | 39 | tzset(); 40 | 41 | #elif (NGX_LINUX) 42 | time_t s; 43 | struct tm *t; 44 | char buf[4]; 45 | 46 | s = time(0); 47 | 48 | t = localtime(&s); 49 | 50 | strftime(buf, 4, "%H", t); 51 | 52 | #endif 53 | } 54 | 55 | 56 | void 57 | ngx_localtime(time_t s, ngx_tm_t *tm) 58 | { 59 | #if (NGX_HAVE_LOCALTIME_R) 60 | (void) localtime_r(&s, tm); 61 | 62 | #else 63 | ngx_tm_t *t; 64 | 65 | t = localtime(&s); 66 | *tm = *t; 67 | 68 | #endif 69 | 70 | tm->ngx_tm_mon++; 71 | tm->ngx_tm_year += 1900; 72 | } 73 | 74 | 75 | void 76 | ngx_libc_localtime(time_t s, struct tm *tm) 77 | { 78 | #if (NGX_HAVE_LOCALTIME_R) 79 | (void) localtime_r(&s, tm); 80 | 81 | #else 82 | struct tm *t; 83 | 84 | t = localtime(&s); 85 | *tm = *t; 86 | 87 | #endif 88 | } 89 | 90 | 91 | void 92 | ngx_libc_gmtime(time_t s, struct tm *tm) 93 | { 94 | #if (NGX_HAVE_LOCALTIME_R) 95 | (void) gmtime_r(&s, tm); 96 | 97 | #else 98 | struct tm *t; 99 | 100 | t = gmtime(&s); 101 | *tm = *t; 102 | 103 | #endif 104 | } 105 | -------------------------------------------------------------------------------- /auto/lib/sha1/conf: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | if [ $SHA1 != NONE ]; then 7 | 8 | have=NGX_HAVE_SHA1 . auto/have 9 | CORE_INCS="$CORE_INCS $SHA1" 10 | 11 | case "$NGX_CC_NAME" in 12 | 13 | msvc* | owc* | bcc) 14 | LINK_DEPS="$LINK_DEPS $SHA1/sha1.lib" 15 | CORE_LIBS="$CORE_LIBS $SHA1/sha1.lib" 16 | ;; 17 | 18 | icc*) 19 | LINK_DEPS="$LINK_DEPS $SHA1/libsha.a" 20 | 21 | # to allow -ipo optimization we link with the *.o but not library 22 | CORE_LIBS="$CORE_LIBS $SHA1/sha1_dgst.o" 23 | 24 | if [ $SHA1_ASM = YES ]; then 25 | CORE_LIBS="$CORE_LIBS $SHA1/asm/sx86-elf.o" 26 | fi 27 | ;; 28 | 29 | *) 30 | LINK_DEPS="$LINK_DEPS $SHA1/libsha.a" 31 | CORE_LIBS="$CORE_LIBS $SHA1/libsha.a" 32 | #CORE_LIBS="$CORE_LIBS -L $SHA1 -lsha" 33 | ;; 34 | 35 | esac 36 | 37 | else 38 | 39 | if [ "$NGX_PLATFORM" != win32 ]; then 40 | 41 | SHA1=NO 42 | 43 | # FreeBSD 44 | 45 | ngx_feature="sha1 in system md library" 46 | ngx_feature_name=NGX_HAVE_SHA1 47 | ngx_feature_run=no 48 | ngx_feature_incs="#include " 49 | ngx_feature_path= 50 | ngx_feature_libs="-lmd" 51 | ngx_feature_test="SHA_CTX sha1; SHA1_Init(&sha1)" 52 | . auto/feature 53 | 54 | ngx_sha1_lib="system md" 55 | 56 | if [ $ngx_found = no ]; then 57 | 58 | # OpenSSL crypto library 59 | 60 | ngx_feature="OpenSSL sha1 crypto library" 61 | ngx_feature_incs="#include " 62 | ngx_feature_libs="-lcrypto" 63 | . auto/feature 64 | 65 | ngx_sha1_lib="system crypto" 66 | 67 | if [ $ngx_found = yes ]; then 68 | have=NGX_HAVE_OPENSSL_SHA1_H . auto/have 69 | fi 70 | fi 71 | 72 | if [ $ngx_found = yes ]; then 73 | CORE_LIBS="$CORE_LIBS $ngx_feature_libs" 74 | SHA1=YES 75 | SHA1_LIB=$ngx_sha1_lib 76 | fi 77 | fi 78 | 79 | fi 80 | -------------------------------------------------------------------------------- /src/os/unix/ngx_linux_init.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | 12 | u_char ngx_linux_kern_ostype[50]; 13 | u_char ngx_linux_kern_osrelease[50]; 14 | 15 | int ngx_linux_rtsig_max; 16 | 17 | 18 | static ngx_os_io_t ngx_linux_io = { 19 | ngx_unix_recv, 20 | ngx_readv_chain, 21 | ngx_udp_unix_recv, 22 | ngx_unix_send, 23 | #if (NGX_HAVE_SENDFILE) 24 | ngx_linux_sendfile_chain, 25 | NGX_IO_SENDFILE 26 | #else 27 | ngx_writev_chain, 28 | 0 29 | #endif 30 | }; 31 | 32 | 33 | ngx_int_t 34 | ngx_os_specific_init(ngx_log_t *log) 35 | { 36 | struct utsname u; 37 | 38 | if (uname(&u) == -1) { 39 | ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "uname() failed"); 40 | return NGX_ERROR; 41 | } 42 | 43 | (void) ngx_cpystrn(ngx_linux_kern_ostype, (u_char *) u.sysname, 44 | sizeof(ngx_linux_kern_ostype)); 45 | 46 | (void) ngx_cpystrn(ngx_linux_kern_osrelease, (u_char *) u.release, 47 | sizeof(ngx_linux_kern_osrelease)); 48 | 49 | #if (NGX_HAVE_RTSIG) 50 | { 51 | int name[2]; 52 | size_t len; 53 | ngx_err_t err; 54 | 55 | name[0] = CTL_KERN; 56 | name[1] = KERN_RTSIGMAX; 57 | len = sizeof(ngx_linux_rtsig_max); 58 | 59 | if (sysctl(name, 2, &ngx_linux_rtsig_max, &len, NULL, 0) == -1) { 60 | err = ngx_errno; 61 | 62 | if (err != NGX_ENOTDIR && err != NGX_ENOSYS) { 63 | ngx_log_error(NGX_LOG_ALERT, log, err, 64 | "sysctl(KERN_RTSIGMAX) failed"); 65 | 66 | return NGX_ERROR; 67 | } 68 | 69 | ngx_linux_rtsig_max = 0; 70 | } 71 | 72 | } 73 | #endif 74 | 75 | ngx_os_io = ngx_linux_io; 76 | 77 | return NGX_OK; 78 | } 79 | 80 | 81 | void 82 | ngx_os_specific_status(ngx_log_t *log) 83 | { 84 | ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s", 85 | ngx_linux_kern_ostype, ngx_linux_kern_osrelease); 86 | 87 | #if (NGX_HAVE_RTSIG) 88 | ngx_log_error(NGX_LOG_NOTICE, log, 0, "sysctl(KERN_RTSIGMAX): %d", 89 | ngx_linux_rtsig_max); 90 | #endif 91 | } 92 | -------------------------------------------------------------------------------- /auto/lib/zlib/conf: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | if [ $ZLIB != NONE ]; then 7 | CORE_INCS="$CORE_INCS $ZLIB" 8 | 9 | case "$NGX_CC_NAME" in 10 | 11 | msvc* | owc* | bcc) 12 | LINK_DEPS="$LINK_DEPS $ZLIB/zlib.lib" 13 | CORE_LIBS="$CORE_LIBS $ZLIB/zlib.lib" 14 | ;; 15 | 16 | icc*) 17 | LINK_DEPS="$LINK_DEPS $ZLIB/libz.a" 18 | 19 | # to allow -ipo optimization we link with the *.o but not library 20 | CORE_LIBS="$CORE_LIBS $ZLIB/adler32.o" 21 | CORE_LIBS="$CORE_LIBS $ZLIB/crc32.o" 22 | CORE_LIBS="$CORE_LIBS $ZLIB/deflate.o" 23 | CORE_LIBS="$CORE_LIBS $ZLIB/trees.o" 24 | CORE_LIBS="$CORE_LIBS $ZLIB/zutil.o" 25 | CORE_LIBS="$CORE_LIBS $ZLIB/compress.o" 26 | 27 | if [ $ZLIB_ASM != NO ]; then 28 | CORE_LIBS="$CORE_LIBS $ZLIB/match.o" 29 | fi 30 | ;; 31 | 32 | *) 33 | LINK_DEPS="$LINK_DEPS $ZLIB/libz.a" 34 | CORE_LIBS="$CORE_LIBS $ZLIB/libz.a" 35 | #CORE_LIBS="$CORE_LIBS -L $ZLIB -lz" 36 | ;; 37 | 38 | esac 39 | 40 | else 41 | 42 | if [ "$NGX_PLATFORM" != win32 ]; then 43 | ZLIB=NO 44 | 45 | # FreeBSD, Solaris, Linux 46 | 47 | ngx_feature="zlib library" 48 | ngx_feature_name= 49 | ngx_feature_run=no 50 | ngx_feature_incs="#include " 51 | ngx_feature_path= 52 | ngx_feature_libs="-lz" 53 | ngx_feature_test="z_stream z; deflate(&z, Z_NO_FLUSH)" 54 | . auto/feature 55 | 56 | 57 | if [ $ngx_found = yes ]; then 58 | CORE_LIBS="$CORE_LIBS $ngx_feature_libs" 59 | ZLIB=YES 60 | ngx_found=no 61 | fi 62 | fi 63 | 64 | if [ $ZLIB != YES ]; then 65 | cat << END 66 | 67 | $0: error: the HTTP gzip module requires the zlib library. 68 | You can either disable the module by using --without-http_gzip_module 69 | option, or install the zlib library into the system, or build the zlib library 70 | statically from the source with nginx by using --with-zlib= option. 71 | 72 | END 73 | exit 1 74 | fi 75 | 76 | fi 77 | -------------------------------------------------------------------------------- /src/os/unix/ngx_socket.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | 12 | /* 13 | * ioctl(FIONBIO) sets a non-blocking mode with the single syscall 14 | * while fcntl(F_SETFL, O_NONBLOCK) needs to learn the current state 15 | * using fcntl(F_GETFL). 16 | * 17 | * ioctl() and fcntl() are syscalls at least in FreeBSD 2.x, Linux 2.2 18 | * and Solaris 7. 19 | * 20 | * ioctl() in Linux 2.4 and 2.6 uses BKL, however, fcntl(F_SETFL) uses it too. 21 | */ 22 | 23 | 24 | #if (NGX_HAVE_FIONBIO) 25 | 26 | int 27 | ngx_nonblocking(ngx_socket_t s) 28 | { 29 | int nb; 30 | 31 | nb = 1; 32 | 33 | return ioctl(s, FIONBIO, &nb); 34 | } 35 | 36 | 37 | int 38 | ngx_blocking(ngx_socket_t s) 39 | { 40 | int nb; 41 | 42 | nb = 0; 43 | 44 | return ioctl(s, FIONBIO, &nb); 45 | } 46 | 47 | #endif 48 | 49 | 50 | #if (NGX_FREEBSD) 51 | 52 | int 53 | ngx_tcp_nopush(ngx_socket_t s) 54 | { 55 | int tcp_nopush; 56 | 57 | tcp_nopush = 1; 58 | 59 | return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH, 60 | (const void *) &tcp_nopush, sizeof(int)); 61 | } 62 | 63 | 64 | int 65 | ngx_tcp_push(ngx_socket_t s) 66 | { 67 | int tcp_nopush; 68 | 69 | tcp_nopush = 0; 70 | 71 | return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH, 72 | (const void *) &tcp_nopush, sizeof(int)); 73 | } 74 | 75 | #elif (NGX_LINUX) 76 | 77 | 78 | int 79 | ngx_tcp_nopush(ngx_socket_t s) 80 | { 81 | int cork; 82 | 83 | cork = 1; 84 | 85 | return setsockopt(s, IPPROTO_TCP, TCP_CORK, 86 | (const void *) &cork, sizeof(int)); 87 | } 88 | 89 | 90 | int 91 | ngx_tcp_push(ngx_socket_t s) 92 | { 93 | int cork; 94 | 95 | cork = 0; 96 | 97 | return setsockopt(s, IPPROTO_TCP, TCP_CORK, 98 | (const void *) &cork, sizeof(int)); 99 | } 100 | 101 | #else 102 | 103 | int 104 | ngx_tcp_nopush(ngx_socket_t s) 105 | { 106 | return 0; 107 | } 108 | 109 | 110 | int 111 | ngx_tcp_push(ngx_socket_t s) 112 | { 113 | return 0; 114 | } 115 | 116 | #endif 117 | -------------------------------------------------------------------------------- /src/core/ngx_array.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | //参考 http://blog.csdn.net/sunhappy2200/article/details/5915189 8 | // http://tengine.taobao.org/book/chapter_02.html#ngx-array-t-100 9 | #ifndef _NGX_ARRAY_H_INCLUDED_ 10 | #define _NGX_ARRAY_H_INCLUDED_ 11 | 12 | 13 | #include 14 | #include 15 | 16 | // 动态数组 17 | struct ngx_array_s { 18 | // elts指向数组的首地址 19 | void *elts; 20 | // nelts是数组中已经使用的元素个数 21 | ngx_uint_t nelts; 22 | // 每个数组元素占用的内存大小 23 | size_t size; 24 | // 当前数组中能够容纳元素个数的总大小 25 | ngx_uint_t nalloc; 26 | // 内存池对象 27 | ngx_pool_t *pool; 28 | }; 29 | 30 | /* 31 | 从内存池中创建n个元素的数组,元素大小为size 32 | 创建一个新的数组对象,并返回这个对象。 33 | 34 | p: 数组分配内存使用的内存池; 35 | n: 数组的初始容量大小,即在不扩容的情况下最多可以容纳的元素个数。 36 | size: 单个元素的大小,单位是字节。 37 | 38 | 注意事项: 由于使用ngx_palloc分配内存,数组在扩容时,旧的内存不会被释放,会造成内存的浪费。 39 | 因此,最好能提前规划好数组的容量,在创建或者初始化的时候一次搞定,避免多次扩容,造成内存浪费。 40 | */ 41 | ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size); 42 | 43 | // 销毁该数组对象,并释放其分配的内存回内存池。 44 | void ngx_array_destroy(ngx_array_t *a); 45 | 46 | // 在数组a上新追加一个元素,并返回指向新元素的指针。 47 | // 需要把返回的指针使用类型转换,转换为具体的类型,然后再给新元素本身或者是各字段(如果数组的元素是复杂类型)赋值。 48 | // 如果数组已满,则重新分配两倍(nalloc*size)的内存空间,且nalloc更新为2*nalloc 49 | void *ngx_array_push(ngx_array_t *a); 50 | 51 | // 返回将要添加n个元素到数组中其首个元素的地址 52 | void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n); 53 | 54 | 55 | // 如果一个数组对象是被分配在堆上的,那么当调用ngx_array_destroy销毁以后,如果想再次使用,就可以调用此函数。 56 | // 如果一个数组对象是被分配在栈上的,那么就需要调用此函数,进行初始化的工作以后,才可以使用。 57 | static ngx_inline ngx_int_t 58 | ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size) 59 | { 60 | /* 61 | * set "array->nelts" before "array->elts", otherwise MSVC thinks 62 | * that "array->nelts" may be used without having been initialized 63 | */ 64 | 65 | array->nelts = 0; 66 | array->size = size; 67 | array->nalloc = n; 68 | array->pool = pool; 69 | 70 | array->elts = ngx_palloc(pool, n * size); 71 | if (array->elts == NULL) { 72 | return NGX_ERROR; 73 | } 74 | 75 | return NGX_OK; 76 | } 77 | 78 | 79 | #endif /* _NGX_ARRAY_H_INCLUDED_ */ 80 | -------------------------------------------------------------------------------- /auto/lib/md5/make: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | case "$NGX_CC_NAME" in 7 | 8 | msvc*) 9 | ngx_makefile=makefile.msvc 10 | ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC MD5_ASM=$MD5_ASM" 11 | ngx_md5="MD5=\"$MD5\"" 12 | ;; 13 | 14 | owc*) 15 | ngx_makefile=makefile.owc 16 | ngx_opt="CPU_OPT=\"$CPU_OPT\"" 17 | ngx_md5=`echo MD5=\"$MD5\" | sed -e "s/\//$ngx_regex_dirsep/g"` 18 | ;; 19 | 20 | bcc) 21 | ngx_makefile=makefile.bcc 22 | ngx_opt="-DCPU_OPT=\"$CPU_OPT\" -DMD5_ASM=$MD5_ASM" 23 | ngx_md5=`echo \-DMD5=\"$MD5\" | sed -e "s/\//$ngx_regex_dirsep/g"` 24 | ;; 25 | 26 | esac 27 | 28 | 29 | done=NO 30 | 31 | 32 | case "$NGX_PLATFORM" in 33 | 34 | win32) 35 | cat << END >> $NGX_MAKEFILE 36 | 37 | `echo "$MD5/md5.lib: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"` 38 | \$(MAKE) -f auto/lib/md5/$ngx_makefile $ngx_opt $ngx_md5 39 | 40 | END 41 | 42 | done=YES 43 | ;; 44 | 45 | SunOS:*:i86pc) 46 | if [ $MD5_ASM = YES ]; then 47 | 48 | cat << END >> $NGX_MAKEFILE 49 | 50 | $MD5/libmd5.a: $NGX_MAKEFILE 51 | cd $MD5 \\ 52 | && \$(MAKE) CFLAGS="$MD5_OPT -DSOL -DMD5_ASM -DL_ENDIAN" \\ 53 | CC="\$(CC)" CPP="\$(CPP)" \\ 54 | MD5_ASM_OBJ=asm/mx86-sol.o clean libmd5.a 55 | 56 | END 57 | 58 | done=YES 59 | fi 60 | ;; 61 | 62 | # FreeBSD: i386 63 | # Linux: i686 64 | 65 | *:i386 | *:i686) 66 | if [ $MD5_ASM = YES ]; then 67 | 68 | cat << END >> $NGX_MAKEFILE 69 | 70 | $MD5/libmd5.a: $NGX_MAKEFILE 71 | cd $MD5 \\ 72 | && \$(MAKE) CFLAGS="$MD5_OPT -DELF -DMD5_ASM -DL_ENDIAN" \\ 73 | CC="\$(CC)" CPP="\$(CPP)" \\ 74 | MD5_ASM_OBJ=asm/mx86-elf.o clean libmd5.a 75 | 76 | END 77 | 78 | done=YES 79 | fi 80 | ;; 81 | 82 | esac 83 | 84 | 85 | if [ $done = NO ]; then 86 | 87 | cat << END >> $NGX_MAKEFILE 88 | 89 | $MD5/libmd5.a: $NGX_MAKEFILE 90 | cd $MD5 \\ 91 | && \$(MAKE) CFLAGS="$MD5_OPT" \\ 92 | CC="\$(CC)" MD5_ASM_OBJ= clean libmd5.a 93 | 94 | END 95 | 96 | fi 97 | -------------------------------------------------------------------------------- /src/os/unix/ngx_errno.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | 12 | /* 13 | * The strerror() messages are copied because: 14 | * 15 | * 1) strerror() and strerror_r() functions are not Async-Signal-Safe, 16 | * therefore, they cannot be used in signal handlers; 17 | * 18 | * 2) a direct sys_errlist[] array may be used instead of these functions, 19 | * but Linux linker warns about its usage: 20 | * 21 | * warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead 22 | * warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead 23 | * 24 | * causing false bug reports. 25 | */ 26 | 27 | 28 | static ngx_str_t *ngx_sys_errlist; 29 | static ngx_str_t ngx_unknown_error = ngx_string("Unknown error"); 30 | 31 | 32 | u_char * 33 | ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) 34 | { 35 | ngx_str_t *msg; 36 | 37 | msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]: 38 | &ngx_unknown_error; 39 | size = ngx_min(size, msg->len); 40 | 41 | return ngx_cpymem(errstr, msg->data, size); 42 | } 43 | 44 | 45 | ngx_uint_t 46 | ngx_strerror_init(void) 47 | { 48 | char *msg; 49 | u_char *p; 50 | size_t len; 51 | ngx_err_t err; 52 | 53 | /* 54 | * ngx_strerror() is not ready to work at this stage, therefore, 55 | * malloc() is used and possible errors are logged using strerror(). 56 | */ 57 | 58 | len = NGX_SYS_NERR * sizeof(ngx_str_t); 59 | 60 | ngx_sys_errlist = malloc(len); 61 | if (ngx_sys_errlist == NULL) { 62 | goto failed; 63 | } 64 | 65 | for (err = 0; err < NGX_SYS_NERR; err++) { 66 | msg = strerror(err); 67 | len = ngx_strlen(msg); 68 | 69 | p = malloc(len); 70 | if (p == NULL) { 71 | goto failed; 72 | } 73 | 74 | ngx_memcpy(p, msg, len); 75 | ngx_sys_errlist[err].len = len; 76 | ngx_sys_errlist[err].data = p; 77 | } 78 | 79 | return NGX_OK; 80 | 81 | failed: 82 | 83 | err = errno; 84 | ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err)); 85 | 86 | return NGX_ERROR; 87 | } 88 | -------------------------------------------------------------------------------- /auto/lib/sha1/make: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | case "$NGX_CC_NAME" in 7 | 8 | msvc*) 9 | ngx_makefile=makefile.msvc 10 | ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC SHA1_ASM=$SHA1_ASM" 11 | ngx_sha1="SHA1=\"$SHA1\"" 12 | ;; 13 | 14 | owc*) 15 | ngx_makefile=makefile.owc 16 | ngx_opt="CPU_OPT=\"$CPU_OPT\"" 17 | ngx_sha1=`echo SHA1=\"$SHA1\" | sed -e "s/\//$ngx_regex_dirsep/g"` 18 | ;; 19 | 20 | bcc) 21 | ngx_makefile=makefile.bcc 22 | ngx_opt="-DCPU_OPT=\"$CPU_OPT\" -DSHA1_ASM=$SHA1_ASM" 23 | ngx_sha1=`echo \-DSHA1=\"$SHA1\" | sed -e "s/\//$ngx_regex_dirsep/g"` 24 | ;; 25 | 26 | esac 27 | 28 | 29 | done=NO 30 | 31 | 32 | case "$NGX_PLATFORM" in 33 | 34 | win32) 35 | cat << END >> $NGX_MAKEFILE 36 | 37 | `echo "$SHA1/sha1.lib: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"` 38 | \$(MAKE) -f auto/lib/sha1/$ngx_makefile $ngx_opt $ngx_sha1 39 | 40 | END 41 | 42 | done=YES 43 | ;; 44 | 45 | SunOS:*:i86pc) 46 | if [ $SHA1_ASM = YES ]; then 47 | 48 | cat << END >> $NGX_MAKEFILE 49 | 50 | $SHA1/libsha.a: $NGX_MAKEFILE 51 | cd $SHA1 \\ 52 | && \$(MAKE) CFLAGS="$SHA1_OPT -DSOL -DSHA1_ASM -DL_ENDIAN" \\ 53 | CC="\$(CC)" CPP="\$(CPP)" \\ 54 | SHA_ASM_OBJ=asm/sx86-sol.o clean libsha.a 55 | 56 | END 57 | 58 | done=YES 59 | fi 60 | ;; 61 | 62 | # FreeBSD: i386 63 | # Linux: i686 64 | 65 | *:i386 | *:i686) 66 | if [ $SHA1_ASM = YES ]; then 67 | 68 | cat << END >> $NGX_MAKEFILE 69 | 70 | $SHA1/libsha.a: $NGX_MAKEFILE 71 | cd $SHA1 \\ 72 | && \$(MAKE) CFLAGS="$SHA1_OPT -DELF -DSHA1_ASM -DL_ENDIAN" \\ 73 | CC="\$(CC)" CPP="\$(CPP)" \\ 74 | SHA_ASM_OBJ=asm/sx86-elf.o clean libsha.a 75 | 76 | END 77 | 78 | done=YES 79 | fi 80 | ;; 81 | 82 | esac 83 | 84 | 85 | if [ $done = NO ]; then 86 | 87 | cat << END >> $NGX_MAKEFILE 88 | 89 | $SHA1/libsha.a: $NGX_MAKEFILE 90 | cd $SHA1 \\ 91 | && \$(MAKE) CFLAGS="$SHA1_OPT" \\ 92 | CC="\$(CC)" SHA_ASM_OBJ= clean libsha.a 93 | 94 | END 95 | 96 | fi 97 | -------------------------------------------------------------------------------- /auto/lib/openssl/conf: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | if [ $OPENSSL != NONE ]; then 7 | 8 | case "$CC" in 9 | 10 | cl | bcc32) 11 | have=NGX_OPENSSL . auto/have 12 | have=NGX_SSL . auto/have 13 | 14 | CFLAGS="$CFLAGS -DNO_SYS_TYPES_H" 15 | 16 | CORE_INCS="$CORE_INCS $OPENSSL/openssl/include" 17 | CORE_DEPS="$CORE_DEPS $OPENSSL/openssl/include/openssl/ssl.h" 18 | CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/ssleay32.lib" 19 | CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libeay32.lib" 20 | 21 | # libeay32.lib requires gdi32.lib 22 | CORE_LIBS="$CORE_LIBS gdi32.lib" 23 | # OpenSSL 1.0.0 requires crypt32.lib 24 | CORE_LIBS="$CORE_LIBS crypt32.lib" 25 | ;; 26 | 27 | *) 28 | have=NGX_OPENSSL . auto/have 29 | have=NGX_SSL . auto/have 30 | 31 | CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include" 32 | CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h" 33 | CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a" 34 | CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a" 35 | CORE_LIBS="$CORE_LIBS $NGX_LIBDL" 36 | ;; 37 | esac 38 | 39 | else 40 | 41 | if [ "$NGX_PLATFORM" != win32 ]; then 42 | 43 | OPENSSL=NO 44 | 45 | ngx_feature="OpenSSL library" 46 | ngx_feature_name="NGX_OPENSSL" 47 | ngx_feature_run=no 48 | ngx_feature_incs="#include " 49 | ngx_feature_path= 50 | ngx_feature_libs="-lssl -lcrypto" 51 | ngx_feature_test="SSL_library_init()" 52 | . auto/feature 53 | 54 | if [ $ngx_found = yes ]; then 55 | have=NGX_SSL . auto/have 56 | CORE_LIBS="$CORE_LIBS $ngx_feature_libs $NGX_LIBDL" 57 | OPENSSL=YES 58 | fi 59 | fi 60 | 61 | if [ $OPENSSL != YES ]; then 62 | 63 | cat << END 64 | 65 | $0: error: SSL modules require the OpenSSL library. 66 | You can either do not enable the modules, or install the OpenSSL library 67 | into the system, or build the OpenSSL library statically from the source 68 | with nginx by using --with-openssl= option. 69 | 70 | END 71 | exit 1 72 | fi 73 | 74 | fi 75 | -------------------------------------------------------------------------------- /src/os/unix/ngx_solaris_config.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_SOLARIS_CONFIG_H_INCLUDED_ 9 | #define _NGX_SOLARIS_CONFIG_H_INCLUDED_ 10 | 11 | 12 | #ifndef _REENTRANT 13 | #define _REENTRANT 14 | #endif 15 | 16 | #define _FILE_OFFSET_BITS 64 /* must be before */ 17 | 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include /* offsetof() */ 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include /* statvfs() */ 33 | 34 | #include /* FIONBIO */ 35 | #include 36 | #include 37 | #include 38 | 39 | #include 40 | #include 41 | #include 42 | #include 43 | 44 | #include 45 | #include 46 | #include /* TCP_NODELAY */ 47 | #include 48 | #include 49 | #include 50 | 51 | #include 52 | #include /* IOV_MAX */ 53 | #include 54 | #include 55 | 56 | #define NGX_ALIGNMENT _MAX_ALIGNMENT 57 | 58 | #include 59 | 60 | 61 | #if (NGX_HAVE_POSIX_SEM) 62 | #include 63 | #endif 64 | 65 | 66 | #if (NGX_HAVE_POLL) 67 | #include 68 | #endif 69 | 70 | 71 | #if (NGX_HAVE_DEVPOLL) 72 | #include 73 | #include 74 | #endif 75 | 76 | 77 | #if (NGX_HAVE_EVENTPORT) 78 | #include 79 | #endif 80 | 81 | 82 | #if (NGX_HAVE_SENDFILE) 83 | #include 84 | #endif 85 | 86 | 87 | #define NGX_LISTEN_BACKLOG 511 88 | 89 | 90 | #ifndef NGX_HAVE_INHERITED_NONBLOCK 91 | #define NGX_HAVE_INHERITED_NONBLOCK 1 92 | #endif 93 | 94 | 95 | #ifndef NGX_HAVE_SO_SNDLOWAT 96 | /* setsockopt(SO_SNDLOWAT) returns ENOPROTOOPT */ 97 | #define NGX_HAVE_SO_SNDLOWAT 0 98 | #endif 99 | 100 | 101 | #define NGX_HAVE_OS_SPECIFIC_INIT 1 102 | 103 | 104 | extern char **environ; 105 | 106 | 107 | #endif /* _NGX_SOLARIS_CONFIG_H_INCLUDED_ */ 108 | -------------------------------------------------------------------------------- /auto/cc/owc: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | # Open Watcom C 1.0, 1.2, 1.3 7 | 8 | # optimizations 9 | 10 | # maximize speed 11 | CFLAGS="$CFLAGS -ot" 12 | # reorder instructions for best pipeline usage 13 | CFLAGS="$CFLAGS -op" 14 | # inline intrinsic functions 15 | CFLAGS="$CFLAGS -oi" 16 | # inline expansion 17 | CFLAGS="$CFLAGS -oe" 18 | # disable stack checking calls 19 | CFLAGS="$CFLAGS -s" 20 | 21 | case $CPU in 22 | pentium) 23 | # optimize for Pentium and Athlon 24 | # register-based arguments passing conventions 25 | CPU_OPT="-5r" 26 | # stack-based arguments passing conventions 27 | #CPU_OPT="-5s" 28 | ;; 29 | 30 | pentiumpro) 31 | # optimize for Pentium Pro, Pentium II and Pentium III 32 | # register-based arguments passing conventions 33 | CPU_OPT="-6r" 34 | # stack-based arguments passing conventions 35 | #CPU_OPT="-6s" 36 | ;; 37 | esac 38 | 39 | CFLAGS="$CFLAGS $CPU_OPT" 40 | 41 | 42 | # warnings 43 | 44 | # maximum level 45 | CFLAGS="$CFLAGS -wx" 46 | #CFLAGS="$CFLAGS -w3" 47 | 48 | # stop on warning 49 | CFLAGS="$CFLAGS -we" 50 | 51 | # built target is NT 52 | CFLAGS="$CFLAGS -bt=nt" 53 | 54 | # multithreaded 55 | CFLAGS="$CFLAGS -bm" 56 | 57 | # debug 58 | CFLAGS="$CFLAGS -d2" 59 | 60 | # quiet 61 | CFLAGS="$CFLAGS -zq" 62 | 63 | # Open Watcom C 1.2 64 | have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have 65 | 66 | 67 | # the precompiled headers 68 | CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch" 69 | NGX_PCH="$NGX_OBJS/ngx_config.pch" 70 | NGX_BUILD_PCH="-fhq=$NGX_OBJS/ngx_config.pch" 71 | NGX_USE_PCH="-fh=$NGX_OBJS/ngx_config.pch" 72 | 73 | 74 | # the link flags, built target is NT GUI mode application 75 | #CORE_LINK="$CORE_LINK -l=nt_win" 76 | 77 | 78 | # the resource file 79 | NGX_RCC="wrc \$(CORE_INCS) -fo=$NGX_OBJS/nginx.res " 80 | NGX_RCC="$NGX_RCC $NGX_WIN32_RC $NGX_OBJS/nginx.exe" 81 | 82 | 83 | ngx_include_opt="-i=" 84 | ngx_objout="-fo" 85 | ngx_binout="-fe=" 86 | ngx_objext="obj" 87 | ngx_binext=".exe" 88 | 89 | ngx_regex_dirsep='\\' 90 | ngx_dirsep="\\" 91 | 92 | ngx_long_start=' ' 93 | ngx_long_end=' ' 94 | ngx_long_regex_cont=' \&\ 95 | ' 96 | ngx_long_cont=' & 97 | ' 98 | 99 | ngx_regex_cont=' \&\ 100 | ' 101 | ngx_cont=' & 102 | ' 103 | ngx_tab=' & 104 | ' 105 | -------------------------------------------------------------------------------- /src/os/unix/ngx_os.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_OS_H_INCLUDED_ 9 | #define _NGX_OS_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | #define NGX_IO_SENDFILE 1 17 | 18 | 19 | typedef ssize_t (*ngx_recv_pt)(ngx_connection_t *c, u_char *buf, size_t size); 20 | typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in); 21 | typedef ssize_t (*ngx_send_pt)(ngx_connection_t *c, u_char *buf, size_t size); 22 | typedef ngx_chain_t *(*ngx_send_chain_pt)(ngx_connection_t *c, ngx_chain_t *in, 23 | off_t limit); 24 | 25 | typedef struct { 26 | ngx_recv_pt recv; 27 | ngx_recv_chain_pt recv_chain; 28 | ngx_recv_pt udp_recv; 29 | ngx_send_pt send; 30 | ngx_send_chain_pt send_chain; 31 | ngx_uint_t flags; 32 | } ngx_os_io_t; 33 | 34 | 35 | void ngx_debug_init(void); 36 | ngx_int_t ngx_os_init(ngx_log_t *log); 37 | void ngx_os_status(ngx_log_t *log); 38 | ngx_int_t ngx_os_specific_init(ngx_log_t *log); 39 | void ngx_os_specific_status(ngx_log_t *log); 40 | ngx_int_t ngx_daemon(ngx_log_t *log); 41 | ngx_int_t ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_int_t pid); 42 | 43 | 44 | ssize_t ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size); 45 | ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *entry); 46 | ssize_t ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size); 47 | ssize_t ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size); 48 | ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, 49 | off_t limit); 50 | 51 | #if (NGX_HAVE_AIO) 52 | ssize_t ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size); 53 | ssize_t ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl); 54 | ssize_t ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size); 55 | ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in, 56 | off_t limit); 57 | #endif 58 | 59 | 60 | extern ngx_os_io_t ngx_os_io; 61 | extern ngx_int_t ngx_ncpu; 62 | extern ngx_int_t ngx_max_sockets; 63 | extern ngx_uint_t ngx_inherited_nonblocking; 64 | extern ngx_uint_t ngx_tcp_nodelay_and_tcp_nopush; 65 | 66 | 67 | #if (NGX_FREEBSD) 68 | #include 69 | 70 | 71 | #elif (NGX_LINUX) 72 | #include 73 | 74 | 75 | #elif (NGX_SOLARIS) 76 | #include 77 | 78 | 79 | #elif (NGX_DARWIN) 80 | #include 81 | #endif 82 | 83 | 84 | #endif /* _NGX_OS_H_INCLUDED_ */ 85 | -------------------------------------------------------------------------------- /auto/os/conf: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | echo "checking for $NGX_SYSTEM specific features" 7 | 8 | case "$NGX_PLATFORM" in 9 | 10 | FreeBSD:*) 11 | . auto/os/freebsd 12 | ;; 13 | 14 | Linux:*) 15 | . auto/os/linux 16 | ;; 17 | 18 | SunOS:*) 19 | . auto/os/solaris 20 | ;; 21 | 22 | Darwin:*) 23 | . auto/os/darwin 24 | ;; 25 | 26 | win32) 27 | . auto/os/win32 28 | ;; 29 | 30 | DragonFly:*) 31 | have=NGX_FREEBSD . auto/have_headers 32 | CORE_INCS="$UNIX_INCS" 33 | CORE_DEPS="$UNIX_DEPS $FREEBSD_DEPS" 34 | CORE_SRCS="$UNIX_SRCS $FREEBSD_SRCS" 35 | 36 | echo " + sendfile() found" 37 | have=NGX_HAVE_SENDFILE . auto/have 38 | CORE_SRCS="$CORE_SRCS $FREEBSD_SENDFILE_SRCS" 39 | 40 | ngx_spacer=' 41 | ' 42 | ;; 43 | 44 | HP-UX:*) 45 | # HP/UX 46 | have=NGX_HPUX . auto/have_headers 47 | CORE_INCS="$UNIX_INCS" 48 | CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" 49 | CORE_SRCS="$UNIX_SRCS" 50 | CC_AUX_FLAGS="$CC_AUX_FLAGS -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1" 51 | ;; 52 | 53 | OSF1:*) 54 | # Tru64 UNIX 55 | have=NGX_TRU64 . auto/have_headers 56 | have=NGX_HAVE_STRERROR_R . auto/nohave 57 | CORE_INCS="$UNIX_INCS" 58 | CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" 59 | CORE_SRCS="$UNIX_SRCS" 60 | ;; 61 | 62 | *) 63 | CORE_INCS="$UNIX_INCS" 64 | CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" 65 | CORE_SRCS="$UNIX_SRCS" 66 | ;; 67 | 68 | esac 69 | 70 | 71 | case "$NGX_MACHINE" in 72 | 73 | i386 | i686 | i86pc) 74 | have=NGX_HAVE_NONALIGNED . auto/have 75 | NGX_MACH_CACHE_LINE=32 76 | ;; 77 | 78 | amd64 | x86_64) 79 | have=NGX_HAVE_NONALIGNED . auto/have 80 | NGX_MACH_CACHE_LINE=64 81 | ;; 82 | 83 | sun4u | sun4v | sparc | sparc64) 84 | have=NGX_ALIGNMENT value=16 . auto/define 85 | # TODO 86 | NGX_MACH_CACHE_LINE=64 87 | ;; 88 | 89 | ia64 ) 90 | have=NGX_ALIGNMENT value=16 . auto/define 91 | # TODO 92 | NGX_MACH_CACHE_LINE=64 93 | ;; 94 | 95 | *) 96 | NGX_MACH_CACHE_LINE=32 97 | ;; 98 | 99 | esac 100 | 101 | if test -z "$NGX_CPU_CACHE_LINE"; then 102 | NGX_CPU_CACHE_LINE=$NGX_MACH_CACHE_LINE 103 | fi 104 | 105 | have=NGX_CPU_CACHE_LINE value=$NGX_CPU_CACHE_LINE . auto/define 106 | -------------------------------------------------------------------------------- /src/os/unix/ngx_aio_write_chain.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | 13 | ngx_chain_t * 14 | ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) 15 | { 16 | u_char *buf, *prev; 17 | off_t send, sent; 18 | size_t len; 19 | ssize_t n, size; 20 | ngx_chain_t *cl; 21 | 22 | /* the maximum limit size is the maximum size_t value - the page size */ 23 | 24 | if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { 25 | limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; 26 | } 27 | 28 | send = 0; 29 | sent = 0; 30 | cl = in; 31 | 32 | while (cl) { 33 | 34 | if (cl->buf->pos == cl->buf->last) { 35 | cl = cl->next; 36 | continue; 37 | } 38 | 39 | /* we can post the single aio operation only */ 40 | 41 | if (!c->write->ready) { 42 | return cl; 43 | } 44 | 45 | buf = cl->buf->pos; 46 | prev = buf; 47 | len = 0; 48 | 49 | /* coalesce the neighbouring bufs */ 50 | 51 | while (cl && prev == cl->buf->pos && send < limit) { 52 | if (ngx_buf_special(cl->buf)) { 53 | continue; 54 | } 55 | 56 | size = cl->buf->last - cl->buf->pos; 57 | 58 | if (send + size > limit) { 59 | size = limit - send; 60 | } 61 | 62 | len += size; 63 | prev = cl->buf->pos + size; 64 | send += size; 65 | cl = cl->next; 66 | } 67 | 68 | n = ngx_aio_write(c, buf, len); 69 | 70 | ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_write: %z", n); 71 | 72 | if (n == NGX_ERROR) { 73 | return NGX_CHAIN_ERROR; 74 | } 75 | 76 | if (n > 0) { 77 | sent += n; 78 | c->sent += n; 79 | } 80 | 81 | ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, 82 | "aio_write sent: %O", c->sent); 83 | 84 | for (cl = in; cl; cl = cl->next) { 85 | 86 | if (sent >= cl->buf->last - cl->buf->pos) { 87 | sent -= cl->buf->last - cl->buf->pos; 88 | cl->buf->pos = cl->buf->last; 89 | 90 | continue; 91 | } 92 | 93 | cl->buf->pos += sent; 94 | 95 | break; 96 | } 97 | } 98 | 99 | return cl; 100 | } 101 | -------------------------------------------------------------------------------- /auto/cc/name: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | if [ "$NGX_PLATFORM" != win32 ]; then 7 | 8 | ngx_feature="C compiler" 9 | ngx_feature_name= 10 | ngx_feature_run=yes 11 | ngx_feature_incs= 12 | ngx_feature_path= 13 | ngx_feature_libs= 14 | ngx_feature_test= 15 | . auto/feature 16 | 17 | if [ $ngx_found = no ]; then 18 | echo 19 | echo $0: error: C compiler $CC is not found 20 | echo 21 | exit 1 22 | fi 23 | 24 | fi 25 | 26 | 27 | if [ "$CC" = cl ]; then 28 | if `$NGX_WINE $CC -v 2>&1 \ 29 | | grep '^Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16' \ 30 | >/dev/null 2>&1`; then 31 | 32 | NGX_CC_NAME=msvc10 33 | echo " + using Microsoft Visual C++ 10 compiler" 34 | 35 | else if `$NGX_WINE $CC -v 2>&1 \ 36 | | grep '^Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14' \ 37 | >/dev/null 2>&1`; then 38 | 39 | NGX_CC_NAME=msvc8 40 | echo " + using Microsoft Visual C++ 8 compiler" 41 | 42 | else if `$NGX_WINE $CC -v 2>&1 \ 43 | | grep '^Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13' \ 44 | >/dev/null 2>&1`; then 45 | 46 | NGX_CC_NAME=msvc7 47 | echo " + using Microsoft Visual C++ 7 compiler" 48 | 49 | else 50 | NGX_CC_NAME=msvc 51 | echo " + using Microsoft Visual C++ compiler" 52 | fi 53 | fi 54 | fi 55 | 56 | else 57 | if [ "$CC" = wcl386 ]; then 58 | NGX_CC_NAME=owc 59 | echo " + using Open Watcom C compiler" 60 | 61 | else 62 | if [ "$CC" = bcc32 ]; then 63 | NGX_CC_NAME=bcc 64 | echo " + using Borland C++ compiler" 65 | 66 | else 67 | if `$CC -V 2>&1 | grep '^Intel(R) C' >/dev/null 2>&1`; then 68 | NGX_CC_NAME=icc 69 | echo " + using Intel C++ compiler" 70 | 71 | else 72 | if `$CC -v 2>&1 | grep 'gcc version' >/dev/null 2>&1`; then 73 | NGX_CC_NAME=gcc 74 | echo " + using GNU C compiler" 75 | 76 | else 77 | if `$CC -V 2>&1 | grep 'Sun C' >/dev/null 2>&1`; then 78 | NGX_CC_NAME=sunc 79 | echo " + using Sun C compiler" 80 | 81 | else 82 | if `$CC -V 2>&1 | grep '^Compaq C' >/dev/null 2>&1`; then 83 | NGX_CC_NAME=ccc 84 | echo " + using Compaq C compiler" 85 | 86 | else 87 | if `$CC -V 2>&1 | grep '^aCC: ' >/dev/null 2>&1`; then 88 | NGX_CC_NAME=acc 89 | echo " + using HP aC++ compiler" 90 | 91 | else 92 | NGX_CC_NAME=unknown 93 | 94 | fi # acc 95 | fi # ccc 96 | fi # sunc 97 | fi # icc 98 | fi # gcc 99 | fi # bcc 100 | fi # owc 101 | fi # msvc 102 | -------------------------------------------------------------------------------- /src/os/unix/ngx_user.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | 12 | /* 13 | * Solaris has thread-safe crypt() 14 | * Linux has crypt_r(); "struct crypt_data" is more than 128K 15 | * FreeBSD needs the mutex to protect crypt() 16 | * 17 | * TODO: 18 | * ngx_crypt_init() to init mutex 19 | */ 20 | 21 | 22 | #if (NGX_CRYPT) 23 | 24 | #if (NGX_HAVE_GNU_CRYPT_R) 25 | 26 | ngx_int_t 27 | ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) 28 | { 29 | char *value; 30 | size_t len; 31 | ngx_err_t err; 32 | struct crypt_data cd; 33 | 34 | ngx_set_errno(0); 35 | 36 | cd.initialized = 0; 37 | /* work around the glibc bug */ 38 | cd.current_salt[0] = ~salt[0]; 39 | 40 | value = crypt_r((char *) key, (char *) salt, &cd); 41 | 42 | err = ngx_errno; 43 | 44 | if (err == 0) { 45 | len = ngx_strlen(value) + 1; 46 | 47 | *encrypted = ngx_pnalloc(pool, len); 48 | if (*encrypted) { 49 | ngx_memcpy(*encrypted, value, len); 50 | return NGX_OK; 51 | } 52 | } 53 | 54 | ngx_log_error(NGX_LOG_CRIT, pool->log, err, "crypt_r() failed"); 55 | 56 | return NGX_ERROR; 57 | } 58 | 59 | #else 60 | 61 | ngx_int_t 62 | ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) 63 | { 64 | char *value; 65 | size_t len; 66 | ngx_err_t err; 67 | 68 | #if (NGX_THREADS && NGX_NONREENTRANT_CRYPT) 69 | 70 | /* crypt() is a time consuming function, so we only try to lock */ 71 | 72 | if (ngx_mutex_trylock(ngx_crypt_mutex) != NGX_OK) { 73 | return NGX_AGAIN; 74 | } 75 | 76 | #endif 77 | 78 | ngx_set_errno(0); 79 | 80 | value = crypt((char *) key, (char *) salt); 81 | 82 | if (value) { 83 | len = ngx_strlen(value) + 1; 84 | 85 | *encrypted = ngx_pnalloc(pool, len); 86 | if (*encrypted) { 87 | ngx_memcpy(*encrypted, value, len); 88 | } 89 | 90 | #if (NGX_THREADS && NGX_NONREENTRANT_CRYPT) 91 | ngx_mutex_unlock(ngx_crypt_mutex); 92 | #endif 93 | return NGX_OK; 94 | } 95 | 96 | err = ngx_errno; 97 | 98 | #if (NGX_THREADS && NGX_NONREENTRANT_CRYPT) 99 | ngx_mutex_unlock(ngx_crypt_mutex); 100 | #endif 101 | 102 | ngx_log_error(NGX_LOG_CRIT, pool->log, err, "crypt() failed"); 103 | 104 | return NGX_ERROR; 105 | } 106 | 107 | #endif 108 | 109 | #endif /* NGX_CRYPT */ 110 | -------------------------------------------------------------------------------- /conf/koi-win: -------------------------------------------------------------------------------- 1 | 2 | charset_map koi8-r windows-1251 { 3 | 4 | 80 88 ; # euro 5 | 6 | 95 95 ; # bullet 7 | 8 | 9A A0 ; #   9 | 10 | 9E B7 ; # · 11 | 12 | A3 B8 ; # small yo 13 | A4 BA ; # small Ukrainian ye 14 | 15 | A6 B3 ; # small Ukrainian i 16 | A7 BF ; # small Ukrainian yi 17 | 18 | AD B4 ; # small Ukrainian soft g 19 | AE A2 ; # small Byelorussian short u 20 | 21 | B0 B0 ; # ° 22 | 23 | B3 A8 ; # capital YO 24 | B4 AA ; # capital Ukrainian YE 25 | 26 | B6 B2 ; # capital Ukrainian I 27 | B7 AF ; # capital Ukrainian YI 28 | 29 | B9 B9 ; # numero sign 30 | 31 | BD A5 ; # capital Ukrainian soft G 32 | BE A1 ; # capital Byelorussian short U 33 | 34 | BF A9 ; # (C) 35 | 36 | C0 FE ; # small yu 37 | C1 E0 ; # small a 38 | C2 E1 ; # small b 39 | C3 F6 ; # small ts 40 | C4 E4 ; # small d 41 | C5 E5 ; # small ye 42 | C6 F4 ; # small f 43 | C7 E3 ; # small g 44 | C8 F5 ; # small kh 45 | C9 E8 ; # small i 46 | CA E9 ; # small j 47 | CB EA ; # small k 48 | CC EB ; # small l 49 | CD EC ; # small m 50 | CE ED ; # small n 51 | CF EE ; # small o 52 | 53 | D0 EF ; # small p 54 | D1 FF ; # small ya 55 | D2 F0 ; # small r 56 | D3 F1 ; # small s 57 | D4 F2 ; # small t 58 | D5 F3 ; # small u 59 | D6 E6 ; # small zh 60 | D7 E2 ; # small v 61 | D8 FC ; # small soft sign 62 | D9 FB ; # small y 63 | DA E7 ; # small z 64 | DB F8 ; # small sh 65 | DC FD ; # small e 66 | DD F9 ; # small shch 67 | DE F7 ; # small ch 68 | DF FA ; # small hard sign 69 | 70 | E0 DE ; # capital YU 71 | E1 C0 ; # capital A 72 | E2 C1 ; # capital B 73 | E3 D6 ; # capital TS 74 | E4 C4 ; # capital D 75 | E5 C5 ; # capital YE 76 | E6 D4 ; # capital F 77 | E7 C3 ; # capital G 78 | E8 D5 ; # capital KH 79 | E9 C8 ; # capital I 80 | EA C9 ; # capital J 81 | EB CA ; # capital K 82 | EC CB ; # capital L 83 | ED CC ; # capital M 84 | EE CD ; # capital N 85 | EF CE ; # capital O 86 | 87 | F0 CF ; # capital P 88 | F1 DF ; # capital YA 89 | F2 D0 ; # capital R 90 | F3 D1 ; # capital S 91 | F4 D2 ; # capital T 92 | F5 D3 ; # capital U 93 | F6 C6 ; # capital ZH 94 | F7 C2 ; # capital V 95 | F8 DC ; # capital soft sign 96 | F9 DB ; # capital Y 97 | FA C7 ; # capital Z 98 | FB D8 ; # capital SH 99 | FC DD ; # capital E 100 | FD D9 ; # capital SHCH 101 | FE D7 ; # capital CH 102 | FF DA ; # capital hard sign 103 | } 104 | -------------------------------------------------------------------------------- /src/os/unix/ngx_linux_config.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_LINUX_CONFIG_H_INCLUDED_ 9 | #define _NGX_LINUX_CONFIG_H_INCLUDED_ 10 | 11 | 12 | #ifndef _GNU_SOURCE 13 | #define _GNU_SOURCE /* pread(), pwrite(), gethostname() */ 14 | #endif 15 | 16 | #define _FILE_OFFSET_BITS 64 17 | 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include /* offsetof() */ 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include /* statfs() */ 33 | 34 | #include 35 | #include 36 | #include 37 | 38 | #include 39 | #include 40 | #include 41 | #include 42 | 43 | #include 44 | #include 45 | #include /* TCP_NODELAY, TCP_CORK */ 46 | #include 47 | #include 48 | #include 49 | 50 | #include /* tzset() */ 51 | #include /* memalign() */ 52 | #include /* IOV_MAX */ 53 | #include 54 | #include 55 | #include 56 | #include /* uname() */ 57 | 58 | 59 | #include 60 | 61 | 62 | #if (NGX_HAVE_POSIX_SEM) 63 | #include 64 | #endif 65 | 66 | 67 | #if (NGX_HAVE_SYS_PRCTL_H) 68 | #include 69 | #endif 70 | 71 | 72 | #if (NGX_HAVE_SENDFILE64) 73 | #include 74 | #else 75 | extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size); 76 | #define NGX_SENDFILE_LIMIT 0x80000000 77 | #endif 78 | 79 | 80 | #if (NGX_HAVE_POLL || NGX_HAVE_RTSIG) 81 | #include 82 | #endif 83 | 84 | 85 | #if (NGX_HAVE_EPOLL) 86 | #include 87 | #endif 88 | 89 | 90 | #if (NGX_HAVE_FILE_AIO) 91 | #include 92 | #include 93 | typedef struct iocb ngx_aiocb_t; 94 | #endif 95 | 96 | 97 | #define NGX_LISTEN_BACKLOG 511 98 | 99 | 100 | #ifndef NGX_HAVE_SO_SNDLOWAT 101 | /* setsockopt(SO_SNDLOWAT) returns ENOPROTOOPT */ 102 | #define NGX_HAVE_SO_SNDLOWAT 0 103 | #endif 104 | 105 | 106 | #ifndef NGX_HAVE_INHERITED_NONBLOCK 107 | #define NGX_HAVE_INHERITED_NONBLOCK 0 108 | #endif 109 | 110 | 111 | #define NGX_HAVE_OS_SPECIFIC_INIT 1 112 | 113 | 114 | extern char **environ; 115 | 116 | 117 | #endif /* _NGX_LINUX_CONFIG_H_INCLUDED_ */ 118 | -------------------------------------------------------------------------------- /auto/lib/zlib/make: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | case "$NGX_CC_NAME" in 7 | 8 | msvc*) 9 | ngx_makefile=makefile.msvc 10 | ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC" 11 | ngx_zlib="ZLIB=\"$ZLIB\"" 12 | 13 | ;; 14 | 15 | owc*) 16 | ngx_makefile=makefile.owc 17 | ngx_opt="CPU_OPT=\"$CPU_OPT\"" 18 | ngx_zlib=`echo ZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"` 19 | ;; 20 | 21 | bcc) 22 | ngx_makefile=makefile.bcc 23 | ngx_opt="-DCPU_OPT=\"$CPU_OPT\"" 24 | ngx_zlib=`echo \-DZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"` 25 | ;; 26 | 27 | esac 28 | 29 | 30 | done=NO 31 | 32 | 33 | case "$NGX_PLATFORM" in 34 | 35 | win32) 36 | cat << END >> $NGX_MAKEFILE 37 | 38 | `echo "$ZLIB/zlib.lib: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"` 39 | \$(MAKE) -f auto/lib/zlib/$ngx_makefile $ngx_opt $ngx_zlib 40 | 41 | END 42 | 43 | done=YES 44 | ;; 45 | 46 | # FreeBSD: i386 47 | # Linux: i686 48 | 49 | *:i386 | *:i686) 50 | case $ZLIB_ASM in 51 | pentium) 52 | 53 | cat << END >> $NGX_MAKEFILE 54 | 55 | $ZLIB/libz.a: $NGX_MAKEFILE 56 | cd $ZLIB \\ 57 | && \$(MAKE) distclean \\ 58 | && cp contrib/asm586/match.S . \\ 59 | && CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\ 60 | ./configure \\ 61 | && \$(MAKE) OBJA=match.o libz.a 62 | 63 | END 64 | 65 | done=YES 66 | ;; 67 | 68 | pentiumpro) 69 | 70 | cat << END >> $NGX_MAKEFILE 71 | 72 | $ZLIB/libz.a: $NGX_MAKEFILE 73 | cd $ZLIB \\ 74 | && \$(MAKE) distclean \\ 75 | && cp contrib/asm686/match.S . \\ 76 | && CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\ 77 | ./configure \\ 78 | && \$(MAKE) OBJA=match.o libz.a 79 | 80 | END 81 | 82 | done=YES 83 | ;; 84 | 85 | NO) 86 | ;; 87 | 88 | *) 89 | echo "$0: error: invalid --with-zlib-asm=$ZLIB_ASM option." 90 | echo "The valid values are \"pentium\" and \"pentiumpro\" only". 91 | echo 92 | 93 | exit 1; 94 | ;; 95 | esac 96 | ;; 97 | 98 | esac 99 | 100 | 101 | if [ $done = NO ]; then 102 | 103 | cat << END >> $NGX_MAKEFILE 104 | 105 | $ZLIB/libz.a: $NGX_MAKEFILE 106 | cd $ZLIB \\ 107 | && \$(MAKE) distclean \\ 108 | && CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\ 109 | ./configure \\ 110 | && \$(MAKE) libz.a 111 | 112 | END 113 | 114 | fi 115 | -------------------------------------------------------------------------------- /src/event/ngx_event_timer.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_EVENT_TIMER_H_INCLUDED_ 9 | #define _NGX_EVENT_TIMER_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | 17 | #define NGX_TIMER_INFINITE (ngx_msec_t) -1 18 | 19 | #define NGX_TIMER_LAZY_DELAY 300 20 | 21 | 22 | ngx_int_t ngx_event_timer_init(ngx_log_t *log); 23 | ngx_msec_t ngx_event_find_timer(void); 24 | void ngx_event_expire_timers(void); 25 | 26 | 27 | #if (NGX_THREADS) 28 | extern ngx_mutex_t *ngx_event_timer_mutex; 29 | #endif 30 | 31 | 32 | extern ngx_thread_volatile ngx_rbtree_t ngx_event_timer_rbtree; 33 | 34 | 35 | static ngx_inline void 36 | ngx_event_del_timer(ngx_event_t *ev) 37 | { 38 | ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, 39 | "event timer del: %d: %M", 40 | ngx_event_ident(ev->data), ev->timer.key); 41 | 42 | ngx_mutex_lock(ngx_event_timer_mutex); 43 | 44 | ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer); 45 | 46 | ngx_mutex_unlock(ngx_event_timer_mutex); 47 | 48 | #if (NGX_DEBUG) 49 | ev->timer.left = NULL; 50 | ev->timer.right = NULL; 51 | ev->timer.parent = NULL; 52 | #endif 53 | 54 | ev->timer_set = 0; 55 | } 56 | 57 | 58 | static ngx_inline void 59 | ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) 60 | { 61 | ngx_msec_t key; 62 | ngx_msec_int_t diff; 63 | 64 | key = ngx_current_msec + timer; 65 | 66 | if (ev->timer_set) { 67 | 68 | /* 69 | * Use a previous timer value if difference between it and a new 70 | * value is less than NGX_TIMER_LAZY_DELAY milliseconds: this allows 71 | * to minimize the rbtree operations for fast connections. 72 | */ 73 | 74 | diff = (ngx_msec_int_t) (key - ev->timer.key); 75 | 76 | if (ngx_abs(diff) < NGX_TIMER_LAZY_DELAY) { 77 | ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, 78 | "event timer: %d, old: %M, new: %M", 79 | ngx_event_ident(ev->data), ev->timer.key, key); 80 | return; 81 | } 82 | 83 | ngx_del_timer(ev); 84 | } 85 | 86 | ev->timer.key = key; 87 | 88 | ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, 89 | "event timer add: %d: %M:%M", 90 | ngx_event_ident(ev->data), timer, ev->timer.key); 91 | 92 | ngx_mutex_lock(ngx_event_timer_mutex); 93 | 94 | ngx_rbtree_insert(&ngx_event_timer_rbtree, &ev->timer); 95 | 96 | ngx_mutex_unlock(ngx_event_timer_mutex); 97 | 98 | ev->timer_set = 1; 99 | } 100 | 101 | 102 | #endif /* _NGX_EVENT_TIMER_H_INCLUDED_ */ 103 | -------------------------------------------------------------------------------- /src/os/unix/ngx_freebsd_config.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_FREEBSD_CONFIG_H_INCLUDED_ 9 | #define _NGX_FREEBSD_CONFIG_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include /* offsetof() */ 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include /* ALIGN() */ 27 | #include /* statfs() */ 28 | 29 | #include /* FIONBIO */ 30 | #include 31 | #include 32 | #include 33 | 34 | #include 35 | #include 36 | #include 37 | #include 38 | 39 | #include 40 | #include 41 | #include /* TCP_NODELAY, TCP_NOPUSH */ 42 | #include 43 | #include 44 | #include 45 | 46 | #include /* setproctitle() before 4.1 */ 47 | #include 48 | #include 49 | 50 | 51 | #if __FreeBSD_version < 400017 52 | 53 | /* 54 | * FreeBSD 3.x has no CMSG_SPACE() and CMSG_LEN() and has the broken CMSG_DATA() 55 | */ 56 | 57 | #undef CMSG_SPACE 58 | #define CMSG_SPACE(l) (ALIGN(sizeof(struct cmsghdr)) + ALIGN(l)) 59 | 60 | #undef CMSG_LEN 61 | #define CMSG_LEN(l) (ALIGN(sizeof(struct cmsghdr)) + (l)) 62 | 63 | #undef CMSG_DATA 64 | #define CMSG_DATA(cmsg) ((u_char *)(cmsg) + ALIGN(sizeof(struct cmsghdr))) 65 | 66 | #endif 67 | 68 | 69 | #include 70 | 71 | 72 | #if (NGX_HAVE_POSIX_SEM) 73 | #include 74 | #endif 75 | 76 | 77 | #if (NGX_HAVE_POLL) 78 | #include 79 | #endif 80 | 81 | 82 | #if (NGX_HAVE_KQUEUE) 83 | #include 84 | #endif 85 | 86 | 87 | #if (NGX_HAVE_FILE_AIO || NGX_HAVE_AIO) 88 | #include 89 | typedef struct aiocb ngx_aiocb_t; 90 | #endif 91 | 92 | 93 | #define NGX_LISTEN_BACKLOG -1 94 | 95 | 96 | #if (__FreeBSD_version < 430000 || __FreeBSD_version < 500012) 97 | 98 | pid_t rfork_thread(int flags, void *stack, int (*func)(void *arg), void *arg); 99 | 100 | #endif 101 | 102 | #ifndef IOV_MAX 103 | #define IOV_MAX 1024 104 | #endif 105 | 106 | 107 | #ifndef NGX_HAVE_INHERITED_NONBLOCK 108 | #define NGX_HAVE_INHERITED_NONBLOCK 1 109 | #endif 110 | 111 | 112 | #define NGX_HAVE_OS_SPECIFIC_INIT 1 113 | 114 | 115 | extern char **environ; 116 | extern char *malloc_options; 117 | 118 | 119 | #endif /* _NGX_FREEBSD_CONFIG_H_INCLUDED_ */ 120 | -------------------------------------------------------------------------------- /src/event/ngx_event_connect.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_EVENT_CONNECT_H_INCLUDED_ 9 | #define _NGX_EVENT_CONNECT_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | 17 | #define NGX_PEER_KEEPALIVE 1 18 | #define NGX_PEER_NEXT 2 19 | #define NGX_PEER_FAILED 4 20 | 21 | 22 | typedef struct ngx_peer_connection_s ngx_peer_connection_t; 23 | 24 | typedef ngx_int_t (*ngx_event_get_peer_pt)(ngx_peer_connection_t *pc, 25 | void *data); 26 | typedef void (*ngx_event_free_peer_pt)(ngx_peer_connection_t *pc, void *data, 27 | ngx_uint_t state); 28 | #if (NGX_SSL) 29 | 30 | // 当使用长连接与上游服务器通信时,可通过该方法由连接池中获取一个新连接 31 | typedef ngx_int_t (*ngx_event_set_peer_session_pt)(ngx_peer_connection_t *pc, 32 | void *data); 33 | // 当使用长连接与上游服务器通信时,通过该方法将使用完毕的连接释放给连接池 34 | typedef void (*ngx_event_save_peer_session_pt)(ngx_peer_connection_t *pc, 35 | void *data); 36 | #endif 37 | 38 | //定义了load_balance模块实现负载均衡算法的回调函数和相关字段 39 | struct ngx_peer_connection_s { 40 | // 一个主动连接实际上也需要ngx_connection_t结构体中的大部分成员,并且出于重用的考虑而定义了connection成员 41 | ngx_connection_t *connection; 42 | 43 | // 远端服务器的socket地址 44 | struct sockaddr *sockaddr; 45 | // sockaddr的地址长度 46 | socklen_t socklen; 47 | // 远端服务器的名称 48 | ngx_str_t *name; 49 | 50 | // 表示在连接一个远端服务器时,当前连接出现异常失败后可以重试的次数,也就是允许的最多失败次数 51 | ngx_uint_t tries; 52 | 53 | // 获取连接的方法,如果使用长连接构成的连接池,那么必须要实现get方法 54 | ngx_event_get_peer_pt get; 55 | // 与get方法对应的释放连接的方法 56 | ngx_event_free_peer_pt free; 57 | /* 58 | 这个data指针仅用于和上面的get,free方法配合传递参数,他的具体含义与实现get方法,free方法的模块相关 59 | */ 60 | void *data; 61 | 62 | #if (NGX_SSL) 63 | ngx_event_set_peer_session_pt set_session; 64 | ngx_event_save_peer_session_pt save_session; 65 | #endif 66 | 67 | #if (NGX_THREADS) 68 | ngx_atomic_t *lock; 69 | #endif 70 | 71 | // 本机地址信息 72 | ngx_addr_t *local; 73 | 74 | // 套接字的接受缓冲区大小 75 | int rcvbuf; 76 | 77 | // 记录日志的ngx_log_t对象 78 | ngx_log_t *log; 79 | 80 | // 标志位,为1表示上面的connection连接已经缓存 81 | unsigned cached:1; 82 | 83 | /* ngx_connection_log_error_e */ 84 | unsigned log_error:2; 85 | }; 86 | 87 | 88 | ngx_int_t ngx_event_connect_peer(ngx_peer_connection_t *pc); 89 | ngx_int_t ngx_event_get_peer(ngx_peer_connection_t *pc, void *data); 90 | 91 | 92 | #endif /* _NGX_EVENT_CONNECT_H_INCLUDED_ */ 93 | -------------------------------------------------------------------------------- /src/event/ngx_event_pipe.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_EVENT_PIPE_H_INCLUDED_ 9 | #define _NGX_EVENT_PIPE_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | 17 | typedef struct ngx_event_pipe_s ngx_event_pipe_t; 18 | 19 | typedef ngx_int_t (*ngx_event_pipe_input_filter_pt)(ngx_event_pipe_t *p, 20 | ngx_buf_t *buf); 21 | typedef ngx_int_t (*ngx_event_pipe_output_filter_pt)(void *data, 22 | ngx_chain_t *chain); 23 | 24 | 25 | struct ngx_event_pipe_s { 26 | ngx_connection_t *upstream; 27 | ngx_connection_t *downstream; 28 | 29 | ngx_chain_t *free_raw_bufs; 30 | ngx_chain_t *in; 31 | ngx_chain_t **last_in; 32 | 33 | ngx_chain_t *out; 34 | ngx_chain_t **last_out; 35 | 36 | ngx_chain_t *free; 37 | ngx_chain_t *busy; 38 | 39 | /* 40 | * the input filter i.e. that moves HTTP/1.1 chunks 41 | * from the raw bufs to an incoming chain 42 | */ 43 | 44 | ngx_event_pipe_input_filter_pt input_filter; 45 | void *input_ctx; 46 | 47 | ngx_event_pipe_output_filter_pt output_filter; 48 | void *output_ctx; 49 | 50 | unsigned read:1; 51 | unsigned cacheable:1; 52 | unsigned single_buf:1; 53 | unsigned free_bufs:1; 54 | unsigned upstream_done:1; 55 | unsigned upstream_error:1; 56 | unsigned upstream_eof:1; 57 | unsigned upstream_blocked:1; 58 | unsigned downstream_done:1; 59 | unsigned downstream_error:1; 60 | unsigned cyclic_temp_file:1; 61 | 62 | ngx_int_t allocated; 63 | ngx_bufs_t bufs; 64 | ngx_buf_tag_t tag; 65 | 66 | ssize_t busy_size; 67 | 68 | off_t read_length; 69 | 70 | off_t max_temp_file_size; 71 | ssize_t temp_file_write_size; 72 | 73 | ngx_msec_t read_timeout; 74 | ngx_msec_t send_timeout; 75 | ssize_t send_lowat; 76 | 77 | ngx_pool_t *pool; 78 | ngx_log_t *log; 79 | 80 | ngx_chain_t *preread_bufs; 81 | size_t preread_size; 82 | ngx_buf_t *buf_to_file; 83 | 84 | ngx_temp_file_t *temp_file; 85 | 86 | /* STUB */ int num; 87 | }; 88 | 89 | 90 | ngx_int_t ngx_event_pipe(ngx_event_pipe_t *p, ngx_int_t do_write); 91 | ngx_int_t ngx_event_pipe_copy_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf); 92 | ngx_int_t ngx_event_pipe_add_free_buf(ngx_event_pipe_t *p, ngx_buf_t *b); 93 | 94 | 95 | #endif /* _NGX_EVENT_PIPE_H_INCLUDED_ */ 96 | -------------------------------------------------------------------------------- /src/core/ngx_core.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_CORE_H_INCLUDED_ 9 | #define _NGX_CORE_H_INCLUDED_ 10 | 11 | 12 | typedef struct ngx_module_s ngx_module_t; 13 | typedef struct ngx_conf_s ngx_conf_t; 14 | typedef struct ngx_cycle_s ngx_cycle_t; 15 | typedef struct ngx_pool_s ngx_pool_t; 16 | typedef struct ngx_chain_s ngx_chain_t; 17 | typedef struct ngx_log_s ngx_log_t; 18 | typedef struct ngx_array_s ngx_array_t; 19 | typedef struct ngx_open_file_s ngx_open_file_t; 20 | typedef struct ngx_command_s ngx_command_t; 21 | typedef struct ngx_file_s ngx_file_t; 22 | typedef struct ngx_event_s ngx_event_t; 23 | typedef struct ngx_event_aio_s ngx_event_aio_t; 24 | typedef struct ngx_connection_s ngx_connection_t; 25 | 26 | typedef void (*ngx_event_handler_pt)(ngx_event_t *ev); 27 | typedef void (*ngx_connection_handler_pt)(ngx_connection_t *c); 28 | 29 | 30 | #define NGX_OK 0 //表示成功,nginx会继续执行该请求的后续动作 31 | #define NGX_ERROR -1 //表示错误,此时nginx会中止请求 32 | #define NGX_AGAIN -2 33 | #define NGX_BUSY -3 34 | #define NGX_DONE -4 //表示到此为止,NGINX的HTTP框架将暂停不再执行这个请求的后续部分 35 | #define NGX_DECLINED -5 //继续在NGX_HTTP_CONTENT_PHASE阶段寻找下一个对于该请求感兴趣的HTTP模块来处理这个请求 36 | #define NGX_ABORT -6 37 | 38 | 39 | #include 40 | #include 41 | #include 42 | #include 43 | #include 44 | #include 45 | #include 46 | #include 47 | #include 48 | #include 49 | #include 50 | #include 51 | #include 52 | #include 53 | #include 54 | #include 55 | #include 56 | #include 57 | #include 58 | #include 59 | #include 60 | #include 61 | #include 62 | #include 63 | #if (NGX_PCRE) 64 | #include 65 | #endif 66 | #include 67 | #include 68 | #include 69 | #include 70 | #include 71 | #include 72 | #if (NGX_OPENSSL) 73 | #include 74 | #endif 75 | #include 76 | #include 77 | #include 78 | #include 79 | #include 80 | #include 81 | 82 | 83 | #define LF (u_char) 10 84 | #define CR (u_char) 13 85 | #define CRLF "\x0d\x0a" 86 | 87 | 88 | #define ngx_abs(value) (((value) >= 0) ? (value) : - (value)) 89 | #define ngx_max(val1, val2) ((val1 < val2) ? (val2) : (val1)) 90 | #define ngx_min(val1, val2) ((val1 > val2) ? (val2) : (val1)) 91 | 92 | void ngx_cpuinfo(void); 93 | 94 | 95 | #endif /* _NGX_CORE_H_INCLUDED_ */ 96 | -------------------------------------------------------------------------------- /src/core/ngx_list.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_LIST_H_INCLUDED_ 9 | #define _NGX_LIST_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | typedef struct ngx_list_part_s ngx_list_part_t; 17 | 18 | // 参考:nginx源码分析—链表结构ngx_list_t http://blog.csdn.net/livelylittlefish/article/details/6599065 19 | 20 | /* 21 | ngx_list_t是nginx中使用的链表结构,但与我们常说的链表结构(例如`std::list`)不太一样, 22 | 它符合list类型数据结构的一些特点,比如可以添加元素,实现动态自增长,不会像数组类型的数据结构,受到初始设定的数组容量的限制, 23 | 不同点就在于它的节点,`std::list`每个节点只能存放一个元素,ngx_list_t的节点却是一个固定大小的数组,可以存放多个元素。 24 | 25 | 在初始化的时候,我们需要设定单个元素所需要占用的内存空间大小,以及每个节点数组的容量大小。 26 | 在添加元素到这个list里面的时候,会在最尾部的节点里的数组上添加元素,如果这个节点的数组存满了,就再增加一个新的节点到这个list里面去。 27 | */ 28 | 29 | // ngx_list_part_s是代表ngx_list_t链表的一个节点。 30 | // 它自身包含了一个数组,用来存放最终的元素 31 | struct ngx_list_part_s { 32 | void *elts; //链表元素elts数组,数组申请的空间大小为size*nalloc 33 | ngx_uint_t nelts; //当前已使用的elts个数,一定要小于等于nalloc 34 | ngx_list_part_t *next; //指向ngx_list_t中的下个链表part 35 | }; 36 | 37 | // ngx_list_t结构是一个链表,链表中每个节点是ngx_list_part_t结构。 38 | // 而ngx_list_part_t中有个elts是一个数组,储存了任意大小固定的元素,它是由ngx_pool_t分配的连续空间 39 | typedef struct { 40 | ngx_list_part_t *last; //指向链表中最后一个元素,其作用相当于尾指针。插入新的节点时,从此开始。 41 | ngx_list_part_t part; //链表中第一个元素,其作用相当于头指针。遍历时,从此开始。 42 | size_t size; //链表中每个元素的大小 43 | ngx_uint_t nalloc; //链表的每个ngx_list_part_t中elts数组的所能容纳的最大元素个数 44 | ngx_pool_t *pool; //当前list数据存放的内存池 45 | } ngx_list_t; 46 | 47 | //ngx_list_create和ngx_list_init功能是一样的都是创建一个list,只是返回值不一样... 48 | ngx_list_t *ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size); 49 | 50 | // ngx_list_init是初始化了一个已有的链表 51 | static ngx_inline ngx_int_t 52 | ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size) 53 | { 54 | list->part.elts = ngx_palloc(pool, n * size); //从内存池申请空间后,让elts指向可用空间 55 | if (list->part.elts == NULL) { 56 | return NGX_ERROR; 57 | } 58 | 59 | list->part.nelts = 0; //刚分配下来,还没使用,所以为0 60 | list->part.next = NULL; 61 | list->last = &list->part; //last开始的时候指向首节点 62 | list->size = size; 63 | list->nalloc = n; 64 | list->pool = pool; 65 | 66 | return NGX_OK; 67 | } 68 | 69 | 70 | /* 71 | * 72 | * the iteration through the list: 73 | * 74 | * part = &list.part; 75 | * data = part->elts; 76 | * 77 | * for (i = 0 ;; i++) { 78 | * 79 | * if (i >= part->nelts) { 80 | * if (part->next == NULL) { 81 | * break; 82 | * } 83 | * 84 | * part = part->next; 85 | * data = part->elts; 86 | * i = 0; 87 | * } 88 | * 89 | * ... data[i] ... 90 | * 91 | * } 92 | */ 93 | 94 | 95 | void *ngx_list_push(ngx_list_t *list); 96 | 97 | 98 | #endif /* _NGX_LIST_H_INCLUDED_ */ 99 | -------------------------------------------------------------------------------- /src/core/ngx_rbtree.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_RBTREE_H_INCLUDED_ 9 | #define _NGX_RBTREE_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | 15 | 16 | typedef ngx_uint_t ngx_rbtree_key_t; 17 | typedef ngx_int_t ngx_rbtree_key_int_t; 18 | 19 | 20 | typedef struct ngx_rbtree_node_s ngx_rbtree_node_t; 21 | 22 | // 红黑树 23 | struct ngx_rbtree_node_s { 24 | // 无符号整形的关键字 25 | ngx_rbtree_key_t key; 26 | // 左子节点 27 | ngx_rbtree_node_t *left; 28 | // 右子节点 29 | ngx_rbtree_node_t *right; 30 | // 父节点 31 | ngx_rbtree_node_t *parent; 32 | // 节点的颜色,0表示黑色,1表示红色 33 | u_char color; 34 | // 仅1个字节的节点数据。由于表示的空间太小,所以一般很少使用。 35 | u_char data; 36 | }; 37 | 38 | 39 | typedef struct ngx_rbtree_s ngx_rbtree_t; 40 | 41 | typedef void (*ngx_rbtree_insert_pt) (ngx_rbtree_node_t *root, 42 | ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); 43 | 44 | struct ngx_rbtree_s { 45 | // 指向树的根节点。 46 | ngx_rbtree_node_t *root; 47 | // 指向NIL哨兵节点 48 | ngx_rbtree_node_t *sentinel; 49 | // 表示红黑树添加元素的函数指针,它决定在添加新节点时的行为究竟是替换还是新增 50 | ngx_rbtree_insert_pt insert; 51 | }; 52 | 53 | 54 | #define ngx_rbtree_init(tree, s, i) \ 55 | ngx_rbtree_sentinel_init(s); \ 56 | (tree)->root = s; \ 57 | (tree)->sentinel = s; \ 58 | (tree)->insert = i 59 | 60 | 61 | void ngx_rbtree_insert(ngx_thread_volatile ngx_rbtree_t *tree, 62 | ngx_rbtree_node_t *node); 63 | void ngx_rbtree_delete(ngx_thread_volatile ngx_rbtree_t *tree, 64 | ngx_rbtree_node_t *node); 65 | void ngx_rbtree_insert_value(ngx_rbtree_node_t *root, ngx_rbtree_node_t *node, 66 | ngx_rbtree_node_t *sentinel); 67 | void ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *root, 68 | ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); 69 | 70 | 71 | #define ngx_rbt_red(node) ((node)->color = 1) 72 | #define ngx_rbt_black(node) ((node)->color = 0) 73 | #define ngx_rbt_is_red(node) ((node)->color) 74 | #define ngx_rbt_is_black(node) (!ngx_rbt_is_red(node)) 75 | #define ngx_rbt_copy_color(n1, n2) (n1->color = n2->color) 76 | 77 | 78 | /* a sentinel must be black */ 79 | 80 | #define ngx_rbtree_sentinel_init(node) ngx_rbt_black(node) 81 | 82 | 83 | static ngx_inline ngx_rbtree_node_t * 84 | ngx_rbtree_min(ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) 85 | { 86 | while (node->left != sentinel) { 87 | node = node->left; 88 | } 89 | 90 | return node; 91 | } 92 | 93 | 94 | #endif /* _NGX_RBTREE_H_INCLUDED_ */ 95 | -------------------------------------------------------------------------------- /src/http/ngx_http_upstream_round_robin.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ 9 | #define _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | //该结构体与每个服务器的具体IP一一对应 17 | typedef struct { 18 | struct sockaddr *sockaddr;//一个可连接的IP地址 19 | socklen_t socklen;//sockaddr结构体的长度 20 | ngx_str_t name;//地址的名字 21 | 22 | ngx_int_t current_weight; 23 | ngx_int_t weight; 24 | 25 | ngx_uint_t fails; 26 | time_t accessed; 27 | 28 | ngx_uint_t max_fails; 29 | time_t fail_timeout; 30 | 31 | ngx_uint_t down; /* unsigned down:1; */ 32 | 33 | #if (NGX_HTTP_SSL) 34 | ngx_ssl_session_t *ssl_session; /* local to a process */ 35 | #endif 36 | } ngx_http_upstream_rr_peer_t; 37 | 38 | 39 | typedef struct ngx_http_upstream_rr_peers_s ngx_http_upstream_rr_peers_t; 40 | //管理IP地址列表 41 | struct ngx_http_upstream_rr_peers_s { 42 | ngx_uint_t single; /* unsigned single:1; */ 43 | ngx_uint_t number;//服务器数量,即peer的长度 44 | ngx_uint_t last_cached; 45 | 46 | /* ngx_mutex_t *mutex; */ 47 | ngx_connection_t **cached; 48 | 49 | ngx_str_t *name; 50 | 51 | ngx_http_upstream_rr_peers_t *next;//backup服务器IP列表 52 | 53 | ngx_http_upstream_rr_peer_t peer[1];//非backup服务器IP列表 54 | }; 55 | 56 | //是负载均衡所使用的数据结构 57 | typedef struct { 58 | ngx_http_upstream_rr_peers_t *peers;//IP地址列表 59 | ngx_uint_t current;//round robin算法参数 60 | uintptr_t *tried;//重试bit数组 61 | uintptr_t data; 62 | } ngx_http_upstream_rr_peer_data_t; 63 | 64 | 65 | ngx_int_t ngx_http_upstream_init_round_robin(ngx_conf_t *cf, 66 | ngx_http_upstream_srv_conf_t *us); 67 | ngx_int_t ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r, 68 | ngx_http_upstream_srv_conf_t *us); 69 | ngx_int_t ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, 70 | ngx_http_upstream_resolved_t *ur); 71 | ngx_int_t ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, 72 | void *data); 73 | void ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, 74 | void *data, ngx_uint_t state); 75 | 76 | #if (NGX_HTTP_SSL) 77 | ngx_int_t 78 | ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc, 79 | void *data); 80 | void ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc, 81 | void *data); 82 | #endif 83 | 84 | 85 | #endif /* _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */ 86 | -------------------------------------------------------------------------------- /src/os/unix/ngx_udp_recv.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | 13 | #if (NGX_HAVE_KQUEUE) 14 | 15 | ssize_t 16 | ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) 17 | { 18 | ssize_t n; 19 | ngx_err_t err; 20 | ngx_event_t *rev; 21 | 22 | rev = c->read; 23 | 24 | do { 25 | n = recv(c->fd, buf, size, 0); 26 | 27 | ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, 28 | "recv: fd:%d %d of %d", c->fd, n, size); 29 | 30 | if (n >= 0) { 31 | if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { 32 | rev->available -= n; 33 | 34 | /* 35 | * rev->available may be negative here because some additional 36 | * bytes may be received between kevent() and recv() 37 | */ 38 | 39 | if (rev->available <= 0) { 40 | rev->ready = 0; 41 | rev->available = 0; 42 | } 43 | } 44 | 45 | return n; 46 | } 47 | 48 | err = ngx_socket_errno; 49 | 50 | if (err == NGX_EAGAIN || err == NGX_EINTR) { 51 | ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, 52 | "recv() not ready"); 53 | n = NGX_AGAIN; 54 | 55 | } else { 56 | n = ngx_connection_error(c, err, "recv() failed"); 57 | break; 58 | } 59 | 60 | } while (err == NGX_EINTR); 61 | 62 | rev->ready = 0; 63 | 64 | if (n == NGX_ERROR) { 65 | rev->error = 1; 66 | } 67 | 68 | return n; 69 | } 70 | 71 | #else /* ! NGX_HAVE_KQUEUE */ 72 | 73 | ssize_t 74 | ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) 75 | { 76 | ssize_t n; 77 | ngx_err_t err; 78 | ngx_event_t *rev; 79 | 80 | rev = c->read; 81 | 82 | do { 83 | n = recv(c->fd, buf, size, 0); 84 | 85 | ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, 86 | "recv: fd:%d %d of %d", c->fd, n, size); 87 | 88 | if (n >= 0) { 89 | return n; 90 | } 91 | 92 | err = ngx_socket_errno; 93 | 94 | if (err == NGX_EAGAIN || err == NGX_EINTR) { 95 | ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, 96 | "recv() not ready"); 97 | n = NGX_AGAIN; 98 | 99 | } else { 100 | n = ngx_connection_error(c, err, "recv() failed"); 101 | break; 102 | } 103 | 104 | } while (err == NGX_EINTR); 105 | 106 | rev->ready = 0; 107 | 108 | if (n == NGX_ERROR) { 109 | rev->error = 1; 110 | } 111 | 112 | return n; 113 | } 114 | 115 | #endif /* NGX_HAVE_KQUEUE */ 116 | -------------------------------------------------------------------------------- /src/os/unix/ngx_freebsd_rfork_thread.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_FREEBSD_RFORK_THREAD_H_INCLUDED_ 9 | #define _NGX_FREEBSD_RFORK_THREAD_H_INCLUDED_ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | typedef pid_t ngx_tid_t; 17 | 18 | #define ngx_log_pid ngx_thread_self() 19 | #define ngx_log_tid 0 20 | 21 | #define NGX_TID_T_FMT "%P" 22 | 23 | 24 | #define NGX_MUTEX_LIGHT 1 25 | 26 | #define NGX_MUTEX_LOCK_BUSY 0x80000000 27 | 28 | typedef volatile struct { 29 | ngx_atomic_t lock; 30 | ngx_log_t *log; 31 | int semid; 32 | } ngx_mutex_t; 33 | 34 | 35 | #define NGX_CV_SIGNAL 64 36 | 37 | typedef struct { 38 | int signo; 39 | int kq; 40 | ngx_tid_t tid; 41 | ngx_log_t *log; 42 | } ngx_cond_t; 43 | 44 | 45 | #define ngx_thread_sigmask(how, set, oset) \ 46 | (sigprocmask(how, set, oset) == -1) ? ngx_errno : 0 47 | 48 | #define ngx_thread_sigmask_n "sigprocmask()" 49 | 50 | #define ngx_thread_join(t, p) 51 | 52 | #define ngx_setthrtitle(n) setproctitle(n) 53 | 54 | 55 | extern char *ngx_freebsd_kern_usrstack; 56 | extern size_t ngx_thread_stack_size; 57 | 58 | 59 | static ngx_inline ngx_int_t 60 | ngx_gettid() 61 | { 62 | char *sp; 63 | 64 | if (ngx_thread_stack_size == 0) { 65 | return 0; 66 | } 67 | 68 | #if ( __i386__ ) 69 | 70 | __asm__ volatile ("mov %%esp, %0" : "=q" (sp)); 71 | 72 | #elif ( __amd64__ ) 73 | 74 | __asm__ volatile ("mov %%rsp, %0" : "=q" (sp)); 75 | 76 | #else 77 | 78 | #error "rfork()ed threads are not supported on this platform" 79 | 80 | #endif 81 | 82 | return (ngx_freebsd_kern_usrstack - sp) / ngx_thread_stack_size; 83 | } 84 | 85 | 86 | ngx_tid_t ngx_thread_self(); 87 | 88 | 89 | typedef ngx_uint_t ngx_tls_key_t; 90 | 91 | #define NGX_THREAD_KEYS_MAX 16 92 | 93 | extern void **ngx_tls; 94 | 95 | ngx_err_t ngx_thread_key_create(ngx_tls_key_t *key); 96 | #define ngx_thread_key_create_n "the tls key creation" 97 | 98 | ngx_err_t ngx_thread_set_tls(ngx_tls_key_t key, void *value); 99 | #define ngx_thread_set_tls_n "the tls key setting" 100 | 101 | 102 | static void * 103 | ngx_thread_get_tls(ngx_tls_key_t key) 104 | { 105 | if (key >= NGX_THREAD_KEYS_MAX) { 106 | return NULL; 107 | } 108 | 109 | return ngx_tls[key * NGX_THREAD_KEYS_MAX + ngx_gettid()]; 110 | } 111 | 112 | 113 | #define ngx_mutex_trylock(m) ngx_mutex_dolock(m, 1) 114 | #define ngx_mutex_lock(m) (void) ngx_mutex_dolock(m, 0) 115 | ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try); 116 | void ngx_mutex_unlock(ngx_mutex_t *m); 117 | 118 | 119 | typedef int (*ngx_rfork_thread_func_pt)(void *arg); 120 | 121 | 122 | #endif /* _NGX_FREEBSD_RFORK_THREAD_H_INCLUDED_ */ 123 | -------------------------------------------------------------------------------- /auto/lib/md5/conf: -------------------------------------------------------------------------------- 1 | 2 | # Copyright (C) Igor Sysoev 3 | # Copyright (C) Nginx, Inc. 4 | 5 | 6 | if [ $MD5 != NONE ]; then 7 | 8 | if grep MD5_Init $MD5/md5.h 2>&1 >/dev/null; then 9 | # OpenSSL md5 10 | OPENSSL_MD5=YES 11 | have=NGX_HAVE_OPENSSL_MD5 . auto/have 12 | have=NGX_OPENSSL_MD5 . auto/have 13 | else 14 | # rsaref md5 15 | OPENSSL_MD5=NO 16 | fi 17 | 18 | have=NGX_HAVE_MD5 . auto/have 19 | CORE_INCS="$CORE_INCS $MD5" 20 | 21 | case "$NGX_CC_NAME" in 22 | 23 | msvc* | owc* | bcc) 24 | LINK_DEPS="$LINK_DEPS $MD5/md5.lib" 25 | CORE_LIBS="$CORE_LIBS $MD5/md5.lib" 26 | ;; 27 | 28 | icc*) 29 | LINK_DEPS="$LINK_DEPS $MD5/libmd5.a" 30 | 31 | # to allow -ipo optimization we link with the *.o but not library 32 | CORE_LIBS="$CORE_LIBS $MD5/md5_dgst.o" 33 | 34 | if [ $MD5_ASM = YES ]; then 35 | CORE_LIBS="$CORE_LIBS $MD5/asm/mx86-elf.o" 36 | fi 37 | ;; 38 | 39 | *) 40 | LINK_DEPS="$LINK_DEPS $MD5/libmd5.a" 41 | CORE_LIBS="$CORE_LIBS $MD5/libmd5.a" 42 | #CORE_LIBS="$CORE_LIBS -L $MD5 -lmd5" 43 | ;; 44 | 45 | esac 46 | 47 | else 48 | 49 | if [ "$NGX_PLATFORM" != win32 ]; then 50 | 51 | MD5=NO 52 | 53 | # FreeBSD, Solaris 10 54 | 55 | ngx_feature="system md library" 56 | ngx_feature_name=NGX_HAVE_MD5 57 | ngx_feature_run=no 58 | ngx_feature_incs="#include " 59 | ngx_feature_path= 60 | ngx_feature_libs="-lmd" 61 | ngx_feature_test="MD5_CTX md5; MD5Init(&md5)" 62 | . auto/feature 63 | 64 | ngx_md5_lib="system md" 65 | 66 | if [ $ngx_found = no ]; then 67 | 68 | # Solaris 8/9 69 | 70 | ngx_feature="system md5 library" 71 | ngx_feature_libs="-lmd5" 72 | . auto/feature 73 | 74 | ngx_md5_lib="system md5" 75 | fi 76 | 77 | if [ $ngx_found = no ]; then 78 | 79 | # OpenSSL crypto library 80 | 81 | ngx_feature="OpenSSL md5 crypto library" 82 | ngx_feature_name="NGX_OPENSSL_MD5" 83 | ngx_feature_incs="#include " 84 | ngx_feature_libs="-lcrypto" 85 | ngx_feature_test="MD5_CTX md5; MD5_Init(&md5)" 86 | . auto/feature 87 | 88 | ngx_md5_lib="system crypto" 89 | 90 | if [ $ngx_found = yes ]; then 91 | have=NGX_HAVE_OPENSSL_MD5_H . auto/have 92 | have=NGX_HAVE_MD5 . auto/have 93 | fi 94 | fi 95 | 96 | if [ $ngx_found = yes ]; then 97 | CORE_LIBS="$CORE_LIBS $ngx_feature_libs" 98 | MD5=YES 99 | MD5_LIB=$ngx_md5_lib 100 | fi 101 | fi 102 | 103 | fi 104 | -------------------------------------------------------------------------------- /src/os/unix/ngx_process.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #ifndef _NGX_PROCESS_H_INCLUDED_ 9 | #define _NGX_PROCESS_H_INCLUDED_ 10 | 11 | 12 | #include 13 | 14 | 15 | typedef pid_t ngx_pid_t; 16 | 17 | #define NGX_INVALID_PID -1 18 | 19 | typedef void (*ngx_spawn_proc_pt) (ngx_cycle_t *cycle, void *data); 20 | 21 | /*存放工作进程信息的数据结构*/ 22 | typedef struct { 23 | // 进程ID 24 | ngx_pid_t pid; 25 | // 由waitpid系统调用获取到的进程状态 26 | int status; 27 | 28 | //这是由socketpair系统调用产生出的用于进程间通信的socket句柄,这一对socket句柄可以互相通信, 29 | //目前用于master 父进程与worker子进程间的通信。 30 | ngx_socket_t channel[2]; 31 | 32 | // 子进程的循环执行方法,当父进程调用ngx_spawn_process 生成子进程时使用 33 | ngx_spawn_proc_pt proc; 34 | 35 | //上面的ngx_spawn_proc_pt方法中第二个参数需要传递一个指针,它是可选的。例如worker子进程就不需要, 36 | //而cache manage进程就需要ngx_cache_manager_ctx上下文成员。这时data一般与ngx_spawn_proc_pt方法中第二个参数是等价的。 37 | void *data; 38 | // 进程名称。操作系统中显示的进程名称与name相同 39 | char *name; 40 | 41 | // 标志位,为1表示在重新生成子进程 42 | unsigned respawn:1; 43 | // 标志位,为1表示正在生成子进程 44 | unsigned just_spawn:1; 45 | // 标志位,为1表示在进行父,子进程分离 46 | unsigned detached:1; 47 | // 标志位,为1表示进程正在退出 48 | unsigned exiting:1; 49 | // 标志位,为1表示进程已经退出 50 | unsigned exited:1; 51 | } ngx_process_t; 52 | 53 | 54 | typedef struct { 55 | char *path; 56 | char *name; 57 | char *const *argv; 58 | char *const *envp; 59 | } ngx_exec_ctx_t; 60 | 61 | 62 | #define NGX_MAX_PROCESSES 1024 63 | 64 | #define NGX_PROCESS_NORESPAWN -1 65 | #define NGX_PROCESS_JUST_SPAWN -2 66 | #define NGX_PROCESS_RESPAWN -3 67 | #define NGX_PROCESS_JUST_RESPAWN -4 68 | #define NGX_PROCESS_DETACHED -5 69 | 70 | 71 | #define ngx_getpid getpid 72 | 73 | #ifndef ngx_log_pid 74 | #define ngx_log_pid ngx_pid 75 | #endif 76 | 77 | 78 | ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, 79 | ngx_spawn_proc_pt proc, void *data, char *name, ngx_int_t respawn); 80 | ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx); 81 | ngx_int_t ngx_init_signals(ngx_log_t *log); 82 | void ngx_debug_point(void); 83 | 84 | 85 | #if (NGX_HAVE_SCHED_YIELD) 86 | #define ngx_sched_yield() sched_yield() 87 | #else 88 | #define ngx_sched_yield() usleep(1) 89 | #endif 90 | 91 | 92 | extern int ngx_argc; 93 | extern char **ngx_argv; 94 | extern char **ngx_os_argv; 95 | 96 | extern ngx_pid_t ngx_pid; 97 | extern ngx_socket_t ngx_channel; 98 | extern ngx_int_t ngx_process_slot; 99 | extern ngx_int_t ngx_last_process; 100 | extern ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; 101 | 102 | 103 | #endif /* _NGX_PROCESS_H_INCLUDED_ */ 104 | -------------------------------------------------------------------------------- /src/os/unix/ngx_posix_init.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | 13 | ngx_int_t ngx_ncpu; 14 | ngx_int_t ngx_max_sockets; 15 | ngx_uint_t ngx_inherited_nonblocking; 16 | ngx_uint_t ngx_tcp_nodelay_and_tcp_nopush; 17 | 18 | 19 | struct rlimit rlmt; 20 | 21 | 22 | ngx_os_io_t ngx_os_io = { 23 | ngx_unix_recv, 24 | ngx_readv_chain, 25 | ngx_udp_unix_recv, 26 | ngx_unix_send, 27 | ngx_writev_chain, 28 | 0 29 | }; 30 | 31 | 32 | ngx_int_t 33 | ngx_os_init(ngx_log_t *log) 34 | { 35 | ngx_uint_t n; 36 | 37 | #if (NGX_HAVE_OS_SPECIFIC_INIT) 38 | if (ngx_os_specific_init(log) != NGX_OK) { 39 | return NGX_ERROR; 40 | } 41 | #endif 42 | 43 | ngx_init_setproctitle(log); 44 | 45 | ngx_pagesize = getpagesize(); 46 | ngx_cacheline_size = NGX_CPU_CACHE_LINE; 47 | 48 | for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ } 49 | 50 | #if (NGX_HAVE_SC_NPROCESSORS_ONLN) 51 | if (ngx_ncpu == 0) { 52 | ngx_ncpu = sysconf(_SC_NPROCESSORS_ONLN); 53 | } 54 | #endif 55 | 56 | if (ngx_ncpu < 1) { 57 | ngx_ncpu = 1; 58 | } 59 | 60 | ngx_cpuinfo(); 61 | 62 | if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) { 63 | ngx_log_error(NGX_LOG_ALERT, log, errno, 64 | "getrlimit(RLIMIT_NOFILE) failed)"); 65 | return NGX_ERROR; 66 | } 67 | 68 | ngx_max_sockets = (ngx_int_t) rlmt.rlim_cur; 69 | 70 | #if (NGX_HAVE_INHERITED_NONBLOCK || NGX_HAVE_ACCEPT4) 71 | ngx_inherited_nonblocking = 1; 72 | #else 73 | ngx_inherited_nonblocking = 0; 74 | #endif 75 | 76 | srandom(ngx_time()); 77 | 78 | return NGX_OK; 79 | } 80 | 81 | 82 | void 83 | ngx_os_status(ngx_log_t *log) 84 | { 85 | ngx_log_error(NGX_LOG_NOTICE, log, 0, NGINX_VER); 86 | 87 | #ifdef NGX_COMPILER 88 | ngx_log_error(NGX_LOG_NOTICE, log, 0, "built by " NGX_COMPILER); 89 | #endif 90 | 91 | #if (NGX_HAVE_OS_SPECIFIC_INIT) 92 | ngx_os_specific_status(log); 93 | #endif 94 | 95 | ngx_log_error(NGX_LOG_NOTICE, log, 0, 96 | "getrlimit(RLIMIT_NOFILE): %r:%r", 97 | rlmt.rlim_cur, rlmt.rlim_max); 98 | } 99 | 100 | 101 | ngx_int_t 102 | ngx_posix_post_conf_init(ngx_log_t *log) 103 | { 104 | ngx_fd_t pp[2]; 105 | 106 | if (pipe(pp) == -1) { 107 | ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "pipe() failed"); 108 | return NGX_ERROR; 109 | } 110 | 111 | if (dup2(pp[1], STDERR_FILENO) == -1) { 112 | ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDERR) failed"); 113 | return NGX_ERROR; 114 | } 115 | 116 | if (pp[1] > STDERR_FILENO) { 117 | if (close(pp[1]) == -1) { 118 | ngx_log_error(NGX_LOG_EMERG, log, errno, "close() failed"); 119 | return NGX_ERROR; 120 | } 121 | } 122 | 123 | return NGX_OK; 124 | } 125 | -------------------------------------------------------------------------------- /src/os/unix/ngx_aio_write.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | 13 | extern int ngx_kqueue; 14 | 15 | 16 | ssize_t 17 | ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size) 18 | { 19 | int n; 20 | ngx_event_t *wev; 21 | 22 | wev = c->write; 23 | 24 | if (!wev->ready) { 25 | return NGX_AGAIN; 26 | } 27 | 28 | ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0, 29 | "aio: wev->complete: %d", wev->complete); 30 | 31 | if (!wev->complete) { 32 | ngx_memzero(&wev->aiocb, sizeof(struct aiocb)); 33 | 34 | wev->aiocb.aio_fildes = c->fd; 35 | wev->aiocb.aio_buf = buf; 36 | wev->aiocb.aio_nbytes = size; 37 | 38 | #if (NGX_HAVE_KQUEUE) 39 | wev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue; 40 | wev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT; 41 | wev->aiocb.aio_sigevent.sigev_value.sigval_ptr = wev; 42 | #endif 43 | 44 | if (aio_write(&wev->aiocb) == -1) { 45 | ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno, 46 | "aio_write() failed"); 47 | return NGX_ERROR; 48 | } 49 | 50 | ngx_log_debug0(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: OK"); 51 | 52 | wev->active = 1; 53 | wev->ready = 0; 54 | } 55 | 56 | wev->complete = 0; 57 | 58 | n = aio_error(&wev->aiocb); 59 | if (n == -1) { 60 | ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno, "aio_error() failed"); 61 | wev->error = 1; 62 | return NGX_ERROR; 63 | } 64 | 65 | if (n != 0) { 66 | if (n == NGX_EINPROGRESS) { 67 | if (wev->ready) { 68 | ngx_log_error(NGX_LOG_ALERT, wev->log, n, 69 | "aio_write() still in progress"); 70 | wev->ready = 0; 71 | } 72 | return NGX_AGAIN; 73 | } 74 | 75 | ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_write() failed"); 76 | wev->error = 1; 77 | wev->ready = 0; 78 | 79 | #if 1 80 | n = aio_return(&wev->aiocb); 81 | if (n == -1) { 82 | ngx_log_error(NGX_LOG_ALERT, wev->log, ngx_errno, 83 | "aio_return() failed"); 84 | } 85 | 86 | ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_return() %d", n); 87 | #endif 88 | 89 | return NGX_ERROR; 90 | } 91 | 92 | n = aio_return(&wev->aiocb); 93 | if (n == -1) { 94 | ngx_log_error(NGX_LOG_ALERT, wev->log, ngx_errno, 95 | "aio_return() failed"); 96 | 97 | wev->error = 1; 98 | wev->ready = 0; 99 | return NGX_ERROR; 100 | } 101 | 102 | 103 | ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: %d", n); 104 | 105 | wev->active = 0; 106 | wev->ready = 1; 107 | 108 | return n; 109 | } 110 | -------------------------------------------------------------------------------- /src/os/unix/ngx_aio_read.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | 13 | extern int ngx_kqueue; 14 | 15 | 16 | ssize_t 17 | ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size) 18 | { 19 | int n; 20 | ngx_event_t *rev; 21 | 22 | rev = c->read; 23 | 24 | if (!rev->ready) { 25 | ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second aio post"); 26 | return NGX_AGAIN; 27 | } 28 | 29 | ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, 30 | "rev->complete: %d", rev->complete); 31 | ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, 32 | "aio size: %d", size); 33 | 34 | if (!rev->complete) { 35 | ngx_memzero(&rev->aiocb, sizeof(struct aiocb)); 36 | 37 | rev->aiocb.aio_fildes = c->fd; 38 | rev->aiocb.aio_buf = buf; 39 | rev->aiocb.aio_nbytes = size; 40 | 41 | #if (NGX_HAVE_KQUEUE) 42 | rev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue; 43 | rev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT; 44 | rev->aiocb.aio_sigevent.sigev_value.sigval_ptr = rev; 45 | #endif 46 | 47 | if (aio_read(&rev->aiocb) == -1) { 48 | ngx_log_error(NGX_LOG_CRIT, rev->log, ngx_errno, 49 | "aio_read() failed"); 50 | rev->error = 1; 51 | return NGX_ERROR; 52 | } 53 | 54 | ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, 55 | "aio_read: #%d OK", c->fd); 56 | 57 | rev->active = 1; 58 | rev->ready = 0; 59 | } 60 | 61 | rev->complete = 0; 62 | 63 | n = aio_error(&rev->aiocb); 64 | if (n == -1) { 65 | ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "aio_error() failed"); 66 | rev->error = 1; 67 | return NGX_ERROR; 68 | } 69 | 70 | if (n != 0) { 71 | if (n == NGX_EINPROGRESS) { 72 | if (rev->ready) { 73 | ngx_log_error(NGX_LOG_ALERT, c->log, n, 74 | "aio_read() still in progress"); 75 | rev->ready = 0; 76 | } 77 | return NGX_AGAIN; 78 | } 79 | 80 | ngx_log_error(NGX_LOG_CRIT, c->log, n, "aio_read() failed"); 81 | rev->error = 1; 82 | rev->ready = 0; 83 | return NGX_ERROR; 84 | } 85 | 86 | n = aio_return(&rev->aiocb); 87 | if (n == -1) { 88 | ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, 89 | "aio_return() failed"); 90 | 91 | rev->error = 1; 92 | rev->ready = 0; 93 | return NGX_ERROR; 94 | } 95 | 96 | ngx_log_debug2(NGX_LOG_DEBUG_EVENT, rev->log, 0, 97 | "aio_read: #%d %d", c->fd, n); 98 | 99 | if (n == 0) { 100 | rev->eof = 1; 101 | rev->ready = 0; 102 | } else { 103 | rev->ready = 1; 104 | } 105 | 106 | rev->active = 0; 107 | 108 | return n; 109 | } 110 | -------------------------------------------------------------------------------- /src/core/ngx_list.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | //该函数创建一个ngx_list_t类型的对象,并对该list的第一个节点分配存放元素的内存空间。 12 | // 13 | //pool: 分配内存使用的pool。 14 | //n: 每个节点(ngx_list_part_t)最多可以存放的元素个数 15 | //size: 每个元素所占用的内存大小 16 | ngx_list_t * 17 | ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size) 18 | { 19 | ngx_list_t *list; 20 | 21 | // 先创建一个ngx_list_t指针 22 | list = ngx_palloc(pool, sizeof(ngx_list_t)); 23 | if (list == NULL) { 24 | return NULL; 25 | } 26 | 27 | list->part.elts = ngx_palloc(pool, n * size); 28 | if (list->part.elts == NULL) { 29 | return NULL; 30 | } 31 | 32 | list->part.nelts = 0; 33 | list->part.next = NULL; 34 | list->last = &list->part; 35 | list->size = size; 36 | list->nalloc = n; 37 | list->pool = pool; 38 | 39 | return list; 40 | } 41 | 42 | /* 43 | ngx_list_create的使用示例: 44 | 45 | ngx_list_t *testlist = ngx_list_create(r->pool, 4, sizeof(ngx_str_t)); 46 | if (testlist == NULL) { 47 | return NGX_ERROR; 48 | } 49 | */ 50 | 51 | 52 | // 往链表l中添加新的元素,返回的是新分配的元素的首地址 53 | void * 54 | ngx_list_push(ngx_list_t *l) 55 | { 56 | void *elt; 57 | ngx_list_part_t *last; 58 | 59 | last = l->last; 60 | 61 | if (last->nelts == l->nalloc) { 62 | // 这里是last节点已经使用了nlloc的elts,所以必须新建一个last节点 63 | /* the last part is full, allocate a new list part */ 64 | 65 | last = ngx_palloc(l->pool, sizeof(ngx_list_part_t)); 66 | if (last == NULL) { 67 | return NULL; 68 | } 69 | 70 | last->elts = ngx_palloc(l->pool, l->nalloc * l->size); 71 | if (last->elts == NULL) { 72 | return NULL; 73 | } 74 | 75 | last->nelts = 0; 76 | last->next = NULL; 77 | 78 | l->last->next = last; 79 | l->last = last; 80 | } 81 | 82 | elt = (char *) last->elts + l->size * last->nelts; 83 | last->nelts++; 84 | 85 | return elt; 86 | } 87 | 88 | /* 89 | ngx_list_push的使用实例: 90 | 91 | ngx_str_t *str = ngx_list_push(testlist); 92 | if (str == NULL) { 93 | return NGX_ERROR; 94 | } 95 | 96 | str->len = sizeof("Hello World"); 97 | str->value = "Hello World"; 98 | */ 99 | 100 | 101 | 102 | /*遍历链表的实例 103 | //part用于指向链表中的每一个ngx_list_part_t数组 104 | ngx_list_part_t* part = &testlist.part; 105 | //根据链表中的数据类型,把数组里的elts转化为该类型使用 106 | ngx_str_t* str = part->elts; 107 | //i表示元素在链表的每个ngx_list_part_t数组里的序号 108 | for (i = 0;;i++) 109 | { 110 | if (i>=part->next) 111 | { 112 | if (part->next == NULL) 113 | { 114 | //说明某个ngx_list_part_t数组的next指针为空,则说明已经遍历完链表 115 | break; 116 | } 117 | //访问下一个ngx_list_part_t 118 | part = part->next; 119 | header = part->elts; 120 | //将i的序号重置为0,准备重新访问下一个数组 121 | i = 0; 122 | } 123 | //这里可以很方便地取到当前遍历到的链表元素、 124 | printf("List Element:%*s\n", str[i].len, str[i].data); 125 | } 126 | */ -------------------------------------------------------------------------------- /src/core/ngx_cpuinfo.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (C) Igor Sysoev 4 | * Copyright (C) Nginx, Inc. 5 | */ 6 | 7 | 8 | #include 9 | #include 10 | 11 | 12 | #if (( __i386__ || __amd64__ ) && ( __GNUC__ || __INTEL_COMPILER )) 13 | 14 | 15 | static ngx_inline void ngx_cpuid(uint32_t i, uint32_t *buf); 16 | 17 | 18 | #if ( __i386__ ) 19 | 20 | static ngx_inline void 21 | ngx_cpuid(uint32_t i, uint32_t *buf) 22 | { 23 | 24 | /* 25 | * we could not use %ebx as output parameter if gcc builds PIC, 26 | * and we could not save %ebx on stack, because %esp is used, 27 | * when the -fomit-frame-pointer optimization is specified. 28 | */ 29 | 30 | __asm__ ( 31 | 32 | " mov %%ebx, %%esi; " 33 | 34 | " cpuid; " 35 | " mov %%eax, (%1); " 36 | " mov %%ebx, 4(%1); " 37 | " mov %%edx, 8(%1); " 38 | " mov %%ecx, 12(%1); " 39 | 40 | " mov %%esi, %%ebx; " 41 | 42 | : : "a" (i), "D" (buf) : "ecx", "edx", "esi", "memory" ); 43 | } 44 | 45 | 46 | #else /* __amd64__ */ 47 | 48 | 49 | static ngx_inline void 50 | ngx_cpuid(uint32_t i, uint32_t *buf) 51 | { 52 | uint32_t eax, ebx, ecx, edx; 53 | 54 | __asm__ ( 55 | 56 | "cpuid" 57 | 58 | : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (i) ); 59 | 60 | buf[0] = eax; 61 | buf[1] = ebx; 62 | buf[2] = edx; 63 | buf[3] = ecx; 64 | } 65 | 66 | 67 | #endif 68 | 69 | 70 | /* auto detect the L2 cache line size of modern and widespread CPUs */ 71 | 72 | void 73 | ngx_cpuinfo(void) 74 | { 75 | u_char *vendor; 76 | uint32_t vbuf[5], cpu[4], model; 77 | 78 | vbuf[0] = 0; 79 | vbuf[1] = 0; 80 | vbuf[2] = 0; 81 | vbuf[3] = 0; 82 | vbuf[4] = 0; 83 | 84 | ngx_cpuid(0, vbuf); 85 | 86 | vendor = (u_char *) &vbuf[1]; 87 | 88 | if (vbuf[0] == 0) { 89 | return; 90 | } 91 | 92 | ngx_cpuid(1, cpu); 93 | 94 | if (ngx_strcmp(vendor, "GenuineIntel") == 0) { 95 | 96 | switch ((cpu[0] & 0xf00) >> 8) { 97 | 98 | /* Pentium */ 99 | case 5: 100 | ngx_cacheline_size = 32; 101 | break; 102 | 103 | /* Pentium Pro, II, III */ 104 | case 6: 105 | ngx_cacheline_size = 32; 106 | 107 | model = ((cpu[0] & 0xf0000) >> 8) | (cpu[0] & 0xf0); 108 | 109 | if (model >= 0xd0) { 110 | /* Intel Core, Core 2, Atom */ 111 | ngx_cacheline_size = 64; 112 | } 113 | 114 | break; 115 | 116 | /* 117 | * Pentium 4, although its cache line size is 64 bytes, 118 | * it prefetches up to two cache lines during memory read 119 | */ 120 | case 15: 121 | ngx_cacheline_size = 128; 122 | break; 123 | } 124 | 125 | } else if (ngx_strcmp(vendor, "AuthenticAMD") == 0) { 126 | ngx_cacheline_size = 64; 127 | } 128 | } 129 | 130 | #else 131 | 132 | 133 | void 134 | ngx_cpuinfo(void) 135 | { 136 | } 137 | 138 | 139 | #endif 140 | --------------------------------------------------------------------------------