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

MySQL数据库

开发平台:

Visual C++

  1. (void*) thd)))
  2.       {
  3. DBUG_PRINT("error",
  4.    ("Can't create thread to handle request (error %d)",
  5.     error));
  6. (void) pthread_mutex_lock(&LOCK_thread_count);
  7. thread_count--;
  8. thd->killed=1; // Safety
  9. (void) pthread_mutex_unlock(&LOCK_thread_count);
  10. net_printf(net,ER_CANT_CREATE_THREAD,error);
  11. (void) pthread_mutex_lock(&LOCK_thread_count);
  12. close_connection(net,0,0);
  13. delete thd;
  14. (void) pthread_mutex_unlock(&LOCK_thread_count);
  15. DBUG_VOID_RETURN;
  16.       }
  17.     }
  18.   }
  19.   DBUG_PRINT("info",(("Thread %d created"), thd->thread_id));
  20.   DBUG_VOID_RETURN;
  21. }
  22. /* Handle new connections and spawn new process to handle them */
  23. pthread_handler_decl(handle_connections_sockets,arg __attribute__((unused)))
  24. {
  25.   my_socket sock,new_sock;
  26.   uint error_count=0;
  27.   uint max_used_connection= (uint) (max(ip_sock,unix_sock)+1);
  28.   fd_set readFDs,clientFDs;
  29.   THD *thd;
  30.   struct sockaddr_in cAddr;
  31.   int ip_flags=0,socket_flags=0,flags;
  32.   Vio *vio_tmp;
  33.   DBUG_ENTER("handle_connections_sockets");
  34.   LINT_INIT(new_sock);
  35.   (void) my_pthread_getprio(pthread_self()); // For debugging
  36.   FD_ZERO(&clientFDs);
  37.   if (ip_sock != INVALID_SOCKET)
  38.   {
  39.     FD_SET(ip_sock,&clientFDs);
  40. #ifdef HAVE_FCNTL
  41.     ip_flags = fcntl(ip_sock, F_GETFL, 0);
  42. #endif
  43.   }
  44. #ifdef HAVE_SYS_UN_H
  45.   FD_SET(unix_sock,&clientFDs);
  46.   socket_flags=fcntl(unix_sock, F_GETFL, 0);
  47. #endif
  48.   DBUG_PRINT("general",("Waiting for connections."));
  49.   while (!abort_loop)
  50.   {
  51.     readFDs=clientFDs;
  52. #ifdef HPUX
  53.     if (select(max_used_connection,(int*) &readFDs,0,0,0) < 0)
  54.       continue;
  55. #else
  56.     if (select((int) max_used_connection,&readFDs,0,0,0) < 0)
  57.     {
  58.       if (errno != EINTR)
  59.       {
  60. if (!select_errors++ && !abort_loop) /* purecov: inspected */
  61.   sql_print_error("mysqld: Got error %d from select",errno); /* purecov: inspected */
  62.       }
  63.       continue;
  64.     }
  65. #endif /* HPUX */
  66.     if (abort_loop)
  67.       break;
  68.     /*
  69.     ** Is this a new connection request
  70.     */
  71. #ifdef HAVE_SYS_UN_H
  72.     if (FD_ISSET(unix_sock,&readFDs))
  73.     {
  74.       sock = unix_sock;
  75.       flags= socket_flags;
  76.     }
  77.     else
  78. #endif
  79.     {
  80.       sock = ip_sock;
  81.       flags= ip_flags;
  82.     }
  83. #if !defined(NO_FCNTL_NONBLOCK)
  84.     if (!(test_flags & TEST_BLOCKING))
  85.     {
  86. #if defined(O_NONBLOCK)
  87.       fcntl(sock, F_SETFL, flags | O_NONBLOCK);
  88. #elif defined(O_NDELAY)
  89.       fcntl(sock, F_SETFL, flags | O_NDELAY);
  90. #endif
  91.     }
  92. #endif /* NO_FCNTL_NONBLOCK */
  93.     for (uint retry=0; retry < MAX_ACCEPT_RETRY; retry++)
  94.     {
  95.       size_socket length=sizeof(struct sockaddr_in);
  96.       new_sock = accept(sock, my_reinterpret_cast(struct sockaddr *) (&cAddr),
  97. &length);
  98.       if (new_sock != INVALID_SOCKET || (errno != EINTR && errno != EAGAIN))
  99. break;
  100. #if !defined(NO_FCNTL_NONBLOCK)
  101.       if (!(test_flags & TEST_BLOCKING))
  102.       {
  103. if (retry == MAX_ACCEPT_RETRY - 1)
  104.   fcntl(sock, F_SETFL, flags); // Try without O_NONBLOCK
  105.       }
  106. #endif
  107.     }
  108. #if !defined(NO_FCNTL_NONBLOCK)
  109.     if (!(test_flags & TEST_BLOCKING))
  110.       fcntl(sock, F_SETFL, flags);
  111. #endif
  112.     if (new_sock < 0)
  113.     {
  114.       if ((error_count++ & 255) == 0) // This can happen often
  115. sql_perror("Error in accept");
  116.       if (errno == ENFILE || errno == EMFILE)
  117. sleep(1); // Give other threads some time
  118.       continue;
  119.     }
  120. #ifdef HAVE_LIBWRAP
  121.     {
  122.       if (sock == ip_sock)
  123.       {
  124. struct request_info req;
  125. signal(SIGCHLD, SIG_DFL);
  126. request_init(&req, RQ_DAEMON, libwrapName, RQ_FILE, new_sock, NULL);
  127. fromhost(&req);
  128. if (!hosts_access(&req))
  129. {
  130.   // This may be stupid but refuse() includes an exit(0)
  131.   // which we surely don't want...
  132.   // clean_exit() - same stupid thing ...
  133.   syslog(deny_severity, "refused connect from %s", eval_client(&req));
  134.   if (req.sink)
  135.     ((void (*)(int))req.sink)(req.fd);
  136.   // C++ sucks (the gibberish in front just translates the supplied
  137.   // sink function pointer in the req structure from a void (*sink)();
  138.   // to a void(*sink)(int) if you omit the cast, the C++ compiler
  139.   // will cry...
  140.   (void) shutdown(new_sock,2);  // This looks fine to me...
  141.   (void) closesocket(new_sock);
  142.   continue;
  143. }
  144.       }
  145.     }
  146. #endif /* HAVE_LIBWRAP */
  147.     {
  148.       size_socket dummyLen;
  149.       struct sockaddr dummy;
  150.       dummyLen = sizeof(struct sockaddr);
  151.       if (getsockname(new_sock,&dummy, &dummyLen) < 0)
  152.       {
  153. sql_perror("Error on new connection socket");
  154. (void) shutdown(new_sock,2);
  155. (void) closesocket(new_sock);
  156. continue;
  157.       }
  158.     }
  159.     /*
  160.     ** Don't allow too many connections
  161.     */
  162.     if (!(thd= new THD))
  163.     {
  164.       (void) shutdown(new_sock,2); VOID(closesocket(new_sock));
  165.       continue;
  166.     }
  167.     if (!(vio_tmp=vio_new(new_sock,
  168.   sock == unix_sock ? VIO_TYPE_SOCKET :
  169.   VIO_TYPE_TCPIP,
  170.   sock == unix_sock)) ||
  171. my_net_init(&thd->net,vio_tmp))
  172.     {
  173.       if (vio_tmp)
  174. vio_delete(vio_tmp);
  175.       else
  176.       {
  177. (void) shutdown(new_sock,2);
  178. (void) closesocket(new_sock);
  179.       }
  180.       delete thd;
  181.       continue;
  182.     }
  183.     if (sock == unix_sock)
  184.       thd->host=(char*) localhost;
  185.     create_new_thread(thd);
  186.   }
  187. #ifdef __NT__
  188.   pthread_mutex_lock(&LOCK_thread_count);
  189.   handler_count--;
  190.   pthread_mutex_unlock(&LOCK_thread_count);
  191.   pthread_cond_signal(&COND_handler_count);
  192. #endif
  193.   DBUG_RETURN(0);
  194. }
  195. #ifdef __NT__
  196. pthread_handler_decl(handle_connections_namedpipes,arg)
  197. {
  198.   HANDLE hConnectedPipe;
  199.   BOOL fConnected;
  200.   THD *thd;
  201.   my_thread_init();
  202.   DBUG_ENTER("handle_connections_namedpipes");
  203.   (void) my_pthread_getprio(pthread_self()); // For debugging
  204.   DBUG_PRINT("general",("Waiting for named pipe connections."));
  205.   while (!abort_loop)
  206.   {
  207.     /* wait for named pipe connection */
  208.     fConnected = ConnectNamedPipe( hPipe, NULL );
  209.     if (abort_loop)
  210.       break;
  211.     if ( !fConnected )
  212.       fConnected = GetLastError() == ERROR_PIPE_CONNECTED;
  213.     if ( !fConnected )
  214.     {
  215.       CloseHandle( hPipe );
  216.       if ((hPipe = CreateNamedPipe(szPipeName,
  217.    PIPE_ACCESS_DUPLEX,
  218.    PIPE_TYPE_BYTE |
  219.    PIPE_READMODE_BYTE |
  220.    PIPE_WAIT,
  221.    PIPE_UNLIMITED_INSTANCES,
  222.    (int) net_buffer_length,
  223.    (int) net_buffer_length,
  224.    NMPWAIT_USE_DEFAULT_WAIT,
  225.    &saPipeSecurity )) ==
  226.   INVALID_HANDLE_VALUE )
  227.       {
  228. sql_perror("Can't create new named pipe!");
  229. break; // Abort
  230.       }
  231.     }
  232.     hConnectedPipe = hPipe;
  233.     /* create new pipe for new connection */
  234.     if ((hPipe = CreateNamedPipe(szPipeName,
  235.  PIPE_ACCESS_DUPLEX,
  236.  PIPE_TYPE_BYTE |
  237.  PIPE_READMODE_BYTE |
  238.  PIPE_WAIT,
  239.  PIPE_UNLIMITED_INSTANCES,
  240.  (int) net_buffer_length,
  241.  (int) net_buffer_length,
  242.  NMPWAIT_USE_DEFAULT_WAIT,
  243.  &saPipeSecurity)) ==
  244. INVALID_HANDLE_VALUE)
  245.     {
  246.       sql_perror("Can't create new named pipe!");
  247.       hPipe=hConnectedPipe;
  248.       continue; // We have to try again
  249.     }
  250.     if ( !(thd = new THD))
  251.     {
  252.       DisconnectNamedPipe( hConnectedPipe );
  253.       CloseHandle( hConnectedPipe );
  254.       continue;
  255.     }
  256.     if (!(thd->net.vio = vio_new_win32pipe(hConnectedPipe)) ||
  257. my_net_init(&thd->net, thd->net.vio))
  258.     {
  259.       close_connection(&thd->net,ER_OUT_OF_RESOURCES);
  260.       delete thd;
  261.       continue;
  262.     }
  263.     /* host name is unknown */
  264.     thd->host = my_strdup(localhost,MYF(0)); /* Host is unknown */
  265.     create_new_thread(thd);
  266.   }
  267.   pthread_mutex_lock(&LOCK_thread_count);
  268.   handler_count--;
  269.   pthread_cond_signal(&COND_handler_count);
  270.   pthread_mutex_unlock(&LOCK_thread_count);
  271.   DBUG_RETURN(0);
  272. }
  273. #endif /* __NT__ */
  274. /******************************************************************************
  275. ** handle start options
  276. ******************************************************************************/
  277. enum options {
  278.                OPT_ISAM_LOG=256,            OPT_SKIP_NEW, 
  279.                OPT_SKIP_GRANT,              OPT_SKIP_LOCK, 
  280.                OPT_ENABLE_LOCK,             OPT_USE_LOCKING,
  281.                OPT_SOCKET,                  OPT_UPDATE_LOG, 
  282.                OPT_BIN_LOG,                 OPT_SKIP_RESOLVE, 
  283.                OPT_SKIP_NETWORKING,         OPT_BIN_LOG_INDEX,
  284.                OPT_BIND_ADDRESS,            OPT_PID_FILE,
  285.                OPT_SKIP_PRIOR,              OPT_BIG_TABLES,    
  286.                OPT_STANDALONE,              OPT_ONE_THREAD,
  287.                OPT_CONSOLE,                 OPT_LOW_PRIORITY_UPDATES,
  288.                OPT_SKIP_HOST_CACHE,         OPT_LONG_FORMAT,   
  289.                OPT_FLUSH,                   OPT_SAFE, 
  290.                OPT_BOOTSTRAP,               OPT_SKIP_SHOW_DB,
  291.                OPT_TABLE_TYPE,              OPT_INIT_FILE,   
  292.                OPT_DELAY_KEY_WRITE,         OPT_SLOW_QUERY_LOG, 
  293.                OPT_SKIP_DELAY_KEY_WRITE,    OPT_CHARSETS_DIR,
  294.                OPT_BDB_HOME,                OPT_BDB_LOG,  
  295.                OPT_BDB_TMP,                 OPT_BDB_NOSYNC,
  296.                OPT_BDB_LOCK,                OPT_BDB_SKIP, 
  297.                OPT_BDB_NO_RECOVER,     OPT_BDB_SHARED,
  298.        OPT_MASTER_HOST,             OPT_MASTER_USER,
  299.                OPT_MASTER_PASSWORD,         OPT_MASTER_PORT,
  300.                OPT_MASTER_INFO_FILE,        OPT_MASTER_CONNECT_RETRY,
  301.                OPT_SQL_BIN_UPDATE_SAME,     OPT_REPLICATE_DO_DB,      
  302.                OPT_REPLICATE_IGNORE_DB,     OPT_LOG_SLAVE_UPDATES,
  303.                OPT_BINLOG_DO_DB,            OPT_BINLOG_IGNORE_DB,
  304.                OPT_WANT_CORE,               OPT_SKIP_CONCURRENT_INSERT,
  305.                OPT_MEMLOCK,                 OPT_MYISAM_RECOVER,
  306.                OPT_REPLICATE_REWRITE_DB,    OPT_SERVER_ID, 
  307.                OPT_SKIP_SLAVE_START,        OPT_SKIP_INNOBASE,
  308.                OPT_SAFEMALLOC_MEM_LIMIT,    OPT_REPLICATE_DO_TABLE, 
  309.                OPT_REPLICATE_IGNORE_TABLE,  OPT_REPLICATE_WILD_DO_TABLE, 
  310.                OPT_REPLICATE_WILD_IGNORE_TABLE, 
  311.                OPT_DISCONNECT_SLAVE_EVENT_COUNT, 
  312.                OPT_ABORT_SLAVE_EVENT_COUNT,
  313.        OPT_INNOBASE_DATA_HOME_DIR,
  314.                OPT_INNOBASE_DATA_FILE_PATH,
  315.        OPT_INNOBASE_LOG_GROUP_HOME_DIR, 
  316.                OPT_INNOBASE_LOG_ARCH_DIR, 
  317.                OPT_INNOBASE_LOG_ARCHIVE, 
  318.                OPT_INNOBASE_FLUSH_LOG_AT_TRX_COMMIT, 
  319.                OPT_SAFE_SHOW_DB,
  320.        OPT_GEMINI_SKIP, OPT_INNOBASE_SKIP,
  321.                OPT_TEMP_POOL
  322. };
  323. static struct option long_options[] = {
  324.   {"ansi",                  no_argument,       0, 'a'},
  325.   {"basedir",               required_argument, 0, 'b'},
  326. #ifdef HAVE_BERKELEY_DB
  327.   {"bdb-home",              required_argument, 0, (int) OPT_BDB_HOME},
  328.   {"bdb-lock-detect",       required_argument, 0, (int) OPT_BDB_LOCK},
  329.   {"bdb-logdir",            required_argument, 0, (int) OPT_BDB_LOG},
  330.   {"bdb-no-recover",        no_argument,       0, (int) OPT_BDB_NO_RECOVER},
  331.   {"bdb-no-sync",           no_argument,       0, (int) OPT_BDB_NOSYNC},
  332.   {"bdb-shared-data",       no_argument,       0, (int) OPT_BDB_SHARED},
  333.   {"bdb-tmpdir",            required_argument, 0, (int) OPT_BDB_TMP},
  334. #endif
  335.   {"big-tables",            no_argument,       0, (int) OPT_BIG_TABLES},
  336.   {"binlog-do-db",          required_argument, 0, (int) OPT_BINLOG_DO_DB},
  337.   {"binlog-ignore-db",      required_argument, 0, (int) OPT_BINLOG_IGNORE_DB},
  338.   {"bind-address",          required_argument, 0, (int) OPT_BIND_ADDRESS},
  339.   {"bootstrap",             no_argument,       0, (int) OPT_BOOTSTRAP},
  340. #ifdef __WIN__
  341.   {"console",               no_argument,       0, (int) OPT_CONSOLE},
  342. #endif
  343.   {"core-file",             no_argument,       0, (int) OPT_WANT_CORE},
  344.   {"chroot",                required_argument, 0, 'r'},
  345.   {"character-sets-dir",    required_argument, 0, (int) OPT_CHARSETS_DIR},
  346.   {"datadir",               required_argument, 0, 'h'},
  347. #ifndef DBUG_OFF
  348.   {"debug",                 optional_argument, 0, '#'},
  349. #endif
  350.   {"default-character-set", required_argument, 0, 'C'},
  351.   {"default-table-type",    required_argument, 0, (int) OPT_TABLE_TYPE},
  352.   {"delay-key-write-for-all-tables",
  353.                             no_argument,       0, (int) OPT_DELAY_KEY_WRITE},
  354.   {"enable-locking",        no_argument,       0, (int) OPT_ENABLE_LOCK},
  355.   {"exit-info",             optional_argument, 0, 'T'},
  356.   {"flush",                 no_argument,       0, (int) OPT_FLUSH},
  357.   /* We must always support this option to make scripts like mysqltest easier
  358.      to do */
  359.   {"innobase_data_file_path", required_argument, 0,
  360.      OPT_INNOBASE_DATA_FILE_PATH},
  361. #ifdef HAVE_INNOBASE_DB
  362.   {"innobase_data_home_dir", required_argument, 0,
  363.      OPT_INNOBASE_DATA_HOME_DIR},
  364.   {"innobase_log_group_home_dir", required_argument, 0,
  365.     OPT_INNOBASE_LOG_GROUP_HOME_DIR},
  366.   {"innobase_log_arch_dir", required_argument, 0,
  367.     OPT_INNOBASE_LOG_ARCH_DIR},
  368.   {"innobase_log_archive", optional_argument, 0,
  369.      OPT_INNOBASE_LOG_ARCHIVE},
  370.   {"innobase_flush_log_at_trx_commit", optional_argument, 0,
  371.      OPT_INNOBASE_FLUSH_LOG_AT_TRX_COMMIT},
  372. #endif
  373.   {"help",                  no_argument,       0, '?'},
  374.   {"init-file",             required_argument, 0, (int) OPT_INIT_FILE},
  375.   {"log",                   optional_argument, 0, 'l'},
  376.   {"language",              required_argument, 0, 'L'},
  377.   {"log-bin",               optional_argument, 0, (int) OPT_BIN_LOG},
  378.   {"log-bin-index",         required_argument, 0, (int) OPT_BIN_LOG_INDEX},
  379.   {"log-isam",              optional_argument, 0, (int) OPT_ISAM_LOG},
  380.   {"log-update",            optional_argument, 0, (int) OPT_UPDATE_LOG},
  381.   {"log-slow-queries",      optional_argument, 0, (int) OPT_SLOW_QUERY_LOG},
  382.   {"log-long-format",       no_argument,       0, (int) OPT_LONG_FORMAT},
  383.   {"log-slave-updates",     no_argument,       0, (int) OPT_LOG_SLAVE_UPDATES},
  384.   {"low-priority-updates",  no_argument,       0, (int) OPT_LOW_PRIORITY_UPDATES},
  385.   {"master-host",           required_argument, 0, (int) OPT_MASTER_HOST},
  386.   {"master-user",           required_argument, 0, (int) OPT_MASTER_USER},
  387.   {"master-password",       required_argument, 0, (int) OPT_MASTER_PASSWORD},
  388.   {"master-port",           required_argument, 0, (int) OPT_MASTER_PORT},
  389.   {"master-connect-retry",  required_argument, 0, (int) OPT_MASTER_CONNECT_RETRY},
  390.   {"master-info-file",      required_argument, 0, (int) OPT_MASTER_INFO_FILE},
  391.   {"myisam-recover",     optional_argument, 0, (int) OPT_MYISAM_RECOVER},
  392.   {"memlock",     no_argument,       0, (int) OPT_MEMLOCK},
  393.     // needs to be available for the test case to pass in non-debugging mode
  394.     // is a no-op
  395.   {"disconnect-slave-event-count",      required_argument, 0,
  396.      (int) OPT_DISCONNECT_SLAVE_EVENT_COUNT},
  397.   {"abort-slave-event-count",      required_argument, 0,
  398.      (int) OPT_ABORT_SLAVE_EVENT_COUNT},
  399. #if !defined(DBUG_OFF) && defined(SAFEMALLOC)
  400.   {"safemalloc-mem-limit",  required_argument, 0, (int)
  401.      OPT_SAFEMALLOC_MEM_LIMIT},
  402. #endif    
  403.   {"new",                   no_argument,       0, 'n'},
  404.   {"old-protocol",          no_argument,       0, 'o'},
  405. #ifdef ONE_THREAD
  406.   {"one-thread",            no_argument,       0, (int) OPT_ONE_THREAD},
  407. #endif
  408.   {"pid-file",              required_argument, 0, (int) OPT_PID_FILE},
  409.   {"port",                  required_argument, 0, 'P'},
  410.   {"replicate-do-db",       required_argument, 0, (int) OPT_REPLICATE_DO_DB},
  411.   {"replicate-do-table",       required_argument, 0,
  412.    (int) OPT_REPLICATE_DO_TABLE},
  413.   {"replicate-wild-do-table",       required_argument, 0,
  414.    (int) OPT_REPLICATE_WILD_DO_TABLE},
  415.   {"replicate-ignore-db",   required_argument, 0,
  416.    (int) OPT_REPLICATE_IGNORE_DB},
  417.   {"replicate-ignore-table",   required_argument, 0,
  418.    (int) OPT_REPLICATE_IGNORE_TABLE},
  419.   {"replicate-wild-ignore-table",   required_argument, 0,
  420.    (int) OPT_REPLICATE_WILD_IGNORE_TABLE},
  421.   {"replicate-rewrite-db",   required_argument, 0,
  422.      (int) OPT_REPLICATE_REWRITE_DB},
  423.   {"safe-mode",             no_argument,       0, (int) OPT_SAFE},
  424.   {"safe-show-database",    no_argument,       0, (int) OPT_SAFE_SHOW_DB},
  425.   {"socket",                required_argument, 0, (int) OPT_SOCKET},
  426.   {"server-id",     required_argument, 0, (int) OPT_SERVER_ID},
  427.   {"set-variable",          required_argument, 0, 'O'},
  428.   {"skip-bdb",              no_argument,       0, (int) OPT_BDB_SKIP},
  429.   {"skip-innobase",         no_argument,       0, (int) OPT_INNOBASE_SKIP},
  430.   {"skip-gemini",           no_argument,       0, (int) OPT_GEMINI_SKIP},
  431.   {"skip-concurrent-insert", no_argument,      0, (int) OPT_SKIP_CONCURRENT_INSERT},
  432.   {"skip-delay-key-write",  no_argument,       0, (int) OPT_SKIP_DELAY_KEY_WRITE},
  433.   {"skip-grant-tables",     no_argument,       0, (int) OPT_SKIP_GRANT},
  434.   {"skip-locking",          no_argument,       0, (int) OPT_SKIP_LOCK},
  435.   {"skip-host-cache",       no_argument,       0, (int) OPT_SKIP_HOST_CACHE},
  436.   {"skip-name-resolve",     no_argument,       0, (int) OPT_SKIP_RESOLVE},
  437.   {"skip-new",              no_argument,       0, (int) OPT_SKIP_NEW},
  438.   {"skip-show-database",    no_argument,       0, (int) OPT_SKIP_SHOW_DB},
  439.   {"skip-slave-start",      no_argument,       0, (int) OPT_SKIP_SLAVE_START},
  440.   {"skip-networking",       no_argument,       0, (int) OPT_SKIP_NETWORKING},
  441.   {"skip-thread-priority",  no_argument,       0, (int) OPT_SKIP_PRIOR},
  442.   {"sql-bin-update-same",   no_argument,       0, (int) OPT_SQL_BIN_UPDATE_SAME},
  443. #include "sslopt-longopts.h"
  444. #ifdef __WIN__
  445.   {"standalone",            no_argument,       0, (int) OPT_STANDALONE},
  446. #endif
  447.   {"temp-pool",             no_argument,       0, (int) OPT_TEMP_POOL},
  448.   {"tmpdir",                required_argument, 0, 't'},
  449.   {"use-locking",           no_argument,       0, (int) OPT_USE_LOCKING},
  450. #ifdef USE_SYMDIR
  451.   {"use-symbolic-links",    no_argument,       0, 's'},
  452. #endif
  453.   {"user",                  required_argument, 0, 'u'},
  454.   {"version",               no_argument,       0, 'V'},
  455.   {0, 0, 0, 0}
  456. };
  457. CHANGEABLE_VAR changeable_vars[] = {
  458.   { "back_log",                (long*) &back_log, 
  459.       50, 1, 65535, 0, 1 },
  460. #ifdef HAVE_BERKELEY_DB
  461.   { "bdb_cache_size",          (long*) &berkeley_cache_size, 
  462.       KEY_CACHE_SIZE, 20*1024, (long) ~0, 0, IO_SIZE },
  463.   {"bdb_log_buffer_size",      (long*) &berkeley_log_buffer_size, 0, 256*1024L,
  464.      ~0L, 0, 1024},
  465.   { "bdb_max_lock",            (long*) &berkeley_max_lock, 
  466.       10000, 0, (long) ~0, 0, 1 },
  467.     /* QQ: The following should be removed soon! */
  468.   { "bdb_lock_max",            (long*) &berkeley_max_lock, 
  469.       10000, 0, (long) ~0, 0, 1 },
  470. #endif
  471.   { "binlog_cache_size",       (long*) &binlog_cache_size,
  472.       32*1024L, IO_SIZE, ~0L, 0, IO_SIZE },
  473.   { "connect_timeout",         (long*) &connect_timeout,
  474.       CONNECT_TIMEOUT, 2, 65535, 0, 1 },
  475.   { "delayed_insert_timeout",  (long*) &delayed_insert_timeout, 
  476.       DELAYED_WAIT_TIMEOUT, 1, ~0L, 0, 1 },
  477.   { "delayed_insert_limit",    (long*) &delayed_insert_limit, 
  478.       DELAYED_LIMIT, 1, ~0L, 0, 1 },
  479.   { "delayed_queue_size",      (long*) &delayed_queue_size,
  480.       DELAYED_QUEUE_SIZE, 1, ~0L, 0, 1 },
  481.   { "flush_time",              (long*) &flush_time,
  482.       FLUSH_TIME, 0, ~0L, 0, 1 },
  483. #ifdef HAVE_INNOBASE_DB
  484.   {"innobase_mirrored_log_groups",
  485.    (long*) &innobase_mirrored_log_groups, 1, 1, 10, 0, 1},
  486.   {"innobase_log_files_in_group",
  487.      (long*) &innobase_log_files_in_group, 2, 2, 100, 0, 1},
  488.   {"innobase_log_file_size",
  489.      (long*) &innobase_log_file_size, 5*1024*1024L, 1*1024*1024L,
  490.      ~0L, 0, 1024*1024L},
  491.   {"innobase_log_buffer_size",
  492.      (long*) &innobase_log_buffer_size, 1024*1024L, 256*1024L,
  493.      ~0L, 0, 1024},
  494.   {"innobase_buffer_pool_size",
  495.      (long*) &innobase_buffer_pool_size, 8*1024*1024L, 1024*1024L,
  496.      ~0L, 0, 1024*1024L},
  497.   {"innobase_additional_mem_pool_size",
  498.    (long*) &innobase_additional_mem_pool_size, 1*1024*1024L, 512*1024L,
  499.      ~0L, 0, 1024},
  500.   {"innobase_file_io_threads",
  501.      (long*) &innobase_file_io_threads, 9, 4, 64, 0, 1},
  502.   {"innobase_lock_wait_timeout",
  503.      (long*) &innobase_lock_wait_timeout, 1024 * 1024 * 1024, 1,
  504. 1024 * 1024 * 1024, 0, 1},
  505. #endif
  506.   { "interactive_timeout",     (long*) &net_interactive_timeout,
  507.       NET_WAIT_TIMEOUT, 1, 31*24*60*60, 0, 1 },
  508.   { "join_buffer_size",        (long*) &join_buff_size,
  509.       128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_SIZE },
  510.   { "key_buffer_size",         (long*) &keybuff_size,
  511.       KEY_CACHE_SIZE, MALLOC_OVERHEAD, (long) ~0, MALLOC_OVERHEAD, IO_SIZE },
  512.   { "long_query_time",         (long*) &long_query_time,
  513.       10, 1, ~0L, 0, 1 },
  514.   { "lower_case_table_names",  (long*) &lower_case_table_names,
  515.       IF_WIN(1,0), 0, 1, 0, 1 },
  516.   { "max_allowed_packet",      (long*) &max_allowed_packet,
  517.       1024*1024L, 80, 64*1024*1024L, MALLOC_OVERHEAD, 1024 },
  518.   { "max_binlog_cache_size",   (long*) &max_binlog_cache_size,
  519.       ~0L, IO_SIZE, ~0L, 0, IO_SIZE },
  520.   { "max_binlog_size",         (long*) &max_binlog_size,
  521.       1024*1024L*1024L, 1024, 1024*1024L*1024L, 0, 1 },
  522.   { "max_connections",         (long*) &max_connections,
  523.       100, 1, 16384, 0, 1 },
  524.   { "max_connect_errors",      (long*) &max_connect_errors,
  525.       MAX_CONNECT_ERRORS, 1, ~0L, 0, 1 },
  526.   { "max_delayed_threads",     (long*) &max_insert_delayed_threads,
  527.       20, 1, 16384, 0, 1 },
  528.   { "max_heap_table_size",     (long*) &max_heap_table_size,
  529.       16*1024*1024L, 16384, ~0L, MALLOC_OVERHEAD, 1024 },
  530.   { "max_join_size",           (long*) &max_join_size,
  531.       ~0L, 1, ~0L, 0, 1 },
  532.   { "max_sort_length",         (long*) &max_item_sort_length,
  533.       1024, 4, 8192*1024L, 0, 1 },
  534.   { "max_tmp_tables",          (long*) &max_tmp_tables,
  535.       32, 1, ~0L, 0, 1 },
  536.   { "max_user_connections",       (long*) &max_user_connections,
  537.       0, 1, ~0L, 0, 1 },
  538.   { "max_write_lock_count",    (long*) &max_write_lock_count,
  539.       ~0L, 1, ~0L, 0, 1 },
  540.   { "myisam_sort_buffer_size", (long*) &myisam_sort_buffer_size,
  541.       8192*1024, 4, ~0L, 0, 1 },
  542.   { "net_buffer_length",       (long*) &net_buffer_length,
  543.       16384, 1024, 1024*1024L, MALLOC_OVERHEAD, 1024 },
  544.   { "net_retry_count",         (long*) &mysqld_net_retry_count,
  545.       MYSQLD_NET_RETRY_COUNT, 1, ~0L, 0, 1 },
  546.   { "net_read_timeout",        (long*) &net_read_timeout, 
  547.       NET_READ_TIMEOUT, 1, 65535, 0, 1 },
  548.   { "net_write_timeout",       (long*) &net_write_timeout,
  549.       NET_WRITE_TIMEOUT, 1, 65535, 0, 1 },
  550.   { "open_files_limit",        (long*) &open_files_limit,
  551.       0, 0, 65535, 0, 1},
  552.   { "query_buffer_size",       (long*) &query_buff_size,
  553.       0, MALLOC_OVERHEAD, (long) ~0, MALLOC_OVERHEAD, IO_SIZE },
  554.   { "record_buffer",           (long*) &my_default_record_cache_size,
  555.       128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_SIZE },
  556.   { "slow_launch_time",        (long*) &slow_launch_time, 
  557.       2L, 0L, ~0L, 0, 1 },
  558.   { "sort_buffer",             (long*) &sortbuff_size,
  559.       MAX_SORT_MEMORY, MIN_SORT_MEMORY+MALLOC_OVERHEAD*2, ~0L, MALLOC_OVERHEAD, 1 },
  560.   { "table_cache",             (long*) &table_cache_size,
  561.       64, 1, 16384, 0, 1 },
  562.   { "thread_concurrency",      (long*) &concurrency,
  563.       DEFAULT_CONCURRENCY, 1, 512, 0, 1 },
  564.   { "thread_cache_size",       (long*) &thread_cache_size,
  565.       0, 0, 16384, 0, 1 },
  566.   { "tmp_table_size",          (long*) &tmp_table_size,
  567.       1024*1024L, 1024, ~0L, MALLOC_OVERHEAD, 1 },
  568.   { "thread_stack",            (long*) &thread_stack,
  569.       DEFAULT_THREAD_STACK, 1024*32, ~0L, 0, 1024 },
  570.   { "wait_timeout",            (long*) &net_wait_timeout,
  571.       NET_WAIT_TIMEOUT, 1, ~0L, 0, 1 },
  572.   { NullS, (long*) 0, 0, 0, 0, 0, 0}
  573. };
  574. struct show_var_st init_vars[]= {
  575.   {"ansi_mode",               (char*) &opt_ansi_mode,               SHOW_BOOL},
  576.   {"back_log",                (char*) &back_log,                    SHOW_LONG},
  577.   {"basedir",                 mysql_home,                           SHOW_CHAR},
  578. #ifdef HAVE_BERKELEY_DB
  579.   {"bdb_cache_size",          (char*) &berkeley_cache_size,         SHOW_LONG},
  580.   {"bdb_log_buffer_size",     (char*) &berkeley_log_buffer_size,    SHOW_LONG},
  581.   {"bdb_home",                (char*) &berkeley_home,               SHOW_CHAR_PTR},
  582.   {"bdb_max_lock",            (char*) &berkeley_max_lock,     SHOW_LONG},
  583.   {"bdb_logdir",              (char*) &berkeley_logdir,             SHOW_CHAR_PTR},
  584.   {"bdb_shared_data",       (char*) &berkeley_shared_data,     SHOW_BOOL},
  585.   {"bdb_tmpdir",              (char*) &berkeley_tmpdir,             SHOW_CHAR_PTR},
  586.   {"bdb_version",             (char*) DB_VERSION_STRING,            SHOW_CHAR},
  587. #endif
  588.   {"binlog_cache_size",       (char*) &binlog_cache_size,     SHOW_LONG},
  589.   {"character_set",           default_charset,                      SHOW_CHAR},
  590.   {"character_sets",          (char*) &charsets_list,               SHOW_CHAR_PTR},
  591.   {"concurrent_insert",       (char*) &myisam_concurrent_insert,    SHOW_MY_BOOL},
  592.   {"connect_timeout",         (char*) &connect_timeout,             SHOW_LONG},
  593.   {"datadir",                 mysql_real_data_home,                 SHOW_CHAR},
  594.   {"delay_key_write",         (char*) &myisam_delay_key_write,      SHOW_MY_BOOL},
  595.   {"delayed_insert_limit",    (char*) &delayed_insert_limit,        SHOW_LONG},
  596.   {"delayed_insert_timeout",  (char*) &delayed_insert_timeout,      SHOW_LONG},
  597.   {"delayed_queue_size",      (char*) &delayed_queue_size,          SHOW_LONG},
  598.   {"flush",                   (char*) &myisam_flush,                SHOW_MY_BOOL},
  599.   {"flush_time",              (char*) &flush_time,                  SHOW_LONG},
  600.   {"have_bdb",       (char*) &have_berkeley_db,     SHOW_HAVE},
  601.   {"have_gemini",       (char*) &have_gemini,     SHOW_HAVE},
  602.   {"have_innobase",       (char*) &have_innobase,     SHOW_HAVE},
  603.   {"have_isam",              (char*) &have_isam,     SHOW_HAVE},
  604.   {"have_raid",       (char*) &have_raid,     SHOW_HAVE},
  605.   {"have_ssl",       (char*) &have_ssl,     SHOW_HAVE},
  606.   {"init_file",               (char*) &opt_init_file,               SHOW_CHAR_PTR},
  607. #ifdef HAVE_INNOBASE_DB
  608.   {"innobase_data_file_path", (char*) &innobase_data_file_path,     SHOW_CHAR_PTR},
  609.   {"innobase_data_home_dir",  (char*) &innobase_data_home_dir,     SHOW_CHAR_PTR},
  610.   {"innobase_flush_log_at_trx_commit", (char*) &innobase_flush_log_at_trx_commit, SHOW_MY_BOOL},
  611.   {"innobase_log_arch_dir",   (char*) &innobase_log_arch_dir,      SHOW_CHAR_PTR},
  612.   {"innobase_log_archive",    (char*) &innobase_log_archive,      SHOW_MY_BOOL},
  613.   {"innobase_log_group_home_dir", (char*) &innobase_log_group_home_dir, SHOW_CHAR_PTR},
  614. #endif
  615.   {"interactive_timeout",     (char*) &net_interactive_timeout,     SHOW_LONG},
  616.   {"join_buffer_size",        (char*) &join_buff_size,              SHOW_LONG},
  617.   {"key_buffer_size",         (char*) &keybuff_size,                SHOW_LONG},
  618.   {"language",                language,                             SHOW_CHAR},
  619.   {"large_files_support",     (char*) &opt_large_files,             SHOW_BOOL},
  620. #ifdef HAVE_MLOCKALL
  621.   {"locked_in_memory",       (char*) &locked_in_memory,     SHOW_BOOL},
  622. #endif
  623.   {"log",                     (char*) &opt_log,                     SHOW_BOOL},
  624.   {"log_update",              (char*) &opt_update_log,              SHOW_BOOL},
  625.   {"log_bin",                 (char*) &opt_bin_log,                 SHOW_BOOL},
  626.   {"log_slave_updates",       (char*) &opt_log_slave_updates,       SHOW_BOOL},
  627.   {"long_query_time",         (char*) &long_query_time,             SHOW_LONG},
  628.   {"low_priority_updates",    (char*) &low_priority_updates,        SHOW_BOOL},
  629.   {"lower_case_table_names",  (char*) &lower_case_table_names,      SHOW_LONG},
  630.   {"max_allowed_packet",      (char*) &max_allowed_packet,          SHOW_LONG},
  631.   {"max_binlog_cache_size",   (char*) &max_binlog_cache_size,     SHOW_LONG},
  632.   {"max_binlog_size",         (char*) &max_binlog_size,             SHOW_LONG},
  633.   {"max_connections",         (char*) &max_connections,             SHOW_LONG},
  634.   {"max_connect_errors",      (char*) &max_connect_errors,          SHOW_LONG},
  635.   {"max_delayed_threads",     (char*) &max_insert_delayed_threads,  SHOW_LONG},
  636.   {"max_heap_table_size",     (char*) &max_heap_table_size,         SHOW_LONG},
  637.   {"max_join_size",           (char*) &max_join_size,               SHOW_LONG},
  638.   {"max_sort_length",         (char*) &max_item_sort_length,        SHOW_LONG},
  639.   {"max_user_connections",    (char*) &max_user_connections,        SHOW_LONG},
  640.   {"max_tmp_tables",          (char*) &max_tmp_tables,              SHOW_LONG},
  641.   {"max_write_lock_count",    (char*) &max_write_lock_count,        SHOW_LONG},
  642.   {"myisam_recover_options",  (char*) &myisam_recover_options_str,  SHOW_CHAR_PTR},
  643.   {"myisam_sort_buffer_size", (char*) &myisam_sort_buffer_size,     SHOW_LONG},
  644.   {"net_buffer_length",       (char*) &net_buffer_length,           SHOW_LONG},
  645.   {"net_read_timeout",        (char*) &net_read_timeout,     SHOW_LONG},
  646.   {"net_retry_count",         (char*) &mysqld_net_retry_count,      SHOW_LONG},
  647.   {"net_write_timeout",       (char*) &net_write_timeout,     SHOW_LONG},
  648.   {"open_files_limit",       (char*) &open_files_limit,     SHOW_LONG},
  649.   {"pid_file",                (char*) pidfile_name,                 SHOW_CHAR},
  650.   {"port",                    (char*) &mysql_port,                  SHOW_INT},
  651.   {"protocol_version",        (char*) &protocol_version,            SHOW_INT},
  652.   {"record_buffer",           (char*) &my_default_record_cache_size,SHOW_LONG},
  653.   {"query_buffer_size",       (char*) &query_buff_size,     SHOW_LONG},
  654.   {"safe_show_database",      (char*) &opt_safe_show_db,            SHOW_BOOL},
  655.   {"server_id",               (char*) &server_id,     SHOW_LONG},
  656.   {"skip_locking",            (char*) &my_disable_locking,          SHOW_MY_BOOL},
  657.   {"skip_networking",         (char*) &opt_disable_networking,      SHOW_BOOL},
  658.   {"skip_show_database",      (char*) &opt_skip_show_db,            SHOW_BOOL},
  659.   {"slow_launch_time",        (char*) &slow_launch_time,            SHOW_LONG},
  660.   {"socket",                  (char*) &mysql_unix_port,             SHOW_CHAR_PTR},
  661.   {"sort_buffer",             (char*) &sortbuff_size,               SHOW_LONG},
  662.   {"table_cache",             (char*) &table_cache_size,            SHOW_LONG},
  663.   {"table_type",              (char*) &default_table_type_name,     SHOW_CHAR_PTR},
  664.   {"thread_cache_size",       (char*) &thread_cache_size,           SHOW_LONG},
  665. #ifdef HAVE_THR_SETCONCURRENCY
  666.   {"thread_concurrency",      (char*) &concurrency,                 SHOW_LONG},
  667. #endif
  668.   {"thread_stack",            (char*) &thread_stack,                SHOW_LONG},
  669. #ifdef HAVE_TZNAME
  670.   {"timezone",                time_zone,                            SHOW_CHAR},
  671. #endif
  672.   {"tmp_table_size",          (char*) &tmp_table_size,              SHOW_LONG},
  673.   {"tmpdir",                  (char*) &mysql_tmpdir,                SHOW_CHAR_PTR},
  674.   {"version",                 server_version,                       SHOW_CHAR},
  675.   {"wait_timeout",            (char*) &net_wait_timeout,            SHOW_LONG},
  676.   {NullS, NullS, SHOW_LONG}
  677. };
  678. struct show_var_st status_vars[]= {
  679.   {"Aborted_clients",          (char*) &aborted_threads,        SHOW_LONG},
  680.   {"Aborted_connects",         (char*) &aborted_connects,       SHOW_LONG},
  681.   {"Bytes_received",           (char*) &bytes_received,         SHOW_LONG},
  682.   {"Bytes_sent",               (char*) &bytes_sent,             SHOW_LONG},
  683.   {"Connections",              (char*) &thread_id,              SHOW_LONG_CONST},
  684.   {"Created_tmp_disk_tables",  (char*) &created_tmp_disk_tables,SHOW_LONG},
  685.   {"Created_tmp_tables",       (char*) &created_tmp_tables,     SHOW_LONG},
  686.   {"Created_tmp_files",        (char*) &my_tmp_file_created, SHOW_LONG},
  687.   {"Delayed_insert_threads",   (char*) &delayed_insert_threads, SHOW_LONG},
  688.   {"Delayed_writes",           (char*) &delayed_insert_writes,  SHOW_LONG},
  689.   {"Delayed_errors",           (char*) &delayed_insert_errors,  SHOW_LONG},
  690.   {"Flush_commands",           (char*) &refresh_version,        SHOW_LONG_CONST},
  691.   {"Handler_delete",           (char*) &ha_delete_count,        SHOW_LONG},
  692.   {"Handler_read_first",       (char*) &ha_read_first_count,    SHOW_LONG},
  693.   {"Handler_read_key",         (char*) &ha_read_key_count,      SHOW_LONG},
  694.   {"Handler_read_next",        (char*) &ha_read_next_count,     SHOW_LONG},
  695.   {"Handler_read_prev",        (char*) &ha_read_prev_count,     SHOW_LONG},
  696.   {"Handler_read_rnd",         (char*) &ha_read_rnd_count,      SHOW_LONG},
  697.   {"Handler_read_rnd_next",    (char*) &ha_read_rnd_next_count, SHOW_LONG},
  698.   {"Handler_update",           (char*) &ha_update_count,        SHOW_LONG},
  699.   {"Handler_write",            (char*) &ha_write_count,         SHOW_LONG},
  700.   {"Key_blocks_used",          (char*) &_my_blocks_used,        SHOW_LONG_CONST},
  701.   {"Key_read_requests",        (char*) &_my_cache_r_requests,   SHOW_LONG},
  702.   {"Key_reads",                (char*) &_my_cache_read,         SHOW_LONG},
  703.   {"Key_write_requests",       (char*) &_my_cache_w_requests,   SHOW_LONG},
  704.   {"Key_writes",               (char*) &_my_cache_write,        SHOW_LONG},
  705.   {"Max_used_connections",     (char*) &max_used_connections,   SHOW_LONG},
  706.   {"Not_flushed_key_blocks",   (char*) &_my_blocks_changed,     SHOW_LONG_CONST},
  707.   {"Not_flushed_delayed_rows", (char*) &delayed_rows_in_use,    SHOW_LONG_CONST},
  708.   {"Open_tables",              (char*) 0,                       SHOW_OPENTABLES},
  709.   {"Open_files",               (char*) &my_file_opened,         SHOW_INT_CONST},
  710.   {"Open_streams",             (char*) &my_stream_opened,       SHOW_INT_CONST},
  711.   {"Opened_tables",            (char*) &opened_tables,          SHOW_LONG},
  712.   {"Questions",                (char*) 0,                       SHOW_QUESTION},
  713.   {"Select_full_join",         (char*) &select_full_join_count, SHOW_LONG},
  714.   {"Select_full_range_join",   (char*) &select_full_range_join_count, SHOW_LONG},
  715.   {"Select_range",             (char*) &select_range_count,  SHOW_LONG},
  716.   {"Select_range_check",       (char*) &select_range_check_count, SHOW_LONG},
  717.   {"Select_scan",        (char*) &select_scan_count, SHOW_LONG},
  718.   {"Slave_running",            (char*) &slave_running,          SHOW_BOOL},
  719.   {"Slave_open_temp_tables",   (char*) &slave_open_temp_tables, SHOW_LONG},
  720.   {"Slow_launch_threads",      (char*) &slow_launch_threads,    SHOW_LONG},
  721.   {"Slow_queries",             (char*) &long_query_count,       SHOW_LONG},
  722.   {"Sort_merge_passes",        (char*) &filesort_merge_passes,  SHOW_LONG},
  723.   {"Sort_range",        (char*) &filesort_range_count,   SHOW_LONG},
  724.   {"Sort_rows",        (char*) &filesort_rows,         SHOW_LONG},
  725.   {"Sort_scan",        (char*) &filesort_scan_count,    SHOW_LONG},
  726.   {"Table_locks_immediate",    (char*) &locks_immediate,        SHOW_LONG},
  727.   {"Table_locks_waited",       (char*) &locks_waited,           SHOW_LONG},
  728.   {"Threads_cached",           (char*) &cached_thread_count,    SHOW_LONG_CONST},
  729.   {"Threads_created",        (char*) &thread_created, SHOW_LONG_CONST},
  730.   {"Threads_connected",        (char*) &thread_count,           SHOW_INT_CONST},
  731.   {"Threads_running",          (char*) &thread_running,         SHOW_INT_CONST},
  732.   {"Uptime",                   (char*) 0,                       SHOW_STARTTIME},
  733.   {NullS, NullS, SHOW_LONG}
  734. };
  735. static void print_version(void)
  736. {
  737.   printf("%s  Ver %s for %s on %sn",my_progname,
  738.  server_version,SYSTEM_TYPE,MACHINE_TYPE);
  739. }
  740. static void use_help(void)
  741. {
  742.   print_version();
  743.   printf("Use '--help' or '--no-defaults --help' for a list of available optionsn");
  744. }  
  745. static void usage(void)
  746. {
  747.   print_version();
  748.   puts("Copyright (C) 2000 MySQL AB & MySQL Finland AB, by Monty and others");
  749.   puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,");
  750.   puts("and you are welcome to modify and redistribute it under the GPL licensen");
  751.   puts("Starts the MySQL servern");
  752.   printf("Usage: %s [OPTIONS]n", my_progname);
  753.   puts("n
  754.   --ansi Use ANSI SQL syntax instead of MySQL syntaxn
  755.   -b, --basedir=path Path to installation directory. All paths aren
  756. usually resolved relative to thisn
  757.   --big-tables Allow big result sets by saving all temporary setsn
  758. on file (Solves most 'table full' errors)n
  759.   --bind-address=IP Ip address to bind ton
  760.   --bootstrap Used by mysql installation scriptsn
  761.   --character-sets-dir=...n
  762.                         Directory where character sets aren
  763.   --chroot=path Chroot mysqld daemon during startupn
  764.   --core-file Write core on errorsn
  765.   -h, --datadir=path Path to the database root");
  766. #ifndef DBUG_OFF
  767.   printf("
  768.   -#, --debug[=...]     Debug log. Default is '%s'n",default_dbug_option);
  769. #endif
  770.   puts("
  771.   --default-character-set=charsetn
  772. Set the default character setn
  773.   --default-table-type=typen
  774. Set the default table type for tablesn
  775.   --delay-key-write-for-all-tablesn
  776. Don't flush key buffers between writes for any MyISAMn
  777. tablen
  778.   --enable-locking Enable system lockingn
  779.   -T, --exit-info Used for debugging;  Use at your own risk!n
  780.   --flush Flush tables to disk between SQL commandsn
  781.   -?, --help Display this help and exitn
  782.   --init-file=file Read SQL commands from this file at startupn
  783.   -L, --language=... Client error messages in given language. May ben
  784. given as a full pathn
  785.   -l, --log[=file] Log connections and queries to filen
  786.   --log-bin[=file]      Log queries in new binary format (for replication)n
  787.   --log-bin-index=file  File that holds the names for last binary log filesn
  788.   --log-update[=file] Log updates to file.# where # is a unique numbern
  789. if not given.n
  790.   --log-isam[=file] Log all MyISAM changes to filen
  791.   --log-long-format Log some extra information to update logn
  792.   --low-priority-updates INSERT/DELETE/UPDATE has lower priority than selectsn
  793.   --log-slow-queries=[file]n
  794. Log slow queries to this log file.  Defaults loggingn
  795.                         to hostname-slow.logn
  796.   --pid-file=path Pid file used by safe_mysqldn
  797.   --myisam-recover[=option[,option...]] where options is one of DEAULT,n
  798. BACKUP or FORCE.n
  799.   --memlock Lock mysqld in memoryn
  800.   -n, --new Use very new possible 'unsafe' functionsn
  801.   -o, --old-protocol Use the old (3.20) protocoln
  802.   -P, --port=... Port number to use for connectionn");
  803. #ifdef ONE_THREAD
  804.   puts("
  805.   --one-thread Only use one thread (for debugging under Linux)n");
  806. #endif
  807.   puts("
  808.   -O, --set-variable var=optionn
  809. Give a variable an value. --help lists variablesn
  810.   -Sg, --skip-grant-tablesn
  811. Start without grant tables. This gives all usersn
  812. FULL ACCESS to all tables!n
  813.   --safe-mode Skip some optimize stages (for testing)n
  814.   --skip-concurrent-insertn
  815.         Don't use concurrent insert with MyISAMn
  816.   --skip-delay-key-writen
  817. Ignore the delay_key_write option for all tablesn
  818.   --skip-locking Don't use system locking. To use isamchk one hasn
  819. to shut down the server.n
  820.   --skip-name-resolve Don't resolve hostnames.n
  821. All hostnames are IP's or 'localhost'n
  822.   --skip-networking Don't allow connection with TCP/IP.n
  823.   --skip-new Don't use new, possible wrong routines.n
  824.   --skip-host-cache Don't cache host namesn");
  825.   /* We have to break the string here because of VC++ limits */
  826.   puts("
  827.   --skip-show-database  Don't allow 'SHOW DATABASE' commandsn
  828.   --skip-thread-priorityn
  829. Don't give threads different priorities.n
  830.   --socket=... Socket file to use for connectionn
  831.   -t, --tmpdir=path Path for temporary filesn
  832.   --temp-pool           Use a pool of temporary filesn
  833.   -u, --user=user_name Run mysqld daemon as usern
  834.   -V, --version output version information and exit");
  835. #ifdef __WIN__
  836.   puts("NT and Win32 specific options:n
  837.   --console Don't remove the console windown
  838.   --install Install mysqld as a service (NT)n
  839.   --remove Remove mysqld from the service list (NT)n
  840.   --standalone Dummy option to start as a standalone program (NT)n
  841. ");
  842. #endif
  843. #ifdef HAVE_BERKELEY_DB
  844.   puts("
  845.   --bdb-home=  directory  Berkeley home direcoryn
  846.   --bdb-lock-detect=#   Berkeley lock detectn
  847.                           (DEFAULT, OLDEST, RANDOM or YOUNGEST, # sec)n
  848.   --bdb-logdir=directory  Berkeley DB log file directoryn
  849.   --bdb-no-sync   Don't synchronously flush logsn
  850.   --bdb-no-recover   Don't try to recover Berkeley DB tables on startn
  851.   --bdb-shared-data   Start Berkeley DB in multi-process moden
  852.   --bdb-tmpdir=directory  Berkeley DB tempfile namen
  853.   --skip-bdb   Don't use berkeley db (will save memory)n
  854. ");
  855. #endif /* HAVE_BERKELEY_DB */
  856. #ifdef HAVE_INNOBASE_DB
  857.   puts("
  858.   --innobase_data_home_dir=dir   The common part for innobase table spacesn
  859.   --innobase_data_file_path=dir  Path to individual files and their sizesn
  860.   --innobase_flush_log_at_trx_commit[=#]
  861.  Set to 0 if you don't want to flush logsn
  862.   --innobase_log_arch_dir=dir  Where full logs should be archivedn
  863.   --innobase_log_archive[=#]  Set to 1 if you want to have logs archivedn
  864.   --innobase_log_group_home_dir=dir  Path to Innobase log files.
  865.   --skip-innobase          Don't use innobase (will save memory)n
  866. ");
  867. #endif /* HAVE_INNOBASE_DB */
  868.   print_defaults("my",load_default_groups);
  869.   puts("");
  870. #include "sslopt-usage.h"
  871.   fix_paths();
  872.   set_ports();
  873.   printf("
  874. To see what values a running MySQL server is using, typen
  875. 'mysqladmin variables' instead of 'mysqld --help'.n
  876. The default values (after parsing the command line arguments) are:nn");
  877.   printf("basedir:     %sn",mysql_home);
  878.   printf("datadir:     %sn",mysql_real_data_home);
  879.   printf("tmpdir:      %sn",mysql_tmpdir);
  880.   printf("language:    %sn",language);
  881. #ifndef __WIN__
  882.   printf("pid file:    %sn",pidfile_name);
  883. #endif
  884.   if (opt_logname)
  885.     printf("logfile:     %sn",opt_logname);
  886.   if (opt_update_logname)
  887.     printf("update log:  %sn",opt_update_logname);
  888.   if (opt_bin_log)
  889.   {
  890.     printf("binary log:  %sn",opt_bin_logname ? opt_bin_logname : "");
  891.     printf("binary log index:  %sn",
  892.    opt_binlog_index_name ? opt_binlog_index_name : "");
  893.   }
  894.   if (opt_slow_logname)
  895.     printf("update log:  %sn",opt_slow_logname);
  896.   printf("TCP port:    %dn",mysql_port);
  897. #if defined(HAVE_SYS_UN_H)
  898.   printf("Unix socket: %sn",mysql_unix_port);
  899. #endif
  900.   if (my_disable_locking)
  901.     puts("nsystem locking is not in use");
  902.   if (opt_noacl)
  903.     puts("nGrant tables are not used. All users have full access rights");
  904.   printf("nPossible variables for option --set-variable (-O) are:n");
  905.   for (uint i=0 ; changeable_vars[i].name ; i++)
  906.     printf("%-20s  current value: %lun",
  907.    changeable_vars[i].name,
  908.    (ulong) *changeable_vars[i].varptr);
  909. }
  910. static void set_options(void)
  911. {
  912.   set_all_changeable_vars( changeable_vars );
  913. #if !defined( my_pthread_setprio ) && !defined( HAVE_PTHREAD_SETSCHEDPARAM )
  914.   opt_specialflag |= SPECIAL_NO_PRIOR;
  915. #endif
  916.   (void) strmov( default_charset, MYSQL_CHARSET);
  917.   (void) strmov( language, LANGUAGE);
  918.   (void) strmov( mysql_real_data_home, get_relative_path(DATADIR));
  919. #ifdef __WIN__
  920.   /* Allow Win32 users to move MySQL anywhere */
  921.   {
  922.     char prg_dev[LIBLEN];
  923.     my_path(prg_dev,my_progname,"mysql/bin");
  924.     strcat(prg_dev,"/../"); // Remove 'bin' to get base dir
  925.     cleanup_dirname(mysql_home,prg_dev);
  926.   }
  927. #else
  928.   const char *tmpenv;
  929.   if ( !(tmpenv = getenv("MY_BASEDIR_VERSION")))
  930.     tmpenv = DEFAULT_MYSQL_HOME;
  931.   (void) strmov( mysql_home, tmpenv );
  932. #endif
  933. #if defined( HAVE_mit_thread ) || defined( __WIN__ ) || defined( HAVE_LINUXTHREADS )
  934.   my_disable_locking = 1;
  935. #endif
  936.   my_bind_addr = htonl( INADDR_ANY );
  937. }
  938. /* Initiates DEBUG - but no debugging here ! */
  939. static void get_options(int argc,char **argv)
  940. {
  941.   int c,option_index=0;
  942.   myisam_delay_key_write=1; // Allow use of this
  943.   while ((c=getopt_long(argc,argv,"ab:C:h:#::T::?l::L:O:P:sS::t:u:noVvI?",
  944. long_options, &option_index)) != EOF)
  945.   {
  946.     switch(c) {
  947. #ifndef DBUG_OFF
  948.     case '#':
  949.       DBUG_PUSH(optarg ? optarg : default_dbug_option);
  950.       opt_endinfo=1; /* unireg: memory allocation */
  951.       break;
  952. #endif
  953.     case 'a':
  954.       opt_ansi_mode=1;
  955.       thd_startup_options|=OPTION_ANSI_MODE;
  956.       break;
  957.     case 'b':
  958.       strmov(mysql_home,optarg);
  959.       break;
  960.     case 'l':
  961.       opt_log=1;
  962.       opt_logname=optarg; // Use hostname.log if null
  963.       break;
  964.     case 'h':
  965.       strmov(mysql_real_data_home,optarg);
  966.       break;
  967.     case 'L':
  968.       strmov(language,optarg);
  969.       break;
  970.     case 'n':
  971.       opt_specialflag|= SPECIAL_NEW_FUNC;
  972.       break;
  973.     case 'o':
  974.       protocol_version=PROTOCOL_VERSION-1;
  975.       break;
  976.     case 'O':
  977.       if (set_changeable_var(optarg, changeable_vars))
  978.       {
  979. use_help();
  980. exit(1);
  981.       }
  982.       break;
  983.     case 'P':
  984.       mysql_port= (unsigned int) atoi(optarg);
  985.       break;
  986. #if !defined(DBUG_OFF) && defined(SAFEMALLOC)      
  987.     case OPT_SAFEMALLOC_MEM_LIMIT:
  988.       safemalloc_mem_limit = atoi(optarg);
  989.       break;
  990. #endif      
  991.     case OPT_SOCKET:
  992.       mysql_unix_port= optarg;
  993.       break;
  994.     case 'r':
  995.       mysqld_chroot=optarg;
  996.       break;
  997. #ifdef USE_SYMDIR
  998.     case 's':
  999.       my_use_symdir=1; /* Use internal symbolic links */
  1000.       break;
  1001. #endif
  1002.     case 't':
  1003.       mysql_tmpdir=optarg;
  1004.       break;
  1005.     case OPT_TEMP_POOL:
  1006.       use_temp_pool=1;
  1007.       break;
  1008.     case 'u':
  1009.       mysqld_user=optarg;
  1010.       break;
  1011.     case 'v':
  1012.     case 'V':
  1013.       print_version();
  1014.       exit(0);
  1015.     case 'I':
  1016.     case '?':
  1017.       usage();
  1018.       exit(0);
  1019.     case 'T':
  1020.       test_flags= optarg ? (uint) atoi(optarg) : 0;
  1021.       opt_endinfo=1;
  1022.       break;
  1023.     case 'S':
  1024.       if (!optarg)
  1025. opt_specialflag|= SPECIAL_NO_NEW_FUNC | SPECIAL_SAFE_MODE;
  1026.       else if (!strcmp(optarg,"l"))
  1027. my_disable_locking=1;
  1028.       else if (!strcmp(optarg,"g"))
  1029. opt_noacl=1;
  1030.       else
  1031.       {
  1032. fprintf(stderr,"%s: Unrecognized option: %sn",my_progname,optarg);
  1033. use_help();
  1034. exit(1);
  1035.       }
  1036.       break;
  1037.     case (int) OPT_BIG_TABLES:
  1038.       thd_startup_options|=OPTION_BIG_TABLES;
  1039.       break;
  1040.     case (int) OPT_ISAM_LOG:
  1041.       opt_myisam_log=1;
  1042.       if (optarg)
  1043. myisam_log_filename=optarg;
  1044.       break;
  1045.     case (int) OPT_UPDATE_LOG:
  1046.       opt_update_log=1;
  1047.       opt_update_logname=optarg; // Use hostname.# if null
  1048.       break;
  1049.     case (int) OPT_BIN_LOG_INDEX:
  1050.       opt_binlog_index_name = optarg;
  1051.       break;
  1052.     case (int) OPT_BIN_LOG:
  1053.       opt_bin_log=1;
  1054.       x_free(opt_bin_logname);
  1055.       if (optarg && optarg[0])
  1056. opt_bin_logname=my_strdup(optarg,MYF(0));
  1057.       break;
  1058.       // needs to be handled (as no-op) in non-debugging mode for test suite
  1059.     case (int)OPT_DISCONNECT_SLAVE_EVENT_COUNT:
  1060. #ifndef DBUG_OFF      
  1061.       disconnect_slave_event_count = atoi(optarg);
  1062. #endif      
  1063.       break;
  1064.     case (int)OPT_ABORT_SLAVE_EVENT_COUNT:
  1065. #ifndef DBUG_OFF      
  1066.       abort_slave_event_count = atoi(optarg);
  1067. #endif      
  1068.       break;
  1069.     case (int) OPT_LOG_SLAVE_UPDATES:
  1070.       opt_log_slave_updates = 1;
  1071.       break;
  1072.     case (int)OPT_REPLICATE_IGNORE_DB:
  1073.       {
  1074. i_string *db = new i_string(optarg);
  1075. replicate_ignore_db.push_back(db);
  1076.         break;
  1077.       }
  1078.     case (int)OPT_REPLICATE_DO_DB:
  1079.       {
  1080. i_string *db = new i_string(optarg);
  1081. replicate_do_db.push_back(db);
  1082.         break;
  1083.       }
  1084.     case (int)OPT_REPLICATE_REWRITE_DB:
  1085.       {
  1086. char* key = optarg,*p, *val;
  1087. p = strstr(optarg, "->");
  1088. if (!p)
  1089.   {
  1090.     fprintf(stderr,
  1091.     "Bad syntax in replicate-rewrite-db - missing '->'!n");
  1092.     exit(1);
  1093.   }
  1094. val = p--;
  1095. while(isspace(*p) && p > optarg) *p-- = 0;
  1096. if(p == optarg)
  1097.   {
  1098.     fprintf(stderr,
  1099.     "Bad syntax in replicate-rewrite-db - empty FROM db!n");
  1100.     exit(1);
  1101.   }
  1102. *val = 0;
  1103. val += 2;
  1104. while(*val && isspace(*val)) *val++;
  1105. if (!*val)
  1106.   {
  1107.     fprintf(stderr,
  1108.     "Bad syntax in replicate-rewrite-db - empty TO db!n");
  1109.     exit(1);
  1110.   }
  1111. i_string_pair* db_pair = new i_string_pair(key, val);
  1112. replicate_rewrite_db.push_back(db_pair);
  1113. break;
  1114.       }
  1115.     case (int)OPT_BINLOG_IGNORE_DB:
  1116.       {
  1117. i_string *db = new i_string(optarg);
  1118. binlog_ignore_db.push_back(db);
  1119.         break;
  1120.       }
  1121.     case (int)OPT_BINLOG_DO_DB:
  1122.       {
  1123. i_string *db = new i_string(optarg);
  1124. binlog_do_db.push_back(db);
  1125.         break;
  1126.       }
  1127.     case (int)OPT_REPLICATE_DO_TABLE:
  1128.       {
  1129. if (!do_table_inited)
  1130.   init_table_rule_hash(&replicate_do_table, &do_table_inited);
  1131. if(add_table_rule(&replicate_do_table, optarg))
  1132.   {
  1133.     fprintf(stderr, "Could not add do table rule '%s'!n", optarg);
  1134.     exit(1);
  1135.   }
  1136. table_rules_on = 1;
  1137. break;
  1138.       }
  1139.     case (int)OPT_REPLICATE_WILD_DO_TABLE:
  1140.       {
  1141. if (!wild_do_table_inited)
  1142.   init_table_rule_array(&replicate_wild_do_table,
  1143. &wild_do_table_inited);
  1144. if(add_wild_table_rule(&replicate_wild_do_table, optarg))
  1145.   {
  1146.     fprintf(stderr, "Could not add do table rule '%s'!n", optarg);
  1147.     exit(1);
  1148.   }
  1149. table_rules_on = 1;
  1150. break;
  1151.       }
  1152.     case (int)OPT_REPLICATE_WILD_IGNORE_TABLE:
  1153.       {
  1154. if (!wild_ignore_table_inited)
  1155.   init_table_rule_array(&replicate_wild_ignore_table,
  1156. &wild_ignore_table_inited);
  1157. if(add_wild_table_rule(&replicate_wild_ignore_table, optarg))
  1158.   {
  1159.     fprintf(stderr, "Could not add ignore table rule '%s'!n", optarg);
  1160.     exit(1);
  1161.   }
  1162. table_rules_on = 1;
  1163. break;
  1164.       }
  1165.     case (int)OPT_REPLICATE_IGNORE_TABLE:
  1166.       {
  1167. if (!ignore_table_inited)
  1168.   init_table_rule_hash(&replicate_ignore_table, &ignore_table_inited);
  1169. if(add_table_rule(&replicate_ignore_table, optarg))
  1170.   {
  1171.     fprintf(stderr, "Could not add ignore table rule '%s'!n", optarg);
  1172.     exit(1);
  1173.   }
  1174. table_rules_on = 1;
  1175. break;
  1176.       }
  1177.     case (int) OPT_SQL_BIN_UPDATE_SAME:
  1178.       opt_sql_bin_update  = 1;
  1179.       break;
  1180.     case (int) OPT_SLOW_QUERY_LOG:
  1181.       opt_slow_log=1;
  1182.       opt_slow_logname=optarg;
  1183.       break;
  1184.     case (int)OPT_SKIP_SLAVE_START:
  1185.       opt_skip_slave_start = 1;
  1186.       break;
  1187.     case (int) OPT_SKIP_NEW:
  1188.       opt_specialflag|= SPECIAL_NO_NEW_FUNC;
  1189.       default_table_type=DB_TYPE_ISAM;
  1190.       myisam_delay_key_write=0;
  1191.       myisam_concurrent_insert=0;
  1192.       myisam_recover_options= HA_RECOVER_NONE;
  1193.       ha_open_options&= ~HA_OPEN_ABORT_IF_CRASHED;
  1194.       break;
  1195.     case (int) OPT_SAFE:
  1196.       opt_specialflag|= SPECIAL_SAFE_MODE;
  1197.       myisam_delay_key_write=0;
  1198.       myisam_recover_options= HA_RECOVER_NONE; // To be changed
  1199.       ha_open_options&= ~HA_OPEN_ABORT_IF_CRASHED;
  1200.       break;
  1201.     case (int) OPT_SKIP_CONCURRENT_INSERT:
  1202.       myisam_concurrent_insert=0;
  1203.       break;
  1204.     case (int) OPT_SKIP_PRIOR:
  1205.       opt_specialflag|= SPECIAL_NO_PRIOR;
  1206.       break;
  1207.     case (int) OPT_SKIP_GRANT:
  1208.       opt_noacl=1;
  1209.       break;
  1210.     case (int) OPT_SKIP_LOCK:
  1211.       my_disable_locking=1;
  1212.       break;
  1213.     case (int) OPT_SKIP_HOST_CACHE:
  1214.       opt_specialflag|= SPECIAL_NO_HOST_CACHE;
  1215.       break;
  1216.     case (int) OPT_ENABLE_LOCK:
  1217.       my_disable_locking=0;
  1218.       break;
  1219.     case (int) OPT_USE_LOCKING:
  1220.       my_disable_locking=0;
  1221.       break;
  1222.     case (int) OPT_SKIP_RESOLVE:
  1223.       opt_specialflag|=SPECIAL_NO_RESOLVE;
  1224.       break;
  1225.     case (int) OPT_LONG_FORMAT:
  1226.       opt_specialflag|=SPECIAL_LONG_LOG_FORMAT;
  1227.       break;
  1228.     case (int) OPT_SKIP_NETWORKING:
  1229.       opt_disable_networking=1;
  1230.       mysql_port=0;
  1231.       break;
  1232.     case (int) OPT_SKIP_SHOW_DB:
  1233.       opt_skip_show_db=1;
  1234.       opt_specialflag|=SPECIAL_SKIP_SHOW_DB;
  1235.       mysql_port=0;
  1236.       break;
  1237.     case (int) OPT_MEMLOCK:
  1238.       locked_in_memory=1;
  1239.       break;
  1240.     case (int) OPT_ONE_THREAD:
  1241.       test_flags |= TEST_NO_THREADS;
  1242.       break;
  1243.     case (int) OPT_WANT_CORE:
  1244.       test_flags |= TEST_CORE_ON_SIGNAL;
  1245.       break;
  1246.     case (int) OPT_BIND_ADDRESS:
  1247.       if (optarg && isdigit(optarg[0]))
  1248.       {
  1249. my_bind_addr = (ulong) inet_addr(optarg);
  1250.       }
  1251.       else
  1252.       {
  1253. struct hostent *ent;
  1254. if (!optarg || !optarg[0])
  1255.   ent=gethostbyname(optarg);
  1256. else
  1257. {
  1258.   char myhostname[255];
  1259.   if (gethostname(myhostname,sizeof(myhostname)) < 0)
  1260.   {
  1261.     sql_perror("Can't start server: cannot get my own hostname!");
  1262.     exit(1);
  1263.   }
  1264.   ent=gethostbyname(myhostname);
  1265. }
  1266. if (!ent)
  1267. {
  1268.   sql_perror("Can't start server: cannot resolve hostname!");
  1269.   exit(1);
  1270. }
  1271. my_bind_addr = (ulong) ((in_addr*)ent->h_addr_list[0])->s_addr;
  1272.       }
  1273.       break;
  1274.     case (int) OPT_PID_FILE:
  1275.       strmov(pidfile_name,optarg);
  1276.       break;
  1277.     case (int) OPT_INIT_FILE:
  1278.       opt_init_file=optarg;
  1279.       break;
  1280. #ifdef __WIN__
  1281.     case (int) OPT_STANDALONE: /* Dummy option for NT */
  1282.       break;
  1283.     case (int) OPT_CONSOLE:
  1284.       opt_console=1;
  1285.       break;
  1286. #endif
  1287.     case (int) OPT_FLUSH:
  1288.       nisam_flush=myisam_flush=1;
  1289.       flush_time=0; // No auto flush
  1290.       break;
  1291.     case OPT_LOW_PRIORITY_UPDATES:
  1292.       thd_startup_options|=OPTION_LOW_PRIORITY_UPDATES;
  1293.       low_priority_updates=1;
  1294.       break;
  1295.     case OPT_BOOTSTRAP:
  1296.       opt_noacl=opt_bootstrap=1;
  1297.       break;
  1298.     case OPT_TABLE_TYPE:
  1299.     {
  1300.       int type;
  1301.       if ((type=find_type(optarg, &ha_table_typelib, 2)) <= 0)
  1302.       {
  1303. fprintf(stderr,"Unknown table type: %sn",optarg);
  1304. exit(1);
  1305.       }
  1306.       default_table_type= (enum db_type) type;
  1307.       break;
  1308.     }
  1309.     case OPT_SERVER_ID:
  1310.       server_id = atoi(optarg);
  1311.       server_id_supplied = 1;
  1312.       break;
  1313.     case OPT_DELAY_KEY_WRITE:
  1314.       ha_open_options|=HA_OPEN_DELAY_KEY_WRITE;
  1315.       myisam_delay_key_write=1;
  1316.       break;
  1317.     case OPT_SKIP_DELAY_KEY_WRITE:
  1318.       myisam_delay_key_write=0;
  1319.       break;
  1320.     case 'C':
  1321.       strmov(default_charset,optarg);
  1322.       break;
  1323.     case OPT_CHARSETS_DIR:
  1324.       strmov(mysql_charsets_dir, optarg);
  1325.       charsets_dir = mysql_charsets_dir;
  1326.       break;
  1327. #include "sslopt-case.h"
  1328. #ifdef HAVE_BERKELEY_DB
  1329.     case OPT_BDB_LOG:
  1330.       berkeley_logdir=optarg;
  1331.       break;
  1332.     case OPT_BDB_HOME:
  1333.       berkeley_home=optarg;
  1334.       break;
  1335.     case OPT_BDB_NOSYNC:
  1336.       berkeley_env_flags|=DB_TXN_NOSYNC;
  1337.       break;
  1338.     case OPT_BDB_NO_RECOVER:
  1339.       berkeley_init_flags&= ~(DB_RECOVER);
  1340.       break;
  1341.     case OPT_BDB_TMP:
  1342.       berkeley_tmpdir=optarg;
  1343.       break;
  1344.     case OPT_BDB_LOCK:
  1345.     {
  1346.       int type;
  1347.       if ((type=find_type(optarg, &berkeley_lock_typelib, 2)) > 0)
  1348. berkeley_lock_type=berkeley_lock_types[type-1];
  1349.       else
  1350.       {
  1351. if (test_if_int(optarg,(uint) strlen(optarg)))
  1352.   berkeley_lock_scan_time=atoi(optarg);
  1353. else
  1354. {
  1355.   fprintf(stderr,"Unknown lock type: %sn",optarg);
  1356.   exit(1);
  1357. }
  1358.       }
  1359.       break;
  1360.     }
  1361.     case OPT_BDB_SHARED:
  1362.       berkeley_init_flags&= ~(DB_PRIVATE);
  1363.       berkeley_shared_data=1;
  1364.       break;
  1365. #endif /* HAVE_BERKELEY_DB */
  1366.     case OPT_BDB_SKIP:
  1367. #ifdef HAVE_BERKELEY_DB
  1368.       berkeley_skip=1;
  1369.       have_berkeley_db=SHOW_OPTION_DISABLED;
  1370. #endif
  1371.       break;
  1372.     case OPT_GEMINI_SKIP:
  1373. #ifdef HAVE_GEMINI_DB
  1374.       gemini_skip=1;
  1375.       have_gemini=SHOW_OPTION_DISABLED;  
  1376. #endif
  1377.       break;
  1378.     case OPT_INNOBASE_SKIP:
  1379. #ifdef HAVE_INNOBASE_DB
  1380.       innobase_skip=1;
  1381.       have_innobase=SHOW_OPTION_DISABLED;
  1382. #endif
  1383.       break;
  1384.     case OPT_INNOBASE_DATA_FILE_PATH:
  1385. #ifdef HAVE_INNOBASE_DB
  1386.       innobase_data_file_path=optarg;
  1387. #endif
  1388.       break;
  1389. #ifdef HAVE_INNOBASE_DB
  1390.     case OPT_INNOBASE_DATA_HOME_DIR:
  1391.       innobase_data_home_dir=optarg;
  1392.       break;
  1393.     case OPT_INNOBASE_LOG_GROUP_HOME_DIR:
  1394.       innobase_log_group_home_dir=optarg;
  1395.       break;
  1396.     case OPT_INNOBASE_LOG_ARCH_DIR:
  1397.       innobase_log_arch_dir=optarg;
  1398.       break;
  1399.     case OPT_INNOBASE_LOG_ARCHIVE:
  1400.       innobase_log_archive= optarg ? test(atoi(optarg)) : 1;
  1401.       break;
  1402.     case OPT_INNOBASE_FLUSH_LOG_AT_TRX_COMMIT:
  1403.       innobase_flush_log_at_trx_commit= optarg ? test(atoi(optarg)) : 1;
  1404.       break;
  1405. #endif /* HAVE_INNOBASE_DB */
  1406.     case OPT_MYISAM_RECOVER:
  1407.     {
  1408.       if (!optarg || !optarg[0])
  1409.       {
  1410. myisam_recover_options=    HA_RECOVER_DEFAULT;
  1411. myisam_recover_options_str= myisam_recover_typelib.type_names[0];
  1412.       }
  1413.       else
  1414.       {
  1415. myisam_recover_options_str=optarg;
  1416. if ((myisam_recover_options=
  1417. find_bit_type(optarg, &myisam_recover_typelib)) == ~(ulong) 0)
  1418. {
  1419.   fprintf(stderr, "Unknown option to myisam-recover: %sn",optarg);
  1420.   exit(1);
  1421. }
  1422.       }
  1423.       ha_open_options|=HA_OPEN_ABORT_IF_CRASHED;
  1424.       break;
  1425.     }
  1426.     case OPT_MASTER_HOST:
  1427.       master_host=optarg;
  1428.       break;
  1429.     case OPT_MASTER_USER:
  1430.       master_user=optarg;
  1431.       break;
  1432.     case OPT_MASTER_PASSWORD:
  1433.       master_password=optarg;
  1434.       break;
  1435.     case OPT_MASTER_INFO_FILE:
  1436.       master_info_file=optarg;
  1437.       break;
  1438.     case OPT_MASTER_PORT:
  1439.       master_port= atoi(optarg);
  1440.       break;
  1441.     case OPT_MASTER_CONNECT_RETRY:
  1442.       master_connect_retry= atoi(optarg);
  1443.       break;
  1444.     case (int) OPT_SAFE_SHOW_DB:
  1445.       opt_safe_show_db=1;
  1446.       break;
  1447.     default:
  1448.       fprintf(stderr,"%s: Unrecognized option: %cn",my_progname,c);
  1449.       use_help();
  1450.       exit(1);
  1451.     }
  1452.   }
  1453.   // Skipp empty arguments (from shell)
  1454.   while (argc != optind && !argv[optind][0])
  1455.     optind++;
  1456.   if (argc != optind)
  1457.   {
  1458.     fprintf(stderr,"%s: Too many parametersn",my_progname);
  1459.     use_help();
  1460.     exit(1);
  1461.   }
  1462.   fix_paths();
  1463.   default_table_type_name=ha_table_typelib.type_names[default_table_type-1];
  1464. }
  1465. #ifdef __WIN__
  1466. #ifndef KEY_SERVICE_PARAMETERS
  1467. #define KEY_SERVICE_PARAMETERS "SYSTEM\CurrentControlSet\Services\MySql\Parameters"
  1468. #endif
  1469. #define COPY_KEY_VALUE(value) if (copy_key_value(hParametersKey,&(value),lpszValue)) return 1
  1470. #define CHECK_KEY_TYPE(type,name) if ( type != dwKeyValueType ) { key_type_error(hParametersKey,name); return 1; }
  1471. #define SET_CHANGEABLE_VARVAL(varname) if (set_varval(hParametersKey,varname,szKeyValueName,dwKeyValueType,lpdwValue)) return 1;
  1472. static void key_type_error(HKEY hParametersKey,const char *szKeyValueName)
  1473. {
  1474.  TCHAR szErrorMsg[512];
  1475.  RegCloseKey( hParametersKey );
  1476.  strxmov(szErrorMsg,TEXT("Value ""),
  1477.  szKeyValueName,
  1478.  TEXT("" of registry key "" KEY_SERVICE_PARAMETERS "" has wrong typen"),NullS);
  1479.  fprintf(stderr, szErrorMsg); /* not unicode compatible */
  1480. }
  1481. static bool copy_key_value(HKEY hParametersKey, char **var, const char *value)
  1482. {
  1483.   if (!(*var=my_strdup(value,MYF(MY_WME))))
  1484.   {
  1485.     RegCloseKey(hParametersKey);
  1486.     fprintf(stderr, "Couldn't allocate memory for registry key valuen");
  1487.     return 1;
  1488.   }
  1489.   return 0;
  1490. }
  1491. static bool set_varval(HKEY hParametersKey,const char *var,
  1492.        const char *szKeyValueName, DWORD dwKeyValueType,
  1493.        LPDWORD lpdwValue)
  1494. {
  1495.   CHECK_KEY_TYPE(dwKeyValueType, szKeyValueName );
  1496.   if (set_changeable_varval(var, *lpdwValue, changeable_vars))
  1497.   {
  1498.     TCHAR szErrorMsg [ 512 ];
  1499.     RegCloseKey( hParametersKey );
  1500.     strxmov(szErrorMsg,
  1501.     TEXT("Value ""),
  1502.     szKeyValueName,
  1503.     TEXT("" of registry key "" KEY_SERVICE_PARAMETERS  "" is invalidn"),NullS);
  1504.     fprintf( stderr, szErrorMsg ); /* not unicode compatible */
  1505.     return 1;
  1506.   }
  1507.   return 0;
  1508. }
  1509. static int get_service_parameters()
  1510. {
  1511.   DWORD dwLastError;
  1512.   HKEY hParametersKey;
  1513.   DWORD dwIndex;
  1514.   TCHAR szKeyValueName [ 256 ];
  1515.   DWORD dwKeyValueName;
  1516.   DWORD dwKeyValueType;
  1517.   BYTE bKeyValueBuffer [ 512 ];
  1518.   DWORD dwKeyValueBuffer;
  1519.   LPDWORD lpdwValue = (LPDWORD) &bKeyValueBuffer[0];
  1520.   LPCTSTR lpszValue = (LPCTSTR) &bKeyValueBuffer[0];
  1521.   /* open parameters of service */
  1522.   dwLastError = (DWORD) RegOpenKeyEx( HKEY_LOCAL_MACHINE,
  1523.       TEXT(KEY_SERVICE_PARAMETERS), 0,
  1524.       KEY_READ, &hParametersKey );
  1525.   if ( dwLastError == ERROR_FILE_NOT_FOUND ) /* no parameters available */
  1526.     return 0;
  1527.   if ( dwLastError != ERROR_SUCCESS )
  1528.   {
  1529.     fprintf(stderr,"Can't open registry key "" KEY_SERVICE_PARAMETERS "" for readingn" );
  1530.     return 1;
  1531.   }
  1532.   /* enumerate all values of key */
  1533.   dwIndex = 0;
  1534.   dwKeyValueName = sizeof( szKeyValueName ) / sizeof( TCHAR );
  1535.   dwKeyValueBuffer = sizeof( bKeyValueBuffer );
  1536.   while ( (dwLastError = (DWORD) RegEnumValue(hParametersKey, dwIndex,
  1537.       szKeyValueName, &dwKeyValueName,
  1538.       NULL, &dwKeyValueType,
  1539.       &bKeyValueBuffer[0],
  1540.       &dwKeyValueBuffer))
  1541.   != ERROR_NO_MORE_ITEMS )
  1542.   {
  1543.     /* check if error occured */
  1544.     if ( dwLastError != ERROR_SUCCESS )
  1545.     {
  1546.       RegCloseKey( hParametersKey );
  1547.       fprintf( stderr, "Can't enumerate values of registry key "" KEY_SERVICE_PARAMETERS ""n" );
  1548.       return 1;
  1549.     }
  1550.     if ( lstrcmp(szKeyValueName, TEXT("BaseDir")) == 0 )
  1551.     {
  1552.       CHECK_KEY_TYPE( REG_SZ, szKeyValueName);
  1553.       strmov( mysql_home, lpszValue ); /* not unicode compatible */
  1554.     }
  1555.     else if ( lstrcmp(szKeyValueName, TEXT("BindAddress")) == 0 )
  1556.     {
  1557.       CHECK_KEY_TYPE( REG_SZ, szKeyValueName);
  1558.       my_bind_addr = (ulong) inet_addr( lpszValue );
  1559.       if ( my_bind_addr == (ulong) INADDR_NONE )
  1560.       {
  1561. struct hostent* ent;
  1562. if ( !(*lpszValue) )
  1563. {
  1564.   char szHostName [ 256 ];
  1565.   if ( gethostname(szHostName, sizeof(szHostName)) == SOCKET_ERROR )
  1566.   {
  1567.     RegCloseKey( hParametersKey );
  1568.     fprintf( stderr, "Can't get my own hostnamen" );
  1569.     return 1;
  1570.   }
  1571.   ent = gethostbyname( szHostName );
  1572. }
  1573. else ent = gethostbyname( lpszValue );
  1574. if ( !ent )
  1575. {
  1576.   RegCloseKey( hParametersKey );
  1577.   fprintf( stderr, "Can't resolve hostname!n" );
  1578.   return 1;
  1579. }
  1580. my_bind_addr = (ulong) ((in_addr*)ent->h_addr_list[0])->s_addr;
  1581.       }
  1582.     }
  1583.     else if ( lstrcmp(szKeyValueName, TEXT("BigTables")) == 0 )
  1584.     {
  1585.       CHECK_KEY_TYPE( REG_DWORD, szKeyValueName);
  1586.       if ( *lpdwValue )
  1587. thd_startup_options |= OPTION_BIG_TABLES;
  1588.       else
  1589. thd_startup_options &= ~((ulong)OPTION_BIG_TABLES);
  1590.     }
  1591.     else if ( lstrcmp(szKeyValueName, TEXT("DataDir")) == 0 )
  1592.     {
  1593.       CHECK_KEY_TYPE( REG_SZ, szKeyValueName );
  1594.       strmov( mysql_real_data_home, lpszValue ); /* not unicode compatible */
  1595.     }
  1596.     else if ( lstrcmp(szKeyValueName, TEXT("Locking")) == 0 )
  1597.     {
  1598.       CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
  1599.       my_disable_locking = !(*lpdwValue);
  1600.     }
  1601.     else if ( lstrcmp(szKeyValueName, TEXT("LogFile")) == 0 )
  1602.     {
  1603.       CHECK_KEY_TYPE( REG_SZ, szKeyValueName );
  1604.       opt_log = 1;
  1605.       COPY_KEY_VALUE( opt_logname );
  1606.     }
  1607.     else if ( lstrcmp(szKeyValueName, TEXT("UpdateLogFile")) == 0 )
  1608.     {
  1609.       CHECK_KEY_TYPE( REG_SZ, szKeyValueName );
  1610.       opt_update_log = 1;
  1611.       COPY_KEY_VALUE( opt_update_logname );
  1612.     }
  1613.     else if ( lstrcmp(szKeyValueName, TEXT("BinaryLogFile")) == 0 )
  1614.     {
  1615.       CHECK_KEY_TYPE( REG_SZ, szKeyValueName );
  1616.       opt_bin_log = 1;
  1617.       COPY_KEY_VALUE( opt_bin_logname );
  1618.     }
  1619.     else if ( lstrcmp(szKeyValueName, TEXT("BinaryLogIndexFile")) == 0 )
  1620.     {
  1621.       CHECK_KEY_TYPE( REG_SZ, szKeyValueName );
  1622.       opt_bin_log = 1;
  1623.       COPY_KEY_VALUE( opt_binlog_index_name );
  1624.     }
  1625.     else if ( lstrcmp(szKeyValueName, TEXT("ISAMLogFile")) == 0 )
  1626.     {
  1627.       CHECK_KEY_TYPE( REG_SZ, szKeyValueName );
  1628.       COPY_KEY_VALUE( myisam_log_filename );
  1629.       opt_myisam_log=1;
  1630.     }
  1631.     else if ( lstrcmp(szKeyValueName, TEXT("LongLogFormat")) == 0 )
  1632.     {
  1633.       CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
  1634.       if ( *lpdwValue )
  1635. opt_specialflag |= SPECIAL_LONG_LOG_FORMAT;
  1636.       else
  1637. opt_specialflag &= ~((ulong)SPECIAL_LONG_LOG_FORMAT);
  1638.     }
  1639.     else if ( lstrcmp(szKeyValueName, TEXT("LowPriorityUpdates")) == 0 )
  1640.     {
  1641.       CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
  1642.       if ( *lpdwValue )
  1643.       {
  1644. thd_startup_options |= OPTION_LOW_PRIORITY_UPDATES;
  1645. low_priority_updates = 1;
  1646.       }
  1647.       else
  1648.       {
  1649. thd_startup_options &= ~((ulong)OPTION_LOW_PRIORITY_UPDATES);
  1650. low_priority_updates = 0;
  1651.       }
  1652.     }
  1653.     else if ( lstrcmp(szKeyValueName, TEXT("Port")) == 0 )
  1654.     {
  1655.       CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
  1656.       mysql_port = (unsigned int) *lpdwValue;
  1657.     }
  1658.     else if ( lstrcmp(szKeyValueName, TEXT("OldProtocol")) == 0 )
  1659.     {
  1660.       CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
  1661.       protocol_version = *lpdwValue ? PROTOCOL_VERSION - 1 : PROTOCOL_VERSION;
  1662.     }
  1663.     else if ( lstrcmp(szKeyValueName, TEXT("HostnameResolving")) == 0 )
  1664.     {
  1665.       CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
  1666.       if ( !*lpdwValue )
  1667. opt_specialflag |= SPECIAL_NO_RESOLVE;
  1668.       else
  1669. opt_specialflag &= ~((ulong)SPECIAL_NO_RESOLVE);
  1670.     }
  1671.     else if ( lstrcmp(szKeyValueName, TEXT("Networking")) == 0 )
  1672.     {
  1673.       CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
  1674.       opt_disable_networking = !(*lpdwValue);
  1675.     }
  1676.     else if ( lstrcmp(szKeyValueName, TEXT("ShowDatabase")) == 0 )
  1677.     {
  1678.       CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
  1679.       opt_skip_show_db = !(*lpdwValue);
  1680.     }
  1681.     else if ( lstrcmp(szKeyValueName, TEXT("HostnameCaching")) == 0 )
  1682.     {
  1683.       CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
  1684.       if ( !*lpdwValue )
  1685. opt_specialflag |= SPECIAL_NO_HOST_CACHE;
  1686.       else
  1687. opt_specialflag &= ~((ulong)SPECIAL_NO_HOST_CACHE);
  1688.     }
  1689.     else if ( lstrcmp(szKeyValueName, TEXT("ThreadPriority")) == 0 )
  1690.     {
  1691.       CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
  1692.       if ( !(*lpdwValue) )
  1693. opt_specialflag |= SPECIAL_NO_PRIOR;
  1694.       else
  1695. opt_specialflag &= ~((ulong)SPECIAL_NO_PRIOR);
  1696.     }
  1697.     else if ( lstrcmp(szKeyValueName, TEXT("NamedPipe")) == 0 )
  1698.     {
  1699.       CHECK_KEY_TYPE( REG_SZ, szKeyValueName );
  1700.       COPY_KEY_VALUE( mysql_unix_port );
  1701.     }
  1702.     else if ( lstrcmp(szKeyValueName, TEXT("TempDir")) == 0 )
  1703.     {
  1704.       CHECK_KEY_TYPE( REG_SZ, szKeyValueName );
  1705.       COPY_KEY_VALUE( mysql_tmpdir );
  1706.     }
  1707.     else if ( lstrcmp(szKeyValueName, TEXT("FlushTables")) == 0 )
  1708.     {
  1709.       CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
  1710.       nisam_flush = myisam_flush= *lpdwValue ? 1 : 0;
  1711.     }
  1712.     else if ( lstrcmp(szKeyValueName, TEXT("BackLog")) == 0 )
  1713.     {
  1714.       SET_CHANGEABLE_VARVAL( "back_log" );
  1715.     }
  1716.     else if ( lstrcmp(szKeyValueName, TEXT("ConnectTimeout")) == 0 )
  1717.     {
  1718.       SET_CHANGEABLE_VARVAL( "connect_timeout" );
  1719.     }
  1720.     else if ( lstrcmp(szKeyValueName, TEXT("JoinBufferSize")) == 0 )
  1721.     {
  1722.       SET_CHANGEABLE_VARVAL( "join_buffer" );
  1723.     }
  1724.     else if ( lstrcmp(szKeyValueName, TEXT("KeyBufferSize")) == 0 )
  1725.     {
  1726.       SET_CHANGEABLE_VARVAL( "key_buffer" );
  1727.     }
  1728.     else if ( lstrcmp(szKeyValueName, TEXT("LongQueryTime")) == 0 )
  1729.     {
  1730.       SET_CHANGEABLE_VARVAL( "long_query_time" );
  1731.     }
  1732.     else if ( lstrcmp(szKeyValueName, TEXT("MaxAllowedPacket")) == 0 )
  1733.     {
  1734.       SET_CHANGEABLE_VARVAL( "max_allowed_packet" );
  1735.     }
  1736.     else if ( lstrcmp(szKeyValueName, TEXT("MaxConnections")) == 0 )
  1737.     {
  1738.       SET_CHANGEABLE_VARVAL( "max_connections" );
  1739.     }
  1740.     else if ( lstrcmp(szKeyValueName, TEXT("MaxUserConnections")) == 0 )
  1741.     {
  1742.       SET_CHANGEABLE_VARVAL( "max_user_connections" );
  1743.     }
  1744.     else if ( lstrcmp(szKeyValueName, TEXT("MaxConnectErrors")) == 0 )
  1745.     {
  1746.       SET_CHANGEABLE_VARVAL( "max_connect_errors" );
  1747.     }
  1748.     else if ( lstrcmp(szKeyValueName, TEXT("MaxInsertDelayedThreads")) == 0 )
  1749.     {
  1750.       SET_CHANGEABLE_VARVAL( "max_delayed_threads" );
  1751.     }
  1752.     else if ( lstrcmp(szKeyValueName, TEXT("MaxJoinSize")) == 0 )
  1753.     {
  1754.       SET_CHANGEABLE_VARVAL( "max_join_size" );
  1755.     }
  1756.     else if ( lstrcmp(szKeyValueName, TEXT("MaxSortLength")) == 0 )
  1757.     {
  1758.       SET_CHANGEABLE_VARVAL( "max_sort_length" );
  1759.     }
  1760.     else if ( lstrcmp(szKeyValueName, TEXT("NetBufferLength")) == 0 )
  1761.     {
  1762.       SET_CHANGEABLE_VARVAL( "net_buffer_length" );
  1763.     }
  1764.     else if ( lstrcmp(szKeyValueName, TEXT("RecordBufferSize")) == 0 )
  1765.     {
  1766.       SET_CHANGEABLE_VARVAL( "record_buffer" );
  1767.     }
  1768.     else if ( lstrcmp(szKeyValueName, TEXT("SortBufferSize")) == 0 )
  1769.     {
  1770.       SET_CHANGEABLE_VARVAL( "sort_buffer" );
  1771.     }
  1772.     else if ( lstrcmp(szKeyValueName, TEXT("TableCacheSize")) == 0 )
  1773.     {
  1774.       SET_CHANGEABLE_VARVAL( "table_cache" );
  1775.     }
  1776.     else if ( lstrcmp(szKeyValueName, TEXT("TmpTableSize")) == 0 )
  1777.     {
  1778.       SET_CHANGEABLE_VARVAL( "tmp_table_size" );
  1779.     }
  1780.     else if ( lstrcmp(szKeyValueName, TEXT("ThreadStackSize")) == 0 )
  1781.     {
  1782.       SET_CHANGEABLE_VARVAL( "thread_stack" );
  1783.     }
  1784.     else if ( lstrcmp(szKeyValueName, TEXT("WaitTimeout")) == 0 )
  1785.     {
  1786.       SET_CHANGEABLE_VARVAL( "wait_timeout" );
  1787.     }
  1788.     else if ( lstrcmp(szKeyValueName, TEXT("DelayedInsertTimeout"))
  1789.       == 0 )
  1790.     {
  1791.       SET_CHANGEABLE_VARVAL( "delayed_insert_timeout" );
  1792.     }
  1793.     else if ( lstrcmp(szKeyValueName, TEXT("DelayedInsertLimit")) ==
  1794.       0 )
  1795.     {
  1796.       SET_CHANGEABLE_VARVAL( "delayed_insert_limit" );
  1797.     }
  1798.     else if ( lstrcmp(szKeyValueName, TEXT("DelayedQueueSize")) == 0
  1799.       )
  1800.     {
  1801.       SET_CHANGEABLE_VARVAL( "delayed_queue_size" );
  1802.     }
  1803.     else if ( lstrcmp(szKeyValueName, TEXT("FlushTime")) == 0 )
  1804.     {
  1805.       SET_CHANGEABLE_VARVAL( "flush_time" );
  1806.     }
  1807.     else if ( lstrcmp(szKeyValueName, TEXT("InteractiveTimeout")) ==
  1808.       0 )
  1809.     {
  1810.       SET_CHANGEABLE_VARVAL( "interactive_timeout" );
  1811.     }
  1812.     else if ( lstrcmp(szKeyValueName, TEXT("LowerCaseTableNames"))
  1813.       == 0 )
  1814.     {
  1815.       SET_CHANGEABLE_VARVAL( "lower_case_table_names" );
  1816.     }
  1817.     else if ( lstrcmp(szKeyValueName, TEXT("MaxHeapTableSize")) == 0
  1818.       )
  1819.     {
  1820.       SET_CHANGEABLE_VARVAL( "max_heap_table_size" );
  1821.     }
  1822.     else if ( lstrcmp(szKeyValueName, TEXT("MaxTmpTables")) == 0 )
  1823.     {
  1824.       SET_CHANGEABLE_VARVAL( "max_tmp_tables" );
  1825.     }
  1826.     else if ( lstrcmp(szKeyValueName, TEXT("MaxWriteLockCount")) ==
  1827.       0 )
  1828.     {
  1829.       SET_CHANGEABLE_VARVAL( "max_write_lock_count" );
  1830.     }
  1831.     else if ( lstrcmp(szKeyValueName, TEXT("NetRetryCount")) == 0 )
  1832.     {
  1833.       SET_CHANGEABLE_VARVAL( "net_retry_count" );
  1834.     }
  1835.     else if ( lstrcmp(szKeyValueName, TEXT("QueryBufferSize")) == 0
  1836.       )
  1837.     {
  1838.       SET_CHANGEABLE_VARVAL( "query_buffer_size" );
  1839.     }
  1840.     else if ( lstrcmp(szKeyValueName, TEXT("ThreadConcurrency")) ==
  1841.       0 )
  1842.     {
  1843.       SET_CHANGEABLE_VARVAL( "thread_concurrency" );
  1844.     }
  1845.     else
  1846.     {
  1847.       TCHAR szErrorMsg [ 512 ];
  1848.       RegCloseKey( hParametersKey );
  1849.       lstrcpy( szErrorMsg, TEXT("Value "") );
  1850.       lstrcat( szErrorMsg, szKeyValueName );
  1851.       lstrcat( szErrorMsg, TEXT("" of registry key "" KEY_SERVICE_PARAMETERS "" is not defined by MySQLn") );
  1852.       fprintf( stderr, szErrorMsg ); /* not unicode compatible */
  1853.       return 1;
  1854.     }
  1855.     dwIndex++;
  1856.     dwKeyValueName = sizeof( szKeyValueName ) / sizeof( TCHAR );
  1857.     dwKeyValueBuffer = sizeof( bKeyValueBuffer );
  1858.   }
  1859.   RegCloseKey( hParametersKey );
  1860.   /* paths are fixed by method get_options() */
  1861.   return 0;
  1862. }
  1863. #endif
  1864. static char *get_relative_path(const char *path)
  1865. {
  1866.   if (test_if_hard_path(path) &&
  1867.       is_prefix(path,DEFAULT_MYSQL_HOME) &&
  1868.       strcmp(DEFAULT_MYSQL_HOME,FN_ROOTDIR))
  1869.   {
  1870.     path+=(uint) strlen(DEFAULT_MYSQL_HOME);
  1871.     while (*path == FN_LIBCHAR)
  1872.       path++;
  1873.   }
  1874.   return (char*) path;
  1875. }
  1876. static void fix_paths(void)
  1877. {
  1878.   (void) fn_format(mysql_home,mysql_home,"","",16); // Remove symlinks
  1879.   convert_dirname(mysql_home);
  1880.   convert_dirname(mysql_real_data_home);
  1881.   convert_dirname(language);
  1882.   (void) my_load_path(mysql_home,mysql_home,""); // Resolve current dir
  1883.   (void) my_load_path(mysql_real_data_home,mysql_real_data_home,mysql_home);
  1884.   (void) my_load_path(pidfile_name,pidfile_name,mysql_real_data_home);
  1885.   char buff[FN_REFLEN],*sharedir=get_relative_path(SHAREDIR);
  1886.   if (test_if_hard_path(sharedir))
  1887.     strmov(buff,sharedir); /* purecov: tested */
  1888.   else
  1889.     strxmov(buff,mysql_home,sharedir,NullS);
  1890.   convert_dirname(buff);
  1891.   (void) my_load_path(language,language,buff);
  1892.   /* If --character-sets-dir isn't given, use shared library dir */
  1893.   if (charsets_dir != mysql_charsets_dir)
  1894.   {
  1895.     strmov(strmov(mysql_charsets_dir,buff),CHARSET_DIR);
  1896.     charsets_dir=mysql_charsets_dir;
  1897.   }
  1898.   /* Add '/' to TMPDIR if needed */
  1899.   char *tmp= (char*) my_malloc(FN_REFLEN,MYF(MY_FAE));
  1900.   if (tmp)
  1901.   {
  1902.     strmov(tmp,mysql_tmpdir);
  1903.     mysql_tmpdir=tmp;
  1904.     convert_dirname(mysql_tmpdir);
  1905.     mysql_tmpdir=(char*) my_realloc(mysql_tmpdir,(uint) strlen(mysql_tmpdir)+1,
  1906.     MYF(MY_HOLD_ON_ERROR));
  1907.   }
  1908. }
  1909. #ifdef SET_RLIMIT_NOFILE
  1910. static uint set_maximum_open_files(uint max_file_limit)
  1911. {
  1912.   struct rlimit rlimit;
  1913.   ulong old_cur;
  1914.   if (!getrlimit(RLIMIT_NOFILE,&rlimit))
  1915.   {
  1916.     old_cur=rlimit.rlim_cur;
  1917.     if (rlimit.rlim_cur >= max_file_limit) // Nothing to do
  1918.       return rlimit.rlim_cur; /* purecov: inspected */
  1919.     rlimit.rlim_cur=rlimit.rlim_max=max_file_limit;
  1920.     if (setrlimit(RLIMIT_NOFILE,&rlimit))
  1921.     {
  1922.       sql_print_error("Warning: setrlimit couldn't increase number of open files to more than %ld",
  1923.       old_cur); /* purecov: inspected */
  1924.       max_file_limit=old_cur;
  1925.     }
  1926.     else
  1927.     {
  1928.       (void) getrlimit(RLIMIT_NOFILE,&rlimit);
  1929.       if ((uint) rlimit.rlim_cur != max_file_limit)
  1930. sql_print_error("Warning: setrlimit returned ok, but didn't change limits. Max open files is %ld",
  1931.   (ulong) rlimit.rlim_cur); /* purecov: inspected */
  1932.       max_file_limit=rlimit.rlim_cur;
  1933.     }
  1934.   }
  1935.   return max_file_limit;
  1936. }
  1937. #endif
  1938. /*
  1939.   Return a bitfield from a string of substrings separated by ','
  1940.   returns ~(ulong) 0 on error.
  1941. */
  1942. static ulong find_bit_type(const char *x, TYPELIB *bit_lib)
  1943. {
  1944.   bool found_end;
  1945.   int  found_count;
  1946.   const char *end,*i,*j;
  1947.   const char **array, *pos;
  1948.   ulong found,found_int,bit;
  1949.   DBUG_ENTER("find_bit_type");
  1950.   DBUG_PRINT("enter",("x: '%s'",x));
  1951.   found=0;
  1952.   found_end= 0;
  1953.   pos=(my_string) x;
  1954.   do
  1955.   {
  1956.     if (!*(end=strcend(pos,','))) /* Let end point at fieldend */
  1957.     {
  1958.       while (end > pos && end[-1] == ' ')
  1959. end--; /* Skipp end-space */
  1960.       found_end=1;
  1961.     }
  1962.     found_int=0; found_count=0;
  1963.     for (array=bit_lib->type_names, bit=1 ; (i= *array++) ; bit<<=1)
  1964.     {
  1965.       j=pos;
  1966.       while (j != end)
  1967.       {
  1968. if (toupper(*i++) != toupper(*j++))
  1969.   goto skipp;
  1970.       }
  1971.       found_int=bit;
  1972.       if (! *i)
  1973.       {
  1974. found_count=1;
  1975. break;
  1976.       }
  1977.       else if (j != pos) // Half field found
  1978.       {
  1979. found_count++; // Could be one of two values
  1980.       }
  1981. skipp: ;
  1982.     }
  1983.     if (found_count != 1)
  1984.       DBUG_RETURN(~(ulong) 0); // No unique value
  1985.     found|=found_int;
  1986.     pos=end+1;
  1987.   } while (! found_end);
  1988.   DBUG_PRINT("exit",("bit-field: %ld",(ulong) found));
  1989.   DBUG_RETURN(found);
  1990. } /* find_bit_type */
  1991. /*****************************************************************************
  1992. ** Instantiate templates
  1993. *****************************************************************************/
  1994. #ifdef __GNUC__
  1995. /* Used templates */
  1996. template class I_List<THD>;
  1997. template class I_List_iterator<THD>;
  1998. template class I_List<i_string>;
  1999. template class I_List<i_string_pair>;
  2000. #endif