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

VxWorks

开发平台:

C/C++

  1. /* rpc_prot.c - the rpc message definition */
  2. /* Copyright 1984-2000 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * Copyright (c) 1987 Wind River Systems, Inc.
  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. 01i,18apr00,ham  fixed compilation warnings.
  39. 01h,20feb97,jank removed comment in comment L:37
  40. 01g,26may92,rrr  the tree shuffle
  41.   -changed includes to have absolute path from h/
  42. 01f,04oct91,rrr  passed through the ansification filter
  43.   -changed includes to have absolute path from h/
  44.   -changed copyright notice
  45. 01e,21aug91,wmd   removed redundant declaration of RNDUP.
  46. 01d,19apr90,hjb   de-linted.
  47. 01c,27oct89,hjb   upgraded to 4.0
  48. 01b,11nov87,jlf   added wrs copyright, title, mod history, etc.
  49. 01a,01nov87,rdc   first VxWorks version
  50. */
  51. #ifndef lint
  52. /* static char sccsid[] = "@(#)rpc_prot.c 1.1 86/02/03 Copyr 1984 Sun Micro"; */
  53. #endif
  54. /*
  55.  * rpc_prot.c
  56.  *
  57.  *
  58.  * This set of routines implements the rpc message definition,
  59.  * its serializer and some common rpc utility routines.
  60.  * The routines are meant for various implementations of rpc -
  61.  * they are NOT for the rpc client or rpc service implementations!
  62.  * Because authentication stuff is easy and is part of rpc, the opaque
  63.  * routines are also in this program.
  64.  */
  65. #include "rpc/rpctypes.h"
  66. #include "rpc/xdr.h"
  67. #include "rpc/auth.h"
  68. #include "rpc/clnt.h"
  69. #include "rpc/rpc_msg.h"
  70. #include "netinet/in.h"
  71. #include "vxWorks.h"
  72. /* * * * * * * * * * * * * * XDR Authentication * * * * * * * * * * * */
  73. /* struct opaque_auth _null_auth; now defined in rpc_commondata.c - 4.0 */
  74. /*
  75.  * XDR an opaque authentication struct
  76.  * (see auth.h)
  77.  */
  78. bool_t
  79. xdr_opaque_auth(xdrs, ap)
  80. register XDR *xdrs;
  81. register struct opaque_auth *ap;
  82. {
  83. if (xdr_enum(xdrs, &(ap->oa_flavor)))
  84. return (xdr_bytes(xdrs, &ap->oa_base,
  85. &ap->oa_length, MAX_AUTH_BYTES));
  86. return (FALSE);
  87. }
  88. /*
  89.  * XDR a DES block
  90.  */
  91. bool_t      /* 4.0 */
  92. xdr_des_block (xdrs, blkp)      /* 4.0 */
  93.     register XDR *xdrs;
  94.     register union des_block *blkp;
  95.     {      /* 4.0 */
  96.     return (xdr_opaque (xdrs, (caddr_t) blkp, sizeof (des_block)));  /* 4.0 */
  97.     }      /* 4.0 */
  98. /*
  99.  * XDR a DES key.
  100.  */
  101. bool_t
  102. xdr_deskey(xdrs, blkp)
  103. register XDR *xdrs;
  104. register union des_block *blkp;
  105. {
  106. if (! xdr_u_long(xdrs, &(blkp->key.high)))
  107. return (FALSE);
  108. return (xdr_u_long(xdrs, &(blkp->key.low)));
  109. }
  110. /* * * * * * * * * * * * * * XDR RPC MESSAGE * * * * * * * * * * * * * * * */
  111. /*
  112.  * XDR the MSG_ACCEPTED part of a reply message union
  113.  */
  114. bool_t
  115. xdr_accepted_reply(xdrs, ar)
  116. register XDR *xdrs;
  117. register struct accepted_reply *ar;
  118. {
  119. /* personalized union, rather than calling xdr_union */
  120. if (! xdr_opaque_auth(xdrs, &(ar->ar_verf)))
  121. return (FALSE);
  122. if (! xdr_enum(xdrs, (enum_t *)&(ar->ar_stat)))
  123. return (FALSE);
  124. switch (ar->ar_stat) {
  125. case SUCCESS:
  126. return ((*(ar->ar_results.proc))(xdrs, ar->ar_results.where));
  127. case PROG_MISMATCH:
  128. if (! xdr_u_long(xdrs, &(ar->ar_vers.low)))
  129. return (FALSE);
  130. return (xdr_u_long(xdrs, &(ar->ar_vers.high)));
  131. default:
  132.             break;
  133. }
  134. return (TRUE);  /* TRUE => open ended set of problems */
  135. }
  136. /*
  137.  * XDR the MSG_DENIED part of a reply message union
  138.  */
  139. bool_t
  140. xdr_rejected_reply(xdrs, rr)
  141. register XDR *xdrs;
  142. register struct rejected_reply *rr;
  143. {
  144. /* personalized union, rather than calling xdr_union */
  145. if (! xdr_enum(xdrs, (enum_t *)&(rr->rj_stat)))
  146. return (FALSE);
  147. switch (rr->rj_stat) {
  148. case RPC_MISMATCH:
  149. if (! xdr_u_long(xdrs, &(rr->rj_vers.low)))
  150. return (FALSE);
  151. return (xdr_u_long(xdrs, &(rr->rj_vers.high)));
  152. case AUTH_ERROR:
  153. return (xdr_enum(xdrs, (enum_t *)&(rr->rj_why)));
  154. }
  155. return (FALSE);
  156. }
  157. static struct xdr_discrim reply_dscrm[3] = {
  158. { (int)MSG_ACCEPTED, xdr_accepted_reply },
  159. { (int)MSG_DENIED, xdr_rejected_reply },
  160. { __dontcare__, NULL_xdrproc_t } };
  161. /*
  162.  * XDR a reply message
  163.  */
  164. bool_t
  165. xdr_replymsg(xdrs, rmsg)
  166. register XDR *xdrs;
  167. register struct rpc_msg *rmsg;
  168. {
  169. if (
  170.     xdr_u_long(xdrs, &(rmsg->rm_xid)) &&
  171.     xdr_enum(xdrs, (enum_t *)&(rmsg->rm_direction)) &&
  172.     (rmsg->rm_direction == REPLY) )
  173. return (xdr_union(xdrs, (enum_t *)&(rmsg->rm_reply.rp_stat),
  174.     (caddr_t)&(rmsg->rm_reply.ru), reply_dscrm, NULL_xdrproc_t));
  175. return (FALSE);
  176. }
  177. /* xdr_callmsg () is now in rpc_callmsg.c file. 4.0 */
  178. /*
  179.  * Serializes the "static part" of a call message header.
  180.  * The fields include: rm_xid, rm_direction, rpcvers, prog, and vers.
  181.  * The rm_xid is not really static, but the user can easily munge on the fly.
  182.  */
  183. bool_t
  184. xdr_callhdr(xdrs, cmsg)
  185. register XDR *xdrs;
  186. register struct rpc_msg *cmsg;
  187. {
  188. cmsg->rm_direction = CALL;
  189. cmsg->rm_call.cb_rpcvers = RPC_MSG_VERSION;
  190. if (
  191.     (xdrs->x_op == XDR_ENCODE) &&
  192.     xdr_u_long(xdrs, &(cmsg->rm_xid)) &&
  193.     xdr_enum(xdrs, (enum_t *)&(cmsg->rm_direction)) &&
  194.     xdr_u_long(xdrs, &(cmsg->rm_call.cb_rpcvers)) &&
  195.     xdr_u_long(xdrs, &(cmsg->rm_call.cb_prog)) )
  196.     return (xdr_u_long(xdrs, &(cmsg->rm_call.cb_vers)));
  197. return (FALSE);
  198. }
  199. /* ************************** Client utility routine ************* */
  200. void
  201. accepted(acpt_stat, error)
  202. register enum accept_stat acpt_stat;
  203. register struct rpc_err *error;
  204. {
  205. switch (acpt_stat) {
  206. case PROG_UNAVAIL:
  207. error->re_status = RPC_PROGUNAVAIL;
  208. return;
  209. case PROG_MISMATCH:
  210. error->re_status = RPC_PROGVERSMISMATCH;
  211. return;
  212. case PROC_UNAVAIL:
  213. error->re_status = RPC_PROCUNAVAIL;
  214. return;
  215. case GARBAGE_ARGS:
  216. error->re_status = RPC_CANTDECODEARGS;
  217. return;
  218. case SYSTEM_ERR:
  219. error->re_status = RPC_SYSTEMERROR;
  220. return;
  221. case SUCCESS:
  222. error->re_status = RPC_SUCCESS;
  223. return;
  224. }
  225. /* something's wrong, but we don't know what ... */
  226. error->re_status = RPC_FAILED;
  227. error->re_lb.s1 = (long)MSG_ACCEPTED;
  228. error->re_lb.s2 = (long)acpt_stat;
  229. }
  230. void
  231. rejected(rjct_stat, error)
  232. register enum reject_stat rjct_stat;
  233. register struct rpc_err *error;
  234. {
  235. switch (rjct_stat) {
  236. case RPC_MISMATCH:
  237. error->re_status = RPC_VERSMISMATCH;
  238. return;
  239. case AUTH_ERROR:
  240. error->re_status = RPC_AUTHERROR;
  241. return;
  242. }
  243. /* something's wrong, but we don't know what ... */
  244. error->re_status = RPC_FAILED;
  245. error->re_lb.s1 = (long)MSG_DENIED;
  246. error->re_lb.s2 = (long)rjct_stat;
  247. }
  248. /*
  249.  * given a reply message, fills in the error
  250.  */
  251. void
  252. _seterr_reply(msg, error)
  253. register struct rpc_msg *msg;
  254. register struct rpc_err *error;
  255. {
  256. /* optimized for normal, SUCCESSful case */
  257. switch (msg->rm_reply.rp_stat) {
  258. case MSG_ACCEPTED:
  259. if (msg->acpted_rply.ar_stat == SUCCESS) {
  260. error->re_status = RPC_SUCCESS;
  261. return;
  262. };
  263. accepted(msg->acpted_rply.ar_stat, error);
  264. break;
  265. case MSG_DENIED:
  266. rejected(msg->rjcted_rply.rj_stat, error);
  267. break;
  268. default:
  269. error->re_status = RPC_FAILED;
  270. error->re_lb.s1 = (long)(msg->rm_reply.rp_stat);
  271. break;
  272. }
  273. switch (error->re_status) {
  274. case RPC_VERSMISMATCH:
  275. error->re_vers.low = msg->rjcted_rply.rj_vers.low;
  276. error->re_vers.high = msg->rjcted_rply.rj_vers.high;
  277. break;
  278. case RPC_AUTHERROR:
  279. error->re_why = msg->rjcted_rply.rj_why;
  280. break;
  281. case RPC_PROGVERSMISMATCH:
  282. error->re_vers.low = msg->acpted_rply.ar_vers.low;
  283. error->re_vers.high = msg->acpted_rply.ar_vers.high;
  284. break;
  285.         default:
  286.                 break;
  287. }
  288. }