diff --git a/.gitignore b/.gitignore index 8017b3e..139e1cd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ plugins build *._* *.d +*.deb .vscode # Object files *.o @@ -50,6 +51,23 @@ build *.cmd modules.order Module.symvers -Mkfile.old +Makefile.old dkms.con .DS_Store +.* +*.cache +Makefile +antd +compile +config.guess +depcomp +install-sh +missing +libtool +config.log +config.status +config.sub +configure +aclocal.m4 +ltmain.sh +Makefile.in \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index 9483be8..0000000 --- a/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -include ../../var.mk -PL_NAME=cgi -PLUGINS=$(PL_NAME).$(EXT) -APP_DIR=$(BUILDIRD)/htdocs/ - -OBJS = $(PLUGINS_BASE)/plugin.o - -PLUGINSDEP = $(OBJS) \ - cgi.o - - -PLUGINLIBS = libantd.$(EXT) - -PCFLAGS=-W -Wall -g -D DEBUG $(PPF_FLAG) - -main: $(PLUGINSDEP) $(PLUGINS) #lib - -%.o: %.c - $(CC) $(PCFLAGS) -fPIC $(INCFLAG) -c $< -o $@ - -%.$(EXT): - -ln -s $(PBUILDIRD)/libantd.$(EXT) . - $(CC) $(PCFLAGS) $(PLUGINSDEP) $(PLUGINLIBS) -shared -o $(PBUILDIRD)/$(basename $@).$(EXT) - - -clean: #libclean - -rm -f *.o *.$(EXT) $(PBUILDIRD)/$(PLUGINS) - -rm $(PLUGINS_BASE)/plugin.o - - - -.PRECIOUS: %.o -.PHONY: lib clean -full: clean main - - - diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..f6f00ad --- /dev/null +++ b/Makefile.am @@ -0,0 +1,19 @@ +AUTOMAKE_OPTIONS = foreign + + + +# check for system +if LINUX + AM_CPPFLAGS = -Wl,--no-as-needed +else + AM_CPPFLAGS = -Wl,-undefined,dynamic_lookup +endif + + +AM_CPPFLAGS += -W -Wall -g -std=c99 -fPIC + +lib_LTLIBRARIES = cgi.la +cgi_la_LDFLAGS = -module -avoid-version -shared +cgi_la_SOURCES = cgi.c + +EXTRA_DIST = README.md \ No newline at end of file diff --git a/README.md b/README.md index 3dd18aa..dfc30d4 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ When all dependencies are installed, the build can be done with a few single com ```bash mkdir antd cd antd -wget -O- https://get.bitdojo.dev/antd | bash -s "cgi" +wget -O- https://get.bitdojo.dev/antd_plugin | bash -s "cgi" ``` The script will ask you for a place to put the binaries (should be an absolute path, otherwise the build will fail) and the default HTTP port for the server config. @@ -60,3 +60,12 @@ To run Antd server with the **cgi** plugin: ``` **php** Web applications can be put on **/path/to/your/build/htdocs** + +### Generte distribution +```sh +libtoolize +aclocal +autoconf +automake --add-missing +make distcheck +``` \ No newline at end of file diff --git a/cgi.c b/cgi.c index 0d4b373..71d012e 100644 --- a/cgi.c +++ b/cgi.c @@ -1,6 +1,6 @@ #include -#include "plugin.h" -#include "ini.h" +#include "antd/plugin.h" +#include "antd/ini.h" dictionary cgi_bin = NULL; static int ini_handle(void *user_data, const char *section, const char *name, @@ -30,6 +30,10 @@ void init() { LOG("Can't load '%s'\n", file); } + else + { + LOG("CGI config loaded\n"); + } free(cnf); free(file); } @@ -184,18 +188,19 @@ void *handle(void *data) char buf[BUFFLEN]; int status; antd_task_t *task = NULL; - task = antd_create_task(NULL, data, NULL,rq->client->last_io); - task->priority++; list env_vars = NULL; char *bin = get_cgi_bin(rq); if (!bin) { LOG("No cgi bin found\n"); unknow(cl); + task = antd_create_task(NULL, data, NULL,rq->client->last_io); + task->priority++; return task; } env_vars = get_env_vars(rq); // now exec the cgi bin + LOG("Execute the cgi bin\n"); item np = env_vars; int size = list_size(env_vars); char **envs = (char **)malloc((size + 1) * sizeof(*envs)); @@ -277,5 +282,7 @@ void *handle(void *data) waitpid(pid, &status, 0); free(envs); list_free(&env_vars); + task = antd_create_task(NULL, data, NULL,rq->client->last_io); + task->priority++; return task; -} \ No newline at end of file +} diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..9b1206a --- /dev/null +++ b/configure.ac @@ -0,0 +1,96 @@ +# initialise autoconf and set up some basic information about the program we’re packaging +AC_INIT([cgi], [1.0.0b], [xsang.le@gmail.com]) + +# We’re going to use automake for this project +# [subdir-objects] if needed +AM_INIT_AUTOMAKE() + +# dependencies +# C compiler +AC_PROG_CC +# libtool for linking +AC_PROG_LIBTOOL +# check if sqlite3 header exists +use_db=no +has_antd=no +AC_CHECK_HEADER([sqlite3.h],[ + AC_DEFINE([USE_DB], [1],[Use sqlite3]) + use_db=yes + # check if the library exists +],[]) +AC_CHECK_LIB([sqlite3],[sqlite3_open],[],[ + if test "$use_db" = "yes"; then + AC_MSG_ERROR([Unable to find sqlite3 shared library]) + fi +]) + +# check for lib antd +AC_CHECK_HEADER([antd/plugin.h],[ + has_antd=yes + # check if the library exists +],[ + AC_MSG_ERROR([Unable to find antd, please install it first]) +]) +AC_CHECK_LIB([antd],[antd_send],[],[ + if test "$has_antd" = "yes"; then + AC_MSG_ERROR([Unable to find antd shared library, please install it first]) + fi +]) + + +# check for pthread +AC_CHECK_LIB([pthread], [pthread_create], [], [ + AC_MSG_ERROR([libpthread is not found])]) + +# check for dl +AC_CHECK_LIB([dl], [dlopen], [], [ + AC_MSG_ERROR([unable to find dlopen()]) +]) + +AC_DEFINE([_GNU_SOURCE], [1],[Use GNU source]) +# AC_CANONICAL_HOST is needed to access the 'host_os' variable + +# debug option +AC_ARG_ENABLE([debug], + [ --enable-debug Turn on debugging], + [case "${enableval}" in + yes) AC_DEFINE([DEBUG], [1],[Enable debug]) ;; + no) ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;; + esac],[debug=false]) + +AC_CANONICAL_HOST +build_linux=no +build_windows=no +build_mac=no +# Detect the target system +case "${host_os}" in + linux*) + AC_DEFINE([LINUX], [1],[Linux system]) + build_linux=yes + ;; + darwin*) + build_mac=yes + AC_DEFINE([MACOS], [1],[MacOS system]) + ;; + *) + AC_MSG_ERROR(["OS $host_os is not supported"]) + ;; +esac +# case for window: +# cygwin*|mingw*) +# build_windows=yes +# ;; +# Pass the conditionals to automake +AM_CONDITIONAL([DB], [test "$use_db" = "yes"]) +AM_CONDITIONAL([LINUX], [test "$build_linux" = "yes"]) +AM_CONDITIONAL([WINDOWS], [test "$build_windows" = "yes"]) +AM_CONDITIONAL([OSX], [test "$build_mac" = "yes"]) + +# find a file called Makefile.in, substitute placeholders +# like @PACKAGE_VERSION@ with values like 0.1.0a, +# and write the results to Makefile. +AC_CONFIG_FILES([Makefile]) + +# output the script: +AC_OUTPUT \ No newline at end of file