Beispiel #1
0
static int
test_cvector(void)
{
    test_start("cvector");
    // Src: https://gist.github.com/EmilHernvall/953968
    cvector_t v;
    cvector_init(&v);
    cvector_add(&v, (cvector_item_t)1); cvector_add(&v, (cvector_item_t)2);
    cvector_add(&v, (cvector_item_t)3); cvector_add(&v, (cvector_item_t)4);
    cvector_add(&v, (cvector_item_t)5);
    test_assert(cvector_count(&v) == (int)5);
    test_assert(cvector_get(&v, 0) == (cvector_item_t)1);
    test_assert(cvector_get(&v, 1) == (cvector_item_t)2);
    test_assert(cvector_get(&v, 2) == (cvector_item_t)3);
    test_assert(cvector_get(&v, 3) == (cvector_item_t)4);
    test_assert(cvector_get(&v, 4) == (cvector_item_t)5);
    cvector_delete(&v, 1);
    cvector_delete(&v, 3);
    test_assert(cvector_count(&v) == (int)3);
    test_assert(cvector_get(&v, 0) == (cvector_item_t)1);
    test_assert(cvector_get(&v, 1) == (cvector_item_t)3);
    test_assert(cvector_get(&v, 2) == (cvector_item_t)4);
    cvector_free(&v);
    int vcStress = 10000;
    for (int i = 0; i < vcStress; i++) {
        int data = ((i << 2) * 0xcafebabe) ^ 0xdeadbeef;
        cvector_add(&v, (cvector_item_t)data);
        test_assert(cvector_count(&v) == (int)(i + 1));
        test_assert(cvector_get(&v, i) == (cvector_item_t)data);
        data = (data << 7) ^ 0xbaabaabb;
        cvector_set(&v, i, (cvector_item_t)data);
        test_assert(cvector_count(&v) == (int)(i + 1));
        test_assert(cvector_get(&v, i) == (cvector_item_t)data);
    }
    cvector_free(&v);
    return test_success();
}
Beispiel #2
0
ssize_t rumble_gatekeeper_auth(sessionHandle *session, const char *OK) {

    /*~~~~~~~~~~~~~~~~~~~~~~~*/
    gatekeeper_login_attempt* entry;
    c_iterator      iter;
    /*~~~~~~~~~~~~~~~~~~~~~~~*/

    if (!Gatekeeper_enabled) return (RUMBLE_RETURN_OKAY);
    // Was the login OK? If so, let's delete any counters we have
    if (OK) {
        cforeach((gatekeeper_login_attempt*), entry, gatekeeper_login_list, iter) {
            if (!strcmp(entry->ip, session->client->addr)) {
                cvector_delete(&iter);
                free(entry);
                break;
            }
        }
    }
    // Login went bad, let's write that down!
    else {
Beispiel #3
0
uint32_t
cpool_alloc(cpool_t *p)
{
    assert(p);

    // First try to allocate from the free list.
    size_t fSz = cvector_count(&p->freelist);
    if (fSz > 0) {
        // Allocate the last item available on the free list.
        cvector_item_t obj = cvector_get(&p->freelist, fSz - 1);
        cvector_delete(&p->freelist, fSz - 1);
        return (uint32_t) obj;
    }

    // Free list exhausted, allocate by increasing max obj ID..
    if (p->mx <= p->end) {
        return (uint32_t) p->mx++;
    }

    // Out of object to allocate.
    return 0;
}
Beispiel #4
0
ssize_t rumble_gatekeeper_close(sessionHandle *session, const char *junk) {

    /*~~~~~~~~~~~~~~~~~~~~~~~*/
    gatekeeper_connection* centry;
    c_iterator      iter;
    /*~~~~~~~~~~~~~~~~~~~~~~~*/
    if (!Gatekeeper_enabled) return (RUMBLE_RETURN_OKAY);
    
    rumble_rw_start_write(Gatekeeper_lock);
    cforeach((gatekeeper_connection*), centry, gatekeeper_connection_list, iter) {
        if (!memcmp(centry->ip, session->client->addr, 46)) {
            centry->connections--;
            if (centry->connections == 0) {
                cvector_delete(&iter);
                free(centry);
            }
        }
    }
    rumble_rw_stop_write(Gatekeeper_lock);
    
    return RUMBLE_RETURN_OKAY;
}