Beispiel #1
0
int check_single()
{
    int fd = -1;
    char buf[16] = {0};

    fd = open(config_get_strval("pid_file", "./pid"), O_RDWR|O_CREAT, 0644);
    if (fd < 0)
        BOOT_LOG(-1, "check single failed");

    struct flock fl;

    fl.l_type = F_WRLCK;
    fl.l_whence = SEEK_SET;
    fl.l_start = 0;
    fl.l_len = 0;
    fl.l_pid = getpid();

    if (fcntl(fd, F_SETLK, &fl) < 0) {
        if (errno == EACCES || errno == EAGAIN) {
            close(fd);
            BOOT_LOG(-1, "service is running");
            return -2;
        }
        BOOT_LOG(-1, "service is running");
    }

    if (ftruncate(fd, 0) != 0)
        BOOT_LOG(-1, "check single failed");

    snprintf(buf, sizeof(buf), "%d", (int)getpid());
    if (write(fd, buf, strlen(buf)) == -1)
        BOOT_LOG(-1, "check single failed");

    return 0;
}
Beispiel #2
0
/**
  * @brief AsyncServer框架要求实现的接口之一。 
  *
  */
extern "C" int  init_service(int isparent)
{
	if (!isparent) {
		setup_timer();
		init_all_timer_type();
		init_funcs();
        const char *udp_ip = get_server_ip();
        uint16_t udp_port = get_server_port();
        bind_udp_socket(udp_ip, udp_port);
		g_dirty_word = new Cdirty_word();
		if (!g_dirty_word->is_inited)
			return -1;
		regist_timers();
		if (load_xmlconf("../conf/GameSvr.xml", load_game_svr_config) == -1)
			return -1;

		max_msg_count = config_get_intval("max_msg_count", 1024);
		/*
		if(g_seg_mgr.init("../data/")) {
        	BOOT_LOG(-1,"online udp listen:%s:%d %u",udp_ip, udp_port, max_msg_count);
		}
		*/

        BOOT_LOG(0,"online udp listen:%s:%d %u",udp_ip, udp_port, max_msg_count);
	}

	return 0;
}
Beispiel #3
0
int load_profession_work(const char *file)
{
	xmlDocPtr doc;
	xmlNodePtr cur, chl;
	int i, err = -1;
	int record_count = 1;

	doc = xmlParseFile (file);
	if (!doc) {
		ERROR_RETURN (("load profession work config failed"), -1);
	}
	cur = xmlDocGetRootElement(doc);
	if (!cur) {
		ERROR_LOG ("xmlDocGetRootElement error");
		goto exit;
	}

	cur = cur->xmlChildrenNode;
	while (cur) {
		if ((!xmlStrcmp(cur->name, (const xmlChar *)"Entry"))) {
			DECODE_XML_PROP_INT(i, cur, "ID");
			if (record_count > MAX_RECORD  || record_count != i) {
				ERROR_LOG ("parse %s failed, Count=%d, id=%d", file, record_count, i);
				goto exit;
			}
			work_config[i - 1].id = i;

			DECODE_XML_PROP_INT(work_config[i - 1].profession, cur, "PROFESSION");
			if (work_config[i - 1].profession > 50) {
				ERROR_LOG ("parse %s failed, profession = %u", file, work_config[i].profession);
				goto exit;
			}

			DECODE_XML_PROP_INT(work_config[i - 1].level, cur, "LEVEL");
			if (work_config[i - 1].level > 10) {
				ERROR_LOG ("parse %s failed, level=%d", file, work_config[i].level);
				goto exit;
			}

			DECODE_XML_PROP_INT(work_config[i - 1].vip, cur, "VIP");
			if ((work_config[i - 1].vip != 0) && (work_config[i - 1].vip != 1)) {
				ERROR_LOG ("parse %s failed vip=%d", file, work_config[i].vip);
				goto exit;
			}

			chl = cur->xmlChildrenNode;
			if ((parse_profession_work_items(&work_config[record_count - 1], chl) != 0)) {
				goto exit;
			}
			record_count++;
		}
		cur = cur->next;
	}

	err = 0;
exit:
	xmlFreeDoc (doc);
	BOOT_LOG (err, "Load profession work item file %s", file);
}
Beispiel #4
0
int m_process_service_init()
{
    init_timer();
    my_read_conf();
    multicast_init();
	if (tm_load_dirty("./data/tm_dirty.dat") < 0) {
		BOOT_LOG(-1, " fail to laod dirty data");
	}
    return 0;
}
Beispiel #5
0
int el_async::bench_conf_t::load(const char* path_suf)
{
	int ret = 0;

	this->file_ini.load(path_suf);

	if (0 != this->file_ini.get_val(this->liblogic_path, "plugin", "liblogic")){
		BOOT_LOG(ERR, "[%s]plugin,liblogic", path_suf);
		return -1;
	}
	this->file_ini.get_val(this->max_fd_num, "common", "max_fd_num");
	this->file_ini.get_val(this->is_daemon, "common", "is_daemon");
	this->file_ini.get_val(this->fd_time_out, "common", "fd_time_out");
	this->file_ini.get_val(this->page_size_max, "common", "page_size_max");
	this->file_ini.get_val(this->listen_num, "common", "listen_num");
	if (0 != this->file_ini.get_val(this->log_dir, "log", "dir")){
		BOOT_LOG(ERR, "log,dir");
		return -1;
	}
	this->file_ini.get_val(this->log_level, "log", "level");
	this->file_ini.get_val(this->log_save_next_file_interval_min, "log", "save_next_file_interval_min");
	this->file_ini.get_val(this->core_size, "core", "size");
	this->file_ini.get_val(this->restart_cnt_max, "core", "restart_cnt_max");
	this->file_ini.get_val(this->daemon_tcp_ip, "net", "daemon_tcp_ip");
	this->file_ini.get_val(this->daemon_tcp_port, "net", "daemon_tcp_port");
	this->file_ini.get_val(this->daemon_tcp_max_fd_num, "net", "daemon_tcp_max_fd_num");

	this->file_ini.get_val(this->mcast_incoming_if, "multicast", "mcast_incoming_if");
	this->file_ini.get_val(this->mcast_outgoing_if, "multicast", "mcast_outgoing_if");
	this->file_ini.get_val(this->mcast_ip, "multicast", "mcast_ip");
	this->file_ini.get_val(this->mcast_port, "multicast", "mcast_port");

	this->file_ini.get_val(this->addr_mcast_incoming_if, "addr_multicast", "mcast_incoming_if");
	this->file_ini.get_val(this->addr_mcast_outgoing_if, "addr_multicast", "mcast_outgoing_if");
	this->file_ini.get_val(this->addr_mcast_ip, "addr_multicast", "mcast_ip");
	this->file_ini.get_val(this->addr_mcast_port, "addr_multicast", "mcast_port");

	return ret;
}
Beispiel #6
0
int handle_init(int argc, char** argv, int pid_type)
{
	switch (pid_type) {
	case PROC_MAIN:
		break;
	case PROC_WORK:
		pReg = new Cregdeal();
		cpo  = new Cclientproto(config_get_strval("dbproxy_ip"),config_get_intval ("dbproxy_port",0));
		net  = new CNetComm(config_get_strval("verify_ip"), config_get_intval("verify_port",0));
		statfile = config_get_strval("statistic_logfile");
		max_register_channel = config_get_intval("max_register_channel",0);
		if (pReg->get_no_count_ip() == -1) {
			BOOT_LOG(-1, "get no count ip wrong");
		}
	
		break;
	case PROC_CONN:
		break;
	default:
		BOOT_LOG(-1, "Invalid pid_type=%d", pid_type);
	}

	return 0;
}
Beispiel #7
0
int load_weekend_bonus(const char *file)
{
	xmlDocPtr doc;
	xmlNodePtr cur, chl; 
	int i, err = -1;
	int ex_count;
	
	ex_count = 0;
	memset(weekend_bonus, 0, sizeof (weekend_bonus));

	doc = xmlParseFile (file);
	if (!doc) ERROR_RETURN (("load items config failed"), -1);

	cur = xmlDocGetRootElement(doc); 
	if (!cur) {
		ERROR_LOG ("xmlDocGetRootElement error");
		goto exit;
	}

	cur = cur->xmlChildrenNode; 
	while (cur) {
		if ((!xmlStrcmp(cur->name, (const xmlChar *)"Week"))) {
			DECODE_XML_PROP_INT(i, cur, "WeekID");
			if (ex_count >= WEEKEND_BONUS_TABLE_SIZE - 1 || i <= 0) {
				ERROR_LOG ("parse %s failed, Count=%d, id=%d", file, ex_count, i);
				goto exit;
			}
			weekend_bonus[i].weekid = i;
			if (weekend_bonus[i].weekid > WEEKEND_BONUS_TABLE_SIZE - 1) {
				ERROR_LOG ("parse %s failed, Count=%d, weekid=%d", file, ex_count, weekend_bonus[i].weekid);
				goto exit;
			}

			chl = cur->xmlChildrenNode;
			if ( (parse_weekend_single_item(weekend_bonus[i].item, &(weekend_bonus[i].item_count), chl) != 0) )
				goto exit;

			ex_count++;
		}
		cur = cur->next;
	}

	err = 0;
exit:
	xmlFreeDoc (doc);
	BOOT_LOG (err, "Load race bonus item file %s", file);

}
Beispiel #8
0
int load_candy(const char *file)
{
	xmlDocPtr doc;
	xmlNodePtr cur, chl;
	int i, err = -1;
	int gifts_count;

	gifts_count = 0;
	memset (candyitem, 0, sizeof (candyitem));

	doc = xmlParseFile (file);
	if (!doc) ERROR_RETURN (("load gifts config failed"), -1);

	cur = xmlDocGetRootElement(doc);
	if (!cur) {
		ERROR_LOG ("xmlDocGetRootElement error");
		goto exit;
	}

	cur = cur->xmlChildrenNode;
	while (cur) {
		if ((!xmlStrcmp(cur->name, (const xmlChar *)"Entry"))) {
			DECODE_XML_PROP_INT(i, cur, "ID");
			if (gifts_count > GIFTS_TABLE_SIZE - 1 || gifts_count != i) {
				ERROR_LOG ("parse %s failed, Count=%d, id=%d", file, gifts_count, i);
				goto exit;
			}

			candyitem[i].send_gift_id = i;
			chl = cur->xmlChildrenNode;
			if ( (parse_candy_items(&candyitem[i], chl) != 0) )
				goto exit;

			gifts_count++;
		}
		cur = cur->next;
	}

	err = 0;
exit:
	xmlFreeDoc (doc);
	BOOT_LOG (err, "Load gifts item file %s", file);
}
Beispiel #9
0
int daemon_start (int argc, char** argv)
{
	struct sigaction sa;
	sigset_t sset;
	const char *style;

	rlimit_reset ();

	memset(&sa, 0, sizeof(sa));
	sa.sa_handler = sigterm_handler;
	sigaction(SIGINT, &sa, NULL);
	sigaction(SIGTERM, &sa, NULL);
	sigaction(SIGQUIT, &sa, NULL);
	
	sa.sa_handler = sighup_handler;
	sigaction(SIGHUP, &sa, NULL);

	signal(SIGPIPE,SIG_IGN);	
	signal(SIGCHLD,SIG_IGN);	

	sigemptyset(&sset);
	sigaddset(&sset, SIGSEGV);
	sigaddset(&sset, SIGBUS);
	sigaddset(&sset, SIGABRT);
	sigaddset(&sset, SIGILL);
	sigaddset(&sset, SIGCHLD);
	sigaddset(&sset, SIGFPE);
	sigprocmask(SIG_UNBLOCK, &sset, &sset);

	arg_start = argv[0];
	arg_end = argv[argc-1] + strlen (argv[argc - 1]) + 1;
	env_start = environ[0];
	dup_argv(argc, argv);

	style = config_get_strval ("run_mode");
	if (!style || !strcasecmp ("background", style)) {
		daemon (1, 1);
		backgd_mode = 1;
		BOOT_LOG (0, "switch to daemon mode");
	}
	return 0;
}
Beispiel #10
0
int load_xmlconf(const char* file, int (*parser)(xmlNodePtr cur_node))
{
	int err = -1;

	xmlDocPtr doc = xmlReadFile(file, NULL, XML_PARSE_NOBLANKS);
	if (!doc) {
		ERROR_LOG("Failed to Load %s", file);
		return -1;
	}

	xmlNodePtr cur = xmlDocGetRootElement(doc); 
	if (!cur) {
		ERROR_LOG("xmlDocGetRootElement error");
		goto fail;
	}

	err = parser(cur);
fail:
	xmlFreeDoc(doc);
	BOOT_LOG(err, "==Load File %s", file);
}
Beispiel #11
0
/**
  * @brief AsyncServer框架要求实现的接口之一。 
  *
  */
extern "C" int  init_service(int isparent)
{
	if (!isparent) {
		setup_timer();
		init_all_timer_type();
		init_funcs();
        const char *udp_ip = get_server_ip();
        uint16_t udp_port = get_server_port();
        bind_udp_socket(udp_ip, udp_port);
		regist_timers();
		if (load_xmlconf("../conf/GameSvr.xml", load_game_svr_config) == -1)
			return -1;


		max_msg_count = config_get_intval("max_msg_count", 1024);

        BOOT_LOG(0,"online udp listen:%s:%d %u",udp_ip, udp_port, max_msg_count);
	}

	return 0;
}
Beispiel #12
0
/* @breif load friendbox.xml file
 */
int mw_load_friendbox_config(const char* file)
{
    xmlDocPtr doc;
    xmlNodePtr cur;

    uint32_t itemid = 0;
    uint32_t i = 0;
    int err = -1;
    memset(&mw_friend_box_items, 0, sizeof (mw_friend_box_items));

    doc = xmlParseFile (file);
    if (!doc) ERROR_RETURN (("load items config failed"), -1);

    cur = xmlDocGetRootElement(doc);
    if (!cur) {
        ERROR_LOG ("xmlDocGetRootElement error");
        goto exit;
    }

    cur = cur->xmlChildrenNode;
    while (cur)
    {
        if (!xmlStrcmp(cur->name, (const xmlChar*)"Item"))
        {
            DECODE_XML_PROP_UINT32(itemid, cur, "ID");
            mw_friend_box_items.itemids[i] = itemid;
            i++;
        }
        cur = cur->next;
    }

    mw_friend_box_items.count = i;

    err = 0;
exit:
    xmlFreeDoc (doc);
    BOOT_LOG (err, "Load mw friend box item file %s", file);

}
Beispiel #13
0
int main(int argc, char* argv[])
{
	pid_t pid;
	
	parse_args(argc, argv);

	if (config_init(argv[1]) == -1) {
		BOOT_LOG(-1, "Failed to Parse File '%s'", argv[1]);
	}

	if (config_init("common.conf") == -1) {
			BOOT_LOG(-1, "Failed to Parse File '%s'", argv[1]);
	}

	daemon_start(argc, argv);
	load_bind_file();
	log_init_ex( config_get_strval("log_dir"),
				config_get_intval("log_level", log_lvl_trace),
				config_get_intval("log_size", 1<<30),
				config_get_intval("max_log_files", 0),
				config_get_strval("log_prefix") ,
				config_get_intval("log_save_next_file_interval_min", 0) );

    //Èç¹ûʹÓÃÔà´Ê¼ì²âÂß¼­£¬Ôò¿ªÆô¸¸½ø³ÌµÄÔà´Ê¸üÐÂÂß¼­.
    if (config_get_intval("tm_dirty_use_dirty_logical", 1) == 1) {
        if (tm_dirty_daemon( config_get_strval("tm_dirty_local_dirty_file_path"),
                    config_get_strval("tm_dirty_server_addr"),
                    config_get_intval("tm_dirty_update_cycle", 600),
                    NULL) == -1) {
            BOOT_LOG(-1, "FAILED TO RUN TM_DIRTY_DAEMON");
        }   
    }   

	net_init(MAXFDS, MAXFDS);

	bind_config_t* bc = get_bind_conf();
//--------------------------------
	net_start(config_get_strval("online_ip"), config_get_intval("online_port", 443), bc->configs);
//--------------------------------

//	bind_config_elem_t* bc_elem;
	int i = 0;
	for ( ; i != bc->bind_num; ++i ) {
		bind_config_elem_t* bc_elem = &(bc->configs[i]);
		shmq_create(bc_elem);

		if ( (pid = fork ()) < 0 ) {
			BOOT_LOG(-1, "fork child process");
		} else if (pid > 0) { //parent process
			close_shmq_pipe(bc, i, 0);
			do_add_conn(bc_elem->sendq.pipe_handles[0], PIPE_TYPE_FD, 0, bc_elem);
			//net_start(bc_elem->bind_ip, bc_elem->bind_port, bc_elem);
		} else { //child process
			run_worker_process(bc, i, i + 1);
		}
	}

	while (!stop) {
		net_loop(-1, PAGESIZE, 1);
	}

	net_exit();
	shmq_destroy(0, bc->bind_num);
	daemon_stop();

	return 0;
}
Beispiel #14
0
int main(int argc, char* argv[])
{
    arg_start = argv[0];
    arg_end = argv[argc-1] + strlen(argv[argc - 1]) + 1;
    env_start = environ[0];

    if (argc != 2)
        exit(-1);

    daemon_start();

    INFO_LOG ("async_server %s, report bugs to <*****@*****.**>", VERSION);

    load_config_file(argv[1]);

    check_single();

    if (config_get_strval("proc_name", NULL))
    {
        set_title("%s-MAIN", config_get_strval("proc_name", NULL));
    }
    else
    {
        set_title("%s-MAIN", arg_start);
    }

    load_work_file(config_get_strval("work_conf", ""));

    if (-1 == log_init(config_get_strval("log_dir", "./"), (log_lvl_t)config_get_intval("log_level", 8),
                       config_get_intval("log_size", 33554432),
                       config_get_intval("log_maxfiles", 100),
                       "main_")) {
        BOOT_LOG(-1, "log init");
    }

    init_warning_system();

    plugin_load(config_get_strval("plugin_file", ""));


    shmq_init(g_work_confs.size(), config_get_intval("shmq_size", 8388608));

    int max_connect = config_get_intval("max_connect", 10000);
    if (max_connect <= 4096)
        max_connect = 4096;

    g_max_connect = max_connect;

    int max_pkg_len = config_get_intval("max_pkg_len", 16384);
    if (max_pkg_len <= 4096)
        max_pkg_len = 4096;

    g_max_pkg_len = max_pkg_len;


    const char * bind_ip = config_get_strval("bind_ip", NULL);
    if (NULL == bind_ip)
    {
        BOOT_LOG(-1, "unspecified bind_ip");
        return -1;
    }

    if (0 != get_ip_by_name(bind_ip, g_bind_ip))
    {
        strncpy(g_bind_ip, bind_ip, 16);
    }


    if (g_plugin.plugin_init) 
    {
        if (g_plugin.plugin_init(PROC_MAIN) != 0)
            BOOT_LOG(-1, "plugin_init init failed PROC_MAIN");
    }


    for (uint32_t i = 0; i < g_work_confs.size(); ++i)
        g_work_confs[i].pid = fork_work(i);

    pid_t conn_pid = fork_conn();

    while (!g_stop) {
        int status = 0;
        pid_t p = waitpid(-1, &status, 0);
        if(-1 == p)
            continue;

        if (WEXITSTATUS(status) == 10) {
            if (p == conn_pid) {
                conn_pid = -1;
            } else {
                for (uint32_t i = 0; i < g_work_confs.size(); ++i) {
                    if (g_work_confs[i].pid == p) {
                        g_work_confs[i].pid = -1;
                        break;
                    }
                }
            }
        } else {
            if (p == conn_pid) {
                conn_pid = fork_conn();
                send_warning_msg("conn core", 0, 0, 0, config_get_strval("bind_ip", "0.0.0.0"));
                ERROR_LOG("conn core");
            } else {
                for (uint32_t i = 0; i < g_work_confs.size(); ++i) {
                    if (g_work_confs[i].pid == p) {
                        ERROR_LOG("work core, id: %u, pid: %d", g_work_confs[i].id, p);
                        g_work_confs[i].pid = fork_work(i);
                        send_warning_msg("work core", g_work_confs[i].id, 0, 0, config_get_strval("bind_ip", "0.0.0.0"));
                        break;
                    }
                }
            }
        }
    }

    for (uint32_t i = 0; i < g_work_confs.size(); ++i) {
        if (g_work_confs[i].pid != -1)
            kill(g_work_confs[i].pid, SIGTERM);
    }

    if (conn_pid != -1)
        kill(conn_pid, SIGTERM);

    while (true) {
        int ret = 0;
        for (uint32_t i = 0; i < g_work_confs.size(); ++i) {
            if (g_work_confs[i].pid != -1)
                ret = 1;
        }

        if (ret || conn_pid != -1) {
            int status = 0;
            pid_t p = waitpid(-1, &status, 0);
            if(-1 == p)
                continue;

            if (p == conn_pid) {
                conn_pid = -1;
            } else {
                for (uint32_t i = 0; i < g_work_confs.size(); ++i) {
                    if (g_work_confs[i].pid == p) {
                        g_work_confs[i].pid = -1;
                        break;
                    }
                }
            }
        } else {
            break;
        }
    }

    if (g_plugin.plugin_fini)
        g_plugin.plugin_fini(PROC_MAIN);
}