예제 #1
0
파일: core.c 프로젝트: shenzhe/bsp
// Init BSP-core
int core_init()
{
    if (!core_settings.initialized)
    {
        init_core_setting();
    }

    if (core_settings.is_daemonize)
    {
        proc_daemonize();
    }

    fd_init(0);
    log_init();
    load_runtime_setting();
    status_op_core(STATUS_OP_INSTANCE_ID, (size_t) core_settings.instance_id);
    thread_init();
    save_pid();
    signal_init();
    socket_init();
    memdb_init();
    online_init();

    // Load modules
    BSP_VALUE *val = object_get_hash_str(runtime_settings, "modules");
    BSP_OBJECT *vobj = value_get_object(val);
    BSP_STRING *vstr = NULL;
    if (vobj && OBJECT_TYPE_ARRAY == vobj->type)
    {
        size_t varr_size = object_size(vobj), i;
        if (varr_size > MAX_MODULES)
        {
            varr_size = MAX_MODULES;
        }

        reset_object(vobj);
        for (i = 0; i < varr_size; i ++)
        {
            val = object_get_array(vobj, i);
            vstr = value_get_string(val);
            if (vstr)
            {
                script_load_module(vstr, 1);
            }
        }
    }

    return BSP_RTN_SUCCESS;
}
예제 #2
0
파일: core.c 프로젝트: shenzhe/bsp
// Start main loop
int core_loop(void (* server_event)(BSP_CALLBACK *))
{
    BSP_THREAD *t = get_thread(MAIN_THREAD);
    if (!t)
    {
        trigger_exit(BSP_RTN_FATAL, "Main thread lost!");
    }

    // Servers
    BSP_VALUE *val = object_get_hash_str(runtime_settings, "servers");
    BSP_OBJECT *vobj = value_get_object(val);
    BSP_STRING *vstr = NULL;
    if (vobj && OBJECT_TYPE_ARRAY == vobj->type)
    {
        struct bsp_conf_server_t srv;
        BSP_OBJECT *vsrv = NULL;
        size_t varr_size = object_size(vobj), i;
        reset_object(vobj);
        for (i = 0; i < varr_size; i ++)
        {
            val = object_get_array(vobj, i);
            vsrv = value_get_object(val);
            if (vsrv && OBJECT_TYPE_HASH == vsrv->type)
            {
                // Default value
                memset(&srv, 0, sizeof(struct bsp_conf_server_t));
                srv.server_inet = INET_TYPE_ANY;
                srv.server_sock = SOCK_TYPE_ANY;
                srv.def_client_type = CLIENT_TYPE_DATA;
                srv.def_data_type = DATA_TYPE_PACKET;
                val = object_get_hash_str(vsrv, "name");
                vstr = value_get_string(val);
                srv.server_name = bsp_strndup(STR_STR(vstr), STR_LEN(vstr));
                val = object_get_hash_str(vsrv, "inet");
                vstr = value_get_string(val);
                if (vstr)
                {
                    if (0 == strncasecmp(STR_STR(vstr), "ipv6", 4))
                    {
                        srv.server_inet = INET_TYPE_IPV6;
                    }
                    else if (0 == strncasecmp(STR_STR(vstr), "ipv4", 4))
                    {
                        srv.server_inet = INET_TYPE_IPV4;
                    }
                    else if (0 == strncasecmp(STR_STR(vstr), "local", 5))
                    {
                        srv.server_inet = INET_TYPE_LOCAL;
                    }
                }
                val = object_get_hash_str(vsrv, "sock");
                vstr = value_get_string(val);
                if (vstr)
                {
                    if (0 == strncasecmp(STR_STR(vstr), "tcp", 3))
                    {
                        srv.server_sock = SOCK_TYPE_TCP;
                    }
                    else if (0 == strncasecmp(STR_STR(vstr), "udp", 3))
                    {
                        srv.server_sock = SOCK_TYPE_UDP;
                    }
                }
                val = object_get_hash_str(vsrv, "addr");
                vstr = value_get_string(val);
                srv.server_addr = bsp_strndup(STR_STR(vstr), STR_LEN(vstr));
                val = object_get_hash_str(vsrv, "port");
                srv.server_port = (int) value_get_int(val);
                val = object_get_hash_str(vsrv, "heartbeat_check");
                srv.heartbeat_check = (int) value_get_int(val);
                val = object_get_hash_str(vsrv, "debug_input");
                srv.debug_hex_input = value_get_boolean(val);
                val = object_get_hash_str(vsrv, "debug_output");
                srv.debug_hex_input = value_get_boolean(val);
                val = object_get_hash_str(vsrv, "max_clients");
                srv.max_clients = (int) value_get_int(val);
                val = object_get_hash_str(vsrv, "max_packet_length");
                srv.max_packet_length = (size_t) value_get_int(val);
                val = object_get_hash_str(vsrv, "websocket");
                if (value_get_boolean(val))
                {
                    srv.def_client_type = CLIENT_TYPE_WEBSOCKET_HANDSHAKE;
                }
                val = object_get_hash_str(vsrv, "data_type");
                vstr = value_get_string(val);
                if (vstr && 0 == strncasecmp(STR_STR(vstr), "stream", 6))
                {
                    srv.def_data_type = DATA_TYPE_STREAM;
                }

                // Add server
                BSP_SERVER *s;
                int srv_fds[MAX_SERVER_PER_CREATION], srv_ct, fd_type;
                int nfds = MAX_SERVER_PER_CREATION;
                nfds = new_server(srv.server_addr, srv.server_port, srv.server_inet, srv.server_sock, srv_fds, &nfds);
                for (srv_ct = 0; srv_ct < nfds; srv_ct ++)
                {
                    fd_type = FD_TYPE_SOCKET_SERVER;
                    s = (BSP_SERVER *) get_fd(srv_fds[srv_ct], &fd_type);
                    if (s)
                    {
                        s->name = srv.server_name;
                        s->heartbeat_check = srv.heartbeat_check;
                        s->def_client_type = srv.def_client_type;
                        s->def_data_type = srv.def_data_type;
                        s->max_packet_length = srv.max_packet_length;
                        s->max_clients = srv.max_clients;
                        s->debug_hex_input = srv.debug_hex_input;
                        s->debug_hex_output = srv.debug_hex_output;

                        add_server(s);
                    }
                    else
                    {
                        bsp_free(srv.server_name);
                    }
                }
            }
        }
    }

    // Server event
    if (server_event)
    {
        core_settings.on_srv_events = server_event;
    }

    // Create 1 Hz clock
    BSP_TIMER *tmr = new_timer(BASE_CLOCK_SEC, BASE_CLOCK_USEC, -1);
    tmr->on_timer = base_timer;
    core_settings.main_timer = tmr;
    dispatch_to_thread(tmr->fd, MAIN_THREAD);
    start_timer(tmr);

    // Let's go
    load_bootstrap();
    trace_msg(TRACE_LEVEL_CORE, "Core   : Main thread loop started");
    thread_process((void *) t);

    return BSP_RTN_SUCCESS;
}
예제 #3
0
파일: core.c 프로젝트: shenzhe/bsp
// Parse runtime setting
int _parse_runtime_setting(BSP_STRING *rs)
{
    if (!rs)
    {
        return BSP_RTN_FATAL;
    }

    if (!core_settings.initialized)
    {
        init_core_setting();
    }

    runtime_settings = json_nd_decode(rs);
    if (!runtime_settings || OBJECT_TYPE_HASH != runtime_settings->type)
    {
        trace_msg(TRACE_LEVEL_ERROR, "Core   : Runtime setting parse error");
        return BSP_RTN_ERROR_GENERAL;
    }

    trace_msg(TRACE_LEVEL_NOTICE, "Core   : Runtime setting parsed");
    BSP_OBJECT *vobj;
    BSP_STRING *vstr;
    BSP_VALUE *val;
    // Global settings
    val = object_get_hash_str(runtime_settings, "global");
    vobj = value_get_object(val);
    if (vobj && OBJECT_TYPE_HASH == vobj->type)
    {
        val = object_get_hash_str(vobj, "instance_id");
        if (val && BSP_VAL_INT == val->type)
        {
            core_settings.instance_id = (int) value_get_int(val);
        }
        val = object_get_hash_str(vobj, "static_workers");
        if (val && BSP_VAL_INT == val->type)
        {
            core_settings.static_workers = value_get_int(val);
            if (core_settings.static_workers <= 0)
            {
                core_settings.static_workers = DEFAULT_STATIC_WORKERS;
            }
        }
        val = object_get_hash_str(vobj, "debug_output");
        core_settings.debug_hex_output = value_get_boolean(val);
        val = object_get_hash_str(vobj, "debug_connector_input");
        core_settings.debug_hex_connector_input = value_get_boolean(val);
        val = object_get_hash_str(vobj, "log_dir");
        vstr = value_get_string(val);
        core_settings.log_dir = (vstr) ? bsp_strndup(STR_STR(vstr), STR_LEN(vstr)) : NULL;
        val = object_get_hash_str(vobj, "enable_log");
        if (value_get_boolean(val) && core_settings.is_daemonize)
        {
            log_open();
            core_settings.trace_recorder = log_add;
        }
        val = object_get_hash_str(vobj, "script_dir");
        vstr = value_get_string(val);
        core_settings.script_dir = (vstr) ? bsp_strndup(STR_STR(vstr), STR_LEN(vstr)) : NULL;
        val = object_get_hash_str(vobj, "script_gc_interval");
        if (val && BSP_VAL_INT == val->type)
        {
            core_settings.script_gc_interval = value_get_int(val);
        }
    }

    return BSP_RTN_SUCCESS;
}
예제 #4
0
파일: gui.c 프로젝트: 20centaurifux/Jekyll
/*
 *	helpers:
 */
static gboolean
_gui_get_first_account(Config *config, gchar **username, gchar **key, gchar **secret)
{
	Section *section;
	Section *child;
	Value *value;
	gint count;
	gint result = 0;
	gboolean success = FALSE;

	g_debug("Getting account data from configuration...");

	*username = NULL;
	*key = NULL;
	*secret = NULL;

	/* get root section from configuration */
	section = config_get_root(config);

	/* find "Accounts" section */
	if((section = section_find_first_child(section, "Twitter")) && (section = section_find_first_child(section, "Accounts")))
	{
		count = section_n_children(section);

		/* set account data */
		for(gint i = 0; i < count && !success; ++i)
		{
			child = section_nth_child(section, i);

			if(!g_ascii_strcasecmp(section_get_name(child), "Account"))
			{
				++result;
			
				if((value = section_find_first_value(child, "username")) && VALUE_IS_STRING(value))
				{
					*username = g_strdup(value_get_string(value));
					g_debug("Found username: \"%s\"", *username);
				}

				if((value = section_find_first_value(child, "oauth_access_key")) && VALUE_IS_STRING(value))
				{
					*key = g_strdup(value_get_string(value));
					g_debug("Found username: \"%s\"", *key);
				}

				if((value = section_find_first_value(child, "oauth_access_secret")) && VALUE_IS_STRING(value))
				{
					*secret = g_strdup(value_get_string(value));
					g_debug("Found username: \"%s\"", *secret);
				}
			}

			if(*username && *key && *secret)
			{
				success = TRUE;
			}
		}
	}

	if(!success)
	{
		g_free(*username);
		g_free(*key);
		g_free(*secret);
	}

	return success;
}