コード例 #1
0
ファイル: serialize.c プロジェクト: cmusatyalab/minirpc
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;
}
コード例 #2
0
ファイル: afs_tokens.c プロジェクト: SimonWilkinson/openafs
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;
}