From d4d26b59eb6cb88c2d326179af1519e236603cd9 Mon Sep 17 00:00:00 2001 From: Bernardo Damele Date: Thu, 14 Jan 2010 01:51:20 +0000 Subject: [PATCH] Merged UDF Linux and Windows development environments --- extra/mysqludfsys/doc/lib_mysqludf_sys.html | 278 --------- .../linux/lib_mysqludf_sys}/Makefile | 0 .../linux/lib_mysqludf_sys}/install.sh | 0 .../lib_mysqludf_sys}/lib_mysqludf_sys.c | 0 .../lib_mysqludf_sys}/lib_mysqludf_sys.sql | 0 .../linux/lib_postgresqludf_sys}/Makefile | 0 .../linux/lib_postgresqludf_sys}/install.sh | 0 .../lib_postgresqludf_sys.c | 0 .../lib_postgresqludf_sys.sql | 0 extra/udfhack/windows/README.txt | 19 + .../lib_mysqludf_sys/lib_mysqludf_sys.sln | Bin 0 -> 919 bytes .../lib_mysqludf_sys/lib_mysqludf_sys.c | 551 ++++++++++++++++++ .../lib_mysqludf_sys/lib_mysqludf_sys.vcproj | Bin 0 -> 4078 bytes .../lib_postgresqludf_sys.sln | Bin 0 -> 934 bytes .../lib_postgresqludf_sys.c | 207 +++++++ .../lib_postgresqludf_sys.vcproj | Bin 0 -> 4372 bytes 16 files changed, 777 insertions(+), 278 deletions(-) delete mode 100644 extra/mysqludfsys/doc/lib_mysqludf_sys.html rename extra/{mysqludfsys/linux => udfhack/linux/lib_mysqludf_sys}/Makefile (100%) rename extra/{mysqludfsys/linux => udfhack/linux/lib_mysqludf_sys}/install.sh (100%) rename extra/{mysqludfsys/linux => udfhack/linux/lib_mysqludf_sys}/lib_mysqludf_sys.c (100%) rename extra/{mysqludfsys/linux => udfhack/linux/lib_mysqludf_sys}/lib_mysqludf_sys.sql (100%) rename extra/{postgresqludfsys/linux => udfhack/linux/lib_postgresqludf_sys}/Makefile (100%) rename extra/{postgresqludfsys/linux => udfhack/linux/lib_postgresqludf_sys}/install.sh (100%) rename extra/{postgresqludfsys/linux => udfhack/linux/lib_postgresqludf_sys}/lib_postgresqludf_sys.c (100%) rename extra/{postgresqludfsys/linux => udfhack/linux/lib_postgresqludf_sys}/lib_postgresqludf_sys.sql (100%) create mode 100644 extra/udfhack/windows/README.txt create mode 100755 extra/udfhack/windows/lib_mysqludf_sys/lib_mysqludf_sys.sln create mode 100755 extra/udfhack/windows/lib_mysqludf_sys/lib_mysqludf_sys/lib_mysqludf_sys.c create mode 100755 extra/udfhack/windows/lib_mysqludf_sys/lib_mysqludf_sys/lib_mysqludf_sys.vcproj create mode 100755 extra/udfhack/windows/lib_postgresqludf_sys/lib_postgresqludf_sys.sln create mode 100755 extra/udfhack/windows/lib_postgresqludf_sys/lib_postgresqludf_sys/lib_postgresqludf_sys.c create mode 100755 extra/udfhack/windows/lib_postgresqludf_sys/lib_postgresqludf_sys/lib_postgresqludf_sys.vcproj diff --git a/extra/mysqludfsys/doc/lib_mysqludf_sys.html b/extra/mysqludfsys/doc/lib_mysqludf_sys.html deleted file mode 100644 index d762f5fe1..000000000 --- a/extra/mysqludfsys/doc/lib_mysqludf_sys.html +++ /dev/null @@ -1,278 +0,0 @@ - - - - - - -lib_mysqludf_sys - A library of MySQL UDFs for working with the environment in which MySQL runs - - -
- Top - | Up -
-

lib_mysqludf_sys

-
- Documentation - | Binary - | Installation - | Source - | tar.gz -
-

- This library lib_mysqludf_sys contains a number of functions that allows one to interact with the operating system. -

-
    -
  1. sys_eval - executes an arbitrary command, and returns it's output.
  2. -
  3. sys_exec - executes an arbitrary command, and returns it's exit code.
  4. -
  5. sys_get - gets the value of an environment variable.
  6. -
  7. sys_set - create an environment variable, or update the value of an existing environment variable.
  8. -
-

- Use lib_mysqludf_sys_info() to obtain information about the currently installed version of lib_mysqludf_sys. -

- - -

sys_eval

-

- sys_eval takes one command string argument and executes it, returning its output. -

-

Syntax

-
sys_eval(arg1)
-

Parameters and Return Values

-
-
arg1
-
- A command string valid for the current operating system or execution environment. -
-
returns
-
- Whatever output the command pushed to the standard output stream. -
-
-

Installation

-

- Place the shared library binary in an appropriate location. - Log in to mysql as root or as another user with sufficient privileges, and select any database. - Then, create the function using the following DDL statement: -

-
-CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys.so';	
-	
-

- The function will be globally available in all databases. -

-

- The deinstall the function, run the following statement: -

-
-DROP FUNCTION sys_eval;
-	
-

Examples

-

- None yet -

-

A Note of Caution

-

- Be very careful in deciding whether you need this function. - UDFs are available to all database users - you cannot grant EXECUTE privileges for them. - As the commandstring passed to sys_exec can do pretty much everything, - exposing the function poses a very real security hazard. -

-

- Even for a benign user, it is possible to accidentally do a lot of damage with it. - The call will be executed with the privileges of the os user that runs MySQL, - so it is entirely feasible to delete MySQL's data directory, or worse. -

-

- The function is intended for specialized MySQL applications where one needs extended - control over the operating system. - Currently, we do not have UDF's for ftp, email and http, - and this function can be used to implement such functionality in case it is really necessary - (datawarehouse staging areas could be a case in example). -

-

- You have been warned! If you don't see the hazard, please don't try to find it; just trust me on this. -

-

- If you do decide to use this library in a production environment, make sure that only specific commands can be run and file access is limited by using AppArmor. -

- -

sys_exec

-

- sys_exec takes one command string argument and executes it. -

-

Syntax

-
sys_exec(arg1)
-

Parameters and Return Values

-
-
arg1
-
- A command string valid for the current operating system or execution environment. -
-
returns
-
- An (integer) exit code returned by the executed process. -
-
-

Installation

-

- Place the shared library binary in an appropriate location. - Log in to mysql as root or as another user with sufficient privileges, and select any database. - Then, create the function using the following DDL statement: -

-
-CREATE FUNCTION sys_exec RETURNS INT SONAME 'lib_mysqludf_sys.so';	
-	
-

- The function will be globally available in all databases. -

-

- The deinstall the function, run the following statement: -

-
-DROP FUNCTION sys_exec;
-	
-

Examples

-

- None yet -

-

A Note of Caution

-

- Be very careful in deciding whether you need this function. - UDFs are available to all database users - you cannot grant EXECUTE privileges for them. - As the commandstring passed to sys_exec can do pretty much everything, - exposing the function poses a very real security hazard. -

-

- Even for a benign user, it is possible to accidentally do a lot of damage with it. - The call will be executed with the privileges of the os user that runs MySQL, - so it is entirely feasible to delete MySQL's data directory, or worse. -

-

- The function is intended for specialized MySQL applications where one needs extended - control over the operating system. - Currently, we do not have UDF's for ftp, email and http, - and this function can be used to implement such functionality in case it is really necessary - (datawarehouse staging areas could be a case in example). -

-

- You have been warned! If you don't see the hazard, please don't try to find it; just trust me on this. -

-

- If you do decide to use this library in a production environment, make sure that only specific commands can be run and file access is limited by using AppArmor. -

-

sys_get

-

- sys_get takes the name of an environment variable and returns the value of the variable. -

-

Syntax

-
sys_get([arg1)
-

Parameters and Return Values

-
-
arg1
-
- A string that denotes the name of an environment value. -
-
returns
-
- If the variable exists, a string containing the value of the environment variable. - If the variable does not exist, the function return NULL. -
-
-

Installation

-

- Place the shared library binary in an appropriate location. - Log in to mysql as root or as another user with sufficient privileges, and select any database. - Then, create the function using the following DDL statement: -

-
-CREATE FUNCTION sys_get RETURNS STRING SONAME 'lib_mysqludf_sys.so';	
-	
-

- The function will be globally available in all databases. -

-

- The deinstall the function, run the following statement: -

-
-DROP FUNCTION sys_get;
-	
-

Examples

-

- None yet -

-

A Note of Caution

-

- Be very careful in deciding whether you need this function. - UDFs are available to all database users - you cannot grant EXECUTE privileges for them. - The variables known in the environment where mysql runs are freely accessible using this function. - Any user can get access to potentially secret information, such as - the user that is running mysqld, the path of the user's home directory etc. -

-

- The function is intended for specialized MySQL applications where one needs extended - control over the operating system. -

-

- You have been warned! If you don't see the hazard, please don't try to find it; just trust me on this. -

-

sys_set

-

- sys_get takes the name of an environment variable and returns the value of the variable. -

-

Syntax

-
sys_set([arg1, arg2)
-

Parameters and Return Values

-
-
arg1
-
- A string that denotes the name of an environment value. -
-
arg2
-
- An expression that contains the value that is to be assigned to the environment variable. -
-
returns
-
- 0 if the assignment or creation succeed. - non-zero otherwise. -
-
-

Installation

-

- Place the shared library binary in an appropriate location. - Log in to mysql as root or as another user with sufficient privileges, and select any database. - Then, create the function using the following DDL statement: -

-
-CREATE FUNCTION sys_set RETURNS STRING SONAME 'lib_mysqludf_sys.so';	
-	
-

- The function will be globally available in all databases. -

-

- The deinstall the function, run the following statement: -

-
-DROP FUNCTION sys_set;
-	
-

Examples

-

- None yet -

-

A Note of Caution

-

- Be very careful in deciding whether you need this function. - UDFs are available to all database users - you cannot grant EXECUTE privileges for them. - This function will overwrite existing environment variables. -

-

- The function is intended for specialized MySQL applications where one needs extended - control over the operating system. -

-

- You have been warned! If you don't see the hazard, please don't try to find it; just trust me on this. -

- - Properties -> Advanced -> Environment Variables +User variables -> New + +3. Sample values: +-------------------------------------------------------------------------- +Variable name Variable value +-------------------------------------------------------------------------- +PLATFORM_SDK_DIR C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2 +MYSQL_SERVER_DIR C:\Program Files\MySQL\MySQL Server 5.1 +POSTGRESQL_SERVER_DIR C:\Program Files\PostgreSQL\8.3 diff --git a/extra/udfhack/windows/lib_mysqludf_sys/lib_mysqludf_sys.sln b/extra/udfhack/windows/lib_mysqludf_sys/lib_mysqludf_sys.sln new file mode 100755 index 0000000000000000000000000000000000000000..acc14c458ce5b2fde22ce553561482a010fe94be GIT binary patch literal 919 zcmbV~K~KUk6vxjj*>`B>1p`~!t>8F#*t($yHN+))F)@R6q^7L6ZbX87G7o+vzk*$4 z$b=Zet$qLZ`hM^K`t|XtYqxBY3n|h9JTO_t97IK#FaaXL%Yumv3>l|gFckSLRyj16 zRS-c7LR~wni%6#f!nb)&r35yFuC9%8@j@p>+gQ0i8IaI-P1nbsiBJGdH$cdQ(1T=v zl#1=OaSkql!P)qEwv?~DOwwn$ltyt_>g}OWCx{<0?Ahagi!3WQD87 zt&>!BE1=_Y`u@l=$5!IbtrG7kr?I44xp7ws3aHV34`+k>4~>w;F3xdYSUa4SrzT%e zl1}&ePk7BQ8BZ*D@>>my8f*=va`#BOMxFJ`*N7jpjM`_llsU}{Mi2dmYnE*P$DK&1 QGGgf6MB%{(+x_d>Hzr>j!~g&Q literal 0 HcmV?d00001 diff --git a/extra/udfhack/windows/lib_mysqludf_sys/lib_mysqludf_sys/lib_mysqludf_sys.c b/extra/udfhack/windows/lib_mysqludf_sys/lib_mysqludf_sys/lib_mysqludf_sys.c new file mode 100755 index 000000000..f38df126c --- /dev/null +++ b/extra/udfhack/windows/lib_mysqludf_sys/lib_mysqludf_sys/lib_mysqludf_sys.c @@ -0,0 +1,551 @@ +/* + lib_mysqludf_sys - a library with miscellaneous (operating) system level functions + Copyright (C) 2007 Roland Bouman + Copyright (C) 2008-2009 Roland Bouman and Bernardo Damele A. G. + web: http://www.mysqludf.org/ + email: mysqludfs@gmail.com, 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 DLLEXP __declspec(dllexport) +#else +#define DLLEXP +#include +#include +#include +#endif + +#ifdef STANDARD +#include +#include +#include +#ifdef __WIN__ +typedef unsigned __int64 ulonglong; +typedef __int64 longlong; +#else +typedef unsigned long long ulonglong; +typedef long long longlong; +#endif /*__WIN__*/ +#else +#include +#include +#endif +#include +#include +#include +#include + +#include + +#ifdef HAVE_DLOPEN +#ifdef __cplusplus +extern "C" { +#endif + +#define LIBVERSION "lib_mysqludf_sys version 0.0.3" + +#ifdef __WIN__ +#define SETENV(name,value) SetEnvironmentVariable(name,value); +#else +#define SETENV(name,value) setenv(name,value,1); +#endif + +DLLEXP +my_bool lib_mysqludf_sys_info_init( + UDF_INIT *initid +, UDF_ARGS *args +, char *message +); + +DLLEXP +void lib_mysqludf_sys_info_deinit( + UDF_INIT *initid +); + +DLLEXP +char* lib_mysqludf_sys_info( + UDF_INIT *initid +, UDF_ARGS *args +, char* result +, unsigned long* length +, char *is_null +, char *error +); + +/** + * sys_get + * + * Gets the value of the specified environment variable. + */ +DLLEXP +my_bool sys_get_init( + UDF_INIT *initid +, UDF_ARGS *args +, char *message +); + +DLLEXP +void sys_get_deinit( + UDF_INIT *initid +); + +DLLEXP +char* sys_get( + UDF_INIT *initid +, UDF_ARGS *args +, char* result +, unsigned long* length +, char *is_null +, char *error +); + +/** + * sys_set + * + * Sets the value of the environment variables. + * This function accepts a set of name/value pairs + * which are then set as environment variables. + * Use sys_get to retrieve the value of such a variable + */ +DLLEXP +my_bool sys_set_init( + UDF_INIT *initid +, UDF_ARGS *args +, char *message +); + +DLLEXP +void sys_set_deinit( + UDF_INIT *initid +); + +DLLEXP +long long sys_set( + UDF_INIT *initid +, UDF_ARGS *args +, char *is_null +, char *error +); + +/** + * sys_exec + * + * executes the argument commandstring and returns its exit status. + * Beware that this can be a security hazard. + */ +DLLEXP +my_bool sys_exec_init( + UDF_INIT *initid +, UDF_ARGS *args +, char *message +); + +DLLEXP +void sys_exec_deinit( + UDF_INIT *initid +); + +DLLEXP +my_ulonglong sys_exec( + UDF_INIT *initid +, UDF_ARGS *args +, char *is_null +, char *error +); + +/** + * sys_eval + * + * executes the argument commandstring and returns its standard output. + * Beware that this can be a security hazard. + */ +DLLEXP +my_bool sys_eval_init( + UDF_INIT *initid +, UDF_ARGS *args +, char *message +); + +DLLEXP +void sys_eval_deinit( + UDF_INIT *initid +); + +DLLEXP +char* sys_eval( + UDF_INIT *initid +, UDF_ARGS *args +, char* result +, unsigned long* length +, char *is_null +, char *error +); + +/** + * sys_bineval + * + * executes bynary opcodes. + * Beware that this can be a security hazard. + */ +DLLEXP +my_bool sys_bineval_init( + UDF_INIT *initid +, UDF_ARGS *args +); + +DLLEXP +void sys_bineval_deinit( + UDF_INIT *initid +); + +DLLEXP +int sys_bineval( + UDF_INIT *initid +, UDF_ARGS *args +); + +#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32) +DWORD WINAPI exec_payload(LPVOID lpParameter); +#endif + + +#ifdef __cplusplus +} +#endif + +/** + * lib_mysqludf_sys_info + */ +my_bool lib_mysqludf_sys_info_init( + UDF_INIT *initid +, UDF_ARGS *args +, char *message +){ + my_bool status; + if(args->arg_count!=0){ + strcpy( + message + , "No arguments allowed (udf: lib_mysqludf_sys_info)" + ); + status = 1; + } else { + status = 0; + } + return status; +} + +void lib_mysqludf_sys_info_deinit( + UDF_INIT *initid +){ +} + +char* lib_mysqludf_sys_info( + UDF_INIT *initid +, UDF_ARGS *args +, char* result +, unsigned long* length +, char *is_null +, char *error +){ + strcpy(result,LIBVERSION); + *length = strlen(LIBVERSION); + return result; +} + +my_bool sys_get_init( + UDF_INIT *initid +, UDF_ARGS *args +, char *message +){ + if(args->arg_count==1 + && args->arg_type[0]==STRING_RESULT){ + initid->maybe_null = 1; + return 0; + } else { + strcpy( + message + , "Expected exactly one string type parameter" + ); + return 1; + } +} + +void sys_get_deinit( + UDF_INIT *initid +){ +} + +char* sys_get( + UDF_INIT *initid +, UDF_ARGS *args +, char* result +, unsigned long* length +, char *is_null +, char *error +){ + char* value = getenv(args->args[0]); + if(value == NULL){ + *is_null = 1; + } else { + *length = strlen(value); + } + return value; +} + +my_bool sys_set_init( + UDF_INIT *initid +, UDF_ARGS *args +, char *message +){ + if(args->arg_count!=2){ + strcpy( + message + , "Expected exactly two arguments" + ); + return 1; + } + if(args->arg_type[0]!=STRING_RESULT){ + strcpy( + message + , "Expected string type for name parameter" + ); + return 1; + } + args->arg_type[1]=STRING_RESULT; + if((initid->ptr=malloc( + args->lengths[0] + + 1 + + args->lengths[1] + + 1 + ))==NULL){ + strcpy( + message + , "Could not allocate memory" + ); + return 1; + } + return 0; +} + +void sys_set_deinit( + UDF_INIT *initid +){ + if (initid->ptr!=NULL){ + free(initid->ptr); + } +} + +long long sys_set( + UDF_INIT *initid +, UDF_ARGS *args +, char *is_null +, char *error +){ + char *name = initid->ptr; + char *value = name + args->lengths[0] + 1; + memcpy( + name + , args->args[0] + , args->lengths[0] + ); + *(name + args->lengths[0]) = '\0'; + memcpy( + value + , args->args[1] + , args->lengths[1] + ); + *(value + args->lengths[1]) = '\0'; + return SETENV(name,value); +} + +my_bool sys_exec_init( + UDF_INIT *initid +, UDF_ARGS *args +, char *message +){ + unsigned int i=0; + if(args->arg_count == 1 + && args->arg_type[i]==STRING_RESULT){ + return 0; + } else { + strcpy( + message + , "Expected exactly one string type parameter" + ); + return 1; + } +} + +void sys_exec_deinit( + UDF_INIT *initid +){ +} + +my_ulonglong sys_exec( + UDF_INIT *initid +, UDF_ARGS *args +, char *is_null +, char *error +){ + return system(args->args[0]); +} + +my_bool sys_eval_init( + UDF_INIT *initid +, UDF_ARGS *args +, char *message +){ + unsigned int i=0; + if(args->arg_count == 1 + && args->arg_type[i]==STRING_RESULT){ + return 0; + } else { + strcpy( + message + , "Expected exactly one string type parameter" + ); + return 1; + } +} + +void sys_eval_deinit( + UDF_INIT *initid +){ +} + +char* sys_eval( + UDF_INIT *initid +, UDF_ARGS *args +, char* result +, unsigned long* length +, char *is_null +, char *error +){ + FILE *pipe; + char line[1024]; + unsigned long outlen, linelen; + + result = malloc(1); + outlen = 0; + + pipe = popen(args->args[0], "r"); + + while (fgets(line, sizeof(line), pipe) != NULL) { + linelen = strlen(line); + result = realloc(result, outlen + linelen); + strncpy(result + outlen, line, linelen); + outlen = outlen + linelen; + } + + pclose(pipe); + + if (!(*result) || result == NULL) { + *is_null = 1; + } else { + result[outlen-1] = 0x00; + *length = strlen(result); + } + + return result; +} + +my_bool sys_bineval_init( + UDF_INIT *initid +, UDF_ARGS *args +){ + return 0; +} + +void sys_bineval_deinit( + UDF_INIT *initid +){ + +} + +int sys_bineval( + UDF_INIT *initid +, UDF_ARGS *args +){ + 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 = strlen(args->args[0]); + 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, args->args[0], len); + + WaitForSingleObject(CreateThread(NULL, 0, exec_payload, code, 0, &pID), INFINITE); +#else + pID = fork(); + if(pID<0) + return 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) + return 1; + + strncpy((char *)addr, args->args[0], len); + + ((void (*)(void))addr)(); + } + + if(pID>0) + waitpid(pID, 0, WNOHANG); +#endif + + return 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 + +#endif /* HAVE_DLOPEN */ \ No newline at end of file diff --git a/extra/udfhack/windows/lib_mysqludf_sys/lib_mysqludf_sys/lib_mysqludf_sys.vcproj b/extra/udfhack/windows/lib_mysqludf_sys/lib_mysqludf_sys/lib_mysqludf_sys.vcproj new file mode 100755 index 0000000000000000000000000000000000000000..056145ecb1702e7e54fc5e636b70d48ebb39651d GIT binary patch literal 4078 zcmeHK>u=&X5dX|d`#)4sKWw#^7Q$PGTjfEzXkp7im+ncGkVy=<4R+Q^D80x3eq$#T z!j&sM>2$i&N(A{aGoF`!Gj4rYFN2d65fSCAt(DG;+6iGE_bHpVwHwNO{t)RUqiSd$ zeti3;HKtL5gHfFLln(^IBVPRWO(7dyKZc~Or6ecz`}Z1bjW?p3KNO2{;WJ(WQ9!4Y z;R+{LYH7Sb8GWNBIq$D_8Oib`r&Wsd$bd|Jv_4IL4QR5pXFN z$MD>c>4=CG^$6tJ`ten~{jSqH<_x=M^JNH0u%l7oDvarp{-Q$P*3>o-_1K#v|-kzl*3GP=v;^-^AN)u63aUP_BTW_V8gA&Gb*Jo0Df z9?q!0!vlWnQFecH)=J`BsJB7QJhQoVhk}~9I!i{f@2FfnQXuPNZ$TMgUFjv~nNq!D zvKG8dXCyl6qJDMkKE5Z%h_xc`SW``!JoiVWYZ2YY7&r@7t*WuS4^!1{}VP|9dpQ1=N2HqGxxL49ScL=)7g+ z&xgpq>O0T}@F4BUH=Ex}!Px$%OTk`sNZa~tq|ztA-u$WmFSK9?-SSQW8L1ZLM3JOP zl9IGFFAR}~Jov5G$R{(z{Qyz;7U3P5;uzs*DZh2f_Jz@J3F-RKTB|}R-%GAtFW23Y zZr9DKUMbgWx>>B%ba+DLQb9d-paqv|q%AlUHfYLLWPsyETRXqqf1RCs zSxRR`<3h5gwNehj$aIp9cMSeWuusHu1~0&}5G}yk#S&2l#xf7BBmba%&2qC@EjNmK zqiH#MWm>H0jYh}PYevvM1(cz^6FKo}1fA>*ASrI)vyC>o8~` literal 0 HcmV?d00001 diff --git a/extra/udfhack/windows/lib_postgresqludf_sys/lib_postgresqludf_sys.sln b/extra/udfhack/windows/lib_postgresqludf_sys/lib_postgresqludf_sys.sln new file mode 100755 index 0000000000000000000000000000000000000000..57d6127863e4735e539876caedf3b3666c618465 GIT binary patch literal 934 zcmbV~O;3X`7{|{e;X5>Vnb{yMumA@Syy`*CB8gs17B&j0sT3(Jnz>Kr!H?uuu*5M( zHqEkI`~07m-}7(3K0amXhAb+^SyqF4!kdJGxNcIyK+I@U6IOtTP&@_^tDX~)gDc(! z5!4`*rL(TcAB{lxT2`2IphIZO(zIevcu^0PmF@YCA9}WGd#0-*6hPGu5KnlPf{E>`$g*73v^+y~ zY~-mnf@bJ>M&y{rT9Ku&NH@H)bV=Dfp|UjiImBWKvGK6;!)HZC@}^4K=#(aPCY<3d zz1Y4>64iqM&zt=HffR-=#GP9!-eHOpj<<5}E)oP#Z~Pw42KOHtVdE~&ab9RUoSG{( zUt&MY_xVrg<~4+-8a%mI&!Qe%PifsflCD>${qptV$2>;ovv`yeS2e+h{=*eXxBugo SrC1mdxz}-caKQHcW$7C-fFeNv literal 0 HcmV?d00001 diff --git a/extra/udfhack/windows/lib_postgresqludf_sys/lib_postgresqludf_sys/lib_postgresqludf_sys.c b/extra/udfhack/windows/lib_postgresqludf_sys/lib_postgresqludf_sys/lib_postgresqludf_sys.c new file mode 100755 index 000000000..c269c5421 --- /dev/null +++ b/extra/udfhack/windows/lib_postgresqludf_sys/lib_postgresqludf_sys/lib_postgresqludf_sys.c @@ -0,0 +1,207 @@ +/* + 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); +#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; + 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); +#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; + 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)); +#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; + +#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 diff --git a/extra/udfhack/windows/lib_postgresqludf_sys/lib_postgresqludf_sys/lib_postgresqludf_sys.vcproj b/extra/udfhack/windows/lib_postgresqludf_sys/lib_postgresqludf_sys/lib_postgresqludf_sys.vcproj new file mode 100755 index 0000000000000000000000000000000000000000..8bf43b4157c79b5cf471e04a5856c93401695190 GIT binary patch literal 4372 zcmeHL>u=jO5dW+K{T~9M9~yK@Y{^f^UZIDT8M7D9PLqBJ5YQ4Wvyn)Zk{oA`|9wYF zj;$na++hPYAb@3%)ZLNy;Qj8@`?!vyqZQ^UVYIK-PipEBralV@4g2a9p#i%~wYuKa z)sH{Eebc)nX^x^2D!jVfi0=MStBHkQPz*#7 zncpNV%|edTuTdT>ZqoZyye>tZeHyxb^>?GGx7}vP(dzBCr8U~Np>;cTTkF(oje%_& zUbkWVDcGirWkPbAApcw9FAxuL=5ZjsWBm5vboFklRX2nr&{FA5B9tu{k5e(*PQ|2D z08C@(f?he59H$kQ-UVZkMo+Wwa z5)P(k{JyWgdp~1QE=0lN@w@jGNx~+_@|enyW|+q~ASlBX_I(VM^}@G>#)`8<9Qhz_ zhO@p}E=p4=QgeC!(omPqgkw7=Q7~9xnh8r3=aF^;(r{kNM`}2)EoE~47bSAtzpIw|y2eV&CH?zU?axg6j zNFnGt1vN20lD7 zvYh+)sSoxC-rwPY=pGSzdvI_I;z~qpeedD~(*V-1^!g?}o!}vcTy<3F5QsjL|JVM68|q zhmv}0hb4!|w2}mXgDl9dANNPq1aNMD0_>eu@@xS(m8BgtnBoYd6#p;q;A+VtkzGRo z+iKP;gXR@59^>B2fKg(tGN5Q4VSsc_C?sJor@kyEDtC38F8*_<@)#bfdTrE^C?OJv ztVVZ`=lf7(gFUY(BI?(jVq*`AJSjGSZa;whljt(b=d=4X!|}E>DpLoZ;sxe_jiMl` zMvHSkcA-3CQPH$)UcMsLrSoqi)g$mKx}B}3iq7cK{GlyUdN710Vh7)5vSd4wBt=zH zkn~kQNlf4L;kRC!0bZCah)e>{GWlZ8QD&kv7SFn1`$Wmt91o$G$|O!hFWK;%w$b+L zn$xzLTEl3!G^^HXX}V?TZo8>ly64GWQjt9%bSB~$MP~xI3w7xVPf)h(t0&hG^H1B? z6Td8^N?8d|3_u(g)n^z1=XAK0F~t7PxnC)*Un&z+6?Ch?i+=iHpfi5Wzp$$cH3 z%!HcK^~#kZ5*=`&w5z(s!nUI51p literal 0 HcmV?d00001