nfs-ganesha 1.4
|
00001 /* This is a central clearing house for RPC definitions. Nothing 00002 should included anything related to RPC except this file */ 00003 00004 #ifndef GANESHA_RPC_H 00005 #define GANESHA_RPC_H 00006 00007 #include <rpc/xdr_inline.h> 00008 #include <rpc/rpc.h> 00009 #include <rpc/svc.h> 00010 #include <rpc/svc_dg.h> 00011 #include <rpc/clnt.h> 00012 00013 #ifdef _HAVE_GSSAPI 00014 #include <rpc/auth_gss.h> 00015 #include <rpc/svc_auth.h> 00016 #endif 00017 00018 #include <rpc/svc_rqst.h> 00019 #include <rpc/svc_dplx.h> 00020 00021 #include "HashTable.h" 00022 00023 void socket_setoptions(int socketFd); 00024 00025 #ifdef _APPLE 00026 #define __FDS_BITS(set) ((set)->fds_bits) 00027 #endif 00028 00029 typedef struct sockaddr_storage sockaddr_t; 00030 00031 #define SOCK_NAME_MAX 128 00032 00033 extern void Svc_dg_soft_destroy(SVCXPRT * xport); 00034 extern struct netconfig *getnetconfigent(const char *netid); 00035 extern void freenetconfigent(struct netconfig *); 00036 extern SVCXPRT *Svc_vc_create(int, u_int, u_int); 00037 extern SVCXPRT *Svc_dg_create(int, u_int, u_int); 00038 00039 #ifdef _SOLARIS 00040 #define _authenticate __authenticate 00041 #endif 00042 00043 #ifdef _HAVE_GSSAPI 00044 struct svc_rpc_gss_data 00045 { 00046 bool_t established; /* context established */ 00047 gss_ctx_id_t ctx; /* context id */ 00048 struct rpc_gss_sec sec; /* security triple */ 00049 gss_buffer_desc cname; /* GSS client name */ 00050 u_int seq; /* sequence number */ 00051 u_int win; /* sequence window */ 00052 u_int seqlast; /* last sequence number */ 00053 uint32_t seqmask; /* bitmask of seqnums */ 00054 gss_name_t client_name; /* unparsed name string */ 00055 gss_buffer_desc checksum; /* so we can free it */ 00056 }; 00057 00058 typedef struct nfs_krb5_param__ 00059 { 00060 char keytab[MAXPATHLEN]; 00061 char ccache_dir[MAXPATHLEN]; 00062 /* XXX representation of GSSAPI service, independent of 00063 * GSSRPC or TI-RPC global variables. Initially, use it just 00064 * for callbacks. */ 00065 struct { 00066 char principal[MAXPATHLEN]; 00067 gss_name_t gss_name; 00068 } svc; 00069 bool_t active_krb5; 00070 hash_parameter_t hash_param; 00071 } nfs_krb5_parameter_t; 00072 00073 #define SVCAUTH_PRIVATE(auth) \ 00074 ((struct svc_rpc_gss_data *)(auth)->svc_ah_private) 00075 00076 bool_t Svcauth_gss_import_name(char *service); 00077 bool_t Svcauth_gss_acquire_cred(void); 00078 bool_t Svcauth_gss_set_svc_name(gss_name_t name); 00079 int Gss_ctx_Hash_Init(nfs_krb5_parameter_t param); 00080 enum auth_stat Rpcsecgss__authenticate(register struct svc_req *rqst, 00081 struct rpc_msg *msg, 00082 bool_t * no_dispatch); 00083 00084 void log_sperror_gss(char *outmsg, OM_uint32 maj_stat, OM_uint32 min_stat); 00085 uint32_t gss_ctx_hash_func(hash_parameter_t * p_hparam, hash_buffer_t * buffclef); 00086 uint64_t gss_ctx_rbt_hash_func(hash_parameter_t * p_hparam, 00087 hash_buffer_t * buffclef); 00088 int compare_gss_ctx(hash_buffer_t * buff1, hash_buffer_t * buff2); 00089 int display_gss_ctx(hash_buffer_t * pbuff, char *str); 00090 int display_gss_svc_data(hash_buffer_t * pbuff, char *str); 00091 const char *str_gc_proc(rpc_gss_proc_t gc_proc); 00092 00093 #endif /* _HAVE_GSSAPI */ 00094 00095 /* Private data associated with a new TI-RPC (TCP) SVCXPRT (transport 00096 * connection), ie, xprt->xp_u1. 00097 */ 00098 #define XPRT_PRIVATE_FLAG_NONE 0x0000 00099 #define XPRT_PRIVATE_FLAG_DESTROYED 0x0001 /* forward destroy */ 00100 #define XPRT_PRIVATE_FLAG_LOCKED 0x0002 00101 #define XPRT_PRIVATE_FLAG_REF 0x0004 00102 00103 typedef struct gsh_xprt_private 00104 { 00105 uint32_t flags; 00106 uint32_t refcnt; 00107 uint32_t multi_cnt; /* multi-dispatch counter */ 00108 } gsh_xprt_private_t; 00109 00110 static inline gsh_xprt_private_t * 00111 alloc_gsh_xprt_private(uint32_t flags) 00112 { 00113 gsh_xprt_private_t *xu = gsh_malloc(sizeof(gsh_xprt_private_t)); 00114 00115 xu->flags = 0; 00116 xu->multi_cnt = 0; 00117 00118 if (flags & XPRT_PRIVATE_FLAG_REF) 00119 xu->refcnt = 1; 00120 else 00121 xu->refcnt = 0; 00122 00123 return (xu); 00124 } 00125 00126 static inline void 00127 free_gsh_xprt_private(gsh_xprt_private_t *xu) 00128 { 00129 gsh_free(xu); 00130 } 00131 00132 static inline void 00133 gsh_xprt_ref(SVCXPRT *xprt, uint32_t flags) 00134 { 00135 gsh_xprt_private_t *xu = (gsh_xprt_private_t *) xprt->xp_u1; 00136 00137 if (! (flags & XPRT_PRIVATE_FLAG_LOCKED)) 00138 pthread_rwlock_wrlock(&xprt->lock); 00139 00140 ++(xu->refcnt); 00141 00142 if (! (flags & XPRT_PRIVATE_FLAG_LOCKED)) 00143 pthread_rwlock_unlock(&xprt->lock); 00144 } 00145 00146 static inline void 00147 gsh_xprt_unref(SVCXPRT * xprt, uint32_t flags) 00148 { 00149 gsh_xprt_private_t *xu = (gsh_xprt_private_t *) xprt->xp_u1; 00150 uint32_t refcnt; 00151 00152 if (! (flags & XPRT_PRIVATE_FLAG_LOCKED)) 00153 pthread_rwlock_wrlock(&xprt->lock); 00154 00155 refcnt = --(xu->refcnt); 00156 00157 pthread_rwlock_unlock(&xprt->lock); 00158 00159 /* finalize */ 00160 if (refcnt == 0) { 00161 if (xu->flags & XPRT_PRIVATE_FLAG_DESTROYED) { 00162 SVC_DESTROY(xprt); 00163 } 00164 } 00165 } 00166 00167 static inline void 00168 gsh_xprt_destroy(SVCXPRT *xprt) 00169 { 00170 gsh_xprt_private_t *xu = (gsh_xprt_private_t *) xprt->xp_u1; 00171 00172 pthread_rwlock_wrlock(&xprt->lock); 00173 xu->flags |= XPRT_PRIVATE_FLAG_DESTROYED; 00174 00175 gsh_xprt_unref(xprt, XPRT_PRIVATE_FLAG_LOCKED); 00176 } 00177 00178 extern int copy_xprt_addr(sockaddr_t *addr, SVCXPRT *xprt); 00179 extern int sprint_sockaddr(sockaddr_t *addr, char *buf, int len); 00180 extern int sprint_sockip(sockaddr_t *addr, char *buf, int len); 00181 extern SVCXPRT *Svcxprt_copy(SVCXPRT *xprt_copy, SVCXPRT *xprt_orig); 00182 extern SVCXPRT *Svcxprt_copycreate(); 00183 00184 extern const char *xprt_type_to_str(xprt_type_t type); 00185 00186 typedef enum _ignore_port 00187 { 00188 IGNORE_PORT, 00189 CHECK_PORT 00190 } ignore_port_t; 00191 00192 extern int cmp_sockaddr(sockaddr_t *addr_1, 00193 sockaddr_t *addr_2, 00194 ignore_port_t ignore_port); 00195 extern unsigned long hash_sockaddr(sockaddr_t *addr, 00196 ignore_port_t ignore_port); 00197 00198 extern in_addr_t get_in_addr(sockaddr_t *addr); 00199 extern int get_port(sockaddr_t *addr); 00200 00201 /* Returns an EAI value, accepts only numeric strings */ 00202 extern int ipstring_to_sockaddr(const char *str, sockaddr_t *addr); 00203 00204 extern CLIENT *Clnt_create(char *host, 00205 unsigned long prog, 00206 unsigned long vers, 00207 char *proto); 00208 00209 void Clnt_destroy(CLIENT *clnt); 00210 00211 #endif /* GANESHA_RPC_H */