static int key_call(u_long proc, xdrproc_t xdr_arg, void *arg, xdrproc_t xdr_rslt, void *rslt) { CLIENT *clnt; struct timeval wait_time; if (proc == KEY_ENCRYPT_PK && __key_encryptsession_pk_LOCAL) { cryptkeyres *res; res = (*__key_encryptsession_pk_LOCAL)(geteuid(), arg); *(cryptkeyres*)rslt = *res; return (1); } else if (proc == KEY_DECRYPT_PK && __key_decryptsession_pk_LOCAL) { cryptkeyres *res; res = (*__key_decryptsession_pk_LOCAL)(geteuid(), arg); *(cryptkeyres*)rslt = *res; return (1); } else if (proc == KEY_GEN && __key_gendes_LOCAL) { des_block *res; res = (*__key_gendes_LOCAL)(geteuid(), 0); *(des_block*)rslt = *res; return (1); } if ((proc == KEY_ENCRYPT_PK) || (proc == KEY_DECRYPT_PK) || (proc == KEY_NET_GET) || (proc == KEY_NET_PUT) || (proc == KEY_GET_CONV)) clnt = getkeyserv_handle(2); /* talk to version 2 */ else clnt = getkeyserv_handle(1); /* talk to version 1 */ if (clnt == NULL) { return (0); } wait_time.tv_sec = TOTAL_TIMEOUT; wait_time.tv_usec = 0; if (clnt_call(clnt, proc, xdr_arg, arg, xdr_rslt, rslt, wait_time) == RPC_SUCCESS) { return (1); } else { return (0); } }
/* * RPC calls to the keyserv. * * If (use_ruid == 1), use real uid. * If (use_ruid == 0), use effective uid. * Returns 0 on failure, 1 on success */ int key_call_ext(rpcproc_t proc, xdrproc_t xdr_arg, char *arg, xdrproc_t xdr_rslt, char *rslt, int use_ruid) { CLIENT *clnt; struct timeval wait_time = {0, 0}; enum clnt_stat status; int vers; if (proc == KEY_ENCRYPT_PK && __key_encryptsession_pk_LOCAL) { cryptkeyres res; bool_t r; r = (*__key_encryptsession_pk_LOCAL)(geteuid(), arg, &res); if (r == TRUE) { /* LINTED pointer alignment */ *(cryptkeyres*)rslt = res; return (1); } return (0); } if (proc == KEY_DECRYPT_PK && __key_decryptsession_pk_LOCAL) { cryptkeyres res; bool_t r; r = (*__key_decryptsession_pk_LOCAL)(geteuid(), arg, &res); if (r == TRUE) { /* LINTED pointer alignment */ *(cryptkeyres*)rslt = res; return (1); } return (0); } if (proc == KEY_GEN && __key_gendes_LOCAL) { des_block res; bool_t r; r = (*__key_gendes_LOCAL)(geteuid(), 0, &res); if (r == TRUE) { /* LINTED pointer alignment */ *(des_block*)rslt = res; return (1); } return (0); } if ((proc == KEY_ENCRYPT_PK) || (proc == KEY_DECRYPT_PK) || (proc == KEY_NET_GET) || (proc == KEY_NET_PUT) || (proc == KEY_GET_CONV)) vers = 2; /* talk to version 2 */ else vers = 1; /* talk to version 1 */ clnt = getkeyserv_handle(vers, 0); if (clnt == NULL) return (0); auth_destroy(clnt->cl_auth); if (use_ruid) clnt->cl_auth = authsys_create_ruid(); else clnt->cl_auth = authnone_create(); status = CLNT_CALL(clnt, proc, xdr_arg, arg, xdr_rslt, rslt, wait_time); switch (status) { case RPC_SUCCESS: return (1); case RPC_CANTRECV: /* * keyserv was probably restarted, so we'll try once more */ if ((clnt = getkeyserv_handle(vers, 1)) == NULL) return (0); auth_destroy(clnt->cl_auth); if (use_ruid) clnt->cl_auth = authsys_create_ruid(); else clnt->cl_auth = authnone_create(); if (CLNT_CALL(clnt, proc, xdr_arg, arg, xdr_rslt, rslt, wait_time) == RPC_SUCCESS) return (1); return (0); default: return (0); } }