void libcouchbase_server_write_packet(libcouchbase_server_t *c, const void *data, libcouchbase_size_t size) { if (c->connected) { libcouchbase_server_buffer_write_packet(c, &c->output, data, size); } else { libcouchbase_server_buffer_write_packet(c, &c->pending, data, size); } }
static void sasl_list_mech_response_handler(libcouchbase_server_t *server, protocol_binary_response_header *res) { const char *data; const char *chosenmech; unsigned int len; protocol_binary_request_no_extras req; size_t keylen; size_t bodysize; assert(ntohs(res->response.status) == PROTOCOL_BINARY_RESPONSE_SUCCESS); if (sasl_client_start(server->sasl_conn, (const char *)(res + 1), NULL, &data, &len, &chosenmech) != SASL_OK) { // @fixme! abort(); } keylen = strlen(chosenmech); bodysize = keylen + len; memset(&req, 0, sizeof(req)); req.message.header.request.magic = PROTOCOL_BINARY_REQ; req.message.header.request.opcode = PROTOCOL_BINARY_CMD_SASL_AUTH; req.message.header.request.keylen = ntohs((uint16_t)keylen); req.message.header.request.datatype = PROTOCOL_BINARY_RAW_BYTES; req.message.header.request.bodylen = ntohl((uint32_t)(bodysize)); libcouchbase_server_buffer_start_packet(server, &server->output, req.bytes, sizeof(req.bytes)); libcouchbase_server_buffer_write_packet(server, &server->output, chosenmech, keylen); libcouchbase_server_buffer_write_packet(server, &server->output, data, len); libcouchbase_server_buffer_end_packet(server, &server->output); // send the data and add it to libevent.. libcouchbase_server_event_handler(0, EV_WRITE, server); }