char *dirname(CONST_ON_BSD char *path) { static char *(*real_dirname)(CONST_ON_BSD char *path) = NULL; if (!tsafe_inited || tsafe_disabled) { if (real_dirname == NULL) { real_dirname = _get_real_func_ ("dirname"); } return real_dirname (path); } assert(0); return NULL; }
NetworkServer* NetworkServer::init(const char *conf_file, int num_readers, int num_writers){ if(!is_file(conf_file)){ fprintf(stderr, "'%s' is not a file or not exists!\n", conf_file); exit(1); } Config *conf = Config::load(conf_file); if(!conf){ fprintf(stderr, "error loading conf file: '%s'\n", conf_file); exit(1); } { std::string conf_dir = real_dirname(conf_file); if(chdir(conf_dir.c_str()) == -1){ fprintf(stderr, "error chdir: %s\n", conf_dir.c_str()); exit(1); } } NetworkServer* serv = init(*conf, num_readers, num_writers); delete conf; return serv; }
void init(int argc, char **argv){ if(argc < 2){ usage(argc, argv); exit(0); } signal(SIGPIPE, SIG_IGN); { struct timeval tv; if(gettimeofday(&tv, NULL) == -1){ srand(time(NULL) + getpid()); }else{ srand(tv.tv_sec + tv.tv_usec + getpid()); } } bool is_daemon = false; const char *conf_file = NULL; for(int i=1; i<argc; i++){ if(strcmp(argv[i], "-d") == 0){ is_daemon = true; }else{ conf_file = argv[i]; } } if(conf_file == NULL){ usage(argc, argv); exit(0); } if(!is_file(conf_file)){ fprintf(stderr, "'%s' is not a file or not exists!\n", conf_file); exit(0); } conf = Config::load(conf_file); if(!conf){ fprintf(stderr, "error loading conf file: '%s'\n", conf_file); exit(0); } { std::string conf_dir = real_dirname(conf_file); if(chdir(conf_dir.c_str()) == -1){ fprintf(stderr, "error chdir: %s\n", conf_dir.c_str()); exit(0); } } std::string log_output; int log_rotate_size = 0; { // logger int log_level = Logger::get_level(conf->get_str("logger.level")); log_rotate_size = conf->get_num("logger.rotate.size"); if(log_rotate_size < 1024 * 1024){ log_rotate_size = 1024 * 1024; } log_output = conf->get_str("logger.output"); if(log_output == ""){ log_output = "stdout"; } if(log_open(log_output.c_str(), log_level, true, log_rotate_size) == -1){ fprintf(stderr, "error open log file: %s\n", log_output.c_str()); exit(0); } } check_pidfile(); if(is_daemon){ daemonize(); } log_info("starting icomet %s...", ICOMET_VERSION); log_info("config file: %s", conf_file); log_info("log_level : %s", conf->get_str("logger.level")); log_info("log_output : %s", log_output.c_str()); log_info("log_rotate_size : %d", log_rotate_size); evbase = event_base_new(); if(!evbase){ fprintf(stderr, "create evbase error!\n"); exit(0); } admin_http = evhttp_new(evbase); if(!admin_http){ fprintf(stderr, "create admin_http error!\n"); exit(0); } front_http = evhttp_new(evbase); if(!front_http){ fprintf(stderr, "create front_http error!\n"); exit(0); } sigint_event = evsignal_new(evbase, SIGINT, signal_cb, NULL); if(!sigint_event || event_add(sigint_event, NULL)<0){ fprintf(stderr, "Could not create/add a signal event!\n"); exit(0); } sigterm_event = evsignal_new(evbase, SIGTERM, signal_cb, NULL); if(!sigterm_event || event_add(sigterm_event, NULL)<0){ fprintf(stderr, "Could not create/add a signal event!\n"); exit(0); } timer_event = event_new(evbase, -1, EV_PERSIST, timer_cb, NULL); { struct timeval tv; tv.tv_sec = CHANNEL_CHECK_INTERVAL; tv.tv_usec = 0; if(!timer_event || evtimer_add(timer_event, &tv)<0){ fprintf(stderr, "Could not create/add a timer event!\n"); exit(0); } } }
void init(int argc, char **argv){ if(argc < 2){ usage(argc, argv); exit(0); } bool is_daemon = false; const char *conf_file = NULL; for(int i=1; i<argc; i++){ if(strcmp(argv[i], "-d") == 0){ is_daemon = true; }else{ conf_file = argv[i]; } } if(conf_file == NULL){ usage(argc, argv); exit(0); } if(!is_file(conf_file)){ fprintf(stderr, "'%s' is not a file or not exists!\n", conf_file); exit(0); } conf = Config::load(conf_file); if(!conf){ fprintf(stderr, "error loading conf file: '%s'", conf_file); exit(0); } { std::string conf_dir = real_dirname(conf_file); if(chdir(conf_dir.c_str()) == -1){ fprintf(stderr, "error chdir: %s\n", conf_dir.c_str()); exit(0); } } std::string work_dir; { work_dir = conf->get_str("work_dir"); if(work_dir.empty()){ work_dir = "."; } if(!is_dir(work_dir.c_str())){ fprintf(stderr, "'%s' is not a directory or not exists!\n", work_dir.c_str()); exit(0); } /* if(chdir(work_dir.c_str()) == -1){ fprintf(stderr, "error chdir: %s\n", work_dir.c_str()); exit(0); } */ } check_pidfile(); std::string log_output; int log_rotate_size = 0; { // logger int log_level = Logger::get_level(conf->get_str("logger.level")); log_rotate_size = conf->get_num("logger.rotate.size"); log_output = conf->get_str("logger.output"); if(log_output == ""){ log_output = "stdout"; } if(log_open(log_output.c_str(), log_level, true, log_rotate_size) == -1){ fprintf(stderr, "error open log file: %s", log_output.c_str()); exit(0); } } log_info("ssdb-server %s", SSDB_VERSION); log_info("conf_file : %s", conf_file); log_info("work_dir : %s", work_dir.c_str()); log_info("log_level : %s", conf->get_str("logger.level")); log_info("log_output : %s", log_output.c_str()); log_info("log_rotate_size : %d", log_rotate_size); if(is_daemon){ daemonize(); } { // ssdb ssdb = SSDB::open(*conf, work_dir); if(!ssdb){ log_fatal("could not open SSDB!"); exit(0); } } { // server const char *ip = conf->get_str("server.ip"); short port = (short)conf->get_num("server.port"); serv_link = Link::listen(ip, port); if(serv_link == NULL){ log_fatal("error opening server socket! %s", strerror(errno)); exit(0); } log_info("server listen on: %s:%d", ip, port); } write_pidfile(); log_info("ssdb server started."); }
void Application::init(){ if(!is_file(app_args.conf_file.c_str())){ fprintf(stderr, "'%s' is not a file or not exists!\n", app_args.conf_file.c_str()); exit(1); } conf = Config::load(app_args.conf_file.c_str()); if(!conf){ fprintf(stderr, "error loading conf file: '%s'\n", app_args.conf_file.c_str()); exit(1); } { std::string conf_dir = real_dirname(app_args.conf_file.c_str()); if(chdir(conf_dir.c_str()) == -1){ fprintf(stderr, "error chdir: %s\n", conf_dir.c_str()); exit(1); } } app_args.pidfile = conf->get_str("pidfile"); if(app_args.start_opt == "stop"){ kill_process(); exit(0); } if(app_args.start_opt == "restart"){ if(file_exists(app_args.pidfile)){ kill_process(); } } check_pidfile(); { // logger std::string log_output; std::string log_level_; int64_t log_rotate_size; log_level_ = conf->get_str("logger.level"); strtolower(&log_level_); if(log_level_.empty()){ log_level_ = "debug"; } int level = Logger::get_level(log_level_.c_str()); log_rotate_size = conf->get_int64("logger.rotate.size"); log_output = conf->get_str("logger.output"); if(log_output == ""){ log_output = "stdout"; } if(log_open(log_output.c_str(), level, true, log_rotate_size) == -1){ fprintf(stderr, "error opening log file: %s\n", log_output.c_str()); exit(1); } } app_args.work_dir = conf->get_str("work_dir"); if(app_args.work_dir.empty()){ app_args.work_dir = "."; } if(!is_dir(app_args.work_dir.c_str())){ fprintf(stderr, "'%s' is not a directory or not exists!\n", app_args.work_dir.c_str()); exit(1); } // WARN!!! // deamonize() MUST be called before any thread is created! if(app_args.is_daemon){ daemonize(); } }