示例#1
0
/* This currently *only* works for client call requests.
 * We need to do something else to allocate calls for incoming requests.
 */
PPTP_CALL * pptp_call_open(PPTP_CONN * conn, pptp_call_cb callback,
        char *phonenr)
{
    PPTP_CALL * call;
    int i;
    int idx, rc;
    /* Send off the call request */
    struct pptp_out_call_rqst packet = {
        PPTP_HEADER_CTRL(PPTP_OUT_CALL_RQST),
        0,0, /*call_id, sernum */
        hton32(PPTP_BPS_MIN), hton32(PPTP_BPS_MAX),
        hton32(PPTP_BEARER_CAP), hton32(PPTP_FRAME_CAP), 
        hton16(PPTP_WINDOW), 0, 0, 0, {0}, {0}
    };
    assert(conn && conn->call);
    assert(conn->conn_state == CONN_ESTABLISHED);
    /* Assign call id */
    if (!vector_scan(conn->call, 0, PPTP_MAX_CHANNELS - 1, &i))
        /* no more calls available! */
        return NULL;
    /* allocate structure. */
    if ((call = malloc(sizeof(*call))) == NULL) return NULL;
    /* Initialize call structure */
    call->call_type = PPTP_CALL_PNS;
    call->state.pns = PNS_IDLE;
    call->call_id   = (u_int16_t) i;
    call->sernum    = conn->call_serial_number++;
    call->callback  = callback;
    call->closure   = NULL;
    packet.call_id = htons(call->call_id);
    packet.call_sernum = htons(call->sernum);
    /* if we have a quirk, build a new packet to fit it */
    idx = get_quirk_index();
    if (idx != -1 && pptp_fixups[idx].out_call_rqst_hook) {
        if ((rc = pptp_fixups[idx].out_call_rqst_hook(&packet)))
            warn("calling the out_call_rqst hook failed (%d)", rc);
    }
    /* fill in the phone number if it was specified */
    if (phonenr) {
        strncpy((char *)packet.phone_num, phonenr, sizeof(packet.phone_num));
        packet.phone_len = strlen(phonenr);
        if( packet.phone_len > sizeof(packet.phone_num))
            packet.phone_len = sizeof(packet.phone_num);
        packet.phone_len = hton16 (packet.phone_len);
    }
    if (pptp_send_ctrl_packet(conn, &packet, sizeof(packet))) {
        pptp_reset_timer();
        call->state.pns = PNS_WAIT_REPLY;
        /* and add it to the call vector */
        vector_insert(conn->call, i, call);
        return call;
    } else { /* oops, unsuccessful. Deallocate. */
        free(call);
        return NULL;
    }
}
示例#2
0
int vector_from_block(dct_data block, vector_data *target) {
	int x, y, i, ret;
	ret = vector_init(target, block.width, block.height);
	if (ret != VEC_OK)
		return ret;
	i = 0;
	for (x = 0; x < block.width; x++)
		for (y = 0; y < block.height; y++) {
			/* zig-zag scan */
			vector_scan(block.block[x][y].data, target->data[i]);
			/* to dc coefficients */
			target->dc[i].r = (int32_t)block.block[x][y].data[0][0].r;
			target->dc[i].g = (int32_t)block.block[x][y].data[0][0].g;
			target->dc[i].b = (int32_t)block.block[x][y].data[0][0].b;
			i++;
		}
	return VEC_OK;
}
示例#3
0
void main(void) {
  int i, j, retval;

  VECTOR *v = vector_create();
  assert(v != NULL);
  assert(vector_size(v)==0);
  for (i=0; i<=MAX; i++) {
    assert(!vector_contains(v, i));
    assert(!vector_remove(v, i));
    assert(!vector_search(v, i, (PPTP_CALL **)&j));
    retval = vector_scan(v, i, MAX*2, &j);
    assert(retval);
    assert(j==i);
  }

  for (i=1; i<=MAX; i++) {
    retval = vector_insert(v, i, (PPTP_CALL *)i);
    assert(retval);
    assert(vector_size(v)==i);
  }
  for (i=1; i<MAX; i++) {
    retval = vector_search(v, i, (PPTP_CALL **)&j);
    assert(retval);
    assert(j==i);
    retval = vector_contains(v, i);
    assert(retval);
  }
  assert(vector_size(v)==MAX);
  retval = vector_contains(v, MAX+1);
  assert(!retval);
  retval = vector_search(v, MAX+1, (PPTP_CALL **)&j);
  assert(!retval);

  retval = vector_scan(v, 0, MAX, &j);
  assert(retval);
  assert(j==0);
  retval = vector_scan(v, 1, MAX, &j);
  assert(!retval);
  retval = vector_scan(v, 1, MAX+1, &j);
  assert(retval);
  assert(j==MAX+1);
  retval = vector_scan(v, 1, MAX+MAX, &j);
  assert(retval);
  assert(j==MAX+1);

  for (i=0; i<(MAX*10); i++) {
    int k = (random() % MAX) + 1;
    assert(vector_contains(v, k));
    assert(!vector_scan(v, 1, k, &j));
    assert(!vector_scan(v, k, MAX, &j));
    retval = vector_remove(v, k);
    assert(retval);
    assert(vector_size(v)==MAX-1);
    assert(!vector_contains(v, k));
    assert(!vector_search(v, k, (PPTP_CALL **) &j));
    retval = vector_scan(v, 1, MAX, &j);
    assert(retval);
    assert(j==k);
    retval = vector_insert(v, k, (PPTP_CALL *) k);
    assert(retval);
    assert(vector_size(v)==MAX);
    assert(vector_contains(v, k));
    assert(!vector_scan(v, 1, MAX, &j));
    retval = vector_search(v, k, (PPTP_CALL **) &j);
    assert(retval);
    assert(j==k);
  }

  for (i=1; i<=MAX; i++) {
    assert(vector_size(v)==MAX-(i-1));
    vector_remove(v, i);
    assert(vector_size(v)==MAX-i);
    assert(!vector_contains(v, i));
    retval = vector_search(v, i, (PPTP_CALL **) &j);
    assert(!retval);
    retval = vector_scan(v, 1, MAX, &j);
    assert(retval);
    assert(j==1);
  }
  assert(vector_size(v)==0);
  vector_destroy(v);
}