Exemple #1
0
void update_user_mode(char *modes)
{
	int	onoff = 1;
	char	*p_umodes = get_possible_umodes(from_server);

	for (; *modes; modes++)
	{
		if (*modes == '-')
			onoff = 0;
		else if (*modes == '+')
			onoff = 1;

		else if   ((*modes >= 'a' && *modes <= 'z')
			|| (*modes >= 'A' && *modes <= 'Z'))
		{
			size_t 	idx;
			int 	c = *modes;

			idx = ccspan(p_umodes, c);
			if (p_umodes[idx] == 0)
				ircpanic("Invalid user mode referenced");
			set_server_flag(from_server, idx, onoff);

			if (c == 'o' || c == 'O')
				set_server_operator(from_server, onoff);
#if 0
			char c = tolower(*modes);
			size_t idx = (size_t) (strchr(umodes, c) - umodes);

			set_server_flag(from_server, USER_MODE << idx, onoff);

			if (c == 'o' || c == 'O')
				set_server_operator(from_server, onoff);
#endif
		}
	}
}
Exemple #2
0
static int destroy_test(pj_stun_config  *stun_cfg,
                        pj_bool_t with_dns_srv,
                        pj_bool_t in_callback,
                        pj_bool_t use_ipv6)
{
    struct test_session_cfg test_cfg =
    {
        {   /* Client cfg */
            PJ_TRUE,	    /* DNS SRV */
            0xFFFF	    /* Destroy on state */
        },
        {   /* Server cfg */
            0xFFFFFFFF,	    /* flags */
            PJ_TRUE,	    /* respond to allocate  */
            PJ_TRUE	    /* respond to refresh   */
        }
    };
    struct test_session *sess;
    int target_state;
    int rc;

    PJ_LOG(3,("", "  destroy test %s %s",
              (in_callback? "in callback" : ""),
              (with_dns_srv? "with DNS srv" : "")
             ));

    test_cfg.client.enable_dns_srv = with_dns_srv;
    set_server_flag(&test_cfg, use_ipv6);

    for (target_state=PJ_TURN_STATE_RESOLVING; target_state<=PJ_TURN_STATE_READY; ++target_state) {
        enum { TIMEOUT = 60 };
        pjlib_state pjlib_state;
        pj_turn_session_info info;
        pj_time_val tstart;

        capture_pjlib_state(stun_cfg, &pjlib_state);

        PJ_LOG(3,("", "   %s", pj_turn_state_name((pj_turn_state_t)target_state)));

        if (in_callback)
            test_cfg.client.destroy_on_state = target_state;

        rc = create_test_session(stun_cfg, &test_cfg, &sess);
        if (rc != 0)
            return rc;

        if (in_callback) {
            pj_gettimeofday(&tstart);
            rc = 0;
            while (sess->turn_sock) {
                pj_time_val now;

                poll_events(stun_cfg, 100, PJ_FALSE);

                pj_gettimeofday(&now);
                if (now.sec - tstart.sec > TIMEOUT) {
                    rc = -7;
                    break;
                }
            }

        } else {
            pj_gettimeofday(&tstart);
            rc = 0;
            while (sess->turn_sock) {
                pj_time_val now;

                poll_events(stun_cfg, 1, PJ_FALSE);

                pj_turn_sock_get_info(sess->turn_sock, &info);

                if (info.state >= target_state) {
                    pj_turn_sock_destroy(sess->turn_sock);
                    break;
                }

                pj_gettimeofday(&now);
                if (now.sec - tstart.sec > TIMEOUT) {
                    rc = -8;
                    break;
                }
            }
        }


        if (rc != 0) {
            PJ_LOG(3,("", "    error: timeout"));
            return rc;
        }

        poll_events(stun_cfg, 1000, PJ_FALSE);
        destroy_session(sess);

        rc = check_pjlib_state(stun_cfg, &pjlib_state);
        if (rc != 0) {
            PJ_LOG(3,("", "    error: memory/timer-heap leak detected"));
            return rc;
        }
    }

    return 0;
}
Exemple #3
0
static int state_progression_test(pj_stun_config  *stun_cfg,
                                  pj_bool_t use_ipv6)
{
    struct test_session_cfg test_cfg =
    {
        {   /* Client cfg */
            PJ_TRUE,	    /* DNS SRV */
            0xFFFF	    /* Destroy on state */
        },
        {   /* Server cfg */
            0xFFFFFFFF,	    /* flags */
            PJ_TRUE,	    /* respond to allocate  */
            PJ_TRUE	    /* respond to refresh   */
        }
    };
    struct test_session *sess;
    unsigned i;
    int rc = 0;

    PJ_LOG(3,("", "  state progression tests - (%s)",use_ipv6?"IPv6":"IPv4"));

    set_server_flag(&test_cfg, use_ipv6);
    for (i=0; i<=1; ++i) {
        enum { TIMEOUT = 60 };
        pjlib_state pjlib_state;
        pj_turn_session_info info;
        struct test_result result;
        pj_time_val tstart;

        PJ_LOG(3,("", "   %s DNS SRV resolution",
                  (i==0? "without" : "with")));

        capture_pjlib_state(stun_cfg, &pjlib_state);

        test_cfg.client.enable_dns_srv = i;

        rc = create_test_session(stun_cfg, &test_cfg, &sess);
        if (rc != 0)
            return rc;

        pj_bzero(&info, sizeof(info));

        /* Wait until state is READY */
        pj_gettimeofday(&tstart);
        while (sess->turn_sock) {
            pj_time_val now;

            poll_events(stun_cfg, 10, PJ_FALSE);
            rc = pj_turn_sock_get_info(sess->turn_sock, &info);
            if (rc!=PJ_SUCCESS)
                break;

            if (info.state >= PJ_TURN_STATE_READY)
                break;

            pj_gettimeofday(&now);
            if (now.sec - tstart.sec > TIMEOUT) {
                PJ_LOG(3,("", "    timed-out"));
                break;
            }
        }

        if (info.state != PJ_TURN_STATE_READY) {
            PJ_LOG(3,("", "    error: state is not READY"));
            destroy_session(sess);
            return -130;
        }

        /* Deallocate */
        pj_turn_sock_destroy(sess->turn_sock);

        /* Wait for couple of seconds.
         * We can't poll the session info since the session may have
         * been destroyed
         */
        poll_events(stun_cfg, 2000, PJ_FALSE);
        sess->turn_sock = NULL;
        pj_memcpy(&result, &sess->result, sizeof(result));
        destroy_session(sess);

        /* Check the result */
        if ((result.state_called & (1<<PJ_TURN_STATE_RESOLVING)) == 0) {
            PJ_LOG(3,("", "    error: PJ_TURN_STATE_RESOLVING is not called"));
            return -140;
        }

        if ((result.state_called & (1<<PJ_TURN_STATE_RESOLVED)) == 0) {
            PJ_LOG(3,("", "    error: PJ_TURN_STATE_RESOLVED is not called"));
            return -150;
        }

        if ((result.state_called & (1<<PJ_TURN_STATE_ALLOCATING)) == 0) {
            PJ_LOG(3,("", "    error: PJ_TURN_STATE_ALLOCATING is not called"));
            return -155;
        }

        if ((result.state_called & (1<<PJ_TURN_STATE_READY)) == 0) {
            PJ_LOG(3,("", "    error: PJ_TURN_STATE_READY is not called"));
            return -160;
        }

        if ((result.state_called & (1<<PJ_TURN_STATE_DEALLOCATING)) == 0) {
            PJ_LOG(3,("", "    error: PJ_TURN_STATE_DEALLOCATING is not called"));
            return -170;
        }

        if ((result.state_called & (1<<PJ_TURN_STATE_DEALLOCATED)) == 0) {
            PJ_LOG(3,("", "    error: PJ_TURN_STATE_DEALLOCATED is not called"));
            return -180;
        }

        if ((result.state_called & (1<<PJ_TURN_STATE_DESTROYING)) == 0) {
            PJ_LOG(3,("", "    error: PJ_TURN_STATE_DESTROYING is not called"));
            return -190;
        }

        poll_events(stun_cfg, 500, PJ_FALSE);
        rc = check_pjlib_state(stun_cfg, &pjlib_state);
        if (rc != 0) {
            PJ_LOG(3,("", "    error: memory/timer-heap leak detected"));
            return rc;
        }
    }

    if (use_ipv6)
        rc = state_progression_test(stun_cfg, 0);

    return rc;
}