nfs-ganesha 1.4
|
00001 /* 00002 * vim:expandtab:shiftwidth=8:tabstop=8: 00003 */ 00004 00014 #ifdef HAVE_CONFIG_H 00015 #include "config.h" 00016 #endif 00017 00018 #ifdef _SOLARIS 00019 #include "solaris_port.h" 00020 #endif /* _SOLARIS */ 00021 00022 #ifdef _USE_GSSRPC 00023 #include <gssrpc/rpc.h> 00024 #include <gssrpc/xdr.h> 00025 #else 00026 #include <rpc/rpc.h> 00027 #include <rpc/xdr.h> 00028 #endif 00029 #include "nfs4.h" 00030 00031 #include <string.h> 00032 00033 #include "fsal_internal.h" 00034 #include "fsal_convert.h" 00035 #include "fsal_common.h" 00036 00037 #include "nfs_proto_functions.h" 00038 #include "fsal_nfsv4_macros.h" 00039 00074 fsal_status_t PROXYFSAL_access(fsal_handle_t * object_handle, /* IN */ 00075 fsal_op_context_t *context, /* IN */ 00076 fsal_accessflags_t access_type, /* IN */ 00077 fsal_attrib_list_t * object_attributes /* [ IN/OUT ] */ 00078 ) 00079 { 00080 00081 int rc; 00082 COMPOUND4args argnfs4; 00083 COMPOUND4res resnfs4; 00084 bitmap4 bitmap; 00085 uint32_t bitmap_val[2]; 00086 uint32_t bitmap_res[2]; 00087 uint32_t accessflag = 0; 00088 proxyfsal_op_context_t * p_context = (proxyfsal_op_context_t *)context; 00089 00090 fsal_proxy_internal_fattr_t fattr_internal; 00091 00092 struct timeval __attribute__ ((__unused__)) timeout = TIMEOUTRPC; 00093 nfs_fh4 nfs4fh; 00094 00095 #define FSAL_ACCESS_NB_OP_ACCESS 3 00096 00097 nfs_argop4 argoparray[FSAL_ACCESS_NB_OP_ACCESS]; 00098 nfs_resop4 resoparray[FSAL_ACCESS_NB_OP_ACCESS]; 00099 00100 /* sanity checks. 00101 * note : object_attributes is optional in PROXYFSAL_access. 00102 */ 00103 if(!object_handle || !p_context) 00104 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_access); 00105 00106 /* Setup results structures */ 00107 argnfs4.argarray.argarray_val = argoparray; 00108 resnfs4.resarray.resarray_val = resoparray; 00109 fsal_internal_proxy_setup_fattr(&fattr_internal); 00110 argnfs4.minorversion = 0; 00111 /* argnfs4.tag.utf8string_val = "GANESHA NFSv4 Proxy: Access" ; */ 00112 argnfs4.tag.utf8string_val = NULL; 00113 argnfs4.tag.utf8string_len = 0; 00114 argnfs4.argarray.argarray_len = 0; 00115 00116 bitmap.bitmap4_val = bitmap_val; 00117 bitmap.bitmap4_len = 2; 00118 fsal_internal_proxy_create_fattr_bitmap(&bitmap); 00119 00120 /* Set up access flags */ 00121 if(access_type & FSAL_R_OK) 00122 accessflag |= ACCESS4_READ; 00123 00124 if(access_type & FSAL_X_OK) 00125 accessflag |= ACCESS4_LOOKUP; 00126 00127 if(access_type & FSAL_W_OK) 00128 accessflag |= (ACCESS4_MODIFY & ACCESS4_EXTEND); 00129 00130 if(access_type & FSAL_F_OK) 00131 accessflag |= ACCESS4_LOOKUP; 00132 00133 /* >> convert your fsal access type to your FS access type << */ 00134 00135 /* Get NFSv4 File handle */ 00136 if(fsal_internal_proxy_extract_fh(&nfs4fh, object_handle) == FALSE) 00137 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_access); 00138 00139 #define FSAL_ACCESS_IDX_OP_PUTFH 0 00140 #define FSAL_ACCESS_IDX_OP_ACCESS 1 00141 #define FSAL_ACCESS_IDX_OP_GETATTR 2 00142 00143 COMPOUNDV4_ARG_ADD_OP_PUTFH(argnfs4, nfs4fh); 00144 COMPOUNDV4_ARG_ADD_OP_ACCESS(argnfs4, accessflag); 00145 COMPOUNDV4_ARG_ADD_OP_GETATTR(argnfs4, bitmap); 00146 00147 resnfs4.resarray.resarray_val[FSAL_ACCESS_IDX_OP_GETATTR].nfs_resop4_u.opgetattr. 00148 GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_val = bitmap_res; 00149 resnfs4.resarray.resarray_val[FSAL_ACCESS_IDX_OP_GETATTR].nfs_resop4_u.opgetattr. 00150 GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_len = 2; 00151 00152 resnfs4.resarray.resarray_val[FSAL_ACCESS_IDX_OP_GETATTR].nfs_resop4_u.opgetattr. 00153 GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_val = 00154 (char *)&fattr_internal; 00155 resnfs4.resarray.resarray_val[FSAL_ACCESS_IDX_OP_GETATTR].nfs_resop4_u.opgetattr. 00156 GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_len = 00157 sizeof(fattr_internal); 00158 00159 TakeTokenFSCall(); 00160 00161 /* Call the NFSv4 function */ 00162 COMPOUNDV4_EXECUTE(p_context, argnfs4, resnfs4, rc); 00163 if(rc != RPC_SUCCESS) 00164 { 00165 ReleaseTokenFSCall(); 00166 00167 Return(ERR_FSAL_IO, resnfs4.status, INDEX_FSAL_access); 00168 } 00169 00170 ReleaseTokenFSCall(); 00171 00172 /* >> convert the returned code, an return it on error << */ 00173 if(resnfs4.status != NFS4_OK) 00174 return fsal_internal_proxy_error_convert(resnfs4.status, INDEX_FSAL_access); 00175 00176 /* get attributes if object_attributes is not null. 00177 * If an error occures during getattr operation, 00178 * an error bit is set in the output structure. 00179 */ 00180 if(object_attributes) 00181 { 00182 /* Use NFSv4 service function to build the FSAL_attr */ 00183 if(nfs4_Fattr_To_FSAL_attr(object_attributes, 00184 &resnfs4.resarray. 00185 resarray_val[FSAL_ACCESS_IDX_OP_GETATTR].nfs_resop4_u. 00186 opgetattr.GETATTR4res_u.resok4.obj_attributes) != NFS4_OK) 00187 { 00188 FSAL_CLEAR_MASK(object_attributes->asked_attributes); 00189 FSAL_SET_MASK(object_attributes->asked_attributes, FSAL_ATTR_RDATTR_ERR); 00190 00191 Return(ERR_FSAL_INVAL, 0, INDEX_FSAL_access); 00192 } 00193 00194 } 00195 00196 Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_access); 00197 00198 }