⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wapbox.c

📁 The Kannel Open Source WAP and SMS gateway works as both an SMS gateway, for implementing keyword b
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Send IP datagram as it is, segment SMS datagram if necessary. */static void dispatch_datagram(WAPEvent *dgram){    Msg *msg,        *part;    List *sms_datagrams;    static unsigned long msg_sequence = 0L;   /* Used only by this function */    msg = part = NULL;    gw_assert(dgram);    sms_datagrams = NULL;          if (dgram->type != T_DUnitdata_Req) {        warning(0, "dispatch_datagram received event of unexpected type.");        wap_event_dump(dgram);    } else {        if (dgram->u.T_DUnitdata_Req.address_type == ADDR_IPV4) {	    msg = pack_ip_datagram(dgram);            write_to_bearerbox(msg);        } else {            msg_sequence = counter_increase(sequence_counter) & 0xff;            msg = pack_sms_datagram(dgram);            sms_datagrams = sms_split(msg, NULL, NULL, NULL, NULL, concatenation,                                       msg_sequence, max_messages, MAX_SMS_OCTETS);            debug("wap",0,"WDP (wapbox): delivering %ld segments to bearerbox",                  list_len(sms_datagrams));            while ((part = list_extract_first(sms_datagrams)) != NULL) {	            write_to_bearerbox(part);            }            list_destroy(sms_datagrams, NULL);            msg_destroy(msg);        }    }    wap_event_destroy(dgram);}/* * Reloading functions */static void reload_int(int reload, Octstr *desc, long *o, long *n){    if (reload && *o != *n) {        info(0, "Reloading int '%s' from %ld to %ld",              octstr_get_cstr(desc), *o, *n);        *o = *n;    }}static void reload_bool(int reload, Octstr *desc, int *o, int *n){    if (reload && *o != *n) {        info(0, "Reloading bool '%s' from %s to %s",              octstr_get_cstr(desc),              (*o ? "yes" : "no"), (*n ? "yes" : "no"));        *o = *n;    }}/* * Read all reloadable configuration directives */static void config_reload(int reload) {    Cfg *cfg;    CfgGroup *grp;    List *groups;    long map_url_max;    Octstr *s;    long i;    long new_value;    int new_bool;    Octstr *http_proxy_host;    Octstr *http_interface_name;    long http_proxy_port;    List *http_proxy_exceptions;    Octstr *http_proxy_username;    Octstr *http_proxy_password;    int warn_map_url = 0;    /* XXX TO-DO: if(reload) implement wapbox.suspend/mutex.lock */        if (reload)        debug("config_reload", 0, "Reloading configuration");    /*      * NOTE: we could lstat config file and only reload if it was modified,      * but as we have a include directive, we don't know every file's     * timestamp at this point     */    cfg = cfg_create(config_filename);    if (cfg_read(cfg) == -1) {        warning(0, "Couldn't %sload configuration from `%s'.",                    (reload ? "re" : ""), octstr_get_cstr(config_filename));        return;    }    grp = cfg_get_single_group(cfg, octstr_imm("core"));    http_proxy_host = cfg_get(grp, octstr_imm("http-proxy-host"));    http_proxy_port =  -1;    cfg_get_integer(&http_proxy_port, grp, octstr_imm("http-proxy-port"));    http_proxy_username = cfg_get(grp, octstr_imm("http-proxy-username"));    http_proxy_password = cfg_get(grp, octstr_imm("http-proxy-password"));    http_proxy_exceptions = cfg_get_list(grp, octstr_imm("http-proxy-exceptions"));    if (http_proxy_host != NULL && http_proxy_port > 0) {        http_use_proxy(http_proxy_host, http_proxy_port,                        http_proxy_exceptions, http_proxy_username,                        http_proxy_password);    }    octstr_destroy(http_proxy_host);    octstr_destroy(http_proxy_username);    octstr_destroy(http_proxy_password);    list_destroy(http_proxy_exceptions, octstr_destroy_item);    grp = cfg_get_single_group(cfg, octstr_imm("wapbox"));    if (grp == NULL) {        warning(0, "No 'wapbox' group in configuration.");        return;    }        if (cfg_get_integer(&new_value, grp, octstr_imm("log-level")) != -1) {        reload_int(reload, octstr_imm("log level"), &logfilelevel, &new_value);        logfilelevel = new_value;        log_set_log_level(new_value);    }    /* Configure interface name for http requests */    http_interface_name = cfg_get(grp, octstr_imm("http-interface-name"));    if (http_interface_name != NULL) {        http_set_interface(http_interface_name);        octstr_destroy(http_interface_name);    }    /*      * users may define 'smart-errors' to have WML decks returned with     * error information instread of signaling using the HTTP reply codes     */    cfg_get_bool(&new_bool, grp, octstr_imm("smart-errors"));    reload_bool(reload, octstr_imm("smart error messaging"), &wsp_smart_errors, &new_bool);    cfg_get_bool(&new_bool, grp, octstr_imm("concatenation"));    reload_bool(reload, octstr_imm("concatenation"), &concatenation, &new_bool);    if (cfg_get_integer(&new_value, grp, octstr_imm("max-messages")) != -1) {        max_messages = new_value;        reload_int(reload, octstr_imm("max messages"), &max_messages, &new_value);    }    /* configure URL mappings */    map_url_max = -1;    cfg_get_integer(&map_url_max, grp, octstr_imm("map-url-max"));    if (map_url_max > 0)        warn_map_url = 1;    if (reload) { /* clear old map */        wap_map_destroy();        wap_map_user_destroy();    }	    if ((device_home = cfg_get(grp, octstr_imm("device-home"))) != NULL) {        wap_map_url_config_device_home(octstr_get_cstr(device_home));    }    if ((s = cfg_get(grp, octstr_imm("map-url"))) != NULL) {        warn_map_url = 1;        wap_map_url_config(octstr_get_cstr(s));        octstr_destroy(s);    }    debug("wap", 0, "map_url_max = %ld", map_url_max);    for (i = 0; i <= map_url_max; i++) {        Octstr *name;        name = octstr_format("map-url-%d", i);        if ((s = cfg_get(grp, name)) != NULL)            wap_map_url_config(octstr_get_cstr(s));        octstr_destroy(name);    }    /* warn the user that he/she should use the new wap-url-map groups */    if (warn_map_url)        warning(0, "'map-url' config directive and related are deprecated, "                   "please use wap-url-map group");    /* configure wap-url-map */    groups = cfg_get_multi_group(cfg, octstr_imm("wap-url-map"));    while (groups && (grp = list_extract_first(groups)) != NULL) {        Octstr *name, *url, *map_url, *send_msisdn_query;        Octstr *send_msisdn_header, *send_msisdn_format;        int accept_cookies;        name = cfg_get(grp, octstr_imm("name"));        url = cfg_get(grp, octstr_imm("url"));        map_url = cfg_get(grp, octstr_imm("map-url"));        send_msisdn_query = cfg_get(grp, octstr_imm("send-msisdn-query"));        send_msisdn_header = cfg_get(grp, octstr_imm("send-msisdn-header"));        send_msisdn_format = cfg_get(grp, octstr_imm("send-msisdn-format"));        accept_cookies = -1;        cfg_get_bool(&accept_cookies, grp, octstr_imm("accept-cookies"));        wap_map_add_url(name, url, map_url, send_msisdn_query, send_msisdn_header,                        send_msisdn_format, accept_cookies);        info(0, "Added wap-url-map <%s> with url <%s>, map-url <%s>, "                "send-msisdn-query <%s>, send-msisdn-header <%s>, "                "send-msisdn-format <%s>, accept-cookies <%s>",              octstr_get_cstr(name), octstr_get_cstr(url),              octstr_get_cstr(map_url), octstr_get_cstr(send_msisdn_query),              octstr_get_cstr(send_msisdn_header),              octstr_get_cstr(send_msisdn_format), (accept_cookies ? "yes" : "no"));    }    list_destroy(groups, NULL);    /* configure wap-user-map */    groups = cfg_get_multi_group(cfg, octstr_imm("wap-user-map"));    while (groups && (grp = list_extract_first(groups)) != NULL) {        Octstr *name, *user, *pass, *msisdn;        name = cfg_get(grp, octstr_imm("name"));        user = cfg_get(grp, octstr_imm("user"));        pass = cfg_get(grp, octstr_imm("pass"));        msisdn = cfg_get(grp, octstr_imm("msisdn"));                   wap_map_add_user(name, user, pass, msisdn);        info(0,"Added wap-user-map <%s> with credentials <%s:%s> "               "and MSISDN <%s>", octstr_get_cstr(name),             octstr_get_cstr(user), octstr_get_cstr(pass),             octstr_get_cstr(msisdn));    }    list_destroy(groups, NULL);    cfg_destroy(cfg);    /* XXX TO-DO: if(reload) implement wapbox.resume/mutex.unlock */}int main(int argc, char **argv) {    int cf_index;    int restart = 0;    Msg *msg;    Cfg *cfg;    double heartbeat_freq =  DEFAULT_HEARTBEAT;        gwlib_init();    cf_index = get_and_set_debugs(argc, argv, NULL);        setup_signal_handlers();        if (argv[cf_index] == NULL)        config_filename = octstr_create("kannel.conf");    else        config_filename = octstr_create(argv[cf_index]);    cfg = cfg_create(config_filename);    if (cfg_read(cfg) == -1)        panic(0, "Couldn't read configuration from `%s'.", octstr_get_cstr(config_filename));    report_versions("wapbox");    cfg = init_wapbox(cfg);    info(0, "------------------------------------------------------------");    info(0, GW_NAME " wapbox version %s starting up.", GW_VERSION);        sequence_counter = counter_create();    wsp_session_init(&wtp_resp_dispatch_event,                     &wtp_initiator_dispatch_event,                     &wap_appl_dispatch,                     &wap_push_ppg_dispatch_event);    wsp_unit_init(&dispatch_datagram, &wap_appl_dispatch);    wsp_push_client_init(&wsp_push_client_dispatch_event,                          &wtp_resp_dispatch_event);        if (cfg)        wtp_initiator_init(&dispatch_datagram, &wsp_session_dispatch_event,                           timer_freq);    wtp_resp_init(&dispatch_datagram, &wsp_session_dispatch_event,                  &wsp_push_client_dispatch_event, timer_freq);    wap_appl_init(cfg);#if (HAVE_WTLS_OPENSSL)    wtls_secmgr_init();    wtls_init();#endif        if (cfg) {        wap_push_ota_init(&wsp_session_dispatch_event,                           &wsp_unit_dispatch_event);        wap_push_ppg_init(&wap_push_ota_dispatch_event, &wap_appl_dispatch,                           cfg);    }		    wml_init();        if (bearerbox_host == NULL)    	bearerbox_host = octstr_create(BB_DEFAULT_HOST);    connect_to_bearerbox(bearerbox_host, bearerbox_port, bearerbox_ssl, NULL		    /* bearerbox_our_port */);    if (cfg)        wap_push_ota_bb_address_set(bearerbox_host);	        program_status = running;    if (0 > heartbeat_start(write_to_bearerbox, heartbeat_freq,     	    	    	    	       wap_appl_get_load)) {        info(0, GW_NAME "Could not start heartbeat.");    }    while (program_status != shutting_down) {	WAPEvent *dgram;    /* block infinite for reading messages */	msg = read_from_bearerbox(INFINITE_TIME);	if (msg == NULL)	    break;	if (msg_type(msg) == admin) {	    if (msg->admin.command == cmd_shutdown) {		info(0, "Bearerbox told us to die");		program_status = shutting_down;	    } else if (msg->admin.command == cmd_restart) {		info(0, "Bearerbox told us to restart");		restart = 1;		program_status = shutting_down;	    }	    /*	     * XXXX here should be suspend/resume, add RSN	     */	} else if (msg_type(msg) == wdp_datagram) {        switch (msg->wdp_datagram.destination_port) {        case CONNECTIONLESS_PORT:        case CONNECTION_ORIENTED_PORT:	    	dgram = wap_event_create(T_DUnitdata_Ind);	    	dgram->u.T_DUnitdata_Ind.addr_tuple = wap_addr_tuple_create(				msg->wdp_datagram.source_address,				msg->wdp_datagram.source_port,				msg->wdp_datagram.destination_address,				msg->wdp_datagram.destination_port);	    	dgram->u.T_DUnitdata_Ind.user_data = msg->wdp_datagram.user_data;	    	msg->wdp_datagram.user_data = NULL;          	wap_dispatch_datagram(dgram); 			break;        case WTLS_CONNECTIONLESS_PORT:        case WTLS_CONNECTION_ORIENTED_PORT:#if (HAVE_WTLS_OPENSSL)            dgram = wtls_unpack_wdp_datagram(msg);            if (dgram != NULL)                wtls_dispatch_event(dgram);#endif			break;        default:                panic(0,"Bad packet received! This shouldn't happen!");                break;        } 	} else {	    warning(0, "Received other message than wdp/admin, ignoring!");	}	msg_destroy(msg);    }    info(0, GW_NAME " wapbox terminating.");        program_status = shutting_down;    heartbeat_stop(ALL_HEARTBEATS);    counter_destroy(sequence_counter);    if (cfg)        wtp_initiator_shutdown();    wtp_resp_shutdown();    wsp_push_client_shutdown();    wsp_unit_shutdown();    wsp_session_shutdown();    wap_appl_shutdown();    radius_acct_shutdown();    if (cfg) {        wap_push_ota_shutdown();        wap_push_ppg_shutdown();    }    wml_shutdown();    close_connection_to_bearerbox();    wap_map_destroy();    wap_map_user_destroy();    octstr_destroy(device_home);    octstr_destroy(bearerbox_host);    octstr_destroy(config_filename);    /*     * Just sleep for a while to get bearerbox chance to restart.     * Otherwise we will fail while trying to connect to bearerbox!     */    if (restart) {        gwthread_sleep(5.0);    }    gwlib_shutdown();    /* now really restart */    if (restart)        execvp(argv[0], argv);    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -