1 /* $NetBSD: clnt_perror.c,v 1.28 2008/04/25 17:44:44 christos Exp $ */
4 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
5 * unrestricted use provided that this legend is included on all tape
6 * media and as a part of the software program in whole or part. Users
7 * may copy or modify Sun RPC without charge, but are not authorized
8 * to license or distribute it to anyone else except as part of a product or
9 * program developed by the user.
11 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
12 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
13 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
15 * Sun RPC is provided with no support and without any obligation on the
16 * part of Sun Microsystems, Inc. to assist in its use, correction,
17 * modification or enhancement.
19 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
20 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
21 * OR ANY PART THEREOF.
23 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
24 * or profits or other special, indirect and consequential damages, even if
25 * Sun has been advised of the possibility of such damages.
27 * Sun Microsystems, Inc.
29 * Mountain View, California 94043
32 #include <sys/cdefs.h>
33 #if defined(LIBC_SCCS) && !defined(lint)
35 static char *sccsid
= "@(#)clnt_perror.c 1.15 87/10/07 Copyr 1984 Sun Micro";
36 static char *sccsid
= "@(#)clnt_perror.c 2.1 88/07/29 4.0 RPCSRC";
38 __RCSID("$NetBSD: clnt_perror.c,v 1.28 2008/04/25 17:44:44 christos Exp $");
45 * Copyright (C) 1984, Sun Microsystems, Inc.
48 #include "namespace.h"
56 #include <rpc/types.h>
61 __weak_alias(clnt_pcreateerror
,_clnt_pcreateerror
)
62 __weak_alias(clnt_perrno
,_clnt_perrno
)
63 __weak_alias(clnt_perror
,_clnt_perror
)
64 __weak_alias(clnt_spcreateerror
,_clnt_spcreateerror
)
65 __weak_alias(clnt_sperrno
,_clnt_sperrno
)
66 __weak_alias(clnt_sperror
,_clnt_sperror
)
72 static char *_buf
__P((void));
73 static char *auth_errmsg
__P((enum auth_stat
));
86 * Print reply error info
99 _DIAGASSERT(rpch
!= NULL
);
100 _DIAGASSERT(s
!= NULL
);
102 str
= _buf(); /* side effect: sets "buflen" */
107 CLNT_GETERR(rpch
, &e
);
109 i
= snprintf(str
, len
, "%s: ", s
);
113 (void)strncpy(str
, clnt_sperrno(e
.re_status
), len
- 1);
118 switch (e
.re_status
) {
120 case RPC_CANTENCODEARGS
:
121 case RPC_CANTDECODERES
:
123 case RPC_PROGUNAVAIL
:
124 case RPC_PROCUNAVAIL
:
125 case RPC_CANTDECODEARGS
:
126 case RPC_SYSTEMERROR
:
127 case RPC_UNKNOWNHOST
:
128 case RPC_UNKNOWNPROTO
:
129 case RPC_PMAPFAILURE
:
130 case RPC_PROGNOTREGISTERED
:
136 i
= snprintf(str
, len
, "; errno = %s", strerror(e
.re_errno
));
141 case RPC_VERSMISMATCH
:
142 i
= snprintf(str
, len
, "; low version = %u, high version = %u",
143 e
.re_vers
.low
, e
.re_vers
.high
);
149 err
= auth_errmsg(e
.re_why
);
150 i
= snprintf(str
, len
, "; why = ");
154 i
= snprintf(str
, len
, "%s",err
);
156 i
= snprintf(str
, len
,
157 "(unknown authentication error - %d)",
164 case RPC_PROGVERSMISMATCH
:
165 i
= snprintf(str
, len
, "; low version = %u, high version = %u",
166 e
.re_vers
.low
, e
.re_vers
.high
);
171 default: /* unknown */
172 i
= snprintf(str
, len
, "; s1 = %u, s2 = %u",
173 e
.re_lb
.s1
, e
.re_lb
.s2
);
187 _DIAGASSERT(rpch
!= NULL
);
188 _DIAGASSERT(s
!= NULL
);
190 (void) fprintf(stderr
, "%s\n", clnt_sperror(rpch
,s
));
193 static const char *const rpc_errlist
[] = {
194 [RPC_SUCCESS
] = "RPC: Success",
195 [RPC_CANTENCODEARGS
] = "RPC: Can't encode arguments",
196 [RPC_CANTDECODERES
] = "RPC: Can't decode result",
197 [RPC_CANTSEND
] = "RPC: Unable to send",
198 [RPC_CANTRECV
] = "RPC: Unable to receive",
199 [RPC_TIMEDOUT
] = "RPC: Timed out",
200 [RPC_VERSMISMATCH
] = "RPC: Incompatible versions of RPC",
201 [RPC_AUTHERROR
] = "RPC: Authentication error",
202 [RPC_PROGUNAVAIL
] = "RPC: Program unavailable",
203 [RPC_PROGVERSMISMATCH
] = "RPC: Program/version mismatch",
204 [RPC_PROCUNAVAIL
] = "RPC: Procedure unavailable",
205 [RPC_CANTDECODEARGS
] = "RPC: Server can't decode arguments",
206 [RPC_SYSTEMERROR
] = "RPC: Remote system error",
207 [RPC_UNKNOWNHOST
] = "RPC: Unknown host",
208 [RPC_PMAPFAILURE
] = "RPC: Port mapper failure",
209 [RPC_PROGNOTREGISTERED
] = "RPC: Program not registered",
210 [RPC_FAILED
] = "RPC: Failed (unspecified error)",
211 [RPC_UNKNOWNPROTO
] = "RPC: Unknown protocol",
212 [RPC_UNKNOWNADDR
] = "RPC: Remote address unknown",
213 [RPC_TLIERROR
] = "RPC: Misc error in the TLI library",
214 [RPC_NOBROADCAST
] = "RPC: Broadcasting not supported",
215 [RPC_N2AXLATEFAILURE
] = "RPC: Name -> addr translation failed",
216 [RPC_INPROGRESS
] = "RPC: In progress",
217 [RPC_STALERACHANDLE
] = "RPC: Stale handle",
222 * This interface for use by clntrpc
228 unsigned int errnum
= stat
;
232 if (errnum
< (sizeof(rpc_errlist
)/sizeof(rpc_errlist
[0]))) {
233 msg
= rpc_errlist
[errnum
];
236 msg
= "RPC: (unknown error code)";
238 return __UNCONST(msg
);
245 (void) fprintf(stderr
, "%s\n", clnt_sperrno(num
));
250 clnt_spcreateerror(s
)
256 _DIAGASSERT(s
!= NULL
);
258 str
= _buf(); /* side effect: sets "buflen" */
262 i
= snprintf(str
, len
, "%s: ", s
);
264 (void)strncat(str
, clnt_sperrno(rpc_createerr
.cf_stat
), len
- 1);
265 switch (rpc_createerr
.cf_stat
) {
266 case RPC_PMAPFAILURE
:
267 (void) strncat(str
, " - ", len
- 1);
269 clnt_sperrno(rpc_createerr
.cf_error
.re_status
), len
- 4);
272 case RPC_SYSTEMERROR
:
273 (void)strncat(str
, " - ", len
- 1);
274 (void)strncat(str
, strerror(rpc_createerr
.cf_error
.re_errno
),
279 case RPC_CANTDECODERES
:
280 case RPC_CANTENCODEARGS
:
282 case RPC_UNKNOWNPROTO
:
283 case RPC_PROGNOTREGISTERED
:
285 case RPC_UNKNOWNHOST
:
286 case RPC_CANTDECODEARGS
:
287 case RPC_PROCUNAVAIL
:
288 case RPC_PROGVERSMISMATCH
:
289 case RPC_PROGUNAVAIL
:
291 case RPC_VERSMISMATCH
:
305 _DIAGASSERT(s
!= NULL
);
307 (void) fprintf(stderr
, "%s\n", clnt_spcreateerror(s
));
310 static const char *const auth_errlist
[] = {
311 "Authentication OK", /* 0 - AUTH_OK */
312 "Invalid client credential", /* 1 - AUTH_BADCRED */
313 "Server rejected credential", /* 2 - AUTH_REJECTEDCRED */
314 "Invalid client verifier", /* 3 - AUTH_BADVERF */
315 "Server rejected verifier", /* 4 - AUTH_REJECTEDVERF */
316 "Client credential too weak", /* 5 - AUTH_TOOWEAK */
317 "Invalid server verifier", /* 6 - AUTH_INVALIDRESP */
318 "Failed (unspecified error)" /* 7 - AUTH_FAILED */
325 unsigned int errnum
= stat
;
327 if (errnum
< (sizeof(auth_errlist
)/sizeof(auth_errlist
[0])))
328 return __UNCONST(auth_errlist
[errnum
]);