mirror of
https://github.com/sqlmapproject/sqlmap.git
synced 2024-11-25 19:13:48 +03:00
Added MySQL UDF to execute commands on the underlying system:
* sys_eval() to return the standard output * sys_exec() to return the exit status It's a patched version of http://mysqludf.org/lib_mysqludf_sys/index.php
This commit is contained in:
parent
6690b4c00a
commit
161590e121
4
extra/mysqludfsys/lib_mysqludf_sys/Makefile
Normal file
4
extra/mysqludfsys/lib_mysqludf_sys/Makefile
Normal file
|
@ -0,0 +1,4 @@
|
|||
LIBDIR=/usr/lib
|
||||
|
||||
install:
|
||||
gcc -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so
|
25
extra/mysqludfsys/lib_mysqludf_sys/install.sh
Executable file
25
extra/mysqludfsys/lib_mysqludf_sys/install.sh
Executable file
|
@ -0,0 +1,25 @@
|
|||
#!/bin/bash
|
||||
|
||||
echo "Compiling the MySQL UDF"
|
||||
make
|
||||
|
||||
if test $? -ne 0; then
|
||||
echo "ERROR: You need libmysqlclient development software installed "
|
||||
echo "to be able to compile this UDF, on Debian/Ubuntu just run:"
|
||||
echo "apt-get install libmysqlclient15-dev"
|
||||
exit 1
|
||||
else
|
||||
echo "MySQL UDF compiled successfully"
|
||||
fi
|
||||
|
||||
echo -e "\nPlease provide your MySQL root password and press RETURN: \c"
|
||||
read PASSWORD
|
||||
|
||||
mysql -u root --password=$PASSWORD mysql < lib_mysqludf_sys.sql
|
||||
|
||||
if test $? -ne 0; then
|
||||
echo "ERROR: unable to install the UDF"
|
||||
exit 1
|
||||
else
|
||||
echo "MySQL UDF installed successfully"
|
||||
fi
|
426
extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.c
Normal file
426
extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.c
Normal file
|
@ -0,0 +1,426 @@
|
|||
/*
|
||||
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
|
||||
#endif
|
||||
|
||||
#ifdef STANDARD
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#ifdef __WIN__
|
||||
typedef unsigned __int64 ulonglong;
|
||||
typedef __int64 longlong;
|
||||
#else
|
||||
typedef unsigned long long ulonglong;
|
||||
typedef long long longlong;
|
||||
#endif /*__WIN__*/
|
||||
#else
|
||||
#include <my_global.h>
|
||||
#include <my_sys.h>
|
||||
#endif
|
||||
#include <mysql.h>
|
||||
#include <m_ctype.h>
|
||||
#include <m_string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#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
|
||||
);
|
||||
|
||||
|
||||
#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] = 0x00;
|
||||
*length = strlen(result);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
#endif /* HAVE_DLOPEN */
|
208
extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.html
Normal file
208
extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.html
Normal file
|
@ -0,0 +1,208 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="stylesheet" type="text/css" href="../mysqludf.css"/>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>lib_mysqludf_sys - A library of MySQL UDFs for working with the environment in which MySQL runs</title>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<a href="../index.html">Top</a>
|
||||
| <a href="../mysql_udf_repository_libraries.html">Up</a>
|
||||
</div>
|
||||
<h1>lib_mysqludf_sys</h1>
|
||||
<div>
|
||||
<a href="lib_mysqludf_sys.html">Documentation</a>
|
||||
| <a href="lib_mysqludf_sys.so">Binary</a>
|
||||
| <a href="lib_mysqludf_sys.sql">Installation</a>
|
||||
| <a href="lib_mysqludf_sys.c">Source</a>
|
||||
| <a href="lib_mysqludf_sys_0.0.2.tar.gz">tar.gz</a>
|
||||
</div>
|
||||
<p>
|
||||
This library <code>lib_mysqludf_sys</code> contains a number of functions that allows one to interact with the operating system.
|
||||
</p>
|
||||
<ol>
|
||||
<li><a href="#sys_exec"><code>sys_exec</code></a> - executes an arbitrary command, and can thus be used to launch an external application.</li>
|
||||
<li><a href="#sys_get"><code>sys_get</code></a> - gets the value of an environment variable.</li>
|
||||
<li><a href="#sys_set"><code>sys_set</code></a> - create an environment variable, or update the value of an existing environment variable.</li>
|
||||
</ol>
|
||||
<p>
|
||||
Use <a href="#lib_mysqludf_sys_info"><code>lib_mysqludf_sys_info()</code></a> to obtain information about the currently installed version of <code>lib_mysqludf_sys</code>.
|
||||
</p>
|
||||
|
||||
<a name="sys_exec"></a><h2>sys_exec</h2>
|
||||
<p>
|
||||
<code>sys_exec</code> takes one command string argument and executes it.
|
||||
</p>
|
||||
<h3>Syntax</h3>
|
||||
<pre>sys_exec(<b>arg1</b>)</pre>
|
||||
<h3>Parameters and Return Values</h3>
|
||||
<dl>
|
||||
<dt><code><b>arg1</b></code></dt>
|
||||
<dd>
|
||||
A command string valid for the current operating system or execution environment.
|
||||
</dd>
|
||||
<dt>returns</dt>
|
||||
<dd>
|
||||
An (integer) exit code returned by the executed process.
|
||||
</dd>
|
||||
</dl>
|
||||
<h3>Installation</h3>
|
||||
<p>
|
||||
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:
|
||||
</p>
|
||||
<pre>
|
||||
CREATE FUNCTION sys_exec RETURNS INT SONAME 'lib_mysqludf_sys.so';
|
||||
</pre>
|
||||
<p>
|
||||
The function will be globally available in all databases.
|
||||
</p>
|
||||
<p>
|
||||
The deinstall the function, run the following statement:
|
||||
</p>
|
||||
<pre>
|
||||
DROP FUNCTION sys_exec;
|
||||
</pre>
|
||||
<h3>Examples</h3>
|
||||
<p>
|
||||
None yet
|
||||
</p>
|
||||
<h3>A Note of Caution</h3>
|
||||
<p>
|
||||
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 <code>sys_exec</code> can do pretty much everything,
|
||||
exposing the function poses a very real security hazard.
|
||||
</p>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
<p>
|
||||
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).
|
||||
</p>
|
||||
<p>
|
||||
You have been warned! If you don't see the hazard, please don't try to find it; just trust me on this.
|
||||
</p>
|
||||
<a name="sys_get"></a><h2>sys_get</h2>
|
||||
<p>
|
||||
<code>sys_get</code> takes the name of an environment variable and returns the value of the variable.
|
||||
</p>
|
||||
<h3>Syntax</h3>
|
||||
<pre>sys_get([<b>arg1</b>)</pre>
|
||||
<h3>Parameters and Return Values</h3>
|
||||
<dl>
|
||||
<dt><code><b>arg1</b></code></dt>
|
||||
<dd>
|
||||
A string that denotes the name of an environment value.
|
||||
</dd>
|
||||
<dt>returns</dt>
|
||||
<dd>
|
||||
If the variable exists, a string containing the value of the environment variable.
|
||||
If the variable does not exist, the function return NULL.
|
||||
</dd>
|
||||
</dl>
|
||||
<h3>Installation</h3>
|
||||
<p>
|
||||
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:
|
||||
</p>
|
||||
<pre>
|
||||
CREATE FUNCTION sys_get RETURNS STRING SONAME 'lib_mysqludf_sys.so';
|
||||
</pre>
|
||||
<p>
|
||||
The function will be globally available in all databases.
|
||||
</p>
|
||||
<p>
|
||||
The deinstall the function, run the following statement:
|
||||
</p>
|
||||
<pre>
|
||||
DROP FUNCTION sys_get;
|
||||
</pre>
|
||||
<h3>Examples</h3>
|
||||
<p>
|
||||
None yet
|
||||
</p>
|
||||
<h3>A Note of Caution</h3>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
<p>
|
||||
The function is intended for specialized MySQL applications where one needs extended
|
||||
control over the operating system.
|
||||
</p>
|
||||
<p>
|
||||
You have been warned! If you don't see the hazard, please don't try to find it; just trust me on this.
|
||||
</p>
|
||||
<a name="sys_set"></a><h2>sys_set</h2>
|
||||
<p>
|
||||
<code>sys_get</code> takes the name of an environment variable and returns the value of the variable.
|
||||
</p>
|
||||
<h3>Syntax</h3>
|
||||
<pre>sys_set([<b>arg1, arg2</b>)</pre>
|
||||
<h3>Parameters and Return Values</h3>
|
||||
<dl>
|
||||
<dt><code><b>arg1</b></code></dt>
|
||||
<dd>
|
||||
A string that denotes the name of an environment value.
|
||||
</dd>
|
||||
<dt><code><b>arg2</b></code></dt>
|
||||
<dd>
|
||||
An expression that contains the value that is to be assigned to the environment variable.
|
||||
</dd>
|
||||
<dt>returns</dt>
|
||||
<dd>
|
||||
0 if the assignment or creation succeed.
|
||||
non-zero otherwise.
|
||||
</dd>
|
||||
</dl>
|
||||
<h3>Installation</h3>
|
||||
<p>
|
||||
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:
|
||||
</p>
|
||||
<pre>
|
||||
CREATE FUNCTION sys_set RETURNS STRING SONAME 'lib_mysqludf_sys.so';
|
||||
</pre>
|
||||
<p>
|
||||
The function will be globally available in all databases.
|
||||
</p>
|
||||
<p>
|
||||
The deinstall the function, run the following statement:
|
||||
</p>
|
||||
<pre>
|
||||
DROP FUNCTION sys_set;
|
||||
</pre>
|
||||
<h3>Examples</h3>
|
||||
<p>
|
||||
None yet
|
||||
</p>
|
||||
<h3>A Note of Caution</h3>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
<p>
|
||||
The function is intended for specialized MySQL applications where one needs extended
|
||||
control over the operating system.
|
||||
</p>
|
||||
<p>
|
||||
You have been warned! If you don't see the hazard, please don't try to find it; just trust me on this.
|
||||
</p>
|
||||
</body>
|
||||
</html
|
BIN
extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.so
Executable file
BIN
extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.so
Executable file
Binary file not shown.
33
extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.sql
Normal file
33
extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.sql
Normal file
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
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
|
||||
*/
|
||||
|
||||
DROP FUNCTION IF EXISTS lib_mysqludf_sys_info;
|
||||
DROP FUNCTION IF EXISTS sys_get;
|
||||
DROP FUNCTION IF EXISTS sys_set;
|
||||
DROP FUNCTION IF EXISTS sys_exec;
|
||||
DROP FUNCTION IF EXISTS sys_eval;
|
||||
|
||||
CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so';
|
||||
CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so';
|
||||
CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so';
|
||||
CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so';
|
||||
CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';
|
213
extra/mysqludfsys/lib_mysqludf_sys_0.0.3.patch
Normal file
213
extra/mysqludfsys/lib_mysqludf_sys_0.0.3.patch
Normal file
|
@ -0,0 +1,213 @@
|
|||
diff -uN lib_mysqludf_sys/install.sh lib_mysqludf_sys_0.0.3/install.sh
|
||||
--- lib_mysqludf_sys/install.sh 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ lib_mysqludf_sys_0.0.3/install.sh 2009-01-15 16:04:50.000000000 +0000
|
||||
@@ -0,0 +1,25 @@
|
||||
+#!/bin/bash
|
||||
+
|
||||
+echo "Compiling the MySQL UDF"
|
||||
+make
|
||||
+
|
||||
+if test $? -ne 0; then
|
||||
+ echo "ERROR: You need libmysqlclient development software installed "
|
||||
+ echo "to be able to compile this UDF, on Debian/Ubuntu just run:"
|
||||
+ echo "apt-get install libmysqlclient15-dev"
|
||||
+ exit 1
|
||||
+else
|
||||
+ echo "MySQL UDF compiled successfully"
|
||||
+fi
|
||||
+
|
||||
+echo -e "\nPlease provide your MySQL root password and press RETURN: \c"
|
||||
+read PASSWORD
|
||||
+
|
||||
+mysql -u root --password=$PASSWORD mysql < lib_mysqludf_sys.sql
|
||||
+
|
||||
+if test $? -ne 0; then
|
||||
+ echo "ERROR: unable to install the UDF"
|
||||
+ exit 1
|
||||
+else
|
||||
+ echo "MySQL UDF installed successfully"
|
||||
+fi
|
||||
Binary files lib_mysqludf_sys/lib_mysqludf_sys_0.0.2.tar.gz and lib_mysqludf_sys_0.0.3/lib_mysqludf_sys_0.0.2.tar.gz differ
|
||||
diff -uN lib_mysqludf_sys/lib_mysqludf_sys.c lib_mysqludf_sys_0.0.3/lib_mysqludf_sys.c
|
||||
--- lib_mysqludf_sys/lib_mysqludf_sys.c 2007-08-05 13:46:43.000000000 +0100
|
||||
+++ lib_mysqludf_sys_0.0.3/lib_mysqludf_sys.c 2009-01-15 15:55:33.000000000 +0000
|
||||
@@ -1,8 +1,9 @@
|
||||
/*
|
||||
lib_mysqludf_sys - a library with miscellaneous (operating) system level functions
|
||||
Copyright (C) 2007 Roland Bouman
|
||||
- web: http://www.xcdsql.org/MySQL/UDF/
|
||||
- email: mysqludfs@gmail.com
|
||||
+ 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
|
||||
@@ -51,7 +52,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
-#define LIBVERSION "lib_mysqludf_sys version 0.0.2"
|
||||
+#define LIBVERSION "lib_mysqludf_sys version 0.0.3"
|
||||
|
||||
#ifdef __WIN__
|
||||
#define SETENV(name,value) SetEnvironmentVariable(name,value);
|
||||
@@ -139,7 +140,7 @@
|
||||
/**
|
||||
* sys_exec
|
||||
*
|
||||
- * executes the argument commandstring.
|
||||
+ * executes the argument commandstring and returns its exit status.
|
||||
* Beware that this can be a security hazard.
|
||||
*/
|
||||
DLLEXP
|
||||
@@ -162,6 +163,34 @@
|
||||
, 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
|
||||
+);
|
||||
+
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
@@ -336,5 +365,62 @@
|
||||
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] = 0x00;
|
||||
+ *length = strlen(result);
|
||||
+ }
|
||||
+
|
||||
+ return result;
|
||||
+}
|
||||
+
|
||||
|
||||
#endif /* HAVE_DLOPEN */
|
||||
Binary files lib_mysqludf_sys/lib_mysqludf_sys.so and lib_mysqludf_sys_0.0.3/lib_mysqludf_sys.so differ
|
||||
diff -uN lib_mysqludf_sys/lib_mysqludf_sys.sql lib_mysqludf_sys_0.0.3/lib_mysqludf_sys.sql
|
||||
--- lib_mysqludf_sys/lib_mysqludf_sys.sql 2007-06-02 20:42:53.000000000 +0100
|
||||
+++ lib_mysqludf_sys_0.0.3/lib_mysqludf_sys.sql 2009-01-15 15:57:34.000000000 +0000
|
||||
@@ -1,8 +1,9 @@
|
||||
/*
|
||||
lib_mysqludf_sys - a library with miscellaneous (operating) system level functions
|
||||
Copyright (C) 2007 Roland Bouman
|
||||
- web: http://www.xcdsql.org/MySQL/UDF/
|
||||
- email: mysqludfs@gmail.com
|
||||
+ 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
|
||||
@@ -19,12 +20,14 @@
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
-drop function lib_mysqludf_sys_info;
|
||||
-drop function sys_get;
|
||||
-drop function sys_set;
|
||||
-drop function sys_exec;
|
||||
+DROP FUNCTION IF EXISTS lib_mysqludf_sys_info;
|
||||
+DROP FUNCTION IF EXISTS sys_get;
|
||||
+DROP FUNCTION IF EXISTS sys_set;
|
||||
+DROP FUNCTION IF EXISTS sys_exec;
|
||||
+DROP FUNCTION IF EXISTS sys_eval;
|
||||
|
||||
-create function lib_mysqludf_sys_info returns string soname 'lib_mysqludf_sys.so';
|
||||
-create function sys_get returns string soname 'lib_mysqludf_sys.so';
|
||||
-create function sys_set returns int soname 'lib_mysqludf_sys.so';
|
||||
-create function sys_exec returns int soname 'lib_mysqludf_sys.so';
|
||||
+CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so';
|
||||
+CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so';
|
||||
+CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so';
|
||||
+CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so';
|
||||
+CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';
|
||||
diff -uN lib_mysqludf_sys/Makefile lib_mysqludf_sys_0.0.3/Makefile
|
||||
--- lib_mysqludf_sys/Makefile 2007-08-05 12:54:53.000000000 +0100
|
||||
+++ lib_mysqludf_sys_0.0.3/Makefile 2009-01-15 15:52:48.000000000 +0000
|
||||
@@ -1,6 +1,4 @@
|
||||
-linux: \
|
||||
- lib_mysqludf_sys.so
|
||||
+LIBDIR=/usr/lib
|
||||
|
||||
-lib_mysqludf_sys.so: \
|
||||
-
|
||||
- gcc -Wall -I/opt/mysql/mysql/include -I. -shared lib_mysqludf_sys.c -o lib_mysqludf_sys.so
|
||||
+install:
|
||||
+ gcc -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so
|
BIN
extra/mysqludfsys/lib_mysqludf_sys_0.0.3.tar.gz
Normal file
BIN
extra/mysqludfsys/lib_mysqludf_sys_0.0.3.tar.gz
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user