Dynamic modules: dlopen() support.

This commit is contained in:
Maxim Dounin 2016-02-04 18:30:21 +03:00
parent 0f67d6355c
commit 86cc342a26
13 changed files with 134 additions and 4 deletions

View File

@ -32,7 +32,6 @@ if [ $OPENSSL != NONE ]; then
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h" CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a" CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a" CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
if [ "$NGX_PLATFORM" = win32 ]; then if [ "$NGX_PLATFORM" = win32 ]; then
CORE_LIBS="$CORE_LIBS -lgdi32 -lcrypt32 -lws2_32" CORE_LIBS="$CORE_LIBS -lgdi32 -lcrypt32 -lws2_32"
@ -106,7 +105,7 @@ else
if [ $ngx_found = yes ]; then if [ $ngx_found = yes ]; then
have=NGX_SSL . auto/have have=NGX_SSL . auto/have
CORE_INCS="$CORE_INCS $ngx_feature_path" CORE_INCS="$CORE_INCS $ngx_feature_path"
CORE_LIBS="$CORE_LIBS $ngx_feature_libs $NGX_LIBDL" CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
OPENSSL=YES OPENSSL=YES
fi fi
fi fi

View File

@ -152,6 +152,7 @@ UNIX_DEPS="$CORE_DEPS $EVENT_DEPS \
src/os/unix/ngx_socket.h \ src/os/unix/ngx_socket.h \
src/os/unix/ngx_os.h \ src/os/unix/ngx_os.h \
src/os/unix/ngx_user.h \ src/os/unix/ngx_user.h \
src/os/unix/ngx_dlopen.h \
src/os/unix/ngx_process_cycle.h" src/os/unix/ngx_process_cycle.h"
# add to UNIX_DEPS # add to UNIX_DEPS
@ -183,6 +184,7 @@ UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \
src/os/unix/ngx_setproctitle.c \ src/os/unix/ngx_setproctitle.c \
src/os/unix/ngx_posix_init.c \ src/os/unix/ngx_posix_init.c \
src/os/unix/ngx_user.c \ src/os/unix/ngx_user.c \
src/os/unix/ngx_dlopen.c \
src/os/unix/ngx_process_cycle.c" src/os/unix/ngx_process_cycle.c"
POSIX_DEPS=src/os/unix/ngx_posix_config.h POSIX_DEPS=src/os/unix/ngx_posix_config.h
@ -228,6 +230,7 @@ WIN32_DEPS="$CORE_DEPS $EVENT_DEPS \
src/os/win32/ngx_socket.h \ src/os/win32/ngx_socket.h \
src/os/win32/ngx_os.h \ src/os/win32/ngx_os.h \
src/os/win32/ngx_user.h \ src/os/win32/ngx_user.h \
src/os/win32/ngx_dlopen.h \
src/os/win32/ngx_process_cycle.h" src/os/win32/ngx_process_cycle.h"
WIN32_CONFIG=src/os/win32/ngx_win32_config.h WIN32_CONFIG=src/os/win32/ngx_win32_config.h
@ -248,6 +251,7 @@ WIN32_SRCS="$CORE_SRCS $EVENT_SRCS \
src/os/win32/ngx_wsasend_chain.c \ src/os/win32/ngx_wsasend_chain.c \
src/os/win32/ngx_win32_init.c \ src/os/win32/ngx_win32_init.c \
src/os/win32/ngx_user.c \ src/os/win32/ngx_user.c \
src/os/win32/ngx_dlopen.c \
src/os/win32/ngx_event_log.c \ src/os/win32/ngx_event_log.c \
src/os/win32/ngx_process_cycle.c \ src/os/win32/ngx_process_cycle.c \
src/event/ngx_event_acceptex.c" src/event/ngx_event_acceptex.c"

View File

@ -255,7 +255,7 @@ ngx_feature_test="struct statvfs fs;
ngx_feature="dlopen()" ngx_feature="dlopen()"
ngx_feature_name= ngx_feature_name="NGX_HAVE_DLOPEN"
ngx_feature_run=no ngx_feature_run=no
ngx_feature_incs="#include <dlfcn.h>" ngx_feature_incs="#include <dlfcn.h>"
ngx_feature_path= ngx_feature_path=
@ -271,7 +271,7 @@ if [ $ngx_found != yes ]; then
. auto/feature . auto/feature
if [ $ngx_found = yes ]; then if [ $ngx_found = yes ]; then
NGX_LIBDL="-ldl" CORE_LIBS="$CORE_LIBS -ldl"
fi fi
fi fi

View File

@ -53,6 +53,7 @@ typedef void (*ngx_connection_handler_pt)(ngx_connection_t *c);
#include <ngx_shmem.h> #include <ngx_shmem.h>
#include <ngx_process.h> #include <ngx_process.h>
#include <ngx_user.h> #include <ngx_user.h>
#include <ngx_dlopen.h>
#include <ngx_parse.h> #include <ngx_parse.h>
#include <ngx_parse_time.h> #include <ngx_parse_time.h>
#include <ngx_log.h> #include <ngx_log.h>

View File

@ -48,6 +48,8 @@
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <xlocale.h> #include <xlocale.h>
#include <dlfcn.h>
#ifndef IOV_MAX #ifndef IOV_MAX
#define IOV_MAX 64 #define IOV_MAX 64

28
src/os/unix/ngx_dlopen.c Normal file
View File

@ -0,0 +1,28 @@
/*
* Copyright (C) Maxim Dounin
* Copyright (C) Nginx, Inc.
*/
#include <ngx_config.h>
#include <ngx_core.h>
#if (NGX_HAVE_DLOPEN)
char *
ngx_dlerror(void)
{
char *err;
err = (char *) dlerror();
if (err == NULL) {
return "";
}
return err;
}
#endif

31
src/os/unix/ngx_dlopen.h Normal file
View File

@ -0,0 +1,31 @@
/*
* Copyright (C) Maxim Dounin
* Copyright (C) Nginx, Inc.
*/
#ifndef _NGX_DLOPEN_H_INCLUDED_
#define _NGX_DLOPEN_H_INCLUDED_
#include <ngx_config.h>
#include <ngx_core.h>
#define ngx_dlopen(path) dlopen((char *) path, RTLD_NOW | RTLD_GLOBAL)
#define ngx_dlopen_n "dlopen()"
#define ngx_dlsym(handle, symbol) dlsym(handle, symbol)
#define ngx_dlsym_n "dlsym()"
#define ngx_dlclose(handle) dlclose(handle)
#define ngx_dlclose_n "dlclose()"
#if (NGX_HAVE_DLOPEN)
char *ngx_dlerror(void);
#endif
#endif /* _NGX_DLOPEN_H_INCLUDED_ */

View File

@ -49,6 +49,8 @@
#include <osreldate.h> #include <osreldate.h>
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <dlfcn.h>
#if __FreeBSD_version < 400017 #if __FreeBSD_version < 400017

View File

@ -55,6 +55,8 @@
#include <crypt.h> #include <crypt.h>
#include <sys/utsname.h> /* uname() */ #include <sys/utsname.h> /* uname() */
#include <dlfcn.h>
#include <ngx_auto_config.h> #include <ngx_auto_config.h>

View File

@ -108,6 +108,11 @@
#include <ngx_auto_config.h> #include <ngx_auto_config.h>
#if (NGX_HAVE_DLOPEN)
#include <dlfcn.h>
#endif
#if (NGX_HAVE_POSIX_SEM) #if (NGX_HAVE_POSIX_SEM)
#include <semaphore.h> #include <semaphore.h>
#endif #endif

View File

@ -55,6 +55,8 @@
#include <inttypes.h> #include <inttypes.h>
#include <crypt.h> #include <crypt.h>
#include <dlfcn.h>
#define NGX_ALIGNMENT _MAX_ALIGNMENT #define NGX_ALIGNMENT _MAX_ALIGNMENT
#include <ngx_auto_config.h> #include <ngx_auto_config.h>

22
src/os/win32/ngx_dlopen.c Normal file
View File

@ -0,0 +1,22 @@
/*
* Copyright (C) Maxim Dounin
* Copyright (C) Nginx, Inc.
*/
#include <ngx_config.h>
#include <ngx_core.h>
char *
ngx_dlerror(void)
{
u_char *p;
static u_char errstr[NGX_MAX_ERROR_STR];
p = ngx_strerror(ngx_errno, errstr, NGX_MAX_ERROR_STR);
*p = '\0';
return (char *) errstr;
}

32
src/os/win32/ngx_dlopen.h Normal file
View File

@ -0,0 +1,32 @@
/*
* Copyright (C) Maxim Dounin
* Copyright (C) Nginx, Inc.
*/
#ifndef _NGX_DLOPEN_H_INCLUDED_
#define _NGX_DLOPEN_H_INCLUDED_
#include <ngx_config.h>
#include <ngx_core.h>
#define NGX_HAVE_DLOPEN 1
#define ngx_dlopen(path) LoadLibrary((char *) path)
#define ngx_dlopen_n "LoadLibrary()"
#define ngx_dlsym(handle, symbol) (void *) GetProcAddress(handle, symbol)
#define ngx_dlsym_n "GetProcAddress()"
#define ngx_dlclose(handle) (FreeLibrary(handle) ? 0 : -1)
#define ngx_dlclose_n "FreeLibrary()"
char *ngx_dlerror(void);
#endif /* _NGX_DLOPEN_H_INCLUDED_ */