main.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2000,2001 Onlyer (onlyer@263.net)
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. #include "common/setup_before.h"
  19. #include "setup.h"
  20. #include <stdio.h>
  21. #ifdef STDC_HEADERS
  22. # include <stdlib.h>
  23. #else
  24. # ifdef HAVE_MALLOC_H
  25. #  include <malloc.h>
  26. # endif
  27. #endif
  28. #ifdef HAVE_UNISTD_H
  29. # include <unistd.h>
  30. #endif
  31. #include <errno.h>
  32. #ifdef HAVE_STRING_H
  33. # include <string.h>
  34. #else
  35. # ifdef HAVE_STRINGS_H
  36. #  include <strings.h>
  37. # endif
  38. # ifdef HAVE_MEMORY_H
  39. #  include <memory.h>
  40. # endif
  41. #endif
  42. #include "compat/strdup.h"
  43. #ifdef HAVE_SYS_STAT_H
  44. # include <sys/stat.h>
  45. #endif
  46. #ifdef HAVE_SYS_TYPES_H
  47. # include <sys/types.h>
  48. #endif
  49. #include "prefs.h"
  50. #include "cmdline_parse.h"
  51. #include "version.h"
  52. #include "common/eventlog.h"
  53. #ifdef WIN32
  54. #include "win32/service.h"
  55. #endif
  56. #include "handle_signal.h"
  57. #include "dbserver.h"
  58. #include "common/setup_after.h"
  59. static FILE * eventlog_fp;
  60. #ifdef USE_CHECK_ALLOC
  61. static FILE * memlog_fp;
  62. #endif
  63. int g_ServiceStatus = 1;
  64. static int init(void);
  65. static int cleanup(void);
  66. static int config_init(int argc, char * * argv);
  67. static int config_cleanup(void);
  68. static int setup_daemon(void);
  69. #ifdef DO_DAEMONIZE
  70. static int setup_daemon(void)
  71. {
  72. int pid;
  73. if (chdir("/")<0) {
  74. eventlog(eventlog_level_error,__FUNCTION__,"can not change working directory to root directory (chdir: %s)",strerror(errno));
  75. return -1;
  76. }
  77. close(STDIN_FILENO);
  78. close(STDOUT_FILENO);
  79. if (!d2dbs_cmdline_get_debugmode()) {
  80. close(STDERR_FILENO);
  81. }
  82. switch ((pid=fork())) {
  83. case 0:
  84. break;
  85. case -1:
  86. eventlog(eventlog_level_error,__FUNCTION__,"error create child process (fork: %s)",strerror(errno));
  87. return -1;
  88. default:
  89. return pid;
  90. }
  91. umask(0);
  92. setsid();
  93. return 0;
  94. }
  95. #endif
  96. static int init(void)
  97. {
  98. return 0;
  99. }
  100. static int cleanup(void)
  101. {
  102. return 0;
  103. }
  104. static int config_init(int argc, char * * argv)
  105. {
  106.     char const * levels;
  107.     char *       temp;
  108.     char const * tok;
  109.     int  pid;
  110. if (d2dbs_cmdline_parse(argc, argv)<0) {
  111. return -1;
  112. }
  113. #ifdef WIN32
  114. if (d2dbs_cmdline_get_run_as_service())
  115. {
  116.    Win32_ServiceRun();
  117. return 1;
  118. }
  119. #endif
  120. if (d2dbs_cmdline_get_version()) {
  121. d2dbs_cmdline_show_version();
  122. return -1;
  123. }
  124. if (d2dbs_cmdline_get_help()) {
  125. d2dbs_cmdline_show_help();
  126. return -1;
  127. }
  128. #ifdef DO_DAEMONIZE
  129. if ((!d2dbs_cmdline_get_foreground()) && (!d2dbs_cmdline_get_debugmode())) {
  130.      if (!((pid = setup_daemon()) == 0)) {
  131.         return pid;
  132. }
  133. }
  134. #endif
  135. #ifdef WIN32
  136. if (d2dbs_cmdline_get_make_service())
  137. {
  138. if (strcmp(d2dbs_cmdline_get_make_service(), "install") == 0) {
  139.     fprintf(stderr, "Installing service");
  140.     Win32_ServiceInstall();
  141. return 1;
  142. }
  143. if (strcmp(d2dbs_cmdline_get_make_service(), "uninstall") == 0) {
  144.     fprintf(stderr, "Uninstalling service");
  145.     Win32_ServiceUninstall();
  146. return 1;
  147. }
  148. }
  149. #endif
  150. if (d2dbs_prefs_load(d2dbs_cmdline_get_prefs_file())<0) {
  151. eventlog(eventlog_level_error,__FUNCTION__,"error loading configuration file %s",d2dbs_cmdline_get_prefs_file());
  152. return -1;
  153. }
  154.     eventlog_clear_level();
  155.     if ((levels = d2dbs_prefs_get_loglevels()))
  156.     {
  157.         if (!(temp = strdup(levels)))
  158.         {
  159.          eventlog(eventlog_level_fatal,__FUNCTION__,"could not allocate memory for temp (exiting)");
  160.          return -1;
  161.         }
  162.         tok = strtok(temp,","); /* strtok modifies the string it is passed */
  163.         while (tok)
  164.         {
  165.         if (eventlog_add_level(tok)<0)
  166.             eventlog(eventlog_level_error,__FUNCTION__,"could not add log level "%s"",tok);
  167.         tok = strtok(NULL,",");
  168.         }
  169.         free(temp);
  170.     }
  171. if (d2dbs_cmdline_get_debugmode()) {
  172. eventlog_set(stderr);
  173. } else if (d2dbs_cmdline_get_logfile()) {
  174. if (eventlog_open(d2dbs_cmdline_get_logfile())<0) {
  175. eventlog(eventlog_level_error,__FUNCTION__,"error open eventlog file %s",d2dbs_cmdline_get_logfile());
  176. return -1;
  177. }
  178. } else {
  179. if (eventlog_open(d2dbs_prefs_get_logfile())<0) {
  180. eventlog(eventlog_level_error,__FUNCTION__,"error open eventlog file %s",d2dbs_prefs_get_logfile());
  181. return -1;
  182. }
  183. }
  184. #ifdef USE_CHECK_ALLOC
  185. memlog_fp=fopen(cmdline_get_memlog_file(),"a");
  186. if (!memlog_fp) {
  187. eventlog(eventlog_level_warn,__FUNCTION__,"error open file %s for memory debug logging",cmdline_get_memlog_file());
  188. } else {
  189. check_set_file(memlog_fp);
  190. }
  191. #endif
  192. return 0;
  193. }
  194. static int config_cleanup(void)
  195. {
  196. d2dbs_prefs_unload();
  197. d2dbs_cmdline_cleanup(); 
  198. eventlog_close();
  199. if (eventlog_fp) fclose(eventlog_fp);
  200. return 0;
  201. }
  202. #ifdef D2CLOSED
  203. extern int d2dbs_main(int argc, char * * argv)
  204. #else
  205. extern int main(int argc, char * * argv)
  206. #endif
  207. {
  208. int pid;
  209. #ifdef USE_CHECK_ALLOC
  210. check_set_file(stderr);
  211. #endif
  212. eventlog_set(stderr);
  213. pid = config_init(argc, argv);
  214. if (!(pid == 0)) {
  215. if (pid==1) pid=0;
  216. return pid;
  217. }
  218. eventlog(eventlog_level_info,__FUNCTION__,D2DBS_VERSION);
  219. if (init()<0) {
  220. eventlog(eventlog_level_error,__FUNCTION__,"failed to init");
  221. return -1;
  222. } else {
  223. eventlog(eventlog_level_info,__FUNCTION__,"server initialized");
  224. }
  225. #ifndef WIN32 
  226. d2dbs_handle_signal_init();
  227. #endif
  228. dbs_server_main();
  229. cleanup();
  230. config_cleanup();
  231. #ifdef USE_CHECK_ALLOC
  232. check_cleanup();
  233. if (memlog_fp) fclose(memlog_fp);
  234. #endif
  235. return 0;
  236. }