| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411 | /* @(#)clnt_perror.c	2.1 88/07/29 4.0 RPCSRC *//* * Sun RPC is a product of Sun Microsystems, Inc. and is provided for * unrestricted use provided that this legend is included on all tape * media and as a part of the software program in whole or part.  Users * may copy or modify Sun RPC without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. * * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. * * Sun RPC is provided with no support and without any obligation on the * part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. * * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC * OR ANY PART THEREOF. * * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California  94043 */#if 0static char sccsid[] = "@(#)clnt_perror.c 1.15 87/10/07 Copyr 1984 Sun Micro";#endif/* * clnt_perror.c * * Copyright (C) 1984, Sun Microsystems, Inc. * */#include <stdio.h>#include <string.h>#include "rpc_private.h"static char *auth_errmsg (enum auth_stat stat) internal_function;#ifdef __UCLIBC_HAS_THREADS__/* * Making buf a preprocessor macro requires renaming the local * buf variable in a few functions.  Overriding a global variable * with a local variable of the same name is a bad idea, anyway. */#define buf (*(char **)&RPC_THREAD_VARIABLE(clnt_perr_buf_s))#elsestatic char *buf;#endifstatic char *_buf (void){  if (buf == NULL)    buf = (char *) malloc (256);  return buf;}struct rpc_errtab{  enum clnt_stat status;  unsigned int message_off;};static const char rpc_errstr[] ={#define RPC_SUCCESS_IDX		0  N_("RPC: Success")  "\0"#define RPC_CANTENCODEARGS_IDX	(RPC_SUCCESS_IDX + sizeof "RPC: Success")  N_("RPC: Can't encode arguments")  "\0"#define RPC_CANTDECODERES_IDX	(RPC_CANTENCODEARGS_IDX \				 + sizeof "RPC: Can't encode arguments")  N_("RPC: Can't decode result")  "\0"#define RPC_CANTSEND_IDX	(RPC_CANTDECODERES_IDX \				 + sizeof "RPC: Can't decode result")  N_("RPC: Unable to send")  "\0"#define RPC_CANTRECV_IDX	(RPC_CANTSEND_IDX \				 + sizeof "RPC: Unable to send")  N_("RPC: Unable to receive")  "\0"#define RPC_TIMEDOUT_IDX	(RPC_CANTRECV_IDX \				 + sizeof "RPC: Unable to receive")  N_("RPC: Timed out")  "\0"#define RPC_VERSMISMATCH_IDX	(RPC_TIMEDOUT_IDX \				 + sizeof "RPC: Timed out")  N_("RPC: Incompatible versions of RPC")  "\0"#define RPC_AUTHERROR_IDX	(RPC_VERSMISMATCH_IDX \				 + sizeof "RPC: Incompatible versions of RPC")  N_("RPC: Authentication error")  "\0"#define RPC_PROGUNAVAIL_IDX		(RPC_AUTHERROR_IDX \				 + sizeof "RPC: Authentication error")  N_("RPC: Program unavailable")  "\0"#define RPC_PROGVERSMISMATCH_IDX (RPC_PROGUNAVAIL_IDX \				  + sizeof "RPC: Program unavailable")  N_("RPC: Program/version mismatch")  "\0"#define RPC_PROCUNAVAIL_IDX	(RPC_PROGVERSMISMATCH_IDX \				 + sizeof "RPC: Program/version mismatch")  N_("RPC: Procedure unavailable")  "\0"#define RPC_CANTDECODEARGS_IDX	(RPC_PROCUNAVAIL_IDX \				 + sizeof "RPC: Procedure unavailable")  N_("RPC: Server can't decode arguments")  "\0"#define RPC_SYSTEMERROR_IDX	(RPC_CANTDECODEARGS_IDX \				 + sizeof "RPC: Server can't decode arguments")  N_("RPC: Remote system error")  "\0"#define RPC_UNKNOWNHOST_IDX	(RPC_SYSTEMERROR_IDX \				 + sizeof "RPC: Remote system error")  N_("RPC: Unknown host")  "\0"#define RPC_UNKNOWNPROTO_IDX	(RPC_UNKNOWNHOST_IDX \				 + sizeof "RPC: Unknown host")  N_("RPC: Unknown protocol")  "\0"#define RPC_PMAPFAILURE_IDX	(RPC_UNKNOWNPROTO_IDX \				 + sizeof "RPC: Unknown protocol")  N_("RPC: Port mapper failure")  "\0"#define RPC_PROGNOTREGISTERED_IDX (RPC_PMAPFAILURE_IDX \				   + sizeof "RPC: Port mapper failure")  N_("RPC: Program not registered")  "\0"#define RPC_FAILED_IDX		(RPC_PROGNOTREGISTERED_IDX \				 + sizeof "RPC: Program not registered")  N_("RPC: Failed (unspecified error)")};static const struct rpc_errtab rpc_errlist[] ={  { RPC_SUCCESS, RPC_SUCCESS_IDX },  { RPC_CANTENCODEARGS, RPC_CANTENCODEARGS_IDX },  { RPC_CANTDECODERES, RPC_CANTDECODERES_IDX },  { RPC_CANTSEND, RPC_CANTSEND_IDX },  { RPC_CANTRECV, RPC_CANTRECV_IDX },  { RPC_TIMEDOUT, RPC_TIMEDOUT_IDX },  { RPC_VERSMISMATCH, RPC_VERSMISMATCH_IDX },  { RPC_AUTHERROR, RPC_AUTHERROR_IDX },  { RPC_PROGUNAVAIL, RPC_PROGUNAVAIL_IDX },  { RPC_PROGVERSMISMATCH, RPC_PROGVERSMISMATCH_IDX },  { RPC_PROCUNAVAIL, RPC_PROCUNAVAIL_IDX },  { RPC_CANTDECODEARGS, RPC_CANTDECODEARGS_IDX },  { RPC_SYSTEMERROR, RPC_SYSTEMERROR_IDX },  { RPC_UNKNOWNHOST, RPC_UNKNOWNHOST_IDX },  { RPC_UNKNOWNPROTO, RPC_UNKNOWNPROTO_IDX },  { RPC_PMAPFAILURE, RPC_PMAPFAILURE_IDX },  { RPC_PROGNOTREGISTERED, RPC_PROGNOTREGISTERED_IDX },  { RPC_FAILED, RPC_FAILED_IDX }};/* * This interface for use by clntrpc */char *clnt_sperrno (enum clnt_stat stat){  size_t i;  for (i = 0; i < sizeof (rpc_errlist) / sizeof (struct rpc_errtab); i++)    {      if (rpc_errlist[i].status == stat)	{	  return (char*)_(rpc_errstr + rpc_errlist[i].message_off);	}    }  return N_("RPC: (unknown error code)");}libc_hidden_def(clnt_sperrno)voidclnt_perrno (enum clnt_stat num){  (void) fputs (clnt_sperrno (num), stderr);}/* * Print reply error info */char *clnt_sperror (CLIENT * rpch, const char *msg){  char chrbuf[1024];  struct rpc_err e;  char *err;  char *str = _buf ();  char *strstart = str;  int len;  if (str == NULL)    return NULL;  CLNT_GETERR (rpch, &e);  len = sprintf (str, "%s: ", msg);  str += len;  (void) strcpy(str, clnt_sperrno(e.re_status));  str += strlen(str);  switch (e.re_status)    {    case RPC_SUCCESS:    case RPC_CANTENCODEARGS:    case RPC_CANTDECODERES:    case RPC_TIMEDOUT:    case RPC_PROGUNAVAIL:    case RPC_PROCUNAVAIL:    case RPC_CANTDECODEARGS:    case RPC_SYSTEMERROR:    case RPC_UNKNOWNHOST:    case RPC_UNKNOWNPROTO:    case RPC_PMAPFAILURE:    case RPC_PROGNOTREGISTERED:    case RPC_FAILED:      break;    case RPC_CANTSEND:    case RPC_CANTRECV:      __glibc_strerror_r (e.re_errno, chrbuf, sizeof chrbuf);      len = sprintf (str, "; errno = %s", chrbuf);      str += len;      break;    case RPC_VERSMISMATCH:      len= sprintf (str, _("; low version = %lu, high version = %lu"),		    e.re_vers.low, e.re_vers.high);      str += len;      break;    case RPC_AUTHERROR:      err = auth_errmsg (e.re_why);      (void) strcpy(str, _("; why = "));      str += strlen(str);      if (err != NULL)	{	  (void) strcpy(str, err);	  str += strlen(str);	}      else	{	  len = sprintf (str, _("(unknown authentication error - %d)"),			 (int) e.re_why);	  str += len;	}      break;    case RPC_PROGVERSMISMATCH:      len = sprintf (str, _("; low version = %lu, high version = %lu"),		     e.re_vers.low, e.re_vers.high);      str += len;      break;    default:			/* unknown */      len = sprintf (str, "; s1 = %lu, s2 = %lu", e.re_lb.s1, e.re_lb.s2);      str += len;      break;    }  *str = '\n';  *++str = '\0';  return (strstart);}libc_hidden_def(clnt_sperror)voidclnt_perror (CLIENT * rpch, const char *msg){  (void) fputs (clnt_sperror (rpch, msg), stderr);}libc_hidden_def(clnt_perror)char *clnt_spcreateerror (const char *msg){  char chrbuf[1024];  char *str = _buf ();  char *cp;  int len;  struct rpc_createerr *ce;  if (str == NULL)    return NULL;  ce = &get_rpc_createerr ();  len = sprintf (str, "%s: ", msg);  cp = str + len;  (void) strcpy(cp, clnt_sperrno (ce->cf_stat));  cp += strlen(cp);  switch (ce->cf_stat)    {    case RPC_PMAPFAILURE:      (void) strcpy(cp, " - ");      cp += strlen(cp);      (void) strcpy(cp, clnt_sperrno (ce->cf_error.re_status));      cp += strlen(cp);      break;    case RPC_SYSTEMERROR:      (void) strcpy(cp, " - ");      cp += strlen(cp);      __glibc_strerror_r (ce->cf_error.re_errno, chrbuf, sizeof chrbuf);      (void) strcpy(cp, chrbuf);      cp += strlen(cp);      break;    default:      break;    }  *cp = '\n';  *++cp = '\0';  return str;}libc_hidden_def(clnt_spcreateerror)voidclnt_pcreateerror (const char *msg){  (void) fputs (clnt_spcreateerror (msg), stderr);}struct auth_errtab{  enum auth_stat status;  unsigned int message_off;};static const char auth_errstr[] ={#define AUTH_OK_IDX		0   N_("Authentication OK")   "\0"#define AUTH_BADCRED_IDX	(AUTH_OK_IDX + sizeof "Authentication OK")   N_("Invalid client credential")   "\0"#define AUTH_REJECTEDCRED_IDX	(AUTH_BADCRED_IDX \				 + sizeof "Invalid client credential")   N_("Server rejected credential")   "\0"#define AUTH_BADVERF_IDX	(AUTH_REJECTEDCRED_IDX \				 + sizeof "Server rejected credential")   N_("Invalid client verifier")   "\0"#define AUTH_REJECTEDVERF_IDX	(AUTH_BADVERF_IDX \				 + sizeof "Invalid client verifier")   N_("Server rejected verifier")   "\0"#define AUTH_TOOWEAK_IDX	(AUTH_REJECTEDVERF_IDX \				 + sizeof "Server rejected verifier")   N_("Client credential too weak")   "\0"#define AUTH_INVALIDRESP_IDX	(AUTH_TOOWEAK_IDX \				 + sizeof "Client credential too weak")   N_("Invalid server verifier")   "\0"#define AUTH_FAILED_IDX		(AUTH_INVALIDRESP_IDX \				 + sizeof "Invalid server verifier")   N_("Failed (unspecified error)")};static const struct auth_errtab auth_errlist[] ={  { AUTH_OK, AUTH_OK_IDX },  { AUTH_BADCRED, AUTH_BADCRED_IDX },  { AUTH_REJECTEDCRED, AUTH_REJECTEDCRED_IDX },  { AUTH_BADVERF, AUTH_BADVERF_IDX },  { AUTH_REJECTEDVERF, AUTH_REJECTEDVERF_IDX },  { AUTH_TOOWEAK, AUTH_TOOWEAK_IDX },  { AUTH_INVALIDRESP, AUTH_INVALIDRESP_IDX },  { AUTH_FAILED, AUTH_FAILED_IDX }};static char *internal_functionauth_errmsg (enum auth_stat stat){  size_t i;  for (i = 0; i < sizeof (auth_errlist) / sizeof (struct auth_errtab); i++)    {      if (auth_errlist[i].status == stat)	{	  return (char*)_(auth_errstr + auth_errlist[i].message_off);	}    }  return NULL;}static void __attribute_used__free_mem (void){  free (buf);}
 |