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

VxWorks

开发平台:

C/C++

  1. /* svc_auth_uni.c - UNIX flavor authentication on service side of rpc */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * Copyright (C) 1984, Sun Microsystems, Inc.
  6.  *
  7.  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  8.  * unrestricted use provided that this legend is included on all tape
  9.  * media and as a part of the software program in whole or part.  Users
  10.  * may copy or modify Sun RPC without charge, but are not authorized
  11.  * to license or distribute it to anyone else except as part of a product or
  12.  * program developed by the user.
  13.  *
  14.  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  15.  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  16.  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  17.  *
  18.  * Sun RPC is provided with no support and without any obligation on the
  19.  * part of Sun Microsystems, Inc. to assist in its use, correction,
  20.  * modification or enhancement.
  21.  *
  22.  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  23.  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  24.  * OR ANY PART THEREOF.
  25.  *
  26.  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  27.  * or profits or other special, indirect and consequential damages, even if
  28.  * Sun has been advised of the possibility of such damages.
  29.  *
  30.  * Sun Microsystems, Inc.
  31.  * 2550 Garcia Avenue
  32.  * Mountain View, California  94043
  33.  */
  34. /*
  35. modification history
  36. --------------------
  37. 01k,05nov01,vvv  fixed compilation warnings
  38. 01j,18apr00,ham  fixed compilation warnings.
  39. 01i,26may92,rrr  the tree shuffle
  40.   -changed includes to have absolute path from h/
  41. 01h,04oct91,rrr  passed through the ansification filter
  42.   -changed includes to have absolute path from h/
  43.   -fixed #else and #endif
  44.   -changed copyright notice
  45. 01g,05aug91,del   made ulong *buf non-register for I960 version.
  46. 01f,25oct90,dnw   removed include of utime.h.
  47. 01e,19apr90,hjb   de-linted.
  48. 01d,31oct89,hjb   deleted "char *mem_alloc()" declartion since it's a macro
  49.   in vxWorks.  also deleted redundant definition of RNDUP()
  50.   macro since it's already defined in xdr.h.
  51. 01c,27oct89,hjb   upgraded to 4.0
  52. 01b,11nov87,jlf   added wrs copyright, title, mod history, etc.
  53.   changed name from svc_auth_unix.c to svc_auth_uni.c, to
  54.       work under sys-V.
  55. 01a,01nov87,rdc   first VxWorks version
  56. */
  57. #ifndef lint
  58. /* static char sccsid[] = "@(#)svc_auth_unix.c 1.1 86/02/03 Copyr 1984 Sun Micro"; */
  59. #endif
  60. /*
  61.  * svc_auth_unix.c
  62.  * Handles UNIX flavor authentication parameters on the service side of rpc.
  63.  * There are two svc auth implementations here: AUTH_UNIX and AUTH_SHORT.
  64.  * _svcauth_unix does full blown unix style uid,gid+gids auth,
  65.  * _svcauth_short uses a shorthand auth to index into a cache of longhand auths.
  66.  * Note: the shorthand has been gutted for efficiency.
  67.  *
  68.  */
  69. #include "rpc/rpctypes.h"
  70. #include "netinet/in.h"
  71. #include "rpc/xdr.h"
  72. #include "rpc/auth.h"
  73. #include "rpc/clnt.h"
  74. #include "rpc/rpc_msg.h"
  75. #include "rpc/svc.h"
  76. #include "rpc/auth_unix.h"
  77. #include "rpc/svc_auth.h"
  78. #include "vxWorks.h"
  79. #include "stdio.h"
  80. IMPORT u_long ixdr_get_long ();
  81. /*
  82.  * Unix longhand authenticator
  83.  */
  84. enum auth_stat
  85. _svcauth_unix(rqst, msg)
  86. register struct svc_req *rqst;
  87. register struct rpc_msg *msg;
  88. {
  89. register enum auth_stat stat;
  90. XDR xdrs;
  91. register struct authunix_parms *aup;
  92. long *buf;        
  93. struct area {
  94. struct authunix_parms area_aup;
  95. char area_machname[MAX_MACHINE_NAME];
  96. int area_gids[NGRPS];
  97. } *area;
  98. u_int auth_len;
  99. int str_len, gid_len;
  100. register int i;
  101. area = (struct area *) rqst->rq_clntcred;
  102. aup = &area->area_aup;
  103. aup->aup_machname = area->area_machname;
  104. aup->aup_gids = area->area_gids;
  105. auth_len = (u_int)msg->rm_call.cb_cred.oa_length;
  106. xdrmem_create(&xdrs, msg->rm_call.cb_cred.oa_base, auth_len,XDR_DECODE);
  107. buf = XDR_INLINE(&xdrs, auth_len);
  108. if (buf != NULL) {
  109. aup->aup_time = IXDR_GET_LONG(buf);
  110. str_len = IXDR_GET_U_LONG(buf);
  111. if (str_len > MAX_MACHINE_NAME) { /* 4.0 */
  112. stat = AUTH_BADCRED; /* 4.0 */
  113. goto done; /* 4.0 */
  114. } /* 4.0 */
  115. bcopy((char *) buf, aup->aup_machname, str_len);
  116. aup->aup_machname[str_len] = 0;
  117. str_len = RNDUP(str_len);
  118. buf += str_len / sizeof (long);
  119. aup->aup_uid = IXDR_GET_LONG(buf);
  120. aup->aup_gid = IXDR_GET_LONG(buf);
  121. gid_len = IXDR_GET_U_LONG(buf);
  122. if (gid_len > NGRPS) {
  123. stat = AUTH_BADCRED;
  124. goto done;
  125. }
  126. aup->aup_len = gid_len;
  127. for (i = 0; i < gid_len; i++) {
  128. aup->aup_gids[i] = IXDR_GET_LONG(buf);
  129. }
  130. /*
  131.  * five is the smallest unix credentials structure -
  132.  * timestamp, hostname len (0), uid, gid, and gids len (0).
  133.  */
  134. if ((5 + gid_len) * BYTES_PER_XDR_UNIT + str_len > auth_len) {
  135. printf("bad auth_len gid %d str %d auth %dn",
  136.        gid_len, auth_len, auth_len);
  137. stat = AUTH_BADCRED;
  138. goto done;
  139. }
  140. } else if (! xdr_authunix_parms(&xdrs, aup)) {
  141. xdrs.x_op = XDR_FREE;
  142. (void)xdr_authunix_parms(&xdrs, aup);
  143. stat = AUTH_BADCRED;
  144. goto done;
  145. }
  146. rqst->rq_xprt->xp_verf.oa_flavor = AUTH_NULL;
  147. rqst->rq_xprt->xp_verf.oa_length = 0;
  148. stat = AUTH_OK;
  149. done:
  150. XDR_DESTROY(&xdrs);
  151. return (stat);
  152. }
  153. /*
  154.  * Shorthand unix authenticator
  155.  * Looks up longhand in a cache.
  156.  */
  157. /*ARGSUSED*/
  158. enum auth_stat
  159. _svcauth_short(rqst, msg)
  160. struct svc_req *rqst;
  161. struct rpc_msg *msg;
  162. {
  163. return (AUTH_REJECTEDCRED);
  164. }