Changeset View
Changeset View
Standalone View
Standalone View
sys/rpc/clnt_rc.c
Show First 20 Lines • Show All 105 Lines • ▼ Show 20 Lines | clnt_reconnect_create( | ||||
rc->rc_waitchan = "rpcrecv"; | rc->rc_waitchan = "rpcrecv"; | ||||
rc->rc_intr = 0; | rc->rc_intr = 0; | ||||
rc->rc_connecting = FALSE; | rc->rc_connecting = FALSE; | ||||
rc->rc_closed = FALSE; | rc->rc_closed = FALSE; | ||||
rc->rc_ucred = crdup(curthread->td_ucred); | rc->rc_ucred = crdup(curthread->td_ucred); | ||||
rc->rc_client = NULL; | rc->rc_client = NULL; | ||||
rc->rc_tls = false; | rc->rc_tls = false; | ||||
rc->rc_tlscertname = NULL; | rc->rc_tlscertname = NULL; | ||||
rc->rc_reconcall = NULL; | |||||
rc->rc_reconarg = NULL; | |||||
cl->cl_refs = 1; | cl->cl_refs = 1; | ||||
cl->cl_ops = &clnt_reconnect_ops; | cl->cl_ops = &clnt_reconnect_ops; | ||||
cl->cl_private = (caddr_t)(void *)rc; | cl->cl_private = (caddr_t)(void *)rc; | ||||
cl->cl_auth = authnone_create(); | cl->cl_auth = authnone_create(); | ||||
cl->cl_tp = NULL; | cl->cl_tp = NULL; | ||||
cl->cl_netid = NULL; | cl->cl_netid = NULL; | ||||
return (cl); | return (cl); | ||||
▲ Show 20 Lines • Show All 86 Lines • ▼ Show 20 Lines | if (rc->rc_tls && newclient != NULL) { | ||||
rpc_createerr.cf_error.re_errno = 0; | rpc_createerr.cf_error.re_errno = 0; | ||||
CLNT_CLOSE(newclient); | CLNT_CLOSE(newclient); | ||||
CLNT_RELEASE(newclient); | CLNT_RELEASE(newclient); | ||||
newclient = NULL; | newclient = NULL; | ||||
td->td_ucred = oldcred; | td->td_ucred = oldcred; | ||||
goto out; | goto out; | ||||
} | } | ||||
} | } | ||||
if (newclient != NULL && rc->rc_reconcall != NULL) | |||||
(*rc->rc_reconcall)(newclient, rc->rc_reconarg, | |||||
rc->rc_ucred); | |||||
} | } | ||||
td->td_ucred = oldcred; | td->td_ucred = oldcred; | ||||
if (!newclient) { | if (!newclient) { | ||||
soclose(so); | soclose(so); | ||||
rc->rc_err = rpc_createerr.cf_error; | rc->rc_err = rpc_createerr.cf_error; | ||||
stat = rpc_createerr.cf_stat; | stat = rpc_createerr.cf_stat; | ||||
goto out; | goto out; | ||||
▲ Show 20 Lines • Show All 179 Lines • ▼ Show 20 Lines | |||||
* always be called before CLNT_CALL_MBUF() by a single thread only. | * always be called before CLNT_CALL_MBUF() by a single thread only. | ||||
*/ | */ | ||||
static bool_t | static bool_t | ||||
clnt_reconnect_control(CLIENT *cl, u_int request, void *info) | clnt_reconnect_control(CLIENT *cl, u_int request, void *info) | ||||
{ | { | ||||
struct rc_data *rc = (struct rc_data *)cl->cl_private; | struct rc_data *rc = (struct rc_data *)cl->cl_private; | ||||
SVCXPRT *xprt; | SVCXPRT *xprt; | ||||
size_t slen; | size_t slen; | ||||
struct rpc_reconupcall *upcp; | |||||
if (info == NULL) { | if (info == NULL) { | ||||
return (FALSE); | return (FALSE); | ||||
} | } | ||||
switch (request) { | switch (request) { | ||||
case CLSET_TIMEOUT: | case CLSET_TIMEOUT: | ||||
rc->rc_timeout = *(struct timeval *)info; | rc->rc_timeout = *(struct timeval *)info; | ||||
if (rc->rc_client) | if (rc->rc_client) | ||||
▲ Show 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | case CLSET_TLSCERTNAME: | ||||
* byte so it can be up to NAME_MAX - 6. | * byte so it can be up to NAME_MAX - 6. | ||||
*/ | */ | ||||
if (slen <= 1 || slen > NAME_MAX - 6) | if (slen <= 1 || slen > NAME_MAX - 6) | ||||
return (FALSE); | return (FALSE); | ||||
rc->rc_tlscertname = mem_alloc(slen); | rc->rc_tlscertname = mem_alloc(slen); | ||||
strlcpy(rc->rc_tlscertname, info, slen); | strlcpy(rc->rc_tlscertname, info, slen); | ||||
break; | break; | ||||
case CLSET_RECONUPCALL: | |||||
upcp = (struct rpc_reconupcall *)info; | |||||
rc->rc_reconcall = upcp->call; | |||||
rc->rc_reconarg = upcp->arg; | |||||
break; | |||||
default: | default: | ||||
return (FALSE); | return (FALSE); | ||||
} | } | ||||
return (TRUE); | return (TRUE); | ||||
} | } | ||||
static void | static void | ||||
Show All 26 Lines | |||||
{ | { | ||||
struct rc_data *rc = (struct rc_data *)cl->cl_private; | struct rc_data *rc = (struct rc_data *)cl->cl_private; | ||||
SVCXPRT *xprt; | SVCXPRT *xprt; | ||||
if (rc->rc_client) | if (rc->rc_client) | ||||
CLNT_DESTROY(rc->rc_client); | CLNT_DESTROY(rc->rc_client); | ||||
if (rc->rc_backchannel) { | if (rc->rc_backchannel) { | ||||
xprt = (SVCXPRT *)rc->rc_backchannel; | xprt = (SVCXPRT *)rc->rc_backchannel; | ||||
KASSERT(xprt->xp_socket == NULL, | |||||
("clnt_reconnect_destroy: xp_socket not NULL")); | |||||
xprt_unregister(xprt); | xprt_unregister(xprt); | ||||
SVC_RELEASE(xprt); | SVC_RELEASE(xprt); | ||||
} | } | ||||
crfree(rc->rc_ucred); | crfree(rc->rc_ucred); | ||||
mtx_destroy(&rc->rc_lock); | mtx_destroy(&rc->rc_lock); | ||||
mem_free(rc->rc_tlscertname, 0); /* 0 ok, since arg. ignored. */ | mem_free(rc->rc_tlscertname, 0); /* 0 ok, since arg. ignored. */ | ||||
mem_free(rc->rc_reconarg, 0); | |||||
mem_free(rc, sizeof(*rc)); | mem_free(rc, sizeof(*rc)); | ||||
mem_free(cl, sizeof (CLIENT)); | mem_free(cl, sizeof (CLIENT)); | ||||
} | } |