/* * 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); }
/* * 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); }