/* 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; } }
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; }
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); }