static mrpc_status_t format_message(struct mrpc_connection *conn, xdrproc_t xdr_proc, void *data, struct mrpc_message **result) { struct mrpc_message *msg; XDR xdrs; mrpc_status_t ret; if (xdr_proc != (xdrproc_t) xdr_void && data == NULL) return MINIRPC_ENCODING_ERR; msg=mrpc_alloc_message(conn); xdrlen_create(&xdrs); if (!xdr_proc(&xdrs, data)) { xdr_destroy(&xdrs); mrpc_free_message(msg); return MINIRPC_ENCODING_ERR; } msg->hdr.datalen=xdr_getpos(&xdrs); xdr_destroy(&xdrs); if (msg->hdr.datalen) { mrpc_alloc_message_data(msg, msg->hdr.datalen); ret=serialize(xdr_proc, data, msg->data, msg->hdr.datalen); if (ret) { mrpc_free_message(msg); return ret; } } *result=msg; return MINIRPC_OK; }
static int extractPioctlToken(struct tokenJar *token, struct token_opaque *opaque) { XDR xdrs; struct ktc_tokenUnion *pioctlToken; int code; memset(opaque, 0, sizeof(token_opaque)); pioctlToken = osi_Alloc(sizeof(struct ktc_tokenUnion)); if (pioctlToken == NULL) return ENOMEM; pioctlToken->at_type = token->type; switch (token->type) { case RX_SECIDX_KAD: code = rxkad_extractTokenForPioctl(token, pioctlToken); break; default: code = EINVAL;; } if (code) goto out; xdrlen_create(&xdrs); if (!xdr_ktc_tokenUnion(&xdrs, pioctlToken)) { code = EINVAL; xdr_destroy(&xdrs); goto out; } opaque->token_opaque_len = xdr_getpos(&xdrs); xdr_destroy(&xdrs); opaque->token_opaque_val = osi_Alloc(opaque->token_opaque_len); if (opaque->token_opaque_val == NULL) { code = ENOMEM; goto out; } xdrmem_create(&xdrs, opaque->token_opaque_val, opaque->token_opaque_len, XDR_ENCODE); if (!xdr_ktc_tokenUnion(&xdrs, pioctlToken)) { code = EINVAL; xdr_destroy(&xdrs); goto out; } xdr_destroy(&xdrs); out: xdr_free((xdrproc_t) xdr_ktc_tokenUnion, &pioctlToken); osi_Free(pioctlToken, sizeof(struct ktc_tokenUnion)); if (code != 0) { osi_Free(opaque->token_opaque_val, opaque->token_opaque_len); opaque->token_opaque_val = NULL; opaque->token_opaque_len = 0; } return code; }