Пример #1
0
/*
 * Create a client handle for memory based rpc.
 */
CLIENT *
clnt_raw_create(const rpcprog_t prog, const rpcvers_t vers)
{
	struct clnt_raw_private *clp;
	struct rpc_msg call_msg;
	XDR xdrs;
	CLIENT *client;
	uint_t start;

/* VARIABLES PROTECTED BY clntraw_lock: clp */

	(void) mutex_lock(&clntraw_lock);
	clp = clnt_raw_private;
	if (clp != NULL) {
		(void) mutex_unlock(&clntraw_lock);
		return (&clp->client_object);
	}

	clp = calloc(1, sizeof (*clp));
	if (clp == NULL) {
		(void) mutex_unlock(&clntraw_lock);
		return (NULL);
	}

	clp->raw_netbuf = &_rawcomnetbuf;

	/*
	 * pre-serialize the static part of the call msg and stash it away
	 */
	call_msg.rm_direction = CALL;
	call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION;
	call_msg.rm_call.cb_prog = prog;
	call_msg.rm_call.cb_vers = vers;

	xdrmem_create(&xdrs, clp->mashl_callmsg, sizeof (clp->mashl_callmsg),
	    XDR_ENCODE);
	start = XDR_GETPOS(&xdrs);
	if (!xdr_callhdr(&xdrs, &call_msg)) {
		free(clp);
		(void) syslog(LOG_ERR,
		    "clnt_raw_create: Fatal header serialization error");

		(void) mutex_unlock(&clntraw_lock);
		return (NULL);
	}
	clp->mcnt = XDR_GETPOS(&xdrs) - start;
	XDR_DESTROY(&xdrs);

	/*
	 * create client handle
	 */
	client = &clp->client_object;
	client->cl_ops = clnt_raw_ops();
	client->cl_auth = authnone_create();

	clnt_raw_private = clp;

	(void) mutex_unlock(&clntraw_lock);
	return (client);
}
Пример #2
0
/*
 * Create a client handle for memory based rpc.
 */
CLIENT *
clnt_raw_ncreate(rpcprog_t prog, rpcvers_t vers)
{
    struct clntraw_private *clp;
    struct rpc_msg call_msg;
    XDR *xdrs;
    CLIENT *client;

    mutex_lock(&clntraw_lock);
    clp = clntraw_private;
    if (clp == NULL) {
        clp = (struct clntraw_private *)calloc(1, sizeof (*clp));
        if (clp == NULL) {
            mutex_unlock(&clntraw_lock);
            return NULL;
        }
        if (__rpc_rawcombuf == NULL)
            __rpc_rawcombuf =
                (char *)calloc(UDPMSGSIZE, sizeof (char));
        clp->_raw_buf = __rpc_rawcombuf;
        clntraw_private = clp;
    }
    xdrs = &clp->xdr_stream;
    client = &clp->client_object;
    /*
     * pre-serialize the static part of the call msg and stash it away
     */
    call_msg.rm_direction = CALL;
    call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION;
    /* XXX: prog and vers have been long historically :-( */
    call_msg.rm_call.cb_prog = (u_int32_t)prog;
    call_msg.rm_call.cb_vers = (u_int32_t)vers;
    xdrmem_create(xdrs, clp->u.mashl_callmsg, MCALL_MSG_SIZE, XDR_ENCODE);
    if (! xdr_callhdr(xdrs, &call_msg))
        __warnx(TIRPC_DEBUG_FLAG_CLNT_RAW,
                "clntraw_create - Fatal header serialization error.");
    clp->mcnt = XDR_GETPOS(xdrs);
    XDR_DESTROY(xdrs);

    /*
     * Set xdrmem for client/server shared buffer
     */
    xdrmem_create(xdrs, clp->_raw_buf, UDPMSGSIZE, XDR_FREE);

    /*
     * create client handle
     */
    client->cl_ops = clnt_raw_ops();
    mutex_unlock(&clntraw_lock);
    return (client);
}