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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h> /* Needed for mkdir(2) */
  14. #include <my_sys.h>
  15. #include <my_getopt.h>
  16. #include <mysql_version.h>
  17. #include <ndb_version.h>
  18. #include "CPCD.hpp"
  19. #include "APIService.hpp"
  20. #include <NdbMain.h>
  21. #include <NdbSleep.h>
  22. #include <BaseString.hpp>
  23. #include <logger/Logger.hpp>
  24. #include <logger/FileLogHandler.hpp>
  25. #include <logger/SysLogHandler.hpp>
  26. #include "common.hpp"
  27. static const char *work_dir = CPCD_DEFAULT_WORK_DIR;
  28. static int unsigned port;
  29. static int use_syslog;
  30. static const char *logfile = NULL;
  31. static const char *user = 0;
  32. static struct my_option my_long_options[] =
  33. {
  34.   { "work-dir", 'w', "Work directory",
  35.     (gptr*) &work_dir, (gptr*) &work_dir,  0,
  36.     GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
  37.   { "port", 'p', "TCP port to listen on",
  38.     (gptr*) &port, (gptr*) &port, 0,
  39.     GET_INT, REQUIRED_ARG, CPCD_DEFAULT_TCP_PORT, 0, 0, 0, 0, 0 }, 
  40.   { "syslog", 'S', "Log events to syslog",
  41.     (gptr*) &use_syslog, (gptr*) &use_syslog, 0,
  42.     GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
  43.   { "logfile", 'L', "File to log events to",
  44.     (gptr*) &logfile, (gptr*) &logfile, 0,
  45.     GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
  46.   { "debug", 'D', "Enable debug mode",
  47.     (gptr*) &debug, (gptr*) &debug, 0,
  48.     GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
  49.   { "user", 'u', "Run as user",
  50.     (gptr*) &user, (gptr*) &user, 0,
  51.     GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
  52.   { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
  53. };
  54. static my_bool
  55. get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
  56.        char *argument)
  57. {
  58.   return 0;
  59. }
  60. static CPCD * g_cpcd = 0;
  61. #if 0
  62. extern "C" static void sig_child(int signo, siginfo_t*, void*);
  63. #endif
  64. const char *progname = "ndb_cpcd";
  65. int main(int argc, char** argv){
  66.   int save_argc= argc;
  67.   char** save_argv= argv;
  68.   const char *load_default_groups[]= { "ndb_cpcd",0 };
  69.   MY_INIT(argv[0]);
  70.   load_defaults("ndb_cpcd",load_default_groups,&argc,&argv);
  71.   if (handle_options(&argc, &argv, my_long_options, get_one_option)) {
  72.     my_print_help(my_long_options);
  73.     my_print_variables(my_long_options);
  74.     exit(1);
  75.   }
  76.   logger.setCategory(progname);
  77.   logger.enable(Logger::LL_ALL);
  78.   if(debug)
  79.     logger.createConsoleHandler();
  80.   if(user && runas(user) != 0){
  81.     logger.critical("Unable to change user: %s", user);
  82.     _exit(1);
  83.   }
  84.   if(logfile != NULL){
  85.     BaseString tmp;
  86.     if(logfile[0] != '/')
  87.       tmp.append(work_dir); 
  88.     tmp.append(logfile);
  89.     logger.addHandler(new FileLogHandler(tmp.c_str()));
  90.   }
  91.   
  92.   if(use_syslog)
  93.     logger.addHandler(new SysLogHandler());
  94.   logger.info("Starting");
  95.   CPCD cpcd;
  96.   g_cpcd = &cpcd;
  97.   
  98.   /* XXX This will probably not work on !unix */
  99.   int err = mkdir(work_dir, S_IRWXU | S_IRGRP | S_IROTH);
  100.   if(err != 0) {
  101.     switch(errno) {
  102.     case EEXIST:
  103.       break;
  104.     default:
  105.       fprintf(stderr, "Cannot mkdir %s: %sn", work_dir, strerror(errno));
  106.       exit(1);
  107.     }
  108.   }
  109.   if(strlen(work_dir) > 0){
  110.     logger.debug("Changing dir to '%s'", work_dir);
  111.     if((err = chdir(work_dir)) != 0){
  112.       fprintf(stderr, "Cannot chdir %s: %sn", work_dir, strerror(errno));
  113.       exit(1);
  114.     }
  115.   }
  116.   cpcd.loadProcessList();
  117.   
  118.   SocketServer * ss = new SocketServer();
  119.   CPCDAPIService * serv = new CPCDAPIService(cpcd);
  120.   if(!ss->setup(serv, port)){
  121.     logger.critical("Cannot setup server: %s", strerror(errno));
  122.     sleep(1);
  123.     delete ss;
  124.     delete serv;
  125.     return 1;
  126.   }
  127.   ss->startServer();
  128.   {  
  129.     signal(SIGPIPE, SIG_IGN);
  130.     signal(SIGCHLD, SIG_IGN);
  131. #if 0
  132.     struct sigaction act;
  133.     act.sa_handler = 0;
  134.     act.sa_sigaction = sig_child;
  135.     sigemptyset(&act.sa_mask);
  136.     act.sa_flags = SA_SIGINFO;
  137.     sigaction(SIGCHLD, &act, 0);
  138. #endif
  139.   }
  140.   
  141.   logger.debug("Start completed");
  142.   while(true) NdbSleep_MilliSleep(1000);
  143.   
  144.   delete ss;
  145.   return 0;
  146. }
  147. #if 0
  148. extern "C" 
  149. void 
  150. sig_child(int signo, siginfo_t* info, void*){
  151.   printf("signo: %d si_signo: %d si_errno: %d si_code: %d si_pid: %dn",
  152.  signo, 
  153.  info->si_signo,
  154.  info->si_errno,
  155.  info->si_code,
  156.  info->si_pid);
  157.   
  158. }
  159. #endif