my_init.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:9k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17. #include "mysys_priv.h"
  18. #include "my_static.h"
  19. #include "mysys_err.h"
  20. #include "m_ctype.h"
  21. #include <m_string.h>
  22. #include <m_ctype.h>
  23. #ifdef THREAD
  24. #include <my_pthread.h>
  25. #endif
  26. #ifdef HAVE_GETRUSAGE
  27. #include <sys/resource.h>
  28. /* extern int     getrusage(int, struct rusage *); */
  29. #endif
  30. #include <signal.h>
  31. #ifdef VMS
  32. #include <my_static.c>
  33. #include <m_ctype.h>
  34. #endif
  35. #ifdef __WIN__
  36. #ifdef _MSC_VER
  37. #include <locale.h>
  38. #include <crtdbg.h>
  39. #endif
  40. my_bool have_tcpip=0;
  41. static void my_win_init(void);
  42. static my_bool win32_have_tcpip(void);
  43. static my_bool win32_init_tcp_ip();
  44. #else
  45. #define my_win_init()
  46. #endif
  47. static my_bool my_init_done=0;
  48. static ulong atoi_octal(const char *str)
  49. {
  50.   long int tmp;
  51.   while (*str && isspace(*str))
  52.     str++;
  53.   str2int(str,
  54.   (*str == '0' ? 8 : 10), /* Octalt or decimalt */
  55.   0, INT_MAX, &tmp);
  56.   return (ulong) tmp;
  57. }
  58. /* Init my_sys functions and my_sys variabels */
  59. void my_init(void)
  60. {
  61.   my_string str;
  62.   if (my_init_done)
  63.     return;
  64.   my_init_done=1;
  65. #ifdef THREAD
  66. #if defined(HAVE_PTHREAD_INIT)
  67.   pthread_init(); /* Must be called before DBUG_ENTER */
  68. #endif
  69.   my_thread_global_init();
  70. #ifndef __WIN__
  71.   sigfillset(&my_signals); /* signals blocked by mf_brkhant */
  72. #endif
  73. #endif /* THREAD */
  74. #ifdef UNIXWARE_7
  75.   (void) isatty(0); /* Go around connect() bug in UW7 */
  76. #endif
  77.   {
  78.     DBUG_ENTER("my_init");
  79.     DBUG_PROCESS(my_progname ? my_progname : (char*) "unknown");
  80.     if (!home_dir)
  81.     { /* Don't initialize twice */
  82.       my_win_init();
  83.       if ((home_dir=getenv("HOME")) != 0)
  84. home_dir=intern_filename(home_dir_buff,home_dir);
  85. #ifndef VMS
  86.       /* Default creation of new files */
  87.       if ((str=getenv("UMASK")) != 0)
  88. my_umask=(int) (atoi_octal(str) | 0600);
  89. /* Default creation of new dir's */
  90.       if ((str=getenv("UMASK_DIR")) != 0)
  91. my_umask_dir=(int) (atoi_octal(str) | 0700);
  92. #endif
  93. #ifdef VMS
  94.       init_ctype(); /* Stupid linker don't link _ctype.c */
  95. #endif
  96.       DBUG_PRINT("exit",("home: '%s'",home_dir));
  97.     }
  98. #ifdef __WIN__
  99.     win32_init_tcp_ip();
  100. #endif
  101.     DBUG_VOID_RETURN;
  102.   }
  103. } /* my_init */
  104. /* End my_sys */
  105. void my_end(int infoflag)
  106. {
  107.   FILE *info_file;
  108.   if (!(info_file=DBUG_FILE))
  109.     info_file=stderr;
  110.   if (infoflag & MY_CHECK_ERROR || info_file != stderr)
  111.   { /* Test if some file is left open */
  112.     if (my_file_opened | my_stream_opened)
  113.     {
  114.       sprintf(errbuff[0],EE(EE_OPEN_WARNING),my_file_opened,my_stream_opened);
  115.       (void) my_message_no_curses(EE_OPEN_WARNING,errbuff[0],ME_BELL);
  116.       DBUG_PRINT("error",("%s",errbuff[0]));
  117.     }
  118.   }
  119.   if (infoflag & MY_GIVE_INFO || info_file != stderr)
  120.   {
  121. #ifdef HAVE_GETRUSAGE
  122.     struct rusage rus;
  123.     if (!getrusage(RUSAGE_SELF, &rus))
  124.       fprintf(info_file,"n
  125. User time %.2f, System time %.2fn
  126. Maximum resident set size %ld, Integral resident set size %ldn
  127. Non-physical pagefaults %ld, Physical pagefaults %ld, Swaps %ldn
  128. Blocks in %ld out %ld, Messages in %ld out %ld, Signals %ldn
  129. Voluntary context switches %ld, Involuntary context switches %ldn",
  130.       (rus.ru_utime.tv_sec * SCALE_SEC +
  131.        rus.ru_utime.tv_usec / SCALE_USEC) / 100.0,
  132.       (rus.ru_stime.tv_sec * SCALE_SEC +
  133.        rus.ru_stime.tv_usec / SCALE_USEC) / 100.0,
  134.       rus.ru_maxrss, rus.ru_idrss,
  135.       rus.ru_minflt, rus.ru_majflt,
  136.       rus.ru_nswap, rus.ru_inblock, rus.ru_oublock,
  137.       rus.ru_msgsnd, rus.ru_msgrcv, rus.ru_nsignals,
  138.       rus.ru_nvcsw, rus.ru_nivcsw);
  139. #endif
  140. #if defined(MSDOS) && !defined(__WIN__)
  141.     fprintf(info_file,"nRun time: %.1fn",(double) clock()/CLOCKS_PER_SEC);
  142. #endif
  143.     free_charsets();
  144. #if defined(SAFEMALLOC)
  145.     TERMINATE(stderr); /* Give statistic on screen */
  146. #elif defined(__WIN__) && defined(_MSC_VER)
  147.    _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
  148.    _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR );
  149.    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
  150.    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR );
  151.    _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
  152.    _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR );
  153.    _CrtCheckMemory();
  154.    _CrtDumpMemoryLeaks();
  155. #endif
  156.   }
  157. #ifdef THREAD
  158.   pthread_mutex_destroy(&THR_LOCK_keycache);
  159.   pthread_mutex_destroy(&THR_LOCK_malloc);
  160.   pthread_mutex_destroy(&THR_LOCK_open);
  161.   DBUG_POP(); /* Must be done before my_thread_end */
  162.   my_thread_end();
  163.   my_thread_global_end();
  164. #endif
  165. #ifdef __WIN__
  166.   if (have_tcpip);
  167.     WSACleanup( );
  168. #endif /* __WIN__ */
  169.     my_init_done=0;
  170. } /* my_end */
  171. #ifdef __WIN__
  172. /*
  173.   This code is specially for running MySQL, but it should work in
  174.   other cases too.
  175.   Inizializzazione delle variabili d'ambiente per Win a 32 bit.
  176.   Vengono inserite nelle variabili d'ambiente (utilizzando cosi'
  177.   le funzioni getenv e putenv) i valori presenti nelle chiavi
  178.   del file di registro:
  179.   HKEY_LOCAL_MACHINEsoftwareMySQL
  180.   Se la kiave non esiste nonn inserisce nessun valore
  181. */
  182. /* Crea la stringa d'ambiente */
  183. void setEnvString(char *ret, const char *name, const char *value)
  184. {
  185.   DBUG_ENTER("setEnvString");
  186.   strxmov(ret, name,"=",value,NullS);
  187.   DBUG_VOID_RETURN ;
  188. }
  189. static void my_win_init(void)
  190. {
  191.   HKEY hSoftMysql ;
  192.   DWORD dimName = 256 ;
  193.   DWORD dimData = 1024 ;
  194.   DWORD dimNameValueBuffer = 256 ;
  195.   DWORD dimDataValueBuffer = 1024 ;
  196.   DWORD indexValue = 0 ;
  197.   long retCodeEnumValue ;
  198.   char NameValueBuffer[256] ;
  199.   char DataValueBuffer[1024] ;
  200.   char EnvString[1271] ;
  201.   const char *targetKey = "Software\MySQL" ;
  202.   DBUG_ENTER("my_win_init");
  203.   setlocale(LC_CTYPE, "");             /* To get right sortorder */
  204.   /* apre la chiave HKEY_LOCAL_MACHINESsoftwareMySQL */
  205.   if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)targetKey,0,
  206.    KEY_READ,&hSoftMysql) != ERROR_SUCCESS)
  207.     DBUG_VOID_RETURN;
  208.   /*
  209.   ** Ne legge i valori e li inserisce  nell'ambiente
  210.   ** suppone che tutti i valori letti siano di tipo stringa + ''
  211.   ** Legge il valore con indice 0 e lo scarta
  212.   */
  213.   retCodeEnumValue = RegEnumValue(hSoftMysql, indexValue++,
  214.   (LPTSTR)NameValueBuffer, &dimNameValueBuffer,
  215.   NULL, NULL, (LPBYTE)DataValueBuffer,
  216.   &dimDataValueBuffer) ;
  217.   while (retCodeEnumValue != ERROR_NO_MORE_ITEMS)
  218.   {
  219.     char *my_env;
  220.     /* Crea la stringa d'ambiente */
  221.     setEnvString(EnvString, NameValueBuffer, DataValueBuffer) ;
  222.     /* Inserisce i dati come variabili d'ambiente */
  223.     my_env=strdup(EnvString);  /* variable for putenv must be allocated ! */
  224.     putenv(EnvString) ;
  225.     dimNameValueBuffer = dimName ;
  226.     dimDataValueBuffer = dimData ;
  227.     retCodeEnumValue = RegEnumValue(hSoftMysql, indexValue++,
  228.     NameValueBuffer, &dimNameValueBuffer,
  229.     NULL, NULL, (LPBYTE)DataValueBuffer,
  230.     &dimDataValueBuffer) ;
  231.   }
  232.   /* chiude la chiave */
  233.   RegCloseKey(hSoftMysql) ;
  234.   DBUG_VOID_RETURN ;
  235. }
  236. /*------------------------------------------------------------------
  237. ** Name: CheckForTcpip| Desc: checks if tcpip has been installed on system
  238. ** According to Microsoft Developers documentation the first registry
  239. ** entry should be enough to check if TCP/IP is installed, but as expected
  240. ** this doesn't work on all Win32 machines :(
  241. ------------------------------------------------------------------*/
  242. #define TCPIPKEY  "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters"
  243. #define WINSOCK2KEY "SYSTEM\CurrentControlSet\Services\Winsock2\Parameters"
  244. #define WINSOCKKEY  "SYSTEM\CurrentControlSet\Services\Winsock\Parameters"
  245. static my_bool win32_have_tcpip(void)
  246. {
  247.   HKEY hTcpipRegKey;
  248.   if (RegOpenKeyEx ( HKEY_LOCAL_MACHINE, TCPIPKEY, 0, KEY_READ,
  249.       &hTcpipRegKey) != ERROR_SUCCESS)
  250.   {
  251.     if (RegOpenKeyEx ( HKEY_LOCAL_MACHINE, WINSOCK2KEY, 0, KEY_READ,
  252.       &hTcpipRegKey) != ERROR_SUCCESS)
  253.     {
  254.       if (RegOpenKeyEx ( HKEY_LOCAL_MACHINE, WINSOCKKEY, 0, KEY_READ,
  255.  &hTcpipRegKey) != ERROR_SUCCESS)
  256. if (!getenv("HAVE_TCPIP") || have_tcpip) /* Provide a workaround */
  257.   return (FALSE);
  258.     }
  259.   }
  260.   RegCloseKey ( hTcpipRegKey);
  261.   return (TRUE);
  262. }
  263. static my_bool win32_init_tcp_ip()
  264. {
  265.   if (win32_have_tcpip())
  266.   {
  267.     WORD wVersionRequested = MAKEWORD( 2, 0 );
  268.     WSADATA wsaData;
  269.   /* Be a good citizen: maybe another lib has already initialised
  270.   sockets, so dont clobber them unless necessary */
  271.     if (WSAStartup( wVersionRequested, &wsaData ))
  272.     {
  273.       /* Load failed, maybe because of previously loaded
  274.  incompatible version; try again */
  275.       WSACleanup( );
  276.       if (!WSAStartup( wVersionRequested, &wsaData ))
  277. have_tcpip=1;
  278.     }
  279.     else
  280.     {
  281.       if (wsaData.wVersion != wVersionRequested)
  282.       {
  283. /* Version is no good, try again */
  284. WSACleanup( );
  285. if (!WSAStartup( wVersionRequested, &wsaData ))
  286.   have_tcpip=1;
  287.       }
  288.       else
  289. have_tcpip=1;
  290.     }
  291.   }
  292.   return(0);
  293. }
  294. #endif