nfs-ganesha 1.4

ganesha_rpc.h

Go to the documentation of this file.
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 */