diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-03-03 02:16:36 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-03-03 02:16:36 +0000 |
commit | fd91e3e6c398d5965e85a38bdf197af70ad86f75 (patch) | |
tree | 68aa6c97ef5c156ac6ddf53bd389b4be2be841b1 /pjlib-util/src/pjstun-srv-test/server_main.c | |
parent | 8a445dbdcb57138676aed4061b9cf1c3c1b1b10b (diff) |
Committed today's work on STUN
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1037 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib-util/src/pjstun-srv-test/server_main.c')
-rw-r--r-- | pjlib-util/src/pjstun-srv-test/server_main.c | 108 |
1 files changed, 97 insertions, 11 deletions
diff --git a/pjlib-util/src/pjstun-srv-test/server_main.c b/pjlib-util/src/pjstun-srv-test/server_main.c index 4825cf8e..e4fc6d5b 100644 --- a/pjlib-util/src/pjstun-srv-test/server_main.c +++ b/pjlib-util/src/pjstun-srv-test/server_main.c @@ -61,8 +61,17 @@ static struct stun_server unsigned thread_cnt; pj_thread_t *threads[16]; + } server; +static struct options +{ + char *realm; + char *user_name; + char *password; + char *nonce; + pj_bool_t use_fingerprint; +} o; static pj_status_t server_perror(const char *sender, const char *title, pj_status_t status) @@ -131,10 +140,10 @@ static pj_status_t on_rx_binding_request(pj_stun_session *sess, return status; /* Create MAPPED-ADDRESS attribute */ - status = pj_stun_msg_add_generic_ip_addr_attr(tdata->pool, tdata->msg, - PJ_STUN_ATTR_MAPPED_ADDR, - PJ_FALSE, - src_addr, src_addr_len); + status = pj_stun_msg_add_ip_addr_attr(tdata->pool, tdata->msg, + PJ_STUN_ATTR_MAPPED_ADDR, + PJ_FALSE, + src_addr, src_addr_len); if (status != PJ_SUCCESS) { server_perror(THIS_FILE, "Error creating response", status); pj_stun_msg_destroy_tdata(sess, tdata); @@ -144,10 +153,10 @@ static pj_status_t on_rx_binding_request(pj_stun_session *sess, /* On the presence of magic, create XOR-MAPPED-ADDRESS attribute */ if (msg->hdr.magic == PJ_STUN_MAGIC) { status = - pj_stun_msg_add_generic_ip_addr_attr(tdata->pool, tdata->msg, - PJ_STUN_ATTR_XOR_MAPPED_ADDRESS, - PJ_TRUE, - src_addr, src_addr_len); + pj_stun_msg_add_ip_addr_attr(tdata->pool, tdata->msg, + PJ_STUN_ATTR_XOR_MAPPED_ADDRESS, + PJ_TRUE, + src_addr, src_addr_len); if (status != PJ_SUCCESS) { server_perror(THIS_FILE, "Error creating response", status); pj_stun_msg_destroy_tdata(sess, tdata); @@ -156,7 +165,7 @@ static pj_status_t on_rx_binding_request(pj_stun_session *sess, } /* Send */ - status = pj_stun_session_send_msg(sess, PJ_STUN_CACHE_RESPONSE, + status = pj_stun_session_send_msg(sess, PJ_TRUE, src_addr, src_addr_len, tdata); return status; } @@ -263,12 +272,32 @@ static pj_status_t init_service(struct service *svc) sess_cb.on_send_msg = &on_send_msg; sess_cb.on_rx_request = &on_rx_request; status = pj_stun_session_create(server.endpt, "session", - &sess_cb, &svc->sess); + &sess_cb, + o.use_fingerprint!=0, + &svc->sess); if (status != PJ_SUCCESS) goto on_error; pj_stun_session_set_user_data(svc->sess, (void*)svc); + if (o.user_name) { + pj_stun_auth_cred cred; + + pj_bzero(&cred, sizeof(cred)); + + cred.type = PJ_STUN_AUTH_CRED_STATIC; + cred.data.static_cred.realm = pj_str(o.realm); + cred.data.static_cred.username = pj_str(o.user_name); + cred.data.static_cred.data_type = 0; + cred.data.static_cred.data = pj_str(o.password); + cred.data.static_cred.nonce = pj_str(o.nonce); + + pj_stun_session_set_credential(svc->sess, &cred); + puts("Session credential set"); + } else { + puts("Credential not set"); + } + pj_bzero(&service_callback, sizeof(service_callback)); service_callback.on_read_complete = &on_read_complete; @@ -437,8 +466,65 @@ pj_status_t server_destroy(void) } -int main() +static void usage(void) +{ + puts("Usage: pjstun_srv_test [OPTIONS]"); + puts(""); + puts("where OPTIONS:"); + puts(" --realm, -r Set realm of the credential"); + puts(" --username, -u Set username of the credential"); + puts(" --password, -p Set password of the credential"); + puts(" --nonce, -N Set NONCE"); + puts(" --fingerprint, -F Use fingerprint for outgoing requests"); + puts(" --help, -h"); +} + + +int main(int argc, char *argv[]) { + struct pj_getopt_option long_options[] = { + { "realm", 1, 0, 'r'}, + { "username", 1, 0, 'u'}, + { "password", 1, 0, 'p'}, + { "nonce", 1, 0, 'N'}, + { "fingerprint",0, 0, 'F'}, + { "help", 0, 0, 'h'} + }; + int c, opt_id; + + while((c=pj_getopt_long(argc,argv, "r:u:p:hF", long_options, &opt_id))!=-1) { + switch (c) { + case 'r': + o.realm = pj_optarg; + break; + case 'u': + o.user_name = pj_optarg; + break; + case 'p': + o.password = pj_optarg; + break; + case 'N': + o.nonce = pj_optarg; + break; + case 'h': + usage(); + return 0; + case 'F': + o.use_fingerprint = PJ_TRUE; + break; + default: + printf("Argument \"%s\" is not valid. Use -h to see help", + argv[pj_optind]); + return 1; + } + } + + if (pj_optind != argc) { + puts("Error: invalid arguments"); + return 1; + } + + if (server_init()) { server_destroy(); return 1; |