clnt_perror.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

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