home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysys / my_init.c < prev    next >
C/C++ Source or Header  |  2000-10-11  |  9KB  |  318 lines

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