/** * set a string from another buffer. * The string will use the supplied buffer (it not copy the string), * so it should be a pointer returned by malloc. * @param s dynamic string * @param src source buffer * @return string copied or NULL on memory error */ DSTR* tds_dstr_set(DSTR * s, char *src) { DSTR *res = tds_dstr_copy(s, src); if (TDS_LIKELY(res != NULL)) free(src); return res; }
static TDSPACKET* tds_build_packet(TDSSOCKET *tds, unsigned char *buf, unsigned len) { unsigned start; TDS72_SMP_HEADER mars[2], *p; TDSPACKET *packet; p = mars; if (buf[0] != TDS72_SMP && tds->conn->mars) { /* allocate a new sid */ if (tds->sid == -1) { p->signature = TDS72_SMP; p->type = TDS_SMP_SYN; /* start session */ /* FIXME check !!! */ tds_alloc_new_sid(tds); tds->recv_seq = 0; tds->send_seq = 0; tds->recv_wnd = 4; tds->send_wnd = 4; TDS_PUT_A2LE(&p->sid, tds->sid); p->size = TDS_HOST4LE(0x10); p->seq = TDS_HOST4LE(0); TDS_PUT_A4LE(&p->wnd, tds->recv_wnd); p++; } if (tds->sid >= 0) { p->signature = TDS72_SMP; p->type = TDS_SMP_DATA; TDS_PUT_A2LE(&p->sid, tds->sid); TDS_PUT_A4LE(&p->size, len+16); TDS_PUT_A4LE(&p->seq, ++tds->send_seq); /* this is the acknowledge we give to server to stop sending !!! */ tds->recv_wnd = tds->recv_seq + 4; TDS_PUT_A4LE(&p->wnd, tds->recv_wnd); p++; } } start = (p - mars) * sizeof(mars[0]); packet = tds_get_packet(tds->conn, len + start); if (TDS_LIKELY(packet)) { packet->sid = tds->sid; memcpy(packet->buf, mars, start); memcpy(packet->buf + start, buf, len); packet->len = len + start; } return packet; }