mariadb/sql/hostname.cc
unknown 31b9e6e03f Fixes for OS2.
Fix bug in isamlog
Add argument types to function declarations.


Docs/manual.texi:
  Updated credits
client/mysql.cc:
  Fixes for OS2
client/mysqladmin.c:
  Fixes for OS2
client/mysqldump.c:
  Fixes for OS2
client/mysqlimport.c:
  Fixes for OS2
client/mysqltest.c:
  Fixes for OS2
dbug/dbug.c:
  Fixes for OS2.
  Use new C calling convention.
dbug/factorial.c:
  Fixes for OS2.
  Use new C calling convention.
include/errmsg.h:
  Fix for OS2
include/global.h:
  Fixes for OS2.
include/my_pthread.h:
  Fixes for OS2.
include/my_sys.h:
  Fixes for OS2.
include/mysql_com.h:
  Move defines to global.h
include/thr_alarm.h:
  Fixes for OS2.
isam/isamchk.c:
  Fixes for OS2.
  Add arguments to function declarations.
isam/isamlog.c:
  Fixes for OS2.
  Fix bug in logfile handling.
isam/test1.c:
  Add arguments to function decl
isam/test2.c:
  Add arguments to function declarations.
isam/test_all.res:
  Update result
libmysql/get_password.c:
  Fixes for OS2.
libmysql/libmysql.c:
  Fixes for OS2.
libmysql/net.c:
  Fixes for OS2.
libmysql/violite.c:
  Add arguments to function declarations.
merge/_locking.c:
  Add argument types to function declarations.
merge/close.c:
  Add argument types to function declarations.
merge/create.c:
  Add argument types to function declarations.
merge/extra.c:
  Add argument types to function declarations.
merge/open.c:
  Add argument types to function declarations.
merge/panic.c:
  Add argument types to function declarations.
merge/rsame.c:
  Add argument types to function declarations.
merge/update.c:
  Add argument types to function declarations.
myisam/ft_eval.c:
  Portability fix
myisam/ft_search.c:
  Portability fix
myisam/ft_test1.c:
  Portability fix
myisam/ftdefs.h:
  Portability fix
myisam/mi_check.c:
  Portability fix
myisam/mi_test1.c:
  Portability fix
myisam/mi_test2.c:
  Portability fix
myisam/mi_test_all.sh:
  Update to test for MACH variable
myisam/myisamlog.c:
  Cleanup
myisam/myisampack.c:
  Don't use variable 'new'
myisam/sort.c:
  Portability fix
myisammrg/myrg_delete.c:
  Add argument types to function declarations.
myisammrg/myrg_locking.c:
  Add argument types to function declarations.
myisammrg/myrg_open.c:
  Add argument types to function declarations.
myisammrg/myrg_panic.c:
  Add argument types to function declarations.
mysql-test/t/backup.test:
  Fix for OS2
mysql-test/t/show_check.test:
  Fix for OS2
mysys/charset.c:
  Dont use variable 'new'
mysys/default.c:
  Fixes for OS2.
mysys/getopt.c:
  Fixes for OS2.
mysys/getopt1.c:
  Fixes for OS2.
mysys/list.c:
  Don't use variable 'new'
mysys/mf_dirname.c:
  Fixes for OS2.
mysys/mf_format.c:
  Fixes for OS2.
mysys/mf_path.c:
  Fixes for OS2.
mysys/mf_qsort.c:
  Portability fix
mysys/mf_tempfile.c:
  Fixes for OS2.
mysys/my_clock.c:
  Fixes for OS2.
mysys/my_copy.c:
  Fixes for OS2.
mysys/my_create.c:
  Fixes for OS2.
mysys/my_getwd.c:
  Fixes for OS2.
mysys/my_init.c:
  Fixes for OS2.
mysys/my_lib.c:
  Fixes for OS2.
mysys/my_lock.c:
  Fixes for OS2.
mysys/my_malloc.c:
  Portability fix
mysys/my_mkdir.c:
  Fixes for OS2.
mysys/my_open.c:
  Fixes for OS2.
mysys/my_pthread.c:
  Fixes for OS2.
mysys/my_realloc.c:
  Fixes for OS2.
mysys/my_redel.c:
  Fixes for OS2.
mysys/my_static.c:
  Fixes for OS2.
mysys/my_tempnam.c:
  Fixes for OS2.
mysys/my_thr_init.c:
  Fixes for OS2.
mysys/my_write.c:
  Fixes for OS2.
mysys/test_charset.c:
  Fixes for OS2.
mysys/thr_alarm.c:
  Fixes for OS2.
mysys/tree.c:
  Fixes for OS2.
sql/field.cc:
  Fixes for OS2.
sql/field.h:
  Fixes for OS2.
sql/gen_lex_hash.cc:
  Fixes for OS2.
sql/hostname.cc:
  Fixes for OS2.
sql/item_func.cc:
  Fixes for OS2.
sql/item_strfunc.cc:
  Fixes for OS2.
sql/log_event.cc:
  Fixes for OS2.
sql/md5.c:
  Fixes for OS2.
sql/mini_client.cc:
  Fixes for OS2.
sql/mysql_priv.h:
  Fixes for OS2.
sql/mysqld.cc:
  Fixes for OS2.
sql/net_serv.cc:
  Fixes for OS2.
sql/slave.cc:
  Fixes for OS2.
sql/sql_base.cc:
  Fixes for OS2.
sql/sql_db.cc:
  Portability fix
sql/sql_insert.cc:
  Fixes for OS2.
sql/sql_load.cc:
  Fixes for OS2.
sql/sql_parse.cc:
  Fixes for OS2.
sql/sql_table.cc:
  Fixes for OS2.
sql/sql_udf.cc:
  Fixes for OS2.
sql/violite.c:
  Fixes for OS2.
strings/ctype-big5.c:
  Fixes for OS2.
strings/ctype-gbk.c:
  Fixes for OS2.
strings/ctype-sjis.c:
  Fixes for OS2.
strings/ctype-tis620.c:
  Fixes for OS2.
strings/ctype.c:
  Fixes for OS2.
strings/strnlen.c:
  Fixes for OS2.
2001-08-22 01:45:07 +03:00

243 lines
6.3 KiB
C++

/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/*
Get hostname for an IP. Hostnames are checked with reverse name lookup and
checked that they doesn't resemble an ip.
*/
#include "mysql_priv.h"
#include "hash_filo.h"
#include <m_ctype.h>
#ifdef __cplusplus
extern "C" { // Because of SCO 3.2V4.2
#endif
#if !defined( __WIN__) && !defined(OS2)
#include <sys/resource.h>
#ifdef HAVE_SYS_UN_H
#include <sys/un.h>
#endif
#include <netdb.h>
#include <sys/utsname.h>
#endif // __WIN__
#ifdef __cplusplus
}
#endif
class host_entry :public hash_filo_element
{
public:
char ip[sizeof(((struct in_addr *) 0)->s_addr)];
uint errors;
char *hostname;
};
static hash_filo *hostname_cache;
static pthread_mutex_t LOCK_hostname;
void hostname_cache_refresh()
{
hostname_cache->clear();
}
bool hostname_cache_init()
{
(void) pthread_mutex_init(&LOCK_hostname,MY_MUTEX_INIT_SLOW);
if (!(hostname_cache=new hash_filo(HOST_CACHE_SIZE,offsetof(host_entry,ip),
sizeof(struct in_addr),NULL,
(void (*)(void*)) free)))
return 1;
hostname_cache->clear();
return 0;
}
void hostname_cache_free()
{
(void) pthread_mutex_destroy(&LOCK_hostname);
delete hostname_cache;
}
static void add_hostname(struct in_addr *in,const char *name)
{
if (!(specialflag & SPECIAL_NO_HOST_CACHE))
{
VOID(pthread_mutex_lock(&hostname_cache->lock));
host_entry *entry;
if (!(entry=(host_entry*) hostname_cache->search((gptr) &in->s_addr,0)))
{
uint length=name ? (uint) strlen(name) : 0;
if ((entry=(host_entry*) malloc(sizeof(host_entry)+length+1)))
{
char *new_name;
memcpy_fixed(&entry->ip, &in->s_addr, sizeof(in->s_addr));
if (length)
memcpy(new_name= (char *) (entry+1), name, length+1);
else
new_name=0;
entry->hostname=new_name;
entry->errors=0;
(void) hostname_cache->add(entry);
}
}
VOID(pthread_mutex_unlock(&hostname_cache->lock));
}
}
inline void add_wrong_ip(struct in_addr *in)
{
add_hostname(in,NullS);
}
void inc_host_errors(struct in_addr *in)
{
VOID(pthread_mutex_lock(&hostname_cache->lock));
host_entry *entry;
if ((entry=(host_entry*) hostname_cache->search((gptr) &in->s_addr,0)))
entry->errors++;
VOID(pthread_mutex_unlock(&hostname_cache->lock));
}
void reset_host_errors(struct in_addr *in)
{
VOID(pthread_mutex_lock(&hostname_cache->lock));
host_entry *entry;
if ((entry=(host_entry*) hostname_cache->search((gptr) &in->s_addr,0)))
entry->errors=0;
VOID(pthread_mutex_unlock(&hostname_cache->lock));
}
my_string ip_to_hostname(struct in_addr *in, uint *errors)
{
uint i;
host_entry *entry;
DBUG_ENTER("ip_to_hostname");
/* Check first if we have name in cache */
*errors=0;
if (!(specialflag & SPECIAL_NO_HOST_CACHE))
{
VOID(pthread_mutex_lock(&hostname_cache->lock));
if ((entry=(host_entry*) hostname_cache->search((gptr) &in->s_addr,0)))
{
char *name;
if (!entry->hostname)
name=0; // Don't allow connection
else
name=my_strdup(entry->hostname,MYF(0));
*errors= entry->errors;
VOID(pthread_mutex_unlock(&hostname_cache->lock));
DBUG_RETURN(name);
}
VOID(pthread_mutex_unlock(&hostname_cache->lock));
}
struct hostent *hp, *check;
char *name;
LINT_INIT(check);
#if defined(HAVE_GETHOSTBYADDR_R) && defined(HAVE_SOLARIS_STYLE_GETHOST)
char buff[GETHOSTBYADDR_BUFF_SIZE],buff2[GETHOSTBYNAME_BUFF_SIZE];
int tmp_errno;
struct hostent tmp_hostent, tmp_hostent2;
#ifdef HAVE_purify
bzero(buff,sizeof(buff)); // Bug in purify
#endif
if (!(hp=gethostbyaddr_r((char*) in,sizeof(*in),
AF_INET,
&tmp_hostent,buff,sizeof(buff),&tmp_errno)))
{
DBUG_PRINT("error",("gethostbyaddr_r returned %d",tmp_errno));
return 0;
}
if (!(check=my_gethostbyname_r(hp->h_name,&tmp_hostent2,buff2,sizeof(buff2),
&tmp_errno)))
{
DBUG_PRINT("error",("gethostbyname_r returned %d",tmp_errno));
add_wrong_ip(in);
DBUG_RETURN(0);
}
if (!hp->h_name[0])
{
DBUG_PRINT("error",("Got an empty hostname"));
add_wrong_ip(in);
DBUG_RETURN(0); // Don't allow empty hostnames
}
if (!(name=my_strdup(hp->h_name,MYF(0))))
DBUG_RETURN(0); // out of memory
#else
VOID(pthread_mutex_lock(&LOCK_hostname));
if (!(hp=gethostbyaddr((char*) in,sizeof(*in), AF_INET)))
{
VOID(pthread_mutex_unlock(&LOCK_hostname));
DBUG_PRINT("error",("gethostbyaddr returned %d",errno));
goto err;
}
if (!hp->h_name[0]) // Don't allow empty hostnames
{
VOID(pthread_mutex_unlock(&LOCK_hostname));
DBUG_PRINT("error",("Got an empty hostname"));
goto err;
}
if (!(name=my_strdup(hp->h_name,MYF(0))))
{
VOID(pthread_mutex_unlock(&LOCK_hostname));
DBUG_RETURN(0); // out of memory
}
check=gethostbyname(name);
VOID(pthread_mutex_unlock(&LOCK_hostname));
if (!check)
{
DBUG_PRINT("error",("gethostbyname returned %d",errno));
my_free(name,MYF(0));
DBUG_RETURN(0);
}
#endif
/* Don't accept hostnames that starts with digits because they may be
false ip:s */
if (isdigit(name[0]))
{
char *pos;
for (pos= name+1 ; isdigit(*pos); pos++) ;
if (*pos == '.')
{
DBUG_PRINT("error",("mysqld doesn't accept hostnames that starts with a number followed by a '.'"));
my_free(name,MYF(0));
goto err;
}
}
/* Check that 'gethostbyname' returned the used ip */
for (i=0; check->h_addr_list[i]; i++)
{
if (*(uint32*)(check->h_addr_list)[i] == in->s_addr)
{
add_hostname(in,name);
DBUG_RETURN(name);
}
}
DBUG_PRINT("error",("Couldn't verify hostname with gethostbyname"));
my_free(name,MYF(0));
err:
add_wrong_ip(in);
DBUG_RETURN(0);
}