diff --git a/extra/mysqludfsys/linux/Makefile b/extra/mysqludfsys/linux/Makefile index 24ddc7193..4b15ab590 100644 --- a/extra/mysqludfsys/linux/Makefile +++ b/extra/mysqludfsys/linux/Makefile @@ -1,6 +1,6 @@ LIBDIR=/usr/lib install: - gcc -Wall -I/usr/include/mysql -O1 -shared src/lib_mysqludf_sys.c -o so/lib_mysqludf_sys.so - strip -sx so/lib_mysqludf_sys.so - sudo cp -f so/lib_mysqludf_sys.so $(LIBDIR)/lib_mysqludf_sys.so + gcc -Wall -I/usr/include/mysql -O1 -shared lib_mysqludf_sys.c -o lib_mysqludf_sys.so + strip -sx lib_mysqludf_sys.so + sudo cp -f lib_mysqludf_sys.so $(LIBDIR)/lib_mysqludf_sys.so diff --git a/extra/mysqludfsys/linux/src/lib_mysqludf_sys.c b/extra/mysqludfsys/linux/lib_mysqludf_sys.c similarity index 100% rename from extra/mysqludfsys/linux/src/lib_mysqludf_sys.c rename to extra/mysqludfsys/linux/lib_mysqludf_sys.c diff --git a/extra/mysqludfsys/linux/so/lib_mysqludf_sys.so b/extra/mysqludfsys/linux/so/lib_mysqludf_sys.so deleted file mode 100755 index 699065da3..000000000 Binary files a/extra/mysqludfsys/linux/so/lib_mysqludf_sys.so and /dev/null differ diff --git a/extra/postgresqludfsys/linux/Makefile b/extra/postgresqludfsys/linux/Makefile index 006bd245b..fcbb4a13e 100644 --- a/extra/postgresqludfsys/linux/Makefile +++ b/extra/postgresqludfsys/linux/Makefile @@ -1,11 +1,16 @@ LIBDIR=/tmp -8.2: - gcc -Wall -I/usr/include/postgresql/8.2/server -O1 -shared src/8.2/lib_postgresqludf_sys.c -o so/8.2/lib_postgresqludf_sys.so - strip -sx so/8.2/lib_postgresqludf_sys.so - cp -f so/8.2/lib_postgresqludf_sys.so $(LIBDIR)/lib_postgresqludf_sys.so +8.4: + gcc -Wall -I/usr/include/postgresql/8.4/server -O1 -shared lib_postgresqludf_sys.c -o lib_postgresqludf_sys.so + strip -sx lib_postgresqludf_sys.so + cp -f lib_postgresqludf_sys.so $(LIBDIR)/lib_postgresqludf_sys.so 8.3: - gcc -Wall -I/usr/include/postgresql/8.3/server -O1 -shared src/8.3/lib_postgresqludf_sys.c -o so/8.3/lib_postgresqludf_sys.so - strip -sx so/8.3/lib_postgresqludf_sys.so - cp -f so/8.3/lib_postgresqludf_sys.so $(LIBDIR)/lib_postgresqludf_sys.so + gcc -Wall -I/usr/include/postgresql/8.3/server -O1 -shared lib_postgresqludf_sys.c -o lib_postgresqludf_sys.so + strip -sx lib_postgresqludf_sys.so + cp -f lib_postgresqludf_sys.so $(LIBDIR)/lib_postgresqludf_sys.so + +8.2: + gcc -Wall -I/usr/include/postgresql/8.2/server -O1 -shared lib_postgresqludf_sys.c -o lib_postgresqludf_sys.so + strip -sx lib_postgresqludf_sys.so + cp -f lib_postgresqludf_sys.so $(LIBDIR)/lib_postgresqludf_sys.so diff --git a/extra/postgresqludfsys/linux/install.sh b/extra/postgresqludfsys/linux/install.sh index a5aa0c6a2..ed636efcb 100755 --- a/extra/postgresqludfsys/linux/install.sh +++ b/extra/postgresqludfsys/linux/install.sh @@ -19,11 +19,13 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Adapt the following settings to your environment -#PORT="5433" -#VERSION="8.2" -PORT="5432" -VERSION="8.3" USER="postgres" +PORT="5434" +VERSION="8.4" +#PORT="5433" +#VERSION="8.3" +#PORT="5432" +#VERSION="8.2" echo "Compiling the PostgreSQL UDF" make ${VERSION} @@ -34,8 +36,10 @@ if test $? -ne 0; then if test "${VERSION}" == "8.2"; then echo "apt-get install postgresql-server-dev-8.2" - else + else if test "${VERSION}" == "8.3"; then echo "apt-get install postgresql-server-dev-8.3" + else if test "${VERSION}" == "8.4"; then + echo "apt-get install postgresql-server-dev-8.4" fi exit 1 diff --git a/extra/postgresqludfsys/linux/src/8.3/lib_postgresqludf_sys.c b/extra/postgresqludfsys/linux/lib_postgresqludf_sys.c old mode 100644 new mode 100755 similarity index 89% rename from extra/postgresqludfsys/linux/src/8.3/lib_postgresqludf_sys.c rename to extra/postgresqludfsys/linux/lib_postgresqludf_sys.c index 48cabdcc2..c269c5421 --- a/extra/postgresqludfsys/linux/src/8.3/lib_postgresqludf_sys.c +++ b/extra/postgresqludfsys/linux/lib_postgresqludf_sys.c @@ -47,7 +47,11 @@ PG_MODULE_MAGIC; #endif PG_FUNCTION_INFO_V1(sys_exec); +#ifdef PGDLLIMPORT extern PGDLLIMPORT Datum sys_exec(PG_FUNCTION_ARGS) { +#else +extern DLLIMPORT Datum sys_exec(PG_FUNCTION_ARGS) { +#endif text *argv0 = PG_GETARG_TEXT_P(0); int32 argv0_size; int32 result = 0; @@ -72,7 +76,11 @@ extern PGDLLIMPORT Datum sys_exec(PG_FUNCTION_ARGS) { } PG_FUNCTION_INFO_V1(sys_eval); +#ifdef PGDLLIMPORT extern PGDLLIMPORT Datum sys_eval(PG_FUNCTION_ARGS) { +#else +extern DLLIMPORT Datum sys_eval(PG_FUNCTION_ARGS) { +#endif text *argv0 = PG_GETARG_TEXT_P(0); text *result_text; int32 argv0_size; @@ -112,15 +120,22 @@ extern PGDLLIMPORT Datum sys_eval(PG_FUNCTION_ARGS) { } result_text = (text *)malloc(VARHDRSZ + strlen(result)); - //VARATT_SIZEP(result_text) = strlen(result) + VARHDRSZ; +#ifdef SET_VARSIZE SET_VARSIZE(result_text, VARHDRSZ + strlen(result)); +#else + VARATT_SIZEP(result_text) = strlen(result) + VARHDRSZ; +#endif memcpy(VARDATA(result_text), result, strlen(result)); PG_RETURN_POINTER(result_text); } PG_FUNCTION_INFO_V1(sys_bineval); +#ifdef PGDLLIMPORT extern PGDLLIMPORT Datum sys_bineval(PG_FUNCTION_ARGS) { +#else +extern DLLIMPORT Datum sys_bineval(PG_FUNCTION_ARGS) { +#endif text *argv0 = PG_GETARG_TEXT_P(0); int32 argv0_size; size_t len; diff --git a/extra/postgresqludfsys/linux/so/8.2/lib_postgresqludf_sys.so b/extra/postgresqludfsys/linux/so/8.2/lib_postgresqludf_sys.so deleted file mode 100644 index 16556d4fb..000000000 Binary files a/extra/postgresqludfsys/linux/so/8.2/lib_postgresqludf_sys.so and /dev/null differ diff --git a/extra/postgresqludfsys/linux/so/8.3/lib_postgresqludf_sys.so b/extra/postgresqludfsys/linux/so/8.3/lib_postgresqludf_sys.so deleted file mode 100755 index bb7cfa39c..000000000 Binary files a/extra/postgresqludfsys/linux/so/8.3/lib_postgresqludf_sys.so and /dev/null differ diff --git a/extra/postgresqludfsys/linux/src/8.2/lib_postgresqludf_sys.c b/extra/postgresqludfsys/linux/src/8.2/lib_postgresqludf_sys.c deleted file mode 100755 index ffc890e9c..000000000 --- a/extra/postgresqludfsys/linux/src/8.2/lib_postgresqludf_sys.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - lib_postgresqludf_sys - a library with miscellaneous (operating) system level functions - Copyright (C) 2009 Bernardo Damele A. G. - web: http://bernardodamele.blogspot.com/ - email: bernardo.damele@gmail.com - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32) -#define _USE_32BIT_TIME_T -#define DLLEXP __declspec(dllexport) -#define BUILDING_DLL 1 -#else -#define DLLEXP -#include -#include -#include -#include -#endif - -#include -#include -#include -#include - -#include - -#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32) -DWORD WINAPI exec_payload(LPVOID lpParameter); -#endif - -#ifdef PG_MODULE_MAGIC -PG_MODULE_MAGIC; -#endif - -PG_FUNCTION_INFO_V1(sys_exec); -extern DLLIMPORT Datum sys_exec(PG_FUNCTION_ARGS) { - text *argv0 = PG_GETARG_TEXT_P(0); - int32 argv0_size; - int32 result = 0; - char *command; - - argv0_size = VARSIZE(argv0) - VARHDRSZ; - command = (char *)malloc(argv0_size + 1); - - memcpy(command, VARDATA(argv0), argv0_size); - command[argv0_size] = '\0'; - - /* - Only if you want to log - elog(NOTICE, "Command execution: %s", command); - */ - - result = system(command); - free(command); - - PG_FREE_IF_COPY(argv0, 0); - PG_RETURN_INT32(result); -} - -PG_FUNCTION_INFO_V1(sys_eval); -extern DLLIMPORT Datum sys_eval(PG_FUNCTION_ARGS) { - text *argv0 = PG_GETARG_TEXT_P(0); - text *result_text; - int32 argv0_size; - char *command; - char *result; - FILE *pipe; - char line[1024]; - int32 outlen, linelen; - - argv0_size = VARSIZE(argv0) - VARHDRSZ; - command = (char *)malloc(argv0_size + 1); - - memcpy(command, VARDATA(argv0), argv0_size); - command[argv0_size] = '\0'; - - /* - Only if you want to log - elog(NOTICE, "Command evaluated: %s", command); - */ - - result = (char *)malloc(1); - outlen = 0; - - pipe = popen(command, "r"); - - while (fgets(line, sizeof(line), pipe) != NULL) { - linelen = strlen(line); - result = (char *)realloc(result, outlen + linelen); - strncpy(result + outlen, line, linelen); - outlen = outlen + linelen; - } - - pclose(pipe); - - if (*result) { - result[outlen-1] = 0x00; - } - - result_text = (text *)malloc(VARHDRSZ + strlen(result)); - VARATT_SIZEP(result_text) = strlen(result) + VARHDRSZ; - //SET_VARSIZE(result_text, VARHDRSZ + strlen(result)); - memcpy(VARDATA(result_text), result, strlen(result)); - - PG_RETURN_POINTER(result_text); -} - -PG_FUNCTION_INFO_V1(sys_bineval); -extern DLLIMPORT Datum sys_bineval(PG_FUNCTION_ARGS) { - text *argv0 = PG_GETARG_TEXT_P(0); - int32 argv0_size; - size_t len; - -#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32) - int pID; - char *code; -#else - int *addr; - size_t page_size; - pid_t pID; -#endif - - argv0_size = VARSIZE(argv0) - VARHDRSZ; - len = (size_t)argv0_size; - -#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32) - // allocate a +rwx memory page - code = (char *) VirtualAlloc(NULL, len+1, MEM_COMMIT, PAGE_EXECUTE_READWRITE); - strncpy(code, VARDATA(argv0), len); - - WaitForSingleObject(CreateThread(NULL, 0, exec_payload, code, 0, &pID), INFINITE); -#else - pID = fork(); - if(pID<0) - PG_RETURN_INT32(1); - - if(pID==0) - { - page_size = (size_t)sysconf(_SC_PAGESIZE)-1; // get page size - page_size = (len+page_size) & ~(page_size); // align to page boundary - - // mmap an rwx memory page - addr = mmap(0, page_size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED|MAP_ANONYMOUS, 0, 0); - - if (addr == MAP_FAILED) - PG_RETURN_INT32(1); - - strncpy((char *)addr, VARDATA(argv0), len); - - ((void (*)(void))addr)(); - } - - if(pID>0) - waitpid(pID, 0, WNOHANG); -#endif - - PG_RETURN_INT32(0); -} - -#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32) -DWORD WINAPI exec_payload(LPVOID lpParameter) -{ - __try - { - __asm - { - mov eax, [lpParameter] - call eax - } - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - - } - - return 0; -} -#endif