1*45076Smckusick /* @(#)clnt_perror.c 2.1 88/07/29 4.0 RPCSRC */ 2*45076Smckusick /* 3*45076Smckusick * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 4*45076Smckusick * unrestricted use provided that this legend is included on all tape 5*45076Smckusick * media and as a part of the software program in whole or part. Users 6*45076Smckusick * may copy or modify Sun RPC without charge, but are not authorized 7*45076Smckusick * to license or distribute it to anyone else except as part of a product or 8*45076Smckusick * program developed by the user. 9*45076Smckusick * 10*45076Smckusick * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 11*45076Smckusick * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 12*45076Smckusick * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 13*45076Smckusick * 14*45076Smckusick * Sun RPC is provided with no support and without any obligation on the 15*45076Smckusick * part of Sun Microsystems, Inc. to assist in its use, correction, 16*45076Smckusick * modification or enhancement. 17*45076Smckusick * 18*45076Smckusick * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 19*45076Smckusick * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 20*45076Smckusick * OR ANY PART THEREOF. 21*45076Smckusick * 22*45076Smckusick * In no event will Sun Microsystems, Inc. be liable for any lost revenue 23*45076Smckusick * or profits or other special, indirect and consequential damages, even if 24*45076Smckusick * Sun has been advised of the possibility of such damages. 25*45076Smckusick * 26*45076Smckusick * Sun Microsystems, Inc. 27*45076Smckusick * 2550 Garcia Avenue 28*45076Smckusick * Mountain View, California 94043 29*45076Smckusick */ 30*45076Smckusick #if !defined(lint) && defined(SCCSIDS) 31*45076Smckusick static char sccsid[] = "@(#)clnt_perror.c 1.15 87/10/07 Copyr 1984 Sun Micro"; 32*45076Smckusick #endif 33*45076Smckusick 34*45076Smckusick /* 35*45076Smckusick * clnt_perror.c 36*45076Smckusick * 37*45076Smckusick * Copyright (C) 1984, Sun Microsystems, Inc. 38*45076Smckusick * 39*45076Smckusick */ 40*45076Smckusick #include <stdio.h> 41*45076Smckusick 42*45076Smckusick #include <rpc/types.h> 43*45076Smckusick #include <rpc/auth.h> 44*45076Smckusick #include <rpc/clnt.h> 45*45076Smckusick 46*45076Smckusick extern char *sys_errlist[]; 47*45076Smckusick extern char *sprintf(); 48*45076Smckusick static char *auth_errmsg(); 49*45076Smckusick 50*45076Smckusick extern char *strcpy(); 51*45076Smckusick 52*45076Smckusick static char *buf; 53*45076Smckusick 54*45076Smckusick static char * 55*45076Smckusick _buf() 56*45076Smckusick { 57*45076Smckusick 58*45076Smckusick if (buf == 0) 59*45076Smckusick buf = (char *)malloc(256); 60*45076Smckusick return (buf); 61*45076Smckusick } 62*45076Smckusick 63*45076Smckusick /* 64*45076Smckusick * Print reply error info 65*45076Smckusick */ 66*45076Smckusick char * 67*45076Smckusick clnt_sperror(rpch, s) 68*45076Smckusick CLIENT *rpch; 69*45076Smckusick char *s; 70*45076Smckusick { 71*45076Smckusick struct rpc_err e; 72*45076Smckusick void clnt_perrno(); 73*45076Smckusick char *err; 74*45076Smckusick char *str = _buf(); 75*45076Smckusick char *strstart = str; 76*45076Smckusick 77*45076Smckusick if (str == 0) 78*45076Smckusick return (0); 79*45076Smckusick CLNT_GETERR(rpch, &e); 80*45076Smckusick 81*45076Smckusick (void) sprintf(str, "%s: ", s); 82*45076Smckusick str += strlen(str); 83*45076Smckusick 84*45076Smckusick (void) strcpy(str, clnt_sperrno(e.re_status)); 85*45076Smckusick str += strlen(str); 86*45076Smckusick 87*45076Smckusick switch (e.re_status) { 88*45076Smckusick case RPC_SUCCESS: 89*45076Smckusick case RPC_CANTENCODEARGS: 90*45076Smckusick case RPC_CANTDECODERES: 91*45076Smckusick case RPC_TIMEDOUT: 92*45076Smckusick case RPC_PROGUNAVAIL: 93*45076Smckusick case RPC_PROCUNAVAIL: 94*45076Smckusick case RPC_CANTDECODEARGS: 95*45076Smckusick case RPC_SYSTEMERROR: 96*45076Smckusick case RPC_UNKNOWNHOST: 97*45076Smckusick case RPC_UNKNOWNPROTO: 98*45076Smckusick case RPC_PMAPFAILURE: 99*45076Smckusick case RPC_PROGNOTREGISTERED: 100*45076Smckusick case RPC_FAILED: 101*45076Smckusick break; 102*45076Smckusick 103*45076Smckusick case RPC_CANTSEND: 104*45076Smckusick case RPC_CANTRECV: 105*45076Smckusick (void) sprintf(str, "; errno = %s", 106*45076Smckusick sys_errlist[e.re_errno]); 107*45076Smckusick str += strlen(str); 108*45076Smckusick break; 109*45076Smckusick 110*45076Smckusick case RPC_VERSMISMATCH: 111*45076Smckusick (void) sprintf(str, 112*45076Smckusick "; low version = %lu, high version = %lu", 113*45076Smckusick e.re_vers.low, e.re_vers.high); 114*45076Smckusick str += strlen(str); 115*45076Smckusick break; 116*45076Smckusick 117*45076Smckusick case RPC_AUTHERROR: 118*45076Smckusick err = auth_errmsg(e.re_why); 119*45076Smckusick (void) sprintf(str,"; why = "); 120*45076Smckusick str += strlen(str); 121*45076Smckusick if (err != NULL) { 122*45076Smckusick (void) sprintf(str, "%s",err); 123*45076Smckusick } else { 124*45076Smckusick (void) sprintf(str, 125*45076Smckusick "(unknown authentication error - %d)", 126*45076Smckusick (int) e.re_why); 127*45076Smckusick } 128*45076Smckusick str += strlen(str); 129*45076Smckusick break; 130*45076Smckusick 131*45076Smckusick case RPC_PROGVERSMISMATCH: 132*45076Smckusick (void) sprintf(str, 133*45076Smckusick "; low version = %lu, high version = %lu", 134*45076Smckusick e.re_vers.low, e.re_vers.high); 135*45076Smckusick str += strlen(str); 136*45076Smckusick break; 137*45076Smckusick 138*45076Smckusick default: /* unknown */ 139*45076Smckusick (void) sprintf(str, 140*45076Smckusick "; s1 = %lu, s2 = %lu", 141*45076Smckusick e.re_lb.s1, e.re_lb.s2); 142*45076Smckusick str += strlen(str); 143*45076Smckusick break; 144*45076Smckusick } 145*45076Smckusick (void) sprintf(str, "\n"); 146*45076Smckusick return(strstart) ; 147*45076Smckusick } 148*45076Smckusick 149*45076Smckusick void 150*45076Smckusick clnt_perror(rpch, s) 151*45076Smckusick CLIENT *rpch; 152*45076Smckusick char *s; 153*45076Smckusick { 154*45076Smckusick (void) fprintf(stderr,"%s",clnt_sperror(rpch,s)); 155*45076Smckusick } 156*45076Smckusick 157*45076Smckusick 158*45076Smckusick struct rpc_errtab { 159*45076Smckusick enum clnt_stat status; 160*45076Smckusick char *message; 161*45076Smckusick }; 162*45076Smckusick 163*45076Smckusick static struct rpc_errtab rpc_errlist[] = { 164*45076Smckusick { RPC_SUCCESS, 165*45076Smckusick "RPC: Success" }, 166*45076Smckusick { RPC_CANTENCODEARGS, 167*45076Smckusick "RPC: Can't encode arguments" }, 168*45076Smckusick { RPC_CANTDECODERES, 169*45076Smckusick "RPC: Can't decode result" }, 170*45076Smckusick { RPC_CANTSEND, 171*45076Smckusick "RPC: Unable to send" }, 172*45076Smckusick { RPC_CANTRECV, 173*45076Smckusick "RPC: Unable to receive" }, 174*45076Smckusick { RPC_TIMEDOUT, 175*45076Smckusick "RPC: Timed out" }, 176*45076Smckusick { RPC_VERSMISMATCH, 177*45076Smckusick "RPC: Incompatible versions of RPC" }, 178*45076Smckusick { RPC_AUTHERROR, 179*45076Smckusick "RPC: Authentication error" }, 180*45076Smckusick { RPC_PROGUNAVAIL, 181*45076Smckusick "RPC: Program unavailable" }, 182*45076Smckusick { RPC_PROGVERSMISMATCH, 183*45076Smckusick "RPC: Program/version mismatch" }, 184*45076Smckusick { RPC_PROCUNAVAIL, 185*45076Smckusick "RPC: Procedure unavailable" }, 186*45076Smckusick { RPC_CANTDECODEARGS, 187*45076Smckusick "RPC: Server can't decode arguments" }, 188*45076Smckusick { RPC_SYSTEMERROR, 189*45076Smckusick "RPC: Remote system error" }, 190*45076Smckusick { RPC_UNKNOWNHOST, 191*45076Smckusick "RPC: Unknown host" }, 192*45076Smckusick { RPC_UNKNOWNPROTO, 193*45076Smckusick "RPC: Unknown protocol" }, 194*45076Smckusick { RPC_PMAPFAILURE, 195*45076Smckusick "RPC: Port mapper failure" }, 196*45076Smckusick { RPC_PROGNOTREGISTERED, 197*45076Smckusick "RPC: Program not registered"}, 198*45076Smckusick { RPC_FAILED, 199*45076Smckusick "RPC: Failed (unspecified error)"} 200*45076Smckusick }; 201*45076Smckusick 202*45076Smckusick 203*45076Smckusick /* 204*45076Smckusick * This interface for use by clntrpc 205*45076Smckusick */ 206*45076Smckusick char * 207*45076Smckusick clnt_sperrno(stat) 208*45076Smckusick enum clnt_stat stat; 209*45076Smckusick { 210*45076Smckusick int i; 211*45076Smckusick 212*45076Smckusick for (i = 0; i < sizeof(rpc_errlist)/sizeof(struct rpc_errtab); i++) { 213*45076Smckusick if (rpc_errlist[i].status == stat) { 214*45076Smckusick return (rpc_errlist[i].message); 215*45076Smckusick } 216*45076Smckusick } 217*45076Smckusick return ("RPC: (unknown error code)"); 218*45076Smckusick } 219*45076Smckusick 220*45076Smckusick void 221*45076Smckusick clnt_perrno(num) 222*45076Smckusick enum clnt_stat num; 223*45076Smckusick { 224*45076Smckusick (void) fprintf(stderr,"%s",clnt_sperrno(num)); 225*45076Smckusick } 226*45076Smckusick 227*45076Smckusick 228*45076Smckusick char * 229*45076Smckusick clnt_spcreateerror(s) 230*45076Smckusick char *s; 231*45076Smckusick { 232*45076Smckusick extern int sys_nerr; 233*45076Smckusick extern char *sys_errlist[]; 234*45076Smckusick char *str = _buf(); 235*45076Smckusick 236*45076Smckusick if (str == 0) 237*45076Smckusick return(0); 238*45076Smckusick (void) sprintf(str, "%s: ", s); 239*45076Smckusick (void) strcat(str, clnt_sperrno(rpc_createerr.cf_stat)); 240*45076Smckusick switch (rpc_createerr.cf_stat) { 241*45076Smckusick case RPC_PMAPFAILURE: 242*45076Smckusick (void) strcat(str, " - "); 243*45076Smckusick (void) strcat(str, 244*45076Smckusick clnt_sperrno(rpc_createerr.cf_error.re_status)); 245*45076Smckusick break; 246*45076Smckusick 247*45076Smckusick case RPC_SYSTEMERROR: 248*45076Smckusick (void) strcat(str, " - "); 249*45076Smckusick if (rpc_createerr.cf_error.re_errno > 0 250*45076Smckusick && rpc_createerr.cf_error.re_errno < sys_nerr) 251*45076Smckusick (void) strcat(str, 252*45076Smckusick sys_errlist[rpc_createerr.cf_error.re_errno]); 253*45076Smckusick else 254*45076Smckusick (void) sprintf(&str[strlen(str)], "Error %d", 255*45076Smckusick rpc_createerr.cf_error.re_errno); 256*45076Smckusick break; 257*45076Smckusick } 258*45076Smckusick (void) strcat(str, "\n"); 259*45076Smckusick return (str); 260*45076Smckusick } 261*45076Smckusick 262*45076Smckusick void 263*45076Smckusick clnt_pcreateerror(s) 264*45076Smckusick char *s; 265*45076Smckusick { 266*45076Smckusick (void) fprintf(stderr,"%s",clnt_spcreateerror(s)); 267*45076Smckusick } 268*45076Smckusick 269*45076Smckusick struct auth_errtab { 270*45076Smckusick enum auth_stat status; 271*45076Smckusick char *message; 272*45076Smckusick }; 273*45076Smckusick 274*45076Smckusick static struct auth_errtab auth_errlist[] = { 275*45076Smckusick { AUTH_OK, 276*45076Smckusick "Authentication OK" }, 277*45076Smckusick { AUTH_BADCRED, 278*45076Smckusick "Invalid client credential" }, 279*45076Smckusick { AUTH_REJECTEDCRED, 280*45076Smckusick "Server rejected credential" }, 281*45076Smckusick { AUTH_BADVERF, 282*45076Smckusick "Invalid client verifier" }, 283*45076Smckusick { AUTH_REJECTEDVERF, 284*45076Smckusick "Server rejected verifier" }, 285*45076Smckusick { AUTH_TOOWEAK, 286*45076Smckusick "Client credential too weak" }, 287*45076Smckusick { AUTH_INVALIDRESP, 288*45076Smckusick "Invalid server verifier" }, 289*45076Smckusick { AUTH_FAILED, 290*45076Smckusick "Failed (unspecified error)" }, 291*45076Smckusick }; 292*45076Smckusick 293*45076Smckusick static char * 294*45076Smckusick auth_errmsg(stat) 295*45076Smckusick enum auth_stat stat; 296*45076Smckusick { 297*45076Smckusick int i; 298*45076Smckusick 299*45076Smckusick for (i = 0; i < sizeof(auth_errlist)/sizeof(struct auth_errtab); i++) { 300*45076Smckusick if (auth_errlist[i].status == stat) { 301*45076Smckusick return(auth_errlist[i].message); 302*45076Smckusick } 303*45076Smckusick } 304*45076Smckusick return(NULL); 305*45076Smckusick } 306