diff options
-rw-r--r-- | include/errmsg.h | 1 | ||||
-rw-r--r-- | include/mysql_version.h.in | 5 | ||||
-rw-r--r-- | libmysql/errmsg.c | 9 | ||||
-rw-r--r-- | libmysql/libmysql.c | 54 | ||||
-rw-r--r-- | sql/set_var.cc | 4 |
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); |