my_init.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:12k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000-2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include "mysys_priv.h"
  14. #include "my_static.h"
  15. #include "mysys_err.h"
  16. #include <m_string.h>
  17. #include <m_ctype.h>
  18. #include <signal.h>
  19. #ifdef VMS
  20. #include <my_static.c>
  21. #include <m_ctype.h>
  22. #endif
  23. #ifdef __WIN__
  24. #ifdef _MSC_VER
  25. #include <locale.h>
  26. #include <crtdbg.h>
  27. #endif
  28. my_bool have_tcpip=0;
  29. static void my_win_init(void);
  30. static my_bool win32_have_tcpip(void);
  31. static my_bool win32_init_tcp_ip();
  32. #else
  33. #define my_win_init()
  34. #endif
  35. #ifdef __NETWARE__
  36. static void netware_init();
  37. #else
  38. #define netware_init()
  39. #endif
  40. my_bool my_init_done= 0;
  41. uint mysys_usage_id= 0;              /* Incremented for each my_init() */
  42. static ulong atoi_octal(const char *str)
  43. {
  44.   long int tmp;
  45.   while (*str && my_isspace(&my_charset_latin1, *str))
  46.     str++;
  47.   str2int(str,
  48.   (*str == '0' ? 8 : 10),       /* Octalt or decimalt */
  49.   0, INT_MAX, &tmp);
  50.   return (ulong) tmp;
  51. }
  52. /*
  53.   Init my_sys functions and my_sys variabels
  54.   SYNOPSIS
  55.     my_init()
  56.   RETURN
  57.     0  ok
  58.     1  Couldn't initialize environment
  59. */
  60. my_bool my_init(void)
  61. {
  62.   my_string str;
  63.   if (my_init_done)
  64.     return 0;
  65.   my_init_done=1;
  66.   mysys_usage_id++;
  67.   my_umask= 0660;                       /* Default umask for new files */
  68.   my_umask_dir= 0700;                   /* Default umask for new directories */
  69. #if defined(THREAD) && defined(SAFE_MUTEX)
  70.   safe_mutex_global_init(); /* Must be called early */
  71. #endif
  72.   netware_init();
  73. #ifdef THREAD
  74. #if defined(HAVE_PTHREAD_INIT)
  75.   pthread_init(); /* Must be called before DBUG_ENTER */
  76. #endif
  77.   if (my_thread_global_init())
  78.     return 1;
  79. #if !defined( __WIN__) && !defined(OS2) && !defined(__NETWARE__)
  80.   sigfillset(&my_signals); /* signals blocked by mf_brkhant */
  81. #endif
  82. #endif /* THREAD */
  83. #ifdef UNIXWARE_7
  84.   (void) isatty(0); /* Go around connect() bug in UW7 */
  85. #endif
  86.   {
  87.     DBUG_ENTER("my_init");
  88.     DBUG_PROCESS(my_progname ? my_progname : (char*) "unknown");
  89.     if (!home_dir)
  90.     { /* Don't initialize twice */
  91.       my_win_init();
  92.       if ((home_dir=getenv("HOME")) != 0)
  93. home_dir=intern_filename(home_dir_buff,home_dir);
  94. #ifndef VMS
  95.       /* Default creation of new files */
  96.       if ((str=getenv("UMASK")) != 0)
  97. my_umask=(int) (atoi_octal(str) | 0600);
  98. /* Default creation of new dir's */
  99.       if ((str=getenv("UMASK_DIR")) != 0)
  100. my_umask_dir=(int) (atoi_octal(str) | 0700);
  101. #endif
  102. #ifdef VMS
  103.       init_ctype(); /* Stupid linker don't link _ctype.c */
  104. #endif
  105.       DBUG_PRINT("exit",("home: '%s'",home_dir));
  106.     }
  107. #ifdef __WIN__
  108.     win32_init_tcp_ip();
  109. #endif
  110.     DBUG_RETURN(0);
  111.   }
  112. } /* my_init */
  113. /* End my_sys */
  114. void my_end(int infoflag)
  115. {
  116.   /*
  117.     this code is suboptimal to workaround a bug in
  118.     Sun CC: Sun C++ 5.6 2004/06/02 for x86, and should not be
  119.     optimized until this compiler is not in use anymore
  120.   */
  121.   FILE *info_file= DBUG_FILE;
  122.   my_bool print_info= (info_file != stderr);
  123.   DBUG_ENTER("my_end");
  124.   if (!info_file)
  125.   {
  126.     info_file= stderr;
  127.     print_info= 0;
  128.   }
  129.   DBUG_PRINT("info",("Shutting down: print_info: %d", print_info));
  130.   if ((infoflag & MY_CHECK_ERROR) || print_info)
  131.   { /* Test if some file is left open */
  132.     if (my_file_opened | my_stream_opened)
  133.     {
  134.       sprintf(errbuff[0],EE(EE_OPEN_WARNING),my_file_opened,my_stream_opened);
  135.       (void) my_message_no_curses(EE_OPEN_WARNING,errbuff[0],ME_BELL);
  136.       DBUG_PRINT("error",("%s",errbuff[0]));
  137.     }
  138.   }
  139.   my_once_free();
  140.   if ((infoflag & MY_GIVE_INFO) || print_info)
  141.   {
  142. #ifdef HAVE_GETRUSAGE
  143.     struct rusage rus;
  144. #ifdef HAVE_purify
  145.     /* Purify assumes that rus is uninitialized after getrusage call */
  146.     bzero((char*) &rus, sizeof(rus));
  147. #endif
  148.     if (!getrusage(RUSAGE_SELF, &rus))
  149.       fprintf(info_file,"n
  150. User time %.2f, System time %.2fn
  151. Maximum resident set size %ld, Integral resident set size %ldn
  152. Non-physical pagefaults %ld, Physical pagefaults %ld, Swaps %ldn
  153. Blocks in %ld out %ld, Messages in %ld out %ld, Signals %ldn
  154. Voluntary context switches %ld, Involuntary context switches %ldn",
  155.       (rus.ru_utime.tv_sec * SCALE_SEC +
  156.        rus.ru_utime.tv_usec / SCALE_USEC) / 100.0,
  157.       (rus.ru_stime.tv_sec * SCALE_SEC +
  158.        rus.ru_stime.tv_usec / SCALE_USEC) / 100.0,
  159.       rus.ru_maxrss, rus.ru_idrss,
  160.       rus.ru_minflt, rus.ru_majflt,
  161.       rus.ru_nswap, rus.ru_inblock, rus.ru_oublock,
  162.       rus.ru_msgsnd, rus.ru_msgrcv, rus.ru_nsignals,
  163.       rus.ru_nvcsw, rus.ru_nivcsw);
  164. #endif
  165. #if ( defined(MSDOS) || defined(__NETWARE__) ) && !defined(__WIN__)
  166.     fprintf(info_file,"nRun time: %.1fn",(double) clock()/CLOCKS_PER_SEC);
  167. #endif
  168. #if defined(SAFEMALLOC)
  169.     TERMINATE(stderr); /* Give statistic on screen */
  170. #elif defined(__WIN__) && defined(_MSC_VER)
  171.    _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
  172.    _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR );
  173.    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
  174.    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR );
  175.    _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
  176.    _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR );
  177.    _CrtCheckMemory();
  178.    _CrtDumpMemoryLeaks();
  179. #endif
  180.   }
  181. #ifdef THREAD
  182.   DBUG_POP(); /* Must be done before my_thread_end */
  183.   my_thread_end();
  184.   my_thread_global_end();
  185. #if defined(SAFE_MUTEX)
  186.   /*
  187.     Check on destroying of mutexes. A few may be left that will get cleaned
  188.     up by C++ destructors
  189.   */
  190.   safe_mutex_end(infoflag & MY_GIVE_INFO ? stderr : (FILE *) 0);
  191. #endif /* defined(SAFE_MUTEX) */
  192. #endif /* THREAD */
  193. #ifdef __WIN__
  194.   if (have_tcpip)
  195.     WSACleanup();
  196. #endif /* __WIN__ */
  197.   my_init_done=0;
  198. } /* my_end */
  199. #ifdef __WIN__
  200. /*
  201.   This code is specially for running MySQL, but it should work in
  202.   other cases too.
  203.   Inizializzazione delle variabili d'ambiente per Win a 32 bit.
  204.   Vengono inserite nelle variabili d'ambiente (utilizzando cosi'
  205.   le funzioni getenv e putenv) i valori presenti nelle chiavi
  206.   del file di registro:
  207.   HKEY_LOCAL_MACHINEsoftwareMySQL
  208.   Se la kiave non esiste nonn inserisce nessun valore
  209. */
  210. /* Crea la stringa d'ambiente */
  211. void setEnvString(char *ret, const char *name, const char *value)
  212. {
  213.   DBUG_ENTER("setEnvString");
  214.   strxmov(ret, name,"=",value,NullS);
  215.   DBUG_VOID_RETURN ;
  216. }
  217. static void my_win_init(void)
  218. {
  219.   HKEY hSoftMysql ;
  220.   DWORD dimName = 256 ;
  221.   DWORD dimData = 1024 ;
  222.   DWORD dimNameValueBuffer = 256 ;
  223.   DWORD dimDataValueBuffer = 1024 ;
  224.   DWORD indexValue = 0 ;
  225.   long retCodeEnumValue ;
  226.   char NameValueBuffer[256] ;
  227.   char DataValueBuffer[1024] ;
  228.   char EnvString[1271] ;
  229.   const char *targetKey = "Software\MySQL" ;
  230.   DBUG_ENTER("my_win_init");
  231.   setlocale(LC_CTYPE, "");             /* To get right sortorder */
  232. #if defined(_MSC_VER) && (_MSC_VER < 1300)
  233.   /* 
  234.     Clear the OS system variable TZ and avoid the 100% CPU usage
  235.     Only for old versions of Visual C++
  236.   */
  237.   _putenv( "TZ=" ); 
  238. #endif  
  239.   _tzset();
  240.   /* apre la chiave HKEY_LOCAL_MACHINESsoftwareMySQL */
  241.   if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)targetKey,0,
  242.    KEY_READ,&hSoftMysql) != ERROR_SUCCESS)
  243.     DBUG_VOID_RETURN;
  244.   /*
  245.   ** Ne legge i valori e li inserisce  nell'ambiente
  246.   ** suppone che tutti i valori letti siano di tipo stringa + ''
  247.   ** Legge il valore con indice 0 e lo scarta
  248.   */
  249.   retCodeEnumValue = RegEnumValue(hSoftMysql, indexValue++,
  250.   (LPTSTR)NameValueBuffer, &dimNameValueBuffer,
  251.   NULL, NULL, (LPBYTE)DataValueBuffer,
  252.   &dimDataValueBuffer) ;
  253.   while (retCodeEnumValue != ERROR_NO_MORE_ITEMS)
  254.   {
  255.     char *my_env;
  256.     /* Crea la stringa d'ambiente */
  257.     setEnvString(EnvString, NameValueBuffer, DataValueBuffer) ;
  258.     /* Inserisce i dati come variabili d'ambiente */
  259.     my_env=strdup(EnvString);  /* variable for putenv must be allocated ! */
  260.     putenv(my_env) ;
  261.     dimNameValueBuffer = dimName ;
  262.     dimDataValueBuffer = dimData ;
  263.     retCodeEnumValue = RegEnumValue(hSoftMysql, indexValue++,
  264.     NameValueBuffer, &dimNameValueBuffer,
  265.     NULL, NULL, (LPBYTE)DataValueBuffer,
  266.     &dimDataValueBuffer) ;
  267.   }
  268.   /* chiude la chiave */
  269.   RegCloseKey(hSoftMysql) ;
  270.   DBUG_VOID_RETURN ;
  271. }
  272. /*------------------------------------------------------------------
  273.   Name: CheckForTcpip| Desc: checks if tcpip has been installed on system
  274.   According to Microsoft Developers documentation the first registry
  275.   entry should be enough to check if TCP/IP is installed, but as expected
  276.   this doesn't work on all Win32 machines :(
  277. ------------------------------------------------------------------*/
  278. #define TCPIPKEY  "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters"
  279. #define WINSOCK2KEY "SYSTEM\CurrentControlSet\Services\Winsock2\Parameters"
  280. #define WINSOCKKEY  "SYSTEM\CurrentControlSet\Services\Winsock\Parameters"
  281. static my_bool win32_have_tcpip(void)
  282. {
  283.   HKEY hTcpipRegKey;
  284.   if (RegOpenKeyEx ( HKEY_LOCAL_MACHINE, TCPIPKEY, 0, KEY_READ,
  285.       &hTcpipRegKey) != ERROR_SUCCESS)
  286.   {
  287.     if (RegOpenKeyEx ( HKEY_LOCAL_MACHINE, WINSOCK2KEY, 0, KEY_READ,
  288.       &hTcpipRegKey) != ERROR_SUCCESS)
  289.     {
  290.       if (RegOpenKeyEx ( HKEY_LOCAL_MACHINE, WINSOCKKEY, 0, KEY_READ,
  291.  &hTcpipRegKey) != ERROR_SUCCESS)
  292. if (!getenv("HAVE_TCPIP") || have_tcpip) /* Provide a workaround */
  293.   return (FALSE);
  294.     }
  295.   }
  296.   RegCloseKey ( hTcpipRegKey);
  297.   return (TRUE);
  298. }
  299. static my_bool win32_init_tcp_ip()
  300. {
  301.   if (win32_have_tcpip())
  302.   {
  303.     WORD wVersionRequested = MAKEWORD( 2, 0 );
  304.     WSADATA wsaData;
  305.   /* Be a good citizen: maybe another lib has already initialised
  306.   sockets, so dont clobber them unless necessary */
  307.     if (WSAStartup( wVersionRequested, &wsaData ))
  308.     {
  309.       /* Load failed, maybe because of previously loaded
  310.  incompatible version; try again */
  311.       WSACleanup( );
  312.       if (!WSAStartup( wVersionRequested, &wsaData ))
  313. have_tcpip=1;
  314.     }
  315.     else
  316.     {
  317.       if (wsaData.wVersion != wVersionRequested)
  318.       {
  319. /* Version is no good, try again */
  320. WSACleanup( );
  321. if (!WSAStartup( wVersionRequested, &wsaData ))
  322.   have_tcpip=1;
  323.       }
  324.       else
  325. have_tcpip=1;
  326.     }
  327.   }
  328.   return(0);
  329. }
  330. #endif /* __WIN__ */
  331. #ifdef __NETWARE__
  332. /*
  333.   Basic initialisation for netware
  334. */
  335. static void netware_init()
  336. {
  337.   char cwd[PATH_MAX], *name;
  338.   DBUG_ENTER("netware_init");
  339.   /* init only if we are not a client library */
  340.   if (my_progname)
  341.   {
  342. #if SUPPORTED_BY_LIBC   /* Removed until supported in Libc */
  343.     struct termios tp;
  344.     /* Disable control characters */
  345.     tcgetattr(STDIN_FILENO, &tp);
  346.     tp.c_cc[VINTR] = _POSIX_VDISABLE;
  347.     tp.c_cc[VEOF] = _POSIX_VDISABLE;
  348.     tp.c_cc[VSUSP] = _POSIX_VDISABLE;
  349.     tcsetattr(STDIN_FILENO, TCSANOW, &tp);
  350. #endif /* SUPPORTED_BY_LIBC */
  351.     /* With stdout redirection */
  352.     if (!isatty(STDOUT_FILENO))
  353.     {
  354.       setscreenmode(SCR_AUTOCLOSE_ON_EXIT);      /* auto close the screen */
  355.     }
  356.     else
  357.     {
  358.       setscreenmode(SCR_NO_MODE); /* keep the screen up */
  359.     }
  360.     /* Parse program name and change to base format */
  361.     name= my_progname;
  362.     for (; *name; name++)
  363.     {
  364.       if (*name == '\')
  365.       {
  366.         *name = '/';
  367.       }
  368.       else
  369.       {
  370.         *name = tolower(*name);
  371.       }
  372.     }
  373.   }
  374.   DBUG_VOID_RETURN;
  375. }
  376. #endif /* __NETWARE__ */