summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/errmsg.h1
-rw-r--r--include/mysql_version.h.in5
-rw-r--r--libmysql/errmsg.c9
-rw-r--r--libmysql/libmysql.c54
-rw-r--r--sql/set_var.cc4
5 files changed, 67 insertions, 6 deletions
diff --git a/include/errmsg.h b/include/errmsg.h
index 5136af5b87a..24ebe24d786 100644
--- a/include/errmsg.h
+++ b/include/errmsg.h
@@ -63,4 +63,5 @@ extern const char *client_errors[]; /* Error messages */
#define CR_PROBE_MASTER_CONNECT 2025
#define CR_SSL_CONNECTION_ERROR 2026
#define CR_MALFORMED_PACKET 2027
+#define CR_WRONG_LICENSE 2028
diff --git a/include/mysql_version.h.in b/include/mysql_version.h.in
index 41d4ce081fb..de5294a82cf 100644
--- a/include/mysql_version.h.in
+++ b/include/mysql_version.h.in
@@ -26,4 +26,9 @@
#define MYSQL_CHARSET "@default_charset@"
#endif /* MYSQL_CHARSET */
#endif /* _CUSTOMCONFIG_ */
+
+#ifndef LICENSE
+#define LICENSE "GPL"
+#endif /* LICENSE */
+
#endif /* _mysql_version_h */
diff --git a/libmysql/errmsg.c b/libmysql/errmsg.c
index 7accbf8f1d2..06d21cf36c3 100644
--- a/libmysql/errmsg.c
+++ b/libmysql/errmsg.c
@@ -51,7 +51,8 @@ const char *client_errors[]=
"Error connecting to slave:",
"Error connecting to master:",
"SSL connection error",
- "Malformed packet"
+ "Malformed packet",
+ "This client library is licensed only for use with MySQL servers having '%s' license"
};
/* Start of code added by Roberto M. Serqueira - martinsc@uol.com.br - 05.24.2001 */
@@ -86,7 +87,8 @@ const char *client_errors[]=
"Error connecting to slave:",
"Error connecting to master:",
"SSL connection error",
- "Malformed packet"
+ "Malformed packet",
+ "This client library is licensed only for use with MySQL servers having '%s' license"
};
#else /* ENGLISH */
@@ -119,7 +121,8 @@ const char *client_errors[]=
"Error connecting to slave:",
"Error connecting to master:",
"SSL connection error",
- "Malformed packet"
+ "Malformed packet",
+ "This client library is licensed only for use with MySQL servers having '%s' license"
};
#endif
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index f2d77d495c9..6a4189b6b18 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -1612,6 +1612,56 @@ mysql_connect(MYSQL *mysql,const char *host,
#endif
+#ifdef CHECK_LICENSE
+/*
+ Check server side variable 'license'.
+ If the variable does not exist or does not contain 'Commercial',
+ we're talking to non-commercial server from commercial client.
+ SYNOPSIS
+ check_license()
+ RETURN VALUE
+ 0 success
+ !0 network error or the server is not commercial.
+ Error code is saved in mysql->net.last_errno.
+*/
+
+static int check_license(MYSQL *mysql)
+{
+ MYSQL_ROW row;
+ MYSQL_RES *res;
+ NET *net= &mysql->net;
+ static const char query[]= "SELECT @@license";
+ static const char required_license[]= LICENSE;
+
+ if (mysql_real_query(mysql, query, sizeof(query)-1))
+ {
+ if (net->last_errno == ER_UNKNOWN_SYSTEM_VARIABLE)
+ {
+ net->last_errno= CR_WRONG_LICENSE;
+ sprintf(net->last_error, ER(net->last_errno), required_license);
+ }
+ return 1;
+ }
+ if (!(res= mysql_use_result(mysql)))
+ return 1;
+ row= mysql_fetch_row(res);
+ /*
+ If no rows in result set, or column value is NULL (none of these
+ two is ever true for server variables now), or column value
+ mismatch, set wrong license error.
+ */
+ if (!net->last_errno &&
+ (!row || !row[0] ||
+ strncmp(row[0], required_license, sizeof(required_license))))
+ {
+ net->last_errno= CR_WRONG_LICENSE;
+ sprintf(net->last_error, ER(net->last_errno), required_license);
+ }
+ mysql_free_result(res);
+ return net->last_errno;
+}
+#endif /* CHECK_LICENSE */
+
/*
The following union is used to force a struct to be double allgined.
This is to avoid warings with gethostname_r() on Linux itanium systems
@@ -2048,6 +2098,10 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
net->compress=1;
if (mysql->options.max_allowed_packet)
net->max_packet_size= mysql->options.max_allowed_packet;
+#ifdef CHECK_LICENSE
+ if (check_license(mysql))
+ goto error;
+#endif
if (db && mysql_select_db(mysql,db))
goto error;
if (mysql->options.init_command)
diff --git a/sql/set_var.cc b/sql/set_var.cc
index 71c0865dd91..eb94ad2ebf6 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -334,14 +334,12 @@ static sys_var_rand_seed2 sys_rand_seed2("rand_seed2");
static sys_var_thd_ulong sys_default_week_format("default_week_format",
&SV::default_week_format);
-static const char license[]= "GPL";
/* Read only variables */
sys_var_const_str sys_os("version_compile_os", SYSTEM_TYPE);
-sys_var_const_str sys_license("license", license);
-
/* Global read-only variable describing server license */
+sys_var_const_str sys_license("license", LICENSE);