static int send_sasl_step(mc_pSESSREQ sreq, packet_info *packet) { protocol_binary_request_no_extras req; protocol_binary_request_header *hdr = &req.message.header; cbsasl_error_t saslerr; const char *step_data; unsigned int ndata; mc_pSESSINFO ctx = sreq->inner; saslerr = cbsasl_client_step( ctx->sasl, packet->payload, PACKET_NBODY(packet), NULL, &step_data, &ndata); if (saslerr != SASL_CONTINUE) { set_error_ex(sreq, LCB_EINTERNAL, "Unable to perform SASL STEP"); return -1; } memset(&req, 0, sizeof(req)); hdr->request.magic = PROTOCOL_BINARY_REQ; hdr->request.opcode = PROTOCOL_BINARY_CMD_SASL_STEP; hdr->request.keylen = htons((uint16_t)ctx->nmech); hdr->request.bodylen = htonl((uint32_t)ndata + ctx->nmech); hdr->request.datatype = PROTOCOL_BINARY_RAW_BYTES; lcbio_ctx_put(sreq->ctx, req.bytes, sizeof(req.bytes)); lcbio_ctx_put(sreq->ctx, ctx->mech, ctx->nmech); lcbio_ctx_put(sreq->ctx, step_data, ndata); lcbio_ctx_rwant(sreq->ctx, 24); return 0; }
static int send_hello(mc_pSESSREQ sreq) { protocol_binary_request_no_extras req; protocol_binary_request_header *hdr = &req.message.header; unsigned ii; static const char client_id[] = LCB_VERSION_STRING; lcb_U16 features[MEMCACHED_TOTAL_HELLO_FEATURES]; unsigned nfeatures = 0; lcb_SIZE nclistr; features[nfeatures++] = PROTOCOL_BINARY_FEATURE_TLS; if (sreq->inner->settings->tcp_nodelay) { features[nfeatures++] = PROTOCOL_BINARY_FEATURE_TCPNODELAY; } #ifndef LCB_NO_SNAPPY if (sreq->inner->settings->compressopts != LCB_COMPRESS_NONE) { features[nfeatures++] = PROTOCOL_BINARY_FEATURE_DATATYPE; } #endif if (sreq->inner->settings->fetch_mutation_tokens) { features[nfeatures++] = PROTOCOL_BINARY_FEATURE_MUTATION_SEQNO; } nclistr = strlen(client_id); memset(&req, 0, sizeof req); hdr->request.opcode = PROTOCOL_BINARY_CMD_HELLO; hdr->request.magic = PROTOCOL_BINARY_REQ; hdr->request.keylen = htons((lcb_U16)nclistr); hdr->request.bodylen = htonl((lcb_U32)(nclistr+ (sizeof features[0]) * nfeatures)); hdr->request.datatype = PROTOCOL_BINARY_RAW_BYTES; lcbio_ctx_put(sreq->ctx, req.bytes, sizeof req.bytes); lcbio_ctx_put(sreq->ctx, client_id, strlen(client_id)); for (ii = 0; ii < nfeatures; ii++) { lcb_U16 tmp = htons(features[ii]); lcbio_ctx_put(sreq->ctx, &tmp, sizeof tmp); } lcbio_ctx_rwant(sreq->ctx, 24); return 0; }
void mcserver_flush(mc_SERVER *server) { /** Call into the wwant stuff.. */ if (!server->connctx->rdwant) { lcbio_ctx_rwant(server->connctx, 24); } lcbio_ctx_wwant(server->connctx); lcbio_ctx_schedule(server->connctx); if (!lcbio_timer_armed(server->io_timer)) { /** * XXX: Maybe use get_next_timeout(), although here we can assume * that a command was just scheduled */ lcbio_timer_rearm(server->io_timer, MCSERVER_TIMEOUT(server)); } }
/** * Given the specific mechanisms, send the auth packet to the server. */ static int send_sasl_auth(neg_PENDING *pend, const char *sasl_data, unsigned ndata) { mc_pSESSINFO ctx = pend->inner; protocol_binary_request_no_extras req; protocol_binary_request_header *hdr = &req.message.header; memset(&req, 0, sizeof(req)); hdr->request.magic = PROTOCOL_BINARY_REQ; hdr->request.opcode = PROTOCOL_BINARY_CMD_SASL_AUTH; hdr->request.keylen = htons((lcb_uint16_t)ctx->nmech); hdr->request.datatype = PROTOCOL_BINARY_RAW_BYTES; hdr->request.bodylen = htonl((lcb_uint32_t)ndata + ctx->nmech); lcbio_ctx_put(pend->ctx, req.bytes, sizeof(req.bytes)); lcbio_ctx_put(pend->ctx, ctx->mech, ctx->nmech); lcbio_ctx_put(pend->ctx, sasl_data, ndata); lcbio_ctx_rwant(pend->ctx, 24); return 0; }