diff src/core/ngx_module.h @ 6383:85dea406e18f

Dynamic modules. The auto/module script is extended to understand ngx_module_link=DYNAMIC. When set, it links the module as a shared object rather than statically into nginx binary. The module can later be loaded using the "load_module" directive. New auto/module parameter ngx_module_order allows to define module loading order in complex cases. By default the order is set based on ngx_module_type. 3rd party modules can be compiled dynamically using the --add-dynamic-module configure option, which will preset ngx_module_link to "DYNAMIC" before calling the module config script. Win32 support is rudimentary, and only works when using MinGW gcc (which is able to handle exports/imports automatically). In collaboration with Ruslan Ermilov.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 04 Feb 2016 20:25:29 +0300
parents 0f203a2af17c
children ff1e625ae55b
line wrap: on
line diff
--- a/src/core/ngx_module.h
+++ b/src/core/ngx_module.h
@@ -12,9 +12,234 @@
 
 #include <ngx_config.h>
 #include <ngx_core.h>
+#include <nginx.h>
+
+
+#define NGX_MODULE_UNSET_INDEX  (ngx_uint_t) -1
 
 
-#define NGX_MODULE_V1          0, 0, 0, 0, 0, 0, 1
+#define NGX_MODULE_SIGNATURE_0                                                \
+    ngx_value(NGX_PTR_SIZE) ","                                               \
+    ngx_value(NGX_SIG_ATOMIC_T_SIZE) ","                                      \
+    ngx_value(NGX_TIME_T_SIZE) ","
+
+#if (NGX_HAVE_KQUEUE)
+#define NGX_MODULE_SIGNATURE_1   "1"
+#else
+#define NGX_MODULE_SIGNATURE_1   "0"
+#endif
+
+#if (NGX_HAVE_IOCP)
+#define NGX_MODULE_SIGNATURE_2   "1"
+#else
+#define NGX_MODULE_SIGNATURE_2   "0"
+#endif
+
+#if (NGX_HAVE_FILE_AIO)
+#define NGX_MODULE_SIGNATURE_3   "1"
+#else
+#define NGX_MODULE_SIGNATURE_3   "0"
+#endif
+
+#if (NGX_HAVE_AIO_SENDFILE)
+#define NGX_MODULE_SIGNATURE_4   "1"
+#else
+#define NGX_MODULE_SIGNATURE_4   "0"
+#endif
+
+#if (NGX_HAVE_EVENTFD)
+#define NGX_MODULE_SIGNATURE_5   "1"
+#else
+#define NGX_MODULE_SIGNATURE_5   "0"
+#endif
+
+#if (NGX_HAVE_EPOLL)
+#define NGX_MODULE_SIGNATURE_6   "1"
+#else
+#define NGX_MODULE_SIGNATURE_6   "0"
+#endif
+
+#if (NGX_HAVE_KEEPALIVE_TUNABLE)
+#define NGX_MODULE_SIGNATURE_7   "1"
+#else
+#define NGX_MODULE_SIGNATURE_7   "0"
+#endif
+
+#if (NGX_HAVE_INET6)
+#define NGX_MODULE_SIGNATURE_8   "1"
+#else
+#define NGX_MODULE_SIGNATURE_8   "0"
+#endif
+
+#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
+#define NGX_MODULE_SIGNATURE_9   "1"
+#else
+#define NGX_MODULE_SIGNATURE_9   "0"
+#endif
+
+#if (NGX_HAVE_REUSEPORT)
+#define NGX_MODULE_SIGNATURE_10  "1"
+#else
+#define NGX_MODULE_SIGNATURE_10  "0"
+#endif
+
+#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
+#define NGX_MODULE_SIGNATURE_11  "1"
+#else
+#define NGX_MODULE_SIGNATURE_11  "0"
+#endif
+
+#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
+#define NGX_MODULE_SIGNATURE_12  "1"
+#else
+#define NGX_MODULE_SIGNATURE_12  "0"
+#endif
+
+#if (NGX_HAVE_SETFIB)
+#define NGX_MODULE_SIGNATURE_13  "1"
+#else
+#define NGX_MODULE_SIGNATURE_13  "0"
+#endif
+
+#if (NGX_HAVE_TCP_FASTOPEN)
+#define NGX_MODULE_SIGNATURE_14  "1"
+#else
+#define NGX_MODULE_SIGNATURE_14  "0"
+#endif
+
+#if (NGX_HAVE_UNIX_DOMAIN)
+#define NGX_MODULE_SIGNATURE_15  "1"
+#else
+#define NGX_MODULE_SIGNATURE_15  "0"
+#endif
+
+#if (NGX_HAVE_VARIADIC_MACROS)
+#define NGX_MODULE_SIGNATURE_16  "1"
+#else
+#define NGX_MODULE_SIGNATURE_16  "0"
+#endif
+
+#if (NGX_HAVE_MD5)
+#define NGX_MODULE_SIGNATURE_17  "1"
+#else
+#define NGX_MODULE_SIGNATURE_17  "0"
+#endif
+
+#if (NGX_HAVE_SHA1)
+#define NGX_MODULE_SIGNATURE_18  "1"
+#else
+#define NGX_MODULE_SIGNATURE_18  "0"
+#endif
+
+#if (NGX_HAVE_OPENAT)
+#define NGX_MODULE_SIGNATURE_19  "1"
+#else
+#define NGX_MODULE_SIGNATURE_19  "0"
+#endif
+
+#if (NGX_HAVE_ATOMIC_OPS)
+#define NGX_MODULE_SIGNATURE_20  "1"
+#else
+#define NGX_MODULE_SIGNATURE_20  "0"
+#endif
+
+#if (NGX_HAVE_POSIX_SEM)
+#define NGX_MODULE_SIGNATURE_21  "1"
+#else
+#define NGX_MODULE_SIGNATURE_21  "0"
+#endif
+
+#if (NGX_THREADS)
+#define NGX_MODULE_SIGNATURE_22  "1"
+#else
+#define NGX_MODULE_SIGNATURE_22  "0"
+#endif
+
+#if (NGX_PCRE)
+#define NGX_MODULE_SIGNATURE_23  "1"
+#else
+#define NGX_MODULE_SIGNATURE_23  "0"
+#endif
+
+#if (NGX_HTTP_SSL)
+#define NGX_MODULE_SIGNATURE_24  "1"
+#else
+#define NGX_MODULE_SIGNATURE_24  "0"
+#endif
+
+#if (NGX_HTTP_V2)
+#define NGX_MODULE_SIGNATURE_25  "1"
+#else
+#define NGX_MODULE_SIGNATURE_25  "0"
+#endif
+
+#if (NGX_HTTP_GZIP)
+#define NGX_MODULE_SIGNATURE_26  "1"
+#else
+#define NGX_MODULE_SIGNATURE_26  "0"
+#endif
+
+#if (NGX_HTTP_DEGRADATION)
+#define NGX_MODULE_SIGNATURE_27  "1"
+#else
+#define NGX_MODULE_SIGNATURE_27  "0"
+#endif
+
+#if (NGX_HTTP_X_FORWARDED_FOR)
+#define NGX_MODULE_SIGNATURE_28  "1"
+#else
+#define NGX_MODULE_SIGNATURE_28  "0"
+#endif
+
+#if (NGX_HTTP_REALIP)
+#define NGX_MODULE_SIGNATURE_29  "1"
+#else
+#define NGX_MODULE_SIGNATURE_29  "0"
+#endif
+
+#if (NGX_HTTP_HEADERS)
+#define NGX_MODULE_SIGNATURE_30  "1"
+#else
+#define NGX_MODULE_SIGNATURE_30  "0"
+#endif
+
+#if (NGX_HTTP_DAV)
+#define NGX_MODULE_SIGNATURE_31  "1"
+#else
+#define NGX_MODULE_SIGNATURE_31  "0"
+#endif
+
+#if (NGX_HTTP_CACHE)
+#define NGX_MODULE_SIGNATURE_32  "1"
+#else
+#define NGX_MODULE_SIGNATURE_32  "0"
+#endif
+
+#if (NGX_HTTP_UPSTREAM_ZONE)
+#define NGX_MODULE_SIGNATURE_33  "1"
+#else
+#define NGX_MODULE_SIGNATURE_33  "0"
+#endif
+
+#define NGX_MODULE_SIGNATURE                                                  \
+    NGX_MODULE_SIGNATURE_0 NGX_MODULE_SIGNATURE_1 NGX_MODULE_SIGNATURE_2      \
+    NGX_MODULE_SIGNATURE_3 NGX_MODULE_SIGNATURE_4 NGX_MODULE_SIGNATURE_5      \
+    NGX_MODULE_SIGNATURE_6 NGX_MODULE_SIGNATURE_7 NGX_MODULE_SIGNATURE_8      \
+    NGX_MODULE_SIGNATURE_9 NGX_MODULE_SIGNATURE_10 NGX_MODULE_SIGNATURE_11    \
+    NGX_MODULE_SIGNATURE_12 NGX_MODULE_SIGNATURE_13 NGX_MODULE_SIGNATURE_14   \
+    NGX_MODULE_SIGNATURE_15 NGX_MODULE_SIGNATURE_16 NGX_MODULE_SIGNATURE_17   \
+    NGX_MODULE_SIGNATURE_18 NGX_MODULE_SIGNATURE_19 NGX_MODULE_SIGNATURE_20   \
+    NGX_MODULE_SIGNATURE_21 NGX_MODULE_SIGNATURE_22 NGX_MODULE_SIGNATURE_23   \
+    NGX_MODULE_SIGNATURE_24 NGX_MODULE_SIGNATURE_25 NGX_MODULE_SIGNATURE_26   \
+    NGX_MODULE_SIGNATURE_27 NGX_MODULE_SIGNATURE_28 NGX_MODULE_SIGNATURE_29   \
+    NGX_MODULE_SIGNATURE_30 NGX_MODULE_SIGNATURE_31 NGX_MODULE_SIGNATURE_32   \
+    NGX_MODULE_SIGNATURE_33
+
+
+#define NGX_MODULE_V1                                                         \
+    NGX_MODULE_UNSET_INDEX, NGX_MODULE_UNSET_INDEX,                           \
+    NULL, 0, 0, nginx_version, NGX_MODULE_SIGNATURE
+
 #define NGX_MODULE_V1_PADDING  0, 0, 0, 0, 0, 0, 0, 0
 
 
@@ -22,12 +247,13 @@ struct ngx_module_s {
     ngx_uint_t            ctx_index;
     ngx_uint_t            index;
 
+    char                 *name;
+
     ngx_uint_t            spare0;
     ngx_uint_t            spare1;
-    ngx_uint_t            spare2;
-    ngx_uint_t            spare3;
 
     ngx_uint_t            version;
+    char                 *signature;
 
     void                 *ctx;
     ngx_command_t        *commands;
@@ -63,12 +289,19 @@ typedef struct {
 
 
 ngx_int_t ngx_preinit_modules();
+ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle);
 ngx_int_t ngx_init_modules(ngx_cycle_t *cycle);
 ngx_int_t ngx_count_modules(ngx_cycle_t *cycle, ngx_uint_t type);
 
 
+ngx_int_t ngx_add_module(ngx_conf_t *cf, ngx_str_t *file,
+    ngx_module_t *module, char **order);
+
+
 extern ngx_module_t  *ngx_modules[];
 extern ngx_uint_t     ngx_max_module;
 
+extern char          *ngx_module_names[];
+
 
 #endif /* _NGX_MODULE_H_INCLUDED_ */